openstack-manuals/doc/training-guides/sources/convert_rst_xml.py
Roger Luethi 2e19f54e78 Fix training-guides URLs
Some of the documentation and scripts still used an old path name.

Change-Id: I9b4b054e28172729fad54f8792ff6439dad9f475
2014-04-11 17:16:39 +02:00

221 lines
9.5 KiB
Python

# Copyright 2013 Yahoo! Inc. All Rights Reserved
# Copyright 2013 OpenStack Foundation
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# 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.
'''
The code must executed within ./openstack-manuals/doc/training-manuals/sources/.
The code will automagically create the 7 'core' openstack repositories and convert the
rst docs to xml.
'''
import os
import re
import sys
def create_repo(directory):
#clone remote to local repo root, ignore error if exist
for x in directory:
os.system("git clone https://git.openstack.org/openstack/" + x + ".git")
def pull_repo_updates(directory):
#pull remote repo updates
for x in directory:
os.chdir("./" + x)
os.system("git pull origin master")
os.chdir("../")
def patternmatch(directory, docs_location, rstfile):
#simple pattern matching source rst to output docbook5.0 xml
good_file = {"addmethod.openstackapi", "architecture",
"development.environment", "drivers", "threading", "unit_tests"}
try:
#open the file to convert
infile = open(directory + docs_location + rstfile)
except IOError:
#if file is a directory then recurse
print("patternmatch:in IOError:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
os.mkdir(os.path.expanduser("./openstack-manuals/doc/training-guides/sources/" + directory + rstfile))
walkdirectories(directory + docs_location, rstfile +"/")
#docs_location and rstfile are both directories in this case
return
outfilenamepart = infile.name.split(".rst")
outfilename = outfilenamepart[0].split("/")
matchslash = re.search(r'(.*/.*/.*/.*)', directory)
if matchslash:
#if recursion match is good
print("patternmatch:matchslash:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
try:
if outfilenamepart[-1]:
#TODO if not rst file, then copy image files
return
except:
pass
directory = directory.split("/")
good_file_found = "false"
for filename in good_file:
#check for good file name, else skip to next file
if filename == outfilename[-1]:
good_file_found = "true"
continue
if good_file_found == "false":
#jump out of called routine
return
outfile = open("./openstack-manuals/doc/training-guides/sources/" +
directory[0] + "/" + docs_location + outfilename[-1] + ".xml", "w+")
print(directory[0] + "/" + docs_location + outfilename[-1] + ".xml")
else:
print("patternmatch:not matchslash:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
try:
if outfilenamepart[-1]:
#TODO if not rst file, then copy image files
#createfile(directory, docs_location, outfilename)
return
except:
pass
good_file_found = "false"
for filename in good_file:
#check for good file name, else skip to next file
if filename == outfilename[-1]:
good_file_found = "true"
continue
if good_file_found == "false":
#jump out of called routine
return
outfile = open("./openstack-manuals/doc/training-guides/sources/" +
directory + outfilename[-1] + ".xml", "w+")
print(directory + outfilename[-1] + ".xml")
#header of new xml file
outfile.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
outfile.write(" <section xmlns=\"http://docbook.org/ns/docbook\"\n")
outfile.write(" xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n")
outfile.write(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n")
outfile.write(" version=\"5.0\"\n")
#xml_section_name = outfilename.replace(" ", "-")
outfile.write(" xml:id=\"" + outfilename[-1] + "\">\n")
outfile.write("<title>" + outfilename[-1].title() + "</title>\n")
#start header
xml_section_name = "header"
outfile.write("<section xml:id=\"" + xml_section_name.strip() + "\">\n")
outfile.write("<title>" + xml_section_name.title() + "</title>\n")
outfile.write("<para>\n")
#always read two lines at a time, once pattern match on multiple char, previous line is section id and title
prevline = "empty"
startitemizedlist = 0
for line in infile:
#match single line ahead for section titles
match1 = re.search(r'(.*)(=======)(.*)', line)
match2 = re.search(r'(.*)(-------)(.*)', line)
match3 = re.search(r'(.*)(~~~~~~~)(.*)', line)
match4 = re.search(r'(\s*)(\*\s)(.*)', prevline)
match5 = re.search(r'(\s*)(\*\s)(.*)', line)
#ignoring orderedlists for now
#match6 = re.search(r'(\s*)([0-9]\.\s)(.*)', prevline)
#match7 = re.search(r'(\s*)([0-9]\.\s)(.*)', line)
if match1 or match2 or match3:
#close previous para and section
outfile.write("</para>\n")
outfile.write("</section>\n")
#start new section and para
xml_section_name = prevline.replace(" ", "-")
xml_section_name = xml_section_name.replace("\'", "-")
xml_section_name = xml_section_name.replace("`", "-")
xml_section_name = xml_section_name.replace("\"", "-")
xml_section_name = xml_section_name.replace(":", "-")
xml_section_name = xml_section_name.replace(",", "-")
xml_section_name = xml_section_name.replace("(", "-")
xml_section_name = xml_section_name.replace(")", "-")
outfile.write("<section xml:id=\"" + xml_section_name.strip() + "\">\n")
outfile.write("<title>" + xml_section_name.strip().title() + "</title>\n")
outfile.write("<para>\n")
elif not match4 and match5:
#start itemizedlist
startitemizedlist = 1
outfile.write("<itemizedlist>\n")
listitem = match5.group(3).replace("<","[")
listitem = listitem.replace(">","]")
listitem = listitem.replace("&","-")
outfile.write("<listitem><para>" + listitem + "</para></listitem>\n")
elif match4 and match5:
#continue itemizedlist
listitem = match5.group(3).replace("<","[")
listitem = listitem.replace(">","]")
listitem = listitem.replace("&","-")
outfile.write("<listitem><para>" + listitem + "</para></listitem>\n")
elif match4 and not match5:
#close itemizedlist
startitemizedlist = 0
outfile.write("</itemizedlist>\n")
elif prevline != "empty" and not prevline.isspace():
#no match, so inside section and para
prevline = prevline.replace("<","[")
prevline = prevline.replace(">","]")
prevline = prevline.replace("&","-")
outfile.write(prevline)
#save previous line for pattern matching
prevline = line
#catch end of file, missing close itemized list
if startitemizedlist == 1:
outfile.write("</itemizedlist>\n")
#close last para and section
outfile.write("</para>\n")
outfile.write("</section>\n")
outfile.write("</section>")
def walkdirectories(projectdirectory, sourcedirectory):
#print("walkdirectories: " + projectdirectory + sourcedirectory)
print("walkdirectories:current directory is ")
os.system("pwd")
for rstfile in os.listdir(projectdirectory + sourcedirectory):
#walk files in the directory
if rstfile.startswith('.'):
#ignore hidden files
continue
patternmatch(projectdirectory, sourcedirectory, rstfile)
def convert_rst_docbook5(repository_hash):
for item in repository_hash:
print("convert_rst_docbook5:start convert rst: " + item + repository_hash[item])
os.system("rm -R ./openstack-manuals/doc/training-guides/sources/" + item)
try:
#use try for when the remove directory fails
os.mkdir("./openstack-manuals/doc/training-guides/sources/" + item)
except OSError:
pass
walkdirectories(item, repository_hash[item])
#os.chdir("../")
print("convert_rst_docbook5:completed convert rst: " + item + repository_hash[item])
repository_hash = {'cinder/':"/doc/source/devref/"}
'''
'nova/':"/doc/source/devref/",
'glance/':"/doc/source/",
'neutron/':"/doc/source/devref/",
'swift/':"/doc/source/",
'keystone/':"doc/source/",
'horizon/':"/doc/source/"}'''
os.chdir("../../../../")#root of repository directories in relation to ./training-guides/sources
create_repo(repository_hash)
pull_repo_updates(repository_hash)
convert_rst_docbook5(repository_hash)