1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
include ( ${Xslt_USE_FILE} )
if ( NOT DOCBOOK_XSL_VERSION )
set ( DOCBOOK_XSL_VERSION current )
endif ( NOT DOCBOOK_XSL_VERSION )
set ( DOCBOOK_XSL_PREFIX "http://docbook.sourceforge.net/release/xsl/${DOCBOOK_XSL_VERSION}"
CACHE STRING "prefix to locate the docbook-XSL release files" )
mark_as_advanced ( DOCBOOK_XSL_PREFIX )
function ( _DOCBOOK_GET_HTML_FILES inFile outFileList )
find_program ( XMLLINT_EXECUTABLE xmllint )
if ( NOT XMLLINT_EXECUTABLE )
message ( FATAL_ERROR "Cannot find xmllint program (needed to resolve XIncludes)" )
endif ( NOT XMLLINT_EXECUTABLE )
execute_process (
COMMAND "${XMLLINT_EXECUTABLE}" ${XMLLINT_OPTIONS} --xinclude "${inFile}"
OUTPUT_VARIABLE XML_FILE_CONTENTS
)
# This assumes that every refentry has an unique id attribute
string ( REPLACE ";" "" XML_FILE_CONTENTS "${XML_FILE_CONTENTS}" )
string ( REGEX MATCHALL "<refentry[ ]+[^>]*" XML_REFENTRYTITLE "${XML_FILE_CONTENTS}" )
foreach ( id ${XML_REFENTRYTITLE} )
string ( REGEX REPLACE ".*id=\"([^\"]*)\".*" "\\1" id "${id}" )
if ( "${id}" STREQUAL "" )
message ( FATAL_ERROR "At least one refentry in file ${infile} has no or an empty id attribute." )
endif ( "${id}" STREQUAL "" )
list ( APPEND FILES ${id}.html )
endforeach ( id )
string ( REGEX MATCH "<!DOCTYPE[ ]+[^ >]*" XML_ENTRY_ELEMENT "${XML_FILE_CONTENTS}" )
string ( REGEX REPLACE "<!DOCTYPE[ ]+(.*)" "\\1" XML_ENTRY_ELEMENT "${XML_ENTRY_ELEMENT}" )
if ( "${XML_ENTRY_ELEMENT}" STREQUAL "reference" )
list ( APPEND FILES index.html )
endif ( "${XML_ENTRY_ELEMENT}" STREQUAL "reference" )
set ( ${outFileList} ${FILES} PARENT_SCOPE )
endfunction ( )
function ( _DOCBOOK_GET_MANPAGE_FILES inFile outFileList )
find_program ( XMLLINT_EXECUTABLE xmllint )
if ( NOT XMLLINT_EXECUTABLE )
message ( FATAL_ERROR "Cannot find xmllint program (needed to resolve XIncludes)" )
endif ( NOT XMLLINT_EXECUTABLE )
execute_process (
COMMAND "${XMLLINT_EXECUTABLE}" ${XMLLINT_OPTIONS} --xinclude "${inFile}"
OUTPUT_VARIABLE XML_FILE_CONTENTS
)
string ( REPLACE ";" "" XML_FILE_CONTENTS "${XML_FILE_CONTENTS}" )
string ( REGEX MATCHALL "<refentry[ ]+.*</refentry>" ENTRIES "${XML_FILE_CONTENTS}" )
string ( REPLACE "</refentry>" ";" ENTRIES "${ENTRIES}" )
list ( REMOVE_ITEM ENTRIES "" )
list ( LENGTH ENTRIES COUNT )
math ( EXPR COUNT "${COUNT} - 1" )
foreach ( index RANGE ${COUNT} )
list ( GET ENTRIES ${index} entry )
string ( REGEX MATCH "<refname>[^<]*" MANPAGE_NAME "${entry}" )
string ( REGEX REPLACE "^<refname>" "" MANPAGE_NAME "${MANPAGE_NAME}" )
string ( REGEX REPLACE "[[:space:]]" "" MANPAGE_NAME "${MANPAGE_NAME}" )
if ( "${MANPAGE_NAME}" STREQUAL "" )
message ( FATAL_ERROR "At least one refentry in file ${infile} has no or an empty refname element." )
endif ( "${MANPAGE_NAME}" STREQUAL "" )
string ( REGEX MATCH "<manvolnum>[^<]*" MANPAGE_VOLUME "${entry}" )
string ( REGEX REPLACE "^<manvolnum>" "" MANPAGE_VOLUME "${MANPAGE_VOLUME}" )
string ( REGEX REPLACE "[[:space:]]" "" MANPAGE_VOLUME "${MANPAGE_VOLUME}" )
if ( "${MANPAGE_VOLUME}" STREQUAL "" )
message ( FATAL_ERROR "At least one refentry in file ${infile} has no or an empty manvolnum element." )
endif ( "${MANPAGE_VOLUME}" STREQUAL "" )
list ( APPEND FILES "${MANPAGE_NAME}.${MANPAGE_VOLUME}" )
endforeach ( index )
set ( ${outFileList} ${FILES} PARENT_SCOPE )
endfunction ( )
function ( _DOCBOOK_MANPAGE inFile outList )
_docbook_get_manpage_files ( "${inFile}" FILES )
xsl_transform (
"${DOCBOOK_XSL_PREFIX}/manpages/docbook.xsl"
"${inFile}"
${FILES}
)
set ( ${outList} ${FILES} PARENT_SCOPE )
endfunction ( )
function ( _DOCBOOK_HTML inFile outList )
_docbook_get_html_files ( "${inFile}" FILES )
list ( APPEND XSLT_PARAMS
"use.id.as.filename=1"
)
xsl_transform (
"${DOCBOOK_XSL_PREFIX}/xhtml/chunk.xsl"
"${inFile}"
${FILES}
)
set ( ${outList} ${FILES} PARENT_SCOPE )
endfunction ( )
function ( DOCBOOK_GENERATE format inFile outList )
if ( format STREQUAL "manpage" )
_docbook_manpage ( "${inFile}" ${outList} )
elseif ( format STREQUAL "html" )
_docbook_html ( "${inFile}" ${outList} )
else ( )
message ( FATAL_ERROR "Unsupported docbook output format." )
endif ( )
set ( ${outList} ${${outList}} PARENT_SCOPE )
endfunction ( )
|