@@ -50,8 +50,142 @@ if ( DOXYGEN_FOUND )
5050 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
5151 )
5252 add_dependencies (doxygen doxygen_settings )
53+
54+ # -- XSLT-based Zensical targets --
55+ set ( XSLT_DIR ${CMAKE_CURRENT_SOURCE_DIR } /zensical/xslt )
56+
57+ # Convert fluidsettings.xml to Markdown using XSLT
58+ # Output goes directly into the wiki docs_dir so zensical.toml picks it up
59+ add_custom_target ( fluidsettings2md
60+ COMMAND ${CMAKE_COMMAND } -E make_directory
61+ ${CMAKE_CURRENT_SOURCE_DIR } /wiki/settings
62+ COMMAND bash ${XSLT_DIR} /run-xslt.sh
63+ fluidsettings
64+ ${CMAKE_CURRENT_SOURCE_DIR } /fluidsettings.xml
65+ ${CMAKE_CURRENT_SOURCE_DIR } /wiki/settings
66+ ${XSLT_DIR} /fluidsettings2md.xsl
67+ COMMENT "Converting fluidsettings.xml to Markdown via XSLT"
68+ )
69+
70+ # Convert Doxygen XML output to API Markdown using XSLT
71+ # Output goes directly into the wiki docs_dir so zensical.toml picks it up
72+ add_custom_target ( doxy2md
73+ COMMAND ${CMAKE_COMMAND } -E make_directory
74+ ${CMAKE_CURRENT_SOURCE_DIR } /wiki/api
75+ COMMAND bash ${XSLT_DIR} /run-xslt.sh
76+ doxy
77+ ${CMAKE_CURRENT_BINARY_DIR } /api/xml
78+ ${CMAKE_CURRENT_SOURCE_DIR } /wiki/api
79+ ${XSLT_DIR} /doxy2md.xsl
80+ ${CMAKE_CURRENT_SOURCE_DIR } /fluidsettings.xml
81+ DEPENDS doxygen
82+ COMMENT "Converting Doxygen XML to API reference Markdown via XSLT"
83+ )
84+
85+ endif ( LIBXSLT_XSLTPROC_EXECUTABLE )
86+
87+ # ---------------------------------------------------------------------------
88+ # Zensical documentation site
89+ #
90+ # The site requires Python 3 plus the packages listed in
91+ # doc/zensical/requirements.txt. Install them once with:
92+ # pip install -r doc/zensical/requirements.txt
93+ #
94+ # Build targets (XSLT pipeline):
95+ # fluidsettings2md -- convert fluidsettings.xml to settings Markdown (XSLT)
96+ # doxy2md -- convert Doxygen XML group output to API reference Markdown (XSLT)
97+ # usage2md -- convert Doxygen page XML to usage guide Markdown (XSLT)
98+ # recent_changes2md -- convert RecentChanges page XML to api/recent-changes.md (XSLT)
99+ # zensical -- run all of the above, then build the unified wiki+API site
100+ # ---------------------------------------------------------------------------
101+ find_program ( ZENSICAL_EXECUTABLE NAMES zensical )
102+
103+ set ( WIKI_DOCS_DIR ${CMAKE_CURRENT_SOURCE_DIR } /wiki )
104+ set ( ZENSICAL_SCRIPTS ${CMAKE_CURRENT_SOURCE_DIR } /zensical/scripts )
105+
106+ if ( LIBXSLT_XSLTPROC_EXECUTABLE )
107+
108+ # -- Convert usage \page XML to usage guide Markdown (XSLT) ---------------
109+ # Processes all usage guide pages from Doxygen page XML (built by doxygen target).
110+ # Skips RecentChanges (handled by recent_changes2md below).
111+ # The api_prefix "../api/" is passed so that cross-references from usage/
112+ # pages to API symbols resolve to ../api/<group>.md#<symbol>.
113+ # NOTE: CMake strips empty-string arguments from COMMAND lists. Use the
114+ # sentinel "_nofilter_" (handled by run-xslt.sh) to mean "no filter".
115+ add_custom_target ( usage2md
116+ COMMAND ${CMAKE_COMMAND } -E make_directory ${WIKI_DOCS_DIR} /usage
117+ COMMAND bash ${XSLT_DIR} /run-xslt.sh
118+ pages
119+ ${CMAKE_CURRENT_BINARY_DIR } /api/xml
120+ ${WIKI_DOCS_DIR} /usage
121+ ${XSLT_DIR} /doxy2md.xsl
122+ "../api/"
123+ "_nofilter_"
124+ ${CMAKE_CURRENT_SOURCE_DIR } /fluidsettings.xml
125+ DEPENDS doxygen
126+ COMMENT "Converting Doxygen page XML to usage guide Markdown via XSLT"
127+ )
128+
129+ # -- Convert RecentChanges page XML to api/recent-changes.md (XSLT) -------
130+ # Uses the same pages mode but filters to only the RecentChanges page.
131+ # API prefix is "./" (already in the api/ directory).
132+ add_custom_target ( recent_changes2md
133+ COMMAND ${CMAKE_COMMAND } -E make_directory ${WIKI_DOCS_DIR} /api
134+ COMMAND bash ${XSLT_DIR} /run-xslt.sh
135+ pages
136+ ${CMAKE_CURRENT_BINARY_DIR } /api/xml
137+ ${WIKI_DOCS_DIR} /api
138+ ${XSLT_DIR} /doxy2md.xsl
139+ "./"
140+ "RecentChanges"
141+ ${CMAKE_CURRENT_SOURCE_DIR } /fluidsettings.xml
142+ DEPENDS doxygen
143+ COMMENT "Converting RecentChanges page XML to Markdown via XSLT"
144+ )
145+
146+ # -- Generate API examples page --------------------------------------------
147+ add_custom_target ( examples2md
148+ COMMAND bash ${XSLT_DIR} /run-xslt.sh
149+ examples
150+ ${CMAKE_CURRENT_SOURCE_DIR } /examples
151+ ${WIKI_DOCS_DIR} /api
152+ COMMENT "Generating API examples page"
153+ )
154+
53155 endif ( LIBXSLT_XSLTPROC_EXECUTABLE )
54156
157+ # -- Build the unified wiki + API documentation site (XSLT pipeline) ------
158+ # All content is generated into doc/wiki/ by the targets above.
159+ # A CMake script (gen-zensical-config.cmake) reads zensical.toml.in, fills in
160+ # @API_NAV_ENTRIES@ with the list of generated API pages (so the sidebar and
161+ # breadcrumbs work for every page), and writes a runtime config to the PROJECT
162+ # SOURCE ROOT (not the build dir).
163+ # Writing it there ensures that docs_dir = "doc/wiki" in the config resolves
164+ # correctly relative to the config file – zensical requires docs_dir to be
165+ # a relative path. The file is gitignored via the root .gitignore.
166+ if ( LIBXSLT_XSLTPROC_EXECUTABLE AND ZENSICAL_EXECUTABLE )
167+ set ( ZENSICAL_RUNTIME_CONFIG ${CMAKE_SOURCE_DIR } /zensical_runtime.toml )
168+ add_custom_target ( zensical
169+ COMMAND ${CMAKE_COMMAND }
170+ -D WIKI_DIR=${WIKI_DOCS_DIR}
171+ -D OUTPUT =${ZENSICAL_RUNTIME_CONFIG}
172+ -D TEMPLATE=${CMAKE_SOURCE_DIR}/zensical.toml.in
173+ -P ${ZENSICAL_SCRIPTS} /gen-zensical-config.cmake
174+ COMMAND ${ZENSICAL_EXECUTABLE} build --clean
175+ -f ${ZENSICAL_RUNTIME_CONFIG}
176+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR }
177+ DEPENDS fluidsettings2md doxy2md
178+ usage2md recent_changes2md examples2md
179+ COMMENT "Building unified wiki and API documentation site (XSLT pipeline)"
180+ )
181+ elseif ( NOT LIBXSLT_XSLTPROC_EXECUTABLE )
182+ message ( STATUS "xsltproc not found -- 'zensical' CMake target unavailable.\n "
183+ "Install it with: sudo apt-get install xsltproc" )
184+ else ()
185+ message ( STATUS "zensical executable not found -- 'zensical' CMake target unavailable.\n "
186+ "Install it with: pip install -r doc/zensical/requirements.txt" )
187+ endif ()
188+
55189endif ( DOXYGEN_FOUND )
56190
57191
0 commit comments