diff --git a/texla/PageTree/Babel.py b/texla/PageTree/Babel.py index 4ece293..3808576 100644 --- a/texla/PageTree/Babel.py +++ b/texla/PageTree/Babel.py @@ -1,87 +1,87 @@ import logging class Babel: #Label babel def __init__(self, reporter): self.refs = {} self.anchors = {} self.reporter = reporter def add_label(self, label, anchor): ''' This method adds a label and its anchor to the babel. The label is unique but can be overwritten. ''' if label in self.anchors: logging.warning("Babel @ label: {} already present".format(label)) #saving the anchor that has to be unique self.anchors[label] = anchor logging.debug("Babel @ Adding label: \"{}\" to anchor: {}". format(label, anchor)) def add_reference(self, label, ref): ''' This method adds a reference to the label. A reference is a page or in general an object with .text properties. The babel will fix the reference of the registered objects. ''' #we don't check if label exist because #the process is asynchronous" if label not in self.refs: self.refs[label] = [] self.refs[label].append(ref) logging.debug("Babel @ Adding ref: {}, to label: \"{}\"". format(ref, label)) def move_anchor(self, oldanc, newanc): '''This function replace the references to oldanc with newanc, both as anchor and ref. It is used mainly when a page is moved''' new_anchors = {} for label, anc in self.anchors.items(): if anc == oldanc: new_anchors[label] = newanc self.anchors.update(new_anchors) new_refs = {} for label, ref in self.refs.items(): if ref == oldanc: new_refs[label] = newanc self.refs.update(new_refs) def fix_references(self): ''' This method will fix the reference in the objects saved under self.refs. The text {{ref:label}} in the objects' .text properties will be replaces by a url made of [url|title]. The url and the title MUST be properties of the anchor saved. Finally this method will send to the reporter the references having a label without anchor. ''' #iterating over anchor to fix only the right labels #and ignoring the missing ones for label in self.anchors: obj = self.anchors[label] title = obj.title url = obj.url if url is None and title is None: continue elif url is None and title is not None: replace_string = title elif url is not None and title is None: - replace_string = "[["+ url + "]]" + replace_string = "[["+ url + "]] " else: - replace_string = "[[{}|{}]]".format(url,title) + replace_string = "[[{}|{}]] ".format(url,title) #checking if the babel has refs if label not in self.refs: continue #iterating over all refs for ref in self.refs[label]: logging.debug("Babel @ Fixing ref to label: \"{}\", from page {} to page: {}". format(label,ref, obj)) ref.text = ref.text.replace("{{ref@"+ label +"}}", replace_string) #checking references without anchors for label in self.refs: if label not in self.anchors: self.reporter.add_missing_anchor(label, self.refs[label]) diff --git a/texla/Renderers/MediaWikiRenderer.py b/texla/Renderers/MediaWikiRenderer.py index dfff645..fd85a6a 100644 --- a/texla/Renderers/MediaWikiRenderer.py +++ b/texla/Renderers/MediaWikiRenderer.py @@ -1,560 +1,559 @@ import logging from .Renderer import Renderer from .Renderer import render_hook from ..PageTree.PageTree import * class MediaWikiRenderer(Renderer): def __init__(self, configs, reporter): super().__init__(configs, reporter) - self.configs = configs self.doc_title = configs['doc_title'] #PageTree object self.tree = PageTree(configs, reporter) #parameter for list formatting self.list_level = '' #parameters for theorem handling self.in_theorem = False self.theorem_number = 0 self.th_numbering = {} ######################################## #STARTING POINT def start_rendering(self, parser_tree_explorer): """ Entrypoint for rendering. It requires the tree of parsed blocks as parameter """ #start rendering of Rendering base class to activate plugins... super(MediaWikiRenderer, self).start_rendering(parser_tree_explorer) root_block = self.parser_tree_explorer.root_block #start the rendering from root_block self.render_block(root_block) #after rendering for PageTree structure self.tree.after_render() #end rendering of base class to stop plugins super(MediaWikiRenderer, self).end_rendering() #return the PageTree as a result return self.tree ####### ROOT BLOCK @render_hook("root-block") def r_document(self, block): #we trigger the rendering of content text = self.render_children_blocks(block) #text is the tex outside sections self.tree.addText(text) #returning the text to respect the interface return text ######################################## #DEFAULT @render_hook("default") def default(self, block): #we don't print anything return '' ######################################### #TEXT @render_hook("text") def r_text(self, block): text = block.attributes['text'] # The following replace happens as ~ is the latex symbol # for unbreakable space return text.replace("~", " ") @render_hook("newline") def r_newline(self, block): return '\n' @render_hook("newpage") def r_newpage(self, block): return '\n\n' @render_hook("par") def r_par(self, block): return '\n\n' ######################################### #SECTIONING @render_hook("part", "chapter", "section", "subsection", "subsubsection", "paragraph", "subparagraph") def sectioning(self, block): title = block.attributes['title'] section_name = block.attributes['section_name'] #remove the \n insiede title title = re.sub('\\n*', '', title) #creation of the new page self.tree.createPage(title, section_name) #content processing text = self.render_children_blocks(block) #adding text to current page self.tree.addText(text) #exiting the section self.tree.exitPage() return '' ######################################### #MATH - @render_hook("displaymath") + @render_hook("displaymath", "equation") def r_display_math(self, block): s = block.attributes['content'] #rendering labels self.render_blocks(block.labels) return '' @render_hook("inlinemath", "ensuremath") def r_inline_math(self, block): s = block.attributes['content'] #rendering labels self.render_blocks(block.labels) return '' - @render_hook("align", "eqnarray", "multiline", "alignat") + @render_hook("align", "eqnarray", "multline", "alignat") def r_align(self, block): s = block.attributes['content'] #rendering labels self.render_blocks(block.labels) return '' @render_hook("gather") def r_gather(self, block): s = block.attributes['content'] output = [] for eq in s.split("\\\\"): eq = eq.replace("\n","").strip() output.append('') #rendering labels self.render_blocks(block.labels) return '\n'.join(output) ######################################### #LABELS and refs @render_hook("label") def r_label(self, block): label = block.attributes['label'] self.tree.addLabel(label) return '' @render_hook("ref", "vref", "pageref", "eqref") def r_ref(self, block): ref = block.attributes['ref'] #saving ref in Babel of PageTree self.tree.addReference(ref) return "{{ref@"+ ref+ "}}" ######################################### #FIGURE @render_hook("figure") def r_figure(self, block): captions = block.get_children("caption") includegraphics = block.get_children("includegraphics") s = "[[File:" if len(includegraphics): inc = includegraphics[0] s += inc.attributes["img_name"] else: return "" if len(block.get_children("centering")): s += "|" + self.configs["keywords"]["center"] if len(captions): cap = captions[0] s += "|" + cap.attributes["caption"] s += "]]" return s ######################################### #FORMATTING @render_hook("%", "&", "$", "{", "}", "#", "_") def r_special_character(self, block): return block.attributes['character'] @render_hook("dots", "ldots") def r_dots(self, block): return '...' @render_hook("textbf") def r_textbf(self, block): s = [] s.append("\'\'\'") s.append(self.render_children_blocks(block)) s.append("\'\'\'") return ''.join(s) @render_hook("textit", "emph") def r_textit(self, block): s = [] s.append("\'\'") s.append(self.render_children_blocks(block)) s.append("\'\'") return ''.join(s) @render_hook("textsc") def r_textsc(self, block): return self.render_children_blocks(block).upper() @render_hook("textsuperscript") def r_superscript(self, block): s = [] s.append('') s.append(self.render_children_blocks(block)) s.append('') return ''.join(s) @render_hook("textsubscript") def r_subscript(self, block): s = [] s.append('') s.append(self.render_children_blocks(block)) s.append('') return ''.join(s) @render_hook("underline", "uline") def r_underline(self, block): s = [] s.append('{{Sottolineato|') s.append(self.render_children_blocks(block)) s.append('}}') return ''.join(s) @render_hook("abstract") def r_abstract(self, block): s = [] s.append('{{Abstract|') s.append(self.render_children_blocks(block)) s.append('}}') return ''.join(s) @render_hook("linebreak", "pagebreak", "nolinebreak", "nopagebreak") def r_break(self, block): return '' @render_hook("vspace") def r_vspace(self,block): return '\n\n' @render_hook("mandatory_space") def r_mandatory_space(self,block): return ' ' @render_hook("verbatim") def r_verbatim(self, block): return '
' + block.attributes['content'] +'' @render_hook("verb") def r_verb(self, block): return '' + block.attributes['content'] +'' ######################################### #ALIGNMENT @render_hook("center", "centerline") def r_center(self, block): s = [] s.append('{{Center|') s.append(self.render_children_blocks(block)) s.append('}}') return ''.join(s) @render_hook("flushleft") def r_flushleft(self, block): s = [] s.append('{{Flushleft|') s.append(self.render_children_blocks(block)) s.append('}}') return ''.join(s) @render_hook("flushright") def r_flushright(self, block): s = [] s.append('{{Flushright|') s.append(self.render_children_blocks(block)) s.append('}}') return ''.join(s) ######################################### #LISTS @render_hook("itemize") def r_itemize(self, block): self.list_level += '*' s = ['\n'] for item in block.ch_blocks: s.append(self.list_level) s.append(self.render_children_blocks(item).strip()) s.append("\n") self.list_level = self.list_level[:-1] return ''.join(s) @render_hook("enumerate") def r_enumerate(self, block): self.list_level += '#' s = ['\n'] for item in block.ch_blocks: s.append(self.list_level) s.append(self.render_children_blocks(item).replace('\n', '')) s.append("\n") self.list_level = self.list_level[:-1] return ''.join(s) @render_hook("description") def r_description(self, block): s = ['\n'] for item in block.ch_blocks: s.append(';') s.append(item.attributes['word']) s.append(':') s.append(self.render_children_blocks(item)) s.append("\n") return ''.join(s) ######################################### #QUOTES @render_hook("quotation", "quote") def r_quotes(self, block): s = [] s.append('
') s.append(self.render_children_blocks(block)) s.append('') return ''.join(s) @render_hook("verse") def r_verse(self, block): s = [] s.append('
') s.append('\n'.join(self.render_children_blocks(block).split('//'))) s.append('') return ''.join(s) @render_hook("footnote") def r_footnote(self, block): s = [] s.append("") s.append(self.render_children_blocks(block)) s.append("") return ''.join(s) ######################################## #Code @render_hook("lstlisting") def r_lstlisting(self, block): s = [] if "language" in block.options: s.append('