summaryrefslogtreecommitdiffstats
path: root/dom/xslt/xslt/txStylesheet.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/xslt/xslt/txStylesheet.h')
-rw-r--r--dom/xslt/xslt/txStylesheet.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/dom/xslt/xslt/txStylesheet.h b/dom/xslt/xslt/txStylesheet.h
new file mode 100644
index 0000000000..f37b8acdbc
--- /dev/null
+++ b/dom/xslt/xslt/txStylesheet.h
@@ -0,0 +1,185 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TX_TXSTYLESHEET_H
+#define TX_TXSTYLESHEET_H
+
+#include "txOutputFormat.h"
+#include "txExpandedNameMap.h"
+#include "txList.h"
+#include "txXSLTPatterns.h"
+#include "nsISupportsImpl.h"
+
+class txInstruction;
+class txTemplateItem;
+class txVariableItem;
+class txStripSpaceItem;
+class txAttributeSetItem;
+class txDecimalFormat;
+class txStripSpaceTest;
+class txXSLKey;
+
+class txStylesheet final {
+ public:
+ class ImportFrame;
+ class GlobalVariable;
+ friend class txStylesheetCompilerState;
+ // To be able to do some cleaning up in destructor
+ friend class ImportFrame;
+
+ txStylesheet();
+ nsresult init();
+
+ NS_INLINE_DECL_REFCOUNTING(txStylesheet)
+
+ nsresult findTemplate(const txXPathNode& aNode, const txExpandedName& aMode,
+ txIMatchContext* aContext, ImportFrame* aImportedBy,
+ txInstruction** aTemplate, ImportFrame** aImportFrame);
+ txDecimalFormat* getDecimalFormat(const txExpandedName& aName);
+ txInstruction* getAttributeSet(const txExpandedName& aName);
+ txInstruction* getNamedTemplate(const txExpandedName& aName);
+ txOutputFormat* getOutputFormat();
+ GlobalVariable* getGlobalVariable(const txExpandedName& aName);
+ const txOwningExpandedNameMap<txXSLKey>& getKeyMap();
+ nsresult isStripSpaceAllowed(const txXPathNode& aNode,
+ txIMatchContext* aContext, bool& aAllowed);
+
+ /**
+ * Called by the stylesheet compiler once all stylesheets has been read.
+ */
+ nsresult doneCompiling();
+
+ /**
+ * Add a key to the stylesheet
+ */
+ nsresult addKey(const txExpandedName& aName,
+ mozilla::UniquePtr<txPattern> aMatch,
+ mozilla::UniquePtr<Expr> aUse);
+
+ /**
+ * Add a decimal-format to the stylesheet
+ */
+ nsresult addDecimalFormat(const txExpandedName& aName,
+ mozilla::UniquePtr<txDecimalFormat>&& aFormat);
+
+ struct MatchableTemplate {
+ txInstruction* mFirstInstruction;
+ mozilla::UniquePtr<txPattern> mMatch;
+ double mPriority;
+ };
+
+ /**
+ * Contain information that is import precedence dependant.
+ */
+ class ImportFrame {
+ public:
+ ImportFrame() : mFirstNotImported(nullptr) {}
+ ~ImportFrame();
+
+ // List of toplevel items
+ txList mToplevelItems;
+
+ // Map of template modes
+ txOwningExpandedNameMap<nsTArray<MatchableTemplate> > mMatchableTemplates;
+
+ // ImportFrame which is the first one *not* imported by this frame
+ ImportFrame* mFirstNotImported;
+ };
+
+ class GlobalVariable : public txObject {
+ public:
+ GlobalVariable(mozilla::UniquePtr<Expr>&& aExpr,
+ mozilla::UniquePtr<txInstruction>&& aFirstInstruction,
+ bool aIsParam);
+
+ mozilla::UniquePtr<Expr> mExpr;
+ mozilla::UniquePtr<txInstruction> mFirstInstruction;
+ bool mIsParam;
+ };
+
+ private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~txStylesheet();
+
+ nsresult addTemplate(txTemplateItem* aTemplate, ImportFrame* aImportFrame);
+ nsresult addGlobalVariable(txVariableItem* aVariable);
+ nsresult addFrames(txListIterator& aInsertIter);
+ nsresult addStripSpace(txStripSpaceItem* aStripSpaceItem,
+ nsTArray<txStripSpaceTest*>& aFrameStripSpaceTests);
+ nsresult addAttributeSet(txAttributeSetItem* aAttributeSetItem);
+
+ // List of ImportFrames
+ txList mImportFrames;
+
+ // output format
+ txOutputFormat mOutputFormat;
+
+ // List of first instructions of templates. This is the owner of all
+ // instructions used in templates
+ txList mTemplateInstructions;
+
+ // Root importframe
+ ImportFrame* mRootFrame;
+
+ // Named templates
+ txExpandedNameMap<txInstruction> mNamedTemplates;
+
+ // Map with all decimal-formats
+ txOwningExpandedNameMap<txDecimalFormat> mDecimalFormats;
+
+ // Map with all named attribute sets
+ txExpandedNameMap<txInstruction> mAttributeSets;
+
+ // Map with all global variables and parameters
+ txOwningExpandedNameMap<GlobalVariable> mGlobalVariables;
+
+ // Map with all keys
+ txOwningExpandedNameMap<txXSLKey> mKeys;
+
+ // Array of all txStripSpaceTests, sorted in acending order
+ nsTArray<mozilla::UniquePtr<txStripSpaceTest> > mStripSpaceTests;
+
+ // Default templates
+ mozilla::UniquePtr<txInstruction> mContainerTemplate;
+ mozilla::UniquePtr<txInstruction> mCharactersTemplate;
+ mozilla::UniquePtr<txInstruction> mEmptyTemplate;
+};
+
+/**
+ * txStripSpaceTest holds both an txNameTest and a bool for use in
+ * whitespace stripping.
+ */
+class txStripSpaceTest {
+ public:
+ txStripSpaceTest(nsAtom* aPrefix, nsAtom* aLocalName, int32_t aNSID,
+ bool stripSpace)
+ : mNameTest(aPrefix, aLocalName, aNSID, txXPathNodeType::ELEMENT_NODE),
+ mStrips(stripSpace) {}
+
+ nsresult matches(const txXPathNode& aNode, txIMatchContext* aContext,
+ bool& aMatched) {
+ return mNameTest.matches(aNode, aContext, aMatched);
+ }
+
+ bool stripsSpace() { return mStrips; }
+
+ double getDefaultPriority() { return mNameTest.getDefaultPriority(); }
+
+ protected:
+ txNameTest mNameTest;
+ bool mStrips;
+};
+
+/**
+ * Value of a global parameter
+ */
+class txIGlobalParameter {
+ public:
+ MOZ_COUNTED_DEFAULT_CTOR(txIGlobalParameter)
+ MOZ_COUNTED_DTOR_VIRTUAL(txIGlobalParameter)
+ virtual nsresult getValue(txAExprResult** aValue) = 0;
+};
+
+#endif // TX_TXSTYLESHEET_H