summaryrefslogtreecommitdiff
path: root/wiki-to-help
diff options
context:
space:
mode:
authorNorbert Thiebaud <nthiebaud@gmail.com>2012-09-01 09:51:27 -0500
committerNorbert Thiebaud <nthiebaud@gmail.com>2012-10-16 11:07:30 -0500
commit61173c1b58efa79c0ba6b08348d2796a249d0186 (patch)
tree00ebf544db18942e2a1ecfc5e5fa16931127d38f /wiki-to-help
parent3dc2e7497f1798ae4ff6c5c8c562666bc10a393c (diff)
move help structure one directory up
Change-Id: Ie970e39fbb6795a92d9fdd13510409d7dcd071bc
Diffstat (limited to 'wiki-to-help')
-rw-r--r--wiki-to-help/HHC/htmlhelp.reg12
-rwxr-xr-xwiki-to-help/HHC/install_hhc.sh69
-rw-r--r--wiki-to-help/README56
-rwxr-xr-xwiki-to-help/call_convert.sh3
-rwxr-xr-xwiki-to-help/convert.py222
-rw-r--r--wiki-to-help/executor.py21
-rw-r--r--wiki-to-help/hhc.py70
-rw-r--r--wiki-to-help/htmlhelp.xsl23
-rw-r--r--wiki-to-help/metabook.json26
-rw-r--r--wiki-to-help/metabook.py154
-rw-r--r--wiki-to-help/metabook_translated.py118
-rw-r--r--wiki-to-help/mw.py49
-rw-r--r--wiki-to-help/mwlib_mods/__init__.py28
-rw-r--r--wiki-to-help/mwlib_mods/custom_nfo.py19
-rw-r--r--wiki-to-help/mwlib_mods/docbook45grammar.py2
-rw-r--r--wiki-to-help/mwlib_mods/docbook_grammar.py11
-rw-r--r--wiki-to-help/mwlib_mods/docbook_internLinks.py76
-rw-r--r--wiki-to-help/mwlib_mods/docbook_table_tags.py93
-rw-r--r--wiki-to-help/mwlib_mods/docbookwriter_options.py54
-rw-r--r--wiki-to-help/mwlib_mods/indexterm_from_title.py24
-rw-r--r--wiki-to-help/mwlib_mods/no_sections.py38
-rw-r--r--wiki-to-help/nfo.json5
-rw-r--r--wiki-to-help/test2.xml489
23 files changed, 1662 insertions, 0 deletions
diff --git a/wiki-to-help/HHC/htmlhelp.reg b/wiki-to-help/HHC/htmlhelp.reg
new file mode 100644
index 0000000000..e38e0ef828
--- /dev/null
+++ b/wiki-to-help/HHC/htmlhelp.reg
@@ -0,0 +1,12 @@
+REGEDIT4
+
+[HKEY_CURRENT_USER\Software\Wine]
+"Version"="win2k"
+
+[HKEY_CURRENT_USER\Software\Wine\AppDefaults\hhc.exe\DllOverrides]
+"itircl"="native"
+"itss"="native"
+
+[HKEY_CURRENT_USER\Software\Wine\AppDefaults\hhw.exe\DllOverrides]
+"itircl"="native"
+"itss"="native"
diff --git a/wiki-to-help/HHC/install_hhc.sh b/wiki-to-help/HHC/install_hhc.sh
new file mode 100755
index 0000000000..344ccbd5b0
--- /dev/null
+++ b/wiki-to-help/HHC/install_hhc.sh
@@ -0,0 +1,69 @@
+#!/bin/bash -e
+# -e Exit immediately if a command exits with a non-zero status.
+
+# This installs Microsofts HHC (HTML Help Compiler)
+# Copyright 2011 Timo Richter and others.
+# Licensed under GNU GPLv3
+# Depends on: wine, wget, cabextract
+#
+# Usage of HHC: wine c:\\htmlhelp\\hhc.exe c:\\test\\htmlhelp.hhp
+#
+# Changes: Set installation directory to c:\htmlhelp
+# Copy also itcc.dll, this is neccessary
+# No execution of htmlhelp.exe installer needed
+# Abortion of install if anything fails, e.g. the download of HHC.
+#
+
+which wine > /dev/null 2>&1 || { echo "Please install 'wine'." ; exit 1 ; }
+which cabextract > /dev/null 2>&1 || { echo "Please install 'cabextract'." ; exit 1 ; }
+which wget > /dev/null 2>&1 || { echo "Please install 'wget'." ; exit 1 ; }
+
+echo "Going to install hhc.exe to your wine installation..."
+
+cd "$(dirname $0)" # cd to path of this script
+
+WINEPREFIX=${WINEPREFIX:=$HOME/.wine}
+test -d "$WINEPREFIX" || winecfg
+HHDIR="${WINEPREFIX}/dosdevices/c:/htmlhelp"
+mkdir -p "$HHDIR"
+
+# Setup the registry
+# Set Wine's Windows version to Windows 2000 (or above), and add an override to use the native itss.dll, both via winecfg.
+wine regedit htmlhelp.reg
+
+cd "$HHDIR"
+
+# Install HTML Help Workshop
+wget -O htmlhelp.exe 'http://go.microsoft.com/fwlink/?LinkId=14188'
+
+# unneccessary
+#wine htmlhelp.exe
+
+cabextract -F hhc.exe htmlhelp.exe
+cabextract -F HHA.dll htmlhelp.exe
+
+# Install ITSS.DLL
+cabextract -F hhupd.exe htmlhelp.exe
+cabextract -F itircl.dll hhupd.exe
+cabextract -F itss.dll hhupd.exe
+cabextract -F itcc.dll htmlhelp.exe
+cabextract -F hhctrl.ocx hhupd.exe
+cp -a itircl.dll "$WINEPREFIX/drive_c/windows/system32/"
+cp -a itcc.dll "$WINEPREFIX/drive_c/windows/system32/"
+cp -a itss.dll "$WINEPREFIX/drive_c/windows/system32/"
+cp -a hhctrl.ocx "$WINEPREFIX/drive_c/windows/system32/"
+wine regsvr32 'C:\WINDOWS\SYSTEM32\itcc.dll'
+wine regsvr32 'C:\WINDOWS\SYSTEM32\itircl.dll'
+wine regsvr32 'C:\WINDOWS\SYSTEM32\itss.dll'
+wine regsvr32 'C:\WINDOWS\SYSTEM32\hhctrl.ocx'
+
+# Install MFC40.DLL
+wget -N http://activex.microsoft.com/controls/vc/mfc40.cab
+cabextract -F mfc40.exe mfc40.cab
+cabextract -F mfc40.dll mfc40.exe
+cp -a mfc40.dll "$WINEPREFIX/drive_c/windows/system32/"
+
+echo
+echo Done, hhc.exe installed.
+
+exit 0
diff --git a/wiki-to-help/README b/wiki-to-help/README
new file mode 100644
index 0000000000..2f254ac0a1
--- /dev/null
+++ b/wiki-to-help/README
@@ -0,0 +1,56 @@
+
+Conversion of an XML-Dump to platformspecific help files
+--------------------------------------------------------
+
+1 INSTALLATION
+
+The following programs are required:
+ - mwlib
+ - python
+ - python-lxml
+ - xsltproc
+ - unzip
+ - docbook-xsl-stylesheets
+
+HHC-Installer depends on:
+ - wine
+ - cabextract
+ - wget
+
+1.1 On GNU and UNIX
+
+ - Install wine
+ - Execute HHC/install_hhc.sh
+
+1.2 On Windows
+
+ - Install HHC from http://go.microsoft.com/fwlink/?LinkId=14188
+
+2 USAGE
+
+See ./convert.py -h
+
+For the correct operation, you need to modify htmlhelp.xsl to point to your
+docbook-xsl-stylesheets installation, like:
+
+--- a/helpcontent2/wiki-to-help/htmlhelp.xsl
++++ b/helpcontent2/wiki-to-help/htmlhelp.xsl
+@@ -16,8 +16,8 @@
+
+ ******************************************************************** -->
+
+-<xsl:import href="xsl/html/chunk.xsl"/>
++<xsl:import href="/usr/share/xml/docbook/stylesheet/nwalsh/1.76.1/html/chunk.xsl"/>
+ <xsl:param name="htmlhelp.use.hhk" select="1"></xsl:param>
+-<xsl:include href="xsl/htmlhelp/htmlhelp-common.xsl"/>
++<xsl:include href="/usr/share/xml/docbook/stylesheet/nwalsh/1.76.1/htmlhelp/htmlhelp-common.xsl"/>
+
+ </xsl:stylesheet>
+
+
+3 LICENSE
+
+The following applies to all files if not stated differently
+
+ - Licensed under GNU LGPLv3 or later / MPL
+ - Copyright 2011 Timo Richter
diff --git a/wiki-to-help/call_convert.sh b/wiki-to-help/call_convert.sh
new file mode 100755
index 0000000000..c3ff714fcf
--- /dev/null
+++ b/wiki-to-help/call_convert.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+./convert.py test2.xml test/
+
diff --git a/wiki-to-help/convert.py b/wiki-to-help/convert.py
new file mode 100755
index 0000000000..323a834d19
--- /dev/null
+++ b/wiki-to-help/convert.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python
+#!/usr/bin/python -i
+"""
+Convert an XML-Dump to platformspecific help files.
+Copyright 2011 Timo Richter
+
+This program depends on:
+mwlib
+python
+python-lxml
+xsltproc
+Microsoft HHC: http://go.microsoft.com/fwlink/?LinkId=14188
+
+
+"""
+
+import subprocess, tempfile, os, shutil, argparse
+
+#import mwlib_mods # is being imported. see below
+from hhc import HHC
+from mw import MW
+from metabook_translated import MetabookTranslated
+from metabook_translated import LanguageSeparator
+from executor import Executor
+
+scriptpath=os.path.dirname(os.path.realpath(__file__) )
+
+class Main(object):
+ ''' Defines program parameters and returns them as a dictionary '''
+ def parseArgs(self):
+ parser = argparse.ArgumentParser(description='Conversion from a mediawiki xml-dumpfile to helpfiles')
+ parser.add_argument("--startpage", metavar="PATH", dest="startpage", default=None, type=str, help="Sets a HTML-file as the start page")
+ parser.add_argument("--images", metavar="PATH", dest="imgPath", default=None, type=str, help="Uses images from PATH. PATH is a zipfile or a directory.")
+ parser.add_argument("--keep", dest="keepTmp", default=False, action='store_true', help="Keeps temporary files in /tmp")
+ parser.add_argument("--only-en", dest="onlyEn", action='store_true', default=False, help="Converts only English articles")
+ parser.add_argument("--no-chm", dest="createChm", default=True, action='store_false', help="Avoids creation of a CHM file at the end")
+ parser.add_argument("-v", dest="verbose", default=False, action='store_true', help="Verbose")
+ parser.add_argument("input", type=str, help="XML input")
+ parser.add_argument("output", type=str, help="Directory for output")
+
+ return parser.parse_args()
+
+ def __init__(self):
+ args = self.parseArgs()
+ import mwlib_mods
+ r = Converter(
+ keepTmp=args.keepTmp,
+ createChm=args.createChm,
+ source=args.input,
+ dest=args.output,
+ startpage=args.startpage,
+ onlyEn=args.onlyEn,
+ imgPath=args.imgPath,
+ verbose=args.verbose,
+ )()
+ exit(int(not r))
+
+
+class Converter(object):
+ verbose=False
+ createChm = None #
+ keepTmp = None #
+ #style=os.path.join(scriptpath,'xsl/htmlhelp/htmlhelp.xsl') # final
+ style=os.path.join(scriptpath,'htmlhelp.xsl') # final
+ title="Book" # final
+
+ tmp=None
+ includeFiles=[]
+
+ def __init__(self,source,dest,onlyEn,imgPath,verbose,
+ keepTmp=False,createChm=True,startpage=None):
+ """
+ Parameters are documented in Main.parseArgs()
+ """
+ self.createChm = createChm
+ self.keepTmp=keepTmp
+ self.tmp = tempfile.mkdtemp()
+ self.style = os.path.abspath(self.style)
+ source = os.path.abspath(source)
+ dest = os.path.abspath(dest)
+ if startpage is not None:
+ startpage = os.path.abspath(startpage)
+ self.source=source
+ self.dest=dest
+ self.startpage=startpage
+ self.onlyEn = onlyEn
+ self.imgPath = imgPath
+ self.verbose = verbose
+ self.ex = Executor(showErr=verbose,showOutput=True,showCmd=verbose)
+ self.hhc = HHC(showErr=True,showOutput=verbose,showCmd=verbose)
+ self.title = self.getTitle(self.title)
+
+ def getTitle(self,default=None):
+ """
+ If given, return TEXT from <siteinfo><sitename>TEXT</sitename></siteinfo>
+ in xml file self.source.
+ Otherwise return @default
+ """
+ import xml.dom.minidom
+ print "Loading title"
+ dom = xml.dom.minidom.parse(self.source)
+ try:
+ siteinfo = dom.getElementsByTagName("siteinfo")[0]
+ sitename = siteinfo.getElementsByTagName("sitename")[0]
+ name = sitename.childNodes[0].data
+ except IndexError:
+ return default
+ else:
+ return name
+
+ def createDir(self,path):
+ try:
+ os.mkdir(path)
+ except OSError:
+ pass
+
+ def setupImgPath(self):
+ """
+ If --images is not given, the path will be in the format "images/name.jpg".
+ If --images is given a zipfile, it is being extracted to "images/".
+ If --images is a directory, it is being copied to "images/".
+ The filenames in images/ are being stored to self.includeFiles.
+ """
+ imgDest = "images" # puts images to output/imgDest/
+ if not self.imgPath:
+ self.imgPath = os.path.join(imgDest,"IMAGENAME")
+ return
+ extension = os.path.splitext(self.imgPath)[1].lower()
+ imgTmp = os.path.join(self.tmp,imgDest)
+ print "Copying images..."
+ if extension == ".zip":
+ self.ex("unzip","-q","-o","-j","-d",imgTmp,self.imgPath)
+ else:
+ shutil.copytree(self.imgPath,imgTmp)
+ shutil.copytree(imgTmp, os.path.join(self.dest,imgDest) )
+ self.imgPath = os.path.join(imgDest,"IMAGENAME")
+ # Save filenames for inclusion in chm
+ for fname in os.listdir(imgTmp):
+ fpath = os.path.join(imgDest,fname)
+ self.includeFiles.append(fpath)
+
+ def writeHhp(self):
+ """
+ Writes changes to the .hhp-file.
+ self.includeFiles will be flushed to the hhp.
+ """
+ hhp=os.path.join(self.tmp,"htmlhelp.hhp")
+ with open(hhp,"a") as f:
+ f.write("\n".join(self.includeFiles))
+
+ def __call__(self):
+ """
+ Create the environment for conversion and call convert()
+ @return boolean Success
+ """
+ tmp = self.tmp
+ self.createDir(self.dest)
+
+ print "Working directory: "+tmp
+
+ self.setupImgPath()
+
+ shutil.copy(os.path.join(scriptpath,"nfo.json"),tmp)
+ metabook_template = os.path.join(scriptpath,"metabook.json")
+ ls = LanguageSeparator.fromFileToFiles(metabook_template,self.source,tmp)
+ MW.buildcdb(self.source,tmp)
+
+ if self.onlyEn:
+ return self.convert("en",ls["en"])
+ else:
+
+ for lang, metabook in ls.iteritems():
+ if not self.convert(lang,metabook): return False
+
+ def convert(self,lang,metabook):
+ """
+ Private.
+ This function executes the programs for the conversion.
+ @lang Language of book
+ @metabook Path to metabook-json-file
+ """
+ print "Rendering language "+lang
+ tmp = self.tmp
+ docbookfile = os.path.join(tmp,"%s.xml"%lang)
+ chmDest = os.path.join(self.dest,lang+".chm")
+
+ renderArgs = ("-L",lang,"-W","imagesrcresolver=%s"%self.imgPath,
+ "--config=%s/wikiconf.txt"%(tmp),
+ "-w","docbook","-o",docbookfile,"-m",metabook,"--title",self.title)
+ MW.quietCall(MW.render,renderArgs,showErr=self.verbose)
+ shutil.copy(docbookfile,self.dest)
+ print "Parsing docbook"
+ xsltreturn = self.ex("/usr/bin/xsltproc","--nonet","--novalid","-o",tmp+'/',self.style,docbookfile)
+ if not xsltreturn: return False
+ self.setStartpage(self.startpage)
+ self.writeHhp()
+ if self.createChm:
+ print("Compiling chm...")
+ self.hhc(tmp)
+ shutil.copy(os.path.join(tmp,'htmlhelp.chm'),chmDest)
+ return True
+
+ def setStartpage(self,startpage):
+ """
+ Private.
+ Copies @startpage to our tmp dir so that it will be used as the start page.
+ @return False if @startpage doesnt exist, otherwise True.
+ """
+ if startpage is None: return True
+ filename="index.html"
+ if not os.path.exists(startpage): return False
+ os.remove(os.path.join(self.tmp,filename))
+ shutil.copy(startpage, os.path.join(self.tmp,filename))
+ return True
+
+ def __del__(self):
+ if not self.keepTmp:
+ shutil.rmtree(self.tmp) # remove temp files
+
+if __name__ == '__main__':
+ Main()
+
diff --git a/wiki-to-help/executor.py b/wiki-to-help/executor.py
new file mode 100644
index 0000000000..464ec222e4
--- /dev/null
+++ b/wiki-to-help/executor.py
@@ -0,0 +1,21 @@
+import subprocess, os
+
+class Executor(object):
+ def __init__(self,showErr=True,showOutput=True,showCmd=False):
+ self.showCmd=showCmd
+ if showErr: self.stderr = None
+ else: self.stderr=open(os.devnull,"w")
+ if showOutput: self.stdout = None
+ else: self.stdout=open(os.devnull,"w")
+
+ def __call__(self,*cmd):
+ """
+ Execute a program, e.g. Executor()("/bin/ls","/home")
+ @cmd Command, args
+ @return boolean True if succeed
+ """
+ if self.showCmd:
+ print cmd
+ return (subprocess.Popen(list(cmd),stderr=self.stderr,
+ stdout=self.stdout).wait() == 0)
+
diff --git a/wiki-to-help/hhc.py b/wiki-to-help/hhc.py
new file mode 100644
index 0000000000..dc7a54daaa
--- /dev/null
+++ b/wiki-to-help/hhc.py
@@ -0,0 +1,70 @@
+import platform, os
+from executor import Executor
+
+class HHC(object):
+ """ Class for execution of Html Help Compiler """
+ hhcexe="c:\\htmlhelp\\hhc.exe"
+
+ def __init__(self,**args):
+ """
+ @args Arguments for Executor.__init__()
+ """
+ self.args=args
+
+ def exWindows(self,source):
+ """ Private. Compile @source calling HHC natively under Windows """
+ cmd=[self.hhcexe,os.path.join(source,"htmlhelp.hhp")]
+ return Executor(**self.args).executor(*tuple(cmd))
+
+ def exWine(self,source):
+ """ Private. Compile @source calling HHC via Wine """
+ #dirname = os.path.dirname(source)
+ wine = Wine(source,"j:",self.args)
+ r = wine(self.hhcexe,"j:\\htmlhelp.hhp")
+ del wine
+ return r
+
+ def __call__(self,source):
+ """
+ Converts @source with HHC
+ @source path to input directory that contains htmlhelp.hhp
+ """
+ windows=(platform.system()=="Windows")
+ if windows is False:
+ self.exWine(source)
+ else:
+ self.exWindows(source)
+
+class Wine(object):
+ # TODO: this should be a singleton
+ def __init__(self,workingDir,driveletter,args={}):
+ """
+ Setup the wine environment. Granting access so that wine is able
+ @workingDir will be accessable via @driveletter
+ @args Arguments for Executor as dict (**args)
+ E.g. Wine("/tmp/dir","j:")
+ """
+ homedir = os.path.expanduser('~')
+ wineprefix=os.path.join(homedir,".wine")
+ drive=os.path.join(wineprefix,"dosdevices",driveletter)
+ if os.path.lexists(drive):
+ self.driveBak = drive+".bak"
+ shutil.move(drive,self.driveBak)
+ os.symlink(workingDir,drive)
+ self.drive = drive
+ #self.driveBak = driveBak
+ self.executor = Executor(**args)
+
+ def ex(self,*cmd):
+ """ execute something with wine """
+ cmd = [elem for elem in cmd]
+ cmd = ["/usr/bin/wine"]+cmd
+ return self.executor(*tuple(cmd))
+
+ def __call__(self,*cmd):
+ return self.ex(*cmd)
+
+ def __del__(self):
+ os.remove(self.drive)
+ if hasattr(self,'driveBak'):
+ shutil.move(self.driveBak,self.drive)
diff --git a/wiki-to-help/htmlhelp.xsl b/wiki-to-help/htmlhelp.xsl
new file mode 100644
index 0000000000..ad815b6e1d
--- /dev/null
+++ b/wiki-to-help/htmlhelp.xsl
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ version="1.0"
+ exclude-result-prefixes="doc exsl set">
+
+<!-- ********************************************************************
+ $Id: htmlhelp.xsl 1676 2002-06-12 13:21:54Z kosek $
+ ********************************************************************
+
+ This file is used by htmlhelp.xsl if you want to generate source
+ files for HTML Help. It is based on the XSL DocBook Stylesheet
+ distribution (especially on JavaHelp code) from Norman Walsh.
+
+ ******************************************************************** -->
+
+<xsl:import href="/usr/share/xml/docbook/stylesheet/nwalsh/1.76.1/html/chunk.xsl"/>
+<xsl:param name="htmlhelp.use.hhk" select="1"></xsl:param>
+<xsl:include href="/usr/share/xml/docbook/stylesheet/nwalsh/1.76.1/htmlhelp/htmlhelp-common.xsl"/>
+
+</xsl:stylesheet>
diff --git a/wiki-to-help/metabook.json b/wiki-to-help/metabook.json
new file mode 100644
index 0000000000..4f460a1e40
--- /dev/null
+++ b/wiki-to-help/metabook.json
@@ -0,0 +1,26 @@
+{
+ "items": [],
+ "licenses": [
+ {
+ "mw_license_url": "",
+ "type": "license"
+ }
+ ],
+ "summary": "",
+ "type": "collection",
+ "version": 1,
+ "wikis(deprecated)": [
+ {
+ "baseurl": "http://help.libreoffice.org/",
+ "imagesize": 800,
+ "keep_tmpfiles": false,
+ "script_extension": ".php",
+ "type": "wikiconf",
+ "ident": "en"
+ }
+ ],
+ "images(deprecated)": {
+ "movedata.png": {"url": "http://path/movedata.png"}
+
+ }
+}
diff --git a/wiki-to-help/metabook.py b/wiki-to-help/metabook.py
new file mode 100644
index 0000000000..c6f05008cd
--- /dev/null
+++ b/wiki-to-help/metabook.py
@@ -0,0 +1,154 @@
+import json
+import xml.dom.minidom as minidom
+
+class Article(object):
+ itemTag = {"content_type":"text/x-wiki","type":"article"}
+ #itemTag = {"content_type":"text/x-wiki","type":"article","wikiident":"lo","url":"http://asdlkf/","source-url":"http://sourceurl/","source":"http://source/"}
+ attributes = {}
+ include = True #""" True if this article should be included in the metabook """
+
+ def __init__(self,attributes):
+ self.attributes = attributes
+
+ def getInclude(self):
+ """ @return True if this article should be included in the metabook """
+ return self.include
+
+ def toDict(self):
+ #if not self.include: return None
+ article = self.itemTag.copy()
+ article.update(self.attributes) # merge dicts
+ return article
+
+class Metabook(object):
+ """
+ I am your metabook and wish you a pleasant evening.
+ Sequence of usage:
+ m = Metabook()
+ m.loadTemplate(...)
+ m.loadArticles(xml input)
+ m.createBook()
+ m.write(output)
+ If template, in- and output are files, use fromFileToFile()
+ """
+ ArticleClass = Article # final
+ artTags = ["title"] # final
+
+ m = {} # Dict metabook
+ template = None
+ items = []
+ #source = "" # String input file, xmldump
+ #dest = "" # FileObject destination of json metabook
+
+ def getClone(self):
+ m = Metabook()
+ m.template = self.template # No copy() neccessary here
+ m.ArticleClass = self.ArticleClass
+ m.artTags = self.artTags
+ #m.m = self.m.copy()
+ #m.dest = self.dest
+ return m
+
+ def getArtTags(self,filename,tagnames):
+ """
+ Get Article Tags
+ Reads all specified tags from an xml file and returns a list of all tags.
+ @filename XML-file
+ @tagnames List of String Tagnames
+ @return List of Dict<String Tagname, String Value>
+ """
+ dom=minidom.parse(filename)
+ out = []
+
+ elements=dom.getElementsByTagName("page")
+
+ for element in elements:
+ tagdict = {}
+ for tagname in tagnames:
+ tags = element.getElementsByTagName(tagname)
+ if len(tags) > 0:
+ tagdict[tagname] = self.getText(tags[0])
+ else:
+ tagdict[tagname] = ""
+ out.append(tagdict)
+ return out
+
+ def getText(self,element):
+ """
+ @element xml Node
+ @return String content
+ """
+ return element.childNodes[0].data
+
+ def load_data(self,filename):
+ """ Unserialize data from jsonfile """
+ with open(filename, "r") as infile:
+ outdict = json.load(infile)
+ return outdict
+
+ def loadTemplate(self,jsonStruct):
+ """
+ Loads an existing json file at the beginning
+ @jsonStruct File object
+ """
+ self.template = json.load(jsonStruct)
+ #self.m = self.load_data(source)
+
+ def loadArticles(self,source):
+ """
+ Loads the articles and saves them as objects to self.items
+ """
+ pages = self.getArtTags(source,self.artTags)
+ self.items = [self.ArticleClass(page) for page in pages]
+ """return
+ items=[]
+ for page in pages:
+ item = self.ArticleClass(page)
+ if item.getInclude():
+ items.append(item.toDict())
+ self.m["items"] = items
+ """
+
+ def createBook(self):
+ """
+ Convert all article objects to dicts and merge them with the template.
+ The result is saved to self.m
+ """
+ if self.template is None:
+ self.m = []
+ else:
+ self.m = self.template.copy()
+ self.m["items"] = []
+ for item in self.items:
+ if item.getInclude():
+ self.m["items"].append(item.toDict())
+
+ def __call__(self,source):
+ """
+ Creates a metabook for @source and writes it to self.m. To continue,
+ use write()
+ @source xml-dump
+ """
+ self.loadArticles(source)
+ self.createBook()
+
+ def write(self,dest):
+ json.dump(self.m,dest)
+
+ def fromFileToFile(jsonStructFile,xmldump,output):
+ """
+ Creates a Metabook from a file and writes it to a file.
+ Short cut Function. This loads a metabook template file, creates the
+ metabook content from @xmldump and writes the book to @output.
+ @jsonStructFile String path to Metabook template
+ @xmldump String path
+ @output String path
+ """
+ #m = MetabookTranslated()
+ with open(jsonStructFile,"r") as f:
+ self.loadTemplate(f)
+ self.__call__(xmldump)
+ with open(output,"w") as f:
+ self.write(f)
+
+
diff --git a/wiki-to-help/metabook_translated.py b/wiki-to-help/metabook_translated.py
new file mode 100644
index 0000000000..a7f90dbcd1
--- /dev/null
+++ b/wiki-to-help/metabook_translated.py
@@ -0,0 +1,118 @@
+import metabook
+import re, os
+
+class ArticleTranslated(metabook.Article):
+ lang = "en" # default language code
+ trans = "" # translated title
+
+ def __init__(self,attributes):
+ title = attributes["title"]
+ parts = title.split("/")
+ #if len(parts) < 2:
+ # self.include = False
+ # return
+ if len(parts) == 1:
+ # title = "blabla"
+ self.title = title
+ if len(parts) == 2:
+ # title = "Category/englishTitle"
+ self.title = parts[1]
+ if len(parts) == 3:
+ # title = "Category/englishTitle/langCode"
+ self.lang = parts[2]
+ self.title = parts[1]
+
+ comment = attributes["comment"]
+ if '{Lang|' in comment:
+ # Language-tag exists
+ r = re.search("\{Lang\|([^\}]*)\}",comment)
+ trans = r.group(1)
+ self.trans = trans
+ else:
+ self.trans = self.title
+
+ attr = {}
+ attr["title"] = attributes["title"]
+ attr["displaytitle"] = self.trans
+ attr["lang"] = self.lang
+ self.attributes = attr
+
+class MetabookTranslated(metabook.Metabook):
+ """
+ This metabook contains all articles with translated titles.
+ This concrete metabook expects article titles in this form:
+ Category/Title/lang
+ Comments include this:
+ {{Lang|translatedTitle}}
+ """
+ ArticleClass=ArticleTranslated
+ artTags = ["title","comment"]
+
+class LanguageSeparator(object):
+ """
+ A translated metabook is a metabook where all titles are in the destination
+ language.
+ This class splits a translated metabook into many books with homogenous languages.
+ """
+ books={} # Dict<Str lang, Metabook>
+ sortedItems={} # Dict<Str lang, List<TranslatedArticle>>
+ items=[] # List<TranslatedArticle>
+
+ def __init__(self, book):
+ self.book = book
+ self.items = book.items
+
+ def splitItemsByLanguage(self):
+ """
+ Sort the articles in self.items by language and put them to self.sortedItems
+ """
+ sortedItems={}
+ for item in self.items:
+ if item.lang in sortedItems.keys():
+ sortedItems[item.lang].append(item)
+ else:
+ sortedItems[item.lang] = [item]
+ self.sortedItems = sortedItems
+ #return sortedItems
+
+ def createBooksByLanguage(self):
+ """
+ Generate metabooks to self.books.
+ Create a metabook for each language from self.sortedItems.
+ """
+ for lang, items in self.sortedItems.iteritems():
+ m = self.book.getClone()
+ m.items = items
+ m.lang = lang
+ self.books[lang] = m
+
+ @staticmethod
+ def fromFileToFiles(jsonStructFile,xmldump,output):
+ """
+ Creates a Metabook from a file and writes it to one file per language.
+ Short cut Function. This loads a metabook template file, creates the
+ metabook content from @xmldump and writes the book to @output.
+ @jsonStructFile String path to Metabook template
+ @xmldump String path
+ @output String path to output directory
+ @return Dict<String lang, String output>
+ """
+ m = MetabookTranslated()
+ with open(jsonStructFile,"r") as f:
+ m.loadTemplate(f)
+
+ m.loadArticles(xmldump)
+ ls = LanguageSeparator(m)
+ ls.splitItemsByLanguage()
+ ls.createBooksByLanguage()
+
+ pathlist={}
+
+ for lang, book in ls.books.iteritems():
+ book.createBook()
+ dest = os.path.join(output,"metabook_%s.json" % lang)
+ pathlist[lang] = dest
+ with open(dest,"w") as f:
+ book.write(f)
+ return pathlist
+
diff --git a/wiki-to-help/mw.py b/wiki-to-help/mw.py
new file mode 100644
index 0000000000..f19ca15be8
--- /dev/null
+++ b/wiki-to-help/mw.py
@@ -0,0 +1,49 @@
+#import mwlib.cdbwiki, mwlib.apps.render, mwlib.apps
+import mwlib.apps
+import sys, os
+
+class MW(object):
+ """
+ Use this adapter class to call mwlib within python.
+ Example: import mw; MW.buildcdb("in.xml","out")
+ """
+
+ @staticmethod
+ def quietCall(function,args=(),showErr=True,showOutput=True):
+ """
+ Calls a python function and redirects parts to /dev/null.
+ This is platform independent.
+ """
+ saveout = sys.stdout
+ saveerr = sys.stderr
+
+ if not showErr: sys.stderr=nullerr=open(os.devnull,"w")
+ if not showOutput: sys.stdout=nullout=open(os.devnull,"w")
+ function(*args)
+ if not showErr: nullerr.close()
+ if not showOutput: nullout.close()
+
+ sys.stdout=saveout
+ sys.stderr=saveerr
+
+ @staticmethod
+ def _setArgs(function,args):
+ """ Set sys.argv for @function """
+ bak = sys.argv
+ args=("nothing",)+args
+ dec=[x.encode() for x in args]
+ sys.argv=dec
+ r=function()
+ sys.argv=bak
+ return r
+
+ @staticmethod
+ def buildcdb(source,dest):
+ args=("--input",source,"--output",dest)
+ return MW._setArgs(mwlib.apps.buildcdb,args)
+ #mwlib.cdbwiki.BuildWiki(*args)
+
+ @staticmethod
+ def render(*args):
+ import mwlib.apps.render
+ return MW._setArgs(mwlib.apps.render.Main(),args)
diff --git a/wiki-to-help/mwlib_mods/__init__.py b/wiki-to-help/mwlib_mods/__init__.py
new file mode 100644
index 0000000000..c31bda4a9a
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/__init__.py
@@ -0,0 +1,28 @@
+"""
+This package sets up modifications and bugfixes for mwlib.
+Usage: import mwlib_mods
+"""
+
+# The order of the imports is relevant!
+
+import docbook_grammar
+docbook_grammar.apply()
+
+import docbook_table_tags
+docbook_table_tags.apply()
+
+import docbookwriter_options
+docbookwriter_options.apply()
+
+import no_sections
+no_sections.apply()
+
+import docbook_internLinks
+docbook_internLinks.apply()
+
+import custom_nfo
+custom_nfo.apply()
+
+import indexterm_from_title
+indexterm_from_title.apply()
+
diff --git a/wiki-to-help/mwlib_mods/custom_nfo.py b/wiki-to-help/mwlib_mods/custom_nfo.py
new file mode 100644
index 0000000000..9d60fe6c8e
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/custom_nfo.py
@@ -0,0 +1,19 @@
+"""
+Enable looking for a custom nfo.json and siteinfo.json
+
+Author: Timo Richter
+"""
+import mwlib.cdbwiki
+class WikiDB(mwlib.cdbwiki.WikiDB):
+ def __init__(self, dir, prefix='wiki', lang="en"):
+ try:
+ super(WikiDB,self).__init__(dir,prefix,lang)
+ except(RuntimeError):
+ print("Warning: "+"could not get siteinfo for language %r" % (lang,))
+ print("Please set up a custom siteinfo and nfo.")
+ self.nfo = self.get_data("nfo") or self.nfo
+ self.siteinfo = self.get_data("siteinfo") or self.siteinfo
+
+def apply():
+ mwlib.cdbwiki.WikiDB=WikiDB
+
diff --git a/wiki-to-help/mwlib_mods/docbook45grammar.py b/wiki-to-help/mwlib_mods/docbook45grammar.py
new file mode 100644
index 0000000000..e06b8879ca
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/docbook45grammar.py
@@ -0,0 +1,2 @@
+# autogenerated grammar from file docbook-rng-4.5b1/docbook.rng using: ./build_rng_grammar.new.py
+grammar = {'em': {'attributes': [], 'children': []}, 'programlisting': {'attributes': ['revisionflag', 'continuation', 'xml:space', 'xml:base', 'startinglinenumber', 'id', 'width', 'role', 'xreflabel', 'conformance', 'revision', 'remap', 'vendor', 'linenumbering', 'format', 'userlevel', 'arch', 'condition', 'lang', 'language', 'wordsize', 'security', 'os', 'dir'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'lineannotation', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'textobject', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'co', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'coref', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'varlistentry': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['term', 'listitem']}, 'colspec': {'attributes': ['char', 'rowsep', 'colname', 'align', 'colsep', 'colnum', 'colwidth', 'charoff'], 'children': []}, 'mediaobject': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['audioobject', 'videoobject', 'caption', 'imageobject', 'imageobjectco', 'textobject', 'objectinfo']}, 'citation': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'imageobject': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['objectinfo', 'imagedata']}, 'table': {'attributes': ['orient', 'revisionflag', 'rowsep', 'tabstyle', 'frame', 'remap', 'onmousedown', 'xml:base', 'tocentry', 'border', 'id', 'style', 'bgcolor', 'label', 'width', 'xml:lang', 'shortentry', 'xreflabel', 'onmousemove', 'cellspacing', 'revision', 'rowheader', 'vendor', 'onclick', 'onmouseout', 'onkeypress', 'rules', 'colsep', 'onkeydown', 'floatstyle', 'onkeyup', 'onmouseover', 'userlevel', 'role', 'arch', 'class', 'condition', 'lang', 'conformance', 'align', 'title', 'summary', 'wordsize', 'pgwide', 'onmouseup', 'cellpadding', 'security', 'ondblclick', 'os', 'dir'], 'children': ['graphic', 'title', 'mediaobject', 'colgroup', 'tr', 'titleabbrev', 'tbody', 'caption', 'tgroup', 'tfoot', 'textobject', 'blockinfo', 'indexterm', 'col', 'thead']}, 'phrase': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'literallayout': {'attributes': ['revisionflag', 'continuation', 'xml:space', 'xml:base', 'startinglinenumber', 'id', 'width', 'role', 'xreflabel', 'conformance', 'revision', 'remap', 'vendor', 'linenumbering', 'format', 'userlevel', 'arch', 'class', 'condition', 'lang', 'language', 'wordsize', 'security', 'os', 'dir'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'lineannotation', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'textobject', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'co', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'coref', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'row': {'attributes': ['revisionflag', 'rowsep', 'onmousedown', 'xml:base', 'id', 'style', 'title', 'wordsize', 'onmousemove', 'xreflabel', 'valign', 'role', 'conformance', 'revision', 'remap', 'vendor', 'onclick', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['entry', 'entrytbl']}, 'xref': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'endterm', 'xrefstyle', 'linkend', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': []}, 'span': {'attributes': [], 'children': []}, 'caption': {'attributes': ['revisionflag', 'onmousedown', 'xml:base', 'id', 'style', 'title', 'wordsize', 'role', 'onclick', 'onmousemove', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'align', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['programlisting', 'tip', 'formalpara', 'warning', 'caution', 'literallayout', 'glosslist', 'screenshot', 'simpara', 'segmentedlist', 'note', 'screenco', 'calloutlist', 'blockquote', 'para', 'screen', 'important', 'orderedlist', 'programlistingco', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist']}, 'section': {'attributes': ['status', 'lang', 'remap', 'vendor', 'os', 'revisionflag', 'conformance', 'label', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'subtitle', 'simplesect', 'figure', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'formalpara', 'informalequation', 'warning', 'caution', 'informalexample', 'table', 'fieldsynopsis', 'funcsynopsis', 'literallayout', 'glosslist', 'index', 'msgset', 'bibliography', 'destructorsynopsis', 'title', 'highlights', 'section', 'bridgehead', 'tip', 'segmentedlist', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'lot', 'toc', 'sectioninfo', 'indexterm', 'abstract', 'calloutlist', 'blockquote', 'screenshot', 'screen', 'graphicco', 'remark', 'qandaset', 'epigraph', 'task', 'important', 'para', 'address', 'orderedlist', 'beginpage', 'classsynopsis', 'sidebar', 'mediaobjectco', 'simpara', 'anchor', 'refentry', 'glossary', 'programlistingco', 'graphic', 'example', 'authorblurb', 'synopsis', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist', 'equation', 'procedure']}, 'tr': {'attributes': ['revisionflag', 'onmousedown', 'char', 'xml:base', 'id', 'style', 'title', 'bgcolor', 'wordsize', 'onmousemove', 'onclick', 'valign', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'charoff', 'align', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['td', 'th']}, 'tbody': {'attributes': ['revisionflag', 'onmousedown', 'xml:base', 'id', 'style', 'title', 'wordsize', 'onmousemove', 'onclick', 'valign', 'role', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['tr', 'row']}, 'informaltable': {'attributes': ['orient', 'revisionflag', 'rowsep', 'tabstyle', 'frame', 'remap', 'onmousedown', 'xml:base', 'tocentry', 'border', 'id', 'style', 'title', 'label', 'pgwide', 'xml:lang', 'onmousemove', 'xreflabel', 'role', 'conformance', 'revision', 'rowheader', 'vendor', 'onclick', 'onmouseout', 'onkeypress', 'rules', 'colsep', 'onkeydown', 'floatstyle', 'cellpadding', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'cellspacing', 'align', 'shortentry', 'bgcolor', 'summary', 'wordsize', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'width', 'dir'], 'children': ['tgroup', 'colgroup', 'mediaobject', 'tr', 'tbody', 'graphic', 'tfoot', 'textobject', 'blockinfo', 'col', 'thead']}, 'emphasis': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'book': {'attributes': ['status', 'lang', 'remap', 'vendor', 'os', 'revisionflag', 'conformance', 'fpi', 'label', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['chapter', 'index', 'subtitle', 'colophon', 'reference', 'title', 'glossary', 'appendix', 'setindex', 'titleabbrev', 'article', 'bookinfo', 'bibliography', 'lot', 'preface', 'dedication', 'toc', 'part']}, 'listitem': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'userlevel', 'wordsize', 'role', 'dir', 'xreflabel', 'override', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'funcsynopsis', 'figure', 'cmdsynopsis', 'mediaobject', 'mediaobjectco', 'formalpara', 'informalequation', 'warning', 'caution', 'informalexample', 'fieldsynopsis', 'table', 'literallayout', 'glosslist', 'task', 'msgset', 'destructorsynopsis', 'authorblurb', 'highlights', 'bridgehead', 'tip', 'segmentedlist', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'indexterm', 'abstract', 'calloutlist', 'blockquote', 'screenshot', 'screen', 'graphicco', 'qandaset', 'epigraph', 'important', 'para', 'address', 'orderedlist', 'beginpage', 'classsynopsis', 'sidebar', 'remark', 'simpara', 'anchor', 'programlistingco', 'graphic', 'example', 'synopsis', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist', 'equation', 'procedure']}, 'sectioninfo': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['contractsponsor', 'isbn', 'contractnum', 'pubdate', 'productnumber', 'mediaobject', 'address', 'invpartnumber', 'itermset', 'printhistory', 'edition', 'modespec', 'pubsnumber', 'contrib', 'seriesvolnums', 'corpauthor', 'authorgroup', 'artpagenums', 'author', 'orgname', 'volumenum', 'confgroup', 'authorinitials', 'pagenums', 'editor', 'bibliorelation', 'honorific', 'corpname', 'indexterm', 'abstract', 'keywordset', 'subjectset', 'firstname', 'citebiblioid', 'title', 'issuenum', 'collab', 'othercredit', 'corpcredit', 'citetitle', 'biblioset', 'legalnotice', 'bibliomisc', 'date', 'othername', 'surname', 'lineage', 'publisher', 'biblioid', 'graphic', 'publishername', 'copyright', 'subtitle', 'affiliation', 'bibliocoverage', 'issn', 'bibliosource', 'productname', 'authorblurb', 'personname', 'abbrev', 'titleabbrev', 'releaseinfo', 'revhistory']}, 'chapterinfo': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['contractsponsor', 'isbn', 'contractnum', 'pubdate', 'productnumber', 'mediaobject', 'address', 'invpartnumber', 'itermset', 'printhistory', 'edition', 'modespec', 'pubsnumber', 'contrib', 'seriesvolnums', 'corpauthor', 'authorgroup', 'artpagenums', 'author', 'orgname', 'volumenum', 'confgroup', 'authorinitials', 'pagenums', 'editor', 'bibliorelation', 'honorific', 'corpname', 'indexterm', 'abstract', 'keywordset', 'subjectset', 'firstname', 'citebiblioid', 'title', 'issuenum', 'collab', 'othercredit', 'corpcredit', 'citetitle', 'biblioset', 'legalnotice', 'bibliomisc', 'date', 'othername', 'surname', 'lineage', 'publisher', 'biblioid', 'graphic', 'publishername', 'copyright', 'subtitle', 'affiliation', 'bibliocoverage', 'issn', 'bibliosource', 'productname', 'authorblurb', 'personname', 'abbrev', 'titleabbrev', 'releaseinfo', 'revhistory']}, 'math': {'attributes': [], 'children': []}, 'tfoot': {'attributes': ['revisionflag', 'onmousedown', 'xml:base', 'id', 'style', 'title', 'wordsize', 'onmousemove', 'onclick', 'valign', 'role', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['colspec', 'tr', 'row']}, 'tgroup': {'attributes': ['revisionflag', 'rowsep', 'cols', 'onmousedown', 'char', 'xml:base', 'id', 'style', 'title', 'xml:lang', 'onmousemove', 'xreflabel', 'role', 'charoff', 'revision', 'remap', 'vendor', 'onclick', 'onmouseout', 'onkeypress', 'colsep', 'onkeydown', 'onmouseover', 'userlevel', 'tgroupstyle', 'arch', 'class', 'condition', 'lang', 'conformance', 'align', 'wordsize', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['colspec', 'spanspec', 'tfoot', 'tbody', 'thead']}, 'blockquote': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'funcsynopsis', 'figure', 'cmdsynopsis', 'mediaobject', 'mediaobjectco', 'formalpara', 'informalequation', 'warning', 'caution', 'informalexample', 'fieldsynopsis', 'table', 'blockinfo', 'glosslist', 'literallayout', 'task', 'msgset', 'destructorsynopsis', 'title', 'highlights', 'bridgehead', 'tip', 'segmentedlist', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'indexterm', 'abstract', 'calloutlist', 'blockquote', 'attribution', 'screenshot', 'screen', 'graphicco', 'qandaset', 'epigraph', 'important', 'para', 'address', 'orderedlist', 'beginpage', 'classsynopsis', 'sidebar', 'remark', 'simpara', 'anchor', 'programlistingco', 'graphic', 'example', 'authorblurb', 'synopsis', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist', 'equation', 'procedure']}, 'para': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['mediaobjectco', 'code', 'keycombo', 'mediaobject', 'informalequation', 'modespec', 'guiicon', 'literallayout', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'calloutlist', 'blockquote', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'bibliolist', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'table', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'segmentedlist', 'filename', 'errorcode', 'informaltable', 'screenco', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'graphicco', 'acronym', 'screen', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'itemizedlist', 'package', 'varname', 'programlistingco', 'errortype', 'example', 'glosslist', 'ooclass', 'guibutton', 'structfield', 'programlisting', 'funcsynopsis', 'productnumber', 'authorinitials', 'address', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'figure', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'orderedlist', 'graphic', 'equation', 'inlinemediaobject', 'glossterm', 'simplelist', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'warning', 'caution', 'informalexample', 'phrase', 'xref', 'author', 'orgname', 'tip', 'synopsis', 'informalfigure', 'note', 'application', 'emphasis', 'returnvalue', 'variablelist', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'screenshot', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'important', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'quote': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'object': {'attributes': [], 'children': []}, 'bookinfo': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'dir', 'wordsize', 'role', 'condition', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'contents', 'revision'], 'children': ['contractsponsor', 'isbn', 'contractnum', 'pubdate', 'productnumber', 'mediaobject', 'address', 'invpartnumber', 'itermset', 'printhistory', 'edition', 'modespec', 'pubsnumber', 'contrib', 'seriesvolnums', 'corpauthor', 'authorgroup', 'artpagenums', 'author', 'orgname', 'volumenum', 'confgroup', 'authorinitials', 'pagenums', 'editor', 'bibliorelation', 'honorific', 'corpname', 'indexterm', 'abstract', 'keywordset', 'subjectset', 'firstname', 'citebiblioid', 'title', 'issuenum', 'collab', 'othercredit', 'corpcredit', 'citetitle', 'biblioset', 'legalnotice', 'bibliomisc', 'date', 'othername', 'surname', 'lineage', 'publisher', 'biblioid', 'graphic', 'publishername', 'copyright', 'subtitle', 'affiliation', 'bibliocoverage', 'issn', 'bibliosource', 'productname', 'authorblurb', 'personname', 'abbrev', 'titleabbrev', 'releaseinfo', 'revhistory']}, 'thead': {'attributes': ['revisionflag', 'onmousedown', 'xml:base', 'id', 'style', 'title', 'wordsize', 'onmousemove', 'onclick', 'valign', 'role', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'arch', 'class', 'condition', 'lang', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['colspec', 'tr', 'row']}, 'td': {'attributes': ['revisionflag', 'colspan', 'onmousedown', 'char', 'xml:base', 'nowrap', 'id', 'axis', 'style', 'rowspan', 'title', 'bgcolor', 'wordsize', 'onmousemove', 'onclick', 'valign', 'scope', 'conformance', 'revision', 'remap', 'vendor', 'xreflabel', 'onmouseout', 'onkeypress', 'onkeydown', 'onmouseover', 'userlevel', 'height', 'arch', 'class', 'condition', 'lang', 'charoff', 'align', 'headers', 'xml:lang', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'width', 'dir', 'abbr'], 'children': ['code', 'keycombo', 'mediaobject', 'modespec', 'guiicon', 'literallayout', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'calloutlist', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'bibliolist', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'table', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'simpara', 'segmentedlist', 'filename', 'errorcode', 'informaltable', 'screenco', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'screen', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'itemizedlist', 'package', 'varname', 'programlistingco', 'errortype', 'glosslist', 'ooclass', 'guibutton', 'structfield', 'programlisting', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'formalpara', 'literal', 'type', 'olink', 'function', 'option', 'para', 'corpcredit', 'link', 'foreignphrase', 'orderedlist', 'graphic', 'inlinemediaobject', 'glossterm', 'simplelist', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'warning', 'caution', 'phrase', 'xref', 'author', 'orgname', 'tip', 'synopsis', 'note', 'application', 'emphasis', 'returnvalue', 'variablelist', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'screenshot', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'important', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'ulink': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'url', 'arch', 'xrefstyle', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'revision', 'type', 'id', 'condition', 'conformance'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'entry': {'attributes': ['revisionflag', 'rowsep', 'spanname', 'remap', 'onmousedown', 'char', 'nameend', 'xml:base', 'id', 'style', 'title', 'xml:lang', 'morerows', 'xreflabel', 'valign', 'onmousemove', 'charoff', 'revision', 'namest', 'vendor', 'onclick', 'onmouseout', 'onkeypress', 'colname', 'colsep', 'onkeydown', 'onmouseover', 'userlevel', 'role', 'arch', 'class', 'condition', 'lang', 'rotate', 'conformance', 'align', 'wordsize', 'onmouseup', 'onkeyup', 'security', 'ondblclick', 'os', 'dir'], 'children': ['code', 'keycombo', 'mediaobject', 'modespec', 'guiicon', 'literallayout', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'calloutlist', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'bibliolist', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'simpara', 'segmentedlist', 'filename', 'errorcode', 'screenco', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'screen', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'itemizedlist', 'package', 'varname', 'programlistingco', 'errortype', 'glosslist', 'ooclass', 'guibutton', 'structfield', 'programlisting', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'formalpara', 'literal', 'type', 'olink', 'function', 'option', 'para', 'corpcredit', 'link', 'foreignphrase', 'orderedlist', 'graphic', 'inlinemediaobject', 'glossterm', 'simplelist', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'warning', 'caution', 'phrase', 'xref', 'author', 'orgname', 'tip', 'synopsis', 'note', 'application', 'emphasis', 'returnvalue', 'variablelist', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'screenshot', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'important', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'article': {'attributes': ['status', 'lang', 'remap', 'vendor', 'os', 'revisionflag', 'conformance', 'xml:base', 'class', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'parentbook', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['appendix', 'programlisting', 'subtitle', 'simplesect', 'figure', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'formalpara', 'informalequation', 'warning', 'caution', 'informalexample', 'table', 'fieldsynopsis', 'funcsynopsis', 'literallayout', 'glosslist', 'task', 'msgset', 'bibliography', 'destructorsynopsis', 'title', 'highlights', 'section', 'bridgehead', 'tip', 'segmentedlist', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'lot', 'ackno', 'sect1', 'indexterm', 'abstract', 'calloutlist', 'blockquote', 'screenshot', 'index', 'screen', 'graphicco', 'remark', 'qandaset', 'epigraph', 'important', 'para', 'address', 'toc', 'orderedlist', 'beginpage', 'classsynopsis', 'sidebar', 'mediaobjectco', 'simpara', 'anchor', 'colophon', 'refentry', 'tocchap', 'programlistingco', 'graphic', 'articleinfo', 'example', 'authorblurb', 'glossary', 'synopsis', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist', 'equation', 'procedure']}, 'orderedlist': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'continuation', 'spacing', 'dir', 'wordsize', 'role', 'condition', 'xreflabel', 'xml:base', 'userlevel', 'inheritnum', 'security', 'revision', 'arch', 'id', 'numeration', 'conformance'], 'children': ['programlisting', 'funcsynopsis', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'informalequation', 'fieldsynopsis', 'caution', 'informalexample', 'authorblurb', 'blockinfo', 'literallayout', 'destructorsynopsis', 'title', 'highlights', 'bridgehead', 'tip', 'formalpara', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'indexterm', 'abstract', 'listitem', 'blockquote', 'screenshot', 'screen', 'graphicco', 'remark', 'important', 'para', 'address', 'beginpage', 'classsynopsis', 'mediaobjectco', 'simpara', 'programlistingco', 'graphic', 'synopsis', 'warning', 'epigraph', 'anchor']}, 'subscript': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['remark', 'symbol', 'replaceable', 'inlinemediaobject', 'emphasis', 'ulink', 'link', 'subscript', 'inlinegraphic', 'anchor', 'olink', 'superscript']}, 'chapter': {'attributes': ['status', 'lang', 'remap', 'vendor', 'os', 'revisionflag', 'conformance', 'label', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'subtitle', 'simplesect', 'figure', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'formalpara', 'sect1', 'informalequation', 'tocchap', 'caution', 'informalexample', 'table', 'fieldsynopsis', 'funcsynopsis', 'literallayout', 'glosslist', 'graphicco', 'index', 'msgset', 'bibliography', 'destructorsynopsis', 'title', 'highlights', 'section', 'bridgehead', 'tip', 'segmentedlist', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'lot', 'toc', 'indexterm', 'chapterinfo', 'abstract', 'calloutlist', 'blockquote', 'screenshot', 'screen', 'beginpage', 'remark', 'qandaset', 'epigraph', 'task', 'important', 'para', 'address', 'orderedlist', 'classsynopsis', 'sidebar', 'mediaobjectco', 'simpara', 'anchor', 'refentry', 'glossary', 'programlistingco', 'graphic', 'example', 'authorblurb', 'synopsis', 'bibliolist', 'variablelist', 'simplelist', 'itemizedlist', 'warning', 'equation', 'procedure']}, 'term': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'imagedata': {'attributes': ['revisionflag', 'xml:base', 'id', 'srccredit', 'scale', 'width', 'contentdepth', 'role', 'xreflabel', 'valign', 'conformance', 'revision', 'remap', 'scalefit', 'vendor', 'format', 'userlevel', 'fileref', 'arch', 'condition', 'lang', 'align', 'depth', 'wordsize', 'entityref', 'contentwidth', 'security', 'os', 'dir'], 'children': []}, 'title': {'attributes': ['lang', 'revisionflag', 'remap', 'pagenum', 'os', 'conformance', 'xml:base', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'vendor', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'filename', 'errorcode', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'productnumber', 'authorinitials', 'classname', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'articleinfo': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['contractsponsor', 'isbn', 'contractnum', 'pubdate', 'productnumber', 'mediaobject', 'address', 'invpartnumber', 'itermset', 'printhistory', 'edition', 'modespec', 'pubsnumber', 'contrib', 'seriesvolnums', 'corpauthor', 'authorgroup', 'artpagenums', 'author', 'orgname', 'volumenum', 'confgroup', 'authorinitials', 'pagenums', 'editor', 'bibliorelation', 'honorific', 'corpname', 'indexterm', 'abstract', 'keywordset', 'subjectset', 'firstname', 'citebiblioid', 'title', 'issuenum', 'collab', 'othercredit', 'corpcredit', 'citetitle', 'biblioset', 'legalnotice', 'bibliomisc', 'date', 'othername', 'surname', 'lineage', 'publisher', 'biblioid', 'graphic', 'publishername', 'copyright', 'subtitle', 'affiliation', 'bibliocoverage', 'issn', 'bibliosource', 'productname', 'authorblurb', 'personname', 'abbrev', 'titleabbrev', 'releaseinfo', 'revhistory']}, 'inlinemediaobject': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['audioobject', 'videoobject', 'imageobject', 'imageobjectco', 'textobject', 'objectinfo']}, 'variablelist': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'termlength', 'conformance', 'spacing', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'funcsynopsis', 'varlistentry', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'informalequation', 'fieldsynopsis', 'caution', 'informalexample', 'authorblurb', 'blockinfo', 'literallayout', 'destructorsynopsis', 'title', 'highlights', 'bridgehead', 'tip', 'formalpara', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'indexterm', 'abstract', 'blockquote', 'screenshot', 'screen', 'graphicco', 'remark', 'important', 'para', 'address', 'beginpage', 'classsynopsis', 'mediaobjectco', 'simpara', 'programlistingco', 'graphic', 'synopsis', 'warning', 'epigraph', 'anchor']}, 'link': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'arch', 'endterm', 'xrefstyle', 'linkend', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'revision', 'type', 'id', 'condition', 'conformance'], 'children': ['code', 'keycombo', 'modespec', 'guiicon', 'guimenu', 'guisubmenu', 'userinput', 'errortext', 'methodsynopsis', 'footnoteref', 'inlineequation', 'structname', 'interfacename', 'mousebutton', 'envar', 'othercredit', 'ulink', 'methodname', 'guimenuitem', 'classsynopsis', 'systemitem', 'keycap', 'productname', 'token', 'citerefentry', 'medialabel', 'guilabel', 'termdef', 'wordasword', 'corpauthor', 'ooexception', 'destructorsynopsis', 'filename', 'errorcode', 'constructorsynopsis', 'computeroutput', 'subscript', 'email', 'acronym', 'replaceable', 'citetitle', 'exceptionname', 'oointerface', 'revhistory', 'interface', 'optional', 'keycode', 'remark', 'package', 'varname', 'errortype', 'ooclass', 'guibutton', 'structfield', 'funcsynopsis', 'productnumber', 'authorinitials', 'classname', 'fieldsynopsis', 'prompt', 'inlinegraphic', 'personname', 'trademark', 'literal', 'type', 'olink', 'function', 'option', 'corpcredit', 'link', 'foreignphrase', 'inlinemediaobject', 'glossterm', 'property', 'anchor', 'constant', 'menuchoice', 'footnote', 'citation', 'errorname', 'hardware', 'phrase', 'xref', 'author', 'orgname', 'synopsis', 'application', 'emphasis', 'returnvalue', 'indexterm', 'parameter', 'firstterm', 'sgmltag', 'quote', 'symbol', 'beginpage', 'cmdsynopsis', 'action', 'biblioref', 'database', 'markup', 'uri', 'abbrev', 'command', 'keysym', 'superscript']}, 'itemizedlist': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'spacing', 'mark', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['programlisting', 'funcsynopsis', 'cmdsynopsis', 'mediaobject', 'titleabbrev', 'informalequation', 'fieldsynopsis', 'caution', 'informalexample', 'authorblurb', 'blockinfo', 'literallayout', 'destructorsynopsis', 'title', 'highlights', 'bridgehead', 'tip', 'formalpara', 'informalfigure', 'methodsynopsis', 'note', 'informaltable', 'screenco', 'constructorsynopsis', 'indexterm', 'abstract', 'listitem', 'blockquote', 'screenshot', 'screen', 'graphicco', 'remark', 'important', 'para', 'address', 'beginpage', 'classsynopsis', 'mediaobjectco', 'simpara', 'programlistingco', 'graphic', 'synopsis', 'warning', 'epigraph', 'anchor']}, 'superscript': {'attributes': ['lang', 'revisionflag', 'remap', 'vendor', 'os', 'conformance', 'wordsize', 'role', 'dir', 'xreflabel', 'userlevel', 'xml:base', 'security', 'arch', 'id', 'condition', 'revision'], 'children': ['remark', 'symbol', 'replaceable', 'inlinemediaobject', 'emphasis', 'ulink', 'link', 'subscript', 'inlinegraphic', 'anchor', 'olink', 'superscript']}}
diff --git a/wiki-to-help/mwlib_mods/docbook_grammar.py b/wiki-to-help/mwlib_mods/docbook_grammar.py
new file mode 100644
index 0000000000..ebef889f49
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/docbook_grammar.py
@@ -0,0 +1,11 @@
+"""
+New docbook grammar enables more tags.
+"""
+
+## Set up docbookwriter.grammar
+import mwlib.docbookwriter
+import docbook45grammar
+
+def apply():
+ mwlib.docbookwriter.grammar = docbook45grammar.grammar
+
diff --git a/wiki-to-help/mwlib_mods/docbook_internLinks.py b/wiki-to-help/mwlib_mods/docbook_internLinks.py
new file mode 100644
index 0000000000..2d22edd164
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/docbook_internLinks.py
@@ -0,0 +1,76 @@
+"""
+This enables the conversion of article links to internal links within the docbook output.
+Usage:
+ import docbook_internLinks
+ docbook_internLinks.apply()
+Requires:
+ docbook_grammar
+
+Author: Timo Richter
+"""
+
+## Set up nuwiki.adapt
+import mwlib.nuwiki
+class MyAdapt(mwlib.nuwiki.adapt):
+ def getParsedArticle(self, title, revision=None):
+ """ Add the original title to the attributes of each article """
+ a = super(MyAdapt,self).getParsedArticle(title,revision)
+ if a:
+ a.title = title
+ return a
+ def getURL(self, name, revision=None, defaultns=None):
+ """ Returns raw link targets """
+ return name
+
+def setupAdapt():
+ mwlib.nuwiki.adapt = MyAdapt
+
+
+## Set up docbookwriter
+import mwlib.docbookwriter
+#import lxml.etree
+Element = mwlib.docbookwriter.Element
+SubElement = mwlib.docbookwriter.SubElement
+class MyDocBookWriter(mwlib.docbookwriter.DocBookWriter):
+ def getTargetId(self,title):
+ """ Transform "The first article" to "The_first_article" """
+ # See mwlib.zipwiki.normalize_title()
+ return title.replace(" ","_")
+
+ def dbwriteArticle(self, a):
+ """
+ Add id-attribute with original title to all articles.
+ <article id="a.title">
+ """
+ e = super(MyDocBookWriter,self).dbwriteArticle(a)
+ targetId = self.getTargetId(a.title)
+ e.set("id",targetId)
+ return e
+
+ def dbwriteArticleLink(self, obj):
+ a = Element("link")
+ if obj.target:
+ a.set("linkend", obj.target)
+ if not obj.children:
+ a.text = obj.target
+ return a
+ #dbwriteLink = dbwriteURL
+ #dbwriteNamedURL = dbwriteURL
+ #dbwriteSpecialLink = dbwriteURL
+ #dbwriteCategoryLink = dbwriteURL
+ #dbwriteLangLink = dbwriteURL
+ #dbwriteArticleLink = dbwriteLink
+ #dbwriteLangLink = dbwriteLink # FIXME
+ #dbwriteNamespaceLink = dbwriteLink# FIXME
+ #dbwriteInterwikiLink = dbwriteLink# FIXME
+ #dbwriteSpecialLink = dbwriteLink# FIXME
+
+def setupDocBookWriter():
+ mwlib.docbookwriter.DocBookWriter = MyDocBookWriter
+
+def apply():
+ setupAdapt()
+ #setupGrammar()
+ setupDocBookWriter()
+
+
diff --git a/wiki-to-help/mwlib_mods/docbook_table_tags.py b/wiki-to-help/mwlib_mods/docbook_table_tags.py
new file mode 100644
index 0000000000..7ec527b753
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/docbook_table_tags.py
@@ -0,0 +1,93 @@
+"""
+Create docbook- instead of HTML-tables.
+
+Requires:
+ docbook_grammar
+
+Example of a docbook table:
+
+<table frame='all'><title>Sample Table</title>
+<tgroup cols='5' align='left' colsep='1' rowsep='1'>
+<colspec colname='c1'/>
+<colspec colname='c2'/>
+<colspec colname='c3'/>
+<colspec colnum='5' colname='c5'/>
+<thead>
+<row>
+ <entry namest="c1" nameend="c2" align="center">Horizontal Span</entry>
+ <entry>a3</entry>
+ <entry>a4</entry>
+ <entry>a5</entry>
+</row>
+</thead>
+<tfoot>
+<row>
+ <entry>f1</entry>
+ <entry>f2</entry>
+ <entry>f3</entry>
+ <entry>f4</entry>
+ <entry>f5</entry>
+</row>
+</tfoot>
+<tbody>
+<row>
+ <entry>b1</entry>
+ <entry>b2</entry>
+ <entry>b3</entry>
+ <entry>b4</entry>
+ <entry morerows='1' valign='middle'><para> <!-- Pernicous Mixed Content -->
+ Vertical Span</para></entry>
+</row>
+<row>
+ <entry>c1</entry>
+ <entry namest="c2" nameend="c3" align='center' morerows='1' valign='bottom'>Span Both</entry>
+ <entry>c4</entry>
+</row>
+<row>
+ <entry>d1</entry>
+ <entry>d4</entry>
+ <entry>d5</entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+
+Example from http://www.docbook.org/tdg/en/html/table.html
+"""
+
+## Set up docbookwriter
+import mwlib.docbookwriter
+Element = mwlib.docbookwriter.Element
+SubElement = mwlib.docbookwriter.SubElement
+setVList=mwlib.docbookwriter.setVList
+class MyDocBookWriter(mwlib.docbookwriter.DocBookWriter):
+ def dbwriteTable(self, t):
+ """
+ rowspan & colspan are supported
+ nested tables not supported in DocBook V4.4
+ """
+ table = Element("informaltable") #border=1
+ tgroup = SubElement(table,"tgroup",cols="1") # FIXME: cols=1 is not always correct
+
+ tbody = SubElement(tgroup,"tbody")
+ setVList(table, t)
+ if t.caption:
+ #c = SubElement(table, "caption")
+ #self.writeText(t.caption, c)
+ pass
+ table.writeto = tbody
+ #docbookwriter.py l 220
+ return table
+
+ def dbwriteCell(self, cell):
+ td = Element("entry")
+ #setVList(td, cell)
+ return td
+
+ def dbwriteRow(self, row):
+ return Element("row")
+
+
+def apply():
+ mwlib.docbookwriter.DocBookWriter = MyDocBookWriter
+
diff --git a/wiki-to-help/mwlib_mods/docbookwriter_options.py b/wiki-to-help/mwlib_mods/docbookwriter_options.py
new file mode 100644
index 0000000000..e5b4350f96
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/docbookwriter_options.py
@@ -0,0 +1,54 @@
+"""
+This enables -L, --language and -W for docbook output.
+Additionally the magic word IMAGENAME will contain the imagename instead of "IMAGE:imagename"
+
+Example:
+ mw-render -w docbook -L de -W debug=True;imagesrcresolver=/home/images/IMAGENAME
+
+The content of writer() belongs to the mwlib.
+
+"""
+
+from mwlib.docbookwriter import *
+def writer(env, output, status_callback, **args): # changed
+ """ This is the function for external use. It is called by apps.render """
+ if status_callback:
+ buildbook_status = status_callback.getSubRange(0, 50)
+ else:
+ buildbook_status = None
+ book = writerbase.build_book(env, status_callback=buildbook_status)
+ scb = lambda status, progress : status_callback is not None and status_callback(status=status, progress=progress)
+ scb(status='preprocessing', progress=50)
+ for c in book.children:
+ preprocess(c)
+ scb(status='rendering', progress=60)
+
+ args["language"] = args["lang"] # changed
+ del args["lang"] # changed
+ mwlib.docbookwriter.DocBookWriter(env, status_callback=scb, documenttype="book", **args).writeBook(book, output=output) # changed
+
+def setupWriter():
+ mwlib.docbookwriter.writer = writer
+ mwlib.docbookwriter.writer.options = \
+ ["documenttype","lang","imagesrcresolver","debug"]
+
+
+
+import mwlib.docbookwriter
+class MyDocBookWriter(mwlib.docbookwriter.DocBookWriter):
+ def dbwriteImageLink(self, obj):
+ if obj.target:
+ name = obj.target
+ obj.target = name[name.find(":") + 1:]
+ return super(MyDocBookWriter,self).dbwriteImageLink(obj)
+
+def setupDocBookWriter():
+ mwlib.docbookwriter.DocBookWriter = MyDocBookWriter
+
+
+
+def apply():
+ setupWriter()
+ setupDocBookWriter()
+
+
diff --git a/wiki-to-help/mwlib_mods/indexterm_from_title.py b/wiki-to-help/mwlib_mods/indexterm_from_title.py
new file mode 100644
index 0000000000..53d3cfdefa
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/indexterm_from_title.py
@@ -0,0 +1,24 @@
+"""
+Adds
+<indexterm><primary>TITLE</primary></indexterm>
+to each <article>
+"""
+
+## Set up docbookwriter
+import mwlib.docbookwriter
+#import lxml.etree
+SubElement = mwlib.docbookwriter.SubElement
+class MyDocBookWriter(mwlib.docbookwriter.DocBookWriter):
+ def dbwriteArticle(self, a):
+ """
+ Add <indexterm><primary>a.caption</primary></indexterm>
+ """
+ e = super(MyDocBookWriter,self).dbwriteArticle(a)
+ i = SubElement(e,"indexterm")
+ p = SubElement(i,"primary")
+ p.text = a.caption
+ return e
+
+def apply():
+ mwlib.docbookwriter.DocBookWriter = MyDocBookWriter
+
diff --git a/wiki-to-help/mwlib_mods/no_sections.py b/wiki-to-help/mwlib_mods/no_sections.py
new file mode 100644
index 0000000000..d01b7b9514
--- /dev/null
+++ b/wiki-to-help/mwlib_mods/no_sections.py
@@ -0,0 +1,38 @@
+"""
+Writes <article>...</article> instead of <article><section>...</section></article>.
+
+"""
+
+import mwlib.docbookwriter
+#import lxml.etree
+Element = mwlib.docbookwriter.Element
+SubElement = mwlib.docbookwriter.SubElement
+class MyDocBookWriter(mwlib.docbookwriter.DocBookWriter):
+ def dbwriteArticle(self, a):
+ """
+ this generates the root element if not available
+ """
+ #e = super(MyDocBookWriter,self).dbwriteArticle(a)
+ #e.remove(e.find("section"))
+ #return e
+ # add head + title
+ e = Element("article", lang=self.language)
+ if self.root is None:
+ self.root = e
+ h = SubElement(e,"articleinfo")
+ t = SubElement(h, "title")
+ if a.caption:
+ t.text = a.caption
+
+ # DONT add a section and heading for this article
+ #s = SubElement(e, "section")
+ #si = SubElement(s, "sectioninfo")
+ #h = SubElement(si, "title")
+ #h.text = a.caption
+ #e.writeto = s
+ return e
+
+def apply():
+ mwlib.docbookwriter.DocBookWriter = MyDocBookWriter
+
+
diff --git a/wiki-to-help/nfo.json b/wiki-to-help/nfo.json
new file mode 100644
index 0000000000..ae6b9c80ee
--- /dev/null
+++ b/wiki-to-help/nfo.json
@@ -0,0 +1,5 @@
+{
+ "base_url": "http://help.libreoffice.org/",
+ "format": "nuwiki",
+ "script_extension": ".php"
+}
diff --git a/wiki-to-help/test2.xml b/wiki-to-help/test2.xml
new file mode 100644
index 0000000000..6cda28dc08
--- /dev/null
+++ b/wiki-to-help/test2.xml
@@ -0,0 +1,489 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">
+ <siteinfo>
+ <sitename>LibreOffice Help</sitename>
+ <base>http://gimli/Main_Page</base>
+ <generator>MediaWiki 1.16.0</generator>
+ <case>first-letter</case>
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="4" case="first-letter">LibreOffice Help</namespace>
+ <namespace key="5" case="first-letter">LibreOffice Help talk</namespace>
+ <namespace key="6" case="first-letter">File</namespace>
+ <namespace key="7" case="first-letter">File talk</namespace>
+ <namespace key="8" case="first-letter">MediaWiki</namespace>
+ <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+ <namespace key="10" case="first-letter">Template</namespace>
+ <namespace key="11" case="first-letter">Template talk</namespace>
+ <namespace key="12" case="first-letter">Help</namespace>
+ <namespace key="13" case="first-letter">Help talk</namespace>
+ <namespace key="14" case="first-letter">Category</namespace>
+ <namespace key="15" case="first-letter">Category talk</namespace>
+ </namespaces>
+ </siteinfo>
+ <page>
+ <title>Main Page</title>
+ <id>1</id>
+ <revision>
+ <id>120128</id>
+ <timestamp>2011-02-17T21:54:02Z</timestamp>
+ <contributor>
+ <username>Kendy</username>
+ <id>2</id>
+ </contributor>
+ <comment>Added Basic help.</comment>
+ <text xml:space="preserve">{{OrigLang|Welcome to {{ProductName}} Help!}}
+Thank you for using the [http://www.documentfoundation.org/download/ {{ProductName}}] application help. Press F1 whenever you need help using the {{ProductName}} software, and you will be redirected to this site. Alternatively, you can install an off-line version of the help in your native language.
+
+If you only want to browse the help, please use the following entry points for easier navigation:
+
+* [[Writer/Welcome_to_the_Writer_Help|{{ProductName}} Writer]] (text processing)
+* [[Calc/Welcome_to_the_Calc_Help|{{ProductName}} Calc]] (spreadsheets)
+* [[Impress/Welcome_to_the_Impress_Help|{{ProductName}} Impress]] (presentations)
+* [[Draw/Welcome_to_the_Draw_Help|{{ProductName}} Draw]] (drawing)
+* [[Common/Database_1|{{ProductName}} Base]] (database processing)
+* [[Math/Welcome_to_the_Math_Help|{{ProductName}} Math]] (formula editing)
+* [[Basic/Basic_Help|{{ProductName}} Basic]] (programming using the Basic language)
+
+== How to Participate ==
+
+At the moment, we are still fine-tuning the tools converting the off-line help to the on-line form. Later, you will be able to participate, and improve the help pages. The plans are described in [http://wiki.documentfoundation.org/Development/Wikihelp The Document Foundation wiki].
+
+Consult the [http://meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/.uno:GraphicFilterSolarize</title>
+ <id>2</id>
+ <redirect />
+ <revision>
+ <id>43159</id>
+ <timestamp>2010-12-17T15:23:21Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/Graphic Filter Bar#bm id3154910]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/Graphic_Filter_Bar#bm_id3154910]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/59886</title>
+ <id>3</id>
+ <redirect />
+ <revision>
+ <id>43160</id>
+ <timestamp>2010-12-17T15:23:21Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/Presentation Wizard Page 1#bm id3155136]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/Presentation_Wizard_Page_1#bm_id3155136]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/704807947</title>
+ <id>4</id>
+ <redirect />
+ <revision>
+ <id>43161</id>
+ <timestamp>2010-12-17T15:23:22Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/Accessibility#bm id3153881]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/Accessibility#bm_id3153881]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/.uno:SelectTable</title>
+ <id>5</id>
+ <redirect />
+ <revision>
+ <id>43162</id>
+ <timestamp>2010-12-17T15:23:22Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Writer/Table#bm id3954588]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Writer/Table#bm_id3954588]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/859636226</title>
+ <id>6</id>
+ <redirect />
+ <revision>
+ <id>43163</id>
+ <timestamp>2010-12-17T15:23:23Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/Address Data Source#bm id611896]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/Address_Data_Source#bm_id611896]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/546685977</title>
+ <id>7</id>
+ <redirect />
+ <revision>
+ <id>43164</id>
+ <timestamp>2010-12-17T15:23:24Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/General 2#bm id3145750]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/General_2#bm_id3145750]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/1417988121</title>
+ <id>8</id>
+ <redirect />
+ <revision>
+ <id>43165</id>
+ <timestamp>2010-12-17T15:23:24Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Writer/Caption#bm id7607959]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Writer/Caption#bm_id7607959]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/34666</title>
+ <id>9</id>
+ <redirect />
+ <revision>
+ <id>43166</id>
+ <timestamp>2010-12-17T15:23:25Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Common/Euro Converter Wizard#bm id3152960]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Common/Euro_Converter_Wizard#bm_id3152960]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Swriter/54892</title>
+ <id>10</id>
+ <redirect />
+ <revision>
+ <id>43167</id>
+ <timestamp>2010-12-17T15:23:25Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Redirected page to [[Writer/Define Bibliography Entry#bm id3149689]]</comment>
+ <text xml:space="preserve">#REDIRECT [[Writer/Define_Bibliography_Entry#bm_id3149689]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Size/da</title>
+ <id>87185</id>
+ <revision>
+ <id>131455</id>
+ <timestamp>2011-03-01T17:57:01Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|Størrelse}} &lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt; Sæt skriftstørrelsen for den markerede tekst. Åbn genvejsmenu - vælg '''Størrelse'''&quot;</comment>
+ <text xml:space="preserve">{{Lang|Størrelse}}
+&lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt;
+Sæt skriftstørrelsen for den markerede tekst.
+
+Åbn genvejsmenu - vælg '''Størrelse'''</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Size/zh-TW</title>
+ <id>87186</id>
+ <revision>
+ <id>131456</id>
+ <timestamp>2011-03-01T17:57:02Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|大小}} &lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt; 設定所選文字的字型大小。 右鍵功能表'''「大小」'''&quot;</comment>
+ <text xml:space="preserve">{{Lang|大小}}
+&lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt;
+設定所選文字的字型大小。
+
+右鍵功能表'''「大小」'''</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Size/zh-CN</title>
+ <id>87187</id>
+ <revision>
+ <id>131457</id>
+ <timestamp>2011-03-01T17:57:03Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|大小}} &lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt; 设置选定文字的字体大小。 打开上下文菜单 - 选择'''大小'''&quot;</comment>
+ <text xml:space="preserve">{{Lang|大小}}
+&lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt;
+设置选定文字的字体大小。
+
+打开上下文菜单 - 选择'''大小'''</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Size/ko</title>
+ <id>87188</id>
+ <revision>
+ <id>131458</id>
+ <timestamp>2011-03-01T17:57:04Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|크기}} &lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt; 선택한 텍스트의 글꼴 크기를 설정합니다. '''크기''' 콘텍스트 메뉴&quot;</comment>
+ <text xml:space="preserve">{{Lang|크기}}
+&lt;div id=&quot;bm_id3153391&quot;&gt;&lt;/div&gt;
+선택한 텍스트의 글꼴 크기를 설정합니다.
+
+'''크기''' 콘텍스트 메뉴</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Creating a New Database/sv</title>
+ <id>87189</id>
+ <revision>
+ <id>131459</id>
+ <timestamp>2011-03-01T17:57:05Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|Skapa en ny databas}} &lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt; &lt;!-- mw deleted &quot;creating;&quot; --&gt;#Välj '''Arkiv - Nytt - Databas'''.&lt;br/&gt;&lt;br/&gt;Då öppnas [[Common/Database_Wizard/sv|Da...&quot;</comment>
+ <text xml:space="preserve">{{Lang|Skapa en ny databas}}
+&lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt;
+&lt;!-- mw deleted &quot;creating;&quot; --&gt;#Välj '''Arkiv - Nytt - Databas'''.&lt;br/&gt;&lt;br/&gt;Då öppnas [[Common/Database_Wizard/sv|Databasguiden]] där du skapar en ny databasfil.&lt;br/&gt;
+#I Databasguiden väljer du typ av databas och du kan välja att öppna Tabellguiden som nästa guide.&lt;br/&gt;&lt;br/&gt;I [[Common/Table_Wizard/sv|Tabellguiden]] får du hjälp med att infoga en tabell i den nya databasfilen.&lt;br/&gt;
+
+{{RelatedTopics|[[Common/Database_1/sv|Använda databaser i {{ProductName}} Base]]
+
+[[Common/Database_Overview/sv|Databasöversikt]]
+
+}}</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Creating a New Database/da</title>
+ <id>87190</id>
+ <revision>
+ <id>131460</id>
+ <timestamp>2011-03-01T17:57:06Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|Oprette en ny Database}} &lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt; &lt;!-- mw deleted &quot;creating;&quot; --&gt;#Vælg '''Filer - Ny(t) - Database'''.&lt;br/&gt;&lt;br/&gt;Dette åbner [[Common/Database_Wizard...&quot;</comment>
+ <text xml:space="preserve">{{Lang|Oprette en ny Database}}
+&lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt;
+&lt;!-- mw deleted &quot;creating;&quot; --&gt;#Vælg '''Filer - Ny(t) - Database'''.&lt;br/&gt;&lt;br/&gt;Dette åbner [[Common/Database_Wizard/da|Databaseguiden]], hvor du kan oprette en ny databasefil.&lt;br/&gt;
+#I Databaseguiden vælges typen af database og vælg indstillingen for at åbne Tabelguiden som den næste guide.&lt;br/&gt;&lt;br/&gt;[[Common/Table_Wizard/da|Tabelguiden]] hjælper dig med at tilføje en tabel til den nye databasefil.&lt;br/&gt;
+
+{{RelatedTopics|[[Common/Database_1/da|Brug af databaser i {{ProductName}} Base]]
+
+[[Common/Database_Overview/da|Databaseoversigt]]
+
+}}</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Creating a New Database/zh-TW</title>
+ <id>87191</id>
+ <revision>
+ <id>131461</id>
+ <timestamp>2011-03-01T17:57:07Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|建立新的資料庫}} &lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt; &lt;!-- mw deleted &quot;creating;&quot; --&gt;#選擇 '''[檔案] - [開啟新檔] - [資料庫]'''。&lt;br/&gt;&lt;br/&gt;這會開啟[[Common...&quot;</comment>
+ <text xml:space="preserve">{{Lang|建立新的資料庫}}
+&lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt;
+&lt;!-- mw deleted &quot;creating;&quot; --&gt;#選擇 '''[檔案] - [開啟新檔] - [資料庫]'''。&lt;br/&gt;&lt;br/&gt;這會開啟[[Common/Database_Wizard/zh-TW|資料庫精靈]],您可在其中建立新的資料庫檔案。&lt;br/&gt;
+#在「資料庫精靈」中,選取資料庫類型,然後選取要開啟「表格精靈」作為下一個精靈的選項。&lt;br/&gt;&lt;br/&gt;[[Common/Table_Wizard/zh-TW|表格精靈]]可協助您在新的資料庫檔案中增加表格。&lt;br/&gt;
+
+{{RelatedTopics|[[Common/Database_1/zh-TW|在 {{ProductName}} Base 中使用資料庫]]
+
+[[Common/Database_Overview/zh-TW|資料庫簡介]]
+
+}}</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Creating a New Database/zh-CN</title>
+ <id>87192</id>
+ <revision>
+ <id>131462</id>
+ <timestamp>2011-03-01T17:57:08Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|创建新数据库}} &lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt; &lt;!-- mw deleted &quot;creating;&quot; --&gt;#选择'''文件 - 新建 - 数据库'''。&lt;br/&gt;&lt;br/&gt;这样可打开[[Common/Database_Wiz...&quot;</comment>
+ <text xml:space="preserve">{{Lang|创建新数据库}}
+&lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt;
+&lt;!-- mw deleted &quot;creating;&quot; --&gt;#选择'''文件 - 新建 - 数据库'''。&lt;br/&gt;&lt;br/&gt;这样可打开[[Common/Database_Wizard/zh-CN|数据库向导]],利用该向导可创建新的数据库文件。&lt;br/&gt;
+#在“数据库向导”中,选择数据库类型,然后选择此选项打开作为下一向导的“表格向导”。&lt;br/&gt;&lt;br/&gt;[[Common/Table_Wizard/zh-CN|表格向导]]可帮助您在新数据库文件中添加表格。&lt;br/&gt;
+
+{{RelatedTopics|[[Common/Database_1/zh-CN|在 {{ProductName}} Base 中使用数据库]]
+
+[[Common/Database_Overview/zh-CN|数据源摘要]]
+
+}}</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Creating a New Database/ko</title>
+ <id>87193</id>
+ <revision>
+ <id>131463</id>
+ <timestamp>2011-03-01T17:57:09Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <comment>Created page with &quot;{{Lang|새 데이터베이스 만들기}} &lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt; &lt;!-- mw deleted &quot;creating;&quot; --&gt;#'''파일 - 새로 만들기 - 데이터베이스'''를 선택합니다.&lt;b...&quot;</comment>
+ <text xml:space="preserve">{{Lang|새 데이터베이스 만들기}}
+&lt;div id=&quot;bm_id6911526&quot;&gt;&lt;/div&gt;
+&lt;!-- mw deleted &quot;creating;&quot; --&gt;#'''파일 - 새로 만들기 - 데이터베이스'''를 선택합니다.&lt;br/&gt;&lt;br/&gt;새 데이터베이스 파일을 만들 수 있는 [[Common/Database_Wizard/ko|데이터베이스 마법사]]가 열립니다.&lt;br/&gt;
+#데이터베이스 마법사에서 데이터베이스 유형을 선택한 다음 테이블 마법사를 다음 마법사로 여는 옵션을 선택합니다.&lt;br/&gt;&lt;br/&gt;[[Common/Table_Wizard/ko|테이블 마법사]]를 사용하면 새 데이터베이스 파일에 테이블을 추가할 수 있습니다.&lt;br/&gt;
+
+{{RelatedTopics|[[Common/Database_1/ko|{{ProductName}} Base에서 데이터베이스 사용]]
+
+[[Common/Database_Overview/ko|데이터베이스 개요]]
+
+}}</text>
+ </revision>
+ </page>
+ <page>
+ <title>Writer/Welcome to the Writer Help</title>
+ <id>6009</id>
+ <revision>
+ <id>82722</id>
+ <timestamp>2011-01-19T15:11:59Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <text xml:space="preserve">{{OrigLang|Welcome to the {{ProductName}} Writer Help}}
+&lt;div id=&quot;bm_id3147244&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;bm_id3147247&quot;&gt;&lt;/div&gt;
+=== Working With {{ProductName}} Writer ===
+
+[[Writer/Writer_Features|{{ProductName}} Writer Features]]
+
+[[Writer/Instructions_for_Using_Writer|Instructions for Using {{ProductName}} Writer]]
+
+[[Chart/Charts_in|Using Charts in {{ProductName}}]]
+
+[[Common/Database_1|Using Databases in {{ProductName}} Base]]
+
+=== Menus, Toolbars, and Keys ===
+
+[[Writer/Menus|Menus]]
+
+[[Writer/Toolbars|Toolbars]]
+
+[[Writer/Shortcut_Keys_for_Writer|Shortcut Keys for {{ProductName}} Writer]]
+
+=== Getting Help ===
+
+&lt;!-- this section is displayed on all module main pages above the other &quot;Help about Help&quot; links. --&gt;The Help references the default settings of the program on a system that is set to defaults. Descriptions of colors, mouse actions, or other configurable items can be different for your program and system.
+
+[[Common/The_Help_Window|The {{ProductName}} Help Window]]
+
+[[Common/Help_Agent,_Tips_and_Extended_Tips|Help Agent, Tips and Extended Tips]]
+
+[[Common/Index_-_Keyword_Search_in_the_Help|Index - Keyword Search in the Help]]
+
+[[Common/Find_-_The_Full-Text_Search|Find - The Full-Text Search]]
+
+[[Common/Managing_Bookmarks|Managing Bookmarks]]
+
+[[Common/Contents_-_The_Main_Help_Topics|Contents - The Main Help Topics]]
+
+[[Common/Getting_Support|Getting Support]]</text>
+ </revision>
+ </page>
+ <page>
+ <title>Common/Dragging and Dropping Within a Document</title>
+ <id>40966</id>
+ <revision>
+ <id>86420</id>
+ <timestamp>2011-01-19T16:04:35Z</timestamp>
+ <contributor>
+ <username>WikiSysop</username>
+ <id>1</id>
+ </contributor>
+ <text xml:space="preserve">{{OrigLang|Dragging and Dropping Within a {{ProductName}} Document}}
+&lt;div id=&quot;bm_id3154927&quot;&gt;&lt;/div&gt;
+There are many options for moving or copying objects using drag-and-drop. Text sections, drawing objects, graphics, form controls, hyperlinks, cell ranges, and many more can be moved or copied with the mouse.
+
+Note that the mouse pointer displays a plus sign when copying and an arrow when creating a link or hyperlink.
+
+{| border=&quot;1&quot;
+|-
+! scope=&quot;col&quot; | Mouse Pointer
+! scope=&quot;col&quot; | Description
+|-
+| [[Image:movedata.png|border|left|8.47mmx8.47mm|Mouse pointer moving data]]
+| Moving
+|-
+| [[Image:copydata.png|border|left|8.47mmx8.47mm|Mouse pointer copying data]]
+| Copying
+|-
+| [[Image:linkdata.png|border|left|8.47mmx8.47mm|Mouse pointer inserting link]]
+| Creating a link
+|}
+
+If you press {{System|default=Ctrl|mac=Command}} or Shift+{{System|default=Ctrl|mac=Command}} while releasing the mouse button, you can control whether the object is copied, moved, or a link is created.
+
+{| border=&quot;1&quot;
+|-
+| [[Image:sc20238.png|border|left|5.64mmx5.64mm|Icon]]
+| If you drag objects out of the [[Common/Navigator_for_Document_Overview|Navigator]], you can specify in the submenu of the Navigator's '''Drag Mode''' icon whether to copy the object, insert it as a link or insert it as a hyperlink.
+|}
+
+{{Tip|You can cancel a drag-and-drop operation in {{ProductName}} at any time by pressing the Esc key before releasing the mouse button.}}
+
+'''Related Topics'''
+
+[[Common/Copying_Graphics_Between_Documents|Copying Graphics Between Documents]]
+
+[[Common/Copying_Spreadsheet_Areas_to_Text_Documents|Copying Spreadsheet Areas to Text Documents]]
+
+[[Common/Copying_Graphics_From_the_Gallery|Copying Graphics From the Gallery]]
+
+[[Common/Adding_Graphics_to_the_Gallery|Adding Graphics to the Gallery]]
+
+{{WhenInWriter|[[Writer/Moving_and_Copying_Text_in_Documents|Moving and Copying Text in Documents]]
+
+}}{{WhenInCalc|[[Calc/Referencing_Cells_by_Drag-and-Drop|Referencing Cells by Drag-and-Drop]]
+
+}}</text>
+ </revision>
+ </page>
+</mediawiki>