| #!/usr/bin/env python |
| |
| # Copyright (C) 2011 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import codecs |
| import glob |
| import markdown |
| import os |
| import shutil |
| import string |
| import subprocess |
| |
| |
| # read just the title (first heading) from a source page |
| def get_title(raw_file): |
| for line in open(raw_file, 'r'): |
| if '#' in line: |
| return line.strip(' #\n') |
| return '' |
| |
| |
| # directory to compile the site to (will be clobbered during build!) |
| HTML_DIR = 'out' |
| # directory to look in for markdown source files |
| SRC_DIR = 'src' |
| # directory to look in for html templates |
| TEMPLATE_DIR = 'templates' |
| |
| # filenames of templates to load, in order |
| TEMPLATE_LIST = ['includes', 'header', 'sidebar', 'main', 'footer'] |
| |
| # Step 1, concatenate the template pieces into a single template string |
| t = '' |
| for f in TEMPLATE_LIST: |
| t += open(os.path.join(TEMPLATE_DIR, f), 'r').read() |
| template = string.Template(t) |
| |
| # Step 2, rm -rf HTML_DIR if it exists, and then re-create it |
| if os.path.exists(HTML_DIR): |
| shutil.rmtree(HTML_DIR) |
| |
| os.mkdir(HTML_DIR) |
| |
| # Step 3, recursively mirror SRC_DIR to HTML_DIR, directory by directory, translating *.md |
| category = 'home' |
| parents = {} |
| for curdir, subdirs, files in os.walk(SRC_DIR): |
| def md(path): |
| text = codecs.open(path, encoding='utf8').read() |
| extensions = ['tables', 'def_list', 'toc(title=In This Document)'] |
| return markdown.markdown(text, extensions) |
| |
| print 'Processing %s...' % (curdir,), |
| # Step A: split path, and update cached category name if needed |
| curdir = os.path.normpath(curdir) |
| outdir = curdir.split(os.path.sep) |
| outdir[0] = HTML_DIR |
| if len(outdir) == 2: |
| category = outdir[-1] |
| outdir = os.path.join(*outdir) |
| |
| # Step B: mirror the hierarchy of immediate subdirectories |
| for subdir in subdirs: |
| os.mkdir(os.path.join(outdir, subdir)) |
| |
| # Step C: cache the translated sidebars, keyed by parent dir, so we can do sidebar inheritance |
| # FIXME: make this depth-agnostic, perhaps by caching all sidebars and moving the resolution |
| # FIXME: complexity out of the datastructure and into the resolution algorithm. |
| parentdir = os.path.dirname(curdir) |
| if parentdir in parents: |
| parent = parents[parentdir] |
| else: |
| parent = ('', '', '') |
| |
| if 'sidebar.md' in files: |
| sidebar = md(os.path.join(curdir, 'sidebar.md')) |
| del files[files.index('sidebar.md')] |
| else: |
| sidebar = parent[0] |
| |
| if 'sidebar2.md' in files: |
| sidebar2 = md(os.path.join(curdir, 'sidebar2.md')) |
| del files[files.index('sidebar2.md')] |
| else: |
| sidebar2 = parent[1] |
| |
| if 'sidebar3.md' in files: |
| sidebar3 = md(os.path.join(curdir, 'sidebar3.md')) |
| del files[files.index('sidebar3.md')] |
| else: |
| sidebar3 = parent[2] |
| |
| parents[curdir] = (sidebar, sidebar2, sidebar3) |
| |
| # Step D: mirror all non-*.md files, and translate (file).md files into (file).html |
| for f in files: |
| print ' .', |
| # Note that this "absolute" filename has a root at SRC_DIR, not "/" |
| absfilename = os.path.join(curdir, f) |
| |
| if f.endswith('.md'): |
| main = md(absfilename) |
| final = template.safe_substitute(main=main, sidebar=sidebar, sidebar2=sidebar2, \ |
| sidebar3=sidebar3, category=category, title=get_title(absfilename)) |
| |
| html = codecs.open(os.path.join(outdir, f.replace('.md', '.html')), 'w', encoding="utf8") |
| html.write(final) |
| else: |
| shutil.copy(absfilename, os.path.join(outdir, f)) |
| print |
| |
| print 'Done.' |