def handleMatch(self, m, data):
     el = etree.Element(INDEXED_WORDS_TAG)
     el.set('class', INDEXED_WORDS_CLASSNAME)
     el.set('data-book-index', self.unescape(
         m.group(1).strip()))  # Use unescape to remove placeholders
     el.text = AtomicString(m.group(1).strip())
     return el, m.start(0), m.end(0)
Beispiel #2
0
    def handleMatch(self, m):
        """Handle pattern match."""
        gist_id = m.group('gist_id')
        gist_file = m.group('filename')

        gist_elem = etree.Element('div')
        gist_elem.set('class', 'gist')
        script_elem = etree.SubElement(gist_elem, 'script')

        noscript_elem = etree.SubElement(gist_elem, 'noscript')

        try:
            if gist_file:
                script_elem.set('src', GIST_FILE_JS_URL.format(
                    gist_id, gist_file))
                raw_gist = (self.get_raw_gist_with_filename(
                    gist_id, gist_file))

            else:
                script_elem.set('src', GIST_JS_URL.format(gist_id))
                raw_gist = (self.get_raw_gist(gist_id))

            # Insert source as <pre/> within <noscript>
            pre_elem = etree.SubElement(noscript_elem, 'pre')
            pre_elem.text = AtomicString(raw_gist)

        except GistFetchException as e:
            LOGGER.warn(e.message)
            warning_comment = etree.Comment(' WARNING: {0} '.format(e.message))
            noscript_elem.append(warning_comment)

        return gist_elem
Beispiel #3
0
 def handleMatch(self, m):
     node = etree.Element(None)
     text = ''
     for group in self.groups:
         text += m.group(group)
     node.text = AtomicString(text)
     return node;
    def run(self, parent, blocks):
        sibling = self.lastChild(parent)
        block = blocks.pop(0)

        block, theRest = self.detab(block)
        block = block.rstrip()

        block_is_html = False
        if "<div " in block or "</" in block or "<span " in block:
            block_is_html = True

        if (sibling is not None and sibling.tag == "div"):
            # The previous block was a code block. As blank lines do not start
            # new code blocks, append this block to the previous, adding back
            # linebreaks removed from the split into a list.

            block_is_html = block_is_html and not isinstance(sibling.text, AtomicString)

            block = u'\n'.join([sibling.text, block])
            output = sibling
        else:
            # This is a new codeblock. Create the elements and insert text.
            output = markdown.util.etree.SubElement(parent, 'div', {'class': 'code-output'})

        # If not HTML, add the `pre` class so that we know to render output as raw text
        if not block_is_html and 'pre' not in output.get('class', 'code-output'):
            output.set('class', ' '.join([output.get('class', ''), 'pre']))

        output.text = "{}\n".format(block) if block_is_html else AtomicString("{}\n".format(block))

        if theRest:
            # This block contained unindented line(s) after the first indented
            # line. Insert these lines as the first block of the master blocks
            # list for future processing.
            blocks.insert(0, theRest)
Beispiel #5
0
    def handleMatch(self, match):
        """
        process settings associated with !buildstatus markdown
        """
        url = match.group(2)

        # A tuple separating specific MOOSE documentation features from HTML styles
        settings = self.getSettings(match.group(3))

        # Create parent div, and set any allowed CSS
        parent_div = self.applyElementSettings(etree.Element('div'), settings)
        parent_div.set('class', 'moose-buildstatus')

        child_div = etree.SubElement(parent_div, 'div')
        jquery_script = etree.SubElement(parent_div, 'script')
        build_status_script = etree.SubElement(parent_div, 'script')

        jquery_script.set('src', 'http://code.jquery.com/jquery-1.11.0.min.js')

        # We need to inform SmartyPants to not format for paragraph use
        build_status_script.text = \
            AtomicString('$(document).ready(function(){ $("#buildstatus").load("%s");});' % (url))

        # Set some necessary defaults for our child div
        child_div.set('id', 'buildstatus')

        # Set any additional allowed CSS
        return parent_div
 def handleMatch(self, match: Match) -> Element:
     groups = match.groupdict()
     element: Element = markdown.util.etree.Element('span')
     element.set('class', 'counter')
     element.set('title', 'counter')
     element.text = AtomicString(groups.get('numbers'))
     return element
