1# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
2#
3# This file is part of the LibreOffice project.
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9
10$(eval $(call gb_CustomTarget_CustomTarget,helpcontent2/help3xsl))
11
12# HACK!!
13html_TREE_MODULES := sbasic scalc schart shared simpress smath swriter sdraw
14html_TEXT_MODULES := $(html_TREE_MODULES) sdatabase
15html_BMARK_MODULES := swriter:WRITER scalc:CALC simpress:IMPRESS sdraw:DRAW shared/explorer/database:BASE smath:MATH schart:CHART sbasic:BASIC shared:SHARED
16
17$(eval $(call gb_CustomTarget_register_targets,helpcontent2/help3xsl,\
18	hid2file.js \
19	languages.js \
20	$(foreach lang,$(gb_HELP_LANGS),\
21		$(lang)/bookmarks.js \
22		$(lang)/contents.js \
23		$(lang)/html.text \
24		$(foreach module,$(html_TREE_MODULES),$(module)/$(lang)/contents.part) \
25		$(foreach module,$(html_BMARK_MODULES),$(firstword $(subst :, ,$(module)))/$(lang)/bookmarks.part) \
26		$(foreach module,$(html_TEXT_MODULES),filelists/html-help/$(module)/$(lang).filelist) \
27		$(lang)/langnames.js \
28		$(if $(HELP_OMINDEX_PAGE),$(lang)/xap_tpl) \
29	) \
30))
31
32# In the below recipe, the file $@.good is used to communicate failure of xsltproc in the pipeline
33# (similar to Bash's `set -o pipefail`; the final `rm $@.good` will fail, and fail the whole
34# command, if the xsltproc invocation failed):
35$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/hid2file.js : \
36		$(SRCDIR)/helpcontent2/help3xsl/generate_hid2file.xsl \
37		$(call gb_ExternalExecutable_get_dependencies,xsltproc) \
38		$(foreach module,$(html_TEXT_MODULES),$(call gb_AllLangHelp_get_helpfiles_target,$(module))) \
39		$(SRCDIR)/helpcontent2/CustomTarget_html.mk
40	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),XSL,1)
41	$(call gb_Helper_abbreviate_dirs,\
42		( \
43			echo 'var hid2fileMap = {' \
44			&& RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),100,$(foreach module,$(html_TEXT_MODULES),$(addprefix $(SRCDIR)/,$(gb_AllLangHelp_$(module)_HELPFILES)))) \
45			&& <"$$RESPONSEFILE" $(if $(filter WNT,$(OS)),tr -d '\r' | env -i PATH="$$PATH") xargs -n 1 printf '%s\n' \
46			| while read xhp; do \
47				rm -f $@.good && \
48				{ $(call gb_ExternalExecutable_get_command,xsltproc) $< $$xhp && touch $@.good; } \
49				| $(gb_AWK) 'NF' \
50				&& rm $@.good || exit \
51			; done \
52			&& rm "$$RESPONSEFILE" \
53			&& echo '};' \
54		) > $@ \
55	)
56
57# Xapian localized templates
58ifeq ($(HELP_OMINDEX_PAGE),TRUE)
59
60define html_gen_xaptpl_dep
61$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/xap_tpl : \
62	$(if $(filter en-US,$(1)),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$(1)))/helpcontent2/source/text/shared/help/browserhelp.xhp
63
64endef
65
66$(eval $(foreach lang,$(gb_HELP_LANGS),$(call html_gen_xaptpl_dep,$(lang))))
67
68$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/xap_tpl : \
69		$(SRCDIR)/helpcontent2/help3xsl/xap_templ_query.xsl \
70		$(call gb_ExternalExecutable_get_dependencies,xsltproc) \
71		$(SRCDIR)/helpcontent2/CustomTarget_html.mk
72	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),XAT,1)
73	$(call gb_Helper_abbreviate_dirs,\
74		$(call gb_ExternalExecutable_get_command,xsltproc) \
75		--stringparam lang $* \
76		--stringparam productname "$(PRODUCTNAME)" \
77		--stringparam productversion "$(PRODUCTVERSION)" \
78		-o $@ \
79		$(SRCDIR)/helpcontent2/help3xsl/xap_templ_query.xsl \
80		$(if $(filter en-US,$*),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$*))/helpcontent2/source/text/shared/help/browserhelp.xhp \
81	)
82
83endif
84
85# set of installed languages - has to be language independent
86$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/languages.js : \
87		$(SRCDIR)/helpcontent2/CustomTarget_html.mk
88	( \
89		printf 'var languagesSet = new Set([' ; \
90		for lang in $(gb_HELP_LANGS) ; do printf '%s' "'$$lang', " ; done | sed 's/, $$//' ; \
91		printf ']);\n' \
92	) > $@
93
94
95define html_gen_langnames_js_dep
96$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/langnames.js : \
97	$(if $(filter en-US,$(1)),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$(1)))/helpcontent2/source/text/shared/help/browserhelp.xhp
98
99endef
100
101$(eval $(foreach lang,$(gb_HELP_LANGS),$(call html_gen_langnames_js_dep,$(lang))))
102
103# names of the languages - has to be translated, ie. per language
104$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/langnames.js : \
105		$(SRCDIR)/helpcontent2/CustomTarget_html.mk
106	( \
107		echo 'var languageNames = {' ; \
108		grep '<paragraph[^>]*id="lang_' $(if $(filter en-US,$*),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$*))/helpcontent2/source/text/shared/help/browserhelp.xhp | \
109			sed -e 's/^.*<variable id="\([^"]*\)"[^>]*>\([^<]*\)<.*$$/"\1": "\2",/' ; \
110		echo '};' \
111	) > $@
112
113define html_gen_contents_html_dep
114$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/contents.part : $(call gb_HelpTarget__get_treefile,$(1),$(3))
115$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/contents.part : TREE_FILE := $(call gb_HelpTarget__get_treefile,$(1),$(3))
116$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/contents.part : LANGUAGE := $(2)
117$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/contents.part : MODULE := $(lastword $(subst :, ,$(filter $(module):%, $(html_BMARK_MODULES))))
118
119endef
120
121define html_gen_contents_dep
122$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/contents.js : \
123	$(foreach module,$(html_TREE_MODULES),\
124		$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(module)/$(1)/contents.part)
125$(foreach module,$(html_TREE_MODULES),$(call html_gen_contents_html_dep,$(module)/$(1),$(1),helpcontent2/source/auxiliary/$(module)))
126
127endef
128
129$(eval $(foreach lang,$(gb_HELP_LANGS),$(call html_gen_contents_dep,$(lang))))
130
131$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/contents.js :
132	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),CAT,2)
133	$(call gb_Helper_abbreviate_dirs,\
134		( \
135			echo "document.getElementById(\"Contents\").innerHTML='\\" \
136			&& cat $(filter %.part,$^) | $(gb_AWK) 'NF' \
137			&& echo "';" \
138		) > $@ \
139	)
140
141$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/contents.part : \
142		$(SRCDIR)/helpcontent2/help3xsl/get_tree.xsl \
143		$(call gb_ExternalExecutable_get_dependencies,xsltproc)
144	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),XSL,1)
145	$(call gb_Helper_abbreviate_dirs,\
146		$(call gb_ExternalExecutable_get_command,xsltproc) \
147			--stringparam lang $(LANGUAGE) \
148			--stringparam local $(if $(HELP_ONLINE),'no','yes') \
149			--stringparam module $(MODULE) \
150			--stringparam productname "$(PRODUCTNAME)" \
151			--stringparam productversion "$(PRODUCTVERSION)" \
152			-o $@ \
153			$(SRCDIR)/helpcontent2/help3xsl/get_tree.xsl \
154			$(TREE_FILE) \
155	)
156
157define html_gen_html_dep
158$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/html.text : \
159	$(foreach module,$(html_TEXT_MODULES), \
160		$(if $(filter en-US,$(1)), \
161			$(call gb_AllLangHelp_get_helpfiles_target,$(module)), \
162			$(call gb_HelpTranslateTarget_get_target,$(module)/$(1))))
163
164endef
165
166$(eval $(foreach lang,$(gb_HELP_LANGS),$(call html_gen_html_dep,$(lang))))
167
168$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/html.text : \
169		$(SRCDIR)/helpcontent2/help3xsl/online_transform.xsl \
170		$(call gb_ExternalExecutable_get_dependencies,xsltproc)
171	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),XSL,1)
172	$(call gb_Helper_abbreviate_dirs,\
173		cd $(if $(filter en-US,$*),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$*))/helpcontent2/source \
174		&& rm -rf $(dir $@)text \
175		&& RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),100,$(foreach module,$(html_TEXT_MODULES),$(patsubst helpcontent2/source/%,%,$(gb_AllLangHelp_$(module)_HELPFILES)))) \
176		&& <"$$RESPONSEFILE" $(if $(filter WNT,$(OS)),tr -d '\r' | env -i PATH="$$PATH") xargs -n 1 printf '%s\n' \
177		| while read xhp; do \
178			mkdir -p $$(dirname $(dir $@)$$xhp) && \
179			$(call gb_ExternalExecutable_get_command,xsltproc) \
180				--stringparam Language $* \
181				--stringparam local $(if $(HELP_ONLINE),'no','yes') \
182				--stringparam root $(if $(filter WNT,$(OS)),$$(cygpath -m `pwd`),`pwd`)/ \
183				--stringparam productname "$(PRODUCTNAME)" \
184				--stringparam productversion "$(PRODUCTVERSION)" \
185				--stringparam xapian $(if $(filter TRUE, $(HELP_OMINDEX_PAGE)),'yes','no') \
186				-o $(dir $@)$${xhp%.xhp}.html \
187				$(SRCDIR)/helpcontent2/help3xsl/online_transform.xsl \
188				$(if $(filter WNT,$(OS)),$$(cygpath -m `pwd`),`pwd`)/$$xhp \
189			|| exit \
190		; done \
191		&& rm "$$RESPONSEFILE" \
192		&& touch $@ \
193	)
194
195$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/bookmarks.js :
196	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),CAT,2)
197	$(call gb_Helper_abbreviate_dirs,\
198		( \
199			echo 'var bookmarks = [' \
200			&& cat $(filter %.part,$^) \
201			&& echo '];' \
202		) > $@ \
203	)
204
205define html__gen_bookmarks_lang_dep
206$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(2)/$(1)/bookmarks.part : \
207    $(if $(filter en-US,$(1)), \
208        $(call gb_AllLangHelp_get_helpfiles_target,$(firstword $(subst /, ,$(2)))), \
209        $(call gb_HelpTranslateTarget_get_target,$(firstword $(subst /, ,$(2)))/$(1)))
210
211endef
212
213define html__gen_bookmarks_lang_deps
214$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/bookmarks.js : \
215	$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(2)/$(1)/bookmarks.part
216$(call html__gen_bookmarks_lang_dep,$(1),$(2))
217$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(2)/$(1)/bookmarks.part : HELP_LANG := $(1)
218
219endef
220
221define html__gen_bookmarks_deps
222$(foreach lang,$(gb_HELP_LANGS),$(call html__gen_bookmarks_lang_deps,$(lang),$(1)))
223$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/%/bookmarks.part : APP := $(2)
224$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/$(1)/%/bookmarks.part : APPDIR := $(1)
225
226endef
227
228define html_gen_bookmarks_deps
229$(call html__gen_bookmarks_deps,$(firstword $(1)),$(lastword $(1)))
230
231endef
232
233$(eval $(foreach module,$(html_BMARK_MODULES),$(call html_gen_bookmarks_deps,$(subst :, ,$(module)))))
234
235# In the below recipe, the file $@.good is used to communicate failure of xsltproc in the pipeline
236# (similar to Bash's `set -o pipefail`; the final `rm $@.good` will fail, and fail the whole
237# command, if any xsltproc invocation failed):
238$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/%/bookmarks.part : \
239		$(SRCDIR)/helpcontent2/help3xsl/get_bookmark.xsl \
240		$(call gb_ExternalExecutable_get_dependencies,xsltproc)
241	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),XSL,1)
242	$(call gb_Helper_abbreviate_dirs,\
243		RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),100,$(addprefix $(if $(filter en-US,$(HELP_LANG)),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$(HELP_LANG)))/,$(gb_AllLangHelp_$(APPDIR)_BOOKMARK_HELPFILES))) \
244		&& ( \
245			<"$$RESPONSEFILE" $(if $(filter WNT,$(OS)),tr -d '\r' | env -i PATH="$$PATH") xargs -n 1 printf '%s\n' \
246			| { rm -f $@.good && while read xhp; do \
247				$(call gb_ExternalExecutable_get_command,xsltproc) \
248					--stringparam app $(APP) \
249					--stringparam Language $(HELP_LANG) \
250					--stringparam local $(if $(HELP_ONLINE),'no','yes') \
251					--stringparam productname "$(PRODUCTNAME)" \
252					--stringparam productversion "$(PRODUCTVERSION)" \
253					$(SRCDIR)/helpcontent2/help3xsl/get_bookmark.xsl \
254					$$xhp \
255				|| exit \
256			; done && touch $@.good; } \
257			| sort -k3b -t\> -s \
258			| awk 'NF' \
259			&& rm $@.good \
260		) > $@ \
261		&& rm "$$RESPONSEFILE" \
262	)
263
264# The various gid_File_Help_*_Zip in scp2 that use EXTRA_ALL_GOOD_HELP_LOCALIZATIONS_LANG expect
265# $(module)/$(lang).filelist files containing lists of files (in instdir) for the corresponding
266# module/lang parts of help data.  As a hack, generate those from the existing HelpTarget file
267# lists, which specify the original .xhp files (in SRCDIR for en-US, translated for all other
268# langs).  For the shared module, also include the per-lang non .xhp/.html files from the
269# AllLangPackages helpcontent2_html_lang and helpcontent2_html_media_lang:
270
271# html__filelist,lang,module
272define html__filelist
273$(call gb_CustomTarget_get_workdir,helpcontent2/help3xsl)/filelists/html-help/$(2)/$(1).filelist: \
274        $(call gb_HelpTarget_get_filelist,$(2)/$(1)) \
275        $(if $(filter $(2),shared), \
276            $(call gb_Package_get_target,helpcontent2_html_lang_$(1)) \
277            $(call gb_Package_get_target,helpcontent2_html_media_lang_$(1)))
278	mkdir -p $$$$(dirname $$@)
279	sed -e 's|$(if $(filter $(1),en-US),$(SRCDIR),$(call gb_HelpTranslatePartTarget_get_workdir,$(1)))/helpcontent2/source/|$(INSTROOT)/$(LIBO_SHARE_HELP_FOLDER)/$(1)/|g' -e 's|.xhp|.html|g' $(call gb_HelpTarget_get_filelist,$(2)/$(1)) > $$@
280	$(if $(filter $(2),shared),cat $(call gb_Package_get_target,helpcontent2_html_lang_$(1)) $(call gb_Package_get_target,helpcontent2_html_media_lang_$(1)) >> $$@,:)
281
282endef
283
284$(eval $(foreach lang,$(gb_HELP_LANGS),$(foreach module,$(html_TEXT_MODULES),$(call html__filelist,$(lang),$(module)))))
285
286# vim: set noet sw=4 ts=4:
287