root/branches/mbutscher/work/lib/pwiki/ParseUtilities.py @ 195

Revision 195, 4.0 kB (checked in by mbutscher, 4 years ago)

branches/mbutscher/work:
2.0beta04

* Some bugs in translation handling fixed
* Support for printing rendered HTML

* Internal: Faster DocPages?.getFlatTree()

(if includeSet given)

* Internal: Initial support for wiki-bound option

pages from plugins

Line 
1
2
3class _DummmyWikiLanguageDetails(object):
4    """
5    Dummy class for simpler comparing of wiki language format details if real
6    details are not given.
7    """
8    __slots__ = ("__weakref__",)
9
10    @staticmethod
11    def getWikiLanguageName():
12        return "nonexisting dummy wiki language identifier"
13
14    def isEquivTo(self, details):
15         return self.getWikiLanguageName() == details.getWikiLanguageName()
16
17
18DUMMY_WIKI_LANGUAGE_DETAILS = _DummmyWikiLanguageDetails()
19
20
21
22class WikiPageFormatDetails(object):
23    """
24    Store some details of the formatting of a specific page
25    """
26    __slots__ = ("__weakref__", "withCamelCase", "footnotesAsWws",
27            "wikiDocument", "autoLinkMode", "noFormat", "paragraphMode",
28            "wikiLanguageDetails")
29   
30    def __init__(self, withCamelCase=True, footnotesAsWws=False,
31            wikiDocument=None, autoLinkMode=u"off", noFormat=False,
32            paragraphMode=False, wikiLanguageDetails=DUMMY_WIKI_LANGUAGE_DETAILS):
33        self.wikiDocument = wikiDocument   # WikiDocument object (needed for autoLink)
34
35        self.withCamelCase = withCamelCase   # Interpret CamelCase as wiki word?
36        self.footnotesAsWws = footnotesAsWws # Interpret footnotes
37                # (e.g. "[42]") as wikiwords?
38        self.autoLinkMode = autoLinkMode   # Mode to automatically create links from plain text
39        self.noFormat = noFormat   # No formatting at all, overrides other settings
40       
41        # If True, ignore single newlines, only empty line starts new paragraph
42        # Not relevant for page AST creation but for exporting (e.g. to HTML)
43        self.paragraphMode = paragraphMode
44       
45        # Wiki language details object which must provide an isEquivTo() method
46        # to be compared to another such object.
47        self.wikiLanguageDetails = wikiLanguageDetails
48
49
50    def getUsesDummyWikiLanguageDetails(self):
51        return self.wikiLanguageDetails is DUMMY_WIKI_LANGUAGE_DETAILS
52       
53    def setWikiLanguageDetails(self, languageDetails):
54        # TODO Allow only if currently dummy language is set?
55        self.wikiLanguageDetails = wikiLanguageDetails
56
57    def isEquivTo(self, details):
58        """
59        Compares with other details object if both are "equivalent"
60        """
61        if self.noFormat or details.noFormat:
62            # Remaining doesn't matter in this case
63            return self.noFormat == details.noFormat
64
65        return self.withCamelCase == details.withCamelCase and \
66                self.footnotesAsWws == details.footnotesAsWws and \
67                self.autoLinkMode == details.autoLinkMode and \
68                self.paragraphMode == details.paragraphMode and \
69                self.wikiLanguageDetails.isEquivTo(details.wikiLanguageDetails)
70
71
72
73def getFootnoteAnchorDict(pageAst):
74    """
75    Returns a new or cached dictionary of footnote anchors
76    {footnoteId: anchorNode} from a page ast.
77    """
78    if pageAst is None:
79        return
80    if not hasattr(pageAst, "footnoteAnchorDict"):
81        result = {}
82        fnNodes = pageAst.iterSelectedDeepByName("footnote",
83                frozenset(("indentedText", "orderedList", "unorderedList")))
84
85        for node in fnNodes:
86            result[node.footnoteId] = node
87
88        pageAst.footnoteAnchorDict = result
89
90    return pageAst.footnoteAnchorDict
91
92
93
94# def coalesceTokens(tokens):
95#     """
96#     Coalesce neighboured "Default" tokens.
97#     """
98#     result = []
99#     lenT = len(tokens)
100#     if lenT < 2:
101#         return tokens
102#         
103#     prevToken = tokens[0]
104#     for token in itertools.islice(tokens, 1, None):
105#         if prevToken.ttype == FormatTypes.Default and \
106#                token.ttype == FormatTypes.Default:
107#             prevToken.text = prevToken.text + token.text
108#             continue
109#
110#         result.append(prevToken)
111#         prevToken = token
112#     
113#     result.append(prevToken)
114#     
115#     return result
116
117
Note: See TracBrowser for help on using the browser.