mirror of https://github.com/tLDP/python-tldp
switch to the DAG model
This commit is contained in:
parent
9e660eb67a
commit
f112fc98d1
|
@ -5,13 +5,15 @@ from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
import networkx as nx
|
||||||
|
|
||||||
from tldp.utils import which, execute, firstfoundfile
|
from tldp.utils import which, firstfoundfile
|
||||||
from tldp.utils import arg_isexecutable, isexecutable
|
from tldp.utils import arg_isexecutable, isexecutable
|
||||||
from tldp.utils import arg_isreadablefile, isreadablefile
|
from tldp.utils import arg_isreadablefile, isreadablefile
|
||||||
|
|
||||||
from tldp.doctypes.common import BaseDoctype, SignatureChecker
|
from tldp.doctypes.common import BaseDoctype, SignatureChecker, depends
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def docbookdsl_finder():
|
def docbookdsl_finder():
|
||||||
|
@ -46,130 +48,149 @@ class DocbookSGML(BaseDoctype, SignatureChecker):
|
||||||
'docbooksgml_docbookdsl': isreadablefile,
|
'docbooksgml_docbookdsl': isreadablefile,
|
||||||
}
|
}
|
||||||
|
|
||||||
buildorder = ['buildindex', 'buildall']
|
graph = nx.DiGraph()
|
||||||
|
|
||||||
indexscript = '''#! /bin/bash
|
buildorder = ['buildall']
|
||||||
#
|
|
||||||
# -- generate usable index.sgml from DocBook SGML 3.x/4.x
|
|
||||||
|
|
||||||
set -x
|
def chdir_output(self):
|
||||||
set -e
|
os.chdir(self.output.dirname)
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
cd "{output.dirname}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_collateindex}" \\
|
|
||||||
-N \\
|
|
||||||
-o \\
|
|
||||||
"{source.dirname}/index.sgml"
|
|
||||||
|
|
||||||
"{config.docbooksgml_openjade}" \\
|
|
||||||
-t sgml \\
|
|
||||||
-V html-index \\
|
|
||||||
-d "{config.docbooksgml_docbookdsl}" \\
|
|
||||||
"{source.filename}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_collateindex}" \\
|
|
||||||
-g \\
|
|
||||||
-t Index \\
|
|
||||||
-i doc-index \\
|
|
||||||
-o "index.sgml" \\
|
|
||||||
"HTML.index" \\
|
|
||||||
"{source.filename}"
|
|
||||||
|
|
||||||
mv \\
|
|
||||||
--no-clobber \\
|
|
||||||
--verbose \\
|
|
||||||
-- "index.sgml" "{source.dirname}/index.sgml"
|
|
||||||
|
|
||||||
find . -mindepth 1 -maxdepth 1 -type f -print0 \
|
|
||||||
| xargs --null --no-run-if-empty -- rm -f --
|
|
||||||
|
|
||||||
# -- end of file'''
|
|
||||||
|
|
||||||
mainscript = '''#! /bin/bash
|
|
||||||
#
|
|
||||||
# -- generate LDP outputs from DocBook SGML 3.x/4.x
|
|
||||||
|
|
||||||
set -x
|
|
||||||
set -e
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
cd "{output.dirname}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_jw}" \\
|
|
||||||
-f docbook \\
|
|
||||||
-b html \\
|
|
||||||
--dsl "{config.docbooksgml_ldpdsl}#html" \\
|
|
||||||
-V nochunks \\
|
|
||||||
-V '%callout-graphics-path%=images/callouts/' \\
|
|
||||||
-V '%stock-graphics-extension%=.png' \\
|
|
||||||
--output . \\
|
|
||||||
"{source.filename}"
|
|
||||||
|
|
||||||
mv \\
|
|
||||||
--no-clobber \\
|
|
||||||
--verbose \\
|
|
||||||
-- "{output.name_html}" "{output.name_htmls}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_html2text}" > "{output.name_txt}" \\
|
|
||||||
-style pretty \\
|
|
||||||
-nobs \\
|
|
||||||
"{output.name_htmls}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_jw}" \\
|
|
||||||
-f docbook \\
|
|
||||||
-b pdf \\
|
|
||||||
--output . \\
|
|
||||||
"{source.filename}" \\
|
|
||||||
|| "{config.docbooksgml_dblatex}" \\
|
|
||||||
-F sgml \\
|
|
||||||
-t pdf \\
|
|
||||||
-o "{output.name_pdf}" \\
|
|
||||||
"{source.filename}"
|
|
||||||
|
|
||||||
"{config.docbooksgml_jw}" \\
|
|
||||||
-f docbook \\
|
|
||||||
-b html \\
|
|
||||||
--dsl "{config.docbooksgml_ldpdsl}#html" \\
|
|
||||||
-V '%callout-graphics-path%=images/callouts/' \\
|
|
||||||
-V '%stock-graphics-extension%=.png' \\
|
|
||||||
--output . \\
|
|
||||||
"{source.filename}"
|
|
||||||
|
|
||||||
mv \\
|
|
||||||
--no-clobber \\
|
|
||||||
--verbose \\
|
|
||||||
-- "{output.name_indexhtml}" "{output.name_html}"
|
|
||||||
|
|
||||||
ln \\
|
|
||||||
--symbolic \\
|
|
||||||
--relative \\
|
|
||||||
--verbose \\
|
|
||||||
-- "{output.name_html}" "{output.name_indexhtml}"
|
|
||||||
|
|
||||||
|
|
||||||
# -- end of file'''
|
|
||||||
|
|
||||||
def buildindex(self):
|
|
||||||
indexsgml = os.path.join(self.source.dirname, 'index.sgml')
|
|
||||||
if os.path.isfile(indexsgml):
|
|
||||||
self.indexsgml = lambda: None
|
|
||||||
return True
|
|
||||||
|
|
||||||
def unlink_indexsgml():
|
|
||||||
os.unlink(indexsgml)
|
|
||||||
|
|
||||||
self.indexsgml = unlink_indexsgml
|
|
||||||
return self.shellscript(self.indexscript)
|
|
||||||
|
|
||||||
def buildall(self):
|
|
||||||
return self.shellscript(self.mainscript)
|
|
||||||
|
|
||||||
def post_buildall(self):
|
|
||||||
self.indexsgml()
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@depends(graph, chdir_output)
|
||||||
|
def make_blank_indexsgml(self):
|
||||||
|
'''generate an empty index.sgml file (in output dir)'''
|
||||||
|
s = '''"{config.docbooksgml_collateindex}" \\
|
||||||
|
-N \\
|
||||||
|
-o \\
|
||||||
|
"index.sgml"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_blank_indexsgml)
|
||||||
|
def make_data_indexsgml(self):
|
||||||
|
'''collect document's index entries into a data file (HTML.index)'''
|
||||||
|
s = '''"{config.docbooksgml_openjade}" \\
|
||||||
|
-t sgml \\
|
||||||
|
-V html-index \\
|
||||||
|
-d "{config.docbooksgml_docbookdsl}" \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_data_indexsgml)
|
||||||
|
def make_indexsgml(self):
|
||||||
|
'''generate the final document index file (index.sgml)'''
|
||||||
|
s = '''"{config.docbooksgml_collateindex}" \\
|
||||||
|
-g \\
|
||||||
|
-t Index \\
|
||||||
|
-i doc-index \\
|
||||||
|
-o "index.sgml" \\
|
||||||
|
"HTML.index" \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_indexsgml)
|
||||||
|
def move_indexsgml_into_source(self):
|
||||||
|
'''move the generated index.sgml file into the source tree'''
|
||||||
|
indexsgml = os.path.join(self.source.dirname, 'index.sgml')
|
||||||
|
s = '''mv \\
|
||||||
|
--no-clobber \\
|
||||||
|
--verbose \\
|
||||||
|
-- "index.sgml" "{source.dirname}/index.sgml"'''
|
||||||
|
moved = self.shellscript(s)
|
||||||
|
if moved:
|
||||||
|
self.removals = indexsgml
|
||||||
|
logger.debug("%s created %s", self.source.stem, indexsgml)
|
||||||
|
return True
|
||||||
|
return os.path.exists(indexsgml)
|
||||||
|
|
||||||
|
@depends(graph, move_indexsgml_into_source)
|
||||||
|
def cleaned_indexsgml(self):
|
||||||
|
'''clean the junk from the output dir after building the index.sgml'''
|
||||||
|
# -- be super cautious before removing a bunch of files
|
||||||
|
cwd = os.getcwd()
|
||||||
|
if not os.path.samefile(cwd, self.output.dirname):
|
||||||
|
logger.error("%s (cowardly) refusing to clean directory %s", cwd)
|
||||||
|
logger.error("%s expected to find %s", self.output.dirname)
|
||||||
|
return False
|
||||||
|
s = '''find . -mindepth 1 -maxdepth 1 -type f -print0 \
|
||||||
|
| xargs --null --no-run-if-empty -- rm -f --'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, cleaned_indexsgml)
|
||||||
|
def make_htmls(self):
|
||||||
|
'''create a single page HTML output (with incorrect name)'''
|
||||||
|
s = '''"{config.docbooksgml_jw}" \\
|
||||||
|
-f docbook \\
|
||||||
|
-b html \\
|
||||||
|
--dsl "{config.docbooksgml_ldpdsl}#html" \\
|
||||||
|
-V nochunks \\
|
||||||
|
-V '%callout-graphics-path%=images/callouts/' \\
|
||||||
|
-V '%stock-graphics-extension%=.png' \\
|
||||||
|
--output . \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_htmls)
|
||||||
|
def make_name_htmls(self):
|
||||||
|
'''correct the single page HTML output name'''
|
||||||
|
s = 'mv -v --no-clobber -- "{output.name_html}" "{output.name_htmls}"'
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_name_htmls)
|
||||||
|
def make_name_txt(self):
|
||||||
|
'''create text output (from single-page HTML)'''
|
||||||
|
s = '''"{config.docbooksgml_html2text}" > "{output.name_txt}" \\
|
||||||
|
-style pretty \\
|
||||||
|
-nobs \\
|
||||||
|
"{output.name_htmls}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
def make_pdf_with_jw(self):
|
||||||
|
s = '''"{config.docbooksgml_jw}" \\
|
||||||
|
-f docbook \\
|
||||||
|
-b pdf \\
|
||||||
|
--output . \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
def make_pdf_with_dblatex(self):
|
||||||
|
s = '''"{config.docbooksgml_dblatex}" \\
|
||||||
|
-F sgml \\
|
||||||
|
-t pdf \\
|
||||||
|
-o "{output.name_pdf}" \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, cleaned_indexsgml)
|
||||||
|
def make_name_pdf(self):
|
||||||
|
if self.make_pdf_with_jw():
|
||||||
|
return True
|
||||||
|
return self.make_pdf_with_dblatex()
|
||||||
|
|
||||||
|
@depends(graph, make_name_htmls)
|
||||||
|
def make_html(self):
|
||||||
|
'''create final index.html symlink'''
|
||||||
|
s = '''"{config.docbooksgml_jw}" \\
|
||||||
|
-f docbook \\
|
||||||
|
-b html \\
|
||||||
|
--dsl "{config.docbooksgml_ldpdsl}#html" \\
|
||||||
|
-V '%callout-graphics-path%=images/callouts/' \\
|
||||||
|
-V '%stock-graphics-extension%=.png' \\
|
||||||
|
--output . \\
|
||||||
|
"{source.filename}"'''
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_html)
|
||||||
|
def make_name_html(self):
|
||||||
|
'''rename openjade's index.html to LDP standard name STEM.html'''
|
||||||
|
s = 'mv -v --no-clobber -- "{output.name_indexhtml}" "{output.name_html}"'
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
|
@depends(graph, make_name_html)
|
||||||
|
def make_name_indexhtml(self):
|
||||||
|
'''create final index.html symlink'''
|
||||||
|
s = 'ln -svr -- "{output.name_html}" "{output.name_indexhtml}"'
|
||||||
|
return self.shellscript(s)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def argparse(p):
|
def argparse(p):
|
||||||
p.add_argument('--docbooksgml-docbookdsl', type=arg_isreadablefile,
|
p.add_argument('--docbooksgml-docbookdsl', type=arg_isreadablefile,
|
||||||
|
|
Loading…
Reference in New Issue