Beispiel #7
0
 def handleMatch(self, m, data):
     node = Element('script')
     node.set('type', self._content_type)
     node.text = AtomicString(m.group(2))
     if self._add_preview:
         node = _wrap_node(node, m.group(0), 'span')
     return node, m.start(0), m.end(0)
def safe_concat(a, b):
    ''' to deal with cases when a is None '''
    if isinstance(a, AtomicString):
        return AtomicString(a + b)
    else:
        # otherwise a is str-like or none
        return (a or '') + b
Beispiel #9
0
 def _wrap_node(node, preview_text, wrapper_tag):
     if not self.getConfig('add_preview'):
         return node
     preview = etree.Element('span', {'class': 'MathJax_Preview'})
     preview.text = AtomicString(preview_text)
     wrapper = etree.Element(wrapper_tag)
     wrapper.extend([preview, node])
     return wrapper
Beispiel #10
0
    def append(text, sibling):
        preElement = sibling.find("*/pre")

        currentCode = preElement.text
        lines = [x for x in currentCode.split('\n') if x]
        lines.append(text)

        preElement.text = AtomicString('%s' % ('\n'.join(lines)))
Beispiel #11
0
 def _wrap_node(node, preview_text, wrapper_tag):
     if not self.getConfig("add_preview"):
         return node
     preview = etree.Element("span", {"class": "MathJax_Preview"})
     preview.text = AtomicString(preview_text)
     wrapper = etree.Element(wrapper_tag)
     wrapper.extend([preview, node])
     return wrapper
Beispiel #12
0
 def handleMatch(self, m):
     el = etree.Element("a")
     href = m.group(2)
     if not re.match('^(ftp|https?)://', href, flags=re.IGNORECASE):
         href = 'http://%s' % href
     el.set('href', self.unescape(href))
     el.text = AtomicString(m.group(2))
     return el
Beispiel #13
0
    def handleMatch(self, m):
        subsc = m.group(3)

        text = subsc

        el = etree.Element('sub')
        el.text = AtomicString(text)
        return el
Beispiel #14
0
 def handleMatch(self, m):
     el = etree.Element('span')
     el.set('class', 'type')
     types = m.group(3)
      # Make sure types are shown as type1 | type2
     types = re.sub(' or ', ' | ', types)
     types = re.sub(r'(?<=\w)[|](?=\w)', ' | ', types)
     el.text = AtomicString(types)
     return el
Beispiel #15
0
    def make_link(self, category, obj, url, text):
        """Make an <a> element

        Override this to set custom attributes, e.g. title.
        """
        el = etree.Element('a')
        el.set('href', url)
        el.text = AtomicString(text)
        return el
Beispiel #16
0
 def handle_match_inline(m):
     node = etree.Element('script')
     node.set('type', self._get_content_type(m.group(2)))
     if m.group(2) in self.asciimath_delimiters:
         text = self._fix_html_entites(m.group(3))
         if self.getConfig('asciimath_escape'):
             node.text = AtomicString(self._process_escape(text))
         else:
             node.text = AtomicString(text)
     elif m.group(2) in self.latexmath_delimiters:
         text = self._fix_latex(m.group(3))
         if self.getConfig('latexmath_escape'):
             node.text = AtomicString(self._process_escape(text))
         else:
             node.text = AtomicString(text)
     else:
         text = m.group(3)
         node.text = AtomicString(text)
     return _wrap_node(node, m.group(2) + text + m.group(4), 'span')
Beispiel #17
0
 def handleMatch(self, m, data):
     for value, is_block in zip(m.groups(), (False, True, True)):
         if value:
             break
     script = etree.Element('script', type='math/tex' + ('; mode=display' if is_block else ''))
     preview = etree.Element('span', {'class': 'MathJax_Preview'})
     preview.text = script.text = AtomicString(value)
     wrapper = etree.Element('span')
     wrapper.extend([preview, script])
     return wrapper, m.start(0), m.end(0)
    def run(self, parent, blocks):
        block = blocks.pop(0)
        m = re.fullmatch(self.RE_DISPLAY_BLOCK, block, re.DOTALL)

        e = etree.SubElement(parent, 'script')
        e.set('type', 'math/tex; mode=display')
        e.text = AtomicString(self.ELEM_TEXT_BEGIN + m.group(1).strip('\n') +
                              self.ELEM_TEXT_END)

        return True
