| #!/usr/bin/python |
| # Copyright (C) 2013 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. |
| |
| from optparse import OptionParser |
| import re |
| import sys |
| |
| PAT_GERRIT = re.compile(r'^GERRIT') |
| PAT_INCLUDE = re.compile(r'^(include::.*)(\[\])$') |
| PAT_GET = re.compile(r'^get::([^ \t\n]*)') |
| PAT_TITLE = re.compile(r'^\.(.*)') |
| PAT_STARS = re.compile(r'^\*\*\*\*') |
| PAT_SEARCHBOX = re.compile(r'^SEARCHBOX') |
| |
| GERRIT_UPLINK = """ |
| |
| ++++ |
| <hr style=\" |
| height: 2px; |
| color: silver; |
| margin-top: 1.2em; |
| margin-bottom: 0.5em; |
| \"> |
| ++++ |
| |
| """ |
| |
| GET_TITLE = '<div class="title">%s</div>' |
| |
| GET_MACRO = """ |
| |
| ++++ |
| <div class="listingblock"> |
| %s |
| <div class="content"> |
| <a id=\"{0}\" onmousedown="javascript: |
| var i = document.URL.lastIndexOf(\'/Documentation/\'); |
| var url = document.URL.substring(0, i) + \'{0}\'; |
| document.getElementById(\'{0}\').href = url;"> |
| GET {0} HTTP/1.0 |
| </a> |
| </div> |
| </div> |
| ++++ |
| |
| """ |
| |
| SEARCH_BOX = """ |
| |
| ++++ |
| <div style="position:absolute; right:20px; top:20px;"> |
| <input type="text" id="docSearch" size="70" /> |
| <button type="button" id="searchBox">Search</button> |
| <script type="text/javascript"> |
| var f = function() { |
| window.location = '../#/Documentation/' + |
| encodeURIComponent(document.getElementById("docSearch").value); |
| } |
| document.getElementById("searchBox").onclick = f; |
| document.getElementById("docSearch").onkeypress = function(e) { |
| if (13 == (e.keyCode ? e.keyCode : e.which)) { |
| f(); |
| } |
| } |
| </script> |
| </div> |
| ++++ |
| |
| """ |
| |
| opts = OptionParser() |
| opts.add_option('-o', '--out', help='output file') |
| opts.add_option('-s', '--src', help='source file') |
| opts.add_option('-x', '--suffix', help='suffix for included filenames') |
| options, _ = opts.parse_args() |
| |
| try: |
| out_file = open(options.out, 'w') |
| src_file = open(options.src, 'r') |
| last_line = '' |
| ignore_next_line = False |
| last_title = '' |
| for line in src_file.xreadlines(): |
| if PAT_GERRIT.match(last_line): |
| # Case of "GERRIT\n------" at the footer |
| out_file.write(GERRIT_UPLINK) |
| last_line = '' |
| elif PAT_SEARCHBOX.match(last_line): |
| # Case of 'SEARCHBOX\n---------' |
| out_file.write(SEARCH_BOX) |
| last_line = '' |
| elif PAT_INCLUDE.match(line): |
| # Case of 'include::<filename>' |
| match = PAT_INCLUDE.match(line) |
| out_file.write(last_line) |
| last_line = match.group(1) + options.suffix + match.group(2) + '\n' |
| elif PAT_STARS.match(line): |
| if PAT_TITLE.match(last_line): |
| # Case of the title in '.<title>\n****\nget::<url>\n****' |
| match = PAT_TITLE.match(last_line) |
| last_title = GET_TITLE % match.group(1) |
| else: |
| out_file.write(last_line) |
| last_title = '' |
| elif PAT_GET.match(line): |
| # Case of '****\nget::<url>\n****' in rest api |
| url = PAT_GET.match(line).group(1) |
| out_file.write(GET_MACRO.format(url) % last_title) |
| ignore_next_line = True |
| elif ignore_next_line: |
| # Handle the trailing '****' of the 'get::' case |
| last_line = '' |
| ignore_next_line = False |
| else: |
| out_file.write(last_line) |
| last_line = line |
| out_file.write(last_line) |
| out_file.close() |
| except IOError as err: |
| sys.stderr.write( |
| "error while expanding %s to %s: %s" % (options.src, options.out, err)) |
| exit(1) |