def _equation_processor(equation_index, equation_div_contents): within_div_tag = equation_div_contents.split(">", 1)[0] has_label = Flag() id_block_single_quotation_marks = find_block.Block( "id='", "'", lambda id_contents: _equation_reference( equation_index, id_contents, has_label), False) id_block_double_quotation_marks = find_block.Block( "id=\"", "\"", lambda id_contents: _equation_reference( equation_index, id_contents, has_label), False) within_div_tag_processor = find_block.Processor( [id_block_single_quotation_marks, id_block_double_quotation_marks]) within_div_tag_processor.process(within_div_tag) if not has_label.is_set: return equation_div_contents equation_numbering_block_single_quotation_marks = find_block.Block( "<span class='maruku-eq-number'>", "</span>", lambda span_content: ("<span class='maruku-eq-number'>" + "(" + str(equation_index.index) + ")" + "</span>"), True) equation_numbering_block_double_quotation_marks = find_block.Block( "<span class=\"maruku-eq-number\">", "</span>", lambda span_content: ("<span class=\"maruku-eq-number\">" + "(" + str(equation_index.index) + ")" + "</span>"), True) entire_div_processor = find_block.Processor([ equation_numbering_block_single_quotation_marks, equation_numbering_block_double_quotation_marks ]) processed_div_contents = entire_div_processor.process( equation_div_contents) return processed_div_contents
def process_tex_theorem_environments(page_content): preliminary_theorem_environment_blocks = list( theorem_environment_blocks.define_all_preliminary()) preliminary_theorem_environment_blocks.extend( list(table_of_contents_block.define_all_sections())) preliminary_theorem_environment_processor = find_block.Processor( preliminary_theorem_environment_blocks) processed_content = preliminary_theorem_environment_processor.process( page_content) processed_content = _process_references(processed_content) theorem_environment_processor = find_block.Processor( list(theorem_environment_blocks.define_all())) return theorem_environment_processor.process(processed_content)
def handle_tikz_diagrams(content): processor = find_block.Processor([ define_tikz(), define_tikz_commutative_diagram(), nowiki_block.define(True) ]) return processor.process(content)
def handle_xypic_diagrams(content): processor = find_block.Processor([ define_xymatrix(), define_xymatrix_default_size(), define_xymatrix_document_parameters(), nowiki_block.define(True) ]) return processor.process(content)
def extract_tikz_libraries(tikz_diagram): libraries = [] tikz_library_block = find_block.Block( "\\usetikzlibrary{", "}", lambda library: libraries.append( "\\usetikzlibrary{" + library + "}"), False) tikz_library_processor = find_block.Processor([tikz_library_block]) without_tikz_libraries = tikz_library_processor.process(tikz_diagram) library_lines = "\n".join(libraries) return library_lines, without_tikz_libraries
def _label(block_contents): label = Label() label_block = find_block.Block( "\\label{", "}", lambda label_block_contents: label.set_to(label_block_contents), True) label_processor = find_block.Processor([label_block]) block_contents_without_label = label_processor.process(block_contents) if block_contents_without_label: block_contents_without_label = block_contents_without_label.strip() return label.get(), block_contents_without_label
def add_placeholder(page_content, placeholder, table_of_contents_flag, need_to_render_for_toc_flag): header_block = find_block.Block( "\n##", " ", lambda header: _find_header_which_needs_rendering_processor( header, need_to_render_for_toc_flag), True) placeholder_block = find_block.Block( placeholder, None, lambda found_placeholder: _process_table_of_contents_block( placeholder + "\n\n", table_of_contents_flag), True) processor = find_block.Processor([ table_of_contents_block.define(placeholder, table_of_contents_flag), placeholder_block, header_block ]) return processor.process(page_content)
def render(page_id, page_content): _check_for_scripting(page_content) page_content = centre_block.handle_initial_centring(page_content) page_content = tikz_diagram_block.handle_tikz_diagrams(page_content) page_content = xypic_diagram_block.handle_xypic_diagrams(page_content) pages_to_re_render_and_expire = [] pages_to_render_to_include = [] references_before_rendering = _references_before_rendering(page_id) page_name = _name_of_page(page_id) rendering_web_id = _web_id_of_page(page_id) pages_to_re_render_and_expire.extend(_pages_which_require(page_name)) blocks = [ include_block.define(page_id, rendering_web_id, references_before_rendering, pages_to_render_to_include), redirects_block.define(page_id, rendering_web_id, references_before_rendering, pages_to_re_render_and_expire), link_block.define(page_id, rendering_web_id, references_before_rendering), category_block.define(page_id, rendering_web_id, references_before_rendering), nowiki_block.define(), reference_block.define(), tex_block.define_single(page_id), tex_block.define_double(page_id), script_block.define_script_tags(), script_block.define_javascript_prefix() ] processor = find_block.Processor(blocks) processed_content = processor.process(page_content) processed_content = _surround_tables_with_blank_lines(processed_content) references_before_rendering = _remove_references_not_from_rendering_web( references_before_rendering, rendering_web_id) if references_before_rendering: logger.info("On page with ID " + str(page_id) + " the following references no longer exist: " + str(references_before_rendering)) _delete_references_which_no_longer_exist(references_before_rendering, pages_to_re_render_and_expire) pages_to_re_render_and_expire.extend(pages_to_render_to_include) pages_to_re_render_and_expire.extend(_pages_included_in(page_name)) pages_to_re_render_and_expire = list(set(pages_to_re_render_and_expire)) if pages_to_render_to_include: pages_to_re_render_and_expire.append(page_id) return processed_content, pages_to_re_render_and_expire
def reference_equations(page_content, web_address, page_content_file_name): root_page_content_directory = os.environ["NLAB_PAGE_CONTENT_DIRECTORY"] page_content_directory = os.path.join(root_page_content_directory, web_address) equation_references_directory = os.path.join(page_content_directory, "equation_references") equation_references_path = os.path.join(equation_references_directory, page_content_file_name + ".json") with open(equation_references_path, "r") as equation_references_file: equation_references = json.load(equation_references_file) processor = find_block.Processor([ _equation_reference_block(equation_references), _maruku_equation_reference_block_single_quotation_marks( equation_references), _maruku_equation_reference_block_double_quotation_marks( equation_references) ]) return processor.process(page_content)
def extract_document_parameters(diagram): split_at_first_curly_brace = diagram.split("{", 1) document_parameters = { "font_size": "", "document_header_parameters": ["12pt"] } document_parameters_block = find_block.Block( "[", "]", lambda within_square_brackets: document_parameters.update( parse_document_parameters(within_square_brackets)), False) document_parameters_processor = find_block.Processor([ document_parameters_block]) processed_preamble = document_parameters_processor.process( split_at_first_curly_brace[0]) return ( document_parameters, processed_preamble + "{" + split_at_first_curly_brace[1])
def add_table_of_contents(page_content): table_of_contents_flag = Flag() table_of_contents_placeholder = "[[!table_of_contents]]" # Maruku typically surrounds \tableofcontents with a # paragraph page_content = re.sub(r'<p>\s*\\tableofcontents\s*</p>', r'\\tableofcontents', page_content) processor = find_block.Processor([ table_of_contents_block.define_maruku_single_quotation_marks( table_of_contents_placeholder, table_of_contents_flag), table_of_contents_block.define_maruku_double_quotation_marks( table_of_contents_placeholder, table_of_contents_flag), table_of_contents_block.define_tex(table_of_contents_placeholder, table_of_contents_flag) ]) page_content_with_table_of_contents_placeholder = processor.process( page_content) if not table_of_contents_flag.is_set: return page_content return table_of_contents.add_to( page_content_with_table_of_contents_placeholder, table_of_contents_placeholder)
def number_equations(page_content, web_address, page_content_file_name): equation_index = _EquationIndex() processor = find_block.Processor([ _equation_block_single_quotation_marks(equation_index), _equation_block_double_quotation_marks(equation_index) ]) processed_content = processor.process(page_content) root_page_content_directory = os.environ["NLAB_PAGE_CONTENT_DIRECTORY"] page_content_directory = os.path.join(root_page_content_directory, web_address) equation_references_directory = os.path.join(page_content_directory, "equation_references") try: os.mkdir(equation_references_directory) except OSError as osError: if osError.errno != errno.EEXIST: raise osError equation_references_path = os.path.join(equation_references_directory, page_content_file_name + ".json") with open(equation_references_path, "w") as equation_references_file: equation_references_file.write( json.dumps(equation_index.reference_dictionary, indent=2)) return processed_content
def handle_initial_centring(content): processor = find_block.Processor( [define_center(), define_centre(), nowiki_block.define(True)]) return processor.process(content)
def parse_to_html(tex_string): tex_processor = find_block.Processor([_mathcal_block()]) processed_tex = tex_processor.process(tex_string) processed_tex = _process_symbols(processed_tex) return ("<span class='mathematics'>" + processed_tex + "</span>")
def handle_post_centring(content): centre_paragraph_block = find_block.Block("<p>for_centring", "/for_centring</p>", post_centre_processor, True) return find_block.Processor([centre_paragraph_block]).process(content)
def correct_svg_header(page_content): svg_header_processor = find_block.Processor([svg_header_block.define()]) return svg_header_processor.process(page_content)
def post_process_tex(page_content): tex_parser_blocks = [tex_block.define_tex_post()] tex_parser_processor = find_block.Processor(tex_parser_blocks) return tex_parser_processor.process(page_content)
def _add_placeholder(page_content, placeholder, table_of_contents_flag): processor = find_block.Processor( [table_of_contents_block.define(placeholder, table_of_contents_flag)]) return processor.process(page_content)
def _process_references(page_content): references_processor = find_block.Processor([reference_block.define()]) return references_processor.process(page_content)