This is an overhaul of the complete content to make it a separate python package that can be installed on the jenkins machines as well as on editor's machines. The goal of this patchset is to package everything and get the command "openstack-doc-test" running so that it can be used for gating. This will need further refinement for the other commands. Change-Id: Icc2f1807dd5ab5fb2f83c05d1b3895b3a9a0dbaf
163 lines
5.0 KiB
Python
Executable File
163 lines
5.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
Created on 2012-7-3
|
|
|
|
@author: daisy
|
|
'''
|
|
import os, sys
|
|
import tempfile
|
|
import shutil
|
|
import xml.dom.minidom
|
|
from optparse import OptionParser
|
|
import codecs
|
|
|
|
from xml2po import Main
|
|
from xml2po.modes.docbook import docbookXmlMode
|
|
|
|
class myDocbookXmlMode(docbookXmlMode):
|
|
def __init__(self):
|
|
self.lists = ['itemizedlist', 'orderedlist', 'variablelist',
|
|
'segmentedlist', 'simplelist', 'calloutlist', 'varlistentry', 'userinput',
|
|
'computeroutput','prompt','command','screen']
|
|
self.objects = [ 'figure', 'textobject', 'imageobject', 'mediaobject',
|
|
'screenshot','literallayout', 'programlisting' ]
|
|
|
|
default_mode = 'docbook'
|
|
operation = 'merge'
|
|
options = {
|
|
'mark_untranslated' : False,
|
|
'expand_entities' : True,
|
|
'expand_all_entities' : False,
|
|
}
|
|
|
|
ignore_folder = {"docbkx-example"}
|
|
root = "./doc/src/docbkx"
|
|
|
|
def mergeback (folder, language):
|
|
if (folder==None) :
|
|
path = root
|
|
else :
|
|
outputFiles = mergeSingleDocument(folder, language)
|
|
if ((outputFiles != None) and (len(outputFiles)>0)) :
|
|
for outXML in outputFiles :
|
|
changeXMLLangSetting (outXML, language)
|
|
return
|
|
|
|
if (not os.path.isdir(path)) :
|
|
return
|
|
|
|
files = os.listdir(path)
|
|
for aFile in files :
|
|
if (not (aFile in ignore_folder)):
|
|
outputFiles = mergeSingleDocument (aFile, language)
|
|
if ((outputFiles != None) and (len(outputFiles)>0)) :
|
|
for outXML in outputFiles :
|
|
changeXMLLangSetting (outXML, language)
|
|
|
|
def mergeSingleDocument(folder, language):
|
|
xmlfiles = []
|
|
outputfiles = []
|
|
abspath = os.path.join(root, folder)
|
|
if (os.path.isdir(abspath)) :
|
|
os.path.walk(abspath, get_xml_list, xmlfiles)
|
|
else:
|
|
return None
|
|
|
|
if len(xmlfiles)>0 :
|
|
popath = os.path.join(abspath,"locale",language+".po")
|
|
#generate MO file
|
|
mofile_handler, mofile_tmppath = tempfile.mkstemp()
|
|
os.close(mofile_handler)
|
|
os.system("msgfmt -o %s %s" % (mofile_tmppath, popath))
|
|
|
|
for aXML in xmlfiles :
|
|
#(filename, ext) = os.path.splitext(os.path.basename(aXML))
|
|
relpath = os.path.relpath(aXML, root)
|
|
outputpath = os.path.join(os.path.curdir, "generated", language, relpath)
|
|
try:
|
|
xml2po_main = Main(default_mode, operation, outputpath, options)
|
|
xml2po_main.current_mode = myDocbookXmlMode()
|
|
xml2po_main.merge(mofile_tmppath, aXML)
|
|
outputfiles.append(outputpath)
|
|
except IOError:
|
|
print "Error: cannot open aFile %s for writing."
|
|
sys.exit(5)
|
|
except :
|
|
print ("Exception happen")
|
|
if mofile_tmppath :
|
|
os.remove(mofile_tmppath)
|
|
|
|
return outputfiles
|
|
|
|
def changeXMLLangSetting(xmlFile, language):
|
|
dom = xml.dom.minidom.parse(xmlFile)
|
|
root = dom.documentElement
|
|
root.setAttribute("xml:lang", language[:2])
|
|
fileObj = codecs.open(xmlFile, "wb", encoding="utf-8")
|
|
|
|
#add namespace to link
|
|
nodelists = root.getElementsByTagName("link")
|
|
for node in nodelists :
|
|
if (node.hasAttribute("href")) :
|
|
node.setAttribute("xlink:href", node.getAttribute("href"))
|
|
if (node.hasAttribute("title")) :
|
|
node.setAttribute("xlink:title", node.getAttribute("title"))
|
|
|
|
dom.writexml(fileObj)
|
|
|
|
def get_xml_list (sms, dr, flst):
|
|
if ((flst == "target") or (flst == "wadls")) :
|
|
return
|
|
if (dr.find("target")>-1) :
|
|
return
|
|
if (dr.find("wadls")>-1) :
|
|
return
|
|
|
|
for f in flst:
|
|
if ((f.endswith(".xml") and (f != "pom.xml"))) :
|
|
sms.append(os.path.join(dr,f))
|
|
|
|
def main(argv):
|
|
|
|
usage = "usage: %prog [options] command [cmd_options]"
|
|
description = "This is the tool to generate translated docbooks, which"\
|
|
" will be stored in 'generated/[language]/"
|
|
|
|
parser = OptionParser(
|
|
usage=usage, version="0.6", description=description
|
|
)
|
|
parser.disable_interspersed_args()
|
|
parser.add_option(
|
|
"-l", "--language", dest="language", help=("specified language")
|
|
)
|
|
parser.add_option(
|
|
"-b", "--book", dest="book", help=("specified docbook")
|
|
)
|
|
(options, args) = parser.parse_args()
|
|
if (options.language == None) :
|
|
print "must specify language"
|
|
return
|
|
|
|
#change working directory
|
|
|
|
#copy folders
|
|
folder = options.book
|
|
language = options.language
|
|
sourcepath = os.path.join(root, folder)
|
|
destpath = os.path.join(os.path.curdir, "generated", language)
|
|
if (not os.path.exists(destpath)) :
|
|
os.makedirs(destpath)
|
|
|
|
destfolder = os.path.join(destpath, folder)
|
|
if (os.path.exists(destfolder)) :
|
|
shutil.rmtree(destfolder)
|
|
|
|
os.system("cp -r %s %s" % (sourcepath, destpath))
|
|
mergeback(folder, language)
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv[1:])
|
|
|