diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-08-31 17:04:43 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-08-31 17:04:43 +0200 |
commit | b23bb8e0de3dbdc2c66c3dedf70dfd318868f76c (patch) | |
tree | 32060a3d0ad5acad9ea2e52265851925e6c4e732 | |
parent | remove debug output (diff) | |
download | core-b23bb8e0de3dbdc2c66c3dedf70dfd318868f76c.tar.gz core-b23bb8e0de3dbdc2c66c3dedf70dfd318868f76c.zip |
fdo#53009: Compile extension help in gbuild
...as had been done in the old build system (solenv/inc/extension_helplink.mk).
Especially for bundled extensions, this removes the need to compile the help
data per user on first start.
gb_Extension_add_helpfile(s) replaces gb_Extension_localize_help, and takes care
of all the steps (localization, compilation, inclusion in .oxt), even for the
en-US data (which was handled with additional gb_Extension_add_file calls
before).
Change-Id: Ie4bab66d3cad2b713780a23bf2606ca56cfff37f
-rw-r--r-- | nlpsolver/Extension_nlpsolver.mk | 15 | ||||
-rw-r--r-- | sdext/Extension_presenter.mk | 6 | ||||
-rw-r--r-- | solenv/gbuild/Extension.mk | 23 | ||||
-rw-r--r-- | solenv/gbuild/ExtensionTarget.mk | 132 | ||||
-rw-r--r-- | swext/Extension_wiki-publisher.mk | 18 |
5 files changed, 148 insertions, 46 deletions
diff --git a/nlpsolver/Extension_nlpsolver.mk b/nlpsolver/Extension_nlpsolver.mk index b7de4b0883ef..6f2690f1ebd9 100644 --- a/nlpsolver/Extension_nlpsolver.mk +++ b/nlpsolver/Extension_nlpsolver.mk @@ -1,3 +1,4 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- # # Version: MPL 1.1 / GPLv3+ / LGPLv3+ # @@ -39,11 +40,9 @@ $(eval $(call gb_Extension_add_file,nlpsolver,locale/NLPSolverStatusDialog_en_US $(eval $(call gb_Extension_localize_properties,nlpsolver,locale/NLPSolverCommon_en_US.properties,$(SRCDIR)/nlpsolver/src/locale/NLPSolverCommon_en_US.properties)) $(eval $(call gb_Extension_localize_properties,nlpsolver,locale/NLPSolverStatusDialog_en_US.properties,$(SRCDIR)/nlpsolver/src/locale/NLPSolverStatusDialog_en_US.properties)) -$(eval $(call gb_Extension_add_file,nlpsolver,help/en-US/com.sun.star.comp.Calc.NLPSolver/Options.xhp, \ - $(SRCDIR)/nlpsolver/help/en/com.sun.star.comp.Calc.NLPSolver/Options.xhp)) -$(eval $(call gb_Extension_add_file,nlpsolver,help/en-US/com.sun.star.comp.Calc.NLPSolver/Usage.xhp, \ - $(SRCDIR)/nlpsolver/help/en/com.sun.star.comp.Calc.NLPSolver/Usage.xhp)) -$(eval $(call gb_Extension_localize_help,nlpsolver,help/lang/com.sun.star.comp.Calc.NLPSolver/Options.xhp, \ - $(SRCDIR)/nlpsolver/help/en/com.sun.star.comp.Calc.NLPSolver/Options.xhp)) -$(eval $(call gb_Extension_localize_help,nlpsolver,help/lang/com.sun.star.comp.Calc.NLPSolver/Usage.xhp, \ - $(SRCDIR)/nlpsolver/help/en/com.sun.star.comp.Calc.NLPSolver/Usage.xhp)) +$(eval $(call gb_Extension_add_helpfiles,nlpsolver,$(SRCDIR)/nlpsolver/help/en, \ + com.sun.star.comp.Calc.NLPSolver/Options.xhp \ + com.sun.star.comp.Calc.NLPSolver/Usage.xhp \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sdext/Extension_presenter.mk b/sdext/Extension_presenter.mk index 2a83712f3285..ba5a51a68694 100644 --- a/sdext/Extension_presenter.mk +++ b/sdext/Extension_presenter.mk @@ -141,10 +141,6 @@ $(eval $(call gb_Extension_add_files,presenter-screen,registry/data/org/openoffi $(call gb_XcuDataTarget_get_target,sdext/source/presenter/registry/data/org/openoffice/Office/ProtocolHandler.xcu) \ )) -$(eval $(call gb_Extension_add_files,presenter-screen,help/en-US/com.sun.PresenterScreen-$(sdext_PLATFORM),\ - $(WORKDIR)/CustomTarget/sdext/source/presenter/help/en-US/com.sun.PresenterScreen/presenter.xhp \ -)) - -$(eval $(call gb_Extension_localize_help,presenter-screen,help/lang/com.sun.PresenterScreen-$(sdext_PLATFORM)/presenter.xhp,$(WORKDIR)/CustomTarget/sdext/source/presenter/help/en-US/com.sun.PresenterScreen/presenter.xhp)) +$(eval $(call gb_Extension_add_helpfile,presenter-screen,$(WORKDIR)/CustomTarget/sdext/source/presenter/help/en-US,com.sun.PresenterScreen-$(sdext_PLATFORM)/presenter.xhp,com.sun.PresenterScreen/presenter.xhp)) # vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/solenv/gbuild/Extension.mk b/solenv/gbuild/Extension.mk index e501e18ec84b..2779dda1c2b6 100644 --- a/solenv/gbuild/Extension.mk +++ b/solenv/gbuild/Extension.mk @@ -93,9 +93,26 @@ $(call gb_ExtensionTarget_localize_properties,$(1),$(2),$(3)) endef -# localize extension help -define gb_Extension_localize_help -$(call gb_ExtensionTarget_localize_help,$(1),$(2),$(3)) +# add an .xhp help file, to be localized and compiled +# $(1): extension identifier +# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4)) +# suffix +# $(3): relative path of (target) .xhp file (e.g., +# com.sun.wiki-publisher/wiki.xhp) +# $(4): optional relative path of source .xhp file, when it differs from $(3) +# (i.e., if $(4) is empty the en-US source file is $(2)/$(3), otherwise it +# is $(2)/$(4)) +define gb_Extension_add_helpfile +$(call gb_ExtensionTarget_add_helpfile,$(1),$(2),$(3),$(4)) + +endef + +# add a list of .xhp help files, to be localized and compiled +# $(1): extension identifier +# $(2): absolute path prefix of en-US source files without $(3) suffixes +# $(3): list of relative paths of .xhp files (see gb_Extension_add_helpfile) +define gb_Extension_add_helpfiles +$(call gb_ExtensionTarget_add_helpfiles,$(1),$(2),$(3)) endef diff --git a/solenv/gbuild/ExtensionTarget.mk b/solenv/gbuild/ExtensionTarget.mk index 105e58e0bfd3..94e4832dfabf 100644 --- a/solenv/gbuild/ExtensionTarget.mk +++ b/solenv/gbuild/ExtensionTarget.mk @@ -42,7 +42,8 @@ gb_ExtensionTarget_HELPEXTARGET := $(call gb_Executable_get_target_for_build,hel gb_ExtensionTarget_HELPEXCOMMAND := \ $(gb_Helper_set_ld_path) $(gb_ExtensionTarget_HELPEXTARGET) # does not contain en-US because it is special cased in gb_ExtensionTarget_ExtensionTarget -gb_ExtensionTarget_LANGS := $(filter-out en-US,$(gb_WITH_LANG)) +gb_ExtensionTarget_TRANS_LANGS := $(filter-out en-US,$(gb_WITH_LANG)) +gb_ExtensionTarget_ALL_LANGS := en-US $(gb_ExtensionTarget_TRANS_LANGS) # Substitute platform or copy if no platform has been set define gb_ExtensionTarget__subst_platform @@ -55,6 +56,9 @@ $(if $(PLATFORM),\ cp -f $(1) $(2)) endef +$(call gb_ExtensionTarget_get_workdir,%)/.dir : + $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@)) + # remove extension directory in workdir and oxt file in workdir $(call gb_ExtensionTarget_get_clean_target,%) : $(call gb_Output_announce,$*,$(false),OXT,3) @@ -93,11 +97,11 @@ $(call gb_ExtensionTarget_get_target,%) : \ $(call gb_ExtensionTarget__subst_platform,$(call gb_ExtensionTarget_get_workdir,$*)/description.xml,$(call gb_ExtensionTarget_get_rootdir,$*)/description.xml) && \ $(call gb_ExtensionTarget__subst_platform,$(LOCATION)/manifest.xml,$(call gb_ExtensionTarget_get_rootdir,$*)/META-INF/manifest.xml) && \ $(if $(LICENSE),cp -f $(LICENSE) $(call gb_ExtensionTarget_get_rootdir,$*)/registration &&) \ - $(if $(and $(gb_WITH_LANG),$(DESCRIPTION)),cp $(foreach lang,$(gb_ExtensionTarget_LANGS),$(call gb_ExtensionTarget_get_workdir,$*)/description-$(lang).txt) $(call gb_ExtensionTarget_get_rootdir,$*) &&) \ + $(if $(and $(gb_WITH_LANG),$(DESCRIPTION)),cp $(foreach lang,$(gb_ExtensionTarget_TRANS_LANGS),$(call gb_ExtensionTarget_get_workdir,$*)/description-$(lang).txt) $(call gb_ExtensionTarget_get_rootdir,$*) &&) \ cd $(call gb_ExtensionTarget_get_rootdir,$*) && \ $(gb_ExtensionTarget_ZIPCOMMAND) -rX --filesync \ $(call gb_ExtensionTarget_get_target,$*) \ - $(FILES)) + $(sort $(FILES))) # set file list and location of manifest and description files # register target and clean target @@ -116,6 +120,8 @@ $(call gb_ExtensionTarget_get_target,$(1)) : SDF := $(gb_SDFLOCATION)/$(2)/local $(call gb_ExtensionTarget_get_workdir,$(1))/description.xml : $$(SDF) endif +$(foreach lang,$(gb_ExtensionTarget_ALL_LANGS), \ + $(call gb_ExtensionTarget__compile_help_onelang,$(1),$(lang))) endef # Set platform. @@ -139,7 +145,7 @@ define gb_ExtensionTarget_use_default_description $(call gb_ExtensionTarget_add_file,$(1),description-en-US.txt,$(SRCDIR)/$(2)/description-en-US.txt) $(call gb_ExtensionTarget_get_target,$(1)) : DESCRIPTION := $(true) ifneq ($(strip $(gb_WITH_LANG)),) -$(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(foreach lang,$(gb_ExtensionTarget_LANGS),description-$(lang).txt) +$(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(foreach lang,$(gb_ExtensionTarget_TRANS_LANGS),description-$(lang).txt) endif endef @@ -196,7 +202,7 @@ endef define gb_ExtensionTarget_localize_properties $(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(2) ifneq ($(strip $(gb_WITH_LANG)),) -$(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(foreach lang,$(subst -,_,$(gb_ExtensionTarget_LANGS)),$(subst en_US,$(lang),$(2))) +$(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(foreach lang,$(subst -,_,$(gb_ExtensionTarget_TRANS_LANGS)),$(subst en_US,$(lang),$(2))) $(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : SDF := $(gb_SDFLOCATION)$(subst $(SRCDIR),,$(dir $(3)))localize.sdf $(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : $$(SDF) endif @@ -210,27 +216,113 @@ $(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : $(3) \ endef -# localize extension help -define gb_ExtensionTarget_localize_help -ifneq ($(strip $(gb_WITH_LANG)),) -$(call gb_ExtensionTarget_get_target,$(1)) : FILES += $(foreach lang,$(gb_ExtensionTarget_LANGS),$(subst lang,$(lang),$(2))) -$(foreach lang,$(gb_ExtensionTarget_LANGS),$(call gb_ExtensionTarget_localize_help_onelang,$(1),$(subst lang,$(lang),$(2)),$(3),$(lang))) -endif +# add an .xhp help file, to be localized and compiled +# $(1): extension identifier +# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4)) +# suffix +# $(3): relative path of (target) .xhp file (e.g., +# com.sun.wiki-publisher/wiki.xhp) +# $(4): optional relative path of source .xhp file, when it differs from $(3) +# (i.e., if $(4) is empty the en-US source file is $(2)/$(3), otherwise it +# is $(2)/$(4)) +define gb_ExtensionTarget_add_helpfile +$(foreach lang,$(gb_ExtensionTarget_ALL_LANGS), \ + $(call gb_ExtensionTarget__localize_helpfile_onelang,$(1),$(2),$(3),$(4),$(lang)) \ + $(call gb_ExtensionTarget__add_compiled_help_dependency_onelang,$(1),$(lang))) +endef +# add a list of .xhp help files, to be localized and compiled +# $(1): extension identifier +# $(2): absolute path prefix of en-US source files without $(3) suffixes +# $(3): list of relative paths of .xhp files (see +# gb_ExtensionTarget_add_helpfile) +define gb_ExtensionTarget_add_helpfiles +$(foreach helpfile,$(3), \ + $(call gb_ExtensionTarget_add_helpfile,$(1),$(2),$(helpfile),)) endef -define gb_ExtensionTarget_localize_help_onelang -$(call gb_ExtensionTarget_get_target,$(1)) : $(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) -$(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : SDF := $(gb_SDFLOCATION)$(subst $(SRCDIR),,$(subst $(WORKDIR)/CustomTarget,,$(dir $(3))))localize.sdf -$(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : $$(SDF) -$(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : $(gb_ExtensionTarget_HELPEXTARGET) -$(call gb_ExtensionTarget_get_rootdir,$(1))/$(2) : $(3) - $$(call gb_Output_announce,$(2),$(true),XHP,3) - mkdir -p $$(dir $$@) && \ - $(gb_ExtensionTarget_HELPEXCOMMAND) -i $$< -o $$@ -l $(4) -m $$(SDF) +# localize one .xhp help file for one language; the result is stored as +# help/$(4)/$(3) in the extension's workdir; as a special case, if $(4) is +# "en-US", the source file is just copied, not passed through helpex +# $(1): extension identifier +# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4)) +# suffix +# $(3): relative path of (target) .xhp file (see +# gb_ExtensionTarget_add_helpfile) +# $(4): optional relative path of source .xhp file (see +# gb_ExtensionTarget_add_helpfile) +# $(5): language +define gb_ExtensionTarget__localize_helpfile_onelang +$(call gb_ExtensionTarget_get_rootdir,$(1))/help/$(5).done : HELPFILES += $(3) +$(call gb_ExtensionTarget_get_rootdir,$(1))/help/$(5).done : \ + $(call gb_ExtensionTarget_get_workdir,$(1))/help/$(5)/$(3) +$(call gb_ExtensionTarget_get_workdir,$(1))/help/$(5)/$(3) : \ + SDF := $(gb_SDFLOCATION)$(subst $(SRCDIR),,$(subst $(WORKDIR)/CustomTarget,,$(2)/$(dir $(or $(4),$(3)))))localize.sdf +$(call gb_ExtensionTarget_get_workdir,$(1))/help/$(5)/$(3) : $$(SDF) +$(call gb_ExtensionTarget_get_workdir,$(1))/help/$(5)/$(3) : \ + $(if $(filter-out en-US,$(5)),$(gb_ExtensionTarget_HELPEXTARGET)) | \ + $(call gb_ExtensionTarget_get_workdir,$(1))/help/.dir +$(call gb_ExtensionTarget_get_workdir,$(1))/help/$(5)/$(3) : \ + $(2)/$(or $(4),$(3)) + $$(call gb_Output_announce,$(1) $(3) $(5),$(true),XHP,3) + $$(call gb_Helper_abbreviate_dirs, \ + mkdir -p $$(dir $$@) && \ + $(if $(filter-out en-US,$(5)), \ + $(gb_ExtensionTarget_HELPEXCOMMAND) -i $$< -o $$@ -l $(5) \ + -m $$(SDF), \ + cp $$< $$@)) endef +# compile help for one language; the result is stored as help/$(3)/ in the +# extension's rootdir and marked for zipping into the .oxt +# $(1): extension identifier +# $(2): language +# Target-specific HELPFILES: list of relative paths of .xhp files (see +# gb_ExtensionTarget_add_helpfile) +define gb_ExtensionTarget__compile_help_onelang +$(call gb_ExtensionTarget_get_rootdir,$(1))/help/$(2).done : \ + $(call gb_Executable_get_target_for_build,HelpIndexer) \ + $(call gb_Executable_get_target_for_build,HelpLinker) \ + $(OUTDIR_FOR_BUILD)/bin/embed.xsl \ + $(OUTDIR_FOR_BUILD)/bin/idxcaption.xsl \ + $(OUTDIR_FOR_BUILD)/bin/idxcontent.xsl | \ + $(call gb_ExtensionTarget_get_rootdir,$(1))/help/.dir + $$(call gb_Output_announce,$(1) $(2),$(true),XHC,3) + $$(call gb_Helper_abbreviate_dirs, \ + rm -rf $$(basename $$@) && \ + mkdir $$(basename $$@) && \ + $(call gb_Executable_get_target_for_build,HelpLinker) -mod help \ + -extlangsrc $(call gb_ExtensionTarget_get_workdir,$(1))/help/$(2) \ + -sty $(OUTDIR_FOR_BUILD)/bin/embed.xsl \ + -extlangdest $$(basename $$@) \ + -idxcaption $(OUTDIR_FOR_BUILD)/bin/idxcaption.xsl \ + -idxcontent $(OUTDIR_FOR_BUILD)/bin/idxcontent.xsl \ + $$(HELPFILES) && \ + (cd $(call gb_ExtensionTarget_get_workdir,$(1))/help/$(2) && \ + $(gb_ExtensionTarget_ZIPCOMMAND) -r $$(basename $$@)/help.jar \ + $$(HELPFILES)) && \ + $(call gb_Executable_get_target_for_build,HelpIndexer) -lang $(2) \ + -mod help -dir $$(basename $$@) && \ + touch $$@) + +endef + +# establish the dependency that actually causes inclusion of the compiled help +# into the .oxt, for one language; in principle, this would only need to be done +# once per language iff the extension uses any help -- currently it is done from +# each individual gb_ExtensionTarget_add_helpfile call (and thus requires $strip +# to remove duplicates from FILES) +# $(1): extension identifier +# $(2): language +define gb_ExtensionTarget__add_compiled_help_dependency_onelang +$(call gb_ExtensionTarget_get_target,$(1)) : FILES += help/$(2) +$(call gb_ExtensionTarget_get_target,$(1)) : \ + $(call gb_ExtensionTarget_get_rootdir,$(1))/help/$(2).done + +endef + + define gb_ExtensionTarget_use_package $(call gb_ExtensionTarget_get_target,$(1)) : $(call gb_Package_get_target,$(2)) diff --git a/swext/Extension_wiki-publisher.mk b/swext/Extension_wiki-publisher.mk index 0beffb956c4f..e9e5088990ef 100644 --- a/swext/Extension_wiki-publisher.mk +++ b/swext/Extension_wiki-publisher.mk @@ -1,3 +1,4 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- # # Version: MPL 1.1 / GPLv3+ / LGPLv3+ # @@ -59,15 +60,12 @@ $(eval $(call gb_Extension_add_file,wiki-publisher,filter/math/scripts.xsl,$(OUT $(eval $(call gb_Extension_add_file,wiki-publisher,filter/math/tables.xsl,$(OUTDIR)/bin/xslt/export/xsltml/tables.xsl)) $(eval $(call gb_Extension_add_file,wiki-publisher,filter/math/tokens.xsl,$(OUTDIR)/bin/xslt/export/xsltml/tokens.xsl)) $(eval $(call gb_Extension_add_file,wiki-publisher,filter/odt2mediawiki.xsl,$(SRCDIR)/swext/mediawiki/src/filter/odt2mediawiki.xsl)) -$(eval $(call gb_Extension_add_file,wiki-publisher,help/en-US/com.sun.wiki-publisher/wikisend.xhp,$(SRCDIR)/swext/mediawiki/help/wikisend.xhp)) -$(eval $(call gb_Extension_add_file,wiki-publisher,help/en-US/com.sun.wiki-publisher/wikiformats.xhp,$(SRCDIR)/swext/mediawiki/help/wikiformats.xhp)) -$(eval $(call gb_Extension_add_file,wiki-publisher,help/en-US/com.sun.wiki-publisher/wikiaccount.xhp,$(SRCDIR)/swext/mediawiki/help/wikiaccount.xhp)) -$(eval $(call gb_Extension_add_file,wiki-publisher,help/en-US/com.sun.wiki-publisher/wiki.xhp,$(SRCDIR)/swext/mediawiki/help/wiki.xhp)) -$(eval $(call gb_Extension_add_file,wiki-publisher,help/en-US/com.sun.wiki-publisher/wikisettings.xhp,$(SRCDIR)/swext/mediawiki/help/wikisettings.xhp)) $(eval $(call gb_Extension_add_file,wiki-publisher,license/THIRDPARTYLICENSEREADME.html,$(SRCDIR)/swext/mediawiki/src/THIRDPARTYLICENSEREADME.html)) $(eval $(call gb_Extension_add_file,wiki-publisher,templates/MediaWiki/mediawiki.ott,$(SRCDIR)/swext/mediawiki/src/filter/mediawiki.ott)) -$(eval $(call gb_Extension_localize_help,wiki-publisher,help/lang/com.sun.wiki-publisher/wikisend.xhp,$(SRCDIR)/swext/mediawiki/help/wikisend.xhp)) -$(eval $(call gb_Extension_localize_help,wiki-publisher,help/lang/com.sun.wiki-publisher/wikiformats.xhp,$(SRCDIR)/swext/mediawiki/help/wikiformats.xhp)) -$(eval $(call gb_Extension_localize_help,wiki-publisher,help/lang/com.sun.wiki-publisher/wikiaccount.xhp,$(SRCDIR)/swext/mediawiki/help/wikiaccount.xhp)) -$(eval $(call gb_Extension_localize_help,wiki-publisher,help/lang/com.sun.wiki-publisher/wiki.xhp,$(SRCDIR)/swext/mediawiki/help/wiki.xhp)) -$(eval $(call gb_Extension_localize_help,wiki-publisher,help/lang/com.sun.wiki-publisher/wikisettings.xhp,$(SRCDIR)/swext/mediawiki/help/wikisettings.xhp)) +$(eval $(call gb_Extension_add_helpfile,wiki-publisher,$(SRCDIR)/swext/mediawiki/help,com.sun.wiki-publisher/wikisend.xhp,wikisend.xhp)) +$(eval $(call gb_Extension_add_helpfile,wiki-publisher,$(SRCDIR)/swext/mediawiki/help,com.sun.wiki-publisher/wikiformats.xhp,wikiformats.xhp)) +$(eval $(call gb_Extension_add_helpfile,wiki-publisher,$(SRCDIR)/swext/mediawiki/help,com.sun.wiki-publisher/wikiaccount.xhp,wikiaccount.xhp)) +$(eval $(call gb_Extension_add_helpfile,wiki-publisher,$(SRCDIR)/swext/mediawiki/help,com.sun.wiki-publisher/wiki.xhp,wiki.xhp)) +$(eval $(call gb_Extension_add_helpfile,wiki-publisher,$(SRCDIR)/swext/mediawiki/help,com.sun.wiki-publisher/wikisettings.xhp,wikisettings.xhp)) + +# vim: set noet sw=4 ts=4: |