Index: third_party/Python-Markdown/markdown/extensions/footnotes.py |
diff --git a/third_party/markdown/extensions/footnotes.py b/third_party/Python-Markdown/markdown/extensions/footnotes.py |
similarity index 58% |
copy from third_party/markdown/extensions/footnotes.py |
copy to third_party/Python-Markdown/markdown/extensions/footnotes.py |
index 38b43b4d30580574bec2f2d1fad84e657542637b..d8caae27cd977061c9e287c757b859a013bbeefb 100644 |
--- a/third_party/markdown/extensions/footnotes.py |
+++ b/third_party/Python-Markdown/markdown/extensions/footnotes.py |
@@ -1,57 +1,15 @@ |
-# markdown is released under the BSD license |
-# Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) |
-# Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) |
-# Copyright 2004 Manfred Stienstra (the original version) |
-# |
-# All rights reserved. |
-# |
-# Redistribution and use in source and binary forms, with or without |
-# modification, are permitted provided that the following conditions are met: |
-# |
-# * Redistributions of source code must retain the above copyright |
-# notice, this list of conditions and the following disclaimer. |
-# * Redistributions in binary form must reproduce the above copyright |
-# notice, this list of conditions and the following disclaimer in the |
-# documentation and/or other materials provided with the distribution. |
-# * Neither the name of the <organization> nor the |
-# names of its contributors may be used to endorse or promote products |
-# derived from this software without specific prior written permission. |
-# |
-# THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY |
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
-# DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT |
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
-# POSSIBILITY OF SUCH DAMAGE. |
- |
- |
""" |
-========================= FOOTNOTES ================================= |
+Footnotes Extension for Python-Markdown |
+======================================= |
-This section adds footnote handling to markdown. It can be used as |
-an example for extending python-markdown with relatively complex |
-functionality. While in this case the extension is included inside |
-the module itself, it could just as easily be added from outside the |
-module. Not that all markdown classes above are ignorant about |
-footnotes. All footnote functionality is provided separately and |
-then added to the markdown instance at the run time. |
+Adds footnote handling to Python-Markdown. |
-Footnote functionality is attached by calling extendMarkdown() |
-method of FootnoteExtension. The method also registers the |
-extension to allow it's state to be reset by a call to reset() |
-method. |
+See <https://pythonhosted.org/Markdown/extensions/footnotes.html> |
+for documentation. |
-Example: |
- Footnotes[^1] have a label[^label] and a definition[^!DEF]. |
+Copyright The Python Markdown Project |
- [^1]: This is a footnote |
- [^label]: A footnote on "label" |
- [^!DEF]: The footnote for definition |
+License: [BSD](http://www.opensource.org/licenses/bsd-license.php) |
""" |
@@ -67,29 +25,31 @@ from ..odict import OrderedDict |
import re |
FN_BACKLINK_TEXT = "zz1337820767766393qq" |
-NBSP_PLACEHOLDER = "qq3936677670287331zz" |
+NBSP_PLACEHOLDER = "qq3936677670287331zz" |
DEF_RE = re.compile(r'[ ]{0,3}\[\^([^\]]*)\]:\s*(.*)') |
TABBED_RE = re.compile(r'((\t)|( ))(.*)') |
+ |
class FootnoteExtension(Extension): |
""" Footnote Extension. """ |
- def __init__ (self, configs): |
+ def __init__(self, *args, **kwargs): |
""" Setup configs. """ |
- self.config = {'PLACE_MARKER': |
- ["///Footnotes Go Here///", |
- "The text string that marks where the footnotes go"], |
- 'UNIQUE_IDS': |
- [False, |
- "Avoid name collisions across " |
- "multiple calls to reset()."], |
- "BACKLINK_TEXT": |
- ["↩", |
- "The text string that links from the footnote to the reader's place."] |
- } |
- |
- for key, value in configs: |
- self.config[key][0] = value |
+ |
+ self.config = { |
+ 'PLACE_MARKER': |
+ ["///Footnotes Go Here///", |
+ "The text string that marks where the footnotes go"], |
+ 'UNIQUE_IDS': |
+ [False, |
+ "Avoid name collisions across " |
+ "multiple calls to reset()."], |
+ "BACKLINK_TEXT": |
+ ["↩", |
+ "The text string that links from the footnote " |
+ "to the reader's place."] |
+ } |
+ super(FootnoteExtension, self).__init__(*args, **kwargs) |
# In multiple invocations, emit links that don't get tangled. |
self.unique_prefix = 0 |
@@ -101,27 +61,28 @@ class FootnoteExtension(Extension): |
md.registerExtension(self) |
self.parser = md.parser |
self.md = md |
- self.sep = ':' |
- if self.md.output_format in ['html5', 'xhtml5']: |
- self.sep = '-' |
# Insert a preprocessor before ReferencePreprocessor |
- md.preprocessors.add("footnote", FootnotePreprocessor(self), |
- "<reference") |
+ md.preprocessors.add( |
+ "footnote", FootnotePreprocessor(self), "<reference" |
+ ) |
# Insert an inline pattern before ImageReferencePattern |
- FOOTNOTE_RE = r'\[\^([^\]]*)\]' # blah blah [^1] blah |
- md.inlinePatterns.add("footnote", FootnotePattern(FOOTNOTE_RE, self), |
- "<reference") |
+ FOOTNOTE_RE = r'\[\^([^\]]*)\]' # blah blah [^1] blah |
+ md.inlinePatterns.add( |
+ "footnote", FootnotePattern(FOOTNOTE_RE, self), "<reference" |
+ ) |
# Insert a tree-processor that would actually add the footnote div |
- # This must be before all other treeprocessors (i.e., inline and |
+ # This must be before all other treeprocessors (i.e., inline and |
# codehilite) so they can run on the the contents of the div. |
- md.treeprocessors.add("footnote", FootnoteTreeprocessor(self), |
- "_begin") |
+ md.treeprocessors.add( |
+ "footnote", FootnoteTreeprocessor(self), "_begin" |
+ ) |
# Insert a postprocessor after amp_substitute oricessor |
- md.postprocessors.add("footnote", FootnotePostprocessor(self), |
- ">amp_substitute") |
+ md.postprocessors.add( |
+ "footnote", FootnotePostprocessor(self), ">amp_substitute" |
+ ) |
def reset(self): |
- """ Clear the footnotes on reset, and prepare for a distinct document. """ |
+ """ Clear footnotes on reset, and prepare for distinct document. """ |
self.footnotes = OrderedDict() |
self.unique_prefix += 1 |
@@ -137,7 +98,7 @@ class FootnoteExtension(Extension): |
return child, element, False |
finder(child) |
return None |
- |
+ |
res = finder(root) |
return res |
@@ -145,19 +106,25 @@ class FootnoteExtension(Extension): |
""" Store a footnote for later retrieval. """ |
self.footnotes[id] = text |
+ def get_separator(self): |
+ if self.md.output_format in ['html5', 'xhtml5']: |
+ return '-' |
+ return ':' |
+ |
def makeFootnoteId(self, id): |
""" Return footnote link id. """ |
if self.getConfig("UNIQUE_IDS"): |
- return 'fn%s%d-%s' % (self.sep, self.unique_prefix, id) |
+ return 'fn%s%d-%s' % (self.get_separator(), self.unique_prefix, id) |
else: |
- return 'fn%s%s' % (self.sep, id) |
+ return 'fn%s%s' % (self.get_separator(), id) |
def makeFootnoteRefId(self, id): |
""" Return footnote back-link id. """ |
if self.getConfig("UNIQUE_IDS"): |
- return 'fnref%s%d-%s' % (self.sep, self.unique_prefix, id) |
+ return 'fnref%s%d-%s' % (self.get_separator(), |
+ self.unique_prefix, id) |
else: |
- return 'fnref%s%s' % (self.sep, id) |
+ return 'fnref%s%s' % (self.get_separator(), id) |
def makeFootnotesDiv(self, root): |
""" Return div of footnotes as et Element. """ |
@@ -177,10 +144,13 @@ class FootnoteExtension(Extension): |
backlink = etree.Element("a") |
backlink.set("href", "#" + self.makeFootnoteRefId(id)) |
if self.md.output_format not in ['html5', 'xhtml5']: |
- backlink.set("rev", "footnote") # Invalid in HTML5 |
+ backlink.set("rev", "footnote") # Invalid in HTML5 |
backlink.set("class", "footnote-backref") |
- backlink.set("title", "Jump back to footnote %d in the text" % \ |
- (self.footnotes.index(id)+1)) |
+ backlink.set( |
+ "title", |
+ "Jump back to footnote %d in the text" % |
+ (self.footnotes.index(id)+1) |
+ ) |
backlink.text = FN_BACKLINK_TEXT |
if li.getchildren(): |
@@ -197,7 +167,7 @@ class FootnoteExtension(Extension): |
class FootnotePreprocessor(Preprocessor): |
""" Find all footnote references and store for later use. """ |
- def __init__ (self, footnotes): |
+ def __init__(self, footnotes): |
self.footnotes = footnotes |
def run(self, lines): |
@@ -218,7 +188,7 @@ class FootnotePreprocessor(Preprocessor): |
if m: |
fn, _i = self.detectTabbed(lines[i+1:]) |
fn.insert(0, m.group(2)) |
- i += _i-1 # skip past footnote |
+ i += _i-1 # skip past footnote |
self.footnotes.setFootnote(m.group(1), "\n".join(fn)) |
else: |
newlines.append(lines[i]) |
@@ -239,16 +209,16 @@ class FootnotePreprocessor(Preprocessor): |
""" |
items = [] |
- blank_line = False # have we encountered a blank line yet? |
- i = 0 # to keep track of where we are |
+ blank_line = False # have we encountered a blank line yet? |
+ i = 0 # to keep track of where we are |
def detab(line): |
match = TABBED_RE.match(line) |
if match: |
- return match.group(4) |
+ return match.group(4) |
for line in lines: |
- if line.strip(): # Non-blank line |
+ if line.strip(): # Non-blank line |
detabbed_line = detab(line) |
if detabbed_line: |
items.append(detabbed_line) |
@@ -262,23 +232,24 @@ class FootnotePreprocessor(Preprocessor): |
else: |
return items, i+1 |
- else: # Blank line: _maybe_ we are done. |
+ else: # Blank line: _maybe_ we are done. |
blank_line = True |
- i += 1 # advance |
+ i += 1 # advance |
# Find the next non-blank line |
for j in range(i, len(lines)): |
if lines[j].strip(): |
- next_line = lines[j]; break |
+ next_line = lines[j] |
+ break |
else: |
- break # There is no more text; we are done. |
+ break # There is no more text; we are done. |
# Check if the next non-blank line is tabbed |
- if detab(next_line): # Yes, more work to do. |
+ if detab(next_line): # Yes, more work to do. |
items.append("") |
continue |
else: |
- break # No, we are done. |
+ break # No, we are done. |
else: |
i += 1 |
@@ -300,7 +271,7 @@ class FootnotePattern(Pattern): |
sup.set('id', self.footnotes.makeFootnoteRefId(id)) |
a.set('href', '#' + self.footnotes.makeFootnoteId(id)) |
if self.footnotes.md.output_format not in ['html5', 'xhtml5']: |
- a.set('rel', 'footnote') # invalid in HTML5 |
+ a.set('rel', 'footnote') # invalid in HTML5 |
a.set('class', 'footnote-ref') |
a.text = text_type(self.footnotes.footnotes.index(id) + 1) |
return sup |
@@ -311,12 +282,12 @@ class FootnotePattern(Pattern): |
class FootnoteTreeprocessor(Treeprocessor): |
""" Build and append footnote div to end of document. """ |
- def __init__ (self, footnotes): |
+ def __init__(self, footnotes): |
self.footnotes = footnotes |
def run(self, root): |
footnotesDiv = self.footnotes.makeFootnotesDiv(root) |
- if footnotesDiv: |
+ if footnotesDiv is not None: |
result = self.footnotes.findFootnotesPlaceholder(root) |
if result: |
child, parent, isText = result |
@@ -330,16 +301,19 @@ class FootnoteTreeprocessor(Treeprocessor): |
else: |
root.append(footnotesDiv) |
+ |
class FootnotePostprocessor(Postprocessor): |
""" Replace placeholders with html entities. """ |
def __init__(self, footnotes): |
self.footnotes = footnotes |
def run(self, text): |
- text = text.replace(FN_BACKLINK_TEXT, self.footnotes.getConfig("BACKLINK_TEXT")) |
+ text = text.replace( |
+ FN_BACKLINK_TEXT, self.footnotes.getConfig("BACKLINK_TEXT") |
+ ) |
return text.replace(NBSP_PLACEHOLDER, " ") |
-def makeExtension(configs=[]): |
- """ Return an instance of the FootnoteExtension """ |
- return FootnoteExtension(configs=configs) |
+def makeExtension(*args, **kwargs): |
+ """ Return an instance of the FootnoteExtension """ |
+ return FootnoteExtension(*args, **kwargs) |