From 36abb1d12c0def034725b840ac200b6813cf5828 Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Wed, 5 Nov 2008 15:49:02 -0500 Subject: Added Abbreviation Extension. Tests included --- markdown_extensions/abbr.py | 95 +++++++++++++++++++++++++++++++++++++++ test-markdown.py | 1 + tests/extensions-x-abbr/abbr.html | 4 ++ tests/extensions-x-abbr/abbr.txt | 13 ++++++ 4 files changed, 113 insertions(+) create mode 100644 markdown_extensions/abbr.py create mode 100644 tests/extensions-x-abbr/abbr.html create mode 100644 tests/extensions-x-abbr/abbr.txt diff --git a/markdown_extensions/abbr.py b/markdown_extensions/abbr.py new file mode 100644 index 0000000..551e4f5 --- /dev/null +++ b/markdown_extensions/abbr.py @@ -0,0 +1,95 @@ +''' +Abbreviation Extension for Python-Markdown +========================================== + +This extension adds abbreviation handling to Python-Markdown. + +Simple Usage: + + >>> import markdown + >>> text = """ + ... Some text with an ABBR and a REF. Ignore REFERENCE and ref. + ... + ... *[ABBR]: Abbreviation + ... *[REF]: Abbreviation Reference + ... """ + >>> markdown.markdown(text, ['abbr']) + u'

Some text with an ABBR and a REF. Ignore REFERENCE and ref.

' + +Copyright 2007-2008 +* [Waylan Limberg](http://achinghead.com/) +* [Seemant Kulleen](http://www.kulleen.org/) + + +''' + +import markdown, re +from markdown import etree + +# Global Vars +ABBR_REF_RE = re.compile(r'[*]\[(?P[^\]]*)\][ ]?:\s*(?P.*)') + +class AbbrExtension(markdown.Extension): + """ Abbreviation Extension for Python-Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Insert AbbrPreprocessor before ReferencePreprocessor. """ + md.preprocessors.add('abbr', AbbrPreprocessor(md), '<reference') + + +class AbbrPreprocessor(markdown.Preprocessor): + """ Abbreviation Preprocessor - parse text for abbr references. """ + + def run(self, lines): + ''' + Find and remove all Abbreviation references from the text. + Each reference is set as a new AbbrPattern in the markdown instance. + + ''' + new_text = [] + for line in lines: + m = ABBR_REF_RE.match(line) + if m: + abbr = m.group('abbr').strip() + title = m.group('title').strip() + self.markdown.inlinePatterns['abbr-%s'%abbr] = \ + AbbrPattern(self._generate_pattern(abbr), title) + else: + new_text.append(line) + return new_text + + def _generate_pattern(self, text): + ''' + Given a string, returns an regex pattern to match that string. + + 'HTML' -> r'(?P<abbr>[H][T][M][L])' + + Note: we force each char as a literal match (in brackets) as we don't + know what they will be beforehand. + + ''' + chars = list(text) + for i in range(len(chars)): + chars[i] = r'[%s]' % chars[i] + return r'(?P<abbr>\b%s\b)' % (r''.join(chars)) + + +class AbbrPattern(markdown.Pattern): + """ Abbreviation inline pattern. """ + + def __init__(self, pattern, title): + markdown.Pattern.__init__(self, pattern) + self.title = title + + def handleMatch(self, m): + abbr = etree.Element('abbr') + abbr.text = m.group('abbr') + abbr.set('title', self.title) + return abbr + +def makeExtension(configs=None): + return AbbrExtension(configs=configs) + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/test-markdown.py b/test-markdown.py index 1445799..3d9ef66 100755 --- a/test-markdown.py +++ b/test-markdown.py @@ -376,6 +376,7 @@ testDirectory("tests/extensions-x-codehilite") testDirectory("tests/extensions-x-wikilinks") testDirectory("tests/extensions-x-toc") testDirectory("tests/extensions-x-def_list") +testDirectory("tests/extensions-x-abbr") print "\n### Final result ###" if len(failedTests): diff --git a/tests/extensions-x-abbr/abbr.html b/tests/extensions-x-abbr/abbr.html new file mode 100644 index 0000000..456524e --- /dev/null +++ b/tests/extensions-x-abbr/abbr.html @@ -0,0 +1,4 @@ +<p>An <abbr title="Abbreviation">ABBR</abbr>: "<abbr title="Reference">REF</abbr>". +ref and REFERENCE should be ignored.</p> +<p>The <abbr title="Hyper Text Markup Language">HTML</abbr> specification +is maintained by the <abbr title="World Wide Web Consortium">W3C</abbr>.</p> \ No newline at end of file diff --git a/tests/extensions-x-abbr/abbr.txt b/tests/extensions-x-abbr/abbr.txt new file mode 100644 index 0000000..991bf15 --- /dev/null +++ b/tests/extensions-x-abbr/abbr.txt @@ -0,0 +1,13 @@ +An ABBR: "REF". +ref and REFERENCE should be ignored. + +*[REF]: Reference +*[ABBR]: This gets overriden by the next one. +*[ABBR]: Abbreviation + +The HTML specification +is maintained by the W3C. + +*[HTML]: Hyper Text Markup Language +*[W3C]: World Wide Web Consortium + -- cgit v1.2.3