125 lines
3.8 KiB
Python
Executable File
125 lines
3.8 KiB
Python
Executable File
#!/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.'
|