예제 #1
0
def build_page(title, path, config, md_src=None):
    """ Helper which returns a Page object. """

    sitenav = nav.SiteNavigation(config)
    page = nav.Page(title, path, sitenav.url_context, config)
    if md_src:
        # Fake page.read_source()
        page.markdown, page.meta = meta.get_data(md_src)
    return page, sitenav
예제 #2
0
def create_tree(event):
    """
    Processes all the auto-generated API pages for the documentation.

    ### Parameters
        event | <mkdocs.events.PreBuild>

    ### Returns
        <bool>
    """
    # generate a set of autodoc pages
    match = re.match('^tree:(.*)$', event.path)
    if match:
        root = match.group(1)
        path = os.path.abspath(os.path.join(config.docs_dir, root))
        base = path[:-(len(root) + 1)]
        pages = []
        for base_path, folder, files in os.walk(path):
            files.sort()
            if 'index.md' in files:
                files.remove('index.md')
                files.insert(0, 'index.md')

            for file in files:
                filepath = os.path.join(base_path, file)
                filepath = filepath.replace('\\', '/')
                if file == 'index.md':
                    title = nav.filename_to_title(os.path.basename(base_path))
                else:
                    title = nav.filename_to_title(file)

                base_file_path = filepath[len(base) + 1:].replace('\\', '/')
                url = utils.get_url_path(base_file_path, True)
                page = nav.Page(title=title,
                                url=url,
                                path=base_file_path,
                                url_context=event.url_context)

                page.base_path = base_path

                # Add in previous and next information.
                if pages:
                    pages[-1].next_page = page
                    page.previous_page = pages[-1]
                pages.append(page)

        event.pages = pages
        event.consumed = True
예제 #3
0
파일: build.py 프로젝트: yanpqi/mkdocs
def append_extra_pages(config, env, dump_json, site_navigation):
    if site_navigation is None:
        log.debug("append_extra_pages: site_navigation is None")
        return

    docs_dir = config["docs_dir"]
    site_dir = config["site_dir"]
    log.info("append_extra_pages: docs_dir=%s, site_dir=%s", docs_dir, site_dir)
    
    for (dirpath, dirs, filenames) in os.walk(docs_dir):
        dir = dirpath[len(docs_dir):]
        for filename in filenames:
            if dirpath == docs_dir:
                extra_page = filename
            else:
                extra_page = dirpath[len(docs_dir)+1:] + "/" + filename
            if os.path.splitext(extra_page)[1] == '.md' and extra_page not in site_navigation.source_files:
                log.info(" - append_extra_pages: append %s", extra_page)
                
                # append to tail
                page = nav.Page("", "/"+extra_page.replace(".md", "/index.html"), extra_page, site_navigation.url_context)
                site_navigation.pages[len(site_navigation.pages)-1].next_page = page
                page.previous_page = site_navigation.pages[len(site_navigation.pages)-1]
                site_navigation.pages.append(page)
예제 #4
0
def build_pages(config, dump_json=False):
    """
    Builds all the pages and writes them into the build directory.
    """
    site_navigation = nav.SiteNavigation(config['pages'],
                                         config['use_directory_urls'])
    loader = jinja2.FileSystemLoader(config['theme_dir'])
    env = jinja2.Environment(loader=loader)
    search_index = search.SearchIndex()

    build_template('404.html', env, config, site_navigation)
    build_template('search.html', env, config, site_navigation)

    nav_pages = []
    for page in site_navigation.walk_pages():
        nav_pages.append(page.input_path)
        # Read the input file
        input_path = os.path.join(config['docs_dir'], page.input_path)
        input_content = open(input_path, 'r').read()
        if PY2:
            input_content = input_content.decode('utf-8')

        # Process the markdown text
        html_content, table_of_contents, meta = convert_markdown(
            input_content,
            site_navigation,
            extensions=config['markdown_extensions'],
            strict=config['strict'])

        context = get_global_context(site_navigation, config)
        context.update(
            get_page_context(page, html_content, site_navigation,
                             table_of_contents, meta, config))

        # Allow 'template:' override in md source files.
        if 'template' in meta:
            template = env.get_template(meta['template'][0])
        else:
            template = env.get_template('base.html')

        if not utils.is_markdown_file(page.input_path):
            template = env.get_template('base_without_toc.html')

        # Render the template.
        output_content = template.render(context)

        # Write the output file.
        output_path = os.path.join(config['site_dir'], page.output_path)
        if dump_json:
            json_context = {
                'content': context['content'],
                'title': context['current_page'].title,
                'url': context['current_page'].abs_url,
                'language': 'en',
            }
            utils.write_file(
                json.dumps(json_context, indent=4).encode('utf-8'),
                output_path.replace('.html', '.json'))
        else:
            utils.write_file(output_content.encode('utf-8'), output_path)

        search_index.add_entry_from_context(page, html_content,
                                            table_of_contents)

    # generate html for other md files
    files = ListFilesByTxt(os.path.join(config['docs_dir']), '.md')
    for mdf in files:
        title = os.path.basename(mdf)
        title = os.path.splitext(title)[0]
        path = os.path.relpath(mdf, config['docs_dir'])
        url = utils.get_url_path(path, config['use_directory_urls'])
        output_path = utils.get_html_path(path)
        if (path in nav_pages): continue
        input_content = open(mdf, 'r').read()
        if PY2:
            input_content = input_content.decode('utf-8')

        site_navigation.url_context.set_current_url(url)
        # Process the markdown text
        html_content, table_of_contents, meta = convert_markdown(
            input_content,
            site_navigation,
            extensions=config['markdown_extensions'])

        context = get_global_context(site_navigation, config)
        page = nav.Page(title=title,
                        url=url,
                        path=path,
                        url_context=site_navigation.url_context)
        context.update(
            get_page_context(page, html_content, site_navigation,
                             table_of_contents, meta, config))

        if 'template' in meta:
            template = env.get_template(meta['template'][0])
        else:
            template = env.get_template('base.html')

        if not utils.is_markdown_file(mdf):
            template = env.get_template('base_without_toc.html')

        # Render the template.
        output_content = template.render(context)

        # Write the output file.
        output_path = os.path.join(config['site_dir'], output_path)
        utils.write_file(output_content.encode('utf-8'), output_path)
        #search_index.add_entry_from_context(page, html_content, table_of_contents)

    build_template(
        'js/tipuesearch/tipuesearch_content.js',
        env,
        config,
        extra_context={'search_index': search_index.generate_search_index()})