summaryrefslogtreecommitdiffstats
path: root/quanta/parsers/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/parsers/parser.h')
-rw-r--r--quanta/parsers/parser.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/quanta/parsers/parser.h b/quanta/parsers/parser.h
new file mode 100644
index 00000000..db797df0
--- /dev/null
+++ b/quanta/parsers/parser.h
@@ -0,0 +1,160 @@
+/***************************************************************************
+ parser.h - description
+ -------------------
+ begin : Sun Sep 1 2002
+ copyright : (C) 2002, 2003, 2004 by Andras Mantia <amantia@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; version 2 of the License. *
+ * *
+ ***************************************************************************/
+
+#ifndef PARSER_H
+#define PARSER_H
+
+#include <qobject.h>
+#include <qdict.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qguardedptr.h>
+
+#include <qvaluestack.h>
+
+#include "node.h"
+#include "tag.h"
+#include "qtag.h"
+
+/**
+ *@author Andras Mantia
+ */
+
+class Document;
+class KDirWatch;
+class QRegExp;
+class NodeModifsSet;
+class SAParser;
+
+typedef QMap<QString, GroupElementMapList> IncludedGroupElements;
+typedef QMap<QString, IncludedGroupElements> IncludedGroupElementsMap;
+
+
+class Parser: public QObject {
+
+Q_OBJECT
+
+public:
+ Parser();
+ ~Parser();
+
+ /** Parse a string, using as start position sLine, sCol. */
+ Node *parseArea(int startLine, int startCol, int endLine, int endCol, Node **lastNode, Node *a_node = 0L);
+
+ /** Parse the whole text from Document w and build the internal structure tree
+ from Nodes. Set force to true if you want to avoid the possible checks. */
+ Node *parse(Document *w, bool force = false);
+
+ /** Returns the node for position (line, column). As more than one node can
+ contain the same area, it return the "deepest" node. */
+ Node *nodeAt(int line, int col, bool findDeepest = true, bool exact = false);
+
+ /** Rebuild the nodes */
+ Node *rebuild(Document *w);
+ /** No descriptions */
+ const DTDStruct * currentDTD(int line, int col);
+ /** Remove the found groups from the memeber variables */
+ void clearGroups();
+ void parseIncludedFiles();
+
+ /** Enable/Disable parsing. */
+ void setSAParserEnabled(bool enabled);
+ void setParsingEnabled(bool enabled) {m_parsingEnabled = enabled;}
+ bool isParsingEnabled() {return m_parsingEnabled;}
+ void setParsingNeeded(bool needed) {m_parsingNeeded = needed;}
+ bool parsingNeeded() {return m_parsingNeeded;}
+ /**
+ * This function is ESSENTIAL : when one modify baseNode, one MUST use
+ * this function to set the internal parser RootNode pointer to the same Node as
+ * baseNode. If one forget, some strange sigserv errors concerning inexisting tags
+ * (Node->tag == 0) will occurs.
+ * Crash errors of Parser::nodeAt is a good sign of a missing setRootNode
+ */
+ void setRootNode(Node* node) {m_node = node;} //TODO: check if m_saParser should be updated or not!
+ void synchParseInDetail();
+
+ IncludedGroupElementsMap includedMap;
+ bool parsingEnabled;
+ bool m_treeReparsed;
+
+public slots:
+ void slotParseInDetail();
+ /** Remove the found groups from the memeber variables */
+ void cleanGroups();
+
+private slots:
+ void slotIncludedFileChanged(const QString& fileName);
+
+signals:
+ void nodeTreeChanged();
+ void rebuildStructureTree(bool);
+
+private:
+ Node* m_node; //the internal Node pointer
+ QString m_dtdName; //the DTD name of write
+ const DTDStruct* m_dtd; //the dtd used for main parsing
+ QGuardedPtr<Document> write; //pointer to the parsed document
+ int maxLines; // how many lines are in the current document
+ int oldMaxLines;
+ int treeSize;
+ QMap<QString, XMLStructGroup>::ConstIterator xmlGroupIt;
+ bool m_parsingEnabled;
+ bool m_parsingNeeded;
+
+ /** Clears the group elements found in the included files */
+ void clearIncludedGroupElements();
+ void parseIncludedFile(const QString &fileName, const DTDStruct *dtd);
+ /** Searches for scripts inside the text from startNode. It looks only for the
+ script begin/and delimiters, and not for the <script> or other special tags.
+ Useful when parsing for script inside the xml tags.
+ Returns: true if a script area is found, false if the parsed text does not
+ contain any scripts. */
+ bool parseScriptInsideTag(Node *startNode);
+
+ /** Parses the node for XML groups (specific tags)*/
+ void parseForXMLGroup(Node *node);
+ /** Determines the area that should be reparsed.
+ w: the document we are working on
+ area: the invalid areas
+ firstNode: the first unchanged node before the current position
+ lastNode: the first unchanged node after the current position
+ Returns: true if an area was found, false otherwise => require full parsing
+ */
+ bool invalidArea(Document *w, AreaStruct &area, Node **firstNode, Node **lastNode);
+
+ /** Deletes all the nodes between the firstNode and lastNode and keeps the tree's consistency.
+ modifs is the class recording these changes for the undo/redo system, cf undoredo.h */
+ void deleteNodes(Node *firstNode, Node *lastNode, NodeModifsSet *modifs);
+
+ /**
+ * This function must be called before reparsing : it log in the undo/redo system
+ * that the whole Node tree is reloaded.
+ * @param modifs This class record all the changes made.
+ * @param w modifs will be inserted in w's undoredo list.
+ */
+ void logReparse(NodeModifsSet *modifs, Document *w);
+
+
+ SAParser *m_saParser; //the special area parser object
+
+ /** Maybe we should move to a separate, special area parsing class */
+ Node* specialAreaParsingDone(int &lastLine, int &lastCol);
+
+ bool m_parseIncludedFiles;
+};
+
+
+
+#endif