def json2html(items, output_file, focus_element_id='root', skip_block_creation=[], multi_mode=[1, 0, 0, 0], info=None): """ Method converts given input file to single html output file :param items: list of parsed IST items :param output_file: output html file :param focus_element_id: id of element which will be visible, default root :param skip_block_creation: list of items which won't be created: [title, button-control, tree-list, ist, abcd-list] :return: """ FormatMode.format_mode = FormatMode.HTML_MODE template_file = os.path.join(os.path.dirname(__file__), 'formatters/templates/template.html') template_string = open(template_file, 'r').read() html_items = HTMLFormatter.format(items) html_items_string = ISTFormatter.tree2html(html_items) # html_items_string = "foo" html_navigation = HTMLFormatter.abc_navigation_bar(items) html_navigation_string = ISTFormatter.tree2html(html_navigation) template_string = template_string.replace("@GENERATED@", time.strftime("%d-%m-%Y %H:%M:%S UTC", time.gmtime())) template_string = template_string.replace("@IST@", html_items_string) template_string = template_string.replace("@NAVIGATION@", html_navigation_string) template_string = template_string.replace("@VERSION@", str(info['version'])) with open(output_file, 'w') as fp: fp.write(template_string)
def json2html(input_file, output_file, focus_element_id='root', skip_block_creation=[]): """ Method converts given input file to single html output file :param input_file: input json file :param output_file: output html file :param focus_element_id: id of element which will be visible, default root :param skip_block_creation: list of items which won't be created: [title, button-control, left-list, ist, right-list] :return: """ with open(input_file, 'r') as fp: json_object = json.load(fp, encoding="utf-8", cls=ProfilerJSONDecoder) html_content = HTMLFormatter.format(json_object) html_nav_abc = HTMLFormatter.abc_navigation_bar(json_object) html_nav_tree = HTMLFormatter.tree_navigation_bar(json_object) # show specified element by given id for child in html_content.current(): if child.attrib['id'].lower() == focus_element_id.lower(): child.attrib['class'] = child.attrib['class'].replace('hidden', '') print "Element {:s} is displayed".format(child.attrib['id']) break max_cols = 12 if 'right-list' not in skip_block_creation or 'left-list' not in skip_block_creation: max_cols -= 3 html_body = htmltree('body') generated = 'Generated {:s}'.format(datetime.datetime.today().strftime('%d-%m-%Y %X')) html_body.span(generated, id='info-generated') with html_body.open('div', '', cls='jumbotron', id='top'): with html_body.open('div', '', cls='container'): if 'title' not in skip_block_creation: with html_body.open('h1', 'Flow123d '): html_body.tag('small', 'input reference') if 'search' not in skip_block_creation: with html_body.open('div', cls='form-group has-default has-feedback search-wrapper'): html_body.tag('span', cls='glyphicon glyphicon-search form-control-feedback') html_body.tag('input', type='text', cls='form-control', id='search', placeholder='type to search') with html_body.open('div', cls='row'): if 'right-list' not in skip_block_creation or 'left-list' not in skip_block_creation: with html_body.open('div', cls="col-md-3 tree-list"): with html_body.open('ul', cls="nav nav-tabs", role="tablist"): classes = ['', 'active'] if 'left-list' not in skip_block_creation: with html_body.open('li', cls=classes.pop(), role="presentation"): html_body.tag('a', 'Tree', attrib={ 'role': 'rab', 'aria-controls': 'tree-view', 'data-toggle': 'tab' }) if 'right-list' not in skip_block_creation: with html_body.open('li', role="presentation", cls=classes.pop()): html_body.tag('a', 'Abcd', attrib={ 'role': 'rab', 'aria-controls': 'abc-view', 'data-toggle': 'tab' }, ) with html_body.open('div', cls='tab-content'): classes = ['tab-pane', 'tab-pane active'] if 'left-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='tree-view'): html_body.add(html_nav_tree.current()) if 'right-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='abc-view'): html_body.add(html_nav_abc.current()) if 'ist' not in skip_block_creation: with html_body.open('div', cls='col-md-{:d} input-reference'.format(max_cols)): if 'button-control' not in skip_block_creation: with html_body.open('div', id='button-control', cls='row'): with html_body.open('div', cls='col-md-12'): with html_body.open('div', id='btn-filter-one-wrapper'): html_body.tag('input', '', attrib={ 'type': 'checkbox', 'class': 'btn btn-default', 'id': 'btn-filter-one', 'data-toggle': 'toggle', 'data-on': 'Single-item', 'data-off': 'Multi-item', 'checked': 'checked' }) with html_body.open('div', cls='btn-group filter-btns'): btn_cls = dict() btn_cls['data-type'] = 'record' btn_cls['class'] = 'btn btn-warning btn-filter' html_body.tag('a', 'Records', btn_cls) btn_cls['data-type'] = 'abstract-record' btn_cls['class'] = 'btn btn-success btn-filter' html_body.tag('a', 'Abstract records', btn_cls) btn_cls['data-type'] = 'selection' btn_cls['class'] = 'btn btn-info btn-filter' html_body.tag('a', 'Selections', btn_cls) with html_body.open('div', cls='row'): with html_body.open('a', id='top-link-block', title='Scroll to top', href='#input-reference', cls='well well-sm'): html_body.span(cls='glyphicon glyphicon-menu-up') html_body.add(html_content.current()) html_head = htmltree('head') html_head.tag('title', 'Flow123d input reference') html_head.style('css/main.css') html_head.style('css/bootstrap.min.css') html_head.style('css/bootstrap-toggle.min.css') html_head.style('css/katex.min.css') html_body.script('js/jquery-2.1.3.min.js') html_body.script('js/bootstrap.min.js') html_body.script('js/bootstrap-toggle.min.js') html_body.script('js/katex.min.js') html_body.script('js/main.js') html = htmltree('html') html.add(html_head.current()) html.add(html_body.current()) with open(output_file, 'w') as fp: fp.write(r'<!DOCTYPE html>') fp.write(html.dump())
def json2html(input_file, output_file, focus_element_id='root', skip_block_creation=[]): """ Method converts given input file to single html output file :param input_file: input json file :param output_file: output html file :param focus_element_id: id of element which will be visible, default root :param skip_block_creation: list of items which won't be created: [title, button-control, left-list, ist, right-list] :return: """ with open(input_file, 'r') as fp: json_object = json.load(fp, encoding="utf-8", cls=ProfilerJSONDecoder) html_content = HTMLFormatter.format(json_object) html_nav_abc = HTMLFormatter.abc_navigation_bar(json_object) html_nav_tree = HTMLFormatter.tree_navigation_bar(json_object) max_cols = 12 if 'right-list' not in skip_block_creation or 'left-list' not in skip_block_creation: max_cols -= 3 html_body = htmltree('body') generated = 'Generated {:s}'.format( datetime.datetime.today().strftime('%d-%m-%Y %X')) html_body.span(generated, id='info-generated') with html_body.open('div', '', cls='jumbotron', id='top'): with html_body.open('div', '', cls='container'): if 'title' not in skip_block_creation: with html_body.open('h1', 'Flow123d '): html_body.tag('small', 'input reference') if 'search' not in skip_block_creation: with html_body.open( 'div', cls= 'form-group has-default has-feedback search-wrapper' ): html_body.tag( 'span', cls= 'glyphicon glyphicon-search form-control-feedback') html_body.tag('input', type='text', cls='form-control', id='search', placeholder='type to search') with html_body.open('div', cls='row'): if 'right-list' not in skip_block_creation or 'left-list' not in skip_block_creation: with html_body.open('div', cls="col-md-3 tree-list"): with html_body.open('ul', cls="nav nav-tabs", role="tablist"): classes = ['', 'active'] if 'left-list' not in skip_block_creation: with html_body.open('li', cls=classes.pop(), role="presentation"): html_body.tag('a', 'Tree', attrib={ 'role': 'rab', 'aria-controls': 'tree-view', 'data-toggle': 'tab' }) if 'right-list' not in skip_block_creation: with html_body.open('li', role="presentation", cls=classes.pop()): html_body.tag( 'a', 'Abcd', attrib={ 'role': 'rab', 'aria-controls': 'abc-view', 'data-toggle': 'tab' }, ) with html_body.open('div', cls='tab-content'): classes = ['tab-pane', 'tab-pane active'] if 'left-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='tree-view'): html_body.add(html_nav_tree.current()) if 'right-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='abc-view'): html_body.add(html_nav_abc.current()) if 'ist' not in skip_block_creation: with html_body.open( 'div', cls='col-md-{:d} input-reference'.format( max_cols)): if 'button-control' not in skip_block_creation: with html_body.open('div', id='button-control', cls='row'): with html_body.open('div', cls='col-md-12'): with html_body.open( 'div', id='btn-filter-one-wrapper'): html_body.tag( 'input', '', attrib={ 'type': 'checkbox', 'class': 'btn btn-default', 'id': 'btn-filter-one', 'data-toggle': 'toggle', 'data-on': 'Single-item', 'data-off': 'Multi-item', 'checked': 'checked' }) with html_body.open( 'div', cls='btn-group filter-btns'): btn_cls = dict() btn_cls['data-type'] = 'record' btn_cls[ 'class'] = 'btn btn-warning btn-filter' html_body.tag( 'a', 'Records', btn_cls) btn_cls[ 'data-type'] = 'abstract-record' btn_cls[ 'class'] = 'btn btn-success btn-filter' html_body.tag( 'a', 'Abstract records', btn_cls) btn_cls['data-type'] = 'selection' btn_cls[ 'class'] = 'btn btn-info btn-filter' html_body.tag( 'a', 'Selections', btn_cls) with html_body.open('div', cls='row'): with html_body.open('a', id='top-link-block', title='Scroll to top', href='#input-reference', cls='well well-sm'): html_body.span( cls='glyphicon glyphicon-menu-up') html_body.add(html_content.current()) # show specified element by given id for child in html_body.current()._children[0]: if child.attrib['id'].lower( ) == focus_element_id.lower(): child.attrib['class'] = child.attrib[ 'class'].replace('hidden', '') html_head = htmltree('head') html_head.tag('title', 'Flow123d input reference') html_head.style('css/main.css') html_head.style('css/bootstrap.min.css') html_head.style('css/bootstrap-toggle.min.css') html_head.style('css/katex.min.css') html_body.script('js/jquery-2.1.3.min.js') html_body.script('js/bootstrap.min.js') html_body.script('js/bootstrap-toggle.min.js') html_body.script('js/katex.min.js') html_body.script('js/main.js') html = htmltree('html') html.add(html_head.current()) html.add(html_body.current()) with open(output_file, 'w') as fp: fp.write(r'<!DOCTYPE html>') fp.write(html.dump())
def json2html(items, output_file, focus_element_id='root', skip_block_creation=[], multi_mode=[False, False, True], info=None): """ Method converts given input file to single html output file :param items: list of parsed IST items :param output_file: output html file :param focus_element_id: id of element which will be visible, default root :param skip_block_creation: list of items which won't be created: [title, button-control, tree-list, ist, abcd-list] :return: """ FormatMode.format_mode = FormatMode.HTML_MODE multi_mode.reverse() html_content = HTMLFormatter.format(items) html_nav_abc = HTMLFormatter.abc_navigation_bar(items) html_nav_tree = HTMLFormatter.tree_navigation_bar(items) skip_block_creation.append('tree-list') # show specified element by given id for child in html_content.current(): if child.attrib['id'].lower() == focus_element_id.lower(): child.attrib['class'] = child.attrib['class'].replace('hidden', '') break max_cols = 12 if 'abcd-list' not in skip_block_creation or 'tree-list' not in skip_block_creation: max_cols -= 3 html_body = htmltree('body') generated = 'Generated {:s}'.format(datetime.datetime.today().strftime('%d-%m-%Y %X')) html_body.span(generated, id='info-generated') with html_body.open('div', '', cls='jumbotron', id='top'): with html_body.open('div', '', cls='container'): if 'title' not in skip_block_creation: with html_body.open('h1', 'Flow123d '): version = 'input reference' if not info else info['version'] if version.startswith('0.0.'): version = version.replace('0.0.', '') version = re.sub(r'_+', ' ', version) html_body.tag('small', version) if 'search' not in skip_block_creation: with html_body.open('div', cls='form-group has-default has-feedback search-wrapper'): html_body.tag('span', cls='glyphicon glyphicon-search form-control-feedback') html_body.tag('input', type='text', cls='form-control', id='search', placeholder='type to search') with html_body.open('div', cls='row'): if 'abcd-list' not in skip_block_creation or 'tree-list' not in skip_block_creation: with html_body.open('div', cls="col-md-3 tree-list"): with html_body.open('ul', cls="nav nav-tabs", role="tablist"): classes = ['', 'active'] if 'tree-list' not in skip_block_creation: with html_body.open('li', cls=classes.pop(), role="presentation"): html_body.tag('a', 'Tree', attrib={ 'role': 'rab', 'aria-controls': 'tree-view', 'data-toggle': 'tab' }) if 'abcd-list' not in skip_block_creation: with html_body.open('li', role="presentation", cls=classes.pop()): html_body.tag('a', 'Abc', attrib={ 'role': 'rab', 'aria-controls': 'abc-view', 'data-toggle': 'tab' }, ) with html_body.open('div', cls='tab-content'): classes = ['tab-pane', 'tab-pane active'] if 'tree-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='tree-view'): html_body.add(html_nav_tree.current()) if 'abcd-list' not in skip_block_creation: with html_body.open('div', role='tabpanel', cls=classes.pop(), id='abc-view'): html_body.add(html_nav_abc.current()) if 'ist' not in skip_block_creation: with html_body.open('div', cls='col-md-{:d} input-reference'.format(max_cols)): if 'button-control' not in skip_block_creation: with html_body.open('div', id='button-control', cls='row'): with html_body.open('div', cls='col-md-12'): with html_body.open('div', id='btn-filter-one-wrapper'): single_filter = html_body.tag('input', '', attrib={ 'type': 'checkbox', 'class': 'btn btn-default', 'id': 'btn-filter-one', 'data-toggle': 'toggle', 'data-on': 'Single-item', 'data-off': 'Multi-item' }) if not max(multi_mode): single_filter.attrib['checked'] = 'checked' with html_body.open('div', cls='btn-group filter-btns'): btn_cls = dict() btn_cls['data-type'] = 'record' btn_cls['class'] = 'btn btn-warning btn-filter' btn_cls['class'] += ' active' if multi_mode.pop() else '' html_body.tag('a', 'Records', btn_cls.copy()) btn_cls['data-type'] = 'abstract-record' btn_cls['class'] = 'btn btn-success btn-filter' btn_cls['class'] += ' active' if multi_mode.pop() else '' html_body.tag('a', 'Abstract records', btn_cls.copy()) btn_cls['data-type'] = 'selection' btn_cls['class'] = 'btn btn-info btn-filter' btn_cls['class'] += ' active' if multi_mode.pop() else '' html_body.tag('a', 'Selections', btn_cls.copy()) with html_body.open('div', cls='row'): with html_body.open('a', id='top-link-block', title='Scroll to top', href='#top', cls='well well-sm'): html_body.span(cls='glyphicon glyphicon-menu-up') html_body.add(html_content.current()) html_head = htmltree('head') html_head.tag('title', 'Flow123d input reference') html_head.style('css/main.css') html_head.style('css/bootstrap.min.css') html_head.style('css/bootstrap-toggle.min.css') html_head.style('css/katex.min.css') html_body.script('js/jquery-2.1.3.min.js') html_body.script('js/bootstrap.min.js') html_body.script('js/bootstrap-toggle.min.js') html_body.script('js/katex.min.js') html_body.script('js/main.js') html = htmltree('html') html.add(html_head.current()) html.add(html_body.current()) # try: # Logger.instance().info('Trying module BeautifulSoup') # from BeautifulSoup import BeautifulSoup # # Logger.instance().info('Converting to html string') # html_string = html.dump() # Logger.instance().info('Parsing html string') # soup = BeautifulSoup(html_string) # Logger.instance().info('Prettifying html string') # html_pretty = soup.prettify() # # Logger.instance().info('Writing to file') # with open(output_file, 'w') as fp: # fp.write(r'<!DOCTYPE html>') # fp.write(html_pretty) # Logger.instance().info('File created') # except ImportError as e: # Logger.instance().warning('Import error', exc_info=e) Logger.instance().info('Using module ElementTree') import xml.etree.ElementTree as ET Logger.instance().info('Converting to html string') html_string = html.dump() Logger.instance().info('Writing to file') with open(output_file, 'w') as fp: fp.write(r'<!DOCTYPE html>') fp.write(ET.tostring(html.root, method='html')) Logger.instance().info('File created')