Beispiel #19
0
 def handleMatch(self, m):
     from pokedex.db import tables, util
     start, label, category, target, end = m.groups()
     try:
         table = dict(
                 ability=tables.Ability,
                 item=tables.Item,
                 location=tables.Location,
                 move=tables.Move,
                 pokemon=tables.PokemonSpecies,
                 type=tables.Type,
                 form=tables.PokemonForm,
             )[category]
     except KeyError:
         obj = name = target
         url = self.factory.identifier_url(category, obj)
     else:
         session = self.session
         if table is tables.PokemonForm:
             form_ident, pokemon_ident = target.split()
             query = session.query(table)
             query = query.filter(
                     tables.PokemonForm.form_identifier == form_ident)
             query = query.join(tables.PokemonForm.pokemon)
             query = query.join(tables.Pokemon.species)
             query = query.filter(
                     tables.PokemonSpecies.identifier == pokemon_ident)
         else:
             query = session.query(table)
             query = query.filter(table.identifier == target)
         try:
             obj = query.one()
         except Exception:
             obj = name = target
             url = self.factory.identifier_url(category, obj)
         else:
             url = self.factory.object_url(category, obj)
             url = url or self.factory.identifier_url(category, target)
             name = None
             # Translations can be incomplete; in which case we want to use
             # a fallback.
             if table in [tables.Type] and self.string_language:
                 # Type wants to be localized to the text language
                 name = obj.name_map.get(self.string_language)
             if not name and self.game_language:
                 name = obj.name_map.get(self.game_language)
             if not name:
                 name = obj.name
     if url:
         el = self.factory.make_link(category, obj, url, label or name)
     else:
         el = etree.Element('span')
         el.text = AtomicString(label or name)
     return el
Beispiel #20
0
 def handleMatch(self, m):
     ref = m.group(3)
     s = ref.split('.')
     if len(s) == 2:
         refurl = ('/ref/%s#%s') % (s[0], ref)
     else:
         refurl = ('#%s') % (s[0])
     el = etree.Element('a')
     el.text = AtomicString(ref)
     el.set('href', refurl)
     return el
 def render_html_span(token):
     # intentionally let Python-Markdown handle this
     # because its html parser is stronger!
     #
     # Example:
     # # Hello <small>world</small>
     # mistletoe: [Hello, <small>, world, </small>]
     # PyMD:      [Hello, <small>world</small>]
     # which result wrong TOC title generation, but I
     # don't want to change that plugin myself
     return AtomicString(token.content)
 def render_quote(self, token):
     el = etree.Element('blockquote')
     el.text = '\n'
     self._suppress_ptag_stack.append(False)
     self.append_elems(el, self.render_inner_join(token))
     self.append_newline_inside(el)
     # remove duplicate newlines, dealing with empty blockquote, e.g.
     # test #202: '>\n' -> '<blockquote>\n</blockquote>\n'
     if not el and el.text == '\n\n':
         el.text = AtomicString('\n')
     self._suppress_ptag_stack.pop()
     return el
Beispiel #23
0
    def run(self, parent, blocks):
        block = blocks.pop(0)
        text = block

        # Parse configuration params
        m = self.RE.search(block)
        delimiter = m.group('delimiter')
        imgformat = m.group('format') if m.group(
            'format') else self.config['format']
        classes = m.group('classes') if m.group(
            'classes') else self.config['classes']
        alt = m.group('alt') if m.group('alt') else self.config['alt']
        title = m.group('title') if m.group('title') else self.config['title']

        # Read blocks until end marker found
        end_re = self.RE_END1 if delimiter == '::uml::' else self.RE_END2

        while blocks and not end_re.search(block):
            block = blocks.pop(0)
            text += '\n' + block
        else:
            if not blocks:
                raise RuntimeError("UML block not closed")

        # Remove block header and footer
        text = re.sub(self.RE, "", re.sub(end_re, "", text))
        text = "\n".join(text.split('\n'))
        diagram = self.generate_uml_image(text, imgformat)

        p = etree.SubElement(parent, 'p')
        if imgformat == 'png':
            data = 'data:image/png;base64,{0}'.format(
                base64.b64encode(diagram).decode('ascii'))
            img = etree.SubElement(p, 'img')
            img.attrib['src'] = data
            img.attrib['classes'] = classes
            img.attrib['alt'] = alt
            img.attrib['title'] = title
        elif imgformat == 'svg':
            # Firefox handles only base64 encoded SVGs
            data = 'data:image/svg+xml;base64,{0}'.format(
                base64.b64encode(diagram).decode('ascii'))
            img = etree.SubElement(p, 'img')
            img.attrib['src'] = data
            img.attrib['classes'] = classes
            img.attrib['alt'] = alt
            img.attrib['title'] = title
        elif imgformat == 'txt':
            #logger.debug(diagram)
            pre = etree.SubElement(parent, 'pre')
            code = etree.SubElement(pre, 'code')
            code.attrib['class'] = 'text'
            code.text = AtomicString(diagram)
