Browse Source

Remove DocBook XML translation support

Remove commands and scripting for translation of DocBook XML.

implements bp docbook-removal

Change-Id: Iadb4d8609dffe9e3e449b6fe09db939ea7fca943
changes/16/311716/1
Andreas Jaeger 5 years ago
parent
commit
992fb6cdb4
  1. 37
      bin/doc-tools-check-languages
  2. 279
      os_doc_tools/handle_pot.py
  3. 2
      setup.cfg

37
bin/doc-tools-check-languages

@ -14,26 +14,6 @@
BUILD_FAIL=0
function setup_directories {
language=$1
for directory in ${DIRECTORIES["$language"]} ; do
echo " $directory"
openstack-generate-docbook -l $language -b $directory -r $DOC_DIR
done
}
function setup_language {
language=$1
echo "Setting up files for $language"
echo "======================="
echo " Directories:"
setup_directories $language
if [ -n "$POM_FILE" ] ; then
cp $POM_FILE generated/$language/pom.xml
fi
}
function build_rst {
language=$1
book=$2
@ -229,7 +209,6 @@ function test_language {
args+=("--publish")
fi
args+=("--check-build" "-l $language")
BUILD_XML=0
for book in ${BOOKS["$language"]}; do
if [ ${SPECIAL_BOOKS[$book]+_} ] ; then
if [ ${SPECIAL_BOOKS[$book]} = "RST" ] ; then
@ -244,23 +223,7 @@ function test_language {
continue
fi
fi
args+=("--only-book $book")
BUILD_XML=1
done
if [ "$BUILD_XML" -eq "1" ] ; then
setup_language $language
openstack-doc-test ${args[@]}
if [[ $? -eq 0 ]] ; then
echo "... succeeded"
else
echo "... failed"
BUILD_FAIL=1
fi
fi
}

279
os_doc_tools/handle_pot.py

@ -1,279 +0,0 @@
#!/usr/bin/env python
# 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.
import codecs
import optparse
import os
import shutil
import sys
import tempfile
import xml.dom.minidom
from xml2po import Main # noqa
from xml2po.modes.docbook import docbookXmlMode # noqa
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',
'option']
default_mode = 'docbook'
operation = 'merge'
xml_options = {
'mark_untranslated': False,
'expand_entities': True,
'expand_all_entities': False,
}
IGNORE_FOLDER = []
IGNORE_FILE = []
def mergeback(folder, language, root):
"""Generate translated files for language in directory folder."""
if folder is None:
path = root
else:
outputFiles = mergeSingleDocument(folder, language, root)
if outputFiles:
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, root)
if outputFiles:
for outXML in outputFiles:
changeXMLLangSetting(outXML, language)
def mergeSingleDocument(folder, language, root):
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 xmlfiles:
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, "merge", outputpath,
xml_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 Exception:
print("Exception happen")
if mofile_tmppath:
os.remove(mofile_tmppath)
return outputfiles
def changeXMLLangSetting(xmlFile, language):
"""Update XML settings for file."""
# The mergeback breaks the ENTITIY title which should look like:
# <!DOCTYPE chapter [
# <!ENTITY % openstack SYSTEM "../common/entities/openstack.ent">
# %openstack;
# ]>
# The "%openstack;" gets removed, let's add it back first.
# NOTE(jaegerandi): This just handles the openstack ENTITY, if
# others are used, this needs to be generalized.
with open(xmlFile) as xml_file:
newxml = xml_file.read()
# Used in openstack-manuals:
newxml = newxml.replace(
'common/entities/openstack.ent">',
'common/entities/openstack.ent"> %openstack;')
# As used in security-doc and operations-guide
newxml = newxml.replace('SYSTEM "openstack.ent">',
'SYSTEM "openstack.ent"> %openstack;')
try:
dom = xml.dom.minidom.parseString(newxml)
except xml.parsers.expat.ExpatError as e:
print("Error: parsing of file '%s' for language '%s' "
"with Expat failed: %s." % (xmlFile, language, e))
sys.exit(5)
root = dom.documentElement
root.setAttribute("xml:lang", language[:2])
fileObj = codecs.open(xmlFile, "wb", encoding="utf-8")
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") and
not (f in IGNORE_FILE)):
sms.append(os.path.join(dr, f))
def get_default_book(root):
return os.listdir(root)[0]
def generatedocbook():
global IGNORE_FOLDER, IGNORE_FILE
usage = "usage: %prog [options] command [cmd_options]"
description = "This is the tool to generate translated docbooks, which "
"will be stored in 'generated/[language]/"
IGNORE_FOLDER = ["docbkx-example"]
IGNORE_FILE = []
parser = optparse.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")
)
parser.add_option(
"-r", "--root", dest="root", default="./doc",
help=("root directory")
)
(options, args) = parser.parse_args()
if options.language is None:
print("must specify language")
return
root = options.root
if options.book is None:
options.book = get_default_book(root)
# change working directory
# copy folders
folder = options.book
language = options.language
root = options.root
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, root)
def generatePoT(folder, root):
if folder is None:
path = root
else:
generateSinglePoT(folder, root)
return
if not os.path.isdir(path):
return
files = os.listdir(path)
for aFile in files:
if not (aFile in IGNORE_FOLDER):
generateSinglePoT(aFile, root)
def generateSinglePoT(folder, root):
xmlfiles = []
abspath = os.path.join(root, folder)
if os.path.isdir(abspath):
os.path.walk(abspath, get_xml_list, xmlfiles)
else:
return
if xmlfiles:
output = os.path.join(abspath, "locale")
if not os.path.exists(output):
os.mkdir(output)
output = os.path.join(output, folder + ".pot")
try:
xml2po_main = Main(default_mode, "pot", output, xml_options)
xml2po_main.current_mode = myDocbookXmlMode()
except IOError:
print("Error: cannot open aFile %s for writing." % (output))
sys.exit(5)
# print(xmlfiles)
# print(">>>outout: %s ", output)
xml2po_main.to_pot(xmlfiles)
def generatepot():
global IGNORE_FOLDER, IGNORE_FILE
IGNORE_FOLDER = ["docbkx-example", "training-guide"]
IGNORE_FILE = ["api-examples.xml"]
try:
folder = sys.argv[1]
except Exception:
folder = None
try:
root = sys.argv[2]
except Exception:
root = "./doc"
generatePoT(folder, root)

2
setup.cfg

@ -39,8 +39,6 @@ setup-hooks =
console_scripts =
openstack-doc-test = os_doc_tools.doctest:doctest
openstack-auto-commands = os_doc_tools.commands:main
openstack-generate-docbook = os_doc_tools.handle_pot:generatedocbook
openstack-generate-pot = os_doc_tools.handle_pot:generatepot
openstack-jsoncheck = os_doc_tools.jsoncheck:main
openstack-indexpage = os_doc_tools.index:main

Loading…
Cancel
Save