diff options
author | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2013-11-09 16:23:38 +0100 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2013-11-09 16:23:38 +0100 |
commit | d56471a1cbecf50512d65d58181201873330db16 (patch) | |
tree | a25ee36799a1ae01a5d1957d5ba59f43f1c55f3b | |
parent | b9fbec6e5faf979d6fe5a945ff936f9b26fe1227 (diff) | |
download | couchdb-d56471a1cbecf50512d65d58181201873330db16.tar.gz |
docs: enable building a Dash docsetdash-docset
-rw-r--r-- | share/doc/build/Makefile.am | 1 | ||||
-rw-r--r-- | share/doc/ext/dashdocset.py | 116 | ||||
-rw-r--r-- | share/doc/images/icon-32px.png | bin | 0 -> 819 bytes | |||
-rw-r--r-- | share/doc/src/conf.py | 2 |
4 files changed, 118 insertions, 1 deletions
diff --git a/share/doc/build/Makefile.am b/share/doc/build/Makefile.am index a6a5e76dc..a521db38d 100644 --- a/share/doc/build/Makefile.am +++ b/share/doc/build/Makefile.am @@ -453,6 +453,7 @@ src_files_html = \ sphinx_extensions = \ ../ext/configdomain.py \ + ../ext/dashdocset.py \ ../ext/github.py \ ../ext/httpdomain.py \ ../ext/http-api-descr.json diff --git a/share/doc/ext/dashdocset.py b/share/doc/ext/dashdocset.py new file mode 100644 index 000000000..a17518b0a --- /dev/null +++ b/share/doc/ext/dashdocset.py @@ -0,0 +1,116 @@ +## 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. + +# Based on Ruby script by Stephen Benner +# https://github.com/SteveBenner/couchdb-dash-docset/ + +from lxml import html +from sphinx.util.console import bold +import urllib2, os, sqlite3, shutil, plistlib, imp, tarfile + +FILE_PATH = os.path.abspath(__file__) +DOC_DIR = os.path.dirname(os.path.dirname(FILE_PATH)) +BUILD_DIR = os.path.join(DOC_DIR, 'build', 'html') +ICON_SRC = os.path.join(DOC_DIR, 'images', 'icon-32px.png') + +DS_DIR = os.path.join(BUILD_DIR, 'CouchDB.docset') +DOCS = os.path.join(DS_DIR, 'Contents', 'Resources', 'Documents') +PLIST_PATH = os.path.join(DS_DIR, 'Contents', 'info.plist') +DB_PATH = os.path.join(DS_DIR, 'Contents', 'Resources', 'docSet.dsidx') + +FEED_PATH = os.path.join(BUILD_DIR, 'CouchDB.xml') +DIST_PATH = os.path.join(BUILD_DIR, 'CouchDB.tgz') + +PLIST = { + 'CFBundleIdentifier': 'CouchDB', + 'DocSetPlatformFamily': 'CouchDB', + 'isDashDocset': True, + 'DocSetPublisherName': 'Apache CouchDB Project', + 'dashIndexFilePath': 'index.html', + 'isJavaScriptEnabled': True, +} + +def ignore(dir, contents): + if '_sources' in dir: + return contents + elif 'docset' in dir: + return contents + else: + return [] + +def build(app, exception): + + if exception is not None: + return + + if 'HTML' not in app.builder.__class__.__name__: + return + + app.info(bold('building docset...'), True) + entries = [] + title = lambda s: s.split(' ', 1)[1] + contents = html.parse(open(os.path.join(BUILD_DIR, 'contents.html'))) + for a in contents.findall('.//li[@class="toctree-l1"]/a'): + entries.append(('Guide', title(a.text), a.attrib['href'])) + + for a in contents.findall('.//li[@class="toctree-l1"][10]/ul/li/a'): + if title(a.text) == 'API Basics': continue + entries.append(('Category', title(a.text), a.attrib['href'])) + + for a in contents.findall('.//li[@class="toctree-l1"][11]/ul/li/a'): + entries.append(('Struct', title(a.text), a.attrib['href'])) + + for a in contents.findall('.//li[@class="toctree-l1"][3]/ul/li/ul/li/a'): + if a.text.startswith('3.1'): continue + entries.append(('Option', title(a.text), a.attrib['href'])) + + for a in contents.findall('.//li[@class="toctree-l1"][10]/ul/li/ul/li/a'): + if a.text.startswith('10.1'): continue + text = title(''.join(i for i in a.itertext())) + entries.append(('Method', text, a.attrib['href'])) + + os.makedirs(os.path.dirname(DOCS)) + shutil.copyfile(ICON_SRC, os.path.join(DS_DIR, 'icon.png')) + shutil.copytree(BUILD_DIR, DOCS, ignore=ignore) + PLIST['CFBundleName'] = 'CouchDB ' + app.config.version + plistlib.writePlist(PLIST, PLIST_PATH) + + db = sqlite3.connect(DB_PATH) + cur = db.cursor() + cur.execute('CREATE TABLE searchIndex (' + 'id INTEGER PRIMARY KEY, ' + 'name TEXT, ' + 'type TEXT, ' + 'path TEXT' + ');') + + cur.execute('CREATE UNIQUE INDEX anchor ON searchIndex (name, type, path);') + for e in entries: + cur.execute('INSERT INTO searchIndex (type, name, path) VALUES (?, ?, ?)', e) + + db.commit() + db.close() + + with tarfile.open(DIST_PATH, 'w:gz') as f: + f.add(DS_DIR) + + shutil.rmtree(DS_DIR) + with open(FEED_PATH, 'w') as f: + print >> f, '<entry>' + print >> f, '<version>%s</version>' % app.config.version + print >> f, '<url>http://docs.couchdb.org/latest/en/CouchDB.tgz</url>' + print >> f, '</entry>' + + app.info(' done') + +def setup(app): + app.connect('build-finished', build) diff --git a/share/doc/images/icon-32px.png b/share/doc/images/icon-32px.png Binary files differnew file mode 100644 index 000000000..aaf8f9421 --- /dev/null +++ b/share/doc/images/icon-32px.png diff --git a/share/doc/src/conf.py b/share/doc/src/conf.py index 3d2536e25..73da03d1a 100644 --- a/share/doc/src/conf.py +++ b/share/doc/src/conf.py @@ -18,7 +18,7 @@ import sys sys.path.insert(0, os.path.abspath('../ext')) extensions = ["sphinx.ext.todo", "sphinx.ext.extlinks", 'github', - 'httpdomain', 'configdomain'] + 'httpdomain', 'configdomain', 'dashdocset'] _info = {} _regex = re.compile('m4_define\(\[(.+)\],\s+\[(.+)\]\)') |