Beispiel #24
0
    def run(self, root):
        if (not self.pelican_katex_extension.katex_needed):
            return root

        katex_script = etree.Element('script')
        katex_script.set('type', 'text/javascript')
        katex_script.text = AtomicString(
            self.pelican_katex_extension.getConfig('katex_script'))
        root.append(katex_script)

        self.pelican_katex_extension.katex_needed = False
        return root
 def render_block_code(self, token):
     el_pre = etree.Element('pre')
     el_code = etree.SubElement(el_pre, 'code')
     if token.language:
         el_code.set('class', 'language-{}'.format(self.escape_html(token.language)))
     # to comply with the format using in PythonMarkdown.
     # or it may break in plugins like codehilite!!
     code_text = (html.escape(token.children[0].content)
         .replace('&#x27;', "'")
         # FIXME: breaks commonmark test suite #176
         .replace('&quot;', '"'))
     # protect inside content from being interpreted
     el_code.text = AtomicString(code_text)
     return el_pre
    def run(self, root):

        # If no mathjax was present, then exit
        if (not self.pelican_mathjax_extension.mathjax_needed):
            return

        # Add the mathjax script to the html document
        mathjax_script = etree.Element('script')
        mathjax_script.set('type','text/javascript')
        mathjax_script.text = AtomicString(self.pelican_mathjax_extension.getConfig('mathjax_script'))
        root.append(mathjax_script)

        # Reset the boolean switch to false so that script is only added
        # to other pages if needed
        self.pelican_mathjax_extension.mathjax_needed = False
Beispiel #27
0
 def run(self, parent, blocks):
     block = blocks.pop(0)
     assert block.startswith("@show")
     files = block[5:].split()
     for f in files:
         file_container = etree.SubElement(parent, "div")
         file_container.set("class", "file_container")
         filename_container = etree.SubElement(file_container, "div")
         filename_container.text = f
         filename_container.set('class', 'filename')
         hunk_container = etree.SubElement(file_container, "pre")
         hunk_container.set('class', 'show')
         daddy = etree.SubElement(hunk_container, "code")
         daddy.text = AtomicString("".join(
             iter(open(self.srcdir + "/new/" + f))))
Beispiel #28
0
    def handleMatch(self, m):
        jinja_block = m.group(2)

        try:
            # render returns a unicode object
            # html = render_template_string(m.group(2))
            html = ENV.from_string(m.group(2)).render()
            place_holder = self.markdown.htmlStash.store(html)
            return place_holder
        except Exception as e:
            traceback.print_exc()

            el = etree.Element('em')
            el.text = AtomicString('Error %s in rendering %s' %
                                   (e, m.group(2)))
            return el
Beispiel #29
0
    def create(self, text, number, parent):
        container = etree.SubElement(parent, 'div')
        container.set('class', self.config['output_class'])
        container.set('data-output', number)
        if self.config['show_label']:
            label = etree.SubElement(container, 'div')
            label.set('class', 'notebook_output_text')

            span = etree.SubElement(label, 'span')
            span.text = self.config['label_text'].format(number)

        output = etree.SubElement(container, 'div')
        output.set('class', 'notebook_output_code')

        preElement = etree.SubElement(output, 'pre')
        preElement.text = AtomicString('%s\n' % text)
    def render_inner_join(self, token, delim='\n'):
        """
        Render as usual, but join yielded elements with
        a newline character in between.
        """
        xs = self.render_inner(token)

        try:
            head = next(xs)
        except StopIteration:
            # if the iterator is empty, we are done
            return

        yield head
        for x in xs:
            yield AtomicString(delim)
            yield x