| #!/usr/bin/env python | 
 | # | 
 | # Copyright 2007 Google Inc. | 
 | # | 
 | # 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. | 
 | # | 
 |  | 
 | """ | 
 | Routines for constructing a TOCNode from a file on disk. | 
 | """ | 
 |  | 
 | from TOCNode import TOCNode | 
 | import re | 
 |  | 
 | def BuildTOC(toc_filename, displayname): | 
 |   """This will return a list of toplevel TOCNodes, each of which may have | 
 |   nested children.""" | 
 |  | 
 |   infile = open(toc_filename) | 
 |   bytes = infile.read() | 
 |   lines = bytes.split("\n") | 
 |  | 
 |   out = TOCNode(displayname) | 
 |   parentstack = [(out, -1)] | 
 |   previndent = 0 | 
 |   prevnode = None | 
 |  | 
 |   for line in lines: | 
 |     if line.startswith("#"): continue | 
 |  | 
 |     indentlevel = line.find("*") | 
 |     if -1 == indentlevel: continue | 
 |  | 
 |     postindent = line[indentlevel:] | 
 |     poststar = postindent[2:] | 
 |  | 
 |     if poststar.startswith('['): | 
 |       splitted  = re.split("[\[\] ]", poststar) | 
 |       wikiWord = splitted[1] | 
 |       caption = " ".join(splitted[2:]) | 
 |       caption = caption.replace("&", "and") | 
 |       caption = caption.strip() | 
 |  | 
 |       tocnode = TOCNode(caption, wikiWord) | 
 |     else: | 
 |       caption = poststar | 
 |       caption = caption.replace("&", "and") | 
 |       caption = caption.strip() | 
 |  | 
 |       tocnode = TOCNode(caption) | 
 |  | 
 |     if indentlevel > previndent: | 
 |       if prevnode: | 
 |         parentstack.append((prevnode, previndent)) | 
 |     elif indentlevel < previndent: | 
 |       while (parentstack and parentstack[-1][1] >= indentlevel ): | 
 |         parentstack.pop() | 
 |  | 
 |     parentstack[-1][0].addChild(tocnode) | 
 |  | 
 |     prevnode = tocnode | 
 |     previndent = indentlevel | 
 |   return out.AsTree() |