From 7013769fef0d0927ebca168e018f33be05fcb3a9 Mon Sep 17 00:00:00 2001 From: FrEaKmAn Date: Fri, 21 Oct 2022 13:57:13 +0200 Subject: [PATCH] Update fmpp version, update bsh dependency, cleanup fmpp folder --- fmpp/BUILD.txt | 90 - fmpp/LICENSE.txt | 42 +- fmpp/LICENSE_FREEMARKER.txt | 251 +- fmpp/LICENSE_HAMCREST.txt | 27 + fmpp/README.txt | 4 +- fmpp/TODO.txt | 165 - fmpp/bin/fmpp | 41 +- fmpp/build.properties.sample | 29 - fmpp/build.xml | 583 -- fmpp/docs.fmpp | 125 - fmpp/docs/LICENSE_ANT.txt | 49 - fmpp/docs/LICENSE_FREEMARKER.txt | 49 - fmpp/docs/LICENSE_RESOLVER.txt | 14 - fmpp/docs/ant.html | 243 - fmpp/docs/api/allclasses-frame.html | 110 - fmpp/docs/api/allclasses-noframe.html | 110 - fmpp/docs/api/constant-values.html | 1184 ---- fmpp/docs/api/deprecated-list.html | 242 - .../api/fmpp/DataModelBuildingException.html | 297 - fmpp/docs/api/fmpp/Engine.html | 3063 --------- fmpp/docs/api/fmpp/LocalDataBuilder.html | 255 - fmpp/docs/api/fmpp/ProcessingException.html | 354 -- fmpp/docs/api/fmpp/ProgressListener.html | 474 -- .../api/fmpp/TemplateDataModelBuilder.html | 240 - fmpp/docs/api/fmpp/TemplateEnvironment.html | 875 --- .../api/fmpp/XmlRenderingConfiguration.html | 514 -- .../class-use/DataModelBuildingException.html | 192 - fmpp/docs/api/fmpp/class-use/Engine.html | 534 -- .../api/fmpp/class-use/LocalDataBuilder.html | 227 - .../fmpp/class-use/ProcessingException.html | 212 - .../api/fmpp/class-use/ProgressListener.html | 282 - .../class-use/TemplateDataModelBuilder.html | 183 - .../fmpp/class-use/TemplateEnvironment.html | 230 - .../class-use/XmlRenderingConfiguration.html | 169 - .../dataloaders/AbstractTextDataLoader.html | 376 -- .../api/fmpp/dataloaders/AntDataLoader.html | 375 -- .../dataloaders/AntProjectDataLoader.html | 316 - .../dataloaders/AntPropertiesDataLoader.html | 319 - .../dataloaders/AntPropertyDataLoader.html | 319 - .../fmpp/dataloaders/AntTaskDataLoader.html | 316 - .../api/fmpp/dataloaders/CsvDataLoader.html | 334 - .../api/fmpp/dataloaders/EvalDataLoader.html | 300 - .../api/fmpp/dataloaders/FileDataLoader.html | 392 -- .../fmpp/dataloaders/HtmlUtilsDataLoader.html | 315 - .../api/fmpp/dataloaders/JSONDataLoader.html | 340 - .../api/fmpp/dataloaders/NowDataLoader.html | 305 - .../dataloaders/PropertiesDataLoader.html | 317 - .../dataloaders/SlicedTextDataLoader.html | 389 -- .../api/fmpp/dataloaders/TddDataLoader.html | 319 - .../dataloaders/TddSequenceDataLoader.html | 319 - .../api/fmpp/dataloaders/TextDataLoader.html | 321 - .../api/fmpp/dataloaders/XmlDataLoader.html | 538 -- .../dataloaders/XmlInfosetDataLoader.html | 332 - .../class-use/AbstractTextDataLoader.html | 170 - .../dataloaders/class-use/AntDataLoader.html | 187 - .../class-use/AntProjectDataLoader.html | 125 - .../class-use/AntPropertiesDataLoader.html | 125 - .../class-use/AntPropertyDataLoader.html | 125 - .../class-use/AntTaskDataLoader.html | 125 - .../dataloaders/class-use/CsvDataLoader.html | 125 - .../dataloaders/class-use/EvalDataLoader.html | 125 - .../dataloaders/class-use/FileDataLoader.html | 222 - .../class-use/HtmlUtilsDataLoader.html | 125 - .../dataloaders/class-use/JSONDataLoader.html | 125 - .../dataloaders/class-use/NowDataLoader.html | 125 - .../class-use/PropertiesDataLoader.html | 125 - .../class-use/SlicedTextDataLoader.html | 125 - .../dataloaders/class-use/TddDataLoader.html | 125 - .../class-use/TddSequenceDataLoader.html | 125 - .../dataloaders/class-use/TextDataLoader.html | 125 - .../dataloaders/class-use/XmlDataLoader.html | 125 - .../class-use/XmlInfosetDataLoader.html | 125 - .../api/fmpp/dataloaders/package-frame.html | 39 - .../api/fmpp/dataloaders/package-summary.html | 265 - .../api/fmpp/dataloaders/package-tree.html | 165 - .../api/fmpp/dataloaders/package-use.html | 172 - .../BshLocalDataBuilder.html | 456 -- .../CachingLocalDataBuilder.html | 402 -- .../MapLocalDataBuilder.html | 297 - .../TddHashLocalDataBuilder.html | 352 -- .../class-use/BshLocalDataBuilder.html | 168 - .../class-use/CachingLocalDataBuilder.html | 170 - .../class-use/MapLocalDataBuilder.html | 125 - .../class-use/TddHashLocalDataBuilder.html | 125 - .../fmpp/localdatabuilders/package-frame.html | 24 - .../localdatabuilders/package-summary.html | 177 - .../fmpp/localdatabuilders/package-tree.html | 144 - .../fmpp/localdatabuilders/package-use.html | 170 - fmpp/docs/api/fmpp/models/AddTransform.html | 316 - fmpp/docs/api/fmpp/models/ClearTransform.html | 316 - .../models/CopyWritableVariableMethod.html | 302 - fmpp/docs/api/fmpp/models/CsvSequence.html | 921 --- fmpp/docs/api/fmpp/models/JSONArrayNode.html | 462 -- .../docs/api/fmpp/models/JSONBooleanNode.html | 442 -- fmpp/docs/api/fmpp/models/JSONNode.html | 466 -- fmpp/docs/api/fmpp/models/JSONNullNode.html | 403 -- fmpp/docs/api/fmpp/models/JSONNumberNode.html | 435 -- fmpp/docs/api/fmpp/models/JSONObjectNode.html | 525 -- fmpp/docs/api/fmpp/models/JSONStringNode.html | 442 -- .../fmpp/models/NewWritableHashMethod.html | 302 - .../models/NewWritableSequenceMethod.html | 302 - .../docs/api/fmpp/models/RemoveTransform.html | 316 - fmpp/docs/api/fmpp/models/SetTransform.html | 317 - .../api/fmpp/models/StringArraySequence.html | 325 - .../models/TemplateModelArrayCollection.html | 298 - .../models/TemplateModelListCollection.html | 298 - .../models/TemplateModelListSequence.html | 335 - .../api/fmpp/models/TemplateModelUtils.html | 437 -- fmpp/docs/api/fmpp/models/WritableHash.html | 437 -- .../api/fmpp/models/WritableSequence.html | 376 -- .../fmpp/models/class-use/AddTransform.html | 125 - .../fmpp/models/class-use/ClearTransform.html | 125 - .../class-use/CopyWritableVariableMethod.html | 125 - .../fmpp/models/class-use/CsvSequence.html | 125 - .../fmpp/models/class-use/JSONArrayNode.html | 125 - .../models/class-use/JSONBooleanNode.html | 125 - .../api/fmpp/models/class-use/JSONNode.html | 279 - .../fmpp/models/class-use/JSONNullNode.html | 125 - .../fmpp/models/class-use/JSONNumberNode.html | 125 - .../fmpp/models/class-use/JSONObjectNode.html | 125 - .../fmpp/models/class-use/JSONStringNode.html | 125 - .../class-use/NewWritableHashMethod.html | 125 - .../class-use/NewWritableSequenceMethod.html | 125 - .../models/class-use/RemoveTransform.html | 125 - .../fmpp/models/class-use/SetTransform.html | 125 - .../models/class-use/StringArraySequence.html | 125 - .../TemplateModelArrayCollection.html | 125 - .../TemplateModelListCollection.html | 125 - .../class-use/TemplateModelListSequence.html | 125 - .../models/class-use/TemplateModelUtils.html | 188 - .../fmpp/models/class-use/WritableHash.html | 125 - .../models/class-use/WritableSequence.html | 125 - fmpp/docs/api/fmpp/models/package-frame.html | 42 - .../docs/api/fmpp/models/package-summary.html | 289 - fmpp/docs/api/fmpp/models/package-tree.html | 165 - fmpp/docs/api/fmpp/models/package-use.html | 167 - fmpp/docs/api/fmpp/package-frame.html | 34 - fmpp/docs/api/fmpp/package-summary.html | 219 - fmpp/docs/api/fmpp/package-tree.html | 160 - fmpp/docs/api/fmpp/package-use.html | 350 -- .../AntProgressListener.html | 369 -- .../ConsoleProgressListener.html | 398 -- .../LoggerProgressListener.html | 558 -- .../StatisticsProgressListener.html | 485 -- .../TerseConsoleProgressListener.html | 363 -- .../class-use/AntProgressListener.html | 125 - .../class-use/ConsoleProgressListener.html | 125 - .../class-use/LoggerProgressListener.html | 125 - .../class-use/StatisticsProgressListener.html | 125 - .../TerseConsoleProgressListener.html | 125 - .../fmpp/progresslisteners/package-frame.html | 25 - .../progresslisteners/package-summary.html | 180 - .../fmpp/progresslisteners/package-tree.html | 142 - .../fmpp/progresslisteners/package-use.html | 125 - .../setting/FileWithConfigurationBase.html | 351 -- .../fmpp/setting/FileWithSettingValue.html | 365 -- .../api/fmpp/setting/SettingException.html | 284 - fmpp/docs/api/fmpp/setting/Settings.html | 2881 --------- .../class-use/FileWithConfigurationBase.html | 125 - .../class-use/FileWithSettingValue.html | 170 - .../setting/class-use/SettingException.html | 400 -- .../api/fmpp/setting/class-use/Settings.html | 125 - fmpp/docs/api/fmpp/setting/package-frame.html | 27 - .../api/fmpp/setting/package-summary.html | 189 - fmpp/docs/api/fmpp/setting/package-tree.html | 160 - fmpp/docs/api/fmpp/setting/package-use.html | 193 - fmpp/docs/api/fmpp/tdd/DataLoader.html | 256 - .../tdd/DataLoaderEvaluationEnvironment.html | 434 -- fmpp/docs/api/fmpp/tdd/EvalException.html | 350 -- .../api/fmpp/tdd/EvaluationEnvironment.html | 565 -- fmpp/docs/api/fmpp/tdd/Fragment.html | 366 -- fmpp/docs/api/fmpp/tdd/FunctionCall.html | 307 - fmpp/docs/api/fmpp/tdd/Interpreter.html | 701 --- fmpp/docs/api/fmpp/tdd/TddUtil.html | 283 - .../api/fmpp/tdd/class-use/DataLoader.html | 309 - .../DataLoaderEvaluationEnvironment.html | 125 - .../api/fmpp/tdd/class-use/EvalException.html | 244 - .../tdd/class-use/EvaluationEnvironment.html | 241 - .../docs/api/fmpp/tdd/class-use/Fragment.html | 193 - .../api/fmpp/tdd/class-use/FunctionCall.html | 175 - .../api/fmpp/tdd/class-use/Interpreter.html | 191 - fmpp/docs/api/fmpp/tdd/class-use/TddUtil.html | 125 - fmpp/docs/api/fmpp/tdd/package-frame.html | 34 - fmpp/docs/api/fmpp/tdd/package-summary.html | 222 - fmpp/docs/api/fmpp/tdd/package-tree.html | 160 - fmpp/docs/api/fmpp/tdd/package-use.html | 231 - .../AntTask.AntAttributeSubstitution.html | 330 - fmpp/docs/api/fmpp/tools/AntTask.html | 1202 ---- fmpp/docs/api/fmpp/tools/CommandLine.html | 359 -- .../AntTask.AntAttributeSubstitution.html | 191 - .../api/fmpp/tools/class-use/AntTask.html | 125 - .../api/fmpp/tools/class-use/CommandLine.html | 125 - fmpp/docs/api/fmpp/tools/package-frame.html | 23 - fmpp/docs/api/fmpp/tools/package-summary.html | 166 - fmpp/docs/api/fmpp/tools/package-tree.html | 152 - fmpp/docs/api/fmpp/tools/package-use.html | 162 - .../util/ArgsParser.BadArgsException.html | 230 - .../util/ArgsParser.OptionDefinition.html | 611 -- fmpp/docs/api/fmpp/util/ArgsParser.html | 846 --- fmpp/docs/api/fmpp/util/BorderedReader.html | 384 -- fmpp/docs/api/fmpp/util/BugException.html | 295 - fmpp/docs/api/fmpp/util/DataLoaderUtil.html | 494 -- fmpp/docs/api/fmpp/util/ExceptionCC.html | 309 - fmpp/docs/api/fmpp/util/FileUtil.html | 529 -- fmpp/docs/api/fmpp/util/FreemarkerUtil.html | 309 - .../api/fmpp/util/InstallationException.html | 283 - .../api/fmpp/util/JSONParseException.html | 294 - fmpp/docs/api/fmpp/util/JSONParser.html | 252 - fmpp/docs/api/fmpp/util/MiscUtil.html | 537 -- .../docs/api/fmpp/util/MultiListIterator.html | 400 -- fmpp/docs/api/fmpp/util/NullOutputStream.html | 322 - fmpp/docs/api/fmpp/util/NullWriter.html | 355 -- .../api/fmpp/util/RuntimeExceptionCC.html | 403 -- .../fmpp/util/StringUtil.ParseException.html | 355 -- fmpp/docs/api/fmpp/util/StringUtil.html | 1218 ---- .../ArgsParser.BadArgsException.html | 169 - .../ArgsParser.OptionDefinition.html | 242 - .../api/fmpp/util/class-use/ArgsParser.html | 125 - .../fmpp/util/class-use/BorderedReader.html | 125 - .../api/fmpp/util/class-use/BugException.html | 125 - .../fmpp/util/class-use/DataLoaderUtil.html | 125 - .../api/fmpp/util/class-use/ExceptionCC.html | 262 - .../api/fmpp/util/class-use/FileUtil.html | 125 - .../fmpp/util/class-use/FreemarkerUtil.html | 125 - .../util/class-use/InstallationException.html | 201 - .../util/class-use/JSONParseException.html | 168 - .../api/fmpp/util/class-use/JSONParser.html | 125 - .../api/fmpp/util/class-use/MiscUtil.html | 125 - .../util/class-use/MultiListIterator.html | 125 - .../fmpp/util/class-use/NullOutputStream.html | 167 - .../api/fmpp/util/class-use/NullWriter.html | 167 - .../util/class-use/RuntimeExceptionCC.html | 169 - .../class-use/StringUtil.ParseException.html | 271 - .../api/fmpp/util/class-use/StringUtil.html | 125 - fmpp/docs/api/fmpp/util/package-frame.html | 41 - fmpp/docs/api/fmpp/util/package-summary.html | 270 - fmpp/docs/api/fmpp/util/package-tree.html | 186 - fmpp/docs/api/fmpp/util/package-use.html | 325 - fmpp/docs/api/help-doc.html | 230 - fmpp/docs/api/index-all.html | 3456 ---------- fmpp/docs/api/index.html | 75 - fmpp/docs/api/overview-frame.html | 30 - fmpp/docs/api/overview-summary.html | 215 - fmpp/docs/api/overview-tree.html | 307 - fmpp/docs/api/package-list | 9 - fmpp/docs/api/script.js | 30 - fmpp/docs/api/serialized-form.html | 472 -- fmpp/docs/api/stylesheet.css | 574 -- fmpp/docs/basics.html | 74 - fmpp/docs/bsh.html | 78 - fmpp/docs/commandline.html | 577 -- fmpp/docs/configfile.html | 174 - fmpp/docs/dataloader.html | 769 --- fmpp/docs/details.html | 76 - fmpp/docs/examples/README.txt | 95 - fmpp/docs/examples/ant/build.xml | 14 - fmpp/docs/examples/ant/src/test.txt | 5 - fmpp/docs/examples/ant2/build.xml | 24 - fmpp/docs/examples/ant2/src/test.txt | 10 - fmpp/docs/examples/ant3/build.xml | 20 - fmpp/docs/examples/border/config.fmpp | 15 - .../border/src/include/ignoredir.fmpp | 0 .../docs/examples/border/src/include/test.ftl | 1 - fmpp/docs/examples/border/src/test.c | 24 - fmpp/docs/examples/border/src/test.html | 3 - fmpp/docs/examples/build.xml | 38 - fmpp/docs/examples/capture/config.fmpp | 3 - .../capture/src/include/ignoredir.fmpp | 0 .../examples/capture/src/include/page.ftl | 24 - fmpp/docs/examples/capture/src/test.html | 100 - fmpp/docs/examples/check_links/config.fmpp | 3 - .../examples/check_links/src/good_target.html | 1 - .../examples/check_links/src/include/a.ftl | 13 - .../check_links/src/include/ignoredir.fmpp | 0 fmpp/docs/examples/check_links/src/index.html | 3 - fmpp/docs/examples/csv/config.fmpp | 4 - .../docs/examples/csv/src/data/ignoredir.fmpp | 0 fmpp/docs/examples/csv/src/data/test.csv | 5 - fmpp/docs/examples/csv/src/test.html | 8 - fmpp/docs/examples/eval/config.fmpp | 7 - fmpp/docs/examples/eval/src/test.html | 17 - fmpp/docs/examples/ignoredir.fmpp | 1 - fmpp/docs/examples/img_dims/config.fmpp | 4 - fmpp/docs/examples/img_dims/src/falcon.png | Bin 4953 -> 0 bytes fmpp/docs/examples/img_dims/src/index.html | 12 - fmpp/docs/examples/inherit_config/README.txt | 14 - fmpp/docs/examples/inherit_config/config.fmpp | 4 - .../examples/inherit_config/config_dark.fmpp | 2 - .../examples/inherit_config/config_red.fmpp | 2 - .../examples/inherit_config/src/index.html | 3 - fmpp/docs/examples/local_data/config.fmpp | 29 - fmpp/docs/examples/local_data/src/index.html | 24 - fmpp/docs/examples/local_data/src/sub/1.html | 8 - .../examples/local_data/src/sub/1.html.bsh | 4 - fmpp/docs/examples/local_data/src/sub/2.html | 6 - .../docs/examples/local_data/src/sub/3_j.html | 8 - .../examples/local_data/src/sub/3_j.html.bsh | 4 - .../examples/local_data/src/sub/food.html | 6 - .../examples/local_data/src/sub/sky/1.html | 6 - .../examples/local_data/src/sub/sky/2.html | 6 - .../examples/local_data/src/sub/sky/3_a.html | 6 - .../examples/local_data/src/sub/subsub/1.html | 6 - .../examples/local_data/src/sub/subsub/2.html | 6 - fmpp/docs/examples/local_data/src/sub2/1.html | 6 - fmpp/docs/examples/local_data/src/sub2/2.html | 6 - fmpp/docs/examples/multipage_list/config.fmpp | 35 - .../examples/multipage_list/src/result.html | 56 - fmpp/docs/examples/qtour_step1/config.fmpp | 2 - fmpp/docs/examples/qtour_step1/src/falcon.png | Bin 4953 -> 0 bytes fmpp/docs/examples/qtour_step1/src/index.html | 9 - .../qtour_step1/src/subdir/something.html | 8 - fmpp/docs/examples/qtour_step2/config.fmpp | 3 - .../qtour_step2/src/data/ignoredir.fmpp | 0 .../examples/qtour_step2/src/data/style.tdd | 2 - fmpp/docs/examples/qtour_step2/src/falcon.png | Bin 4953 -> 0 bytes fmpp/docs/examples/qtour_step2/src/index.html | 9 - .../qtour_step2/src/subdir/something.html | 8 - fmpp/docs/examples/qtour_step3/config.fmpp | 6 - .../examples/qtour_step3/src/data/birds.csv | 4 - .../qtour_step3/src/data/ignoredir.fmpp | 0 .../examples/qtour_step3/src/data/style.tdd | 2 - fmpp/docs/examples/qtour_step3/src/falcon.png | Bin 4953 -> 0 bytes fmpp/docs/examples/qtour_step3/src/index.html | 17 - .../qtour_step3/src/subdir/something.html | 8 - fmpp/docs/examples/qtour_step4/config.fmpp | 6 - fmpp/docs/examples/qtour_step4/src/bird.html | 16 - .../examples/qtour_step4/src/data/birds.csv | 4 - .../qtour_step4/src/data/ignoredir.fmpp | 0 .../examples/qtour_step4/src/data/style.tdd | 2 - fmpp/docs/examples/qtour_step4/src/falcon.png | Bin 4953 -> 0 bytes fmpp/docs/examples/qtour_step4/src/index.html | 16 - .../qtour_step4/src/subdir/something.html | 8 - fmpp/docs/examples/session/config.fmpp | 4 - fmpp/docs/examples/session/src/01_foo.html | 6 - fmpp/docs/examples/session/src/02_bar.html | 6 - fmpp/docs/examples/session/src/03_baaz.html | 6 - fmpp/docs/examples/session/src/04_wombat.html | 6 - .../session/src/include/ignoredir.fmpp | 0 .../examples/session/src/include/page.ftl | 17 - fmpp/docs/examples/session/src/index.html | 14 - fmpp/docs/examples/tdd/config.fmpp | 4 - .../docs/examples/tdd/src/data/ignoredir.fmpp | 0 fmpp/docs/examples/tdd/src/data/test.tdd | 7 - fmpp/docs/examples/tdd/src/index.html | 10 - fmpp/docs/examples/xml/config.fmpp | 4 - .../docs/examples/xml/src/data/ignoredir.fmpp | 0 fmpp/docs/examples/xml/src/data/test.xml | 14 - fmpp/docs/examples/xml/src/test.html | 7 - fmpp/docs/examples/xml2/config.fmpp | 7 - .../examples/xml2/src/data/ignoredir.fmpp | 0 .../examples/xml2/src/data/manufacturers.xml | 21 - fmpp/docs/examples/xml2/src/data/products.xml | 26 - fmpp/docs/examples/xml2/src/index.html | 19 - fmpp/docs/examples/xml2/src/product.html | 36 - fmpp/docs/examples/xml_rendering/config.fmpp | 19 - .../examples/xml_rendering/src/bigwidget.xml | 8 - .../examples/xml_rendering/src/example1.xml | 37 - .../examples/xml_rendering/src/example2.xml | 12 - .../examples/xml_rendering/src/index.html | 17 - .../xml_rendering/src/normalwidget.xml | 7 - .../xml_rendering/src/renderer/book.html | 155 - .../xml_rendering/src/renderer/ignoredir.fmpp | 0 .../xml_rendering/src/renderer/product.html | 20 - .../xml_rendering/src/smallwidget.xml | 8 - fmpp/docs/examples/xml_try/config.fmpp | 12 - .../examples/xml_try/src/data/ignoredir.fmpp | 0 fmpp/docs/examples/xml_try/src/data/test.xml | 30 - fmpp/docs/examples/xml_try/src/index.html | 70 - fmpp/docs/examples/xml_validating/config.fmpp | 8 - .../examples/xml_validating/dtds/catalog.xml | 10 - .../xml_validating/dtds/xhtml-lat1.ent | 196 - .../xml_validating/dtds/xhtml-special.ent | 80 - .../xml_validating/dtds/xhtml-symbol.ent | 237 - .../dtds/xhtml1-transitional.dtd | 1201 ---- .../xml_validating/src/data/ignoredir.fmpp | 0 .../xml_validating/src/data/test.xhtml | 16 - .../docs/examples/xml_validating/src/test.txt | 16 - fmpp/docs/figures/fmpparch.png | Bin 8093 -> 0 bytes fmpp/docs/figures/qtour_step1.png | Bin 3142 -> 0 bytes fmpp/docs/figures/qtour_step1_src.png | Bin 1095 -> 0 bytes fmpp/docs/figures/qtour_step2.png | Bin 6176 -> 0 bytes fmpp/docs/figures/qtour_step4.png | Bin 6084 -> 0 bytes fmpp/docs/freemarker/alphaidx.html | 1529 ----- .../docs/freemarker/api/allclasses-frame.html | 197 - .../freemarker/api/allclasses-noframe.html | 197 - fmpp/docs/freemarker/api/constant-values.html | 2876 --------- fmpp/docs/freemarker/api/deprecated-list.html | 549 -- .../api/freemarker/cache/CacheStorage.html | 281 - .../cache/CacheStorageWithGetSize.html | 248 - .../freemarker/cache/ClassTemplateLoader.html | 420 -- .../cache/ConcurrentCacheStorage.html | 250 - .../freemarker/cache/FileTemplateLoader.html | 578 -- .../api/freemarker/cache/MruCacheStorage.html | 486 -- .../freemarker/cache/MultiTemplateLoader.html | 493 -- .../freemarker/cache/NullCacheStorage.html | 390 -- .../freemarker/cache/SoftCacheStorage.html | 405 -- .../cache/StatefulTemplateLoader.html | 246 - .../cache/StringTemplateLoader.html | 534 -- .../freemarker/cache/StrongCacheStorage.html | 389 -- .../api/freemarker/cache/TemplateCache.html | 618 -- .../api/freemarker/cache/TemplateLoader.html | 391 -- .../freemarker/cache/URLTemplateLoader.html | 539 -- .../cache/WebappTemplateLoader.html | 537 -- .../cache/class-use/CacheStorage.html | 290 - .../class-use/CacheStorageWithGetSize.html | 190 - .../cache/class-use/ClassTemplateLoader.html | 125 - .../class-use/ConcurrentCacheStorage.html | 184 - .../cache/class-use/FileTemplateLoader.html | 125 - .../cache/class-use/MruCacheStorage.html | 125 - .../cache/class-use/MultiTemplateLoader.html | 125 - .../cache/class-use/NullCacheStorage.html | 125 - .../cache/class-use/SoftCacheStorage.html | 125 - .../class-use/StatefulTemplateLoader.html | 169 - .../cache/class-use/StringTemplateLoader.html | 125 - .../cache/class-use/StrongCacheStorage.html | 125 - .../cache/class-use/TemplateCache.html | 125 - .../cache/class-use/TemplateLoader.html | 350 -- .../cache/class-use/URLTemplateLoader.html | 170 - .../cache/class-use/WebappTemplateLoader.html | 125 - .../api/freemarker/cache/package-frame.html | 39 - .../api/freemarker/cache/package-summary.html | 273 - .../api/freemarker/cache/package-tree.html | 165 - .../api/freemarker/cache/package-use.html | 253 - .../ArithmeticEngine.BigDecimalEngine.html | 447 -- .../ArithmeticEngine.ConservativeEngine.html | 478 -- .../api/freemarker/core/ArithmeticEngine.html | 579 -- .../api/freemarker/core/BugException.html | 321 - .../api/freemarker/core/CommandLine.html | 283 - ...rable.SettingValueAssignmentException.html | 248 - .../Configurable.UnknownSettingException.html | 245 - .../api/freemarker/core/Configurable.html | 2291 ------- .../api/freemarker/core/CustomAttribute.html | 478 -- .../core/Environment.Namespace.html | 293 - .../api/freemarker/core/Environment.html | 1707 ----- .../api/freemarker/core/FreeMarkerTree.html | 440 -- .../core/InvalidReferenceException.html | 301 - .../freemarker/core/NonBooleanException.html | 295 - .../api/freemarker/core/NonDateException.html | 295 - .../core/NonExtendedHashException.html | 295 - .../api/freemarker/core/NonHashException.html | 297 - .../freemarker/core/NonMethodException.html | 297 - .../api/freemarker/core/NonNodeException.html | 297 - .../core/NonNumericalException.html | 295 - .../freemarker/core/NonSequenceException.html | 297 - .../NonSequenceOrCollectionException.html | 298 - .../freemarker/core/NonStringException.html | 296 - .../core/OptInTemplateClassResolver.html | 362 -- .../api/freemarker/core/ParseException.html | 3238 ---------- .../api/freemarker/core/StopException.html | 305 - .../core/TemplateClassResolver.html | 330 - .../core/UnexpectedTypeException.html | 284 - .../ArithmeticEngine.BigDecimalEngine.html | 170 - .../ArithmeticEngine.ConservativeEngine.html | 171 - .../core/class-use/ArithmeticEngine.html | 206 - .../core/class-use/BugException.html | 125 - .../core/class-use/CommandLine.html | 125 - ...rable.SettingValueAssignmentException.html | 125 - .../Configurable.UnknownSettingException.html | 125 - .../core/class-use/Configurable.html | 233 - .../core/class-use/CustomAttribute.html | 125 - .../core/class-use/Environment.Namespace.html | 203 - .../core/class-use/Environment.html | 529 -- .../core/class-use/FreeMarkerTree.html | 125 - .../class-use/InvalidReferenceException.html | 125 - .../core/class-use/NonBooleanException.html | 125 - .../core/class-use/NonDateException.html | 125 - .../class-use/NonExtendedHashException.html | 125 - .../core/class-use/NonHashException.html | 125 - .../core/class-use/NonMethodException.html | 125 - .../core/class-use/NonNodeException.html | 125 - .../core/class-use/NonNumericalException.html | 125 - .../core/class-use/NonSequenceException.html | 125 - .../NonSequenceOrCollectionException.html | 125 - .../core/class-use/NonStringException.html | 125 - .../class-use/OptInTemplateClassResolver.html | 125 - .../core/class-use/ParseException.html | 227 - .../core/class-use/StopException.html | 125 - .../core/class-use/TemplateClassResolver.html | 230 - .../class-use/UnexpectedTypeException.html | 225 - .../api/freemarker/core/package-frame.html | 53 - .../api/freemarker/core/package-summary.html | 342 - .../api/freemarker/core/package-tree.html | 225 - .../api/freemarker/core/package-use.html | 315 - .../api/freemarker/debug/Breakpoint.html | 378 -- .../api/freemarker/debug/DebugModel.html | 748 --- .../freemarker/debug/DebuggedEnvironment.html | 315 - .../api/freemarker/debug/Debugger.html | 459 -- .../api/freemarker/debug/DebuggerClient.html | 267 - .../freemarker/debug/DebuggerListener.html | 238 - .../debug/EnvironmentSuspendedEvent.html | 366 -- .../debug/class-use/Breakpoint.html | 176 - .../debug/class-use/DebugModel.html | 201 - .../debug/class-use/DebuggedEnvironment.html | 184 - .../freemarker/debug/class-use/Debugger.html | 173 - .../debug/class-use/DebuggerClient.html | 125 - .../debug/class-use/DebuggerListener.html | 170 - .../class-use/EnvironmentSuspendedEvent.html | 170 - .../api/freemarker/debug/package-frame.html | 30 - .../api/freemarker/debug/package-summary.html | 208 - .../api/freemarker/debug/package-tree.html | 163 - .../api/freemarker/debug/package-use.html | 191 - .../freemarker/ext/ant/FreemarkerXmlTask.html | 796 --- .../api/freemarker/ext/ant/JythonAntTask.html | 360 -- .../ext/ant/UnlinkedJythonOperationsImpl.html | 300 - .../ext/ant/class-use/FreemarkerXmlTask.html | 125 - .../ext/ant/class-use/JythonAntTask.html | 183 - .../UnlinkedJythonOperationsImpl.html | 125 - .../api/freemarker/ext/ant/package-frame.html | 23 - .../freemarker/ext/ant/package-summary.html | 170 - .../api/freemarker/ext/ant/package-tree.html | 152 - .../api/freemarker/ext/ant/package-use.html | 164 - .../api/freemarker/ext/beans/ArrayModel.html | 416 -- .../api/freemarker/ext/beans/BeanModel.html | 655 -- .../freemarker/ext/beans/BeansModelCache.html | 271 - ...BeansWrapper.MethodAppearanceDecision.html | 345 - ...Wrapper.MethodAppearanceDecisionInput.html | 293 - .../freemarker/ext/beans/BeansWrapper.html | 1499 ----- .../ext/beans/BeansWrapperBuilder.html | 389 -- .../ext/beans/BeansWrapperConfiguration.html | 625 -- .../freemarker/ext/beans/BooleanModel.html | 328 - .../freemarker/ext/beans/CollectionModel.html | 433 -- .../api/freemarker/ext/beans/DateModel.html | 364 -- .../ext/beans/EnumerationModel.html | 407 -- .../api/freemarker/ext/beans/HashAdapter.html | 366 -- .../ext/beans/InvalidPropertyException.html | 282 - .../freemarker/ext/beans/IteratorModel.html | 411 -- .../api/freemarker/ext/beans/MapModel.html | 475 -- .../ext/beans/MethodAppearanceFineTuner.html | 290 - .../api/freemarker/ext/beans/NumberModel.html | 337 - .../ext/beans/OverloadedMethodsModel.html | 338 - .../ext/beans/ResourceBundleModel.html | 483 -- .../freemarker/ext/beans/SimpleMapModel.html | 499 -- .../ext/beans/SimpleMethodModel.html | 387 -- .../ext/beans/SingletonCustomizer.html | 193 - .../api/freemarker/ext/beans/StringModel.html | 348 - .../ext/beans/class-use/ArrayModel.html | 125 - .../ext/beans/class-use/BeanModel.html | 234 - .../ext/beans/class-use/BeansModelCache.html | 125 - ...BeansWrapper.MethodAppearanceDecision.html | 188 - ...Wrapper.MethodAppearanceDecisionInput.html | 174 - .../ext/beans/class-use/BeansWrapper.html | 344 - .../beans/class-use/BeansWrapperBuilder.html | 125 - .../class-use/BeansWrapperConfiguration.html | 229 - .../ext/beans/class-use/BooleanModel.html | 125 - .../ext/beans/class-use/CollectionModel.html | 125 - .../ext/beans/class-use/DateModel.html | 125 - .../ext/beans/class-use/EnumerationModel.html | 125 - .../ext/beans/class-use/HashAdapter.html | 125 - .../class-use/InvalidPropertyException.html | 125 - .../ext/beans/class-use/IteratorModel.html | 125 - .../ext/beans/class-use/MapModel.html | 125 - .../class-use/MethodAppearanceFineTuner.html | 197 - .../ext/beans/class-use/NumberModel.html | 125 - .../class-use/OverloadedMethodsModel.html | 125 - .../beans/class-use/ResourceBundleModel.html | 125 - .../ext/beans/class-use/SimpleMapModel.html | 125 - .../beans/class-use/SimpleMethodModel.html | 125 - .../beans/class-use/SingletonCustomizer.html | 125 - .../ext/beans/class-use/StringModel.html | 181 - .../freemarker/ext/beans/package-frame.html | 50 - .../freemarker/ext/beans/package-summary.html | 350 -- .../freemarker/ext/beans/package-tree.html | 201 - .../api/freemarker/ext/beans/package-use.html | 259 - .../api/freemarker/ext/dom/NodeModel.html | 1013 --- .../api/freemarker/ext/dom/Transform.html | 243 - .../api/freemarker/ext/dom/XPathSupport.html | 229 - .../ext/dom/class-use/NodeModel.html | 196 - .../ext/dom/class-use/Transform.html | 125 - .../ext/dom/class-use/XPathSupport.html | 125 - .../api/freemarker/ext/dom/package-frame.html | 26 - .../freemarker/ext/dom/package-summary.html | 180 - .../api/freemarker/ext/dom/package-tree.html | 143 - .../api/freemarker/ext/dom/package-use.html | 163 - .../freemarker/ext/jdom/NodeListModel.html | 762 --- .../ext/jdom/class-use/NodeListModel.html | 125 - .../freemarker/ext/jdom/package-frame.html | 21 - .../freemarker/ext/jdom/package-summary.html | 156 - .../api/freemarker/ext/jdom/package-tree.html | 138 - .../api/freemarker/ext/jdom/package-use.html | 125 - .../freemarker/ext/jsp/EventForwarding.html | 437 -- .../api/freemarker/ext/jsp/FreemarkerTag.html | 491 -- .../api/freemarker/ext/jsp/TaglibFactory.html | 353 -- .../ext/jsp/class-use/EventForwarding.html | 125 - .../ext/jsp/class-use/FreemarkerTag.html | 125 - .../ext/jsp/class-use/TaglibFactory.html | 125 - .../api/freemarker/ext/jsp/package-frame.html | 23 - .../freemarker/ext/jsp/package-summary.html | 175 - .../api/freemarker/ext/jsp/package-tree.html | 140 - .../api/freemarker/ext/jsp/package-use.html | 125 - .../ext/jython/JythonHashModel.html | 411 -- .../freemarker/ext/jython/JythonModel.html | 543 -- .../ext/jython/JythonNumberModel.html | 344 - .../ext/jython/JythonSequenceModel.html | 392 -- .../ext/jython/JythonVersionAdapter.html | 314 - .../freemarker/ext/jython/JythonWrapper.html | 429 -- .../ext/jython/class-use/JythonHashModel.html | 125 - .../ext/jython/class-use/JythonModel.html | 183 - .../jython/class-use/JythonNumberModel.html | 125 - .../jython/class-use/JythonSequenceModel.html | 125 - .../class-use/JythonVersionAdapter.html | 125 - .../ext/jython/class-use/JythonWrapper.html | 195 - .../freemarker/ext/jython/package-frame.html | 26 - .../ext/jython/package-summary.html | 197 - .../freemarker/ext/jython/package-tree.html | 146 - .../freemarker/ext/jython/package-use.html | 168 - .../ext/rhino/RhinoFunctionModel.html | 346 - .../ext/rhino/RhinoScriptableModel.html | 545 -- .../freemarker/ext/rhino/RhinoWrapper.html | 383 -- .../rhino/class-use/RhinoFunctionModel.html | 125 - .../rhino/class-use/RhinoScriptableModel.html | 167 - .../ext/rhino/class-use/RhinoWrapper.html | 125 - .../freemarker/ext/rhino/package-frame.html | 23 - .../freemarker/ext/rhino/package-summary.html | 160 - .../freemarker/ext/rhino/package-tree.html | 147 - .../api/freemarker/ext/rhino/package-use.html | 160 - .../ext/servlet/AllHttpScopesHashModel.html | 389 -- .../ext/servlet/FreemarkerServlet.html | 1033 --- .../ext/servlet/HttpRequestHashModel.html | 444 -- .../HttpRequestParametersHashModel.html | 397 -- .../ext/servlet/HttpSessionHashModel.html | 376 -- .../freemarker/ext/servlet/IncludePage.html | 343 - .../ext/servlet/ServletContextHashModel.html | 367 -- .../class-use/AllHttpScopesHashModel.html | 125 - .../servlet/class-use/FreemarkerServlet.html | 172 - .../class-use/HttpRequestHashModel.html | 125 - .../HttpRequestParametersHashModel.html | 169 - .../class-use/HttpSessionHashModel.html | 125 - .../ext/servlet/class-use/IncludePage.html | 125 - .../class-use/ServletContextHashModel.html | 125 - .../freemarker/ext/servlet/package-frame.html | 27 - .../ext/servlet/package-summary.html | 196 - .../freemarker/ext/servlet/package-tree.html | 160 - .../freemarker/ext/servlet/package-use.html | 169 - .../freemarker/ext/util/IdentityHashMap.html | 790 --- .../api/freemarker/ext/util/ModelCache.html | 354 -- .../api/freemarker/ext/util/ModelFactory.html | 230 - .../ext/util/WrapperTemplateModel.html | 253 - .../ext/util/class-use/IdentityHashMap.html | 125 - .../ext/util/class-use/ModelCache.html | 169 - .../ext/util/class-use/ModelFactory.html | 213 - .../util/class-use/WrapperTemplateModel.html | 324 - .../freemarker/ext/util/package-frame.html | 27 - .../freemarker/ext/util/package-summary.html | 187 - .../api/freemarker/ext/util/package-tree.html | 152 - .../api/freemarker/ext/util/package-use.html | 248 - .../api/freemarker/ext/xml/NodeListModel.html | 849 --- .../ext/xml/class-use/NodeListModel.html | 125 - .../api/freemarker/ext/xml/package-frame.html | 21 - .../freemarker/ext/xml/package-summary.html | 156 - .../api/freemarker/ext/xml/package-tree.html | 138 - .../api/freemarker/ext/xml/package-use.html | 125 - .../freemarker/api/freemarker/log/Logger.html | 739 --- .../api/freemarker/log/class-use/Logger.html | 170 - .../api/freemarker/log/package-frame.html | 21 - .../api/freemarker/log/package-summary.html | 156 - .../api/freemarker/log/package-tree.html | 138 - .../api/freemarker/log/package-use.html | 163 - .../template/AdapterTemplateModel.html | 274 - .../freemarker/template/Configuration.html | 2812 --------- .../template/DefaultObjectWrapper.html | 484 -- .../template/DefaultObjectWrapperBuilder.html | 316 - .../freemarker/template/LocalizedString.html | 348 - .../freemarker/template/ObjectWrapper.html | 355 -- .../ResourceBundleLocalizedString.html | 326 - .../freemarker/template/SimpleCollection.html | 384 -- .../api/freemarker/template/SimpleDate.html | 407 -- .../api/freemarker/template/SimpleHash.html | 689 -- .../api/freemarker/template/SimpleList.html | 318 - .../api/freemarker/template/SimpleNumber.html | 399 -- .../template/SimpleObjectWrapper.html | 373 -- .../api/freemarker/template/SimpleScalar.html | 343 - .../freemarker/template/SimpleSequence.html | 649 -- .../Template.WrongEncodingException.html | 2656 -------- .../api/freemarker/template/Template.html | 1111 ---- .../template/TemplateBooleanModel.html | 301 - .../template/TemplateCollectionModel.html | 261 - .../template/TemplateDateModel.html | 382 -- .../template/TemplateDirectiveBody.html | 246 - .../template/TemplateDirectiveModel.html | 294 - .../template/TemplateException.html | 803 --- .../template/TemplateExceptionHandler.html | 342 - .../template/TemplateHashModel.html | 286 - .../template/TemplateHashModelEx.html | 312 - .../template/TemplateMethodModel.html | 282 - .../template/TemplateMethodModelEx.html | 273 - .../freemarker/template/TemplateModel.html | 249 - .../template/TemplateModelAdapter.html | 235 - .../template/TemplateModelException.html | 452 -- .../template/TemplateModelIterator.html | 257 - .../template/TemplateModelListSequence.html | 344 - .../template/TemplateNodeModel.html | 362 -- .../template/TemplateNumberModel.html | 259 - .../template/TemplateScalarModel.html | 289 - .../template/TemplateSequenceModel.html | 284 - .../template/TemplateTransformModel.html | 278 - .../freemarker/template/TransformControl.html | 423 -- .../api/freemarker/template/Version.html | 526 -- .../template/WrappingTemplateModel.html | 404 -- .../class-use/AdapterTemplateModel.html | 352 -- .../template/class-use/Configuration.html | 353 -- .../class-use/DefaultObjectWrapper.html | 187 - .../DefaultObjectWrapperBuilder.html | 125 - .../template/class-use/LocalizedString.html | 172 - .../template/class-use/ObjectWrapper.html | 646 -- .../ResourceBundleLocalizedString.html | 125 - .../template/class-use/SimpleCollection.html | 125 - .../template/class-use/SimpleDate.html | 125 - .../template/class-use/SimpleHash.html | 222 - .../template/class-use/SimpleList.html | 125 - .../template/class-use/SimpleNumber.html | 125 - .../class-use/SimpleObjectWrapper.html | 125 - .../template/class-use/SimpleScalar.html | 125 - .../template/class-use/SimpleSequence.html | 186 - .../Template.WrongEncodingException.html | 125 - .../template/class-use/Template.html | 479 -- .../class-use/TemplateBooleanModel.html | 308 - .../class-use/TemplateCollectionModel.html | 454 -- .../template/class-use/TemplateDateModel.html | 200 - .../class-use/TemplateDirectiveBody.html | 204 - .../class-use/TemplateDirectiveModel.html | 199 - .../template/class-use/TemplateException.html | 671 -- .../class-use/TemplateExceptionHandler.html | 236 - .../template/class-use/TemplateHashModel.html | 610 -- .../class-use/TemplateHashModelEx.html | 440 -- .../class-use/TemplateMethodModel.html | 360 -- .../class-use/TemplateMethodModelEx.html | 297 - .../template/class-use/TemplateModel.html | 1492 ----- .../class-use/TemplateModelAdapter.html | 169 - .../class-use/TemplateModelException.html | 1145 ---- .../class-use/TemplateModelIterator.html | 318 - .../class-use/TemplateModelListSequence.html | 125 - .../template/class-use/TemplateNodeModel.html | 310 - .../class-use/TemplateNumberModel.html | 287 - .../class-use/TemplateScalarModel.html | 357 -- .../class-use/TemplateSequenceModel.html | 423 -- .../class-use/TemplateTransformModel.html | 205 - .../template/class-use/TransformControl.html | 125 - .../template/class-use/Version.html | 358 -- .../class-use/WrappingTemplateModel.html | 274 - .../freemarker/template/package-frame.html | 67 - .../freemarker/template/package-summary.html | 439 -- .../api/freemarker/template/package-tree.html | 233 - .../api/freemarker/template/package-use.html | 1148 ---- .../template/utility/CaptureOutput.html | 354 -- .../template/utility/ClassUtil.html | 435 -- .../template/utility/CollectionUtils.html | 257 - .../template/utility/Collections12.html | 302 - .../template/utility/Constants.html | 398 -- .../template/utility/DOMNodeModel.html | 327 - ...ateUtil.CalendarFieldsToDateConverter.html | 252 - .../utility/DateUtil.DateParseException.html | 279 - ...DateUtil.DateToISO8601CalendarFactory.html | 241 - ....TrivialCalendarFieldsToDateConverter.html | 308 - ...l.TrivialDateToISO8601CalendarFactory.html | 296 - .../freemarker/template/utility/DateUtil.html | 720 --- .../template/utility/DeepUnwrap.html | 357 -- .../freemarker/template/utility/Execute.html | 336 - .../template/utility/HtmlEscape.html | 346 - .../template/utility/JythonRuntime.html | 339 - .../template/utility/NormalizeNewlines.html | 374 -- .../utility/NullArgumentException.html | 315 - .../template/utility/NullWriter.html | 443 -- .../template/utility/NumberUtil.html | 297 - .../template/utility/ObjectConstructor.html | 327 - .../template/utility/OptimizerUtil.html | 263 - .../template/utility/SecurityUtilities.html | 268 - .../template/utility/StandardCompress.html | 405 -- .../template/utility/StringUtil.html | 1174 ---- .../template/utility/ToCanonical.html | 273 - .../utility/UndeclaredThrowableException.html | 354 -- .../UnrecognizedTimeZoneException.html | 298 - .../UnsupportedNumberClassException.html | 303 - .../template/utility/WriteProtectable.html | 248 - .../template/utility/XmlEscape.html | 324 - .../utility/class-use/CaptureOutput.html | 125 - .../template/utility/class-use/ClassUtil.html | 125 - .../utility/class-use/CollectionUtils.html | 125 - .../utility/class-use/Collections12.html | 125 - .../template/utility/class-use/Constants.html | 125 - .../utility/class-use/DOMNodeModel.html | 125 - ...ateUtil.CalendarFieldsToDateConverter.html | 226 - .../DateUtil.DateParseException.html | 217 - ...DateUtil.DateToISO8601CalendarFactory.html | 204 - ....TrivialCalendarFieldsToDateConverter.html | 125 - ...l.TrivialDateToISO8601CalendarFactory.html | 125 - .../template/utility/class-use/DateUtil.html | 125 - .../utility/class-use/DeepUnwrap.html | 125 - .../template/utility/class-use/Execute.html | 125 - .../utility/class-use/HtmlEscape.html | 125 - .../utility/class-use/JythonRuntime.html | 125 - .../utility/class-use/NormalizeNewlines.html | 125 - .../class-use/NullArgumentException.html | 125 - .../utility/class-use/NullWriter.html | 167 - .../utility/class-use/NumberUtil.html | 125 - .../utility/class-use/ObjectConstructor.html | 125 - .../utility/class-use/OptimizerUtil.html | 125 - .../utility/class-use/SecurityUtilities.html | 125 - .../utility/class-use/StandardCompress.html | 167 - .../utility/class-use/StringUtil.html | 125 - .../utility/class-use/ToCanonical.html | 125 - .../UndeclaredThrowableException.html | 125 - .../UnrecognizedTimeZoneException.html | 169 - .../UnsupportedNumberClassException.html | 125 - .../utility/class-use/WriteProtectable.html | 230 - .../template/utility/class-use/XmlEscape.html | 125 - .../template/utility/package-frame.html | 57 - .../template/utility/package-summary.html | 352 -- .../template/utility/package-tree.html | 199 - .../template/utility/package-use.html | 261 - fmpp/docs/freemarker/api/help-doc.html | 230 - fmpp/docs/freemarker/api/index-all.html | 5574 ----------------- fmpp/docs/freemarker/api/index.html | 75 - fmpp/docs/freemarker/api/overview-frame.html | 37 - .../docs/freemarker/api/overview-summary.html | 245 - fmpp/docs/freemarker/api/overview-tree.html | 501 -- fmpp/docs/freemarker/api/package-list | 16 - fmpp/docs/freemarker/api/script.js | 30 - fmpp/docs/freemarker/api/serialized-form.html | 928 --- fmpp/docs/freemarker/api/stylesheet.css | 574 -- fmpp/docs/freemarker/app.html | 242 - fmpp/docs/freemarker/app_eccn.html | 92 - fmpp/docs/freemarker/app_faq.html | 1899 ------ fmpp/docs/freemarker/app_install.html | 130 - fmpp/docs/freemarker/app_legal.html | 101 - fmpp/docs/freemarker/app_license.html | 139 - fmpp/docs/freemarker/app_versions.html | 224 - fmpp/docs/freemarker/detailed-toc.html | 1989 ------ fmpp/docs/freemarker/dgui.html | 153 - fmpp/docs/freemarker/dgui_datamodel.html | 101 - .../freemarker/dgui_datamodel_basics.html | 297 - .../docs/freemarker/dgui_datamodel_types.html | 579 -- fmpp/docs/freemarker/dgui_misc.html | 110 - .../dgui_misc_alternativesyntax.html | 158 - fmpp/docs/freemarker/dgui_misc_namespace.html | 433 -- .../docs/freemarker/dgui_misc_userdefdir.html | 641 -- fmpp/docs/freemarker/dgui_misc_var.html | 230 - .../docs/freemarker/dgui_misc_whitespace.html | 367 -- fmpp/docs/freemarker/dgui_quickstart.html | 108 - .../freemarker/dgui_quickstart_basics.html | 185 - .../freemarker/dgui_quickstart_datamodel.html | 237 - .../freemarker/dgui_quickstart_template.html | 534 -- fmpp/docs/freemarker/dgui_template.html | 114 - .../freemarker/dgui_template_directives.html | 176 - fmpp/docs/freemarker/dgui_template_exp.html | 2596 -------- .../dgui_template_overallstructure.html | 171 - .../dgui_template_valueinsertion.html | 395 -- .../freemarker/docgen-resources/docgen.css | 147 - .../docgen-resources/img/callouts/1.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/10.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/11.gif | Bin 244 -> 0 bytes .../docgen-resources/img/callouts/12.gif | Bin 244 -> 0 bytes .../docgen-resources/img/callouts/13.gif | Bin 244 -> 0 bytes .../docgen-resources/img/callouts/14.gif | Bin 244 -> 0 bytes .../docgen-resources/img/callouts/2.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/3.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/4.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/5.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/6.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/7.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/8.gif | Bin 968 -> 0 bytes .../docgen-resources/img/callouts/9.gif | Bin 968 -> 0 bytes .../docgen-resources/img/linktargetmarker.gif | Bin 433 -> 0 bytes .../img/navigation-gradient.gif | Bin 1540 -> 0 bytes .../freemarker/docgen-resources/img/none.gif | Bin 42 -> 0 bytes .../freemarker/docgen-resources/img/xxe.gif | Bin 1526 -> 0 bytes .../freemarker/docgen-resources/jquery.js | 19 - .../docgen-resources/linktargetmarker.js | 43 - fmpp/docs/freemarker/eclipse-toc.xml | 643 -- fmpp/docs/freemarker/figures/model2sketch.png | Bin 21425 -> 0 bytes fmpp/docs/freemarker/figures/overview.png | Bin 4996 -> 0 bytes fmpp/docs/freemarker/figures/tree.png | Bin 4699 -> 0 bytes fmpp/docs/freemarker/gloss.html | 745 --- fmpp/docs/freemarker/index.html | 599 -- fmpp/docs/freemarker/pgui.html | 192 - fmpp/docs/freemarker/pgui_config.html | 112 - fmpp/docs/freemarker/pgui_config_basics.html | 107 - .../freemarker/pgui_config_errorhandling.html | 454 -- .../docs/freemarker/pgui_config_settings.html | 361 -- .../pgui_config_sharedvariables.html | 180 - .../pgui_config_templateloading.html | 410 -- fmpp/docs/freemarker/pgui_datamodel.html | 118 - .../freemarker/pgui_datamodel_basics.html | 141 - .../freemarker/pgui_datamodel_directive.html | 480 -- .../freemarker/pgui_datamodel_method.html | 130 - fmpp/docs/freemarker/pgui_datamodel_node.html | 165 - .../pgui_datamodel_objectWrapper.html | 289 - .../freemarker/pgui_datamodel_parent.html | 190 - .../freemarker/pgui_datamodel_scalar.html | 193 - fmpp/docs/freemarker/pgui_misc.html | 127 - fmpp/docs/freemarker/pgui_misc_ant.html | 150 - .../freemarker/pgui_misc_beanwrapper.html | 761 --- fmpp/docs/freemarker/pgui_misc_charset.html | 229 - .../freemarker/pgui_misc_jythonwrapper.html | 205 - fmpp/docs/freemarker/pgui_misc_logging.html | 210 - .../freemarker/pgui_misc_multithreading.html | 109 - fmpp/docs/freemarker/pgui_misc_secureenv.html | 124 - fmpp/docs/freemarker/pgui_misc_servlet.html | 660 -- fmpp/docs/freemarker/pgui_misc_var.html | 149 - .../docs/freemarker/pgui_misc_xml_legacy.html | 583 -- fmpp/docs/freemarker/pgui_quickstart.html | 111 - fmpp/docs/freemarker/pgui_quickstart_all.html | 136 - .../pgui_quickstart_createconfiguration.html | 134 - .../pgui_quickstart_createdatamodel.html | 156 - .../pgui_quickstart_gettemplate.html | 106 - .../freemarker/pgui_quickstart_merge.html | 114 - fmpp/docs/freemarker/preface.html | 280 - fmpp/docs/freemarker/ref.html | 226 - fmpp/docs/freemarker/ref_builtins.html | 122 - .../freemarker/ref_builtins_alphaidx.html | 439 -- .../docs/freemarker/ref_builtins_boolean.html | 199 - fmpp/docs/freemarker/ref_builtins_date.html | 607 -- fmpp/docs/freemarker/ref_builtins_expert.html | 622 -- fmpp/docs/freemarker/ref_builtins_hash.html | 161 - fmpp/docs/freemarker/ref_builtins_node.html | 294 - fmpp/docs/freemarker/ref_builtins_number.html | 531 -- .../freemarker/ref_builtins_sequence.html | 685 -- fmpp/docs/freemarker/ref_builtins_string.html | 2177 ------- fmpp/docs/freemarker/ref_depr_builtin.html | 143 - fmpp/docs/freemarker/ref_depr_directive.html | 131 - .../ref_depr_numerical_interpolation.html | 193 - fmpp/docs/freemarker/ref_depr_oldmacro.html | 260 - fmpp/docs/freemarker/ref_depr_oldsyntax.html | 171 - fmpp/docs/freemarker/ref_depr_transform.html | 222 - fmpp/docs/freemarker/ref_deprecated.html | 113 - .../freemarker/ref_directive_alphaidx.html | 236 - .../docs/freemarker/ref_directive_assign.html | 262 - .../freemarker/ref_directive_attempt.html | 266 - .../freemarker/ref_directive_compress.html | 163 - .../docs/freemarker/ref_directive_escape.html | 279 - fmpp/docs/freemarker/ref_directive_flush.html | 146 - fmpp/docs/freemarker/ref_directive_ftl.html | 297 - .../freemarker/ref_directive_function.html | 233 - .../docs/freemarker/ref_directive_global.html | 184 - fmpp/docs/freemarker/ref_directive_if.html | 252 - .../docs/freemarker/ref_directive_import.html | 207 - .../freemarker/ref_directive_include.html | 526 -- fmpp/docs/freemarker/ref_directive_list.html | 252 - fmpp/docs/freemarker/ref_directive_local.html | 162 - fmpp/docs/freemarker/ref_directive_macro.html | 480 -- .../freemarker/ref_directive_noparse.html | 161 - fmpp/docs/freemarker/ref_directive_nt.html | 134 - .../freemarker/ref_directive_setting.html | 487 -- fmpp/docs/freemarker/ref_directive_stop.html | 148 - .../docs/freemarker/ref_directive_switch.html | 217 - fmpp/docs/freemarker/ref_directive_t.html | 209 - .../freemarker/ref_directive_userDefined.html | 377 -- fmpp/docs/freemarker/ref_directive_visit.html | 469 -- fmpp/docs/freemarker/ref_directives.html | 164 - fmpp/docs/freemarker/ref_reservednames.html | 128 - fmpp/docs/freemarker/ref_specvar.html | 229 - fmpp/docs/freemarker/versions_2_0.html | 219 - fmpp/docs/freemarker/versions_2_01.html | 95 - fmpp/docs/freemarker/versions_2_0RC1.html | 339 - fmpp/docs/freemarker/versions_2_0RC2.html | 279 - fmpp/docs/freemarker/versions_2_0RC3.html | 207 - fmpp/docs/freemarker/versions_2_1.html | 618 -- fmpp/docs/freemarker/versions_2_1_1.html | 184 - fmpp/docs/freemarker/versions_2_1_2.html | 192 - fmpp/docs/freemarker/versions_2_1_3.html | 154 - fmpp/docs/freemarker/versions_2_1_4.html | 113 - fmpp/docs/freemarker/versions_2_1_5.html | 128 - fmpp/docs/freemarker/versions_2_2.html | 1221 ---- fmpp/docs/freemarker/versions_2_2_1.html | 186 - fmpp/docs/freemarker/versions_2_2_2.html | 114 - fmpp/docs/freemarker/versions_2_2_3.html | 166 - fmpp/docs/freemarker/versions_2_2_4.html | 165 - fmpp/docs/freemarker/versions_2_2_5.html | 108 - fmpp/docs/freemarker/versions_2_2_6.html | 211 - fmpp/docs/freemarker/versions_2_2_7.html | 109 - fmpp/docs/freemarker/versions_2_2_8.html | 179 - fmpp/docs/freemarker/versions_2_3.html | 1856 ------ fmpp/docs/freemarker/versions_2_3_1.html | 438 -- fmpp/docs/freemarker/versions_2_3_10.html | 176 - fmpp/docs/freemarker/versions_2_3_11.html | 293 - fmpp/docs/freemarker/versions_2_3_12.html | 128 - fmpp/docs/freemarker/versions_2_3_13.html | 185 - fmpp/docs/freemarker/versions_2_3_14.html | 196 - fmpp/docs/freemarker/versions_2_3_15.html | 175 - fmpp/docs/freemarker/versions_2_3_16.html | 195 - fmpp/docs/freemarker/versions_2_3_17.html | 400 -- fmpp/docs/freemarker/versions_2_3_18.html | 147 - fmpp/docs/freemarker/versions_2_3_19.html | 298 - fmpp/docs/freemarker/versions_2_3_2.html | 116 - fmpp/docs/freemarker/versions_2_3_20.html | 774 --- fmpp/docs/freemarker/versions_2_3_21.html | 1549 ----- fmpp/docs/freemarker/versions_2_3_3.html | 292 - fmpp/docs/freemarker/versions_2_3_4.html | 188 - fmpp/docs/freemarker/versions_2_3_5.html | 222 - fmpp/docs/freemarker/versions_2_3_6.html | 108 - fmpp/docs/freemarker/versions_2_3_7.html | 234 - fmpp/docs/freemarker/versions_2_3_7rc1.html | 189 - fmpp/docs/freemarker/versions_2_3_8.html | 138 - fmpp/docs/freemarker/versions_2_3_9.html | 159 - fmpp/docs/freemarker/xgui.html | 127 - fmpp/docs/freemarker/xgui_declarative.html | 101 - .../freemarker/xgui_declarative_basics.html | 242 - .../freemarker/xgui_declarative_details.html | 285 - fmpp/docs/freemarker/xgui_expose.html | 101 - fmpp/docs/freemarker/xgui_expose_dom.html | 213 - fmpp/docs/freemarker/xgui_expose_put.html | 122 - fmpp/docs/freemarker/xgui_imperative.html | 101 - .../freemarker/xgui_imperative_formal.html | 553 -- .../freemarker/xgui_imperative_learn.html | 781 --- fmpp/docs/freemarker/xgui_preface.html | 106 - fmpp/docs/frontends.html | 75 - fmpp/docs/ftl.html | 71 - fmpp/docs/index.html | 182 - fmpp/docs/installing.html | 163 - fmpp/docs/languages.html | 77 - fmpp/docs/license.html | 137 - fmpp/docs/manual.html | 123 - fmpp/docs/miscellaneous.html | 76 - fmpp/docs/overview.html | 192 - fmpp/docs/pathpattern.html | 84 - fmpp/docs/pphash.html | 974 --- fmpp/docs/properties.html | 109 - fmpp/docs/qtour.html | 207 - fmpp/docs/reportbug.html | 77 - fmpp/docs/robots.txt | 2 - fmpp/docs/settings.html | 1255 ---- fmpp/docs/style/fmpptitle.png | Bin 4608 -> 0 bytes fmpp/docs/style/fonts/icomoon.eot | Bin 2776 -> 0 bytes fmpp/docs/style/fonts/icomoon.svg | 19 - fmpp/docs/style/fonts/icomoon.ttf | Bin 2612 -> 0 bytes fmpp/docs/style/fonts/icomoon.woff | Bin 2688 -> 0 bytes fmpp/docs/style/header-footer-background.png | Bin 3827 -> 0 bytes fmpp/docs/style/main.css | 665 -- fmpp/docs/style/main.min.css | 1 - fmpp/docs/style/none.gif | Bin 42 -> 0 bytes fmpp/docs/style/poweredby_sq_simple.png | Bin 1778 -> 0 bytes fmpp/docs/style/sflogo.png | Bin 2112 -> 0 bytes fmpp/docs/tdd.html | 318 - fmpp/docs/tips.html | 110 - fmpp/docs/versions.html | 834 --- fmpp/docs/writefrontend.html | 136 - fmpp/documentation.html | 24 - fmpp/gulpfile.js | 28 - fmpp/lib/bsh.jar | Bin 281694 -> 383846 bytes fmpp/lib/freemarker.jar | Bin 1524587 -> 1715750 bytes fmpp/lib/test/junit.jar | Bin 120640 -> 0 bytes fmpp/package.json | 17 - fmpp/src/docs/LICENSE_ANT.txt | 49 - fmpp/src/docs/LICENSE_FREEMARKER.txt | 49 - fmpp/src/docs/LICENSE_RESOLVER.txt | 14 - fmpp/src/docs/ant.html | 203 - fmpp/src/docs/bsh.html | 12 - fmpp/src/docs/checklinks_T3.ftl | 13 - fmpp/src/docs/commandline.html | 378 -- fmpp/src/docs/configfile.html | 106 - fmpp/src/docs/dataloader.html | 604 -- fmpp/src/docs/examples/README.txt | 95 - fmpp/src/docs/examples/ant/build.xml | 14 - fmpp/src/docs/examples/ant/src/test.txt | 5 - fmpp/src/docs/examples/ant2/build.xml | 24 - fmpp/src/docs/examples/ant2/src/test.txt | 10 - fmpp/src/docs/examples/ant3/build.xml | 20 - fmpp/src/docs/examples/border/config.fmpp | 15 - .../border/src/include/ignoredir.fmpp | 0 .../docs/examples/border/src/include/test.ftl | 1 - fmpp/src/docs/examples/border/src/test.c | 24 - fmpp/src/docs/examples/border/src/test.html | 3 - fmpp/src/docs/examples/build.xml | 38 - fmpp/src/docs/examples/capture/config.fmpp | 3 - .../capture/src/include/ignoredir.fmpp | 0 .../examples/capture/src/include/page.ftl | 24 - fmpp/src/docs/examples/capture/src/test.html | 100 - .../src/docs/examples/check_links/config.fmpp | 3 - .../examples/check_links/src/good_target.html | 1 - .../examples/check_links/src/include/a.ftl | 13 - .../check_links/src/include/ignoredir.fmpp | 0 .../docs/examples/check_links/src/index.html | 3 - fmpp/src/docs/examples/csv/config.fmpp | 4 - .../docs/examples/csv/src/data/ignoredir.fmpp | 0 fmpp/src/docs/examples/csv/src/data/test.csv | 5 - fmpp/src/docs/examples/csv/src/test.html | 8 - fmpp/src/docs/examples/eval/config.fmpp | 7 - fmpp/src/docs/examples/eval/src/test.html | 17 - fmpp/src/docs/examples/ignoredir.fmpp | 1 - fmpp/src/docs/examples/img_dims/config.fmpp | 4 - .../src/docs/examples/img_dims/src/falcon.png | Bin 4953 -> 0 bytes .../src/docs/examples/img_dims/src/index.html | 12 - .../docs/examples/inherit_config/README.txt | 14 - .../docs/examples/inherit_config/config.fmpp | 4 - .../examples/inherit_config/config_dark.fmpp | 2 - .../examples/inherit_config/config_red.fmpp | 2 - .../examples/inherit_config/src/index.html | 3 - fmpp/src/docs/examples/local_data/config.fmpp | 29 - .../docs/examples/local_data/src/index.html | 24 - .../docs/examples/local_data/src/sub/1.html | 8 - .../examples/local_data/src/sub/1.html.bsh | 4 - .../docs/examples/local_data/src/sub/2.html | 6 - .../docs/examples/local_data/src/sub/3_j.html | 8 - .../examples/local_data/src/sub/3_j.html.bsh | 4 - .../examples/local_data/src/sub/food.html | 6 - .../examples/local_data/src/sub/sky/1.html | 6 - .../examples/local_data/src/sub/sky/2.html | 6 - .../examples/local_data/src/sub/sky/3_a.html | 6 - .../examples/local_data/src/sub/subsub/1.html | 6 - .../examples/local_data/src/sub/subsub/2.html | 6 - .../docs/examples/local_data/src/sub2/1.html | 6 - .../docs/examples/local_data/src/sub2/2.html | 6 - .../docs/examples/multipage_list/config.fmpp | 35 - .../examples/multipage_list/src/result.html | 56 - .../src/docs/examples/qtour_step1/config.fmpp | 2 - .../docs/examples/qtour_step1/src/falcon.png | Bin 4953 -> 0 bytes .../docs/examples/qtour_step1/src/index.html | 9 - .../qtour_step1/src/subdir/something.html | 8 - .../src/docs/examples/qtour_step2/config.fmpp | 3 - .../qtour_step2/src/data/ignoredir.fmpp | 0 .../examples/qtour_step2/src/data/style.tdd | 2 - .../docs/examples/qtour_step2/src/falcon.png | Bin 4953 -> 0 bytes .../docs/examples/qtour_step2/src/index.html | 9 - .../qtour_step2/src/subdir/something.html | 8 - .../src/docs/examples/qtour_step3/config.fmpp | 6 - .../examples/qtour_step3/src/data/birds.csv | 4 - .../qtour_step3/src/data/ignoredir.fmpp | 0 .../examples/qtour_step3/src/data/style.tdd | 2 - .../docs/examples/qtour_step3/src/falcon.png | Bin 4953 -> 0 bytes .../docs/examples/qtour_step3/src/index.html | 17 - .../qtour_step3/src/subdir/something.html | 8 - .../src/docs/examples/qtour_step4/config.fmpp | 6 - .../docs/examples/qtour_step4/src/bird.html | 16 - .../examples/qtour_step4/src/data/birds.csv | 4 - .../qtour_step4/src/data/ignoredir.fmpp | 0 .../examples/qtour_step4/src/data/style.tdd | 2 - .../docs/examples/qtour_step4/src/falcon.png | Bin 4953 -> 0 bytes .../docs/examples/qtour_step4/src/index.html | 16 - .../qtour_step4/src/subdir/something.html | 8 - fmpp/src/docs/examples/session/config.fmpp | 4 - .../src/docs/examples/session/src/01_foo.html | 6 - .../src/docs/examples/session/src/02_bar.html | 6 - .../docs/examples/session/src/03_baaz.html | 6 - .../docs/examples/session/src/04_wombat.html | 6 - .../session/src/include/ignoredir.fmpp | 0 .../examples/session/src/include/page.ftl | 17 - fmpp/src/docs/examples/session/src/index.html | 14 - fmpp/src/docs/examples/tdd/config.fmpp | 4 - .../docs/examples/tdd/src/data/ignoredir.fmpp | 0 fmpp/src/docs/examples/tdd/src/data/test.tdd | 7 - fmpp/src/docs/examples/tdd/src/index.html | 10 - fmpp/src/docs/examples/xml/config.fmpp | 4 - .../docs/examples/xml/src/data/ignoredir.fmpp | 0 fmpp/src/docs/examples/xml/src/data/test.xml | 14 - fmpp/src/docs/examples/xml/src/test.html | 7 - fmpp/src/docs/examples/xml2/config.fmpp | 7 - .../examples/xml2/src/data/ignoredir.fmpp | 0 .../examples/xml2/src/data/manufacturers.xml | 21 - .../docs/examples/xml2/src/data/products.xml | 26 - fmpp/src/docs/examples/xml2/src/index.html | 19 - fmpp/src/docs/examples/xml2/src/product.html | 36 - .../docs/examples/xml_rendering/config.fmpp | 19 - .../examples/xml_rendering/src/bigwidget.xml | 8 - .../examples/xml_rendering/src/example1.xml | 37 - .../examples/xml_rendering/src/example2.xml | 12 - .../examples/xml_rendering/src/index.html | 17 - .../xml_rendering/src/normalwidget.xml | 7 - .../xml_rendering/src/renderer/book.html | 155 - .../xml_rendering/src/renderer/ignoredir.fmpp | 0 .../xml_rendering/src/renderer/product.html | 20 - .../xml_rendering/src/smallwidget.xml | 8 - fmpp/src/docs/examples/xml_try/config.fmpp | 12 - .../examples/xml_try/src/data/ignoredir.fmpp | 0 .../docs/examples/xml_try/src/data/test.xml | 30 - fmpp/src/docs/examples/xml_try/src/index.html | 70 - .../docs/examples/xml_validating/config.fmpp | 8 - .../examples/xml_validating/dtds/catalog.xml | 10 - .../xml_validating/dtds/xhtml-lat1.ent | 196 - .../xml_validating/dtds/xhtml-special.ent | 80 - .../xml_validating/dtds/xhtml-symbol.ent | 237 - .../dtds/xhtml1-transitional.dtd | 1201 ---- .../xml_validating/src/data/ignoredir.fmpp | 0 .../xml_validating/src/data/test.xhtml | 16 - .../docs/examples/xml_validating/src/test.txt | 16 - fmpp/src/docs/figures/fmpparch.png | Bin 8093 -> 0 bytes fmpp/src/docs/figures/qtour_step1.png | Bin 3142 -> 0 bytes fmpp/src/docs/figures/qtour_step1_src.png | Bin 1095 -> 0 bytes fmpp/src/docs/figures/qtour_step2.png | Bin 6176 -> 0 bytes fmpp/src/docs/figures/qtour_step4.png | Bin 6084 -> 0 bytes fmpp/src/docs/ftl.html | 5 - fmpp/src/docs/include/ignoredir.fmpp | 0 fmpp/src/docs/include/page.ftl | 331 - fmpp/src/docs/include/site.ftl | 343 - fmpp/src/docs/index.html | 134 - fmpp/src/docs/installing.html | 84 - fmpp/src/docs/license.html | 3 - fmpp/src/docs/manualtocs_T2.html | 47 - fmpp/src/docs/overview.html | 111 - fmpp/src/docs/pathpattern.html | 18 - fmpp/src/docs/pphash.html | 549 -- fmpp/src/docs/properties.html | 64 - fmpp/src/docs/qtour.html | 158 - fmpp/src/docs/reportbug.html | 4 - fmpp/src/docs/robots.txt | 2 - fmpp/src/docs/settings.html | 916 --- fmpp/src/docs/style/README-BUILD.txt | 6 - fmpp/src/docs/style/fmpptitle.png | Bin 4608 -> 0 bytes fmpp/src/docs/style/fonts/README-BUILD.txt | 5 - fmpp/src/docs/style/fonts/icomoon.eot | Bin 2776 -> 0 bytes fmpp/src/docs/style/fonts/icomoon.svg | 19 - fmpp/src/docs/style/fonts/icomoon.ttf | Bin 2612 -> 0 bytes fmpp/src/docs/style/fonts/icomoon.woff | Bin 2688 -> 0 bytes fmpp/src/docs/style/fonts/selection.json | 257 - .../docs/style/header-footer-background.png | Bin 3827 -> 0 bytes fmpp/src/docs/style/lib/base.less | 145 - .../style/lib/components/breadcrumbs.less | 37 - .../lib/components/download-options.less | 25 - .../src/docs/style/lib/components/pagers.less | 70 - .../style/lib/components/report-bugs.less | 23 - .../style/lib/components/social-icons.less | 50 - .../lib/components/table-of-contents.less | 40 - fmpp/src/docs/style/lib/icons.less | 55 - fmpp/src/docs/style/lib/ignoredir.fmpp | 0 fmpp/src/docs/style/lib/layout/content.less | 12 - fmpp/src/docs/style/lib/layout/footer.less | 63 - fmpp/src/docs/style/lib/layout/header.less | 89 - fmpp/src/docs/style/lib/mixins.less | 29 - fmpp/src/docs/style/lib/utilities.less | 33 - fmpp/src/docs/style/lib/variables.less | 48 - fmpp/src/docs/style/main.less | 22 - fmpp/src/docs/style/none.gif | Bin 42 -> 0 bytes fmpp/src/docs/style/poweredby_sq_simple.png | Bin 1778 -> 0 bytes fmpp/src/docs/style/sflogo.png | Bin 2112 -> 0 bytes fmpp/src/docs/tdd.html | 294 - fmpp/src/docs/tips.html | 34 - fmpp/src/docs/versions.html | 733 --- fmpp/src/docs/writefrontend.html | 71 - .../java/fmpp/DataModelBuildingException.java | 40 - fmpp/src/main/java/fmpp/Engine.java | 3161 ---------- fmpp/src/main/java/fmpp/EngineXmlUtils.java | 91 - .../main/java/fmpp/FmppFileOutputWriter.java | 351 -- fmpp/src/main/java/fmpp/FmppOutputWriter.java | 50 - .../main/java/fmpp/FmppTemplateLoader.java | 103 - .../java/fmpp/GenericProcessingException.java | 34 - .../fmpp/IllegalConfigurationException.java | 34 - fmpp/src/main/java/fmpp/LocalDataBuilder.java | 47 - .../main/java/fmpp/ProcessingException.java | 70 - fmpp/src/main/java/fmpp/ProgressListener.java | 105 - .../java/fmpp/TemplateDataModelBuilder.java | 36 - .../main/java/fmpp/TemplateEnvironment.java | 1473 ----- .../java/fmpp/XmlRenderingConfiguration.java | 244 - .../dataloaders/AbstractTextDataLoader.java | 74 - .../java/fmpp/dataloaders/AntDataLoader.java | 56 - .../dataloaders/AntProjectDataLoader.java | 38 - .../dataloaders/AntPropertiesDataLoader.java | 134 - .../dataloaders/AntPropertyDataLoader.java | 115 - .../fmpp/dataloaders/AntTaskDataLoader.java | 40 - .../java/fmpp/dataloaders/CsvDataLoader.java | 187 - .../java/fmpp/dataloaders/EvalDataLoader.java | 69 - .../java/fmpp/dataloaders/FileDataLoader.java | 76 - .../fmpp/dataloaders/HtmlUtilsDataLoader.java | 234 - .../java/fmpp/dataloaders/JSONDataLoader.java | 49 - .../java/fmpp/dataloaders/NowDataLoader.java | 158 - .../dataloaders/PropertiesDataLoader.java | 39 - .../dataloaders/SlicedTextDataLoader.java | 193 - .../java/fmpp/dataloaders/TddDataLoader.java | 57 - .../dataloaders/TddSequenceDataLoader.java | 58 - .../java/fmpp/dataloaders/TextDataLoader.java | 71 - .../java/fmpp/dataloaders/XmlDataLoader.java | 727 --- .../dataloaders/XmlInfosetDataLoader.java | 53 - .../main/java/fmpp/dataloaders/package.html | 3 - .../BshLocalDataBuilder.java | 265 - .../CachingLocalDataBuilder.java | 101 - .../MapLocalDataBuilder.java | 40 - .../TddHashLocalDataBuilder.java | 64 - .../java/fmpp/localdatabuilders/package.html | 3 - .../main/java/fmpp/models/AddTransform.java | 87 - .../main/java/fmpp/models/ClearTransform.java | 74 - .../models/CopyWritableVariableMethod.java | 41 - .../main/java/fmpp/models/CsvSequence.java | 754 --- .../main/java/fmpp/models/JSONArrayNode.java | 114 - .../java/fmpp/models/JSONBooleanNode.java | 46 - fmpp/src/main/java/fmpp/models/JSONNode.java | 109 - .../main/java/fmpp/models/JSONNullNode.java | 34 - .../main/java/fmpp/models/JSONNumberNode.java | 46 - .../main/java/fmpp/models/JSONObjectNode.java | 190 - .../main/java/fmpp/models/JSONStringNode.java | 46 - .../fmpp/models/NewWritableHashMethod.java | 78 - .../models/NewWritableSequenceMethod.java | 70 - .../java/fmpp/models/RemoveTransform.java | 104 - .../main/java/fmpp/models/SetTransform.java | 113 - .../java/fmpp/models/StringArraySequence.java | 56 - .../models/TemplateModelArrayCollection.java | 49 - .../models/TemplateModelListCollection.java | 51 - .../models/TemplateModelListSequence.java | 48 - .../java/fmpp/models/TemplateModelUtils.java | 104 - .../main/java/fmpp/models/WritableHash.java | 94 - .../java/fmpp/models/WritableSequence.java | 64 - .../java/fmpp/models/WritableVariable.java | 26 - fmpp/src/main/java/fmpp/models/package.html | 3 - fmpp/src/main/java/fmpp/overview.html | 18 - fmpp/src/main/java/fmpp/package.html | 3 - .../AntProgressListener.java | 214 - .../ConsoleProgressListener.java | 171 - .../LoggerProgressListener.java | 335 - .../StatisticsProgressListener.java | 142 - .../TerseConsoleProgressListener.java | 80 - .../java/fmpp/progresslisteners/package.html | 3 - .../setting/FileWithConfigurationBase.java | 56 - .../fmpp/setting/FileWithSettingValue.java | 68 - .../java/fmpp/setting/SettingException.java | 37 - fmpp/src/main/java/fmpp/setting/Settings.java | 3518 ----------- .../java/fmpp/setting/XmlDependentOps.java | 29 - .../fmpp/setting/XmlDependentOpsImpl.java | 71 - fmpp/src/main/java/fmpp/setting/package.html | 5 - fmpp/src/main/java/fmpp/tdd/DataLoader.java | 50 - .../tdd/DataLoaderEvaluationEnvironment.java | 130 - .../src/main/java/fmpp/tdd/EvalException.java | 55 - .../java/fmpp/tdd/EvaluationEnvironment.java | 161 - fmpp/src/main/java/fmpp/tdd/Fragment.java | 83 - fmpp/src/main/java/fmpp/tdd/FunctionCall.java | 46 - fmpp/src/main/java/fmpp/tdd/Interpreter.java | 1728 ----- fmpp/src/main/java/fmpp/tdd/TddUtil.java | 145 - fmpp/src/main/java/fmpp/tdd/package.html | 9 - fmpp/src/main/java/fmpp/tools/AntTask.java | 640 -- .../src/main/java/fmpp/tools/CommandLine.java | 1083 ---- fmpp/src/main/java/fmpp/tools/package.html | 3 - fmpp/src/main/java/fmpp/util/ArgsParser.java | 1100 ---- .../main/java/fmpp/util/BorderedReader.java | 185 - .../src/main/java/fmpp/util/BugException.java | 34 - .../main/java/fmpp/util/DataLoaderUtil.java | 199 - fmpp/src/main/java/fmpp/util/ExceptionCC.java | 46 - fmpp/src/main/java/fmpp/util/FileUtil.java | 357 -- .../main/java/fmpp/util/FreemarkerUtil.java | 135 - .../java/fmpp/util/InstallationException.java | 32 - .../java/fmpp/util/JSONParseException.java | 21 - fmpp/src/main/java/fmpp/util/JSONParser.java | 434 -- fmpp/src/main/java/fmpp/util/MiscUtil.java | 399 -- .../java/fmpp/util/MultiListIterator.java | 109 - .../main/java/fmpp/util/NullOutputStream.java | 40 - fmpp/src/main/java/fmpp/util/NullWriter.java | 41 - .../java/fmpp/util/RuntimeExceptionCC.java | 87 - fmpp/src/main/java/fmpp/util/StringUtil.java | 1548 ----- fmpp/src/main/java/fmpp/util/package.html | 3 - fmpp/src/main/resources/META-INF/LICENSE.txt | 13 - .../main/resources/fmpp/version.properties | 9 - .../ConsoleTestProgressListener.java | 28 - .../fmpp/testsuite/SortAttrsTransform.java | 195 - .../fmpp/testsuite/TestLocalDataBuilder.java | 39 - .../fmpp/testsuite/TestProgressListener.java | 25 - .../test/java/fmpp/testsuite/TestSuite.java | 503 -- .../testsuite/TestXmlLocalDataBuilder.java | 41 - .../testsuite/TestXmlLocalDataBuilder2.java | 43 - .../test/java/fmpp/util/JSONParserTest.java | 356 -- fmpp/src/test/resources/README.txt | 18 - .../always_create_dirs_off/sub/t3.txt | 1 - .../expected/always_create_dirs_off/t.txt | 38 - .../expected/always_create_dirs_on/sub/t3.txt | 1 - .../expected/always_create_dirs_on/t.txt | 38 - .../expected/basic_usecase/index.html | 9 - .../resources/expected/basic_usecase/mi.png | Bin 444 -> 0 bytes .../expected/basic_usecase/sub/rattrah.html | 7 - .../basic_usecase/sub/subsub/rattrahad.html | 7 - .../src/test/resources/expected/borders/1.txt | 1 - fmpp/src/test/resources/expected/borders/1.x | 2 - fmpp/src/test/resources/expected/borders/1.y | 2 - .../test/resources/expected/borders/sub/1.txt | 1 - .../test/resources/expected/borders/sub/1.x | 2 - .../test/resources/expected/borders/sub/1.y | 2 - .../resources/expected/borders/sub/foo/1.txt | 1 - .../resources/expected/cfg_base/index.html | 1 - .../expected/cfg_base/sub/rattrah.html | 1 - .../resources/expected/cfg_inheritance/1.txt | 3 - .../resources/expected/cfg_inheritance/2.txt | 3 - .../resources/expected/cfg_inheritance/3.txt | 3 - .../resources/expected/cfg_inheritance/4.txt | 3 - .../expected/cfg_inheritance/test.txt | 1 - .../test/resources/expected/dl_csv/test.html | 95 - .../test/resources/expected/dl_eval/test.txt | 4 - .../test/resources/expected/dl_get/test.txt | 4 - .../expected/dl_json/explicit-traversal.html | 57 - .../expected/dl_json/visitor-traversal.html | 53 - .../resources/expected/dl_slicedtext/test.txt | 174 - .../test/resources/expected/dl_text/test.txt | 8 - .../test/resources/expected/encoding/test.txt | 2 - .../resources/expected/encoding/test2.txt | 2 - .../expected/encoding/test2_iso-8859-1.txt | 1 - .../expected/encoding/text_UTF-8_2.txt | 3 - .../expected/encoding/text_iso-8859-2.txt | 2 - .../expected/encoding/text_utf-16.txt | Bin 20 -> 0 bytes .../resources/expected/ex_border/test.c.html | 25 - .../resources/expected/ex_border/test.html | 3 - .../resources/expected/ex_capture/test.html | 111 - .../expected/ex_check_links/good_target.html | 1 - .../expected/ex_check_links/index.html | 2 - .../test/resources/expected/ex_csv/test.html | 7 - .../resources/expected/ex_img_dims/falcon.png | Bin 4953 -> 0 bytes .../resources/expected/ex_img_dims/index.html | 9 - .../expected/ex_local_data/index.html | 52 - .../expected/ex_local_data/sub/1.html | 8 - .../expected/ex_local_data/sub/2.html | 6 - .../expected/ex_local_data/sub/3_j.html | 8 - .../expected/ex_local_data/sub/food.html | 6 - .../expected/ex_local_data/sub/sky/1.html | 6 - .../expected/ex_local_data/sub/sky/2.html | 6 - .../expected/ex_local_data/sub/sky/3_a.html | 6 - .../expected/ex_local_data/sub/subsub/1.html | 6 - .../expected/ex_local_data/sub/subsub/2.html | 6 - .../expected/ex_local_data/sub2/1.html | 6 - .../expected/ex_local_data/sub2/2.html | 6 - .../expected/ex_multipage_list/result1.html | 31 - .../expected/ex_multipage_list/result2.html | 31 - .../expected/ex_multipage_list/result3.html | 31 - .../expected/ex_multipage_list/result4.html | 31 - .../expected/ex_multipage_list/result5.html | 31 - .../expected/ex_multipage_list/result6.html | 32 - .../expected/ex_qtour_step1/falcon.png | Bin 4953 -> 0 bytes .../expected/ex_qtour_step1/index.html | 9 - .../ex_qtour_step1/subdir/something.html | 8 - .../expected/ex_qtour_step2/falcon.png | Bin 4953 -> 0 bytes .../expected/ex_qtour_step2/index.html | 9 - .../ex_qtour_step2/subdir/something.html | 8 - .../expected/ex_qtour_step3/falcon.png | Bin 4953 -> 0 bytes .../expected/ex_qtour_step3/index.html | 19 - .../ex_qtour_step3/subdir/something.html | 8 - .../expected/ex_qtour_step4/arctic-tern.html | 12 - .../expected/ex_qtour_step4/falcon.png | Bin 4953 -> 0 bytes .../ex_qtour_step4/house-sparrow.html | 12 - .../expected/ex_qtour_step4/index.html | 16 - .../expected/ex_qtour_step4/sakeret.html | 12 - .../ex_qtour_step4/subdir/something.html | 8 - .../resources/expected/ex_session/01_foo.html | 11 - .../resources/expected/ex_session/02_bar.html | 11 - .../expected/ex_session/03_baaz.html | 11 - .../expected/ex_session/04_wombat.html | 11 - .../resources/expected/ex_session/index.html | 12 - .../test/resources/expected/ex_tdd/index.html | 10 - .../test/resources/expected/ex_xml/test.html | 10 - .../resources/expected/ex_xml2/index.html | 18 - .../resources/expected/ex_xml2/product_1.html | 25 - .../resources/expected/ex_xml2/product_2.html | 25 - .../resources/expected/ex_xml2/product_3.html | 25 - .../resources/expected/ex_xml2/product_4.html | 25 - .../expected/ex_xml_rendering/bigwidget.html | 16 - .../example1_chapter_2_1.html | 29 - .../example1_chapter_2_2.html | 25 - .../example1_chapter_3_1.html | 25 - .../example1_chapter_3_2.html | 25 - .../example1_chapter_3_3.html | 23 - .../ex_xml_rendering/example1_index.html | 32 - .../ex_xml_rendering/example1_part_1.html | 23 - .../ex_xml_rendering/example1_part_2.html | 29 - .../ex_xml_rendering/example1_part_3.html | 32 - .../example2_chapter_2_1.html | 21 - .../ex_xml_rendering/example2_index.html | 24 - .../ex_xml_rendering/example2_part_1.html | 23 - .../ex_xml_rendering/example2_part_2.html | 26 - .../expected/ex_xml_rendering/index.html | 17 - .../ex_xml_rendering/normalwidget.html | 15 - .../ex_xml_rendering/smallwidget.html | 16 - .../expected/ex_xml_validating/test.txt | 12 - fmpp/src/test/resources/expected/filename/a | 1 - .../test/resources/expected/filename/a.foo | 1 - .../resources/expected/filename/a.foo.bar | 1 - fmpp/src/test/resources/expected/filename/bt | 1 - .../src/test/resources/expected/filename/bt.x | 1 - fmpp/src/test/resources/expected/filename/c | 1 - fmpp/src/test/resources/expected/filename/c.x | 1 - fmpp/src/test/resources/expected/filename/d | 1 - .../test/resources/expected/filename/d.pok | 1 - fmpp/src/test/resources/expected/filename/e | 1 - .../test/resources/expected/filename/f1.wq | 1 - .../test/resources/expected/filename/f2.qw | 1 - fmpp/src/test/resources/expected/filename/gxx | 1 - .../resources/expected/filename/rme_casesens | 1 - .../resources/expected/filename/rmp_casesens | 1 - .../expected/filename/rpe_casesens.wq | 1 - .../resources/expected/filename_casesens/a | 1 - .../expected/filename_casesens/a.foo | 1 - .../expected/filename_casesens/a.foo.bar | 1 - .../resources/expected/filename_casesens/bt | 1 - .../resources/expected/filename_casesens/bt.x | 1 - .../resources/expected/filename_casesens/c | 1 - .../resources/expected/filename_casesens/c.x | 1 - .../resources/expected/filename_casesens/d | 1 - .../expected/filename_casesens/d.pok | 1 - .../resources/expected/filename_casesens/e | 1 - .../expected/filename_casesens/f1.wq | 1 - .../expected/filename_casesens/f2.qw | 1 - .../resources/expected/filename_casesens/gxx | 1 - .../filename_casesens/rme_casesens.Man | 1 - .../expected/filename_casesens/rmp_casesensXx | 1 - .../filename_casesens/rpe_casesens.Qw | 1 - .../resources/expected/fm_ici_2.3.21/test.txt | 5 - .../expected/fm_ici_2.3.21_ow/test.txt | 5 - .../resources/expected/fm_ici_null/test.txt | 5 - .../expected/fm_ici_null_ow/test.txt | 5 - .../expected/format_settings/test.txt | 6 - .../expected/freemarker_links/@test4 | 1 - .../expected/freemarker_links/sub/t.txt | 19 - .../resources/expected/freemarker_links/t.txt | 19 - .../resources/expected/htmlutils/test.bmp | Bin 1498 -> 0 bytes .../resources/expected/htmlutils/test.gif | Bin 882 -> 0 bytes .../resources/expected/htmlutils/test.html | 4 - .../resources/expected/htmlutils/test.jpg | Bin 943 -> 0 bytes .../resources/expected/htmlutils/test.png | Bin 907 -> 0 bytes .../test/resources/expected/localdata/1.html | 3 - .../resources/expected/localdata/1_x.html | 3 - .../resources/expected/localdata/1_z.html | 3 - .../resources/expected/localdata/1_z.htmlx | 3 - .../test/resources/expected/localdata/2.htm | 3 - .../test/resources/expected/localdata/2_y.htm | 3 - .../resources/expected/localdata/sub/1.html | 3 - .../resources/expected/localdata/sub/1_x.html | 3 - .../resources/expected/localdata/sub/1_z.html | 3 - .../expected/localdata/sub/1_z.htmlx | 3 - .../resources/expected/localdata/sub/2.htm | 3 - .../resources/expected/localdata/sub/2_y.htm | 3 - .../resources/expected/localdata/sub/test.txt | 3 - .../resources/expected/localdata/test.txt | 3 - .../test/resources/expected/locale/test.txt | 5 - .../resources/expected/nested_output/n0.txt | 3 - .../resources/expected/nested_output/n1.txt | 3 - .../resources/expected/nested_output/n2.1.txt | 3 - .../resources/expected/nested_output/n2.txt | 3 - .../resources/expected/nested_output/n3.txt | 3 - .../expected/nested_output/nestings2.txt | 3 - .../expected/objectwrapper1/test.txt | 2 - .../expected/objectwrapper2/test.txt | 2 - .../resources/expected/pathpattern1/1.txt | 1 - .../resources/expected/pathpattern1/2.txt | 1 - .../resources/expected/pathpattern1/3.txt | 1 - .../resources/expected/pathpattern1/4.txt | 1 - .../resources/expected/pathpattern1/sub/1.txt | 1 - .../resources/expected/pathpattern1/sub/2.txt | 1 - .../resources/expected/pathpattern1/sub/3.txt | 1 - .../resources/expected/pathpattern1/sub/4.txt | 1 - .../expected/pathpattern1/sub/subsub/1.txt | 1 - .../expected/pathpattern1/sub/subsub/2.txt | 1 - .../expected/pathpattern1/sub/subsub/3.txt | 1 - .../expected/pathpattern1/sub/subsub/4.txt | 1 - .../resources/expected/pathpattern2/1.txt | 1 - .../resources/expected/pathpattern2/2.txt | 1 - .../resources/expected/pathpattern2/3.txt | 1 - .../resources/expected/pathpattern2/4.txt | 1 - .../resources/expected/pathpattern2/sub/1.txt | 1 - .../resources/expected/pathpattern2/sub/2.txt | 1 - .../resources/expected/pathpattern2/sub/3.txt | 1 - .../resources/expected/pathpattern2/sub/4.txt | 1 - .../expected/pathpattern2/sub/subsub/1.txt | 1 - .../expected/pathpattern2/sub/subsub/2.txt | 1 - .../expected/pathpattern2/sub/subsub/3.txt | 1 - .../expected/pathpattern2/sub/subsub/4.txt | 1 - .../pathpattern2/sub/subsub/subsubsub/1.txt | 1 - .../pathpattern2/sub/subsub/subsubsub/2.txt | 1 - .../pathpattern2/sub/subsub/subsubsub/3.txt | 1 - .../pathpattern2/sub/subsub/subsubsub/4.txt | 1 - .../resources/expected/pathpattern3/Bar.Txt | 1 - .../resources/expected/pathpattern3/Bar.t1 | 1 - .../resources/expected/pathpattern3/Foo.t2 | 1 - .../resources/expected/pathpattern3/Foo.txt | 1 - .../resources/expected/pathpattern3/bar.t2 | 1 - .../resources/expected/pathpattern3/foo.t1 | 1 - .../resources/expected/pathpattern3/sub/t.txt | 1 - .../resources/expected/pathpattern3/t1.txt | 1 - .../resources/expected/pathpattern3/t2.Txt | 1 - .../expected/pathpattern3_casesens/Bar.Txt | 1 - .../expected/pathpattern3_casesens/Bar.t1 | 1 - .../expected/pathpattern3_casesens/Foo.t2 | 1 - .../expected/pathpattern3_casesens/Foo.txt | 1 - .../expected/pathpattern3_casesens/bar.t2 | 1 - .../expected/pathpattern3_casesens/foo.t1 | 1 - .../expected/pathpattern3_casesens/sub/t.txt | 1 - .../expected/pathpattern3_casesens/t1.txt | 1 - .../expected/pathpattern3_casesens/t2.Txt | 1 - .../resources/expected/relative_paths/s.txt | 1 - .../expected/relative_paths/sub/s.txt | 1 - .../expected/relative_paths/sub/test.txt | 1 - .../expected/relative_paths/test.txt | 2 - .../relative_paths2/sub/subsub/test.txt | 8 - .../expected/relative_paths2/sub/test.txt | 8 - .../expected/relative_paths2/test.txt | 8 - .../src/test/resources/expected/rename/4.rtxt | 1 - .../src/test/resources/expected/rename/5.rtxt | 1 - .../test/resources/expected/rename/6.foo.rtxt | 1 - .../test/resources/expected/rename/r/3.txt | 2 - .../src/test/resources/expected/rename/r1.txt | 1 - .../src/test/resources/expected/rename/r2.txt | 2 - .../test/resources/expected/rename/r7.rtxt | 3 - .../src/test/resources/expected/sources/1.txt | 1 - .../src/test/resources/expected/sources/2.txt | 1 - .../src/test/resources/expected/sources/3.txt | 1 - .../src/test/resources/expected/sources/4.txt | 1 - .../src/test/resources/expected/sources/6.txt | 1 - .../test/resources/expected/sources/sub/a.txt | 1 - .../test/resources/expected/sources/sub/b.txt | 1 - .../resources/expected/tag_syntax_1/test1.txt | 1 - .../resources/expected/tag_syntax_1/test2.txt | 1 - .../resources/expected/tag_syntax_1/test3.txt | 1 - .../resources/expected/tag_syntax_2/test1.txt | 1 - .../resources/expected/tag_syntax_2/test2.txt | 1 - .../resources/expected/tag_syntax_2/test3.txt | 1 - .../expected/tag_syntax_3/test1a.txt | 1 - .../expected/tag_syntax_3/test1b.txt | 1 - .../resources/expected/tag_syntax_3/test2.txt | 1 - .../resources/expected/tag_syntax_3/test3.txt | 1 - .../test/resources/expected/tdd/comments.txt | 8 - .../test/resources/expected/tdd/encoding.txt | 1 - .../test/resources/expected/tdd/hashes.txt | 35 - .../resources/expected/tdd/nestedscalars.txt | 33 - .../test/resources/expected/tdd/scalars.txt | 33 - .../test/resources/expected/tdd/seqmode.txt | 5 - .../expected/terminated_output/correct.html | 1 - .../terminated_output/flushedzero.html | 0 .../expected/terminated_output/n1.txt | 1 - .../expected/terminated_output/n2.txt | 1 - .../expected/terminated_output/n3.txt | 1 - .../expected/terminated_output/nZero.txt | 0 .../expected/terminated_output/nestings.html | 0 .../expected/terminated_output/one.html | 1 - .../resources/expected/url_escaping/test.txt | 18 - .../resources/expected/url_escaping2/test.txt | 15 - .../resources/expected/writable_hash/test.txt | 20 - .../expected/writable_sequence/test.txt | 21 - .../resources/expected/xinclude/index.html | 128 - .../resources/expected/xml_catalogs/test.txt | 2 - .../resources/expected/xml_rendering/a.xml | 4 - .../resources/expected/xml_rendering/b.xml | 6 - .../resources/expected/xml_rendering/c.xml | 4 - .../resources/expected/xml_rendering/copy.txt | 3 - .../resources/expected/xml_rendering/d.xml | 4 - .../resources/expected/xml_rendering/e.xml | 4 - .../resources/expected/xml_rendering/f.xml | 4 - .../resources/expected/xml_rendering/g.txt | 4 - .../resources/expected/xml_rendering/h.txt | 4 - .../resources/expected/xml_rendering/ldb.xml | 3 - .../tests/always_create_dirs_off/config.fmpp | 6 - .../tests/always_create_dirs_off/src/a/r.txt | 1 - .../src/b/c/q/q2/ignoredir.fmpp | 0 .../src/b/c/x/ignoredir.fmpp | 0 .../always_create_dirs_off/src/b/c/x/x.txt | 1 - .../src/b/c/y/ignoredir.fmpp | 0 .../src/c/d/createdir.fmpp | 0 .../src/d/createdir.fmpp | 0 .../src/d/ignoredir.fmpp | 0 .../src/data/ignoredir.fmpp | 0 .../always_create_dirs_off/src/data/test.xml | 4 - .../always_create_dirs_off/src/sub/t3.txt | 1 - .../tests/always_create_dirs_off/src/t.txt | 21 - .../tests/always_create_dirs_on/config.fmpp | 8 - .../tests/always_create_dirs_on/src/a/r.txt | 1 - .../src/b/c/q/q2/ignoredir.fmpp | 0 .../src/b/c/x/ignoredir.fmpp | 0 .../always_create_dirs_on/src/b/c/x/x.txt | 1 - .../src/b/c/y/ignoredir.fmpp | 0 .../src/c/d/createdir.fmpp | 0 .../src/d/createdir.fmpp | 0 .../src/d/ignoredir.fmpp | 0 .../src/data/ignoredir.fmpp | 0 .../always_create_dirs_on/src/data/test.xml | 4 - .../always_create_dirs_on/src/sub/t3.txt | 1 - .../tests/always_create_dirs_on/src/t.txt | 21 - .../resources/tests/basic_usecase/fmpp.cfg | 5 - .../basic_usecase/src/data/ignoredir.fmpp | 0 .../basic_usecase/src/data/style.properties | 2 - .../basic_usecase/src/include/ignoredir.fmpp | 0 .../tests/basic_usecase/src/include/page.ftl | 12 - .../tests/basic_usecase/src/index.html | 7 - .../resources/tests/basic_usecase/src/mi.png | Bin 444 -> 0 bytes .../tests/basic_usecase/src/sub/rattrah.html | 5 - .../src/sub/subsub/rattrahad.html | 5 - .../test/resources/tests/borders/config.fmpp | 23 - .../test/resources/tests/borders/src/1.txt | 1 - fmpp/src/test/resources/tests/borders/src/1.x | 1 - fmpp/src/test/resources/tests/borders/src/1.y | 1 - .../resources/tests/borders/src/sub/1.txt | 1 - .../test/resources/tests/borders/src/sub/1.x | 1 - .../test/resources/tests/borders/src/sub/1.y | 1 - .../resources/tests/borders/src/sub/foo/1.txt | 1 - .../tests/cfg_base/b1/src/index.html | 1 - .../tests/cfg_base/b1/src/sub/rattrah.html | 1 - .../resources/tests/cfg_base/cfg2/fmpp.cfg | 2 - .../test/resources/tests/cfg_base/fmpp.cfg | 7 - .../tests/cfg_base/foo/data/style.properties | 2 - .../tests/cfg_inheritance/cfg2/fmpp2.cfg | 5 - .../resources/tests/cfg_inheritance/fmpp.cfg | 4 - .../resources/tests/cfg_inheritance/fmpp3.cfg | 3 - .../resources/tests/cfg_inheritance/src/1.txt | 1 - .../resources/tests/cfg_inheritance/src/2.txt | 1 - .../resources/tests/cfg_inheritance/src/3.txt | 1 - .../resources/tests/cfg_inheritance/src/4.txt | 1 - .../tests/cfg_inheritance/src/test.txt | 1 - .../test/resources/tests/dl_csv/config.fmpp | 28 - .../tests/dl_csv/src/data/ignoredir.fmpp | 0 .../tests/dl_csv/src/data/test-utf8-bom.csv | 3 - .../resources/tests/dl_csv/src/data/test.txt | 7 - .../resources/tests/dl_csv/src/data/test2.txt | 4 - .../resources/tests/dl_csv/src/data/test3.txt | 1 - .../resources/tests/dl_csv/src/data/test4.txt | 0 .../resources/tests/dl_csv/src/data/test5.txt | 7 - .../test/resources/tests/dl_csv/src/test.html | 99 - .../test/resources/tests/dl_eval/config.fmpp | 9 - .../test/resources/tests/dl_eval/src/test.txt | 4 - .../test/resources/tests/dl_get/config.fmpp | 20 - .../test/resources/tests/dl_get/src/test.txt | 4 - .../test/resources/tests/dl_json/config.fmpp | 9 - .../tests/dl_json/src/data/applicants.json | 22 - .../tests/dl_json/src/data/ignoredir.fmpp | 0 .../tests/dl_json/src/data/synthetic.json | 20 - .../tests/dl_json/src/explicit-traversal.html | 42 - .../resources/tests/dl_json/src/synthetic.ftl | 148 - .../tests/dl_json/src/visitor-traversal.html | 63 - .../resources/tests/dl_slicedtext/config.fmpp | 4 - .../tests/dl_slicedtext/src/data/empty.txt | 0 .../dl_slicedtext/src/data/ignoredir.fmpp | 0 .../tests/dl_slicedtext/src/data/t1.txt | 3 - .../tests/dl_slicedtext/src/data/t2.txt | 3 - .../tests/dl_slicedtext/src/data/t3.txt | 8 - .../tests/dl_slicedtext/src/data/t4.txt | 8 - .../tests/dl_slicedtext/src/data/t5.txt | 8 - .../tests/dl_slicedtext/src/data/t6.txt | 9 - .../tests/dl_slicedtext/src/data/t6cr.txt | 1 - .../tests/dl_slicedtext/src/data/t6lf.txt | 9 - .../tests/dl_slicedtext/src/data/t7.txt | 2 - .../tests/dl_slicedtext/src/data/t8.txt | 25 - .../tests/dl_slicedtext/src/data/t9.txt | 1 - .../tests/dl_slicedtext/src/test.txt | 127 - .../test/resources/tests/dl_text/config.fmpp | 8 - .../tests/dl_text/src/data/1-utf8-bom.txt | 3 - .../resources/tests/dl_text/src/data/1.txt | 3 - .../tests/dl_text/src/data/ignoredir.fmpp | 0 .../test/resources/tests/dl_text/src/test.txt | 2 - .../test/resources/tests/encoding/config.fmpp | 4 - .../resources/tests/encoding/src/test.txt | 19 - .../resources/tests/encoding/src/test2.txt | 7 - .../test/resources/tests/ex_border/fmpp.cfg | 1 - .../test/resources/tests/ex_capture/fmpp.cfg | 1 - .../resources/tests/ex_check_links/fmpp.cfg | 1 - fmpp/src/test/resources/tests/ex_csv/fmpp.cfg | 1 - .../resources/tests/ex_img_dims/config.fmpp | 3 - .../resources/tests/ex_local_data/config.fmpp | 1 - .../tests/ex_multipage_list/config.fmpp | 1 - .../resources/tests/ex_qtour_step1/fmpp.cfg | 1 - .../resources/tests/ex_qtour_step2/fmpp.cfg | 1 - .../resources/tests/ex_qtour_step3/fmpp.cfg | 1 - .../resources/tests/ex_qtour_step4/fmpp.cfg | 1 - .../test/resources/tests/ex_session/fmpp.cfg | 1 - fmpp/src/test/resources/tests/ex_tdd/fmpp.cfg | 1 - fmpp/src/test/resources/tests/ex_xml/fmpp.cfg | 1 - .../src/test/resources/tests/ex_xml2/fmpp.cfg | 1 - .../resources/tests/ex_xml_rendering/fmpp.cfg | 1 - .../tests/ex_xml_validating/config.fmpp | 1 - .../test/resources/tests/filename/config.fmpp | 5 - fmpp/src/test/resources/tests/filename/src/at | 1 - .../test/resources/tests/filename/src/at.foo | 1 - .../resources/tests/filename/src/at.foo.bar | 1 - .../src/test/resources/tests/filename/src/btt | 1 - .../test/resources/tests/filename/src/btt.x | 1 - .../src/test/resources/tests/filename/src/cxx | 1 - .../test/resources/tests/filename/src/cxx.x | 1 - .../resources/tests/filename/src/d.bat.man | 1 - .../resources/tests/filename/src/d.spider.man | 1 - .../resources/tests/filename/src/et.spider | 1 - .../test/resources/tests/filename/src/f1.qw | 1 - .../test/resources/tests/filename/src/f2.wq | 1 - .../test/resources/tests/filename/src/gxxxxx | 1 - .../tests/filename/src/rme_casesens.Man | 1 - .../tests/filename/src/rmp_casesensXx | 1 - .../tests/filename/src/rpe_casesens.Qw | 1 - .../tests/filename_casesens/config.fmpp | 3 - .../resources/tests/fm_ici_2.3.21/config.fmpp | 3 - .../tests/fm_ici_2.3.21_ow/config.fmpp | 9 - .../resources/tests/fm_ici_null/config.fmpp | 12 - .../resources/tests/fm_ici_null/src/test.txt | 9 - .../tests/fm_ici_null_ow/config.fmpp | 8 - .../tests/format_settings/config.fmpp | 15 - .../tests/format_settings/src/test.txt | 7 - .../tests/freemarker_links/config.fmpp | 10 - .../tests/freemarker_links/inc1/test1.ftl | 1 - .../tests/freemarker_links/inc1/test2.ftl | 1 - .../tests/freemarker_links/inc1/test5.ftl | 1 - .../tests/freemarker_links/inc2/godzilla.ftl | 1 - .../tests/freemarker_links/inc2/test2.ftl | 1 - .../tests/freemarker_links/inc2/test3.ftl | 1 - .../tests/freemarker_links/inc2/test5.ftl | 1 - .../tests/freemarker_links/inc2/test6.ftl | 1 - .../tests/freemarker_links/inherited.fmpp | 4 - .../freemarker_links/src/@inc/ignoredir.fmpp | 0 .../tests/freemarker_links/src/@inc/test1.ftl | 1 - .../tests/freemarker_links/src/@test4 | 1 - .../tests/freemarker_links/src/sub/t.txt | 19 - .../tests/freemarker_links/src/t.txt | 19 - .../resources/tests/htmlutils/config.fmpp | 6 - .../resources/tests/htmlutils/src/test.bmp | Bin 1498 -> 0 bytes .../resources/tests/htmlutils/src/test.gif | Bin 882 -> 0 bytes .../resources/tests/htmlutils/src/test.html | 6 - .../resources/tests/htmlutils/src/test.jpg | Bin 943 -> 0 bytes .../resources/tests/htmlutils/src/test.png | Bin 907 -> 0 bytes .../test/resources/tests/localdata/build.xml | 7 - .../resources/tests/localdata/config.fmpp | 10 - .../tests/localdata/inheritedcfg.fmpp | 11 - .../test/resources/tests/localdata/src/1.html | 3 - .../resources/tests/localdata/src/1_x.html | 3 - .../resources/tests/localdata/src/1_z.html | 3 - .../resources/tests/localdata/src/1_z.htmlx | 3 - .../test/resources/tests/localdata/src/2.htm | 3 - .../resources/tests/localdata/src/2_y.htm | 3 - .../tests/localdata/src/data/ignoredir.fmpp | 0 .../tests/localdata/src/data/y.properties | 3 - .../resources/tests/localdata/src/sub/1.html | 3 - .../tests/localdata/src/sub/1_x.html | 3 - .../tests/localdata/src/sub/1_z.html | 3 - .../tests/localdata/src/sub/1_z.htmlx | 3 - .../resources/tests/localdata/src/sub/2.htm | 3 - .../resources/tests/localdata/src/sub/2_y.htm | 3 - .../tests/localdata/src/sub/test.txt | 3 - .../resources/tests/localdata/src/test.txt | 3 - .../test/resources/tests/locale/config.fmpp | 3 - .../test/resources/tests/locale/src/test.txt | 8 - .../resources/tests/nested_output/config.fmpp | 3 - .../tests/nested_output/src/nestings.txt | 29 - .../tests/nested_output/src/nestings2.txt | 12 - .../tests/objectwrapper1/config.fmpp | 5 - .../tests/objectwrapper1/src/test.txt | 2 - .../tests/objectwrapper2/config.fmpp | 6 - .../tests/objectwrapper2/src/test.txt | 2 - .../resources/tests/pathpattern1/config.fmpp | 12 - .../resources/tests/pathpattern1/src/1.txt | 1 - .../resources/tests/pathpattern1/src/2.txt | 1 - .../resources/tests/pathpattern1/src/3.txt | 1 - .../resources/tests/pathpattern1/src/4.txt | 1 - .../tests/pathpattern1/src/sub/1.txt | 1 - .../tests/pathpattern1/src/sub/2.txt | 1 - .../tests/pathpattern1/src/sub/3.txt | 1 - .../tests/pathpattern1/src/sub/4.txt | 1 - .../tests/pathpattern1/src/sub/subsub/1.txt | 1 - .../tests/pathpattern1/src/sub/subsub/2.txt | 1 - .../tests/pathpattern1/src/sub/subsub/3.txt | 1 - .../tests/pathpattern1/src/sub/subsub/4.txt | 1 - .../resources/tests/pathpattern2/config.fmpp | 12 - .../resources/tests/pathpattern2/src/1.txt | 1 - .../resources/tests/pathpattern2/src/2.txt | 1 - .../resources/tests/pathpattern2/src/3.txt | 1 - .../resources/tests/pathpattern2/src/4.txt | 1 - .../tests/pathpattern2/src/sub/1.txt | 1 - .../tests/pathpattern2/src/sub/2.txt | 1 - .../tests/pathpattern2/src/sub/3.txt | 1 - .../tests/pathpattern2/src/sub/4.txt | 1 - .../tests/pathpattern2/src/sub/subsub/1.txt | 1 - .../tests/pathpattern2/src/sub/subsub/2.txt | 1 - .../tests/pathpattern2/src/sub/subsub/3.txt | 1 - .../tests/pathpattern2/src/sub/subsub/4.txt | 1 - .../src/sub/subsub/subsubsub/1.txt | 1 - .../src/sub/subsub/subsubsub/2.txt | 1 - .../src/sub/subsub/subsubsub/3.txt | 1 - .../src/sub/subsub/subsubsub/4.txt | 1 - .../resources/tests/pathpattern3/config.fmpp | 11 - .../resources/tests/pathpattern3/src/Bar.Txt | 1 - .../resources/tests/pathpattern3/src/Bar.t1 | 1 - .../resources/tests/pathpattern3/src/Foo.t2 | 1 - .../resources/tests/pathpattern3/src/Foo.txt | 1 - .../resources/tests/pathpattern3/src/bar.t2 | 1 - .../resources/tests/pathpattern3/src/foo.t1 | 1 - .../tests/pathpattern3/src/sub/t.txt | 1 - .../resources/tests/pathpattern3/src/t1.txt | 1 - .../resources/tests/pathpattern3/src/t2.Txt | 1 - .../tests/pathpattern3_casesens/config.fmpp | 3 - .../tests/relative_paths/config.fmpp | 2 - .../relative_paths/src/include/ignoredir.fmpp | 0 .../tests/relative_paths/src/include/s.txt | 1 - .../tests/relative_paths/src/include/test.txt | 1 - .../resources/tests/relative_paths/src/s.txt | 1 - .../tests/relative_paths/src/sub/s.txt | 1 - .../tests/relative_paths/src/sub/test.txt | 1 - .../tests/relative_paths/src/test.txt | 2 - .../tests/relative_paths2/config.fmpp | 3 - .../relative_paths2/src/sub/subsub/test.inc | 1 - .../relative_paths2/src/sub/subsub/test.txt | 8 - .../tests/relative_paths2/src/sub/test.inc | 1 - .../tests/relative_paths2/src/sub/test.txt | 8 - .../tests/relative_paths2/src/test.inc | 1 - .../tests/relative_paths2/src/test.txt | 8 - .../test/resources/tests/rename/config.fmpp | 2 - .../src/test/resources/tests/rename/src/1.txt | 2 - .../src/test/resources/tests/rename/src/2.txt | 4 - .../src/test/resources/tests/rename/src/3.txt | 4 - .../src/test/resources/tests/rename/src/4.txt | 2 - fmpp/src/test/resources/tests/rename/src/5 | 2 - .../test/resources/tests/rename/src/6.foo.txt | 2 - .../src/test/resources/tests/rename/src/7.txt | 5 - .../src/test/resources/tests/sources/args.txt | 2 - .../src/test/resources/tests/sources/fmpp.cfg | 4 - .../test/resources/tests/sources/fmpp2.cfg | 2 - .../test/resources/tests/sources/src/1.txt | 1 - .../test/resources/tests/sources/src/2.txt | 1 - .../test/resources/tests/sources/src/3.txt | 1 - .../test/resources/tests/sources/src/4.txt | 1 - .../test/resources/tests/sources/src/5.txt | 1 - .../test/resources/tests/sources/src/6.txt | 1 - .../resources/tests/sources/src/sub/a.txt | 1 - .../resources/tests/sources/src/sub/b.txt | 1 - .../resources/tests/tag_syntax_1/config.fmpp | 3 - .../tests/tag_syntax_1/src/test1.txt | 1 - .../tests/tag_syntax_1/src/test2.txt | 2 - .../tests/tag_syntax_1/src/test3.txt | 2 - .../resources/tests/tag_syntax_2/config.fmpp | 3 - .../tests/tag_syntax_2/src/test1.txt | 1 - .../tests/tag_syntax_2/src/test2.txt | 2 - .../tests/tag_syntax_2/src/test3.txt | 2 - .../resources/tests/tag_syntax_3/config.fmpp | 3 - .../tests/tag_syntax_3/src/test1a.txt | 1 - .../tests/tag_syntax_3/src/test1b.txt | 1 - .../tests/tag_syntax_3/src/test2.txt | 2 - .../tests/tag_syntax_3/src/test3.txt | 2 - fmpp/src/test/resources/tests/tdd/config.fmpp | 2 - .../test/resources/tests/tdd/src/comments.txt | 11 - .../resources/tests/tdd/src/data/comment1.tdd | 10 - .../resources/tests/tdd/src/data/comment2.tdd | 11 - .../resources/tests/tdd/src/data/encoding.tdd | 2 - .../resources/tests/tdd/src/data/hash.tdd | 3 - .../resources/tests/tdd/src/data/hashes.tdd | 20 - .../tests/tdd/src/data/ignoredir.fmpp | 0 .../tests/tdd/src/data/nestedscalars.tdd | 44 - .../resources/tests/tdd/src/data/scalars.tdd | 42 - .../resources/tests/tdd/src/data/seqmode.tdd | 5 - .../test/resources/tests/tdd/src/encoding.txt | 1 - .../test/resources/tests/tdd/src/hashes.txt | 22 - .../tests/tdd/src/include/common.ftl | 21 - .../tests/tdd/src/include/ignoredir.fmpp | 0 .../resources/tests/tdd/src/nestedscalars.txt | 34 - .../test/resources/tests/tdd/src/scalars.txt | 34 - .../test/resources/tests/tdd/src/seqmode.txt | 7 - .../tests/terminated_output/config.fmpp | 4 - .../tests/terminated_output/src/correct.html | 1 - .../terminated_output/src/flushedzero.html | 1 - .../tests/terminated_output/src/nestings.html | 12 - .../tests/terminated_output/src/one.html | 1 - .../tests/terminated_output/src/zero.html | 1 - .../resources/tests/url_escaping/config.fmpp | 3 - .../resources/tests/url_escaping/src/test.txt | 23 - .../resources/tests/url_escaping2/config.fmpp | 4 - .../tests/url_escaping2/src/test.txt | 20 - .../resources/tests/writable_hash/config.fmpp | 5 - .../tests/writable_hash/src/test.txt | 24 - .../tests/writable_sequence/config.fmpp | 5 - .../tests/writable_sequence/src/test.txt | 24 - .../test/resources/tests/xinclude/config.fmpp | 13 - .../tests/xinclude/src/data/ignoredir.fmpp | 0 .../tests/xinclude/src/data/part1.xml | 14 - .../tests/xinclude/src/data/part2.xml | 12 - .../tests/xinclude/src/data/test.xml | 6 - .../resources/tests/xinclude/src/index.html | 70 - .../resources/tests/xml_catalogs/config.fmpp | 7 - .../resources/tests/xml_catalogs/dtds/catalog | 2 - .../tests/xml_catalogs/dtds/catalog2 | 1 - .../tests/xml_catalogs/dtds/test.txt | 1 - .../tests/xml_catalogs/dtds/test2.txt | 1 - .../tests/xml_catalogs/dtds/xhtml-lat1.ent | 196 - .../tests/xml_catalogs/dtds/xhtml-special.ent | 80 - .../tests/xml_catalogs/dtds/xhtml-symbol.ent | 237 - .../xml_catalogs/dtds/xhtml1-transitional.dtd | 1201 ---- .../xml_catalogs/src/data/ignoredir.fmpp | 0 .../tests/xml_catalogs/src/data/test.xhtml | 16 - .../resources/tests/xml_catalogs/src/test.txt | 4 - .../resources/tests/xml_rendering/config.fmpp | 22 - .../tests/xml_rendering/dtds/catalog.xml | 20 - .../tests/xml_rendering/dtds/test.dtd | 3 - .../tests/xml_rendering/dtds/test2.dtd | 3 - .../tests/xml_rendering/inherited.fmpp | 1 - .../resources/tests/xml_rendering/src/a.xml | 5 - .../resources/tests/xml_rendering/src/b.xml | 7 - .../resources/tests/xml_rendering/src/c.xml | 3 - .../tests/xml_rendering/src/copy.txt | 3 - .../resources/tests/xml_rendering/src/d.xml | 3 - .../resources/tests/xml_rendering/src/e.xml | 3 - .../resources/tests/xml_rendering/src/f.xml | 3 - .../resources/tests/xml_rendering/src/g.xml | 3 - .../resources/tests/xml_rendering/src/h.xml | 3 - .../resources/tests/xml_rendering/src/ldb.xml | 1 - .../xml_rendering/src/renderer/ignoredir.fmpp | 0 .../tests/xml_rendering/src/renderer/ldb.ftl | 3 - .../xml_rendering/src/renderer/test1.ftl | 3 - .../xml_rendering/src/renderer/test2.ftl | 2 - .../xml_rendering/src/renderer/test3.ftl | 3 - .../xml_rendering/src/renderer/test4.ftl | 3 - .../xml_rendering/src/renderer/test5.ftl | 2 - .../xml_rendering/src/renderer/test6.ftl | 3 - 1976 files changed, 294 insertions(+), 317977 deletions(-) delete mode 100644 fmpp/BUILD.txt create mode 100644 fmpp/LICENSE_HAMCREST.txt delete mode 100644 fmpp/TODO.txt delete mode 100644 fmpp/build.properties.sample delete mode 100644 fmpp/build.xml delete mode 100644 fmpp/docs.fmpp delete mode 100644 fmpp/docs/LICENSE_ANT.txt delete mode 100644 fmpp/docs/LICENSE_FREEMARKER.txt delete mode 100644 fmpp/docs/LICENSE_RESOLVER.txt delete mode 100644 fmpp/docs/ant.html delete mode 100644 fmpp/docs/api/allclasses-frame.html delete mode 100644 fmpp/docs/api/allclasses-noframe.html delete mode 100644 fmpp/docs/api/constant-values.html delete mode 100644 fmpp/docs/api/deprecated-list.html delete mode 100644 fmpp/docs/api/fmpp/DataModelBuildingException.html delete mode 100644 fmpp/docs/api/fmpp/Engine.html delete mode 100644 fmpp/docs/api/fmpp/LocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/ProcessingException.html delete mode 100644 fmpp/docs/api/fmpp/ProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/TemplateDataModelBuilder.html delete mode 100644 fmpp/docs/api/fmpp/TemplateEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/XmlRenderingConfiguration.html delete mode 100644 fmpp/docs/api/fmpp/class-use/DataModelBuildingException.html delete mode 100644 fmpp/docs/api/fmpp/class-use/Engine.html delete mode 100644 fmpp/docs/api/fmpp/class-use/LocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/class-use/ProcessingException.html delete mode 100644 fmpp/docs/api/fmpp/class-use/ProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/class-use/TemplateDataModelBuilder.html delete mode 100644 fmpp/docs/api/fmpp/class-use/TemplateEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/class-use/XmlRenderingConfiguration.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AbstractTextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AntDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AntProjectDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AntPropertiesDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AntPropertyDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/AntTaskDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/CsvDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/EvalDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/FileDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/HtmlUtilsDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/JSONDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/NowDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/PropertiesDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/SlicedTextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/TddDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/TddSequenceDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/TextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/XmlDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/XmlInfosetDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AbstractTextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AntDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AntProjectDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertiesDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertyDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/AntTaskDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/CsvDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/EvalDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/FileDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/HtmlUtilsDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/JSONDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/NowDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/PropertiesDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/SlicedTextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/TddDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/TddSequenceDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/TextDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/XmlDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/class-use/XmlInfosetDataLoader.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/dataloaders/package-use.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/BshLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/CachingLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/MapLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/TddHashLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/class-use/BshLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/class-use/CachingLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/class-use/MapLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/class-use/TddHashLocalDataBuilder.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/localdatabuilders/package-use.html delete mode 100644 fmpp/docs/api/fmpp/models/AddTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/ClearTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/CopyWritableVariableMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/CsvSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONArrayNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONBooleanNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONNullNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONNumberNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONObjectNode.html delete mode 100644 fmpp/docs/api/fmpp/models/JSONStringNode.html delete mode 100644 fmpp/docs/api/fmpp/models/NewWritableHashMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/NewWritableSequenceMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/RemoveTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/SetTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/StringArraySequence.html delete mode 100644 fmpp/docs/api/fmpp/models/TemplateModelArrayCollection.html delete mode 100644 fmpp/docs/api/fmpp/models/TemplateModelListCollection.html delete mode 100644 fmpp/docs/api/fmpp/models/TemplateModelListSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/TemplateModelUtils.html delete mode 100644 fmpp/docs/api/fmpp/models/WritableHash.html delete mode 100644 fmpp/docs/api/fmpp/models/WritableSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/AddTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/ClearTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/CopyWritableVariableMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/CsvSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONArrayNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONBooleanNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONNullNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONNumberNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONObjectNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/JSONStringNode.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/NewWritableHashMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/NewWritableSequenceMethod.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/RemoveTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/SetTransform.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/StringArraySequence.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/TemplateModelArrayCollection.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/TemplateModelListCollection.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/TemplateModelListSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/TemplateModelUtils.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/WritableHash.html delete mode 100644 fmpp/docs/api/fmpp/models/class-use/WritableSequence.html delete mode 100644 fmpp/docs/api/fmpp/models/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/models/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/models/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/models/package-use.html delete mode 100644 fmpp/docs/api/fmpp/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/package-use.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/AntProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/ConsoleProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/LoggerProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/StatisticsProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/TerseConsoleProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/class-use/AntProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/class-use/ConsoleProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/class-use/LoggerProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/class-use/StatisticsProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/class-use/TerseConsoleProgressListener.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/progresslisteners/package-use.html delete mode 100644 fmpp/docs/api/fmpp/setting/FileWithConfigurationBase.html delete mode 100644 fmpp/docs/api/fmpp/setting/FileWithSettingValue.html delete mode 100644 fmpp/docs/api/fmpp/setting/SettingException.html delete mode 100644 fmpp/docs/api/fmpp/setting/Settings.html delete mode 100644 fmpp/docs/api/fmpp/setting/class-use/FileWithConfigurationBase.html delete mode 100644 fmpp/docs/api/fmpp/setting/class-use/FileWithSettingValue.html delete mode 100644 fmpp/docs/api/fmpp/setting/class-use/SettingException.html delete mode 100644 fmpp/docs/api/fmpp/setting/class-use/Settings.html delete mode 100644 fmpp/docs/api/fmpp/setting/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/setting/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/setting/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/setting/package-use.html delete mode 100644 fmpp/docs/api/fmpp/tdd/DataLoader.html delete mode 100644 fmpp/docs/api/fmpp/tdd/DataLoaderEvaluationEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/EvalException.html delete mode 100644 fmpp/docs/api/fmpp/tdd/EvaluationEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/Fragment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/FunctionCall.html delete mode 100644 fmpp/docs/api/fmpp/tdd/Interpreter.html delete mode 100644 fmpp/docs/api/fmpp/tdd/TddUtil.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/DataLoader.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/DataLoaderEvaluationEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/EvalException.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/EvaluationEnvironment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/Fragment.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/FunctionCall.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/Interpreter.html delete mode 100644 fmpp/docs/api/fmpp/tdd/class-use/TddUtil.html delete mode 100644 fmpp/docs/api/fmpp/tdd/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/tdd/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/tdd/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/tdd/package-use.html delete mode 100644 fmpp/docs/api/fmpp/tools/AntTask.AntAttributeSubstitution.html delete mode 100644 fmpp/docs/api/fmpp/tools/AntTask.html delete mode 100644 fmpp/docs/api/fmpp/tools/CommandLine.html delete mode 100644 fmpp/docs/api/fmpp/tools/class-use/AntTask.AntAttributeSubstitution.html delete mode 100644 fmpp/docs/api/fmpp/tools/class-use/AntTask.html delete mode 100644 fmpp/docs/api/fmpp/tools/class-use/CommandLine.html delete mode 100644 fmpp/docs/api/fmpp/tools/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/tools/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/tools/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/tools/package-use.html delete mode 100644 fmpp/docs/api/fmpp/util/ArgsParser.BadArgsException.html delete mode 100644 fmpp/docs/api/fmpp/util/ArgsParser.OptionDefinition.html delete mode 100644 fmpp/docs/api/fmpp/util/ArgsParser.html delete mode 100644 fmpp/docs/api/fmpp/util/BorderedReader.html delete mode 100644 fmpp/docs/api/fmpp/util/BugException.html delete mode 100644 fmpp/docs/api/fmpp/util/DataLoaderUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/ExceptionCC.html delete mode 100644 fmpp/docs/api/fmpp/util/FileUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/FreemarkerUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/InstallationException.html delete mode 100644 fmpp/docs/api/fmpp/util/JSONParseException.html delete mode 100644 fmpp/docs/api/fmpp/util/JSONParser.html delete mode 100644 fmpp/docs/api/fmpp/util/MiscUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/MultiListIterator.html delete mode 100644 fmpp/docs/api/fmpp/util/NullOutputStream.html delete mode 100644 fmpp/docs/api/fmpp/util/NullWriter.html delete mode 100644 fmpp/docs/api/fmpp/util/RuntimeExceptionCC.html delete mode 100644 fmpp/docs/api/fmpp/util/StringUtil.ParseException.html delete mode 100644 fmpp/docs/api/fmpp/util/StringUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/ArgsParser.BadArgsException.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/ArgsParser.OptionDefinition.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/ArgsParser.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/BorderedReader.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/BugException.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/DataLoaderUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/ExceptionCC.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/FileUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/FreemarkerUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/InstallationException.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/JSONParseException.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/JSONParser.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/MiscUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/MultiListIterator.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/NullOutputStream.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/NullWriter.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/RuntimeExceptionCC.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/StringUtil.ParseException.html delete mode 100644 fmpp/docs/api/fmpp/util/class-use/StringUtil.html delete mode 100644 fmpp/docs/api/fmpp/util/package-frame.html delete mode 100644 fmpp/docs/api/fmpp/util/package-summary.html delete mode 100644 fmpp/docs/api/fmpp/util/package-tree.html delete mode 100644 fmpp/docs/api/fmpp/util/package-use.html delete mode 100644 fmpp/docs/api/help-doc.html delete mode 100644 fmpp/docs/api/index-all.html delete mode 100644 fmpp/docs/api/index.html delete mode 100644 fmpp/docs/api/overview-frame.html delete mode 100644 fmpp/docs/api/overview-summary.html delete mode 100644 fmpp/docs/api/overview-tree.html delete mode 100644 fmpp/docs/api/package-list delete mode 100644 fmpp/docs/api/script.js delete mode 100644 fmpp/docs/api/serialized-form.html delete mode 100644 fmpp/docs/api/stylesheet.css delete mode 100644 fmpp/docs/basics.html delete mode 100644 fmpp/docs/bsh.html delete mode 100644 fmpp/docs/commandline.html delete mode 100644 fmpp/docs/configfile.html delete mode 100644 fmpp/docs/dataloader.html delete mode 100644 fmpp/docs/details.html delete mode 100644 fmpp/docs/examples/README.txt delete mode 100644 fmpp/docs/examples/ant/build.xml delete mode 100644 fmpp/docs/examples/ant/src/test.txt delete mode 100644 fmpp/docs/examples/ant2/build.xml delete mode 100644 fmpp/docs/examples/ant2/src/test.txt delete mode 100644 fmpp/docs/examples/ant3/build.xml delete mode 100644 fmpp/docs/examples/border/config.fmpp delete mode 100644 fmpp/docs/examples/border/src/include/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/border/src/include/test.ftl delete mode 100644 fmpp/docs/examples/border/src/test.c delete mode 100644 fmpp/docs/examples/border/src/test.html delete mode 100644 fmpp/docs/examples/build.xml delete mode 100644 fmpp/docs/examples/capture/config.fmpp delete mode 100644 fmpp/docs/examples/capture/src/include/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/capture/src/include/page.ftl delete mode 100644 fmpp/docs/examples/capture/src/test.html delete mode 100644 fmpp/docs/examples/check_links/config.fmpp delete mode 100644 fmpp/docs/examples/check_links/src/good_target.html delete mode 100644 fmpp/docs/examples/check_links/src/include/a.ftl delete mode 100644 fmpp/docs/examples/check_links/src/include/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/check_links/src/index.html delete mode 100644 fmpp/docs/examples/csv/config.fmpp delete mode 100644 fmpp/docs/examples/csv/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/csv/src/data/test.csv delete mode 100644 fmpp/docs/examples/csv/src/test.html delete mode 100644 fmpp/docs/examples/eval/config.fmpp delete mode 100644 fmpp/docs/examples/eval/src/test.html delete mode 100644 fmpp/docs/examples/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/img_dims/config.fmpp delete mode 100644 fmpp/docs/examples/img_dims/src/falcon.png delete mode 100644 fmpp/docs/examples/img_dims/src/index.html delete mode 100644 fmpp/docs/examples/inherit_config/README.txt delete mode 100644 fmpp/docs/examples/inherit_config/config.fmpp delete mode 100644 fmpp/docs/examples/inherit_config/config_dark.fmpp delete mode 100644 fmpp/docs/examples/inherit_config/config_red.fmpp delete mode 100644 fmpp/docs/examples/inherit_config/src/index.html delete mode 100644 fmpp/docs/examples/local_data/config.fmpp delete mode 100644 fmpp/docs/examples/local_data/src/index.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/1.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/1.html.bsh delete mode 100644 fmpp/docs/examples/local_data/src/sub/2.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/3_j.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/3_j.html.bsh delete mode 100644 fmpp/docs/examples/local_data/src/sub/food.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/sky/1.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/sky/2.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/sky/3_a.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/subsub/1.html delete mode 100644 fmpp/docs/examples/local_data/src/sub/subsub/2.html delete mode 100644 fmpp/docs/examples/local_data/src/sub2/1.html delete mode 100644 fmpp/docs/examples/local_data/src/sub2/2.html delete mode 100644 fmpp/docs/examples/multipage_list/config.fmpp delete mode 100644 fmpp/docs/examples/multipage_list/src/result.html delete mode 100644 fmpp/docs/examples/qtour_step1/config.fmpp delete mode 100644 fmpp/docs/examples/qtour_step1/src/falcon.png delete mode 100644 fmpp/docs/examples/qtour_step1/src/index.html delete mode 100644 fmpp/docs/examples/qtour_step1/src/subdir/something.html delete mode 100644 fmpp/docs/examples/qtour_step2/config.fmpp delete mode 100644 fmpp/docs/examples/qtour_step2/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/qtour_step2/src/data/style.tdd delete mode 100644 fmpp/docs/examples/qtour_step2/src/falcon.png delete mode 100644 fmpp/docs/examples/qtour_step2/src/index.html delete mode 100644 fmpp/docs/examples/qtour_step2/src/subdir/something.html delete mode 100644 fmpp/docs/examples/qtour_step3/config.fmpp delete mode 100644 fmpp/docs/examples/qtour_step3/src/data/birds.csv delete mode 100644 fmpp/docs/examples/qtour_step3/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/qtour_step3/src/data/style.tdd delete mode 100644 fmpp/docs/examples/qtour_step3/src/falcon.png delete mode 100644 fmpp/docs/examples/qtour_step3/src/index.html delete mode 100644 fmpp/docs/examples/qtour_step3/src/subdir/something.html delete mode 100644 fmpp/docs/examples/qtour_step4/config.fmpp delete mode 100644 fmpp/docs/examples/qtour_step4/src/bird.html delete mode 100644 fmpp/docs/examples/qtour_step4/src/data/birds.csv delete mode 100644 fmpp/docs/examples/qtour_step4/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/qtour_step4/src/data/style.tdd delete mode 100644 fmpp/docs/examples/qtour_step4/src/falcon.png delete mode 100644 fmpp/docs/examples/qtour_step4/src/index.html delete mode 100644 fmpp/docs/examples/qtour_step4/src/subdir/something.html delete mode 100644 fmpp/docs/examples/session/config.fmpp delete mode 100644 fmpp/docs/examples/session/src/01_foo.html delete mode 100644 fmpp/docs/examples/session/src/02_bar.html delete mode 100644 fmpp/docs/examples/session/src/03_baaz.html delete mode 100644 fmpp/docs/examples/session/src/04_wombat.html delete mode 100644 fmpp/docs/examples/session/src/include/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/session/src/include/page.ftl delete mode 100644 fmpp/docs/examples/session/src/index.html delete mode 100644 fmpp/docs/examples/tdd/config.fmpp delete mode 100644 fmpp/docs/examples/tdd/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/tdd/src/data/test.tdd delete mode 100644 fmpp/docs/examples/tdd/src/index.html delete mode 100644 fmpp/docs/examples/xml/config.fmpp delete mode 100644 fmpp/docs/examples/xml/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/xml/src/data/test.xml delete mode 100644 fmpp/docs/examples/xml/src/test.html delete mode 100644 fmpp/docs/examples/xml2/config.fmpp delete mode 100644 fmpp/docs/examples/xml2/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/xml2/src/data/manufacturers.xml delete mode 100644 fmpp/docs/examples/xml2/src/data/products.xml delete mode 100644 fmpp/docs/examples/xml2/src/index.html delete mode 100644 fmpp/docs/examples/xml2/src/product.html delete mode 100644 fmpp/docs/examples/xml_rendering/config.fmpp delete mode 100644 fmpp/docs/examples/xml_rendering/src/bigwidget.xml delete mode 100644 fmpp/docs/examples/xml_rendering/src/example1.xml delete mode 100644 fmpp/docs/examples/xml_rendering/src/example2.xml delete mode 100644 fmpp/docs/examples/xml_rendering/src/index.html delete mode 100644 fmpp/docs/examples/xml_rendering/src/normalwidget.xml delete mode 100644 fmpp/docs/examples/xml_rendering/src/renderer/book.html delete mode 100644 fmpp/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/xml_rendering/src/renderer/product.html delete mode 100644 fmpp/docs/examples/xml_rendering/src/smallwidget.xml delete mode 100644 fmpp/docs/examples/xml_try/config.fmpp delete mode 100644 fmpp/docs/examples/xml_try/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/xml_try/src/data/test.xml delete mode 100644 fmpp/docs/examples/xml_try/src/index.html delete mode 100644 fmpp/docs/examples/xml_validating/config.fmpp delete mode 100644 fmpp/docs/examples/xml_validating/dtds/catalog.xml delete mode 100644 fmpp/docs/examples/xml_validating/dtds/xhtml-lat1.ent delete mode 100644 fmpp/docs/examples/xml_validating/dtds/xhtml-special.ent delete mode 100644 fmpp/docs/examples/xml_validating/dtds/xhtml-symbol.ent delete mode 100644 fmpp/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd delete mode 100644 fmpp/docs/examples/xml_validating/src/data/ignoredir.fmpp delete mode 100644 fmpp/docs/examples/xml_validating/src/data/test.xhtml delete mode 100644 fmpp/docs/examples/xml_validating/src/test.txt delete mode 100644 fmpp/docs/figures/fmpparch.png delete mode 100644 fmpp/docs/figures/qtour_step1.png delete mode 100644 fmpp/docs/figures/qtour_step1_src.png delete mode 100644 fmpp/docs/figures/qtour_step2.png delete mode 100644 fmpp/docs/figures/qtour_step4.png delete mode 100644 fmpp/docs/freemarker/alphaidx.html delete mode 100644 fmpp/docs/freemarker/api/allclasses-frame.html delete mode 100644 fmpp/docs/freemarker/api/allclasses-noframe.html delete mode 100644 fmpp/docs/freemarker/api/constant-values.html delete mode 100644 fmpp/docs/freemarker/api/deprecated-list.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/CacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/CacheStorageWithGetSize.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/ClassTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/ConcurrentCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/FileTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/MruCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/MultiTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/NullCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/SoftCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/StatefulTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/StringTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/StrongCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/TemplateCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/TemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/URLTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/WebappTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorageWithGetSize.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/ClassTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/ConcurrentCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/FileTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/MruCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/MultiTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/NullCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/SoftCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/StatefulTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/StringTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/StrongCacheStorage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/URLTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/class-use/WebappTemplateLoader.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/cache/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.BigDecimalEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.ConservativeEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/BugException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/CommandLine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/Configurable.SettingValueAssignmentException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/Configurable.UnknownSettingException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/Configurable.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/CustomAttribute.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/Environment.Namespace.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/Environment.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/FreeMarkerTree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/InvalidReferenceException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonBooleanException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonDateException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonExtendedHashException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonHashException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonMethodException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonNodeException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonNumericalException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonSequenceException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonSequenceOrCollectionException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/NonStringException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/OptInTemplateClassResolver.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/ParseException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/StopException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/TemplateClassResolver.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/UnexpectedTypeException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.BigDecimalEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.ConservativeEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/BugException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/CommandLine.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.SettingValueAssignmentException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.UnknownSettingException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/CustomAttribute.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.Namespace.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/FreeMarkerTree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/InvalidReferenceException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonBooleanException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonDateException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonExtendedHashException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonHashException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonMethodException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonNodeException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonNumericalException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceOrCollectionException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/NonStringException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/OptInTemplateClassResolver.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/ParseException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/StopException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/TemplateClassResolver.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/class-use/UnexpectedTypeException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/core/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/Breakpoint.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/DebugModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/DebuggedEnvironment.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/Debugger.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/DebuggerClient.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/DebuggerListener.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/EnvironmentSuspendedEvent.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/Breakpoint.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/DebugModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggedEnvironment.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/Debugger.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerClient.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerListener.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/class-use/EnvironmentSuspendedEvent.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/debug/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/FreemarkerXmlTask.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/JythonAntTask.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/UnlinkedJythonOperationsImpl.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/FreemarkerXmlTask.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/JythonAntTask.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/UnlinkedJythonOperationsImpl.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/ant/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/ArrayModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansModelCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecision.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecisionInput.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperBuilder.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperConfiguration.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/BooleanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/CollectionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/DateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/EnumerationModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/HashAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/InvalidPropertyException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/IteratorModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/MapModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/MethodAppearanceFineTuner.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/NumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/OverloadedMethodsModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/ResourceBundleModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMapModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMethodModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/SingletonCustomizer.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/StringModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ArrayModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansModelCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecision.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecisionInput.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperBuilder.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperConfiguration.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BooleanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/CollectionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/DateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/EnumerationModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/HashAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/InvalidPropertyException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/IteratorModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MapModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MethodAppearanceFineTuner.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/NumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/OverloadedMethodsModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ResourceBundleModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMapModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMethodModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SingletonCustomizer.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/StringModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/beans/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/NodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/Transform.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/XPathSupport.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/NodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/Transform.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/XPathSupport.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/dom/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/NodeListModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/class-use/NodeListModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jdom/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/EventForwarding.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/FreemarkerTag.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/TaglibFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/EventForwarding.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/FreemarkerTag.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/TaglibFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jsp/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonNumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonSequenceModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonVersionAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/JythonWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonNumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonSequenceModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonVersionAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/jython/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoFunctionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoScriptableModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoFunctionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoScriptableModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/rhino/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/AllHttpScopesHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/FreemarkerServlet.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestParametersHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpSessionHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/IncludePage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/ServletContextHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/AllHttpScopesHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/FreemarkerServlet.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestParametersHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpSessionHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/IncludePage.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/ServletContextHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/servlet/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/IdentityHashMap.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/ModelCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/ModelFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/WrapperTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/class-use/IdentityHashMap.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelCache.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/class-use/WrapperTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/util/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/NodeListModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/class-use/NodeListModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/ext/xml/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/Logger.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/class-use/Logger.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/log/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/AdapterTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/Configuration.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapperBuilder.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/LocalizedString.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/ObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/ResourceBundleLocalizedString.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleCollection.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleDate.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleHash.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleList.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleNumber.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleScalar.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/SimpleSequence.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/Template.WrongEncodingException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/Template.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateBooleanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateCollectionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateDateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveBody.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateExceptionHandler.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateHashModelEx.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModelEx.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateModelAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateModelException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateModelIterator.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateModelListSequence.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateNodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateNumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateScalarModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateSequenceModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TemplateTransformModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/TransformControl.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/Version.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/WrappingTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/AdapterTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/Configuration.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapperBuilder.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/LocalizedString.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/ObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/ResourceBundleLocalizedString.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleCollection.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleDate.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleHash.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleList.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleNumber.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleObjectWrapper.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleScalar.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleSequence.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/Template.WrongEncodingException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/Template.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateBooleanModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateCollectionModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveBody.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateExceptionHandler.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModelEx.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModelEx.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelAdapter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelIterator.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelListSequence.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNumberModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateScalarModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateSequenceModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateTransformModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/TransformControl.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/Version.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/class-use/WrappingTemplateModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/package-use.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/CaptureOutput.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/ClassUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/CollectionUtils.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/Collections12.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/Constants.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DOMNodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.CalendarFieldsToDateConverter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateParseException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateToISO8601CalendarFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialCalendarFieldsToDateConverter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialDateToISO8601CalendarFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/DeepUnwrap.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/Execute.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/HtmlEscape.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/JythonRuntime.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/NormalizeNewlines.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/NullArgumentException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/NullWriter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/NumberUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/ObjectConstructor.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/OptimizerUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/SecurityUtilities.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/StandardCompress.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/StringUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/ToCanonical.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/UndeclaredThrowableException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/UnrecognizedTimeZoneException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/UnsupportedNumberClassException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/WriteProtectable.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/XmlEscape.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CaptureOutput.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ClassUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CollectionUtils.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Collections12.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Constants.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DOMNodeModel.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.CalendarFieldsToDateConverter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateParseException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateToISO8601CalendarFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialCalendarFieldsToDateConverter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialDateToISO8601CalendarFactory.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DeepUnwrap.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Execute.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/HtmlEscape.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/JythonRuntime.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NormalizeNewlines.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullArgumentException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullWriter.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NumberUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ObjectConstructor.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/OptimizerUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/SecurityUtilities.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StandardCompress.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StringUtil.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ToCanonical.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UndeclaredThrowableException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnrecognizedTimeZoneException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnsupportedNumberClassException.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/WriteProtectable.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/class-use/XmlEscape.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/package-frame.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/package-summary.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/package-tree.html delete mode 100644 fmpp/docs/freemarker/api/freemarker/template/utility/package-use.html delete mode 100644 fmpp/docs/freemarker/api/help-doc.html delete mode 100644 fmpp/docs/freemarker/api/index-all.html delete mode 100644 fmpp/docs/freemarker/api/index.html delete mode 100644 fmpp/docs/freemarker/api/overview-frame.html delete mode 100644 fmpp/docs/freemarker/api/overview-summary.html delete mode 100644 fmpp/docs/freemarker/api/overview-tree.html delete mode 100644 fmpp/docs/freemarker/api/package-list delete mode 100644 fmpp/docs/freemarker/api/script.js delete mode 100644 fmpp/docs/freemarker/api/serialized-form.html delete mode 100644 fmpp/docs/freemarker/api/stylesheet.css delete mode 100644 fmpp/docs/freemarker/app.html delete mode 100644 fmpp/docs/freemarker/app_eccn.html delete mode 100644 fmpp/docs/freemarker/app_faq.html delete mode 100644 fmpp/docs/freemarker/app_install.html delete mode 100644 fmpp/docs/freemarker/app_legal.html delete mode 100644 fmpp/docs/freemarker/app_license.html delete mode 100644 fmpp/docs/freemarker/app_versions.html delete mode 100644 fmpp/docs/freemarker/detailed-toc.html delete mode 100644 fmpp/docs/freemarker/dgui.html delete mode 100644 fmpp/docs/freemarker/dgui_datamodel.html delete mode 100644 fmpp/docs/freemarker/dgui_datamodel_basics.html delete mode 100644 fmpp/docs/freemarker/dgui_datamodel_types.html delete mode 100644 fmpp/docs/freemarker/dgui_misc.html delete mode 100644 fmpp/docs/freemarker/dgui_misc_alternativesyntax.html delete mode 100644 fmpp/docs/freemarker/dgui_misc_namespace.html delete mode 100644 fmpp/docs/freemarker/dgui_misc_userdefdir.html delete mode 100644 fmpp/docs/freemarker/dgui_misc_var.html delete mode 100644 fmpp/docs/freemarker/dgui_misc_whitespace.html delete mode 100644 fmpp/docs/freemarker/dgui_quickstart.html delete mode 100644 fmpp/docs/freemarker/dgui_quickstart_basics.html delete mode 100644 fmpp/docs/freemarker/dgui_quickstart_datamodel.html delete mode 100644 fmpp/docs/freemarker/dgui_quickstart_template.html delete mode 100644 fmpp/docs/freemarker/dgui_template.html delete mode 100644 fmpp/docs/freemarker/dgui_template_directives.html delete mode 100644 fmpp/docs/freemarker/dgui_template_exp.html delete mode 100644 fmpp/docs/freemarker/dgui_template_overallstructure.html delete mode 100644 fmpp/docs/freemarker/dgui_template_valueinsertion.html delete mode 100644 fmpp/docs/freemarker/docgen-resources/docgen.css delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/1.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/10.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/11.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/12.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/13.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/14.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/2.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/3.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/4.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/5.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/6.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/7.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/8.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/callouts/9.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/linktargetmarker.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/navigation-gradient.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/none.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/img/xxe.gif delete mode 100644 fmpp/docs/freemarker/docgen-resources/jquery.js delete mode 100644 fmpp/docs/freemarker/docgen-resources/linktargetmarker.js delete mode 100644 fmpp/docs/freemarker/eclipse-toc.xml delete mode 100644 fmpp/docs/freemarker/figures/model2sketch.png delete mode 100644 fmpp/docs/freemarker/figures/overview.png delete mode 100644 fmpp/docs/freemarker/figures/tree.png delete mode 100644 fmpp/docs/freemarker/gloss.html delete mode 100644 fmpp/docs/freemarker/index.html delete mode 100644 fmpp/docs/freemarker/pgui.html delete mode 100644 fmpp/docs/freemarker/pgui_config.html delete mode 100644 fmpp/docs/freemarker/pgui_config_basics.html delete mode 100644 fmpp/docs/freemarker/pgui_config_errorhandling.html delete mode 100644 fmpp/docs/freemarker/pgui_config_settings.html delete mode 100644 fmpp/docs/freemarker/pgui_config_sharedvariables.html delete mode 100644 fmpp/docs/freemarker/pgui_config_templateloading.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_basics.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_directive.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_method.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_node.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_objectWrapper.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_parent.html delete mode 100644 fmpp/docs/freemarker/pgui_datamodel_scalar.html delete mode 100644 fmpp/docs/freemarker/pgui_misc.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_ant.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_beanwrapper.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_charset.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_jythonwrapper.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_logging.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_multithreading.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_secureenv.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_servlet.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_var.html delete mode 100644 fmpp/docs/freemarker/pgui_misc_xml_legacy.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart_all.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart_createconfiguration.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart_createdatamodel.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart_gettemplate.html delete mode 100644 fmpp/docs/freemarker/pgui_quickstart_merge.html delete mode 100644 fmpp/docs/freemarker/preface.html delete mode 100644 fmpp/docs/freemarker/ref.html delete mode 100644 fmpp/docs/freemarker/ref_builtins.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_alphaidx.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_boolean.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_date.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_expert.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_hash.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_node.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_number.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_sequence.html delete mode 100644 fmpp/docs/freemarker/ref_builtins_string.html delete mode 100644 fmpp/docs/freemarker/ref_depr_builtin.html delete mode 100644 fmpp/docs/freemarker/ref_depr_directive.html delete mode 100644 fmpp/docs/freemarker/ref_depr_numerical_interpolation.html delete mode 100644 fmpp/docs/freemarker/ref_depr_oldmacro.html delete mode 100644 fmpp/docs/freemarker/ref_depr_oldsyntax.html delete mode 100644 fmpp/docs/freemarker/ref_depr_transform.html delete mode 100644 fmpp/docs/freemarker/ref_deprecated.html delete mode 100644 fmpp/docs/freemarker/ref_directive_alphaidx.html delete mode 100644 fmpp/docs/freemarker/ref_directive_assign.html delete mode 100644 fmpp/docs/freemarker/ref_directive_attempt.html delete mode 100644 fmpp/docs/freemarker/ref_directive_compress.html delete mode 100644 fmpp/docs/freemarker/ref_directive_escape.html delete mode 100644 fmpp/docs/freemarker/ref_directive_flush.html delete mode 100644 fmpp/docs/freemarker/ref_directive_ftl.html delete mode 100644 fmpp/docs/freemarker/ref_directive_function.html delete mode 100644 fmpp/docs/freemarker/ref_directive_global.html delete mode 100644 fmpp/docs/freemarker/ref_directive_if.html delete mode 100644 fmpp/docs/freemarker/ref_directive_import.html delete mode 100644 fmpp/docs/freemarker/ref_directive_include.html delete mode 100644 fmpp/docs/freemarker/ref_directive_list.html delete mode 100644 fmpp/docs/freemarker/ref_directive_local.html delete mode 100644 fmpp/docs/freemarker/ref_directive_macro.html delete mode 100644 fmpp/docs/freemarker/ref_directive_noparse.html delete mode 100644 fmpp/docs/freemarker/ref_directive_nt.html delete mode 100644 fmpp/docs/freemarker/ref_directive_setting.html delete mode 100644 fmpp/docs/freemarker/ref_directive_stop.html delete mode 100644 fmpp/docs/freemarker/ref_directive_switch.html delete mode 100644 fmpp/docs/freemarker/ref_directive_t.html delete mode 100644 fmpp/docs/freemarker/ref_directive_userDefined.html delete mode 100644 fmpp/docs/freemarker/ref_directive_visit.html delete mode 100644 fmpp/docs/freemarker/ref_directives.html delete mode 100644 fmpp/docs/freemarker/ref_reservednames.html delete mode 100644 fmpp/docs/freemarker/ref_specvar.html delete mode 100644 fmpp/docs/freemarker/versions_2_0.html delete mode 100644 fmpp/docs/freemarker/versions_2_01.html delete mode 100644 fmpp/docs/freemarker/versions_2_0RC1.html delete mode 100644 fmpp/docs/freemarker/versions_2_0RC2.html delete mode 100644 fmpp/docs/freemarker/versions_2_0RC3.html delete mode 100644 fmpp/docs/freemarker/versions_2_1.html delete mode 100644 fmpp/docs/freemarker/versions_2_1_1.html delete mode 100644 fmpp/docs/freemarker/versions_2_1_2.html delete mode 100644 fmpp/docs/freemarker/versions_2_1_3.html delete mode 100644 fmpp/docs/freemarker/versions_2_1_4.html delete mode 100644 fmpp/docs/freemarker/versions_2_1_5.html delete mode 100644 fmpp/docs/freemarker/versions_2_2.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_1.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_2.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_3.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_4.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_5.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_6.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_7.html delete mode 100644 fmpp/docs/freemarker/versions_2_2_8.html delete mode 100644 fmpp/docs/freemarker/versions_2_3.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_1.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_10.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_11.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_12.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_13.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_14.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_15.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_16.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_17.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_18.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_19.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_2.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_20.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_21.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_3.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_4.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_5.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_6.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_7.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_7rc1.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_8.html delete mode 100644 fmpp/docs/freemarker/versions_2_3_9.html delete mode 100644 fmpp/docs/freemarker/xgui.html delete mode 100644 fmpp/docs/freemarker/xgui_declarative.html delete mode 100644 fmpp/docs/freemarker/xgui_declarative_basics.html delete mode 100644 fmpp/docs/freemarker/xgui_declarative_details.html delete mode 100644 fmpp/docs/freemarker/xgui_expose.html delete mode 100644 fmpp/docs/freemarker/xgui_expose_dom.html delete mode 100644 fmpp/docs/freemarker/xgui_expose_put.html delete mode 100644 fmpp/docs/freemarker/xgui_imperative.html delete mode 100644 fmpp/docs/freemarker/xgui_imperative_formal.html delete mode 100644 fmpp/docs/freemarker/xgui_imperative_learn.html delete mode 100644 fmpp/docs/freemarker/xgui_preface.html delete mode 100644 fmpp/docs/frontends.html delete mode 100644 fmpp/docs/ftl.html delete mode 100644 fmpp/docs/index.html delete mode 100644 fmpp/docs/installing.html delete mode 100644 fmpp/docs/languages.html delete mode 100644 fmpp/docs/license.html delete mode 100644 fmpp/docs/manual.html delete mode 100644 fmpp/docs/miscellaneous.html delete mode 100644 fmpp/docs/overview.html delete mode 100644 fmpp/docs/pathpattern.html delete mode 100644 fmpp/docs/pphash.html delete mode 100644 fmpp/docs/properties.html delete mode 100644 fmpp/docs/qtour.html delete mode 100644 fmpp/docs/reportbug.html delete mode 100644 fmpp/docs/robots.txt delete mode 100644 fmpp/docs/settings.html delete mode 100644 fmpp/docs/style/fmpptitle.png delete mode 100644 fmpp/docs/style/fonts/icomoon.eot delete mode 100644 fmpp/docs/style/fonts/icomoon.svg delete mode 100644 fmpp/docs/style/fonts/icomoon.ttf delete mode 100644 fmpp/docs/style/fonts/icomoon.woff delete mode 100644 fmpp/docs/style/header-footer-background.png delete mode 100644 fmpp/docs/style/main.css delete mode 100644 fmpp/docs/style/main.min.css delete mode 100644 fmpp/docs/style/none.gif delete mode 100644 fmpp/docs/style/poweredby_sq_simple.png delete mode 100644 fmpp/docs/style/sflogo.png delete mode 100644 fmpp/docs/tdd.html delete mode 100644 fmpp/docs/tips.html delete mode 100644 fmpp/docs/versions.html delete mode 100644 fmpp/docs/writefrontend.html delete mode 100644 fmpp/documentation.html delete mode 100644 fmpp/gulpfile.js delete mode 100644 fmpp/lib/test/junit.jar delete mode 100644 fmpp/package.json delete mode 100644 fmpp/src/docs/LICENSE_ANT.txt delete mode 100644 fmpp/src/docs/LICENSE_FREEMARKER.txt delete mode 100644 fmpp/src/docs/LICENSE_RESOLVER.txt delete mode 100644 fmpp/src/docs/ant.html delete mode 100644 fmpp/src/docs/bsh.html delete mode 100644 fmpp/src/docs/checklinks_T3.ftl delete mode 100644 fmpp/src/docs/commandline.html delete mode 100644 fmpp/src/docs/configfile.html delete mode 100644 fmpp/src/docs/dataloader.html delete mode 100644 fmpp/src/docs/examples/README.txt delete mode 100644 fmpp/src/docs/examples/ant/build.xml delete mode 100644 fmpp/src/docs/examples/ant/src/test.txt delete mode 100644 fmpp/src/docs/examples/ant2/build.xml delete mode 100644 fmpp/src/docs/examples/ant2/src/test.txt delete mode 100644 fmpp/src/docs/examples/ant3/build.xml delete mode 100644 fmpp/src/docs/examples/border/config.fmpp delete mode 100644 fmpp/src/docs/examples/border/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/border/src/include/test.ftl delete mode 100644 fmpp/src/docs/examples/border/src/test.c delete mode 100644 fmpp/src/docs/examples/border/src/test.html delete mode 100644 fmpp/src/docs/examples/build.xml delete mode 100644 fmpp/src/docs/examples/capture/config.fmpp delete mode 100644 fmpp/src/docs/examples/capture/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/capture/src/include/page.ftl delete mode 100644 fmpp/src/docs/examples/capture/src/test.html delete mode 100644 fmpp/src/docs/examples/check_links/config.fmpp delete mode 100644 fmpp/src/docs/examples/check_links/src/good_target.html delete mode 100644 fmpp/src/docs/examples/check_links/src/include/a.ftl delete mode 100644 fmpp/src/docs/examples/check_links/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/check_links/src/index.html delete mode 100644 fmpp/src/docs/examples/csv/config.fmpp delete mode 100644 fmpp/src/docs/examples/csv/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/csv/src/data/test.csv delete mode 100644 fmpp/src/docs/examples/csv/src/test.html delete mode 100644 fmpp/src/docs/examples/eval/config.fmpp delete mode 100644 fmpp/src/docs/examples/eval/src/test.html delete mode 100644 fmpp/src/docs/examples/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/img_dims/config.fmpp delete mode 100644 fmpp/src/docs/examples/img_dims/src/falcon.png delete mode 100644 fmpp/src/docs/examples/img_dims/src/index.html delete mode 100644 fmpp/src/docs/examples/inherit_config/README.txt delete mode 100644 fmpp/src/docs/examples/inherit_config/config.fmpp delete mode 100644 fmpp/src/docs/examples/inherit_config/config_dark.fmpp delete mode 100644 fmpp/src/docs/examples/inherit_config/config_red.fmpp delete mode 100644 fmpp/src/docs/examples/inherit_config/src/index.html delete mode 100644 fmpp/src/docs/examples/local_data/config.fmpp delete mode 100644 fmpp/src/docs/examples/local_data/src/index.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/1.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/1.html.bsh delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/2.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/3_j.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/3_j.html.bsh delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/food.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/sky/1.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/sky/2.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/sky/3_a.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/subsub/1.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub/subsub/2.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub2/1.html delete mode 100644 fmpp/src/docs/examples/local_data/src/sub2/2.html delete mode 100644 fmpp/src/docs/examples/multipage_list/config.fmpp delete mode 100644 fmpp/src/docs/examples/multipage_list/src/result.html delete mode 100644 fmpp/src/docs/examples/qtour_step1/config.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step1/src/falcon.png delete mode 100644 fmpp/src/docs/examples/qtour_step1/src/index.html delete mode 100644 fmpp/src/docs/examples/qtour_step1/src/subdir/something.html delete mode 100644 fmpp/src/docs/examples/qtour_step2/config.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step2/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step2/src/data/style.tdd delete mode 100644 fmpp/src/docs/examples/qtour_step2/src/falcon.png delete mode 100644 fmpp/src/docs/examples/qtour_step2/src/index.html delete mode 100644 fmpp/src/docs/examples/qtour_step2/src/subdir/something.html delete mode 100644 fmpp/src/docs/examples/qtour_step3/config.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/data/birds.csv delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/data/style.tdd delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/falcon.png delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/index.html delete mode 100644 fmpp/src/docs/examples/qtour_step3/src/subdir/something.html delete mode 100644 fmpp/src/docs/examples/qtour_step4/config.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/bird.html delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/data/birds.csv delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/data/style.tdd delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/falcon.png delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/index.html delete mode 100644 fmpp/src/docs/examples/qtour_step4/src/subdir/something.html delete mode 100644 fmpp/src/docs/examples/session/config.fmpp delete mode 100644 fmpp/src/docs/examples/session/src/01_foo.html delete mode 100644 fmpp/src/docs/examples/session/src/02_bar.html delete mode 100644 fmpp/src/docs/examples/session/src/03_baaz.html delete mode 100644 fmpp/src/docs/examples/session/src/04_wombat.html delete mode 100644 fmpp/src/docs/examples/session/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/session/src/include/page.ftl delete mode 100644 fmpp/src/docs/examples/session/src/index.html delete mode 100644 fmpp/src/docs/examples/tdd/config.fmpp delete mode 100644 fmpp/src/docs/examples/tdd/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/tdd/src/data/test.tdd delete mode 100644 fmpp/src/docs/examples/tdd/src/index.html delete mode 100644 fmpp/src/docs/examples/xml/config.fmpp delete mode 100644 fmpp/src/docs/examples/xml/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/xml/src/data/test.xml delete mode 100644 fmpp/src/docs/examples/xml/src/test.html delete mode 100644 fmpp/src/docs/examples/xml2/config.fmpp delete mode 100644 fmpp/src/docs/examples/xml2/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/xml2/src/data/manufacturers.xml delete mode 100644 fmpp/src/docs/examples/xml2/src/data/products.xml delete mode 100644 fmpp/src/docs/examples/xml2/src/index.html delete mode 100644 fmpp/src/docs/examples/xml2/src/product.html delete mode 100644 fmpp/src/docs/examples/xml_rendering/config.fmpp delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/bigwidget.xml delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/example1.xml delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/example2.xml delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/index.html delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/normalwidget.xml delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/renderer/book.html delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/renderer/product.html delete mode 100644 fmpp/src/docs/examples/xml_rendering/src/smallwidget.xml delete mode 100644 fmpp/src/docs/examples/xml_try/config.fmpp delete mode 100644 fmpp/src/docs/examples/xml_try/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/xml_try/src/data/test.xml delete mode 100644 fmpp/src/docs/examples/xml_try/src/index.html delete mode 100644 fmpp/src/docs/examples/xml_validating/config.fmpp delete mode 100644 fmpp/src/docs/examples/xml_validating/dtds/catalog.xml delete mode 100644 fmpp/src/docs/examples/xml_validating/dtds/xhtml-lat1.ent delete mode 100644 fmpp/src/docs/examples/xml_validating/dtds/xhtml-special.ent delete mode 100644 fmpp/src/docs/examples/xml_validating/dtds/xhtml-symbol.ent delete mode 100644 fmpp/src/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd delete mode 100644 fmpp/src/docs/examples/xml_validating/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/docs/examples/xml_validating/src/data/test.xhtml delete mode 100644 fmpp/src/docs/examples/xml_validating/src/test.txt delete mode 100644 fmpp/src/docs/figures/fmpparch.png delete mode 100644 fmpp/src/docs/figures/qtour_step1.png delete mode 100644 fmpp/src/docs/figures/qtour_step1_src.png delete mode 100644 fmpp/src/docs/figures/qtour_step2.png delete mode 100644 fmpp/src/docs/figures/qtour_step4.png delete mode 100644 fmpp/src/docs/ftl.html delete mode 100644 fmpp/src/docs/include/ignoredir.fmpp delete mode 100644 fmpp/src/docs/include/page.ftl delete mode 100644 fmpp/src/docs/include/site.ftl delete mode 100644 fmpp/src/docs/index.html delete mode 100644 fmpp/src/docs/installing.html delete mode 100644 fmpp/src/docs/license.html delete mode 100644 fmpp/src/docs/manualtocs_T2.html delete mode 100644 fmpp/src/docs/overview.html delete mode 100644 fmpp/src/docs/pathpattern.html delete mode 100644 fmpp/src/docs/pphash.html delete mode 100644 fmpp/src/docs/properties.html delete mode 100644 fmpp/src/docs/qtour.html delete mode 100644 fmpp/src/docs/reportbug.html delete mode 100644 fmpp/src/docs/robots.txt delete mode 100644 fmpp/src/docs/settings.html delete mode 100644 fmpp/src/docs/style/README-BUILD.txt delete mode 100644 fmpp/src/docs/style/fmpptitle.png delete mode 100644 fmpp/src/docs/style/fonts/README-BUILD.txt delete mode 100644 fmpp/src/docs/style/fonts/icomoon.eot delete mode 100644 fmpp/src/docs/style/fonts/icomoon.svg delete mode 100644 fmpp/src/docs/style/fonts/icomoon.ttf delete mode 100644 fmpp/src/docs/style/fonts/icomoon.woff delete mode 100644 fmpp/src/docs/style/fonts/selection.json delete mode 100644 fmpp/src/docs/style/header-footer-background.png delete mode 100644 fmpp/src/docs/style/lib/base.less delete mode 100644 fmpp/src/docs/style/lib/components/breadcrumbs.less delete mode 100644 fmpp/src/docs/style/lib/components/download-options.less delete mode 100644 fmpp/src/docs/style/lib/components/pagers.less delete mode 100644 fmpp/src/docs/style/lib/components/report-bugs.less delete mode 100644 fmpp/src/docs/style/lib/components/social-icons.less delete mode 100644 fmpp/src/docs/style/lib/components/table-of-contents.less delete mode 100644 fmpp/src/docs/style/lib/icons.less delete mode 100644 fmpp/src/docs/style/lib/ignoredir.fmpp delete mode 100644 fmpp/src/docs/style/lib/layout/content.less delete mode 100644 fmpp/src/docs/style/lib/layout/footer.less delete mode 100644 fmpp/src/docs/style/lib/layout/header.less delete mode 100644 fmpp/src/docs/style/lib/mixins.less delete mode 100644 fmpp/src/docs/style/lib/utilities.less delete mode 100644 fmpp/src/docs/style/lib/variables.less delete mode 100644 fmpp/src/docs/style/main.less delete mode 100644 fmpp/src/docs/style/none.gif delete mode 100644 fmpp/src/docs/style/poweredby_sq_simple.png delete mode 100644 fmpp/src/docs/style/sflogo.png delete mode 100644 fmpp/src/docs/tdd.html delete mode 100644 fmpp/src/docs/tips.html delete mode 100644 fmpp/src/docs/versions.html delete mode 100644 fmpp/src/docs/writefrontend.html delete mode 100644 fmpp/src/main/java/fmpp/DataModelBuildingException.java delete mode 100644 fmpp/src/main/java/fmpp/Engine.java delete mode 100644 fmpp/src/main/java/fmpp/EngineXmlUtils.java delete mode 100644 fmpp/src/main/java/fmpp/FmppFileOutputWriter.java delete mode 100644 fmpp/src/main/java/fmpp/FmppOutputWriter.java delete mode 100644 fmpp/src/main/java/fmpp/FmppTemplateLoader.java delete mode 100644 fmpp/src/main/java/fmpp/GenericProcessingException.java delete mode 100644 fmpp/src/main/java/fmpp/IllegalConfigurationException.java delete mode 100644 fmpp/src/main/java/fmpp/LocalDataBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/ProcessingException.java delete mode 100644 fmpp/src/main/java/fmpp/ProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/TemplateDataModelBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/TemplateEnvironment.java delete mode 100644 fmpp/src/main/java/fmpp/XmlRenderingConfiguration.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AbstractTextDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AntDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AntProjectDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AntPropertiesDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AntPropertyDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/AntTaskDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/CsvDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/EvalDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/FileDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/JSONDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/NowDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/PropertiesDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/SlicedTextDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/TddDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/TddSequenceDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/TextDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/XmlDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/XmlInfosetDataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/dataloaders/package.html delete mode 100644 fmpp/src/main/java/fmpp/localdatabuilders/BshLocalDataBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/localdatabuilders/CachingLocalDataBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/localdatabuilders/MapLocalDataBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/localdatabuilders/TddHashLocalDataBuilder.java delete mode 100644 fmpp/src/main/java/fmpp/localdatabuilders/package.html delete mode 100644 fmpp/src/main/java/fmpp/models/AddTransform.java delete mode 100644 fmpp/src/main/java/fmpp/models/ClearTransform.java delete mode 100644 fmpp/src/main/java/fmpp/models/CopyWritableVariableMethod.java delete mode 100644 fmpp/src/main/java/fmpp/models/CsvSequence.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONArrayNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONBooleanNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONNullNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONNumberNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONObjectNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/JSONStringNode.java delete mode 100644 fmpp/src/main/java/fmpp/models/NewWritableHashMethod.java delete mode 100644 fmpp/src/main/java/fmpp/models/NewWritableSequenceMethod.java delete mode 100644 fmpp/src/main/java/fmpp/models/RemoveTransform.java delete mode 100644 fmpp/src/main/java/fmpp/models/SetTransform.java delete mode 100644 fmpp/src/main/java/fmpp/models/StringArraySequence.java delete mode 100644 fmpp/src/main/java/fmpp/models/TemplateModelArrayCollection.java delete mode 100644 fmpp/src/main/java/fmpp/models/TemplateModelListCollection.java delete mode 100644 fmpp/src/main/java/fmpp/models/TemplateModelListSequence.java delete mode 100644 fmpp/src/main/java/fmpp/models/TemplateModelUtils.java delete mode 100644 fmpp/src/main/java/fmpp/models/WritableHash.java delete mode 100644 fmpp/src/main/java/fmpp/models/WritableSequence.java delete mode 100644 fmpp/src/main/java/fmpp/models/WritableVariable.java delete mode 100644 fmpp/src/main/java/fmpp/models/package.html delete mode 100644 fmpp/src/main/java/fmpp/overview.html delete mode 100644 fmpp/src/main/java/fmpp/package.html delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/AntProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/ConsoleProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/LoggerProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/StatisticsProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/TerseConsoleProgressListener.java delete mode 100644 fmpp/src/main/java/fmpp/progresslisteners/package.html delete mode 100644 fmpp/src/main/java/fmpp/setting/FileWithConfigurationBase.java delete mode 100644 fmpp/src/main/java/fmpp/setting/FileWithSettingValue.java delete mode 100644 fmpp/src/main/java/fmpp/setting/SettingException.java delete mode 100644 fmpp/src/main/java/fmpp/setting/Settings.java delete mode 100644 fmpp/src/main/java/fmpp/setting/XmlDependentOps.java delete mode 100644 fmpp/src/main/java/fmpp/setting/XmlDependentOpsImpl.java delete mode 100644 fmpp/src/main/java/fmpp/setting/package.html delete mode 100644 fmpp/src/main/java/fmpp/tdd/DataLoader.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/DataLoaderEvaluationEnvironment.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/EvalException.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/EvaluationEnvironment.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/Fragment.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/FunctionCall.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/Interpreter.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/TddUtil.java delete mode 100644 fmpp/src/main/java/fmpp/tdd/package.html delete mode 100644 fmpp/src/main/java/fmpp/tools/AntTask.java delete mode 100644 fmpp/src/main/java/fmpp/tools/CommandLine.java delete mode 100644 fmpp/src/main/java/fmpp/tools/package.html delete mode 100644 fmpp/src/main/java/fmpp/util/ArgsParser.java delete mode 100644 fmpp/src/main/java/fmpp/util/BorderedReader.java delete mode 100644 fmpp/src/main/java/fmpp/util/BugException.java delete mode 100644 fmpp/src/main/java/fmpp/util/DataLoaderUtil.java delete mode 100644 fmpp/src/main/java/fmpp/util/ExceptionCC.java delete mode 100644 fmpp/src/main/java/fmpp/util/FileUtil.java delete mode 100644 fmpp/src/main/java/fmpp/util/FreemarkerUtil.java delete mode 100644 fmpp/src/main/java/fmpp/util/InstallationException.java delete mode 100644 fmpp/src/main/java/fmpp/util/JSONParseException.java delete mode 100644 fmpp/src/main/java/fmpp/util/JSONParser.java delete mode 100644 fmpp/src/main/java/fmpp/util/MiscUtil.java delete mode 100644 fmpp/src/main/java/fmpp/util/MultiListIterator.java delete mode 100644 fmpp/src/main/java/fmpp/util/NullOutputStream.java delete mode 100644 fmpp/src/main/java/fmpp/util/NullWriter.java delete mode 100644 fmpp/src/main/java/fmpp/util/RuntimeExceptionCC.java delete mode 100644 fmpp/src/main/java/fmpp/util/StringUtil.java delete mode 100644 fmpp/src/main/java/fmpp/util/package.html delete mode 100644 fmpp/src/main/resources/META-INF/LICENSE.txt delete mode 100644 fmpp/src/main/resources/fmpp/version.properties delete mode 100644 fmpp/src/test/java/fmpp/testsuite/ConsoleTestProgressListener.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/SortAttrsTransform.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/TestLocalDataBuilder.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/TestProgressListener.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/TestSuite.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder.java delete mode 100644 fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder2.java delete mode 100644 fmpp/src/test/java/fmpp/util/JSONParserTest.java delete mode 100644 fmpp/src/test/resources/README.txt delete mode 100644 fmpp/src/test/resources/expected/always_create_dirs_off/sub/t3.txt delete mode 100644 fmpp/src/test/resources/expected/always_create_dirs_off/t.txt delete mode 100644 fmpp/src/test/resources/expected/always_create_dirs_on/sub/t3.txt delete mode 100644 fmpp/src/test/resources/expected/always_create_dirs_on/t.txt delete mode 100644 fmpp/src/test/resources/expected/basic_usecase/index.html delete mode 100644 fmpp/src/test/resources/expected/basic_usecase/mi.png delete mode 100644 fmpp/src/test/resources/expected/basic_usecase/sub/rattrah.html delete mode 100644 fmpp/src/test/resources/expected/basic_usecase/sub/subsub/rattrahad.html delete mode 100644 fmpp/src/test/resources/expected/borders/1.txt delete mode 100644 fmpp/src/test/resources/expected/borders/1.x delete mode 100644 fmpp/src/test/resources/expected/borders/1.y delete mode 100644 fmpp/src/test/resources/expected/borders/sub/1.txt delete mode 100644 fmpp/src/test/resources/expected/borders/sub/1.x delete mode 100644 fmpp/src/test/resources/expected/borders/sub/1.y delete mode 100644 fmpp/src/test/resources/expected/borders/sub/foo/1.txt delete mode 100644 fmpp/src/test/resources/expected/cfg_base/index.html delete mode 100644 fmpp/src/test/resources/expected/cfg_base/sub/rattrah.html delete mode 100644 fmpp/src/test/resources/expected/cfg_inheritance/1.txt delete mode 100644 fmpp/src/test/resources/expected/cfg_inheritance/2.txt delete mode 100644 fmpp/src/test/resources/expected/cfg_inheritance/3.txt delete mode 100644 fmpp/src/test/resources/expected/cfg_inheritance/4.txt delete mode 100644 fmpp/src/test/resources/expected/cfg_inheritance/test.txt delete mode 100644 fmpp/src/test/resources/expected/dl_csv/test.html delete mode 100644 fmpp/src/test/resources/expected/dl_eval/test.txt delete mode 100644 fmpp/src/test/resources/expected/dl_get/test.txt delete mode 100644 fmpp/src/test/resources/expected/dl_json/explicit-traversal.html delete mode 100644 fmpp/src/test/resources/expected/dl_json/visitor-traversal.html delete mode 100644 fmpp/src/test/resources/expected/dl_slicedtext/test.txt delete mode 100644 fmpp/src/test/resources/expected/dl_text/test.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/test.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/test2.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/test2_iso-8859-1.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/text_UTF-8_2.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/text_iso-8859-2.txt delete mode 100644 fmpp/src/test/resources/expected/encoding/text_utf-16.txt delete mode 100644 fmpp/src/test/resources/expected/ex_border/test.c.html delete mode 100644 fmpp/src/test/resources/expected/ex_border/test.html delete mode 100644 fmpp/src/test/resources/expected/ex_capture/test.html delete mode 100644 fmpp/src/test/resources/expected/ex_check_links/good_target.html delete mode 100644 fmpp/src/test/resources/expected/ex_check_links/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_csv/test.html delete mode 100644 fmpp/src/test/resources/expected/ex_img_dims/falcon.png delete mode 100644 fmpp/src/test/resources/expected/ex_img_dims/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/1.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/2.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/3_j.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/food.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/sky/1.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/sky/2.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/sky/3_a.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/subsub/1.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub/subsub/2.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub2/1.html delete mode 100644 fmpp/src/test/resources/expected/ex_local_data/sub2/2.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result1.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result2.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result3.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result4.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result5.html delete mode 100644 fmpp/src/test/resources/expected/ex_multipage_list/result6.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step1/falcon.png delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step1/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step1/subdir/something.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step2/falcon.png delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step2/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step2/subdir/something.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step3/falcon.png delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step3/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step3/subdir/something.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/arctic-tern.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/falcon.png delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/house-sparrow.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/sakeret.html delete mode 100644 fmpp/src/test/resources/expected/ex_qtour_step4/subdir/something.html delete mode 100644 fmpp/src/test/resources/expected/ex_session/01_foo.html delete mode 100644 fmpp/src/test/resources/expected/ex_session/02_bar.html delete mode 100644 fmpp/src/test/resources/expected/ex_session/03_baaz.html delete mode 100644 fmpp/src/test/resources/expected/ex_session/04_wombat.html delete mode 100644 fmpp/src/test/resources/expected/ex_session/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_tdd/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml/test.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml2/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml2/product_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml2/product_2.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml2/product_3.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml2/product_4.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/bigwidget.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_2.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_2.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_3.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_index.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_2.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_3.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example2_chapter_2_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example2_index.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_1.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_2.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/index.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/normalwidget.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_rendering/smallwidget.html delete mode 100644 fmpp/src/test/resources/expected/ex_xml_validating/test.txt delete mode 100644 fmpp/src/test/resources/expected/filename/a delete mode 100644 fmpp/src/test/resources/expected/filename/a.foo delete mode 100644 fmpp/src/test/resources/expected/filename/a.foo.bar delete mode 100644 fmpp/src/test/resources/expected/filename/bt delete mode 100644 fmpp/src/test/resources/expected/filename/bt.x delete mode 100644 fmpp/src/test/resources/expected/filename/c delete mode 100644 fmpp/src/test/resources/expected/filename/c.x delete mode 100644 fmpp/src/test/resources/expected/filename/d delete mode 100644 fmpp/src/test/resources/expected/filename/d.pok delete mode 100644 fmpp/src/test/resources/expected/filename/e delete mode 100644 fmpp/src/test/resources/expected/filename/f1.wq delete mode 100644 fmpp/src/test/resources/expected/filename/f2.qw delete mode 100644 fmpp/src/test/resources/expected/filename/gxx delete mode 100644 fmpp/src/test/resources/expected/filename/rme_casesens delete mode 100644 fmpp/src/test/resources/expected/filename/rmp_casesens delete mode 100644 fmpp/src/test/resources/expected/filename/rpe_casesens.wq delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/a delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/a.foo delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/a.foo.bar delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/bt delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/bt.x delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/c delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/c.x delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/d delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/d.pok delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/e delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/f1.wq delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/f2.qw delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/gxx delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/rme_casesens.Man delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/rmp_casesensXx delete mode 100644 fmpp/src/test/resources/expected/filename_casesens/rpe_casesens.Qw delete mode 100644 fmpp/src/test/resources/expected/fm_ici_2.3.21/test.txt delete mode 100644 fmpp/src/test/resources/expected/fm_ici_2.3.21_ow/test.txt delete mode 100644 fmpp/src/test/resources/expected/fm_ici_null/test.txt delete mode 100644 fmpp/src/test/resources/expected/fm_ici_null_ow/test.txt delete mode 100644 fmpp/src/test/resources/expected/format_settings/test.txt delete mode 100644 fmpp/src/test/resources/expected/freemarker_links/@test4 delete mode 100644 fmpp/src/test/resources/expected/freemarker_links/sub/t.txt delete mode 100644 fmpp/src/test/resources/expected/freemarker_links/t.txt delete mode 100644 fmpp/src/test/resources/expected/htmlutils/test.bmp delete mode 100644 fmpp/src/test/resources/expected/htmlutils/test.gif delete mode 100644 fmpp/src/test/resources/expected/htmlutils/test.html delete mode 100644 fmpp/src/test/resources/expected/htmlutils/test.jpg delete mode 100644 fmpp/src/test/resources/expected/htmlutils/test.png delete mode 100644 fmpp/src/test/resources/expected/localdata/1.html delete mode 100644 fmpp/src/test/resources/expected/localdata/1_x.html delete mode 100644 fmpp/src/test/resources/expected/localdata/1_z.html delete mode 100644 fmpp/src/test/resources/expected/localdata/1_z.htmlx delete mode 100644 fmpp/src/test/resources/expected/localdata/2.htm delete mode 100644 fmpp/src/test/resources/expected/localdata/2_y.htm delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/1.html delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/1_x.html delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/1_z.html delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/1_z.htmlx delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/2.htm delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/2_y.htm delete mode 100644 fmpp/src/test/resources/expected/localdata/sub/test.txt delete mode 100644 fmpp/src/test/resources/expected/localdata/test.txt delete mode 100644 fmpp/src/test/resources/expected/locale/test.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/n0.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/n1.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/n2.1.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/n2.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/n3.txt delete mode 100644 fmpp/src/test/resources/expected/nested_output/nestings2.txt delete mode 100644 fmpp/src/test/resources/expected/objectwrapper1/test.txt delete mode 100644 fmpp/src/test/resources/expected/objectwrapper2/test.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/subsub/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/subsub/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/subsub/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern1/sub/subsub/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/subsubsub/1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/subsubsub/2.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/subsubsub/3.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern2/sub/subsub/subsubsub/4.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/Bar.Txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/Bar.t1 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/Foo.t2 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/Foo.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/bar.t2 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/foo.t1 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/sub/t.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/t1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3/t2.Txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/Bar.Txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/Bar.t1 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/Foo.t2 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/Foo.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/bar.t2 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/foo.t1 delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/sub/t.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/t1.txt delete mode 100644 fmpp/src/test/resources/expected/pathpattern3_casesens/t2.Txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths/s.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths/sub/s.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths/sub/test.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths/test.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths2/sub/subsub/test.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths2/sub/test.txt delete mode 100644 fmpp/src/test/resources/expected/relative_paths2/test.txt delete mode 100644 fmpp/src/test/resources/expected/rename/4.rtxt delete mode 100644 fmpp/src/test/resources/expected/rename/5.rtxt delete mode 100644 fmpp/src/test/resources/expected/rename/6.foo.rtxt delete mode 100644 fmpp/src/test/resources/expected/rename/r/3.txt delete mode 100644 fmpp/src/test/resources/expected/rename/r1.txt delete mode 100644 fmpp/src/test/resources/expected/rename/r2.txt delete mode 100644 fmpp/src/test/resources/expected/rename/r7.rtxt delete mode 100644 fmpp/src/test/resources/expected/sources/1.txt delete mode 100644 fmpp/src/test/resources/expected/sources/2.txt delete mode 100644 fmpp/src/test/resources/expected/sources/3.txt delete mode 100644 fmpp/src/test/resources/expected/sources/4.txt delete mode 100644 fmpp/src/test/resources/expected/sources/6.txt delete mode 100644 fmpp/src/test/resources/expected/sources/sub/a.txt delete mode 100644 fmpp/src/test/resources/expected/sources/sub/b.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_1/test1.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_1/test2.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_1/test3.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_2/test1.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_2/test2.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_2/test3.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_3/test1a.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_3/test1b.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_3/test2.txt delete mode 100644 fmpp/src/test/resources/expected/tag_syntax_3/test3.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/comments.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/encoding.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/hashes.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/nestedscalars.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/scalars.txt delete mode 100644 fmpp/src/test/resources/expected/tdd/seqmode.txt delete mode 100644 fmpp/src/test/resources/expected/terminated_output/correct.html delete mode 100644 fmpp/src/test/resources/expected/terminated_output/flushedzero.html delete mode 100644 fmpp/src/test/resources/expected/terminated_output/n1.txt delete mode 100644 fmpp/src/test/resources/expected/terminated_output/n2.txt delete mode 100644 fmpp/src/test/resources/expected/terminated_output/n3.txt delete mode 100644 fmpp/src/test/resources/expected/terminated_output/nZero.txt delete mode 100644 fmpp/src/test/resources/expected/terminated_output/nestings.html delete mode 100644 fmpp/src/test/resources/expected/terminated_output/one.html delete mode 100644 fmpp/src/test/resources/expected/url_escaping/test.txt delete mode 100644 fmpp/src/test/resources/expected/url_escaping2/test.txt delete mode 100644 fmpp/src/test/resources/expected/writable_hash/test.txt delete mode 100644 fmpp/src/test/resources/expected/writable_sequence/test.txt delete mode 100644 fmpp/src/test/resources/expected/xinclude/index.html delete mode 100644 fmpp/src/test/resources/expected/xml_catalogs/test.txt delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/a.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/b.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/c.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/copy.txt delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/d.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/e.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/f.xml delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/g.txt delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/h.txt delete mode 100644 fmpp/src/test/resources/expected/xml_rendering/ldb.xml delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/a/r.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/q/q2/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/x.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/y/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/c/d/createdir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/d/createdir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/d/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/data/test.xml delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/sub/t3.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_off/src/t.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/a/r.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/q/q2/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/x.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/y/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/c/d/createdir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/d/createdir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/d/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/data/test.xml delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/sub/t3.txt delete mode 100644 fmpp/src/test/resources/tests/always_create_dirs_on/src/t.txt delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/data/style.properties delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/include/page.ftl delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/index.html delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/mi.png delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/sub/rattrah.html delete mode 100644 fmpp/src/test/resources/tests/basic_usecase/src/sub/subsub/rattrahad.html delete mode 100644 fmpp/src/test/resources/tests/borders/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/borders/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/borders/src/1.x delete mode 100644 fmpp/src/test/resources/tests/borders/src/1.y delete mode 100644 fmpp/src/test/resources/tests/borders/src/sub/1.txt delete mode 100644 fmpp/src/test/resources/tests/borders/src/sub/1.x delete mode 100644 fmpp/src/test/resources/tests/borders/src/sub/1.y delete mode 100644 fmpp/src/test/resources/tests/borders/src/sub/foo/1.txt delete mode 100644 fmpp/src/test/resources/tests/cfg_base/b1/src/index.html delete mode 100644 fmpp/src/test/resources/tests/cfg_base/b1/src/sub/rattrah.html delete mode 100644 fmpp/src/test/resources/tests/cfg_base/cfg2/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/cfg_base/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/cfg_base/foo/data/style.properties delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/cfg2/fmpp2.cfg delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/fmpp3.cfg delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/src/2.txt delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/src/3.txt delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/src/4.txt delete mode 100644 fmpp/src/test/resources/tests/cfg_inheritance/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test-utf8-bom.csv delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test2.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test3.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test4.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/data/test5.txt delete mode 100644 fmpp/src/test/resources/tests/dl_csv/src/test.html delete mode 100644 fmpp/src/test/resources/tests/dl_eval/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_eval/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/dl_get/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_get/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/dl_json/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/data/applicants.json delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/data/synthetic.json delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/explicit-traversal.html delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/synthetic.ftl delete mode 100644 fmpp/src/test/resources/tests/dl_json/src/visitor-traversal.html delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/empty.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t1.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t2.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t3.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t4.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t5.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6cr.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6lf.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t7.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t8.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/data/t9.txt delete mode 100644 fmpp/src/test/resources/tests/dl_slicedtext/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/dl_text/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_text/src/data/1-utf8-bom.txt delete mode 100644 fmpp/src/test/resources/tests/dl_text/src/data/1.txt delete mode 100644 fmpp/src/test/resources/tests/dl_text/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/dl_text/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/encoding/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/encoding/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/encoding/src/test2.txt delete mode 100644 fmpp/src/test/resources/tests/ex_border/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_capture/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_check_links/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_csv/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_img_dims/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/ex_local_data/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/ex_multipage_list/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/ex_qtour_step1/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_qtour_step2/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_qtour_step3/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_qtour_step4/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_session/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_tdd/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_xml/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_xml2/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_xml_rendering/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/ex_xml_validating/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/filename/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/filename/src/at delete mode 100644 fmpp/src/test/resources/tests/filename/src/at.foo delete mode 100644 fmpp/src/test/resources/tests/filename/src/at.foo.bar delete mode 100644 fmpp/src/test/resources/tests/filename/src/btt delete mode 100644 fmpp/src/test/resources/tests/filename/src/btt.x delete mode 100644 fmpp/src/test/resources/tests/filename/src/cxx delete mode 100644 fmpp/src/test/resources/tests/filename/src/cxx.x delete mode 100644 fmpp/src/test/resources/tests/filename/src/d.bat.man delete mode 100644 fmpp/src/test/resources/tests/filename/src/d.spider.man delete mode 100644 fmpp/src/test/resources/tests/filename/src/et.spider delete mode 100644 fmpp/src/test/resources/tests/filename/src/f1.qw delete mode 100644 fmpp/src/test/resources/tests/filename/src/f2.wq delete mode 100644 fmpp/src/test/resources/tests/filename/src/gxxxxx delete mode 100644 fmpp/src/test/resources/tests/filename/src/rme_casesens.Man delete mode 100644 fmpp/src/test/resources/tests/filename/src/rmp_casesensXx delete mode 100644 fmpp/src/test/resources/tests/filename/src/rpe_casesens.Qw delete mode 100644 fmpp/src/test/resources/tests/filename_casesens/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/fm_ici_2.3.21/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/fm_ici_2.3.21_ow/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/fm_ici_null/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/fm_ici_null/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/fm_ici_null_ow/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/format_settings/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/format_settings/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc1/test1.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc1/test2.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc1/test5.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc2/godzilla.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc2/test2.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc2/test3.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc2/test5.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inc2/test6.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/inherited.fmpp delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/src/@inc/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/src/@inc/test1.ftl delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/src/@test4 delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/src/sub/t.txt delete mode 100644 fmpp/src/test/resources/tests/freemarker_links/src/t.txt delete mode 100644 fmpp/src/test/resources/tests/htmlutils/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/htmlutils/src/test.bmp delete mode 100644 fmpp/src/test/resources/tests/htmlutils/src/test.gif delete mode 100644 fmpp/src/test/resources/tests/htmlutils/src/test.html delete mode 100644 fmpp/src/test/resources/tests/htmlutils/src/test.jpg delete mode 100644 fmpp/src/test/resources/tests/htmlutils/src/test.png delete mode 100644 fmpp/src/test/resources/tests/localdata/build.xml delete mode 100644 fmpp/src/test/resources/tests/localdata/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/localdata/inheritedcfg.fmpp delete mode 100644 fmpp/src/test/resources/tests/localdata/src/1.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/1_x.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/1_z.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/1_z.htmlx delete mode 100644 fmpp/src/test/resources/tests/localdata/src/2.htm delete mode 100644 fmpp/src/test/resources/tests/localdata/src/2_y.htm delete mode 100644 fmpp/src/test/resources/tests/localdata/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/localdata/src/data/y.properties delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/1.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/1_x.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/1_z.html delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/1_z.htmlx delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/2.htm delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/2_y.htm delete mode 100644 fmpp/src/test/resources/tests/localdata/src/sub/test.txt delete mode 100644 fmpp/src/test/resources/tests/localdata/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/locale/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/locale/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/nested_output/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/nested_output/src/nestings.txt delete mode 100644 fmpp/src/test/resources/tests/nested_output/src/nestings2.txt delete mode 100644 fmpp/src/test/resources/tests/objectwrapper1/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/objectwrapper1/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/objectwrapper2/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/objectwrapper2/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/2.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/3.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/4.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/Bar.Txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/Bar.t1 delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/Foo.t2 delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/Foo.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/bar.t2 delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/foo.t1 delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/sub/t.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/t1.txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3/src/t2.Txt delete mode 100644 fmpp/src/test/resources/tests/pathpattern3_casesens/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/relative_paths/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/include/s.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/include/test.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/s.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/sub/s.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/sub/test.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.inc delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/sub/test.inc delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/sub/test.txt delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/test.inc delete mode 100644 fmpp/src/test/resources/tests/relative_paths2/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/rename/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/rename/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/rename/src/2.txt delete mode 100644 fmpp/src/test/resources/tests/rename/src/3.txt delete mode 100644 fmpp/src/test/resources/tests/rename/src/4.txt delete mode 100644 fmpp/src/test/resources/tests/rename/src/5 delete mode 100644 fmpp/src/test/resources/tests/rename/src/6.foo.txt delete mode 100644 fmpp/src/test/resources/tests/rename/src/7.txt delete mode 100644 fmpp/src/test/resources/tests/sources/args.txt delete mode 100644 fmpp/src/test/resources/tests/sources/fmpp.cfg delete mode 100644 fmpp/src/test/resources/tests/sources/fmpp2.cfg delete mode 100644 fmpp/src/test/resources/tests/sources/src/1.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/2.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/3.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/4.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/5.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/6.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/sub/a.txt delete mode 100644 fmpp/src/test/resources/tests/sources/src/sub/b.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_1/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_1/src/test1.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_1/src/test2.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_1/src/test3.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_2/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_2/src/test1.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_2/src/test2.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_2/src/test3.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_3/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_3/src/test1a.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_3/src/test1b.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_3/src/test2.txt delete mode 100644 fmpp/src/test/resources/tests/tag_syntax_3/src/test3.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/tdd/src/comments.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/comment1.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/comment2.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/encoding.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/hash.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/hashes.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/nestedscalars.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/scalars.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/data/seqmode.tdd delete mode 100644 fmpp/src/test/resources/tests/tdd/src/encoding.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/src/hashes.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/src/include/common.ftl delete mode 100644 fmpp/src/test/resources/tests/tdd/src/include/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/tdd/src/nestedscalars.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/src/scalars.txt delete mode 100644 fmpp/src/test/resources/tests/tdd/src/seqmode.txt delete mode 100644 fmpp/src/test/resources/tests/terminated_output/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/terminated_output/src/correct.html delete mode 100644 fmpp/src/test/resources/tests/terminated_output/src/flushedzero.html delete mode 100644 fmpp/src/test/resources/tests/terminated_output/src/nestings.html delete mode 100644 fmpp/src/test/resources/tests/terminated_output/src/one.html delete mode 100644 fmpp/src/test/resources/tests/terminated_output/src/zero.html delete mode 100644 fmpp/src/test/resources/tests/url_escaping/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/url_escaping/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/url_escaping2/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/url_escaping2/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/writable_hash/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/writable_hash/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/writable_sequence/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/writable_sequence/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/xinclude/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/xinclude/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/xinclude/src/data/part1.xml delete mode 100644 fmpp/src/test/resources/tests/xinclude/src/data/part2.xml delete mode 100644 fmpp/src/test/resources/tests/xinclude/src/data/test.xml delete mode 100644 fmpp/src/test/resources/tests/xinclude/src/index.html delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog2 delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/test.txt delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/test2.txt delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-lat1.ent delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-special.ent delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-symbol.ent delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml1-transitional.dtd delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/src/data/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/src/data/test.xhtml delete mode 100644 fmpp/src/test/resources/tests/xml_catalogs/src/test.txt delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/config.fmpp delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/dtds/catalog.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/dtds/test.dtd delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/dtds/test2.dtd delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/inherited.fmpp delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/a.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/b.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/c.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/copy.txt delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/d.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/e.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/f.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/g.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/h.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/ldb.xml delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/ignoredir.fmpp delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/ldb.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test1.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test2.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test3.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test4.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test5.ftl delete mode 100644 fmpp/src/test/resources/tests/xml_rendering/src/renderer/test6.ftl diff --git a/fmpp/BUILD.txt b/fmpp/BUILD.txt deleted file mode 100644 index 2d88c6d..0000000 --- a/fmpp/BUILD.txt +++ /dev/null @@ -1,90 +0,0 @@ -To build FMPP, you will need JDK (Java Development Kit) and Apache Ant to -be installed. - - -Building the binary -------------------- - -For reproducible builds, it's recommended to copy build.properties.sample into -build.properties and edit it. - -To build lib/fmpp.jar: `ant` -To run test suite: `ant test` -To remove earlier build output: `ant clean` - - -Building the documentation --------------------------- - -Preparation (needed only once): -1. Ensure that the "For documentation building" section in build.properties - is filled properly. -2. Go to http://nodejs.org/ and install node.js (tried with v0.10.32) -3. Go to the FMPP project directory and issue `npm install` - Possible problems an solutions: - - "Error: ENOENT, stat ": create that directory manually, - then retry. - - If the system doesn't find `npm`: Open a new terminal (command window) so - that it pick up the "path" environment variable changes. Adjust it if necessary. - -To build the docs: `ant docs` -The output will be be in `build/docs`! - -To re-build the FMPP generated part only: `fmpp -C docs.fmpp` -To re-build the Gulp generated part only: `ant docs.gulp` - - -Making a release ----------------- - -1. Release to sourcefoge.net: - -* Ensure that the version numbers in src/main/java/fmpp/version.properties are - up to date. - -* Ensure that all properties in build.properties are set correctly. - (Copy build.properties.sample if you don't have build.properties yet.) - -* Ensure that the proper version of the dependencies are in the lib - directory. - -* `ant clean test` must pass successfully. - -* An extracted FreeMarker release of the proper version must be - at the location deduced from the build.properties (see - freemarkerDocs.path in build.xml), as that's where we will - copy the FreeMarker documentation from. - -* Ensure that you haven't polluted the FMPP directories with some - temporary files (your ad-hoc tests, backups, etc.). Note that typical - noise like *.bak, *.~*, SVN files, etc. should be filtered out - automatically by Ant. - -* Run "ant clean dist" - -* Release the generated tar.gz and zip on sourceforge.net. - Check their content before that, of course. - -2. Release to to the Maven Central Repository - -* Run `ant maven-dist`. - - Note that unlike sourceforge.net releases, Maven Central Repository - releases can't ever be redone, so double check everything. - -3. Update the Web site: - -* The site generation will use the FMPP version number and also - build/dist/fmpp_x.x.x.tar.gz and zip, so be sure that these are - there correct. If have just built the release with `ant dist`, then it - shouldn't be a problem. - - Note: The download link will use the download system of sourceforge.net. - That is, you do not upload the tar.gz and zip to the WWW site, but do an - FMPP release on SourceForge with the correct version number. - -* Run `ant site` - -* Upload the generated site. - -4. Make the announcements where appropriate diff --git a/fmpp/LICENSE.txt b/fmpp/LICENSE.txt index 355b06d..2b01ebc 100644 --- a/fmpp/LICENSE.txt +++ b/fmpp/LICENSE.txt @@ -45,9 +45,10 @@ inside the distribution archive. "lib/imageinfo.jar" is a binary distribution of ImageInfo, a software developed by Marco Schmidt, who has contributed it to the Public Domain. - "lib/freemarker.jar" is a binary distribution of FreeMarker. - FreeMarker is under Apache License 2.0 (since FreeMarker 2.3.21). - Read LICENSE_FREEMARKER.txt for more information. + "lib/freemarker.jar" is a binary distribution of Apache FreeMarker. + Apache FreeMarker is under Apache License 2.0, and is owned by the + Apache Software Foundation. Read LICENSE_FREEMARKER.txt for more + information. "lib/test/junit.jar" is a binary distribution of JUnit 3.8. JUnit 3.8 is under Common Public License Version 1.0. @@ -64,6 +65,41 @@ inside the distribution archive. http://scripts.sil.org/OFL. Note that the fonts are only used as part of the FMPP documentation and the FMPP Web site, thus aren't needed for the operation of the FMPP application. + + In FMPP distribution, the content of the "docs/freemarker" directory is + copied from the Apache FreeMarker binary distribution, for convenience only. + As such, it's under the same license as Apache FreeMarker itself + (LICENSE_FREEMARKER.txt), except, as it's described in the Apache + FreeMarker binary distribution LICENSE.txt, it contains some files with + different licensing: + + The documentation includes a selection of icons from various icon sets + (fonts), stored together inside these files, which were generated with + https://icomoon.io/app/: + + docs/freemarker/docgen-resources/fonts/icomoon.eot + docs/freemarker/docgen-resources/fonts/icomoon.svg + docs/freemarker/docgen-resources/fonts/icomoon.ttf + docs/freemarker/docgen-resources/fonts/icomoon.woff + + The name, license, and attribution of each icon sets (fonts) used follows: + + - The documentation includes icons from Entypo pictograms, version 2.0, + by Daniel Bruce (http://www.entypo.com/, http://www.danielbruce.se/), + licensed under Creative Commons Attribution-ShareAlike 3.0 (CC BY-SA 3.0) + (http://creativecommons.org/licenses/by-sa/3.0/legalcode) and under SIL + Open Font License 1.1 (http://scripts.sil.org/OFL). + + - The documentation includes icons from Font Awesome by Dave Gandy + (http://fontawesome.io), licensed under SIL Open Font License 1.1 + (http://scripts.sil.org/OFL). + + - The documentation includes icons from Material Design icons by Google + (http://google.github.io/material-design-icons/), licensed under + Creative Common Attribution 4.0 International License (CC-BY 4.0) + (https://creativecommons.org/licenses/by/4.0/). + + End of docs/freemarker/ license information. "lib/fmpp.jar" doesn't contain parts that belong under a different license or to a different copyright owner than the main license and copyright owner of diff --git a/fmpp/LICENSE_FREEMARKER.txt b/fmpp/LICENSE_FREEMARKER.txt index 2ac874b..d645695 100644 --- a/fmpp/LICENSE_FREEMARKER.txt +++ b/fmpp/LICENSE_FREEMARKER.txt @@ -1,49 +1,202 @@ -Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -============================================================================== -END LICENSE - - -FreeMarker subcomponents with different copyright owners --------------------------------------------------------- - -FreeMarker, both in its source code and binary form (freemarker.jar) -includes a number of files that are licensed by the Apache Software -Foundation under the Apache License, Version 2.0. This is the same -license as the license of FreeMaker, but the copyright owner is the -Apache Software Foundation. These files are: - - freemarker/ext/jsp/web-app_2_2.dtd - freemarker/ext/jsp/web-app_2_3.dtd - freemarker/ext/jsp/web-app_2_4.xsd - freemarker/ext/jsp/web-app_2_5.xsd - freemarker/ext/jsp/web-jsptaglibrary_1_1.dtd - freemarker/ext/jsp/web-jsptaglibrary_1_2.dtd - freemarker/ext/jsp/web-jsptaglibrary_2_0.xsd - freemarker/ext/jsp/web-jsptaglibrary_2_1.xsd - - -Historical notes ----------------- - -FreeMarker 1.x was released under the LGPL license. Later, by -community consensus, we have switched over to a BSD-style license. As -of FreeMarker 2.2pre1, the original author, Benjamin Geer, has -relinquished the copyright in behalf of Visigoth Software Society. - -With FreeMarker 2.3.21 the license has changed to Apache License, -Version 2.0, and the owner has changed from Visigoth Software Society -to three of the FreeMarker 2.X developers, Attila Szegedi, Daniel -Dekany, and Jonathan Revusky. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fmpp/LICENSE_HAMCREST.txt b/fmpp/LICENSE_HAMCREST.txt new file mode 100644 index 0000000..0bf6264 --- /dev/null +++ b/fmpp/LICENSE_HAMCREST.txt @@ -0,0 +1,27 @@ +BSD License + +Copyright (c) 2000-2015 www.hamcrest.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +Neither the name of Hamcrest nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. \ No newline at end of file diff --git a/fmpp/README.txt b/fmpp/README.txt index 1244b19..997d804 100644 --- a/fmpp/README.txt +++ b/fmpp/README.txt @@ -1,10 +1,10 @@ FMPP - FreeMarker-based file PreProcessor ========================================= -This is the README file that comes with the FMPP 0.9.15 distribution. +This is the README file that comes with the FMPP @VERSION@ distribution. For the latest version, visit the FMPP website: -http://fmpp.freemarker.net/ +http://fmpp.sourceforge.net/ What is FMPP? diff --git a/fmpp/TODO.txt b/fmpp/TODO.txt deleted file mode 100644 index 0d3c957..0000000 --- a/fmpp/TODO.txt +++ /dev/null @@ -1,165 +0,0 @@ -Before next release -------------------- - -. Re-run test on Java 1.4 -. Run FMPP manually on some projects -. Test Maven artifact - - -Roadmap -------- - -- Use mountable vfs-es, at least for sources. This would deprecate - freemarerLinks, and would work not only for #include but for pp too. - - Add zip (jar) vfs. - -- UN*X FS awareness - - `copyPermissions` setting (copies mod+owner+group) - - Symlink handling (follow symlinks without confusing source paths, copy symlinks) - -- Stream filtering mode - -- Filters - - On output (for Markdown, Haml, Jade to HTML conversation, LESS, minification, etc.) - - On input: for template transformations (will need FM improvements) - -- Persistent output file dependency tracking (including #include/#import - dependencies, also "data" dependency as far as possible). Why: - - Dependency-aware incremental updates - - Smart/safe output directory cleaning (only deletes files created by FMPP) - - -Sideband --------- - -These are the things that aren't on the road map and usually can be fixed in any order. - -Tooling (most efficient places for contributions!): -- Check existing Maven task, contribute/fork if necessary -- Check Gardle support -- Improve JEdit FreeMarker support and JBoss FreeMarker IDE (Eclipse) support - (This actually belongs to the FreeMarker project.) - -High: -- emptyOutputRootAfterCheckingIfExists= // "." for no check -- Allow UN*X tools to be invoked as FreeMarke transforms -- More convenient way of putting OS environment variables into the data-model -- Excel and Calc data loader -- sql(...) data-loader. See below in the Drafts section... -- Add logging via SLF4J as a possible ProgressListener. -- TDD inheritance deep-merging: - - Idea for the solution: "merging hash" type should be introduced. In TDD - a merging hash should be constructed with ~ prefix (~exp) when exp is a hash. - When a value has to be replaced with a merging hash during hash merging, - the merging hash should copy the items of the replaced value into itself that - were not present in the merging hash. During this copying, item values that - are to be replaced with a merging hash value should be merged too. - - Where are the places where this should be handled: - - Merging of setting layers: - data: { someConfig: ~{ a: 1 } } <-inherit- data: { someConfig: { a: 2, b: 3 }} - => - data: { someConfig: ~{ a: 1, b :3 } } - - Local data layers with each-other - - Local data merging with session level data. - - TDD hash additions: - { { a: {x: 1} }, { a: ~{ y: 2 } } } - => - { { a: { x: 1, y: 2 } } } - - `~seq` creates a merging sequence. - ~[1, 2] <-inherit- [3, 4] - => - ~[1, 2, 3, 4] - - `!~` operator creates a non-merging sequence or hash - Now "freemarkerLinks" could use merging sequence by default, - but user could use `!~` to prevent merging. -- Inheriting multiple configuration files - -Medium: -- Add FreeMarker feature for position mapping -- Console charset detection on Windows (extract from `mode con` output) -- Ant task: The "logger" setting is missing (it should be like objectWrapper). - -Low: -- Native Windows exe instead of fmpp.bat+lcp.bat -- GUI front-end -- Add add(...) data-loader for string and sequence concatenation, and arithmetical addition. -- Add bsh(...) data loader: Evaluates a BSH file. - -Lowest: -- DB schema data source -- W3C XML Schema and Relax NG validation, pre-loaded schema validation -- Add xmlDir data-loader (loads all XML files in a directory) - -- Improve pp directive error messages so that they write out if the parameter was null - (instead of complaining that it was missing or not of the proper type) -- Add new processing mode that processes the file with an user written class. -- @pp.warning and @pp.debug should print the location too (file name, line). - However, maybe they should be core FM directives. -- pp.compressHtml - - -==================================================================================== -DRAFTS -==================================================================================== - -The SQL data loader (JDBC data loader) --------------------------------------- - -Maybe the best would be to introduce a new setting, "sqlDataSources": - - sqlDataSources: { - default: {driver: com.exampe.jdbc.Driver, url: jdbc://someurl, user: joe, password: secret} - foo: {driver: com.exampe.jdbc.Driver, url: jdbc://someurl2, user: fred, password: blah} - } - -Then, the sql data loader would look as: - - sql(sqlSentence, substitutions...) - -It should use the "default" data source, unless the SQL sentence starts -with dataLoaderName+':', for example 'foo: select * from foo' - -As pp.loadData('sql', 'select * from foo') is too verbose, a shorthand -form could be introduced: pp.sql('select * from foo') - -The return value should be a list-of-maps for SELECT-s. This list-of-map -should be a copy of the ResultSet content, so the ResultSet can be -released immediately. Thus, FMPP user doesn't have to deal with fetching -and releasing ResultSet-s. Also, it's crucial in the "data" setting, since -there is no way to do explicit fetching/releasing there. - -The map in the list-of-maps should also function as a list-of-lists, -where the 2nd index is the index of the column. - -If the result set contains only a single cell, then the list-of-maps -should also serve as a scalar, so things like -${pp.loadData('sql', 'select max(price) from products)'} will work. - -If the result set contains only a single row, then it should also -function as a map, that reads the columns of the 1st row. The ?size -buit-in for these vars must return the size of the list. -(Unfortunately, because of the ambiguities, for reading columns by -column index, the result[0][index] form must be used. - -As the SQL data loading is certainly frequently used, a short-cut should be -added to the pp hash: pp.sql(...). - -The result set should function as a map that stores the "headers" key. -As with the CSV reader, it returns the sequence of column names. - -The values of binary data should be wrapped as hash that has a -"storeInto" method. Example: - -<#list pp.sql('select id, title, data from photos') as photo> -

- <#assign fileName = 'img/${photo.id}.jpg'> - <@photo.data.storeInto(fileName) /> - ${title} -
${title} -

- - - -Add these to the TemplateEnvironment: -java.sql.Connection getSqlConnection() -java.sql.Connection getSqlConnection(String dataSourceName) \ No newline at end of file diff --git a/fmpp/bin/fmpp b/fmpp/bin/fmpp index 35cdd33..1cce276 100755 --- a/fmpp/bin/fmpp +++ b/fmpp/bin/fmpp @@ -36,15 +36,8 @@ case "`uname`" in esac if [ -z "$FMPP_HOME" ] ; then - # try to find FMPP - if [ -d /opt/fmpp ] ; then - FMPP_HOME=/opt/fmpp - fi - - if [ -d "${HOME}/opt/fmpp" ] ; then - FMPP_HOME="${HOME}/opt/fmpp" - fi - + # Try to detect FMPP_HOME: + ## resolve links - $0 may be a link to FMPP's home PRG="$0" progname=`basename "$0"` @@ -52,23 +45,34 @@ if [ -z "$FMPP_HOME" ] ; then # need this for relative symlinks cd `dirname "$PRG"` - + while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '.*/.*' > /dev/null; then - PRG="$link" + PRG="$link" else - PRG=`dirname "$PRG"`"/$link" + PRG=`dirname "$PRG"`"/$link" fi done - + FMPP_HOME=`dirname "$PRG"`/.. cd "$saveddir" # make it fully qualified FMPP_HOME=`cd "$FMPP_HOME" && pwd` + + if ! [ -f "$FMPP_HOME/lib/fmpp.jar" ]; then + # Standard fallback directories: + if [ -f "${HOME}/opt/fmpp/lib/fmpp.jar" ] ; then + FMPP_HOME="${HOME}/opt/fmpp" + elif [ -f /opt/fmpp/lib/fmpp.jar ] ; then + FMPP_HOME=/opt/fmpp + elif [ -f /usr/lib/fmpp/lib/fmpp.jar ] ; then + FMPP_HOME=/usr/lib/fmpp + fi + fi fi # For Cygwin, ensure paths are in UNIX format before anything is touched @@ -89,10 +93,13 @@ else FMPP_LIB="${ANT_HOME}/lib" else echo "Can't find lib/fmpp.jar. Please either:" - echo " - set the FMPP_HOME correctly, so that FMPP_HOME/lib/fmpp.jar exists." - echo " The current FMPP_HOME was: ${FMPP_HOME}" - echo " - set the ANT_HOME correctly, and copy jar-s required for" - echo " FMPP into the ANT_HOME/lib directory." + echo "- Ensure that FMPP_HOME is correct, so that \$FMPP_HOME/lib/fmpp.jar exists." + echo " FMPP_HOME is set automatically if you put FMPP to a standard location:" + echo " \"/../\", \"~/opt/fmpp/\", \"/opt/fmpp/\", \"/usr/lib/fmpp/\"." + echo " For other locations set and export the FMPP_HOME environment variable." + echo " The attempted FMPP_HOME was: ${FMPP_HOME}" + echo "- If you are also using FMPP with Apache Ant, set ANT_HOME correctly, and" + echo " copy the jar-s coming with FMPP into the \$ANT_HOME/lib directory." exit 1 fi fi diff --git a/fmpp/build.properties.sample b/fmpp/build.properties.sample deleted file mode 100644 index 580bb31..0000000 --- a/fmpp/build.properties.sample +++ /dev/null @@ -1,29 +0,0 @@ -# Points to the rt.jar of Java 1.4 (if you target that minimum version). -# Can be commented out, but for building releases it definitely should be set. -bootclasspath.path=C:/Program Files (x86)/Java/j2re1.4.0_04/lib/rt.jar - -# Points to the ant.jar of Ant 1.5 (if you target that minimum version). -# Can be commented out, but for building releases it definitely should be set. -ant.jar.path=C:/Program Files (x86)/jars/ant-1.5.jar - -# Must be the same as the version number of lib/freemarker.jar -dependency.freemarker.version=2.3.21 -dependency.bsh.version=2.0b4 -dependency.xmlResolver.version=1.2 -dependency.imageinfo.version=1.9 - -# ---------------------------------------------------------------------------- -# For Maven dist: - -# Points to the Maven 3 executable: -mvnCommand=C:/Program Files (x86)/maven3/bin/mvn.bat - -# ---------------------------------------------------------------------------- -# For documentation building: - -# The directory that contains extracted FreeMarker releases in directories -# named as freemarker-${version} . Only needed for copying the FreeMarker -# documentation into the distribution archive: -freemarkerReleases.path=C:/Users/En/Downloads -# Path to the node.js executable: -nodeJsCommand=C:/Program Files/nodejs/node.exe \ No newline at end of file diff --git a/fmpp/build.xml b/fmpp/build.xml deleted file mode 100644 index 0a8b47d..0000000 --- a/fmpp/build.xml +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The "boot.classpath" property value (${bootclasspath.path}) seems to be an incorrect boot classpath. Please fix it in the <projectDir>/build.properties file, or wherever you set it. - - - - Compling classes using boot classpath ${bootclasspath.path} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - freemarkerReleases.path wasn't set; check build.properties - dependency.freemarker.version wasn't set; check build.properties - FreeMarker documentation wasn't found here: ${freemarkerDocs.path} - - - - - - - - - - - - - - - - - - - - - CSS file not found: ${file} - Fixing JDK 8 CSS in ${file} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dependency.freemarker.version wasn't set; check build.properties - dependency.bsh.version wasn't set; check build.properties - dependency.xmlResolver.version wasn't set; check build.properties - dependency.imageinfo.version wasn't set; check build.properties - - - - 4.0.0 - - - org.sonatype.oss - oss-parent - 9 - - - net.sourceforge.fmpp - fmpp - ${mavenVersion} - - jar - - FMPP - General-purpose text file preprocessor tool that uses FreeMarker templates. - http://fmpp.sourceforge.net - - - Apache License, Version 2.0 - http://fmpp.sourceforge.net/license.html - - - - scm:git:git@github.com:freemarker/fmpp.git - scm:git:git@github.com:freemarker/fmpp.git - git@github.com:freemarker/fmpp.git - - - - - org.freemarker - freemarker - ${dependency.freemarker.version} - - - org.beanshell - bsh - ${dependency.bsh.version} - - - xml-resolver - xml-resolver - ${dependency.xmlResolver.version} - - - org.devlib.schmidt - imageinfo - ${dependency.imageinfo.version} - - - -]]> - - - - - - - - - - - - - - - - - - You are about uploading - ${dist.dir}/lib/fmpp.jar - and its attachments to this Maven repository: - ${maven-repository-url} - with Maven artifact version number ${mavenVersion}. - Note that it's assumed that you have run `ant dist` just before this. - Proceed? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ***************************************************************** - Check the above lines for any Maven errors! - Now you have to release the staged repo on - https://oss.sonatype.org/. - ***************************************************************** - - - - - - This will copy the .jar files required for FMPP ${version} from the ${basedir}/lib directory into the ${env.ANT_HOME}/lib directory. Note that if the same java packages are already installed, but with different jar file names as in the FMPP lib directory (like freemarker-2.3.21.jar instead of freemarker.jar), then it's indeterminable if the newly installed or old classes will be visible, so you must delete the old .jar-s manually. Do you want to continue? - - - - Installation aborted by user. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${jarName} already exists in the Ant lib directory. Do you want to overwrite it with the version in the FMPP lib directory? - - - - - - - - - - - - - - - - ************************************************************* - Copying ${jarName} into the Ant lib directory... - ************************************************************* - - - - - ************************************************************* - You have skipped the copying of ${jarName}. - ************************************************************* - - - \ No newline at end of file diff --git a/fmpp/docs.fmpp b/fmpp/docs.fmpp deleted file mode 100644 index c40d765..0000000 --- a/fmpp/docs.fmpp +++ /dev/null @@ -1,125 +0,0 @@ -<#-- -FMPP command-line tool coniguration file, used by the FMPP Ant build -"fmppgdoc" task (FMPP Generated parts of the DOCumentation). - -Note that normally you should use the fmpp Ant task in Ant builds, but this -is an exceptional situation, because of the class loading issues caused by -that we (re)build fmpp.jar, and also because documentation building should -work without installing FMPP for Ant. ---> - -sourceRoot: src/docs -outputRoot: build/docs -logFile: build/docs.fmpp.log - -turns: [turn(2, **/*_T2.*), turn(3, **/*_T3.*)] -removePostfixes: [_T2, _T3] -modes: [ - # Information for FMPP developers: - ignore(**/README-BUILD.txt) - # Saved IcoMoon App selection - not used for anything: - ignore(style/fonts/selection.json) - - # LESS file go through LESS to CSS conversion before FMPP: - ignore(style/*.less) - - copy(style/fonts/**) -] - -borders: [ - border( - '<#include "/include/site.ftl"><#escape x as x?html>', '' - **/*.html - ) -] - -data: { - basedir: eval('System.getProperties().getProperty("fmpp.home")') - license: text(../../LICENSE.txt) - html: htmlUtils() - stdSettings: eval(' - Map res = new HashMap(); - Iterator it = fmpp.setting.Settings.getStandardSettingNames(); - while (it.hasNext()) { - res.put(it.next(), ""); - } - return res; - ') - online: false - - # Files described with hashes are auto-generated Table of Contents pages. - # Other entries are already existing HTML pages, that must use <@page> directive. - manualFiles: - [{title:"FMPP Manual", file:manual.html, - preToc: '

Updated for FMPP ${pp.version} - (requires FreeMarker - ${pp.freemarkerVersion} or later compatible) -

Note: The FMPP Manual only covers the framework that FMPP builds around FreeMarker. - FreeMarker is a template engine that is independent of FMPP. - For using FMPP you need to <@fma>know the FreeMarker template language.

' - postToc: '<@reportBugs />' - keywords: 'manual, help, guide, tutorial, documentation'} - installing.html - [{title:Basics, file:basics.html} - qtour.html - overview.html - ] - [{title:"Core Details", file:details.html} - settings.html - configfile.html - pphash.html - dataloader.html - ] - [{title:Front-ends, file:frontends.html} - commandline.html - ant.html - writefrontend.html - ] - [{title:"Languages (formats) used", file:languages.html} - tdd.html - pathpattern.html - ftl.html - bsh.html - properties.html - ] - [{title:Miscellaneous, file:miscellaneous.html} - versions.html - reportbug.html - tips.html - license.html - ] - ] - - # Flat list of manual files in ToC order. - flattenedManualFiles: eval(r' - flatten(List src, List dst) { - ln = src.size(); - for (int i = 0; i < ln; i++) { - o = src.get(i); - if (o instanceof List) { - flatten(o, dst); - } else { - if (o instanceof Map) { - o2 = o.get("file"); - if (o2 == null) { - throw new Exception("Key \"file\" is missing from hash " + o); - } - o = o2; - } - dst.add(o); - } - } - } - - ffs = new ArrayList(); - flatten(mfs, ffs); - return ffs; - ', - {mfs:get(manualFiles)} - ) -} - -freemarkerIncompatibleImprovements: 2.3.21 -skipUnchanged: static -timeZone: GMT -quiet diff --git a/fmpp/docs/LICENSE_ANT.txt b/fmpp/docs/LICENSE_ANT.txt deleted file mode 100644 index b279c7a..0000000 --- a/fmpp/docs/LICENSE_ANT.txt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 2000-2002 The Apache Software Foundation. All - * rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Ant" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see . - * - */ diff --git a/fmpp/docs/LICENSE_FREEMARKER.txt b/fmpp/docs/LICENSE_FREEMARKER.txt deleted file mode 100644 index 2ac874b..0000000 --- a/fmpp/docs/LICENSE_FREEMARKER.txt +++ /dev/null @@ -1,49 +0,0 @@ -Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -============================================================================== -END LICENSE - - -FreeMarker subcomponents with different copyright owners --------------------------------------------------------- - -FreeMarker, both in its source code and binary form (freemarker.jar) -includes a number of files that are licensed by the Apache Software -Foundation under the Apache License, Version 2.0. This is the same -license as the license of FreeMaker, but the copyright owner is the -Apache Software Foundation. These files are: - - freemarker/ext/jsp/web-app_2_2.dtd - freemarker/ext/jsp/web-app_2_3.dtd - freemarker/ext/jsp/web-app_2_4.xsd - freemarker/ext/jsp/web-app_2_5.xsd - freemarker/ext/jsp/web-jsptaglibrary_1_1.dtd - freemarker/ext/jsp/web-jsptaglibrary_1_2.dtd - freemarker/ext/jsp/web-jsptaglibrary_2_0.xsd - freemarker/ext/jsp/web-jsptaglibrary_2_1.xsd - - -Historical notes ----------------- - -FreeMarker 1.x was released under the LGPL license. Later, by -community consensus, we have switched over to a BSD-style license. As -of FreeMarker 2.2pre1, the original author, Benjamin Geer, has -relinquished the copyright in behalf of Visigoth Software Society. - -With FreeMarker 2.3.21 the license has changed to Apache License, -Version 2.0, and the owner has changed from Visigoth Software Society -to three of the FreeMarker 2.X developers, Attila Szegedi, Daniel -Dekany, and Jonathan Revusky. diff --git a/fmpp/docs/LICENSE_RESOLVER.txt b/fmpp/docs/LICENSE_RESOLVER.txt deleted file mode 100644 index b916c3e..0000000 --- a/fmpp/docs/LICENSE_RESOLVER.txt +++ /dev/null @@ -1,14 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/fmpp/docs/ant.html b/fmpp/docs/ant.html deleted file mode 100644 index ac29e1c..0000000 --- a/fmpp/docs/ant.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - -The Ant Task - FMPP - - - - - - - - - - - - - - - -
-

The Ant Task

- -
-
-

Page contents

- -
-
-
- - -

Description

- -

If you need the FMPP Ant task in a project xml (build.xml), use the taskdef core task:

- -
<taskdef name="fmpp" classname="fmpp.tools.AntTask" />
- -

Then you can use the <fmpp ...> task further down. You may remember the 4th step of Quick Tour. This is an Ant equivalent:

- -
<project name="FMPP test" default="build">
-    <taskdef name="fmpp" classname="fmpp.tools.AntTask" />
-    
-    <target name="build">
-        <fmpp
-              sourceRoot="src" outputRoot="out"
-              data="tdd(data/style.tdd), birds:csv(data/birds.csv)"
-        />
-    </target>
-</project>
-

Almost all parameters of the Ant task correspond to the FMPP settings. If the setting value is of scalar type (as string, boolean, number) then just enter the value simply with Ant-ish syntax, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then use TDD syntax for it. For hash settings the value is hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted, as with data above.

- -

The configuration base for the setting values given with Ant parameters is the Ant project base directory. That is, if you enter sourceRoot="src", then src is interpreted relatively to the project base directory.

- -

There is no parameter that directly corresponds to the sources setting. The sources are chosen with nested <fileset>-style parameters and nested elements (as include and exclude). However, if you use the outputFile setting, you can't use <fileset>-style stuff, and sources will be specified with the sourceFile parameter. - -

Alternatively, the data, localData, borders, modes, turns, xmlRenderings and freemarkerLinks settings can be specified with nested elements instead of parameters. For example, this is equivalent with the above example:

- -
<project name="FMPP test" default="build">
-    <taskdef name="fmpp" classname="fmpp.tools.AntTask" />
-    
-    <target name="build">
-        <fmpp sourceRoot="src" outputRoot="out">
-            <data>
-                 tdd(data/style.tdd)
-                 birds: csv(data/birds.csv)
-            </data>
-        </fmpp>
-    </target>
-</project>
-

This can be useful, if the setting value is long. The content of the element can be a CDATA section, which is useful if the setting value contains HTML or XML fragments. Unlike with attributes, Ant property interpolations (${foo}) in the text are not expanded, unless you force that with the expandProperties attribute of the element (<data expandProperties="yes">...).

- -

About the support and interpretation of FMPP settings:

- - -

To access the Ant properties and other Ant specific data in the templates, you can use data loaders such as antProperty(), antProperties(), antProject() and antTask(). Read the chapter about data loaders for more details.

- - - - -

Parameters

- -

The FMPP task accepts the following parameters:

-
    -
  • All FMPP settings except sources, ignoreCvsFiles, ignoreSvnFiles, ignoreTemporaryFiles, echoFormat, printStackTrace, snip and columns. If the setting value is of scalar type (as string, boolean, number) then just enter the value simply with Ant-ish syntax, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then use TDD syntax for it. For hash settings the value is hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted. The configuration base for the setting values is the Ant project base directory.
  • - -
  • To follow the Ant conventions, srcdir and destdir attribute names can be optionally used instead of sourceRoot and outputRoot attribute names. These are just alias names.
  • - -
  • Configuration file handling: -
      -
    • configuration: Loads a configuration file. The setting values given with the parameters has higher precedence.
    • - -
    • configurationBase: Emulates that configurationBase meta setting is present in configuration file with the given value.
    • - -
    • inheritConfiguration: Emulates that inheritConfiguration meta setting is present in configuration file with the given value.
    • -
    -
  • - -
  • Ant <fileset>-style attributes (see the Ant documentation for more details). Used for specifing the value of the sources setting: -
      -
    • dir: The directory that the patterns are relative to. If this attribute is omitted, then the FMPP source root will be used as the base. Note that regardless of the value of this attribute, all source files must be inside the source root. -
    • casesensitive: Sets case sensitivity of the file names. (Same as the FMPP setting) -
    • defaultexcludes: Indicates whether default excludes should be used or not ("yes" or "no"); default excludes are used when omitted. -
    • excludes: comma- or space-separated list of patterns of files that must be excluded; no files (except default excludes) are excluded when omitted. -
    • excludesfile: the name of a file; each line of this file is taken to be an exclude pattern. -
    • followsymlinks: Shall symbolic links be followed? Defaults to true. -
    • includes: Comma- or space-separated list of patterns of files that must be included; all files are included when omitted. Note that be default all files of the source root directory are included. -
    • includesfile: The name of a file; each line of this file is taken to be an include pattern. -
    -
  • - -
  • sourceFile: It can be used only if the outputFile setting is specified. It specifies the value of the sources setting, as a simple string (not a comma separated list) that specifies the path of a single file. <fileset>-style attributes/elements will be ignored.
  • - -
  • antTaskFailOnError: Specifies if the Ant task should fail if there were errors during the execution of the processing session. Defaults to true. It has nothing to do with the stopOnError setting. If this parameter is true, the Ant task will fail if there were any failed file processing during the processing session, even if it was skipped because stopOnError was true (so the session wasn't aborted). If this parameter is false, then the Ant task will be successful regardless of the failed file processings or other errors during the processing session, even if the processing session was aborted. But, it never suppresses errors occurred during the initialization of the FMPP engine (i.e. errors occurred before the processing session could be stated).
  • -
- -

Either the configuration parameter, or sourceRoot+outputRoot parameters, or sourceFile+outputFile parameters are required. All other parameters are optional. When you use configuration, any Ant task parameters can become optional, when the value of the coressponding settings are given in the configuration file.

- -

Attention! When you specify the sources setting in a configuration file, its value will be added to the set of files and directories that the Ant task itself selects, which is, following the Ant tradition, by default all files and directories inside the source root. Thus, usually you will want to exclude all files in the Ant task, so only those specified in the configuration file will remain: -

<fmpp configuration="config-with-sources-setting.fmpp" excludes="**/*" />
- - - -

Nested elements

- -

The FMPP task accepts the following nested elements: -

    -
  • Elements for attribute substitution: Using these elements is the same as if you were use the attributes (parameters) with the same name, and with the same value as the nested text (or CDATA section) of the elements. Ant property values (${foo}) are not expanded by default, but you can override this with a expandProperties="yes" attribute. Note that you etiher give a certain setting with attribute, or with element, but not both. -
      -
    • data -
    • localData -
    • borders -
    • modes -
    • turns -
    • xmlRenderings -
    • freemarkerLinks -
    -
  • <fileset>-style elements (see the Ant documentation for more details): -
      -
    • patternset -
    • include: Note that be default all files inside the source root directory are included. -
    • exclude -
    • includesfile -
    • excludesfile -
    -
- - - - -

Examples

- -

Run processing session with the settings stored in <projectBaseDir>/config.fmpp (or fmpp.cfg):

-
<fmpp configuration="." />
-

As the previous, but override outputEncoding:

-
<fmpp configuration="." outputEncoding="UTF-8" />
-

Processes all files in src/www and stores the output in build/www:

-
<fmpp sourceRoot="src/www" outputRoot="build/www" />
-

Same as the previous, but processes files with extension ftl only:

-
<fmpp
-    sourceRoot="src/www" outputRoot="build/www"
-    includes="**/*.ftl"
-/>
-

Same as the previous:

-
<fmpp sourceRoot="src/www" outputRoot="build/www">
-    <include name="**/*.ftl" />
-</fmpp>
-

Run processing session with the settings stored in <projectBaseDir>/src/wwwconfig.fmpp, but process files with extension ftl only:

-
<fmpp configuration="src/wwwconfig.fmpp" includes="**/*.ftl" />
-

Processes a single file:

-
<fmpp sourceFile="src/test.txt" outputFile="build/test.txt" />
-

Exposes Ant properties foo, bar and baaz for the templates:

-
<fmpp sourceRoot="src/www" outputRoot="build/www"
-        data="antProperties(foo, bar, baaz)"
-/>
-

Just to show something more complex...:

-
<fmpp sourceRoot="src/www" outputRoot="build/www"
-        replaceExtension="ftl, html"
-        modes="copy(**/*.html, **/*.htm)"
->
-    <borders><![CDATA[
-        border('<#escape x as x?html>', '</#escape>', **/*.ftl)
-    ]]></borders>
-    <data>
-        bgColor: white
-        fgColor: black
-        antProps: antProperties()
-    </data>
-</fmpp>
- - -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/api/allclasses-frame.html b/fmpp/docs/api/allclasses-frame.html deleted file mode 100644 index ebf655a..0000000 --- a/fmpp/docs/api/allclasses-frame.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - -All Classes (FMPP 0.9.15 API) - - - - - -

All Classes

-
- -
- - diff --git a/fmpp/docs/api/allclasses-noframe.html b/fmpp/docs/api/allclasses-noframe.html deleted file mode 100644 index 90a0e3c..0000000 --- a/fmpp/docs/api/allclasses-noframe.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - -All Classes (FMPP 0.9.15 API) - - - - - -

All Classes

-
- -
- - diff --git a/fmpp/docs/api/constant-values.html b/fmpp/docs/api/constant-values.html deleted file mode 100644 index e512239..0000000 --- a/fmpp/docs/api/constant-values.html +++ /dev/null @@ -1,1184 +0,0 @@ - - - - - - -Constant Field Values (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

fmpp.*

- - - - -

fmpp.dataloaders.*

- - - - -

fmpp.models.*

- - - - -

fmpp.setting.*

- - - - -

fmpp.tdd.*

- - - - -

fmpp.tools.*

- - - - -

fmpp.util.*

- -
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/deprecated-list.html b/fmpp/docs/api/deprecated-list.html deleted file mode 100644 index 20947c7..0000000 --- a/fmpp/docs/api/deprecated-list.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - -Deprecated List (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - - - - -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/fmpp/DataModelBuildingException.html b/fmpp/docs/api/fmpp/DataModelBuildingException.html deleted file mode 100644 index d5d6f98..0000000 --- a/fmpp/docs/api/fmpp/DataModelBuildingException.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -DataModelBuildingException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Class DataModelBuildingException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    -
    public class DataModelBuildingException
    -extends ExceptionCC
    -
    Error while trying to build the data-model for a template. - Usually you meet this exception as the root cause of a - ProcessingException
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataModelBuildingException

        -
        public DataModelBuildingException(Throwable cause)
        -
      • -
      - - - -
        -
      • -

        DataModelBuildingException

        -
        public DataModelBuildingException(String message)
        -
      • -
      - - - -
        -
      • -

        DataModelBuildingException

        -
        public DataModelBuildingException(String message,
        -                                  Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/Engine.html b/fmpp/docs/api/fmpp/Engine.html deleted file mode 100644 index 425f9b9..0000000 --- a/fmpp/docs/api/fmpp/Engine.html +++ /dev/null @@ -1,3063 +0,0 @@ - - - - - - -Engine (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Class Engine

-
-
- -
-
    -
  • -
    -
    -
    public class Engine
    -extends Object
    -
    The bare-bone, low-level preprocessor engine. Since FMPP 0.9.0 you should - rather use a Settings object instead of directly using - this class. - -

    fmpp.Engine vs Settings: - The design of the Engine object API is driven by the internal - architecture of FMPP system. It doesn't consider front-ends, doesn't know - configuration files or similar high-level stuff. Settings - wraps the Engine object, and implements end-user (front-end) centric - concepts, as the settings and configuration files described in the FMPP - Manual. The API of Engine is more natural and convenient - than the API of a Map-like object as a - Settings object. But Settings are far easier - to use if you want FMPP behave as described in the FMPP Manual from the - viewpoint of end-user. In principle, if FMPP is used embedded in a way - that the end-user will never face FMPP (doesn't use the FMPP Manual, - etc.), using the Engine object directly can be a good - solution. But, since the Java programmers get know FMPP through the - higher-level concepts (they try it with the command-line tool, etc.), I - say, just use Settings always. The resource usage overhead - is negligible, and all capabilities of the Engine will be - available, plus some extra features (as configuration files). So basically, - the introduction of Settings has degraded Engine to - an internally used object. - -

    Engine parameters: - Engine parameters are very similar to "settings" discussed in the - FMPP Manual. You will usually find trivial one-to-one correspondence between - settings and engine parameters, but not always. Settings use the - front-end/end-user's viewpoint, and are mostly built on the top of engine - parameters, while engine parameters use FMPP system implementation driven - approach. -
    The value of engine parameters can't be set while a processing session is - executing. An attempt to do so will result in - IllegalStateException. Thus, for example, you can't change - an engine parameter from an executing template. Also, you should not change - the objects stored as "data" (i.e. the variables that are visible for all - templates) while the processing session is executing, even though it's not - prevented technically (because it can't be...). - -

    Life-cycle: The engine object can be used for multiple processing - sessions. However, the typical usage is that it is used - only for a single processing session. The state of the engine object possibly - changes during sessions because of the engine attributes (see - setAttribute(String, Object)), and because plugged long-lived - objects as local data builders and progress listeners can maintain state - through multiple sessions. These objects should behave so that the output - files of a session is not influenced by earlier sessions.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        PMODE_NONE

        -
        public static final int PMODE_NONE
        -
        Processing mode: N/A
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PMODE_EXECUTE

        -
        public static final int PMODE_EXECUTE
        -
        Processing mode: Execute the file as template
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PMODE_COPY

        -
        public static final int PMODE_COPY
        -
        Processing mode: Copy the file as-is (binary copy).
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PMODE_IGNORE

        -
        public static final int PMODE_IGNORE
        -
        Processing mode: Ignore the file.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PMODE_RENDER_XML

        -
        public static final int PMODE_RENDER_XML
        -
        Processing mode: Render XML with an FTL template.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        SKIP_NONE

        -
        public static final int SKIP_NONE
        -
        Used with the "skipUnchnaged" engine parameter: never skip files
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        SKIP_STATIC

        -
        public static final int SKIP_STATIC
        -
        Used with the "skipUnchanged" engine parameter: skip unchanged static - files
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        SKIP_ALL

        -
        public static final int SKIP_ALL
        -
        Used with the "skipUnchanged" engine parameter: skip all unchanged - files
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PARAMETER_VALUE_SOURCE

        -
        public static final String PARAMETER_VALUE_SOURCE
        -
        A commonly used reserved parameter value: "source".
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PARAMETER_VALUE_OUTPUT

        -
        public static final String PARAMETER_VALUE_OUTPUT
        -
        A commonly used reserved parameter value: "source".
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        PARAMETER_VALUE_HOST

        -
        public static final String PARAMETER_VALUE_HOST
        -
        A commonly used reserved parameter value: "host".
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        XPATH_ENGINE_DONT_SET

        -
        public static final String XPATH_ENGINE_DONT_SET
        -
        Used as the value of the "xmlEngine" engine parameter: keep the current - JVM level setting.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        XPATH_ENGINE_DEFAULT

        -
        public static final String XPATH_ENGINE_DEFAULT
        -
        Used as the value of the "xmlEngine" engine parameter: Let FreeMarker - choose.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        XPATH_ENGINE_XALAN

        -
        public static final String XPATH_ENGINE_XALAN
        -
        Used as the value of the "xmlEngine" engine parameter: Force the usage - of Xalan.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        XPATH_ENGINE_JAXEN

        -
        public static final String XPATH_ENGINE_JAXEN
        -
        Used as the value of the "xmlEngine" engine parameter: Force the usage - of Jaxen.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - - - - - - - - - -
        -
      • -

        Engine

        -
        public Engine(BeansWrapper beansWrapper,
        -              Version fmIncompImprovements)
        -
        Creates a new FMPP engine instance. - Use the setter methods (as setProgressListener) to configure - the new instance.
        -
        -
        Parameters:
        -
        beansWrapper - the FreeMarker beans-wrapper that this instance - will use. Just use null if you don't know what's this. - If you do know what's this, note that FMPP by default (when this - parameter is null) uses a BeansWrapper with - simpleMapWrapper set to true.
        -
        fmIncompImprovements - Sets the "incompatible improvements" version of FreeMarker. You should set this to - the current FreeMarker version in new projects. See Configuration.Configuration(Version) for details. - If it's at least 2.3.21 and beansWrapper is null, the default will be created using - BeansWrapperBuilder instead of new BeansWrapper(), which means that that the resulting - BeansWrapper will be a shared singleton with read-only settings.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        process

        -
        public void process(File[] sources)
        -             throws ProcessingException
        -
        Processes a list of files. - -

        The source root and output root directory must be set (non-null) prior - to calling this method.

        -
        -
        Parameters:
        -
        sources - The list of files to process. All file must be inside - the source root. The files will be processed in the order as they - appear in the list, except that if you use multiple turns, they - are re-sorted based on the associated turns (the original order - of files is kept inside turns).
        -
        Throws:
        -
        ProcessingException - if Engine.process has - thrown any exception. The message of this exception holds nothing - interesting (just a static text). Call its getCause() - method to get the exception that caused the termination. Note that - all (so even non-checked exceptions) thrown be the engine are - catched and wrapped by this exeption.
        -
        See Also:
        -
        process(File, File)
        -
        -
      • -
      - - - -
        -
      • -

        process

        -
        public void process(File src,
        -                    File out)
        -             throws ProcessingException
        -
        Hack to processes a single file. - -

        If the source root and/or output root directory is not set, they - will be set for the time of this method call to the parent diretories of - the source and output files respectively.

        -
        -
        Parameters:
        -
        src - the source file (not directory). Can't be null.
        -
        out - the output file (not directory). Can't be null.
        -
        Throws:
        -
        ProcessingException - if Engine.process has - thrown any exception. The message of this exception holds nothing - interesting (just a static text). Call its getCause() - method to get the exception that caused the termination. Note that - all (so even non-checked exceptions) thrown be the engine are - catched and wrapped by this exception.
        -
        See Also:
        -
        process(File[])
        -
        -
      • -
      - - - -
        -
      • -

        getStopOnError

        -
        public boolean getStopOnError()
        -
      • -
      - - - -
        -
      • -

        setStopOnError

        -
        public void setStopOnError(boolean stopOnError)
        -
      • -
      - - - -
        -
      • -

        getOutputRoot

        -
        public File getOutputRoot()
        -
        Returns the output root directory. - This can be null. However, it is never null while a processing session is - running, since the output root must be specified for successfully start a - processing session. - -

        The returned File is always a canonical - File.

        -
      • -
      - - - -
        -
      • -

        setOutputRoot

        -
        public void setOutputRoot(File outputRoot)
        -                   throws IOException
        -
        Sets the root directory of output files. - If it is null, the output directory will be used if the output is a - directory, otherwise the parent directory of the output file. - Initially this engine parameter is null.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getSourceRoot

        -
        public File getSourceRoot()
        -
        Returns the source root directory. - This can be null. However, it is never null while a processing session is - runing, since the source root must be specified for successfully start a - processing session. - -

        The returned File is always a canonical - File.

        -
      • -
      - - - -
        -
      • -

        setSourceRoot

        -
        public void setSourceRoot(File srcRoot)
        -                   throws IOException
        -
        Sets the root directory of source files. - If it is null, the source directory will be used if the source is a - directory, otherwise the parent directory of the source file.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getDataRoot

        -
        public File getDataRoot()
        -
        Returns the directory used as data root directory. - This will be the source root, if the data directory was not set (null). - Note that the data-root can be null, when the source root is also null. - However, it is never null while a processing session is runing, since - the source root must be specified for successfully start a processing - session. - -

        The returned File is always a canonical - File.

        -
      • -
      - - - -
        -
      • -

        setDataRoot

        -
        public void setDataRoot(File dataRoot)
        -                 throws IOException
        -
        Sets the root directory of data files. - If it is "source" or null, then the source - directory will be used.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        addFreemarkerLink

        -
        public void addFreemarkerLink(String name,
        -                              File fileOrDir)
        -                       throws IOException
        -
        Adds a FreeMarker link. FreeMarker links are fake files/directories - visible in the source root directory. They are visible for the predefined - FreeMarker directives only (thus, not for pp variables). - A FreeMarker link acts as an alias or hard-link to another file or - directory. This is a hack that allows you to - <#include ...> or <#import ...> files - that are outside the source root directory. - -

        The link is visible as a file or directory in the source root - directory with name @name. For example, if the link name - is "inc", then it can be used as - <#include '/@inc/blah.ftl'> (assuming the link points - to a directory that contains file blah.ftl). - -

        In the generic case, a FreeMarker link is associated with a list of - files/directories, not just with a single file/directory. For example, - if inc is associated with /home/joe/inc1 and - /home/joe/inc2 (in this order), then - <#include '/@inc/blah.ftl'> will try to read - /home/joe/inc1/blah.ftl, and if that file is missing, - then /home/joe/inc2/blah.ftl. You can associate the name with - multiple files/directories by calling this method with the same name for - multiple times. The earlier you have added a file/directory, the higher - its priority is.

        -
        -
        Parameters:
        -
        name - the name of fake entry in the source root directory, minus - the @ prefix. To prevent confusion, the name can't start - with @.
        -
        fileOrDir - the file or directory the link will point to. It can be - a outside the source root directory.
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getFreemarkerLink

        -
        public List getFreemarkerLink(String name)
        -
        Returns the list of files associated with a FreeMarker link name.
        -
        -
        Parameters:
        -
        name - the name of the link (do not use the @ preifx)
        -
        Returns:
        -
        the list of canonical files associated with this link, or - null, if no FreeMarker link with the given name exist.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        addProgressListener

        -
        public void addProgressListener(ProgressListener listener)
        -
        Adds a progress listener to the list of progress listeners. - All progress listeners of the list will be invoked on the events of the - engine. - -

        If you want a local data loader or engine attribute to listen engine - events, do not add it with this method. It will be automatically - notified about events, they need not be added here. - -

        Note that if you try to add the same object for multiple times, the - object will added only in the first occasion.

        -
      • -
      - - - -
        -
      • -

        clearProgressListeners

        -
        public void clearProgressListeners()
        -
        Removes all progress listeners from the list of progress listeners that - were added with addProgressListener(fmpp.ProgressListener). It does not affect - other listening objects, as local data loaders or engine attributes.
        -
      • -
      - - - -
        -
      • -

        setTemplateDataModelBuilder

        -
        public void setTemplateDataModelBuilder(TemplateDataModelBuilder tdmBuilder)
        -
        Sets the class that will be instantiated to create the template specfic - variables.
        -
        -
        See Also:
        -
        TemplateDataModelBuilder
        -
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        setSourceEncoding

        -
        public void setSourceEncoding(String encoding)
        -
        Sets the encoding (charset) of textual source files. - Note that according to FreeMarker rules, this can be overridden in a - template with &lt;#ftl encoding="...">. - -

        Initially the encoding is ISO-8859-1.

        -
        -
        Parameters:
        -
        encoding - The encoding, or "host" if the default - encoding (file.encoding system property) of the host - machine should be used. null is the same as - "host".
        -
        -
      • -
      - - - -
        -
      • -

        getSourceEncoding

        -
        public String getSourceEncoding()
        -
        Returns the source encoding used for the template files. - This is not null or "host"; this is always - a concrete encoding, such as "UTF-8".
        -
      • -
      - - - -
        -
      • -

        setLocale

        -
        public void setLocale(Locale locale)
        -
        Sets the locale (country, language). - -

        Initially the locale is en_US.

        -
        -
        Parameters:
        -
        locale - The locale, or null if the default locale of the host - machine should be used.
        -
        -
      • -
      - - - -
        -
      • -

        setLocale

        -
        public void setLocale(String locale)
        -
        Sets the locale (country, language). - -

        Initially the locale is en_US.

        -
        -
        Parameters:
        -
        locale - The locale, or "host" if the default locale of the host - machine should be used. Null is the same as "host".
        -
        -
      • -
      - - - -
        -
      • -

        getLocale

        -
        public Locale getLocale()
        -
        Returns the actual (non-null) locale in use.
        -
      • -
      - - - -
        -
      • -

        setOldTemplateSyntax

        -
        public void setOldTemplateSyntax(boolean oldSyntax)
        -
        Sets if the # is required in FTL tags or not. - In the old template syntax # was not required. - The default and recommended value for this engine parameter is - false.
        -
      • -
      - - - - - - - - - - - - - - - -
        -
      • -

        setOutputEncoding

        -
        public void setOutputEncoding(String outputEncoding)
        -
        Sets the encoding used for textural output (template generated files). - By default it is "source".
        -
        -
        Parameters:
        -
        outputEncoding - The name of encoding. If it is - "source", then the encoding of the source (template - file) will be used for the output. null is the same as - "source". If it is "host" then the - default encoding of the host machine will be used.
        -
        -
      • -
      - - - -
        -
      • -

        getOutputEncoding

        -
        public String getOutputEncoding()
        -
        Retruns the output encoding used; It can be "source" - (since that can't be resolved to a concrete charset), but never - null or "host".
        -
      • -
      - - - -
        -
      • -

        setUrlEscapingCharset

        -
        public void setUrlEscapingCharset(String urlEscapingCharset)
        -
        Sets the charset used for URL escaping. By default it is - "output".
        -
        -
        Parameters:
        -
        urlEscapingCharset - The name of charset (encoding) that is used - for URL escaping. If it is "output", then the encoding - of the output will be used. null is the same as - "output". If it is "host" then the - default encoding of the host machine will be used.
        -
        -
      • -
      - - - -
        -
      • -

        getUrlEscapingCharset

        -
        public String getUrlEscapingCharset()
        -
        Retruns the output encoding used; It can be "output" - (since that can't be resolved to a concrete charset), but never - null.
        -
      • -
      - - - -
        -
      • -

        setNumberFormat

        -
        public void setNumberFormat(String format)
        -
        Sets the number format used to convert numbers to strings, as defined - by Configurable.setNumberFormat(String). - At least on FreeMarker 2.3.21, this is a pattern as DecimalFormat defines it, - or the reserved values "number" or "currency".
        -
      • -
      - - - -
        -
      • -

        setBooleanFormat

        -
        public void setBooleanFormat(String format)
        -
        Sets the boolean format used to convert boolean to strings, as defined - by Configurable.setBooleanFormat(String). Note that it can't be "true,false"; for that you have - to print the boolean value with ${foo?c}.
        -
      • -
      - - - - - - - -
        -
      • -

        setDateFormat

        -
        public void setDateFormat(String format)
        -
        Sets the format used to convert date values (year + month + day) to - strings. - See Configurable.setDateFormat(String) in the FreeMarker API - for more information. - -

        The default is the format suggested by the underlying Java platform - implementation for the current locale.

        -
      • -
      - - - - - - - -
        -
      • -

        setTimeFormat

        -
        public void setTimeFormat(String format)
        -
        Sets the format used to convert time values (hour + minute + second - + millisecond) to strings. - See Configurable.setTimeFormat(String) in the FreeMarker API - for more information. - -

        The default is the format suggested by the underlying Java platform - implementation for the current locale.

        -
      • -
      - - - - - - - -
        -
      • -

        setDateTimeFormat

        -
        public void setDateTimeFormat(String format)
        -
        Sets the format used to convert date-time values (year + month + day + - hour + minute + second + millisecond) to strings. - See Configurable.setDateTimeFormat(String) in the FreeMarker API - for more information. - -

        The default is the format suggested by the underlying Java platform - implementation for the current locale.

        -
      • -
      - - - - - - - - - - - -
        -
      • -

        setTimeZone

        -
        public void setTimeZone(String zone)
        -
        Same as setTimeZone(TimeZone), but lets FreeMarker parse the value to time zone. If the value comes - from a string source anyway, it's recommended to use this instead of the other overload.
        -
      • -
      - - - - - - - -
        -
      • -

        setSQLDateAndTimeTimeZone

        -
        public void setSQLDateAndTimeTimeZone(String zone)
        -
        Same as setSQLDateAndTimeTimeZone(TimeZone), but lets FreeMarker parse the value to time zone. If - the value comes from a string source anyway, it's recommended to use this instead of the other overload.
        -
      • -
      - - - - - - - -
        -
      • -

        addModeChooser

        -
        public void addModeChooser(String pattern,
        -                           int pmode)
        -
        Adds a new entry to the end of path-pattern -> processing-mode - mapping list.
        -
        -
        Parameters:
        -
        pattern - a path pattern as "*.txt" or - "/docs/**/item_??.xml". - You have to use slash (/) or backslash (\) or the platform specific - separator to spearate directories.
        -
        pmode - the mode in which you want to process the files. Use the - PMODE_... constants.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        addHeaderChooser

        -
        public void addHeaderChooser(int layer,
        -                             String pattern,
        -                             String footer)
        -
        Adds a new entry to the end of path-pattern -> header mapping list of the - given layer. Layers are indexed from 0. The lower the layer index is, - the earlier the header occurs in the text.
        -
      • -
      - - - - - - - -
        -
      • -

        addFooterChooser

        -
        public void addFooterChooser(int layer,
        -                             String pattern,
        -                             String footer)
        -
        Adds a new entry to the end of path-pattern -> footer mapping list of the - given layer. Layers are indexed from 0. The lower the layer index is, - the later the footer occurs in the text.
        -
      • -
      - - - -
        -
      • -

        addTurnChooser

        -
        public void addTurnChooser(String pattern,
        -                           int turn)
        -
        Adds a new entry to the end of path-pattern -> turn-number mapping list.
        -
      • -
      - - - -
        -
      • -

        clearModeChoosers

        -
        public void clearModeChoosers()
        -
        Removes all processing mode choosers. This is the initial state after - the instantiation of Engine (i.e. no processing mode - choosers).
        -
      • -
      - - - -
        -
      • -

        clearHeaderChoosers

        -
        public void clearHeaderChoosers()
        -
        Removes all header choosers.
        -
      • -
      - - - -
        -
      • -

        clearFooterChoosers

        -
        public void clearFooterChoosers()
        -
        Removes all footer choosers.
        -
      • -
      - - - -
        -
      • -

        clearTurnChoosers

        -
        public void clearTurnChoosers()
        -
        Removes all turn choosers.
        -
      • -
      - - - -
        -
      • -

        setCaseSensitive

        -
        public void setCaseSensitive(boolean cs)
        -
        Sets if the engine differentiates upper- and lower-case letters when it - compares paths or matches path patterns with paths. False by default - (ignores case).
        -
      • -
      - - - - - - - -
        -
      • -

        setExpertMode

        -
        public void setExpertMode(boolean expertMode)
        -
        Allows some features that are considerd dangerous. - These are currently: -
          -
        • The source and the output file is the same -
        -
      • -
      - - - - - - - -
        -
      • -

        addRemovePostfix

        -
        public void addRemovePostfix(String postfix)
        -
        Adds a postfix to the list of file name postfixes to remove. - If the source file name before the first dot ends with a string in the - list, then it will be removed from the output file name. For example, - if "_t" is in the list, then the output file for "example_t.html" will - be "example.html". If the file name does not contains dot, then it - still works: "example_t" will become to "example".
        -
        -
        Parameters:
        -
        postfix - the postfix to remove. Can't be null or empty - string, and can't contain dot.
        -
        -
      • -
      - - - -
        -
      • -

        addRemoveExtension

        -
        public void addRemoveExtension(String extension)
        -
        Adds an extension to the list of extensions to remove. - If the source file name ends with an extension in the list, then it will - be removed from the output file name. For example, - if "t" is in the list, then the output file for "example.html.t" will - be "example.html". The extension to remove can contain dots (as tar.gz).
        -
        -
        Parameters:
        -
        extension - the extension to remove without the dot. Can't be - null or empty string, and can't start with dot.
        -
        -
      • -
      - - - -
        -
      • -

        addReplaceExtension

        -
        public void addReplaceExtension(String oldExtension,
        -                                String newExtension)
        -
        Adds an old-exension -> new-extension pair to the list of - extension replacements. - If a source file name ends with the old extension, then it will - be replaced with the new extension in the output file name.
        -
        -
        Parameters:
        -
        oldExtension - the old extension without the preceding dot.
        -
        newExtension - the new extension without the preceding dot.
        -
        -
      • -
      - - - -
        -
      • -

        clearRemovePostfixes

        -
        public void clearRemovePostfixes()
        -
      • -
      - - - -
        -
      • -

        clearRemoveExtensions

        -
        public void clearRemoveExtensions()
        -
      • -
      - - - -
        -
      • -

        clearReplaceExtensions

        -
        public void clearReplaceExtensions()
        -
      • -
      - - - -
        -
      • -

        setDontTraverseDirectories

        -
        public void setDontTraverseDirectories(boolean dontTraverseDirs)
        -
        Sets the Engine should automatically process the files and - directories inside a directory whose processing was asked through the - public Engine API. Defaults to true. It is set to - false by front-ends that explicitly specify the list of - source files and source directories, rather than expecting the - Engine to discover them.
        -
      • -
      - - - -
        -
      • -

        getDontTraverseDirectories

        -
        public boolean getDontTraverseDirectories()
        -
      • -
      - - - -
        -
      • -

        setSkipUnchanged

        -
        public void setSkipUnchanged(int skipWhat)
        -
        Sets what source file can be skipped if it was not modified after the - last modification time of the output file. Also, if the output is not - existing, the source file will be processed. Note that this feature will - not work for templates that rename or drop the original output file - during the template execution. - -

        The initial value of this engine parameter is SKIP_NONE.

        -
        -
        Parameters:
        -
        skipWhat - a SKIP_... contant.
        -
        -
      • -
      - - - -
        -
      • -

        getSkipUnchanged

        -
        public int getSkipUnchanged()
        -
      • -
      - - - -
        -
      • -

        setAlwaysCreateDirectories

        -
        public void setAlwaysCreateDirectories(boolean enable)
        -
        Sets whether for source directories a corresponding output directory - will be created even if no file output went into it. Defaults to - false. - -

        Notes: -

          -
        • Even if this is set to true, if - a directory contains an ignoredir.fmpp file, it will not - create output directory. -
        • If the directory contains a file called createdir.fmpp, - the directory will be created even if this setting is - false. -
        -
      • -
      - - - -
        -
      • -

        getAlwaysCreateDirectories

        -
        public boolean getAlwaysCreateDirectories()
        -
      • -
      - - - -
        -
      • -

        setIgnoreCvsFiles

        -
        public void setIgnoreCvsFiles(boolean ignoreCvsFiles)
        -
        Sets if the CVS files inside the source root directory should be - ignored or not. This engine parameter is initially true. - -

        The CVS files are: **/.cvsignore, - **/CVS/** and **/.#*

        -
      • -
      - - - -
        -
      • -

        getIgnoreCvsFiles

        -
        public boolean getIgnoreCvsFiles()
        -
      • -
      - - - -
        -
      • -

        setIgnoreSvnFiles

        -
        public void setIgnoreSvnFiles(boolean ignoreSvnFiles)
        -
        Sets if the SVN files inside the source root directory should be - ignored or not. This engine parameter is initially true. - -

        The SVN files are: **/SVN/**

        -
      • -
      - - - -
        -
      • -

        getIgnoreSvnFiles

        -
        public boolean getIgnoreSvnFiles()
        -
      • -
      - - - -
        -
      • -

        setIgnoreTemporaryFiles

        -
        public void setIgnoreTemporaryFiles(boolean ignoreTemporaryFiles)
        -
        Set if well-known temporary files inside the source root directory should - be ignored or not. For the list of well-known temporary file patterns, - read the FMPP Manual.
        -
      • -
      - - - -
        -
      • -

        getIgnoreTemporaryFiles

        -
        public boolean getIgnoreTemporaryFiles()
        -
      • -
      - - - -
        -
      • -

        setXpathEngine

        -
        public void setXpathEngine(String xpathEngine)
        -
        Sets if which XPath engine should be used.
        -
        -
        Parameters:
        -
        xpathEngine - one of the XPATH_ENGINE_... constants, - or a class name.
        -
        -
      • -
      - - - -
        -
      • -

        getXpathEngine

        -
        public String getXpathEngine()
        -
      • -
      - - - -
        -
      • -

        setXmlEntityResolver

        -
        public void setXmlEntityResolver(Object xmlEntityResolver)
        -                          throws InstallationException
        -
        Sets the XML entiry resolver used for reading XML documents. - - The default value is null.
        -
        -
        Parameters:
        -
        xmlEntityResolver - it must implement - org.xml.sax.EntityResolver (it was declared as - Object to prevent linkage errors when XML related - features are not used on pre-1.4 Java), or it must be null.
        -
        Throws:
        -
        InstallationException
        -
        -
      • -
      - - - -
        -
      • -

        getXmlEntiryResolver

        -
        public Object getXmlEntiryResolver()
        -
        Gets the XML entiry resolver used for reading XML documents.
        -
        -
        Returns:
        -
        null of no resolver is used, or an - org.xml.sax.EntityResolver (it was declared as - Object to prevent linkage errors when XML related - features are not used on pre-1.4 Java).
        -
        -
      • -
      - - - -
        -
      • -

        setValidateXml

        -
        public void setValidateXml(boolean validateXml)
        -
        Sets if XML documents should be validated when they are loaded. - Defaults to true.
        -
      • -
      - - - -
        -
      • -

        getValidateXml

        -
        public boolean getValidateXml()
        -
      • -
      - - - -
        -
      • -

        addXmlRenderingConfiguration

        -
        public void addXmlRenderingConfiguration(XmlRenderingConfiguration xmlRendering)
        -
        Adds as XML rendering configuration.
        -
      • -
      - - - -
        -
      • -

        clearXmlRenderingConfigurations

        -
        public void clearXmlRenderingConfigurations()
        -
        Removes all XML rendering configurations.
        -
      • -
      - - - -
        -
      • -

        addData

        -
        public void addData(String name,
        -                    Object value)
        -
        Adds a variable that will be visible for all templates when the - processing session executes.
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        addData

        -
        public void addData(Map map)
        -
        Adds all entries with addData(String, Object). - The name of the variable will be the key of the map entry, - and its value will be the value of the map entry.
        -
      • -
      - - - - - - - -
        -
      • -

        getData

        -
        public Object getData(String name)
        -
        Gets the value of a variable. This method accesses the variables that - are visible for all templates. It corresponds to setting data. - -

        Warning! When the processing session is executing, you must - not modify the returned object.

        -
        -
        Returns:
        -
        null if no such variable exist. - Values are returned exactly as they were added, that is, without - FreeMarker's wrapping (but note that some variables initially use - FreeMarker TemplateModel types, such as variables created by - some of the data loaders).
        -
        See Also:
        -
        addData(String, Object)
        -
        -
      • -
      - - - -
        -
      • -

        removeData

        -
        public Object removeData(String name)
        -
        Removes a variable that would be visible for all templates when the - processing session executes. I does nothing if there is no variable - exists for the given name.
        -
        -
        Returns:
        -
        the removed value, or null if there was no value - stored for the given name.
        -
        See Also:
        -
        addData(String, Object)
        -
        -
      • -
      - - - -
        -
      • -

        clearSharedVariables

        -
        public void clearSharedVariables()
        -
        Deprecated. Use clearData() instead.
        -
      • -
      - - - -
        -
      • -

        addLocalDataBuilder

        -
        public void addLocalDataBuilder(int layer,
        -                                String pathPattern,
        -                                LocalDataBuilder builder)
        -
        Adds a local data builder. The local data builder will be invoked - directly before the execution of templates (if the - pathPattern matches the source file path).
        -
        -
        Parameters:
        -
        layer - the index of the layer, stating from 0. 0 is the layer with - the highest priority.
        -
        pathPattern - the path pattern of source files where this local - data builder will be used.
        -
        builder - the local data builder object.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getProgressListenerEventName

        -
        public static String getProgressListenerEventName(int event)
        -
        Converts an ProgressListener.EVENT_... constant to English - text.
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        isTemplateEnvironmentAvailable

        -
        public boolean isTemplateEnvironmentAvailable()
        -
        Tells if getTemplateEnvironment() will throw exception or not.
        -
      • -
      - - - -
        -
      • -

        setAttribute

        -
        public Object setAttribute(String name,
        -                           Object value)
        -
        Adds/replaces an engine attribute. - Attributes are arbitrary key-value pairs that are associated with the - Engine object. FMPP reserves all keys starting with - fmpp. for its own use. Attributes are not understood by the - Engine, but by data loaders, local data builders, and tools that - create them. - -

        Attributes can be changed (replaced, removed, ...etc.) while the - processing session is executing.

        -
        -
        Parameters:
        -
        name - the name of the attribute. To prevent name - clashes, it should follow the naming convention of Java classes, e.g. - "com.example.someproject.something".
        -
        value - the value of the attribute. If it implements - ProgressListener, then it will receive notifications about - the events of the Engine. If attribute(s) with that value is - (are) removed, then the value object doesn't receive more - notifications.
        -
        Returns:
        -
        The previous value of the attribute, or null if - there was no attribute with the given name.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        removeAttribute

        -
        public Object removeAttribute(String name)
        -
        Removes an attribute. It does nothing if the attribute does not exist.
        -
        -
        Returns:
        -
        The value of the removed attribute or null if there - was no attribute with the given name.
        -
        See Also:
        -
        setAttribute(String, Object)
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getVersionNumber

        -
        public static String getVersionNumber()
        -
        Returns the FMPP version number string. FMPP version number string - follows the major.minor.sub or major.minor.sub.nightly - format, where each part (separated by dots) is an non-negative integer - number.
        -
      • -
      - - - -
        -
      • -

        getBuildInfo

        -
        public static String getBuildInfo()
        -
        Returns FMPP build info. This is usually the date of the build, but it - can be anything.
        -
      • -
      - - - -
        -
      • -

        getFreeMarkerVersionNumber

        -
        public static String getFreeMarkerVersionNumber()
        -
      • -
      - - - -
        -
      • -

        isXmlSupportAvailabile

        -
        public boolean isXmlSupportAvailabile()
        -
        Quickly tells if XML support is available.
        -
      • -
      - - - -
        -
      • -

        checkXmlSupportAvailability

        -
        public void checkXmlSupportAvailability(String requiredForThis)
        -                                 throws InstallationException
        -
        Checks if XML support is available. It can be quicker than - MiscUtil.checkXmlSupportAvailability(String), so rather use this.
        -
        -
        Parameters:
        -
        requiredForThis - a short sentence that describes for human reader - if for what do we need the XML support (e.g. - "Usage of xml data loader." or - "Set XML entity resolver."). This sentence is used - in error message of the InstallationException. - Can be null.
        -
        Throws:
        -
        InstallationException - if the XML support is not available.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/LocalDataBuilder.html b/fmpp/docs/api/fmpp/LocalDataBuilder.html deleted file mode 100644 index 83e86ec..0000000 --- a/fmpp/docs/api/fmpp/LocalDataBuilder.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - -LocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Interface LocalDataBuilder

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        build

        -
        Map build(Engine eng,
        -          TemplateEnvironment env)
        -   throws Exception
        -
        Returns the variables that could be added to the local data.
        -
        -
        Returns:
        -
        the variables to add to the local data. Can be - null. The returned map will not be modified - (although technically, badly behaved 3rd party code can modify - the values soted in the map...).
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/ProcessingException.html b/fmpp/docs/api/fmpp/ProcessingException.html deleted file mode 100644 index c785a74..0000000 --- a/fmpp/docs/api/fmpp/ProcessingException.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - -ProcessingException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Class ProcessingException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    -
    public class ProcessingException
    -extends ExceptionCC
    -
    Error while performing the processing session.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProcessingException

        -
        public ProcessingException(Engine e,
        -                           File sourceFile,
        -                           Throwable cause)
        -
        -
        Parameters:
        -
        sourceFile - can be null.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSourceFile

        -
        public File getSourceFile()
        -
        Returns the source file the faliure relates to. - This is an absolute file (not relative). - It's null if no such information is available.
        -
      • -
      - - - -
        -
      • -

        getSourceRoot

        -
        public File getSourceRoot()
        -
        Returns the "sourceRoot" used during the processing session that failed. - It's maybe null, but only if getSourceFile() - returns null too.
        -
      • -
      - - - -
        -
      • -

        getMessage

        -
        public String getMessage()
        -
        Returns always the same text: "FMPP processing session failed."
        -
        -
        Overrides:
        -
        getMessage in class Throwable
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/ProgressListener.html b/fmpp/docs/api/fmpp/ProgressListener.html deleted file mode 100644 index ec07509..0000000 --- a/fmpp/docs/api/fmpp/ProgressListener.html +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - -ProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Interface ProgressListener

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        EVENT_BEGIN_PROCESSING_SESSION

        -
        static final int EVENT_BEGIN_PROCESSING_SESSION
        -
        Engine.process has started the work.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_END_PROCESSING_SESSION

        -
        static final int EVENT_END_PROCESSING_SESSION
        -
        Engine.process has finished the work.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_BEGIN_FILE_PROCESSING

        -
        static final int EVENT_BEGIN_FILE_PROCESSING
        -
        The processing of a single file has been started.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_END_FILE_PROCESSING

        -
        static final int EVENT_END_FILE_PROCESSING
        -
        The processing of a single file has been finished.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_IGNORING_DIR

        -
        static final int EVENT_IGNORING_DIR
        -
        A source directory has been ignored (skipped.)
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_CREATED_EMPTY_DIR

        -
        static final int EVENT_CREATED_EMPTY_DIR
        -
        An empty directory was created due to the copyEmptyDirs setting.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_WARNING

        -
        static final int EVENT_WARNING
        -
        A warning message has been received from a template or from the - engine.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_SOURCE_NOT_MODIFIED

        -
        static final int EVENT_SOURCE_NOT_MODIFIED
        -
        The processing of source was skipped because the output was generated - after the last modification of the source file.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        void notifyProgressEvent(Engine engine,
        -                         int event,
        -                         File src,
        -                         int pMode,
        -                         Throwable error,
        -                         Object param)
        -                  throws Exception
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/TemplateDataModelBuilder.html b/fmpp/docs/api/fmpp/TemplateDataModelBuilder.html deleted file mode 100644 index e7ba1d2..0000000 --- a/fmpp/docs/api/fmpp/TemplateDataModelBuilder.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - -TemplateDataModelBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Interface TemplateDataModelBuilder

-
-
-
-
    -
  • -
    -
    Deprecated.  -
    Use LocalDataBuilder instead.
    -
    -
    -
    public interface TemplateDataModelBuilder
    -
    Contains callback to build the data-model for a template execution.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        build

        -
        Map build(Engine e,
        -          Template template,
        -          File src)
        -   throws Exception
        -
        Deprecated. 
        -
        Returns the top-level variables that will be available for the template.
        -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/TemplateEnvironment.html b/fmpp/docs/api/fmpp/TemplateEnvironment.html deleted file mode 100644 index 4566c92..0000000 --- a/fmpp/docs/api/fmpp/TemplateEnvironment.html +++ /dev/null @@ -1,875 +0,0 @@ - - - - - - -TemplateEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Class TemplateEnvironment

-
-
- -
-
    -
  • -
    -
    -
    public class TemplateEnvironment
    -extends Object
    -
    The runtime FMPP environment of an executing template.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getCurrentInstance

        -
        public static TemplateEnvironment getCurrentInstance()
        -
        Returns the TemplateEnvironment object used for the template - currently being executed by FMPP in the current thread. - The return value of the method is undefined if no such template execution - is in progress. - In practice it means that it can be safely called from a Java - method that is (indirectly) invoked by the executing template. For - example, in a TemplateTransformModel that is - used in the template with <@...>.
        -
      • -
      - - - -
        -
      • -

        getFreemarkerEnvironment

        -
        public Environment getFreemarkerEnvironment()
        -
        Returns the FreeMarker environment currently in use. - The FreeMarker environment can be used to set/get variables, among - others.
        -
        -
        Throws:
        -
        IllegalStateException - if the FreeMarker environment is not - available.
        -
        -
      • -
      - - - -
        -
      • -

        getEngine

        -
        public Engine getEngine()
        -
        Returns the FMPP engine object in use.
        -
      • -
      - - - -
        -
      • -

        getXmlDocument

        -
        public Object getXmlDocument()
        -
        Returns the processed XML document (pp.doc) as - Document. This will return non-null - if, and only if the current processing mode is "renderXml".
        -
        -
        See Also:
        -
        getWrappedXmlDocument()
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getData

        -
        public Object getData(String name)
        -
        Similar to Engine.getData(java.lang.String), but it also sees file processing - specifict variables (local data).
        -
        -
        Parameters:
        -
        name - the name of the variable.
        -
        Returns:
        -
        the value of the variable, or null if no variable - with the given name exists.
        -
        -
      • -
      - - - -
        -
      • -

        getSourceFile

        -
        public File getSourceFile()
        -
        Returns the source file.
        -
      • -
      - - - -
        -
      • -

        getTemplate

        -
        public Template getTemplate()
        -
        Retuns the FreeMarker Template object for the source file.
        -
      • -
      - - - -
        -
      • -

        getOutputFile

        -
        public File getOutputFile()
        -                   throws IOException
        -
        Returns the output file. Note that this value can change during the - execution of template.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getHomePath

        -
        public String getHomePath()
        -                   throws IOException
        -
        Returns URL-style path of the output root relative to the current output - file.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getOutputEncoding

        -
        public String getOutputEncoding()
        -                         throws IOException
        -
        Returns the output encoding. Note that this value can change during the - execution of template.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        changeOutputFile

        -
        public void changeOutputFile(String name)
        -                      throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        changeOutputFile

        -
        public void changeOutputFile(String name,
        -                             boolean append)
        -                      throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        renameOutputFile

        -
        public void renameOutputFile(String name)
        -                      throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        dropOutputFile

        -
        public void dropOutputFile()
        -                    throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        restartOutputFile

        -
        public void restartOutputFile()
        -                       throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        beginNestedOutputFile

        -
        public void beginNestedOutputFile(String name)
        -                           throws IOException
        -
        It does the same as the begin tag of the corresponding directive of the - pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        beginNestedOutputFile

        -
        public void beginNestedOutputFile(String name,
        -                                  boolean append)
        -                           throws IOException
        -
        It does the same as the begin tag of the corresponding directive of the - pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        endNestedOutputFile

        -
        public void endNestedOutputFile()
        -                         throws IOException
        -
        It does the same as the end tag of the corresponding directive of the - pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        setOutputEncoding

        -
        public void setOutputEncoding(String encoding)
        -                       throws IOException
        -
        It does the same as the directive in the pp hash.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        warning

        -
        public void warning(String message)
        -
        It does the same as the directive in the pp hash.
        -
      • -
      - - - -
        -
      • -

        resolveSourcePath

        -
        public File resolveSourcePath(String path)
        -                       throws IOException
        -
        Resolves a source path to a File object. - Use this for your custom transforms that wants the path of a source file - as parameter. When it tries to find the file, paths as - foo.jpg will be interpreted relatively to the current source - file, while paths like /img/foo.jpg will be interpreted - relatively to source root directory. - -

        Note that an IOException will be thrown if the file is outside the - source root directory.

        -
        -
        Parameters:
        -
        path - the path in UN*X or native format.
        -
        Returns:
        -
        File object that points to the file.
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - - - - - -
        -
      • -

        toSourceRootRelativePath

        -
        public String toSourceRootRelativePath(String path)
        -                                throws IOException
        -
        Returns the path relative to the source root.
        -
        -
        Parameters:
        -
        path - the path in UN*X or native format. - The virtual root directory will be the source root, not the real - root directory of the host system.
        -
        Returns:
        -
        the source root relative path in UN*X format. - It does not start with slash.
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        toSourceRootRelativePath

        -
        public String toSourceRootRelativePath(File f)
        -                                throws IOException
        -
        Convets a file object to a source root relative UN*X style path.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - - - - - -
        -
      • -

        toOutputRootRelativePath

        -
        public String toOutputRootRelativePath(File f)
        -                                throws IOException
        -
        Convets a file object to an output root relative UN*X style path.
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        getPathTo

        -
        public String getPathTo(String dst)
        -                 throws IOException
        -
        Calculates the path of another output file relatively to current output - file, in UN*X format.
        -
        -
        Parameters:
        -
        dst - the path of the other output file in UN*X or native format. - The (virtual) root directory will be the output root directory, not - the real root directory of the host system.
        -
        Returns:
        -
        the path of dst relatively to the current output - file, in UN*X format. - It never starts with slash. It ends with slash if and only if - dst ends with slash, except if the return value would - be a single slash then, in which case the result will be an empty - string instead.
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/XmlRenderingConfiguration.html b/fmpp/docs/api/fmpp/XmlRenderingConfiguration.html deleted file mode 100644 index 3cdf54d..0000000 --- a/fmpp/docs/api/fmpp/XmlRenderingConfiguration.html +++ /dev/null @@ -1,514 +0,0 @@ - - - - - - -XmlRenderingConfiguration (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp
-

Class XmlRenderingConfiguration

-
-
- -
-
    -
  • -
    -
    -
    public class XmlRenderingConfiguration
    -extends Object
    -
    Stores options that describe when and how to process an XML file in - "renderXml" processing mode. - -

    Do not change this object after you have added it to the - Engine. It's in principle - an immutable object, but to prevent too many constructor parameters and - later backward compatibility problems, you have to specify the options with - setter methods, rather than with constructor arguments. - -

    You must set a non-null template or set - copy to true. All other options are optional.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        XmlRenderingConfiguration

        -
        public XmlRenderingConfiguration()
        -
        Creates new object.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        setTemplate

        -
        public void setTemplate(String template)
        -
        Sets the renderer template.
        -
        -
        Parameters:
        -
        template - the source path of the template used for the - rendering of the XML file. Can't be null.
        -
        -
      • -
      - - - -
        -
      • -

        setCopy

        -
        public void setCopy(boolean copy)
        -
        Sets if the XML file should be copied as is, or renderd with a template. - If the value of this option is true, then the value of the - template option is insignificant.
        -
      • -
      - - - -
        -
      • -

        addDocumentElement

        -
        public void addDocumentElement(String xmlns,
        -                               String localName)
        -
        Adds an element to the list of document elements. The XML file will not - be processed according this configuration object if this list - doesn't contain the document element of the XML file. - If the list is empty, then this criteria will not be considered - (accepts XML documents regardels of their document element).
        -
        -
        Parameters:
        -
        xmlns - the name-space URL of the element. This should be - null or 0-length stirng if the element doesn't belong to - any XML name-space.
        -
        localName - the local (name-space preixless) name of the element.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        addLocalDataBuilder

        -
        public void addLocalDataBuilder(LocalDataBuilder localDataBuilder)
        -
        Adds an extra local data builder that is invoked after all other - local data builders. The task of this builder is to do the - complex or resource eager parts of the XML processing that you don't - want to do in FTL, and expose the results as local data. - -

        The data loaders added earlier will be executed earlier. The data - loader executed later can replace earlier added local data variables.

        -
      • -
      - - - - - - - -
        -
      • -

        addSourcePathPattern

        -
        public void addSourcePathPattern(String pathPattern)
        -
        Adds a path to the list of source path patterns. The XML file will not be - processed according this configuration object if no path - in this list matches the source root relative path of the XML file. - If the list is empty, then this criteria will not be considered - (accepts XML documents regardels of their source file path).
        -
        -
        Parameters:
        -
        pathPattern - the path pattern of the source root relative path of - the XML file. It doesn't mater if it starts with / or not.
        -
        -
      • -
      - - - -
        -
      • -

        clearSourcePathPatterns

        -
        public void clearSourcePathPatterns()
        -
        Empties the list of source path patterns.
        -
        -
        See Also:
        -
        addSourcePathPattern(String)
        -
        -
      • -
      - - - -
        -
      • -

        addXmlDataLoaderOption

        -
        public void addXmlDataLoaderOption(String name,
        -                                   Object value)
        -
        Adds or replaces an option in the map of xml data loader - options. - The set of valid values are specified by the xml data loader - (see in the FMPP Manual), and they will not be validated until the data - loader is actually invoked, so when the processing of the XML file - starts. The only exception from this rule is the - "namespaceAware" option, for which false - value is not allowed.
        -
        -
        Parameters:
        -
        name - the name of the option. Option "namespaceAware" - is not allowed.
        -
        value - the value of the option
        -
        -
      • -
      - - - -
        -
      • -

        clearXmlDataLoaderOptions

        -
        public void clearXmlDataLoaderOptions()
        -
        Removes all xml data loader options.
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/DataModelBuildingException.html b/fmpp/docs/api/fmpp/class-use/DataModelBuildingException.html deleted file mode 100644 index f43b86a..0000000 --- a/fmpp/docs/api/fmpp/class-use/DataModelBuildingException.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - -Uses of Class fmpp.DataModelBuildingException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.DataModelBuildingException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/Engine.html b/fmpp/docs/api/fmpp/class-use/Engine.html deleted file mode 100644 index 2eb4d52..0000000 --- a/fmpp/docs/api/fmpp/class-use/Engine.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - -Uses of Class fmpp.Engine (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.Engine

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/LocalDataBuilder.html b/fmpp/docs/api/fmpp/class-use/LocalDataBuilder.html deleted file mode 100644 index c1cab0a..0000000 --- a/fmpp/docs/api/fmpp/class-use/LocalDataBuilder.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - -Uses of Interface fmpp.LocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Interface
fmpp.LocalDataBuilder

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/ProcessingException.html b/fmpp/docs/api/fmpp/class-use/ProcessingException.html deleted file mode 100644 index 6a5948e..0000000 --- a/fmpp/docs/api/fmpp/class-use/ProcessingException.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - -Uses of Class fmpp.ProcessingException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.ProcessingException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/ProgressListener.html b/fmpp/docs/api/fmpp/class-use/ProgressListener.html deleted file mode 100644 index 6aa7d4b..0000000 --- a/fmpp/docs/api/fmpp/class-use/ProgressListener.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - -Uses of Interface fmpp.ProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Interface
fmpp.ProgressListener

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/TemplateDataModelBuilder.html b/fmpp/docs/api/fmpp/class-use/TemplateDataModelBuilder.html deleted file mode 100644 index 85d899c..0000000 --- a/fmpp/docs/api/fmpp/class-use/TemplateDataModelBuilder.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - -Uses of Interface fmpp.TemplateDataModelBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Interface
fmpp.TemplateDataModelBuilder

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/TemplateEnvironment.html b/fmpp/docs/api/fmpp/class-use/TemplateEnvironment.html deleted file mode 100644 index 9559cec..0000000 --- a/fmpp/docs/api/fmpp/class-use/TemplateEnvironment.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -Uses of Class fmpp.TemplateEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.TemplateEnvironment

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/class-use/XmlRenderingConfiguration.html b/fmpp/docs/api/fmpp/class-use/XmlRenderingConfiguration.html deleted file mode 100644 index aedadab..0000000 --- a/fmpp/docs/api/fmpp/class-use/XmlRenderingConfiguration.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class fmpp.XmlRenderingConfiguration (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.XmlRenderingConfiguration

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AbstractTextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AbstractTextDataLoader.html deleted file mode 100644 index 47d0a11..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AbstractTextDataLoader.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - -AbstractTextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AbstractTextDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    Direct Known Subclasses:
    -
    SlicedTextDataLoader
    -
    -
    -
    -
    public abstract class AbstractTextDataLoader
    -extends FileDataLoader
    -
    Returns a string based on a plain text file.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AbstractTextDataLoader

        -
        public AbstractTextDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        parseText

        -
        protected abstract Object parseText(String text)
        -                             throws Exception
        -
        Parses the file content to the final object that the data loader - will return.
        -
        -
        Parameters:
        -
        text - the content of the text file
        -
        Returns:
        -
        the return value of the data loader
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        parseExtraArguments

        -
        protected abstract String parseExtraArguments(List args)
        -                                       throws Exception
        -
        Parses the argument list, except the 1st (file name) argument.
        -
        -
        Parameters:
        -
        args - the arguments (all of them, starting from the 1st)
        -
        Returns:
        -
        the encoding given with the extra arguments, or - null if the encoding was not specified. In the latest - case the encoding will default to the source encoding engine - parameter (the sourceEncoding setting).
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AntDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AntDataLoader.html deleted file mode 100644 index 55c690c..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AntDataLoader.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - - -AntDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AntDataLoader

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        ATTRIBUTE_ANT_TASK

        -
        public static final String ATTRIBUTE_ANT_TASK
        -
        The name of the Engine attribute that must store the Ant task - object.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntDataLoader

        -
        public AntDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine eng,
        -                   List args)
        -            throws Exception
        -
        Gets the Ant task object, and invoked load(Engine, List, Task).
        -
        -
        Specified by:
        -
        load in interface DataLoader
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        load

        -
        protected abstract Object load(Engine eng,
        -                               List args,
        -                               org.apache.tools.ant.Task task)
        -                        throws Exception
        -
        Override this method to implement your Ant related data loader.
        -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AntProjectDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AntProjectDataLoader.html deleted file mode 100644 index eb416a8..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AntProjectDataLoader.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -AntProjectDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AntProjectDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class AntProjectDataLoader
    -extends AntDataLoader
    -
    Returns the Ant project object.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntProjectDataLoader

        -
        public AntProjectDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine eng,
        -                   List args,
        -                   org.apache.tools.ant.Task task)
        -
        Description copied from class: AntDataLoader
        -
        Override this method to implement your Ant related data loader.
        -
        -
        Specified by:
        -
        load in class AntDataLoader
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AntPropertiesDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AntPropertiesDataLoader.html deleted file mode 100644 index 0d358d8..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AntPropertiesDataLoader.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - -AntPropertiesDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AntPropertiesDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class AntPropertiesDataLoader
    -extends AntDataLoader
    -
    Returns the Map of all Ant properties, or of the selected Ant properties.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AntPropertyDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AntPropertyDataLoader.html deleted file mode 100644 index cc47214..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AntPropertyDataLoader.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - -AntPropertyDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AntPropertyDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class AntPropertyDataLoader
    -extends AntDataLoader
    -
    Returns the value of an Ant property.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/AntTaskDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/AntTaskDataLoader.html deleted file mode 100644 index a98dcda..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/AntTaskDataLoader.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -AntTaskDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class AntTaskDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class AntTaskDataLoader
    -extends AntDataLoader
    -
    Returns the FMPP Ant task object.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntTaskDataLoader

        -
        public AntTaskDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine eng,
        -                   List args,
        -                   org.apache.tools.ant.Task task)
        -
        Description copied from class: AntDataLoader
        -
        Override this method to implement your Ant related data loader.
        -
        -
        Specified by:
        -
        load in class AntDataLoader
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/CsvDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/CsvDataLoader.html deleted file mode 100644 index 3fbc9d7..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/CsvDataLoader.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - -CsvDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class CsvDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class CsvDataLoader
    -extends FileDataLoader
    -
    Data loaders that loads CSV (Column Separated Values) files or other files of - similar formats (as tab divided text), and returns a - fmpp.models.CsvSequence object. - -

    The format of the directive is: - csv(filename, option), - where option is a hash of options, such as - {encoding:'ISO-8859-3', separator:','}. - For the complete list of options please see the parameters of - CsvSequence constructors. - -

    Note: This class should be an - AbstractTextDataLoader subclass, but it is not that - for backward compatibility.

    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/EvalDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/EvalDataLoader.html deleted file mode 100644 index 0c9306d..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/EvalDataLoader.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - -EvalDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class EvalDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class EvalDataLoader
    -extends Object
    -implements DataLoader
    -
    Evaluates a BeanShell expression (looks like as Java). - The scrip has access to the Engine object by the - engine variable.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        EvalDataLoader

        -
        public EvalDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine e,
        -                   List args)
        -            throws Exception
        -
        -
        Specified by:
        -
        load in interface DataLoader
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/FileDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/FileDataLoader.html deleted file mode 100644 index e6c031b..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/FileDataLoader.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - -FileDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class FileDataLoader

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        engine

        -
        protected Engine engine
        -
      • -
      - - - -
        -
      • -

        args

        -
        protected List args
        -
      • -
      - - - -
        -
      • -

        dataFile

        -
        protected File dataFile
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FileDataLoader

        -
        public FileDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine engine,
        -                   List args)
        -            throws Exception
        -
        -
        Specified by:
        -
        load in interface DataLoader
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        load

        -
        protected abstract Object load(InputStream data)
        -                        throws Exception
        -
        FileDataLoader subclasess override this method to parse - the file.
        -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/HtmlUtilsDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/HtmlUtilsDataLoader.html deleted file mode 100644 index 011632d..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/HtmlUtilsDataLoader.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - -HtmlUtilsDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class HtmlUtilsDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class HtmlUtilsDataLoader
    -extends Object
    -implements DataLoader
    -
    Returns a hash that contains useful directives for HTML generation. -
      -
    • img: Same as HTML img, but automatically calculates the width and/or - height attributes if they are missing. -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        HtmlUtilsDataLoader

        -
        public HtmlUtilsDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine e,
        -                   List args)
        -            throws Exception
        -
        -
        Specified by:
        -
        load in interface DataLoader
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        setXHtml

        -
        public void setXHtml(boolean xHtml)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/JSONDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/JSONDataLoader.html deleted file mode 100644 index 9ed5050..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/JSONDataLoader.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - -JSONDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class JSONDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class JSONDataLoader
    -extends FileDataLoader
    -
    Creates a JSONNode based on a JSON file. The JSON file must contain a single JSON value on the top level, - such as JSON object (like { "a": 1, "b": 2 }), an array, or even just a string, number, boolean or - null.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/NowDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/NowDataLoader.html deleted file mode 100644 index 39aaa9c..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/NowDataLoader.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - -NowDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class NowDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class NowDataLoader
    -extends Object
    -implements DataLoader
    -
    Data loader that produces string from the current date. - It is maybe better to use pp.sessionStart or - pp.now instead of this data loader. - -

    The format of the directive is: - now(options), where options is a hash as: - {pattern:"yyyy-MM-dd HH:mm:ss"} or - {date:short, time:long, zone:"GMT+0"}.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NowDataLoader

        -
        public NowDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        public Object load(Engine engine,
        -                   List args)
        -            throws Exception
        -
        -
        Specified by:
        -
        load in interface DataLoader
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/PropertiesDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/PropertiesDataLoader.html deleted file mode 100644 index c9e7338..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/PropertiesDataLoader.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - -PropertiesDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class PropertiesDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class PropertiesDataLoader
    -extends FileDataLoader
    -
    Returns a Map based on a Java properties file.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/SlicedTextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/SlicedTextDataLoader.html deleted file mode 100644 index 158ffd8..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/SlicedTextDataLoader.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - -SlicedTextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class SlicedTextDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class SlicedTextDataLoader
    -extends AbstractTextDataLoader
    -
    Returns a sequence of strings based on a plain text file, where the specified - symbol is used as separator. For more information please read the FMPP - Manual.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SlicedTextDataLoader

        -
        public SlicedTextDataLoader()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        postProcessItems

        -
        protected List postProcessItems(List items)
        -
        Override this if you want to post-process the items.
        -
        -
        Parameters:
        -
        items - the list of String-s that the standard - slicedText data loader would return.
        -
        Returns:
        -
        the final return value of the custom data loader.
        -
        -
      • -
      - - - -
        -
      • -

        parseExtraArguments

        -
        protected final String parseExtraArguments(List args)
        -                                    throws Exception
        -
        Description copied from class: AbstractTextDataLoader
        -
        Parses the argument list, except the 1st (file name) argument.
        -
        -
        Specified by:
        -
        parseExtraArguments in class AbstractTextDataLoader
        -
        Parameters:
        -
        args - the arguments (all of them, starting from the 1st)
        -
        Returns:
        -
        the encoding given with the extra arguments, or - null if the encoding was not specified. In the latest - case the encoding will default to the source encoding engine - parameter (the sourceEncoding setting).
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/TddDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/TddDataLoader.html deleted file mode 100644 index 99028fb..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/TddDataLoader.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - -TddDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class TddDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class TddDataLoader
    -extends FileDataLoader
    -
    Creates a Map based on a TDD file. The TDD file must contain a hash - or a hash addition such as:
    - foo:123, bar:456, properties(baaz.properties)
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/TddSequenceDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/TddSequenceDataLoader.html deleted file mode 100644 index 2e8c147..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/TddSequenceDataLoader.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - -TddSequenceDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class TddSequenceDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class TddSequenceDataLoader
    -extends FileDataLoader
    -
    Creates a List based on a TDD file. The TDD file must contain a - TDD sequence such as:
    - "Big Joe", 1, [11, 22, 33], properties(foo.properties)
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/TextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/TextDataLoader.html deleted file mode 100644 index 51dcefb..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/TextDataLoader.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - -TextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class TextDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class TextDataLoader
    -extends FileDataLoader
    -
    Returns a string based on a plain text file. - -

    Note: This class should be an - AbstractTextDataLoader subclass, but it is not that - for backward compatibility.

    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/XmlDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/XmlDataLoader.html deleted file mode 100644 index 10e2a6b..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/XmlDataLoader.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - -XmlDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class XmlDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    -
    public class XmlDataLoader
    -extends Object
    -implements DataLoader
    -
    Returns a variable that exposes the content of an XML file.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/XmlInfosetDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/XmlInfosetDataLoader.html deleted file mode 100644 index 128e54c..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/XmlInfosetDataLoader.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - -XmlInfosetDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.dataloaders
-

Class XmlInfosetDataLoader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    DataLoader
    -
    -
    -
    Deprecated.  -
    Use XmlDataLoader instead.
    -
    -
    -
    public class XmlInfosetDataLoader
    -extends FileDataLoader
    -
    Returns a variable that exposes the content of an XML file based on - the W3C XML infoset approach.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AbstractTextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AbstractTextDataLoader.html deleted file mode 100644 index 7c85429..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AbstractTextDataLoader.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AbstractTextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AbstractTextDataLoader

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AntDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AntDataLoader.html deleted file mode 100644 index 58969de..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AntDataLoader.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AntDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AntDataLoader

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AntProjectDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AntProjectDataLoader.html deleted file mode 100644 index ff25740..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AntProjectDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AntProjectDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AntProjectDataLoader

-
-
No usage of fmpp.dataloaders.AntProjectDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertiesDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertiesDataLoader.html deleted file mode 100644 index 28e5a6f..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertiesDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AntPropertiesDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AntPropertiesDataLoader

-
-
No usage of fmpp.dataloaders.AntPropertiesDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertyDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertyDataLoader.html deleted file mode 100644 index c4fbeda..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AntPropertyDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AntPropertyDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AntPropertyDataLoader

-
-
No usage of fmpp.dataloaders.AntPropertyDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/AntTaskDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/AntTaskDataLoader.html deleted file mode 100644 index ce59a8e..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/AntTaskDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.AntTaskDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.AntTaskDataLoader

-
-
No usage of fmpp.dataloaders.AntTaskDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/CsvDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/CsvDataLoader.html deleted file mode 100644 index c1f2a79..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/CsvDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.CsvDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.CsvDataLoader

-
-
No usage of fmpp.dataloaders.CsvDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/EvalDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/EvalDataLoader.html deleted file mode 100644 index 05bb636..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/EvalDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.EvalDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.EvalDataLoader

-
-
No usage of fmpp.dataloaders.EvalDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/FileDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/FileDataLoader.html deleted file mode 100644 index c8cbe76..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/FileDataLoader.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.FileDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.FileDataLoader

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/HtmlUtilsDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/HtmlUtilsDataLoader.html deleted file mode 100644 index 3f6a616..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/HtmlUtilsDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.HtmlUtilsDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.HtmlUtilsDataLoader

-
-
No usage of fmpp.dataloaders.HtmlUtilsDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/JSONDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/JSONDataLoader.html deleted file mode 100644 index 296d1e4..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/JSONDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.JSONDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.JSONDataLoader

-
-
No usage of fmpp.dataloaders.JSONDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/NowDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/NowDataLoader.html deleted file mode 100644 index e6da49d..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/NowDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.NowDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.NowDataLoader

-
-
No usage of fmpp.dataloaders.NowDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/PropertiesDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/PropertiesDataLoader.html deleted file mode 100644 index 6210e1a..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/PropertiesDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.PropertiesDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.PropertiesDataLoader

-
-
No usage of fmpp.dataloaders.PropertiesDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/SlicedTextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/SlicedTextDataLoader.html deleted file mode 100644 index b28bd1d..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/SlicedTextDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.SlicedTextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.SlicedTextDataLoader

-
-
No usage of fmpp.dataloaders.SlicedTextDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/TddDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/TddDataLoader.html deleted file mode 100644 index bc698c7..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/TddDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.TddDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.TddDataLoader

-
-
No usage of fmpp.dataloaders.TddDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/TddSequenceDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/TddSequenceDataLoader.html deleted file mode 100644 index 2b73bb7..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/TddSequenceDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.TddSequenceDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.TddSequenceDataLoader

-
-
No usage of fmpp.dataloaders.TddSequenceDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/TextDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/TextDataLoader.html deleted file mode 100644 index 32da5c2..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/TextDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.TextDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.TextDataLoader

-
-
No usage of fmpp.dataloaders.TextDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/XmlDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/XmlDataLoader.html deleted file mode 100644 index 8f43510..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/XmlDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.XmlDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.XmlDataLoader

-
-
No usage of fmpp.dataloaders.XmlDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/class-use/XmlInfosetDataLoader.html b/fmpp/docs/api/fmpp/dataloaders/class-use/XmlInfosetDataLoader.html deleted file mode 100644 index cb72dff..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/class-use/XmlInfosetDataLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.dataloaders.XmlInfosetDataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.dataloaders.XmlInfosetDataLoader

-
-
No usage of fmpp.dataloaders.XmlInfosetDataLoader
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/package-frame.html b/fmpp/docs/api/fmpp/dataloaders/package-frame.html deleted file mode 100644 index 02e678c..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - -fmpp.dataloaders (FMPP 0.9.15 API) - - - - - -

fmpp.dataloaders

- - - diff --git a/fmpp/docs/api/fmpp/dataloaders/package-summary.html b/fmpp/docs/api/fmpp/dataloaders/package-summary.html deleted file mode 100644 index a24fdd5..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/package-summary.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - -fmpp.dataloaders (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.dataloaders

-
-
fmpp.DataLoader implementations.
-
-

See: Description

-
-
- - - - -

Package fmpp.dataloaders Description

-

fmpp.DataLoader implementations.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/package-tree.html b/fmpp/docs/api/fmpp/dataloaders/package-tree.html deleted file mode 100644 index deb1987..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/package-tree.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -fmpp.dataloaders Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.dataloaders

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/dataloaders/package-use.html b/fmpp/docs/api/fmpp/dataloaders/package-use.html deleted file mode 100644 index f9f661a..0000000 --- a/fmpp/docs/api/fmpp/dataloaders/package-use.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - -Uses of Package fmpp.dataloaders (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.dataloaders

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/BshLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/BshLocalDataBuilder.html deleted file mode 100644 index eaaafbb..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/BshLocalDataBuilder.html +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - -BshLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.localdatabuilders
-

Class BshLocalDataBuilder

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    LocalDataBuilder
    -
    -
    -
    -
    public class BshLocalDataBuilder
    -extends Object
    -implements LocalDataBuilder
    -
    Deduces the file name of a BeanShell scrip file from the source file - name, and executes that script to create local data. - -

    The script must return a java.util.Map, which stores the - variables that will be added to the local data. - -

    The following variables are accessible for the scripts: -

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BshLocalDataBuilder

        -
        public BshLocalDataBuilder()
        -
        Creates new instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        getEncoding

        -
        public String getEncoding()
        -
      • -
      - - - -
        -
      • -

        setEncoding

        -
        public void setEncoding(String encoding)
        -
        Sets the encoding of the script files. If it is null then - the value of the sourceEncoding setting will be used.
        -
      • -
      - - - -
        -
      • -

        getEnding

        -
        public String getEnding()
        -
      • -
      - - - -
        -
      • -

        setEnding

        -
        public void setEnding(String ending)
        -
        Sets the string appended at the end of the source file name. - Can't be 0 length string. It defaults to ".bsh".
        -
      • -
      - - - -
        -
      • -

        getIgnoreMissing

        -
        public boolean getIgnoreMissing()
        -
        Set if it will be ignored no script file found for the source file, - rather than throwing an exception. Defaults to false.
        -
      • -
      - - - -
        -
      • -

        setIgnoreMissing

        -
        public void setIgnoreMissing(boolean ignoreMissing)
        -
      • -
      - - - -
        -
      • -

        getRemoveExtension

        -
        public boolean getRemoveExtension()
        -
      • -
      - - - -
        -
      • -

        setRemoveExtension

        -
        public void setRemoveExtension(boolean removeExtension)
        -
        Sets if the extension from the source file name should be removed before - appending the ending. The extension is the part after the - last dot of the file name. The dot itself is also removed. - Defaults to false.
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/CachingLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/CachingLocalDataBuilder.html deleted file mode 100644 index 9259f29..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/CachingLocalDataBuilder.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - - -CachingLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.localdatabuilders
-

Class CachingLocalDataBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CachingLocalDataBuilder

        -
        public CachingLocalDataBuilder()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        build

        -
        public final Map build(Engine eng,
        -                       TemplateEnvironment env)
        -                throws Exception
        -
        Takes care of caching, and calls build(Engine) if no cached - result is available.
        -
        -
        Specified by:
        -
        build in interface LocalDataBuilder
        -
        Returns:
        -
        the variables to add to the local data. Can be - null. The returned map will not be modified - (although technically, badly behaved 3rd party code can modify - the values soted in the map...).
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -                         throws Exception
        -
        Discards the cached result on - ProgressListener.EVENT_END_PROCESSING_SESSION. - -

        The TemplateEnvironment is not passed, to ensure that the - returned Map doesn't depend on the source file the builder - is used for, so reusing the result for other source files is safe.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        protected abstract Map build(Engine eng)
        -                      throws Exception
        -
        Override this method in your local data builder class.
        -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/MapLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/MapLocalDataBuilder.html deleted file mode 100644 index 45610dd..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/MapLocalDataBuilder.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -MapLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.localdatabuilders
-

Class MapLocalDataBuilder

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    LocalDataBuilder
    -
    -
    -
    -
    public class MapLocalDataBuilder
    -extends Object
    -implements LocalDataBuilder
    -
    Trivial local data builder that returns the Map passed to - its constructor.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapLocalDataBuilder

        -
        public MapLocalDataBuilder(Map map)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        build

        -
        public Map build(Engine eng,
        -                 TemplateEnvironment env)
        -          throws Exception
        -
        Description copied from interface: LocalDataBuilder
        -
        Returns the variables that could be added to the local data.
        -
        -
        Specified by:
        -
        build in interface LocalDataBuilder
        -
        Returns:
        -
        the variables to add to the local data. Can be - null. The returned map will not be modified - (although technically, badly behaved 3rd party code can modify - the values soted in the map...).
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/TddHashLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/TddHashLocalDataBuilder.html deleted file mode 100644 index 93bd39f..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/TddHashLocalDataBuilder.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - -TddHashLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.localdatabuilders
-

Class TddHashLocalDataBuilder

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/class-use/BshLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/class-use/BshLocalDataBuilder.html deleted file mode 100644 index 5f41e37..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/class-use/BshLocalDataBuilder.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - -Uses of Class fmpp.localdatabuilders.BshLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.localdatabuilders.BshLocalDataBuilder

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/class-use/CachingLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/class-use/CachingLocalDataBuilder.html deleted file mode 100644 index 67c2602..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/class-use/CachingLocalDataBuilder.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class fmpp.localdatabuilders.CachingLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.localdatabuilders.CachingLocalDataBuilder

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/class-use/MapLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/class-use/MapLocalDataBuilder.html deleted file mode 100644 index 568bc94..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/class-use/MapLocalDataBuilder.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.localdatabuilders.MapLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.localdatabuilders.MapLocalDataBuilder

-
-
No usage of fmpp.localdatabuilders.MapLocalDataBuilder
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/class-use/TddHashLocalDataBuilder.html b/fmpp/docs/api/fmpp/localdatabuilders/class-use/TddHashLocalDataBuilder.html deleted file mode 100644 index 1f0b094..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/class-use/TddHashLocalDataBuilder.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.localdatabuilders.TddHashLocalDataBuilder (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.localdatabuilders.TddHashLocalDataBuilder

-
-
No usage of fmpp.localdatabuilders.TddHashLocalDataBuilder
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/package-frame.html b/fmpp/docs/api/fmpp/localdatabuilders/package-frame.html deleted file mode 100644 index a63122b..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -fmpp.localdatabuilders (FMPP 0.9.15 API) - - - - - -

fmpp.localdatabuilders

- - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/package-summary.html b/fmpp/docs/api/fmpp/localdatabuilders/package-summary.html deleted file mode 100644 index 8b58b79..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/package-summary.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - -fmpp.localdatabuilders (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.localdatabuilders

-
-
fmpp.LocalDataBuilder implementations.
-
-

See: Description

-
-
- - - - -

Package fmpp.localdatabuilders Description

-

fmpp.LocalDataBuilder implementations.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/package-tree.html b/fmpp/docs/api/fmpp/localdatabuilders/package-tree.html deleted file mode 100644 index 2e8a28b..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/package-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -fmpp.localdatabuilders Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.localdatabuilders

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/localdatabuilders/package-use.html b/fmpp/docs/api/fmpp/localdatabuilders/package-use.html deleted file mode 100644 index fcd3a66..0000000 --- a/fmpp/docs/api/fmpp/localdatabuilders/package-use.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Package fmpp.localdatabuilders (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.localdatabuilders

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/AddTransform.html b/fmpp/docs/api/fmpp/models/AddTransform.html deleted file mode 100644 index cf459e9..0000000 --- a/fmpp/docs/api/fmpp/models/AddTransform.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -AddTransform (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class AddTransform

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/ClearTransform.html b/fmpp/docs/api/fmpp/models/ClearTransform.html deleted file mode 100644 index 650f189..0000000 --- a/fmpp/docs/api/fmpp/models/ClearTransform.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -ClearTransform (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class ClearTransform

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/CopyWritableVariableMethod.html b/fmpp/docs/api/fmpp/models/CopyWritableVariableMethod.html deleted file mode 100644 index 015b7fe..0000000 --- a/fmpp/docs/api/fmpp/models/CopyWritableVariableMethod.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - -CopyWritableVariableMethod (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class CopyWritableVariableMethod

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/CsvSequence.html b/fmpp/docs/api/fmpp/models/CsvSequence.html deleted file mode 100644 index 958e6bb..0000000 --- a/fmpp/docs/api/fmpp/models/CsvSequence.html +++ /dev/null @@ -1,921 +0,0 @@ - - - - - - -CsvSequence (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class CsvSequence

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    TemplateHashModel, TemplateModel, TemplateSequenceModel
    -
    -
    -
    -
    public class CsvSequence
    -extends Object
    -implements TemplateSequenceModel, TemplateHashModel
    -
    Sequence variable implementation that wraps text of CSV or tab separated - values format, or any other format that is the same as CSV except that it - uses different column separator char. - -

    The sequence is the list of table rows, and each row is hash where you - can access the cells with the column name. The column names (headers) are - the values in the first row of cells in the CSV file. - -

    The values in the table will be always exposed as string variables, unless - you specify an other type in the header cell directly. This can be done - by using colon + a type identifier at the end of the header cell. The type - indetifier can be: n or number, b or - boolean, d or date, - t or time, dt or - dateTime, s or string. For example, if - the value of a header cell in the CSV file is "price:n", then the values of - the cell will be exposed as numberical variables, not string. - -

    CsvSequence is also a hash that contains one key: - headers. This is a sequence that stores the header names.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CsvSequence

        -
        public CsvSequence()
        -
        Creates a new instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - - - - - -
        -
      • -

        fixBoolean

        -
        protected String fixBoolean(String s)
        -
        Override this if you want to correct boolean values come from the file. - The default implementation removes leading and trailing white-space, - converts to lowe case, and reaplaces the alternative boolean values (if - set) with "true" and "false".
        -
        -
        Parameters:
        -
        s - the raw column value
        -
        Returns:
        -
        String fixed value
        -
        -
      • -
      - - - -
        -
      • -

        fixNumber

        -
        protected String fixNumber(String s)
        -
        Override this if you want to correct numerical values come from the - file. - The default implementation removes leading and trailing white-space, - removes grouping symbols (if set) and replaces decimal separator (if set) - with dot.
        -
        -
        Parameters:
        -
        s - the raw column value
        -
        Returns:
        -
        String fixed value
        -
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        setExternalHeaderRow

        -
        public void setExternalHeaderRow(String[] externalHeaderRow)
        -
        If it is not null, then it is used as the header row - instead of the first row of the CSV file. Each value in the array - corresponds to a header row cell.
        -
      • -
      - - - -
        -
      • -

        getExternalHeaderRow

        -
        public String[] getExternalHeaderRow()
        -
      • -
      - - - -
        -
      • -

        setHasHeaderRow

        -
        public void setHasHeaderRow(boolean hasHeaderRow)
        -
        Specifies if the file contains header row or not. - If it is false, then the externalHeaderRow - property must not be null when calling - load(Reader). Defaults to true.
        -
      • -
      - - - -
        -
      • -

        getHasHeaderRow

        -
        public boolean getHasHeaderRow()
        -
      • -
      - - - -
        -
      • -

        setNormalizeHeaders

        -
        public void setNormalizeHeaders(boolean normalizeHeaders)
        -
        Specifies if the header names coming from the file will be normalized - or should be left as is. Normalization means: -
          -
        1. Remove the part between the first "(" and last - ")", before the header is parsed for column type - identifier (like ":n"). -
        2. After the type identifier was extracted and removed (if there was - any), the cell value is trimmed. (Trimming happens even if - header normalization is off.) -
        3. Then it's converted to lower case. -
        4. Then the following characters are replaced with "_": - space, comma, semicolon, colon.
        5. Then all "__" - and "___" and so on is replaced with a single - "_". -
        - - For example, "Price, old (category: A, B, F): n" will be - normailzed to "price_old", and the type identifier will be - n.
        -
      • -
      - - - -
        -
      • -

        getNormalizeHeaders

        -
        public boolean getNormalizeHeaders()
        -
      • -
      - - - -
        -
      • -

        setTrimCells

        -
        public void setTrimCells(boolean trimCells)
        -
        Specifies if all cells will be trimmed. - Trimming means the removal of all leading and trailing white-space. - Defaults to false.
        -
      • -
      - - - -
        -
      • -

        getTrimCells

        -
        public boolean getTrimCells()
        -
      • -
      - - - -
        -
      • -

        setEmptyValues

        -
        public void setEmptyValues(String[] emptyValues)
        -
        Specifies the list of cell values that will be replaced with an empty - (0 length) string. Typical such values are "-" or - "N/A". The comparison is case-sensitice. When - getTrimCells() is true, the comparison occurs - after the trimming. The replacement occurs before type conversions (for - typed columns). Header values will not be affected by this property. - Defaults to null, i.e., no replacement.
        -
      • -
      - - - -
        -
      • -

        getEmptyValues

        -
        public String[] getEmptyValues()
        -
      • -
      - - - -
        -
      • -

        getAltFalse

        -
        public String getAltFalse()
        -
      • -
      - - - -
        -
      • -

        setAltFalse

        -
        public void setAltFalse(String altFalse)
        -
        Alternative word used to indicate boolean false in the CSV file. - Use null if you don't need alternative value. - Defaults to null.
        -
      • -
      - - - -
        -
      • -

        getAltTrue

        -
        public String getAltTrue()
        -
      • -
      - - - -
        -
      • -

        setAltTrue

        -
        public void setAltTrue(String altTrue)
        -
        Alternative word used to indicate boolean true in the CSV file. - Use null if you don't need alternative value. - Defaults to null.
        -
      • -
      - - - -
        -
      • -

        getDateFormatPattern

        -
        public String getDateFormatPattern()
        -
      • -
      - - - - - - - -
        -
      • -

        getDateTimeFormatPattern

        -
        public String getDateTimeFormatPattern()
        -
      • -
      - - - - - - - -
        -
      • -

        getDecimalSeparator

        -
        public char getDecimalSeparator()
        -
      • -
      - - - -
        -
      • -

        setDecimalSeparator

        -
        public void setDecimalSeparator(char decimalSeparator)
        -
        Sets the alternative symbol used for the decimal dot in - the file for numbers. Note that dot will be always assumed as - decimal separator, except if groupingSeparator is set to dot.
        -
      • -
      - - - -
        -
      • -

        getGroupingSeparator

        -
        public char getGroupingSeparator()
        -
      • -
      - - - -
        -
      • -

        setGroupingSeparator

        -
        public void setGroupingSeparator(char groupingSeparator)
        -
        Set the grouping separator symbol used for grouping in the file - for numbers. Use 0 ('\0') if you don't use grouping. - Defaults to 0.
        -
      • -
      - - - -
        -
      • -

        getSeparator

        -
        public char getSeparator()
        -
      • -
      - - - -
        -
      • -

        setSeparator

        -
        public void setSeparator(char separator)
        -
        Separator char between cloumns. Defaults to semi-colon (;).
        -
      • -
      - - - -
        -
      • -

        getTimeFormatPattern

        -
        public String getTimeFormatPattern()
        -
      • -
      - - - - - - - -
        -
      • -

        getTimeZone

        -
        public TimeZone getTimeZone()
        -
      • -
      - - - -
        -
      • -

        setTimeZone

        -
        public void setTimeZone(TimeZone timeZone)
        -
        Sets the time zone used for parsing date/time/date-time that does not - specify a time zone explicitly. If null, the default time - zone of the computer is used.
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONArrayNode.html b/fmpp/docs/api/fmpp/models/JSONArrayNode.html deleted file mode 100644 index 7debfcd..0000000 --- a/fmpp/docs/api/fmpp/models/JSONArrayNode.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - -JSONArrayNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONArrayNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONBooleanNode.html b/fmpp/docs/api/fmpp/models/JSONBooleanNode.html deleted file mode 100644 index 6880fb0..0000000 --- a/fmpp/docs/api/fmpp/models/JSONBooleanNode.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - -JSONBooleanNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONBooleanNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONNode.html b/fmpp/docs/api/fmpp/models/JSONNode.html deleted file mode 100644 index 7225454..0000000 --- a/fmpp/docs/api/fmpp/models/JSONNode.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - -JSONNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONNullNode.html b/fmpp/docs/api/fmpp/models/JSONNullNode.html deleted file mode 100644 index 873a06d..0000000 --- a/fmpp/docs/api/fmpp/models/JSONNullNode.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - -JSONNullNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONNullNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONNumberNode.html b/fmpp/docs/api/fmpp/models/JSONNumberNode.html deleted file mode 100644 index c024403..0000000 --- a/fmpp/docs/api/fmpp/models/JSONNumberNode.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - -JSONNumberNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONNumberNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONObjectNode.html b/fmpp/docs/api/fmpp/models/JSONObjectNode.html deleted file mode 100644 index 51582b5..0000000 --- a/fmpp/docs/api/fmpp/models/JSONObjectNode.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - -JSONObjectNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONObjectNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/JSONStringNode.html b/fmpp/docs/api/fmpp/models/JSONStringNode.html deleted file mode 100644 index 06503f4..0000000 --- a/fmpp/docs/api/fmpp/models/JSONStringNode.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - -JSONStringNode (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class JSONStringNode

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/NewWritableHashMethod.html b/fmpp/docs/api/fmpp/models/NewWritableHashMethod.html deleted file mode 100644 index ec6dbde..0000000 --- a/fmpp/docs/api/fmpp/models/NewWritableHashMethod.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - -NewWritableHashMethod (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class NewWritableHashMethod

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/NewWritableSequenceMethod.html b/fmpp/docs/api/fmpp/models/NewWritableSequenceMethod.html deleted file mode 100644 index ffe496c..0000000 --- a/fmpp/docs/api/fmpp/models/NewWritableSequenceMethod.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - -NewWritableSequenceMethod (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class NewWritableSequenceMethod

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/RemoveTransform.html b/fmpp/docs/api/fmpp/models/RemoveTransform.html deleted file mode 100644 index f60513f..0000000 --- a/fmpp/docs/api/fmpp/models/RemoveTransform.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -RemoveTransform (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class RemoveTransform

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/SetTransform.html b/fmpp/docs/api/fmpp/models/SetTransform.html deleted file mode 100644 index b3aa6c5..0000000 --- a/fmpp/docs/api/fmpp/models/SetTransform.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - -SetTransform (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class SetTransform

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/StringArraySequence.html b/fmpp/docs/api/fmpp/models/StringArraySequence.html deleted file mode 100644 index c1d5896..0000000 --- a/fmpp/docs/api/fmpp/models/StringArraySequence.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - -StringArraySequence (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class StringArraySequence

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    TemplateModel, TemplateSequenceModel
    -
    -
    -
    -
    public class StringArraySequence
    -extends Object
    -implements TemplateSequenceModel
    -
    Sequence variable implementation that wraps a String[] with relatively low - resource utilization. Warning: it does not copy the wrapped array, so do - not modify that after the model was made!
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/TemplateModelArrayCollection.html b/fmpp/docs/api/fmpp/models/TemplateModelArrayCollection.html deleted file mode 100644 index 0524697..0000000 --- a/fmpp/docs/api/fmpp/models/TemplateModelArrayCollection.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - -TemplateModelArrayCollection (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class TemplateModelArrayCollection

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/TemplateModelListCollection.html b/fmpp/docs/api/fmpp/models/TemplateModelListCollection.html deleted file mode 100644 index 391dad8..0000000 --- a/fmpp/docs/api/fmpp/models/TemplateModelListCollection.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - -TemplateModelListCollection (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class TemplateModelListCollection

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/TemplateModelListSequence.html b/fmpp/docs/api/fmpp/models/TemplateModelListSequence.html deleted file mode 100644 index c634603..0000000 --- a/fmpp/docs/api/fmpp/models/TemplateModelListSequence.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - -TemplateModelListSequence (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class TemplateModelListSequence

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    TemplateModel, TemplateSequenceModel
    -
    -
    -
    -
    public class TemplateModelListSequence
    -extends Object
    -implements TemplateSequenceModel
    -
    Sequence that wraps a java.util.List of already wrapped objects - directly, with minimal resource usage. Warning! It does not copy the original - list.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/TemplateModelUtils.html b/fmpp/docs/api/fmpp/models/TemplateModelUtils.html deleted file mode 100644 index 1093f48..0000000 --- a/fmpp/docs/api/fmpp/models/TemplateModelUtils.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - -TemplateModelUtils (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class TemplateModelUtils

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/WritableHash.html b/fmpp/docs/api/fmpp/models/WritableHash.html deleted file mode 100644 index 807c362..0000000 --- a/fmpp/docs/api/fmpp/models/WritableHash.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - -WritableHash (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class WritableHash

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/WritableSequence.html b/fmpp/docs/api/fmpp/models/WritableSequence.html deleted file mode 100644 index edadbc6..0000000 --- a/fmpp/docs/api/fmpp/models/WritableSequence.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - -WritableSequence (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.models
-

Class WritableSequence

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/AddTransform.html b/fmpp/docs/api/fmpp/models/class-use/AddTransform.html deleted file mode 100644 index dd989a5..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/AddTransform.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.AddTransform (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.AddTransform

-
-
No usage of fmpp.models.AddTransform
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/ClearTransform.html b/fmpp/docs/api/fmpp/models/class-use/ClearTransform.html deleted file mode 100644 index 2fc523f..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/ClearTransform.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.ClearTransform (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.ClearTransform

-
-
No usage of fmpp.models.ClearTransform
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/CopyWritableVariableMethod.html b/fmpp/docs/api/fmpp/models/class-use/CopyWritableVariableMethod.html deleted file mode 100644 index 9752381..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/CopyWritableVariableMethod.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.CopyWritableVariableMethod (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.CopyWritableVariableMethod

-
-
No usage of fmpp.models.CopyWritableVariableMethod
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/CsvSequence.html b/fmpp/docs/api/fmpp/models/class-use/CsvSequence.html deleted file mode 100644 index 36bbebd..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/CsvSequence.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.CsvSequence (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.CsvSequence

-
-
No usage of fmpp.models.CsvSequence
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONArrayNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONArrayNode.html deleted file mode 100644 index dd9c449..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONArrayNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONArrayNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONArrayNode

-
-
No usage of fmpp.models.JSONArrayNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONBooleanNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONBooleanNode.html deleted file mode 100644 index 58dfeee..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONBooleanNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONBooleanNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONBooleanNode

-
-
No usage of fmpp.models.JSONBooleanNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONNode.html deleted file mode 100644 index 9985751..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONNode.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONNode

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONNullNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONNullNode.html deleted file mode 100644 index f9fe53d..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONNullNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONNullNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONNullNode

-
-
No usage of fmpp.models.JSONNullNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONNumberNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONNumberNode.html deleted file mode 100644 index cb6f6fd..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONNumberNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONNumberNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONNumberNode

-
-
No usage of fmpp.models.JSONNumberNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONObjectNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONObjectNode.html deleted file mode 100644 index 20f78a8..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONObjectNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONObjectNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONObjectNode

-
-
No usage of fmpp.models.JSONObjectNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/JSONStringNode.html b/fmpp/docs/api/fmpp/models/class-use/JSONStringNode.html deleted file mode 100644 index 66c0dc8..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/JSONStringNode.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.JSONStringNode (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.JSONStringNode

-
-
No usage of fmpp.models.JSONStringNode
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/NewWritableHashMethod.html b/fmpp/docs/api/fmpp/models/class-use/NewWritableHashMethod.html deleted file mode 100644 index b89f883..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/NewWritableHashMethod.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.NewWritableHashMethod (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.NewWritableHashMethod

-
-
No usage of fmpp.models.NewWritableHashMethod
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/NewWritableSequenceMethod.html b/fmpp/docs/api/fmpp/models/class-use/NewWritableSequenceMethod.html deleted file mode 100644 index 81c1099..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/NewWritableSequenceMethod.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.NewWritableSequenceMethod (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.NewWritableSequenceMethod

-
-
No usage of fmpp.models.NewWritableSequenceMethod
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/RemoveTransform.html b/fmpp/docs/api/fmpp/models/class-use/RemoveTransform.html deleted file mode 100644 index 85adc8c..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/RemoveTransform.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.RemoveTransform (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.RemoveTransform

-
-
No usage of fmpp.models.RemoveTransform
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/SetTransform.html b/fmpp/docs/api/fmpp/models/class-use/SetTransform.html deleted file mode 100644 index 63ea66d..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/SetTransform.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.SetTransform (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.SetTransform

-
-
No usage of fmpp.models.SetTransform
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/StringArraySequence.html b/fmpp/docs/api/fmpp/models/class-use/StringArraySequence.html deleted file mode 100644 index d39fd4a..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/StringArraySequence.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.StringArraySequence (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.StringArraySequence

-
-
No usage of fmpp.models.StringArraySequence
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/TemplateModelArrayCollection.html b/fmpp/docs/api/fmpp/models/class-use/TemplateModelArrayCollection.html deleted file mode 100644 index 4b2a324..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/TemplateModelArrayCollection.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.TemplateModelArrayCollection (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.TemplateModelArrayCollection

-
-
No usage of fmpp.models.TemplateModelArrayCollection
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/TemplateModelListCollection.html b/fmpp/docs/api/fmpp/models/class-use/TemplateModelListCollection.html deleted file mode 100644 index c896f3f..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/TemplateModelListCollection.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.TemplateModelListCollection (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.TemplateModelListCollection

-
-
No usage of fmpp.models.TemplateModelListCollection
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/TemplateModelListSequence.html b/fmpp/docs/api/fmpp/models/class-use/TemplateModelListSequence.html deleted file mode 100644 index b42dffb..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/TemplateModelListSequence.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.TemplateModelListSequence (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.TemplateModelListSequence

-
-
No usage of fmpp.models.TemplateModelListSequence
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/TemplateModelUtils.html b/fmpp/docs/api/fmpp/models/class-use/TemplateModelUtils.html deleted file mode 100644 index 95a8937..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/TemplateModelUtils.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - -Uses of Class fmpp.models.TemplateModelUtils (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.TemplateModelUtils

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/WritableHash.html b/fmpp/docs/api/fmpp/models/class-use/WritableHash.html deleted file mode 100644 index 60e07b0..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/WritableHash.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.WritableHash (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.WritableHash

-
-
No usage of fmpp.models.WritableHash
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/class-use/WritableSequence.html b/fmpp/docs/api/fmpp/models/class-use/WritableSequence.html deleted file mode 100644 index 0450767..0000000 --- a/fmpp/docs/api/fmpp/models/class-use/WritableSequence.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.models.WritableSequence (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.models.WritableSequence

-
-
No usage of fmpp.models.WritableSequence
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/package-frame.html b/fmpp/docs/api/fmpp/models/package-frame.html deleted file mode 100644 index 6688f0b..0000000 --- a/fmpp/docs/api/fmpp/models/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - -fmpp.models (FMPP 0.9.15 API) - - - - - -

fmpp.models

- - - diff --git a/fmpp/docs/api/fmpp/models/package-summary.html b/fmpp/docs/api/fmpp/models/package-summary.html deleted file mode 100644 index d465eea..0000000 --- a/fmpp/docs/api/fmpp/models/package-summary.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - -fmpp.models (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.models

-
-
freemarker.template.TemplateModel implementations.
-
-

See: Description

-
-
- - - - -

Package fmpp.models Description

-

freemarker.template.TemplateModel implementations.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/package-tree.html b/fmpp/docs/api/fmpp/models/package-tree.html deleted file mode 100644 index 3662f4c..0000000 --- a/fmpp/docs/api/fmpp/models/package-tree.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -fmpp.models Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.models

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/models/package-use.html b/fmpp/docs/api/fmpp/models/package-use.html deleted file mode 100644 index b61c828..0000000 --- a/fmpp/docs/api/fmpp/models/package-use.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Package fmpp.models (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.models

-
-
-
    -
  • - - - - - - - - - - - - -
    Packages that use fmpp.models 
    PackageDescription
    fmpp.models -
    freemarker.template.TemplateModel implementations.
    -
    -
  • -
  • - - - - - - - - - - - - - - - -
    Classes in fmpp.models used by fmpp.models 
    Class and Description
    JSONNode -
    Node in a hierarchy of JSON values.
    -
    TemplateModelUtils -
    Constains utility methods for transform and method variable implementation.
    -
    -
  • -
-
- - - - - - diff --git a/fmpp/docs/api/fmpp/package-frame.html b/fmpp/docs/api/fmpp/package-frame.html deleted file mode 100644 index bcb4047..0000000 --- a/fmpp/docs/api/fmpp/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - -fmpp (FMPP 0.9.15 API) - - - - - -

fmpp

- - - diff --git a/fmpp/docs/api/fmpp/package-summary.html b/fmpp/docs/api/fmpp/package-summary.html deleted file mode 100644 index b26dcbc..0000000 --- a/fmpp/docs/api/fmpp/package-summary.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - -fmpp (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp

-
-
The very core, the foundation of FMPP.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - -
    Interface Summary 
    InterfaceDescription
    LocalDataBuilder -
    Contains callback to build the local data for a file processing.
    -
    ProgressListener -
    Interface to monitor the events of an Engine.
    -
    TemplateDataModelBuilderDeprecated -
    Use LocalDataBuilder instead.
    -
    -
  • -
  • - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    Engine -
    The bare-bone, low-level preprocessor engine.
    -
    TemplateEnvironment -
    The runtime FMPP environment of an executing template.
    -
    XmlRenderingConfiguration -
    Stores options that describe when and how to process an XML file in - "renderXml" processing mode.
    -
    -
  • -
  • - - - - - - - - - - - - - - - - -
    Exception Summary 
    ExceptionDescription
    DataModelBuildingException -
    Error while trying to build the data-model for a template.
    -
    ProcessingException -
    Error while performing the processing session.
    -
    -
  • -
- - - -

Package fmpp Description

-

The very core, the foundation of FMPP.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/package-tree.html b/fmpp/docs/api/fmpp/package-tree.html deleted file mode 100644 index e7192bd..0000000 --- a/fmpp/docs/api/fmpp/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -fmpp Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/package-use.html b/fmpp/docs/api/fmpp/package-use.html deleted file mode 100644 index d2b0c3c..0000000 --- a/fmpp/docs/api/fmpp/package-use.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - -Uses of Package fmpp (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/AntProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/AntProgressListener.html deleted file mode 100644 index d41a94f..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/AntProgressListener.html +++ /dev/null @@ -1,369 +0,0 @@ - - - - - - -AntProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.progresslisteners
-

Class AntProgressListener

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntProgressListener

        -
        public AntProgressListener(org.apache.tools.ant.Task antTask)
        -
        Output will be printed to the stdout.
        -
      • -
      - - - -
        -
      • -

        AntProgressListener

        -
        public AntProgressListener(org.apache.tools.ant.Task antTask,
        -                           boolean quiet)
        -
        -
        Parameters:
        -
        quiet - If true, only error and warning messages will be printed.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -
        Description copied from interface: ProgressListener
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        -
      • -
      - - - -
        -
      • -

        getErrorCount

        -
        public int getErrorCount()
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/ConsoleProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/ConsoleProgressListener.html deleted file mode 100644 index b7ba3f7..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/ConsoleProgressListener.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - -ConsoleProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.progresslisteners
-

Class ConsoleProgressListener

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    ProgressListener
    -
    -
    -
    -
    public class ConsoleProgressListener
    -extends Object
    -implements ProgressListener
    -
    Designed to show the progress on console screen.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConsoleProgressListener

        -
        public ConsoleProgressListener()
        -
        Output will be printed to the stdout.
        -
      • -
      - - - -
        -
      • -

        ConsoleProgressListener

        -
        public ConsoleProgressListener(OutputStream out)
        -
      • -
      - - - -
        -
      • -

        ConsoleProgressListener

        -
        public ConsoleProgressListener(PrintWriter out)
        -
      • -
      - - - -
        -
      • -

        ConsoleProgressListener

        -
        public ConsoleProgressListener(OutputStream out,
        -                               boolean quiet)
        -
        -
        Parameters:
        -
        quiet - Print warnings and skipped errors only
        -
        -
      • -
      - - - -
        -
      • -

        ConsoleProgressListener

        -
        public ConsoleProgressListener(PrintWriter out,
        -                               boolean quiet)
        -
        -
        Parameters:
        -
        quiet - Print warnings and skipped errors only
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -
        Description copied from interface: ProgressListener
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/LoggerProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/LoggerProgressListener.html deleted file mode 100644 index 7a4c086..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/LoggerProgressListener.html +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - -LoggerProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.progresslisteners
-

Class LoggerProgressListener

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    ProgressListener
    -
    -
    -
    -
    public class LoggerProgressListener
    -extends Object
    -implements ProgressListener
    -
    Writes detailed information about errors and warning messages into a file - or into any character stream.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LoggerProgressListener

        -
        public LoggerProgressListener()
        -
        Output will be printed to the stderr.
        -
      • -
      - - - -
        -
      • -

        LoggerProgressListener

        -
        public LoggerProgressListener(OutputStream out)
        -
      • -
      - - - -
        -
      • -

        LoggerProgressListener

        -
        public LoggerProgressListener(PrintWriter out)
        -
      • -
      - - - - - - - -
        -
      • -

        LoggerProgressListener

        -
        public LoggerProgressListener(File logFile,
        -                              boolean append)
        -                       throws IOException
        -
        -
        Throws:
        -
        IOException
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -
        Description copied from interface: ProgressListener
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        -
      • -
      - - - -
        -
      • -

        getPrintWriter

        -
        public PrintWriter getPrintWriter()
        -
        Returns the PrintWriter used for printing into the log.
        -
      • -
      - - - -
        -
      • -

        close

        -
        public void close()
        -
        Closes the PrintWriter used for printing into the log.
        -
      • -
      - - - -
        -
      • -

        flush

        -
        public void flush()
        -
        Flushes the PrintWriter used for printing into the log.
        -
      • -
      - - - -
        -
      • -

        printlnNW

        -
        public void printlnNW(String text)
        -
        Prints into the log without word-wrapping.
        -
      • -
      - - - -
        -
      • -

        printNW

        -
        public void printNW(String text)
        -
        Prints into the log without word-wrapping.
        -
      • -
      - - - -
        -
      • -

        println

        -
        public void println()
        -
        Prints line-break into the log.
        -
      • -
      - - - -
        -
      • -

        println

        -
        public void println(Object obj)
        -
        Prints into the log with word-wrapping.
        -
      • -
      - - - -
        -
      • -

        println

        -
        public void println(String text)
        -
        Prints into the log with word-wrapping.
        -
      • -
      - - - -
        -
      • -

        println

        -
        public void println(String text,
        -                    int indent)
        -
        Prints into the log with word-wrapping and indentation.
        -
      • -
      - - - -
        -
      • -

        printStackTrace

        -
        public void printStackTrace(Throwable exc)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/StatisticsProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/StatisticsProgressListener.html deleted file mode 100644 index a630f83..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/StatisticsProgressListener.html +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - -StatisticsProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.progresslisteners
-

Class StatisticsProgressListener

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    ProgressListener
    -
    -
    -
    -
    public class StatisticsProgressListener
    -extends Object
    -implements ProgressListener
    -
    Spins some counters regarding the work of the Engine. - All methods of this listener can be called from multiple threads. The current - state of counters can be read while the engine is working.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StatisticsProgressListener

        -
        public StatisticsProgressListener()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -
        Description copied from interface: ProgressListener
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        -
      • -
      - - - -
        -
      • -

        reset

        -
        public void reset()
        -
        Rests all counters.
        -
      • -
      - - - -
        -
      • -

        getProcessingTime

        -
        public long getProcessingTime()
        -
        The duration of the last - BEGIN_ALL_PROCESSING-END_ALL_PROCESSING - in milliseconds, or -1 if that is not known.
        -
      • -
      - - - -
        -
      • -

        getCopied

        -
        public int getCopied()
        -
        Number of files successfully copied.
        -
      • -
      - - - -
        -
      • -

        getExecuted

        -
        public int getExecuted()
        -
        Number of files successfully executed (templates).
        -
      • -
      - - - -
        -
      • -

        getXmlRendered

        -
        public int getXmlRendered()
        -
        Number of XML files successfully rendered.
        -
      • -
      - - - -
        -
      • -

        getFailed

        -
        public int getFailed()
        -
        Number of files where processing was failed.
        -
      • -
      - - - -
        -
      • -

        getSuccesful

        -
        public int getSuccesful()
        -
        Number of files where processing was successfull.
        -
      • -
      - - - -
        -
      • -

        getAccessed

        -
        public int getAccessed()
        -
        Number of files that the engine has tried to process.
        -
      • -
      - - - -
        -
      • -

        getWarnings

        -
        public int getWarnings()
        -
        Total number of warnings.
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/TerseConsoleProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/TerseConsoleProgressListener.html deleted file mode 100644 index a2dce03..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/TerseConsoleProgressListener.html +++ /dev/null @@ -1,363 +0,0 @@ - - - - - - -TerseConsoleProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.progresslisteners
-

Class TerseConsoleProgressListener

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • fmpp.progresslisteners.TerseConsoleProgressListener
    • -
    -
  • -
-
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    ProgressListener
    -
    -
    -
    -
    public class TerseConsoleProgressListener
    -extends Object
    -implements ProgressListener
    -
    Designed to show the progress on console screen in a - very terse way (prints a symbol for each processed file).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TerseConsoleProgressListener

        -
        public TerseConsoleProgressListener()
        -
        Output will be printed to the stdout.
        -
      • -
      - - - -
        -
      • -

        TerseConsoleProgressListener

        -
        public TerseConsoleProgressListener(OutputStream out)
        -
      • -
      - - - -
        -
      • -

        TerseConsoleProgressListener

        -
        public TerseConsoleProgressListener(PrintWriter out)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        notifyProgressEvent

        -
        public void notifyProgressEvent(Engine engine,
        -                                int event,
        -                                File src,
        -                                int pMode,
        -                                Throwable error,
        -                                Object param)
        -
        Description copied from interface: ProgressListener
        -
        Method called be the engine to notify events. - -

        It is guaranteed that this method will not be called concurrently - as far as the listener is added to a single Engine instance - only.

        -
        -
        Specified by:
        -
        notifyProgressEvent in interface ProgressListener
        -
        Parameters:
        -
        engine - The engine instance where the event has occurred.
        -
        event - The code of the event: an EVENT_... constant. - As new event types can be introduced with new FMPP versions (even if - it happens very seldom), a progress listener implementation should - survive events that it does not understand. That is, it must not stop - with an error, but it should silently ignore the event.
        -
        src - Depending on event the source file or null.
        -
        pMode - Depending on event the proccessing mode - (Engine.PMODE_... constant) or - Engine.PMODE_NONE. Note that new processing modes may - be added as FMPP evolvers, so values that are not known be the - progress listener should be handler nicely, and never cause error.
        -
        error - The error, or null if there was no error.
        -
        param - Extra information about the event. The class and meaning of - object depends on the concrete event: -
          -
        • For EVENT_WARNING it is a String that - describles the reason of warning. -
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/class-use/AntProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/class-use/AntProgressListener.html deleted file mode 100644 index 0d9ede4..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/class-use/AntProgressListener.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.progresslisteners.AntProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.progresslisteners.AntProgressListener

-
-
No usage of fmpp.progresslisteners.AntProgressListener
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/class-use/ConsoleProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/class-use/ConsoleProgressListener.html deleted file mode 100644 index c5e1fed..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/class-use/ConsoleProgressListener.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.progresslisteners.ConsoleProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.progresslisteners.ConsoleProgressListener

-
-
No usage of fmpp.progresslisteners.ConsoleProgressListener
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/class-use/LoggerProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/class-use/LoggerProgressListener.html deleted file mode 100644 index b93b32f..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/class-use/LoggerProgressListener.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.progresslisteners.LoggerProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.progresslisteners.LoggerProgressListener

-
-
No usage of fmpp.progresslisteners.LoggerProgressListener
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/class-use/StatisticsProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/class-use/StatisticsProgressListener.html deleted file mode 100644 index 3d1e96a..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/class-use/StatisticsProgressListener.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.progresslisteners.StatisticsProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.progresslisteners.StatisticsProgressListener

-
-
No usage of fmpp.progresslisteners.StatisticsProgressListener
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/class-use/TerseConsoleProgressListener.html b/fmpp/docs/api/fmpp/progresslisteners/class-use/TerseConsoleProgressListener.html deleted file mode 100644 index 2f4e515..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/class-use/TerseConsoleProgressListener.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.progresslisteners.TerseConsoleProgressListener (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.progresslisteners.TerseConsoleProgressListener

-
-
No usage of fmpp.progresslisteners.TerseConsoleProgressListener
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/package-frame.html b/fmpp/docs/api/fmpp/progresslisteners/package-frame.html deleted file mode 100644 index 91defe8..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/package-frame.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -fmpp.progresslisteners (FMPP 0.9.15 API) - - - - - -

fmpp.progresslisteners

- - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/package-summary.html b/fmpp/docs/api/fmpp/progresslisteners/package-summary.html deleted file mode 100644 index 64548ff..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/package-summary.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - -fmpp.progresslisteners (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.progresslisteners

-
-
fmpp.ProgressListener implementations.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    AntProgressListener -
    Designed to show the progress for Ant tasks.
    -
    ConsoleProgressListener -
    Designed to show the progress on console screen.
    -
    LoggerProgressListener -
    Writes detailed information about errors and warning messages into a file - or into any character stream.
    -
    StatisticsProgressListener -
    Spins some counters regarding the work of the Engine.
    -
    TerseConsoleProgressListener -
    Designed to show the progress on console screen in a - very terse way (prints a symbol for each processed file).
    -
    -
  • -
- - - -

Package fmpp.progresslisteners Description

-

fmpp.ProgressListener implementations.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/package-tree.html b/fmpp/docs/api/fmpp/progresslisteners/package-tree.html deleted file mode 100644 index 019cec3..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/package-tree.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -fmpp.progresslisteners Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.progresslisteners

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/progresslisteners/package-use.html b/fmpp/docs/api/fmpp/progresslisteners/package-use.html deleted file mode 100644 index 05cd4b3..0000000 --- a/fmpp/docs/api/fmpp/progresslisteners/package-use.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Package fmpp.progresslisteners (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.progresslisteners

-
-
No usage of fmpp.progresslisteners
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/FileWithConfigurationBase.html b/fmpp/docs/api/fmpp/setting/FileWithConfigurationBase.html deleted file mode 100644 index b50930e..0000000 --- a/fmpp/docs/api/fmpp/setting/FileWithConfigurationBase.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - -FileWithConfigurationBase (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.setting
-

Class FileWithConfigurationBase

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable, Comparable<File>
    -
    -
    -
    -
    public class FileWithConfigurationBase
    -extends FileWithSettingValue
    -
    File that stores the current configuration base directory at - the time it was instantiated. This extra information is - needed if the path may need or need not be resolved relatively to the - configuration base later, depending on factors that are not known when - the setting value is set.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FileWithConfigurationBase

        -
        public FileWithConfigurationBase(File configurationBase,
        -                                 String path,
        -                                 String settingValue)
        -
        Creates a new instance. - The path will not be resolved relatively to the - configurationBase. If it was a relative path, then - it remains that.
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/setting/FileWithSettingValue.html b/fmpp/docs/api/fmpp/setting/FileWithSettingValue.html deleted file mode 100644 index 8da8016..0000000 --- a/fmpp/docs/api/fmpp/setting/FileWithSettingValue.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - - -FileWithSettingValue (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.setting
-

Class FileWithSettingValue

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable, Comparable<File>
    -
    -
    -
    Direct Known Subclasses:
    -
    FileWithConfigurationBase
    -
    -
    -
    -
    public class FileWithSettingValue
    -extends File
    -
    File that stores the original setting value (string) it was - constructed from. This extra information is needed, for example, to - display the content of a loaded configuration file for the user.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FileWithSettingValue

        -
        public FileWithSettingValue(File parent,
        -                            String child,
        -                            String settingValue)
        -
      • -
      - - - -
        -
      • -

        FileWithSettingValue

        -
        public FileWithSettingValue(String path,
        -                            String settingValue)
        -
      • -
      - - - -
        -
      • -

        FileWithSettingValue

        -
        public FileWithSettingValue(String parent,
        -                            String child,
        -                            String settingValue)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSettingValue

        -
        public String getSettingValue()
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/setting/SettingException.html b/fmpp/docs/api/fmpp/setting/SettingException.html deleted file mode 100644 index d41de63..0000000 --- a/fmpp/docs/api/fmpp/setting/SettingException.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - -SettingException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.setting
-

Class SettingException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    -
    public class SettingException
    -extends ExceptionCC
    -
    Bad setting or setting combination, or failure when trying to setup the - engine with the settings.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SettingException

        -
        public SettingException(String s)
        -
      • -
      - - - -
        -
      • -

        SettingException

        -
        public SettingException(String s,
        -                        Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/setting/Settings.html b/fmpp/docs/api/fmpp/setting/Settings.html deleted file mode 100644 index 6e4229f..0000000 --- a/fmpp/docs/api/fmpp/setting/Settings.html +++ /dev/null @@ -1,2881 +0,0 @@ - - - - - - -Settings (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.setting
-

Class Settings

-
-
- -
-
    -
  • -
    -
    -
    public class Settings
    -extends Object
    -
    Stores FMPP settings, loads configuration files, provides other setting - handling related utilities. - -

    Settings are typed variables identified with their case-sensitive name. - When you set the value of a setting, the value object you supply must be - of the correct type. See the description of the TYPE_... - to see the available setting types. - -

    Methods that change setting values have a variation - that require String value(s) instead of Object(s). - These methods should be used when you get the setting values from text-only - sources, such as command-line option values, XML attributes or - .properties file. To demonstrate the difference, assume you have - string value "a, b, c". If you try to use this value for a - setting of type list, the normal setter method will interpret the value - as a list of length 1, that stores string "a, b, c". If you - try to use the same value with the string version of the same method, it - will interpret the string as a list of length 3, that stores 3 strings, - "a", "b", and "c". - -

    Notes: -

      -
    • All settings you want to set/get must be defined. See define(java.lang.String, fmpp.setting.Settings.SettingType, boolean, boolean). - Standard settings (the settings documented in the FMPP Manual) are - initially already defined. -
    • If you have used an object as the value of a setting, the object must - not be changed anymore. -
    • If a method throws SettingException, then it is ensured that - the method doesn't change the Settings object. For - example, with add(Map), either all settings in the map will be - successfully set, or neither will be set. -
    - -

    You can execute the processing session described by the setting with - execute().

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS

        -
        public static final String NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        NAME_SQL_DATE_AND_TIME_TIME_ZONE

        -
        public static final String NAME_SQL_DATE_AND_TIME_TIME_ZONE
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        NAME_ALWAYS_CREATE_DIRECTORIES

        -
        public static final String NAME_ALWAYS_CREATE_DIRECTORIES
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        VALUE_OBJECTWRAPPER_SHARED_BEANS_WRAPPER

        -
        public static final String VALUE_OBJECTWRAPPER_SHARED_BEANS_WRAPPER
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        VALUE_TAG_SYNTAX_ANGLE_BRACKET

        -
        public static final String VALUE_TAG_SYNTAX_ANGLE_BRACKET
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        VALUE_TAG_SYNTAX_SQUARE_BRACKET

        -
        public static final String VALUE_TAG_SYNTAX_SQUARE_BRACKET
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - - - - - - - - - - - - - -
        -
      • -

        VALUE_XML_CATALOG_PREFER_PUBLIC

        -
        public static final String VALUE_XML_CATALOG_PREFER_PUBLIC
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        VALUE_XML_CATALOG_PREFER_SYSTEM

        -
        public static final String VALUE_XML_CATALOG_PREFER_SYSTEM
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - - - - - -
        -
      • -

        DEFAULT_CFG_FILE_NAME

        -
        public static final String DEFAULT_CFG_FILE_NAME
        -
        Primary default file name.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        DEFAULT_CFG_FILE_NAME_OLD

        -
        public static final String DEFAULT_CFG_FILE_NAME_OLD
        -
        Secondary (legacy) default file name.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        TYPE_ANY

        -
        public static final fmpp.setting.Settings.SettingType TYPE_ANY
        -
        Any object. -

        Input type: Object. -

        Output type: Object. -

        String input: any value, stored as is. -

        Merging: not supported.

        -
      • -
      - - - -
        -
      • -

        TYPE_STRING

        -
        public static final fmpp.setting.Settings.SettingType TYPE_STRING
        -
        String setting type. -

        Input type: String, Number, - Boolean. The last two is converted to string with - toString() -

        Output type: String. -

        String input: any value, stored as is. -

        Merging: not supported

        -
      • -
      - - - -
        -
      • -

        TYPE_INTEGER

        -
        public static final fmpp.setting.Settings.SettingType TYPE_INTEGER
        -
        Integer setting type. -

        Input type: Number that can be converted to - Integer without lost. -

        Output type: Integer. -

        String input: any value, that can be parsed to Integer - by Integer.parseInt after trimming. In additional, - redundant + sign is supported. -

        Merging: not supported

        -
      • -
      - - - -
        -
      • -

        TYPE_BOOLEAN

        -
        public static final fmpp.setting.Settings.SettingType TYPE_BOOLEAN
        -
        Boolean setting type. -

        Input type: Boolean. -

        Output type: Boolean. -

        String input: After trimming and converting to lower-case, - "true", "false" or empty - string are allowed. Empty string is interpreted as true - (consider a properties file that contains a key without value). -

        Merging: not supported

        -
      • -
      - - - -
        -
      • -

        TYPE_SEQUENCE

        -
        public static final fmpp.setting.Settings.SettingType TYPE_SEQUENCE
        -
        Sequence setting type. -

        Input type: List, any array, Vector. No - restriction regarding the type of the list items. -

        Output type: List. No restriction regarding the type of - the list items. -

        String input: TDD expression starting in list mode. If the result is - a list that contains a single list, then the contained list will - be used. This heuristic is used to fix this user mistake:
        - --some-list="[a, b, c]"
        - instead of:
        - --some-list="a, b, c" -

        Merging: the two lists are concatenated, with the default (inherited) - value coming last.

        -
      • -
      - - - -
        -
      • -

        TYPE_LOCAL_DATA_MODEL

        -
        public static final fmpp.setting.Settings.SettingType TYPE_LOCAL_DATA_MODEL
        -
        Local data model setting type. - This is the same as TYPE_SEQUENCE, just if the value is given as - text (string input), it defers the evaluation of the hash parameter of - the case function call, and stores that as - Fragment. This is required because that hash parameter - may uses data loaders, which shouldn't be executed until almost all - settings of the Engine are set. This also means that if - you set the setting value with Java, the last parameter to the - case FunctionCall must be a - Fragment instead of Map, if you want to use - data loaders in it.
        -
      • -
      - - - -
        -
      • -

        TYPE_HASH

        -
        public static final fmpp.setting.Settings.SettingType TYPE_HASH
        -
        Hash setting type. -

        Input type: Map, Dictionary. -

        Output type: Map. -

        String input: TDD expression, starting in hash mode. -

        Merging: the two maps are added (union)

        -
      • -
      - - - -
        -
      • -

        TYPE_CFG_RELATIVE_PATH

        -
        public static final fmpp.setting.Settings.SettingType TYPE_CFG_RELATIVE_PATH
        -
        "Configuration relative path" setting type. -

        Input type: String, FileWithSettingValue. - Plain File is not allowed. -

        Output type: FileWithSettingValue. -

        String input: Any value, trimmed before converting. -

        Merging: not supported

        -
      • -
      - - - -
        -
      • -

        TYPE_CFG_RELATIVE_PATHS

        -
        public static final fmpp.setting.Settings.SettingType TYPE_CFG_RELATIVE_PATHS
        -
        "Configuration relative paths" setting type. -

        Input type: Same as for TYPE_SEQUENCE, but all list items - must be string or FileWithSettingValue. -

        Output type: Same as for TYPE_SEQUENCE, but all list items - are FileWithSettingValue-s. -

        String input: Same as for TYPE_SEQUENCE, but all sequence - items must be strings. "force strings" option is on during the TDD - interpretation. -

        Merging: the two list are concatenated.

        -
      • -
      - - - -
        -
      • -

        TYPE_UNRESOLVED_CFG_RELATIVE_PATHS

        -
        public static final fmpp.setting.Settings.SettingType TYPE_UNRESOLVED_CFG_RELATIVE_PATHS
        -
        "Unresolved configuration relative paths" setting type. -

        Input type: Same as for TYPE_SEQUENCE, but all list items - must be string or FileWithConfigurationBase. -

        Output type: Same as for TYPE_SEQUENCE, but all list items - are FileWithConfigurationBase-s. -

        String input: Same as for TYPE_SEQUENCE, but all sequence - items must be strings. "force strings" option is on during the TDD - interpretation. -

        Merging: the two list are concatenated.

        -
      • -
      - - - -
        -
      • -

        TYPE_DATA_MODEL

        -
        public static final fmpp.setting.Settings.SettingType TYPE_DATA_MODEL
        -
        Data model setting type. -

        Input type: Map, Dictionary, - Fragment, - private class DataList. -

        Output type: private class DataList extends - ArrayList. The list may contains: - Map, String, Fragment. -

        String input: TDD expression, starting in hash mode. -

        Merging: The tow lists are concatenated. - -

        This type is used for the "data" setting. The hash value of that - setting can't be generated until the final value of all other setting is - set (because data loaders may use the other settings). This way, the - value of the "data" setting is a List that records the - changes made on the setting, and not a Map. The - Map will be built internally based on the list when you call - execute().

        -
      • -
      - - - -
        -
      • -

        TYPE_HASH_OF_SEQUENCE_OF_CFG_RELATIVE_PATHS

        -
        public static final fmpp.setting.Settings.SettingType TYPE_HASH_OF_SEQUENCE_OF_CFG_RELATIVE_PATHS
        -
        Hash-of-configuration-relative-paths setting type. -

        Input type: Map or Dictionary, that stores - a List or Vector or array, that stores - strings and/or FileWithSettingValue-s. Also, the map may - contains strings and/or FileWithSettingValue directly as - value (instead of a list of length 1 that stores the same value). -

        Output type: Map of List of - FileWithSettingValue-s. -

        String input: TDD expression, starting in hash mode. -

        Merging: the two maps are added (union)

        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Settings

        -
        public Settings(File baseDir)
        -         throws SettingException
        -
        Creates a new instance. The standard settings will be already defined - in the new instance.
        -
        -
        Parameters:
        -
        baseDir - the base directory used to resolve relative paths in - setting names. When you load settings from a configuration file, the - parent directory of the file will be used instenad, for the settings - coming from the file.
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        define

        -
        public void define(String name,
        -                   fmpp.setting.Settings.SettingType type,
        -                   boolean merge,
        -                   boolean forceStr)
        -            throws SettingException
        -
        Defines a new setting. No setting with the same name already exists.
        -
        -
        Parameters:
        -
        name - the name of the setting
        -
        type - the type of the setting
        -
        merge - specifies if when you add a new setting value, and the - setting has already set, then the new and old value will be merged, - or the new value will replace old value. Note that only a few - setting type supports merging, such as list and map.
        -
        forceStr - specifies if when parsing string values with TDD - interpreter, it should be done with the "force strings" option or - not.
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      - - - - - - - -
        -
      • -

        getStandardSettingNames

        -
        public static Iterator getStandardSettingNames()
        -
        Returns if the given name is the name of a standard setting.
        -
      • -
      - - - -
        -
      • -

        add

        -
        public void add(String name,
        -                Object value)
        -         throws SettingException
        -
        Adds a setting value. If a setting value already exists, it will be - either replaced or merged with the new value, depending on the - definition of the setting. When merging, the new value has higher - priority than the old value.
        -
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      - - - -
        -
      • -

        addDefault

        -
        public void addDefault(String name,
        -                       Object value)
        -                throws SettingException
        -
        Adds a setting value with low priority. If a setting value already - exists, it will be either kept (and thus the method call has no effect) - or merged with the new value, depending on the definition of the setting. - When merging, the new value has lower priorty than the old value.
        -
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        set

        -
        public void set(String name,
        -                Object value)
        -         throws SettingException
        -
        Sets the value of a setting. If the setting value already exists, it will - be replaced (never merged).
        -
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        load

        -
        public void load(File cfgFile)
        -          throws SettingException
        -
        Loads settings from a configuration file. The file will be interpreted - as legacy properties file if its extension is cfg or - properties, otherwise it will be interpreted as TDD file. - The settings stored in the configuration file will be added - to the this object with add(Map). - -

        Note that meta-settings ("configurationBase" and - "inheritConfiguration") will not be added to the settings object. - -

        If the setting "configurationBase" or "inheritConfiguration" is - set in this setting object, then they will override the - meta-settings in the file directly loaded with this method. Files - inherited by the directly loaded file, however, are not affected.

        -
        -
        Parameters:
        -
        cfgFile - the configuration file, or the directory of the - configuration file if its file name is one of the - default configuration file names.
        -
        Throws:
        -
        SettingException
        -
        See Also:
        -
        loadDefaults(File)
        -
        -
      • -
      - - - - - - - -
        -
      • -

        get

        -
        public Object get(String name)
        -
        Gets the current value of a setting.
        -
        -
        Parameters:
        -
        name - the name of the setting.
        -
        Returns:
        -
        The value of the setting, or null if the setting - is not set. Do not modify the returned object!
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        public Object remove(String name)
        -
        Removes a setting value.
        -
        -
        Returns:
        -
        the removed value, or null if there was no - value stored for the setting.
        -
        -
      • -
      - - - -
        -
      • -

        getNames

        -
        public Iterator getNames()
        -
        Lists the names of settings that were set.
        -
      • -
      - - - -
        -
      • -

        execute

        -
        public void execute()
        -             throws SettingException,
        -                    ProcessingException
        -
        Executes a processing session based on the setting values. - For each call of this method, a new Engine object will be - internaly created, and initialized based on the setting values, and then - its process method will be called. The method automatically - chooses between bulk and single-file processing, based on the presence of - the "outputFile" setting. - -

        Settings will go throught semantical checks that are not done when - you call other methods. For example, it will be checked if setting - "modes" contains valid mode setter function calls, if "sourceRoot" and - "outputRoot" are defined for bulk mode, if exactly 1 "sources" is defined - for single-file mode, etc. - -

        This method ignores the following settings: - "logFile", "appendLogFile", "echoFormat", "quiet", "snip". - It's the task of the embedding software (the front-end) to interpret - these settings, at least the ones it is interested in. - It usually involves adding progress listeners with - addProgressListener(ProgressListener). - -

        This method can be called for multiple times, but be aware of - that for each call of this method, a new Engine - object will be created and initialized, even if you didn't changed the - settings since the last call. If this overhead is not acceptable - in you case, you can call Engine.process(...) for multiple - times within the same execute() call, by overriding the - doProcessing(Engine, File[], File, File) method. - Also, you can do extra engine initalization there.

        -
        -
        Throws:
        -
        SettingException - if the settings are not correct, or can't be - applied because of some errors occured. This exception, when thrown, - is always thrown before the execution of the processing session is - stated.
        -
        ProcessingException - if Engine.process has - thrown any exception, that is, there was an error during the - execution of the processing session. The message of this exception - holds nothing interesting (just a static text). Call its - getCause() method to get the exception that caused the - termination. Note that all (so even non-checked exceptions) thrown be - the engine are catched and wrapped by this exeption.
        -
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        setEngineAttribute

        -
        public Object setEngineAttribute(String name,
        -                                 Object value)
        -
        Sets an engine attribute. The attribute will be set in the internally - used Engine object when you call execute().
        -
        -
        Returns:
        -
        The previous value of the attribute, or null if - there was no attribute with the given name.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        removeAttribute

        -
        public Object removeAttribute(String name)
        -
        Removes an engine attribute. It does nothing if the attribute does not - exist.
        -
        -
        Returns:
        -
        The value of the removed attribute or null if there - was no attribute with the given name.
        -
        See Also:
        -
        setEngineAttribute(String, Object)
        -
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        getDontTraverseDirectories

        -
        public boolean getDontTraverseDirectories()
        -
      • -
      - - - -
        -
      • -

        dump

        -
        public String dump()
        -
        Dumps the current content of this object for debugging purposes.
        -
      • -
      - - - -
        -
      • -

        quietSettingValueToInt

        -
        public static int quietSettingValueToInt(String value,
        -                                         String name)
        -                                  throws SettingException
        -
        Returns 0 for verbose mode, 1 for quiet mode, 2 for really-quiet mode.
        -
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      - - - -
        -
      • -

        getDefaultConfigurationFile

        -
        public static File getDefaultConfigurationFile(File dir)
        -
        Returns the default configuration file in the directory.
        -
        -
        Returns:
        -
        the absolute file, or null if no default - configuration file exists in the directory.
        -
        -
      • -
      - - - -
        -
      • -

        undashNames

        -
        public void undashNames(Properties props)
        -                 throws SettingException
        -
        Converts legacy dashed setting names to the standard format, as - source-root to sourceRoot.
        -
        -
        Parameters:
        -
        props - the Properties object to convert.
        -
        Throws:
        -
        SettingException - if no setting with the given name exists.
        -
        -
      • -
      - - - -
        -
      • -

        trimValues

        -
        public void trimValues(Properties props)
        -
        Trims all property values.
        -
      • -
      - - - -
        -
      • -

        doProcessing

        -
        protected void doProcessing(Engine eng,
        -                            File[] sources,
        -                            File sourceFile,
        -                            File outputFile)
        -                     throws SettingException,
        -                            ProcessingException
        -
        Executes the processing session(s) on the Engine level, - using the already initialized Engine object. - -

        By overriding this method, you can -

          -
        • call Engine.process(...) for multiple times, so you - can do multiple processing sessions with the same already - initialized Engine object. -
        • do extra Engine initialization. -
        - -

        The inital implementation of this method (that is, the implementation - in the Settings class) is something like this: - -

        - if (outputFile == null) {
        -     eng.process(sources);
        - } else {
        -     eng.process(sourceFile, outputFile);
        - }
        - -

        Modifying the Settings object in this method has no effect on - the Engine object (which is passed in as argument), - since all settings are already applied on it. If you need to modify the - Engine object, call its methods directly. - -

        An implementation of this method may leak out the initialized - Engine object for the caller of execute(). Also, it - may does not call Engine.proccess(...), but left it for the - caller (who has the out-leaked Engine object). These are - extreme, but otherwise legitimate usages.

        -
        -
        Parameters:
        -
        eng - the already initialized Engine object. You may - do extra addjustments on it.
        -
        sources - the list of source files, the parameter to - Engine.process(File[]). It's null if - the processing session uses outputFile setting.
        -
        sourceFile - if the session uses outputFile setting, - then it' the 1st parameter to - Engine.process(File, File), otherwise it is null.
        -
        outputFile - if the session uses outputFile setting, - then it' the 2nd parameter to - Engine.process(File, File), otherwise it is null.
        -
        Throws:
        -
        SettingException
        -
        ProcessingException
        -
        -
      • -
      - - - -
        -
      • -

        getDashedName

        -
        public static String getDashedName(String name)
        -
        Converts mixed-case setting name to dashed form, - as sourceRoot to source-root.
        -
      • -
      - - - -
        -
      • -

        fixVersion08SettingNames

        -
        public static void fixVersion08SettingNames(Properties props)
        -                                     throws SettingException
        -
        Backward compatibility hack: renames properties that use - pre-FMPP 0.9.0 names of settings.
        -
        -
        Throws:
        -
        SettingException
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/setting/class-use/FileWithConfigurationBase.html b/fmpp/docs/api/fmpp/setting/class-use/FileWithConfigurationBase.html deleted file mode 100644 index d299060..0000000 --- a/fmpp/docs/api/fmpp/setting/class-use/FileWithConfigurationBase.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.setting.FileWithConfigurationBase (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.setting.FileWithConfigurationBase

-
-
No usage of fmpp.setting.FileWithConfigurationBase
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/class-use/FileWithSettingValue.html b/fmpp/docs/api/fmpp/setting/class-use/FileWithSettingValue.html deleted file mode 100644 index 2fcc2d6..0000000 --- a/fmpp/docs/api/fmpp/setting/class-use/FileWithSettingValue.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class fmpp.setting.FileWithSettingValue (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.setting.FileWithSettingValue

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/class-use/SettingException.html b/fmpp/docs/api/fmpp/setting/class-use/SettingException.html deleted file mode 100644 index db7f95c..0000000 --- a/fmpp/docs/api/fmpp/setting/class-use/SettingException.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - -Uses of Class fmpp.setting.SettingException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.setting.SettingException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/class-use/Settings.html b/fmpp/docs/api/fmpp/setting/class-use/Settings.html deleted file mode 100644 index 124faad..0000000 --- a/fmpp/docs/api/fmpp/setting/class-use/Settings.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.setting.Settings (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.setting.Settings

-
-
No usage of fmpp.setting.Settings
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/package-frame.html b/fmpp/docs/api/fmpp/setting/package-frame.html deleted file mode 100644 index 5c7f1ce..0000000 --- a/fmpp/docs/api/fmpp/setting/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - -fmpp.setting (FMPP 0.9.15 API) - - - - - -

fmpp.setting

- - - diff --git a/fmpp/docs/api/fmpp/setting/package-summary.html b/fmpp/docs/api/fmpp/setting/package-summary.html deleted file mode 100644 index 599d2f6..0000000 --- a/fmpp/docs/api/fmpp/setting/package-summary.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - -fmpp.setting (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.setting

-
-
FMPP settings.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    FileWithConfigurationBase -
    File that stores the current configuration base directory at - the time it was instantiated.
    -
    FileWithSettingValue -
    File that stores the original setting value (string) it was - constructed from.
    -
    Settings -
    Stores FMPP settings, loads configuration files, provides other setting - handling related utilities.
    -
    -
  • -
  • - - - - - - - - - - - - -
    Exception Summary 
    ExceptionDescription
    SettingException -
    Bad setting or setting combination, or failure when trying to setup the - engine with the settings.
    -
    -
  • -
- - - -

Package fmpp.setting Description

-

FMPP settings. FMPP settings is an abstraction over the FMPP core that - helps to write tools (front-ends) that can share configuration information, and - has similar setup rules from the view point of tool user.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/package-tree.html b/fmpp/docs/api/fmpp/setting/package-tree.html deleted file mode 100644 index acb5fb2..0000000 --- a/fmpp/docs/api/fmpp/setting/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -fmpp.setting Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.setting

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/setting/package-use.html b/fmpp/docs/api/fmpp/setting/package-use.html deleted file mode 100644 index 4767775..0000000 --- a/fmpp/docs/api/fmpp/setting/package-use.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - -Uses of Package fmpp.setting (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.setting

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/DataLoader.html b/fmpp/docs/api/fmpp/tdd/DataLoader.html deleted file mode 100644 index 0874725..0000000 --- a/fmpp/docs/api/fmpp/tdd/DataLoader.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - -DataLoader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Interface DataLoader

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        load

        -
        Object load(Engine e,
        -            List args)
        -     throws Exception
        -
        -
        Parameters:
        -
        args - Arguments that the caller specifies for this directive call. - Not null. - The implementation should check if it understands all arguments, - and it should throw java.lang.IllegalArgumentException - if it doesn't.
        -
        Returns:
        -
        The object that will be accessed in FreeMarker templates. - The object can be of any type. FreeMarker will wrap the object so - that it is visible as an FTL variable. However, if the object - implements freemarker.template.TemplateModel, then it - will not be wrapped, as it is already an FTL variable.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/DataLoaderEvaluationEnvironment.html b/fmpp/docs/api/fmpp/tdd/DataLoaderEvaluationEnvironment.html deleted file mode 100644 index 82d54d7..0000000 --- a/fmpp/docs/api/fmpp/tdd/DataLoaderEvaluationEnvironment.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - -DataLoaderEvaluationEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class DataLoaderEvaluationEnvironment

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/EvalException.html b/fmpp/docs/api/fmpp/tdd/EvalException.html deleted file mode 100644 index 245c97c..0000000 --- a/fmpp/docs/api/fmpp/tdd/EvalException.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - -EvalException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class EvalException

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        EvalException

        -
        public EvalException(String message)
        -
      • -
      - - - -
        -
      • -

        EvalException

        -
        public EvalException(String message,
        -                     Throwable cause)
        -
      • -
      - - - -
        -
      • -

        EvalException

        -
        public EvalException(String message,
        -                     int position)
        -
      • -
      - - - -
        -
      • -

        EvalException

        -
        public EvalException(String message,
        -                     int position,
        -                     Throwable cause)
        -
      • -
      - - - -
        -
      • -

        EvalException

        -
        public EvalException(String message,
        -                     String text,
        -                     int position,
        -                     String fileName)
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/EvaluationEnvironment.html b/fmpp/docs/api/fmpp/tdd/EvaluationEnvironment.html deleted file mode 100644 index 48202ab..0000000 --- a/fmpp/docs/api/fmpp/tdd/EvaluationEnvironment.html +++ /dev/null @@ -1,565 +0,0 @@ - - - - - - -EvaluationEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Interface EvaluationEnvironment

-
-
-
-
    -
  • -
    -
    All Known Implementing Classes:
    -
    DataLoaderEvaluationEnvironment
    -
    -
    -
    -
    public interface EvaluationEnvironment
    -
    Callbacks that let you control the behaviour of TDD expression evaluation.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static intEVENT_ENTER_FUNCTION_PARAMS -
      The code of event that indicates that we have started to evaluate the - parameter list in a function call.
      -
      static intEVENT_ENTER_HASH -
      The code of event that indicates that we have started to evaluate the - items in a hash.
      -
      static intEVENT_ENTER_HASH_KEY -
      The code of event that indicates that we have started to evaluate the - value in a key:value pair.
      -
      static intEVENT_ENTER_SEQUENCE -
      The code of event that indicates that we have started to evaluate the - items in a sequence.
      -
      static intEVENT_LEAVE_FUNCTION_PARAMS -
      The code of event that indicates that we have finished to evaluate the - parameter list in a function call.
      -
      static intEVENT_LEAVE_HASH -
      The code of event that indicates that we have finished to evaluate the - items in a sequence.
      -
      static intEVENT_LEAVE_HASH_KEY -
      The code of event that indicates that we have finished to evaluate the - value in a key:value pair.
      -
      static intEVENT_LEAVE_SEQUENCE -
      The code of event that indicates that we have finished to evaluate the - items in a sequence.
      -
      static ObjectRETURN_FRAGMENT 
      static ObjectRETURN_SKIP 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        EVENT_ENTER_HASH_KEY

        -
        static final int EVENT_ENTER_HASH_KEY
        -
        The code of event that indicates that we have started to evaluate the - value in a key:value pair.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_LEAVE_HASH_KEY

        -
        static final int EVENT_LEAVE_HASH_KEY
        -
        The code of event that indicates that we have finished to evaluate the - value in a key:value pair.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_ENTER_FUNCTION_PARAMS

        -
        static final int EVENT_ENTER_FUNCTION_PARAMS
        -
        The code of event that indicates that we have started to evaluate the - parameter list in a function call.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_LEAVE_FUNCTION_PARAMS

        -
        static final int EVENT_LEAVE_FUNCTION_PARAMS
        -
        The code of event that indicates that we have finished to evaluate the - parameter list in a function call.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_ENTER_SEQUENCE

        -
        static final int EVENT_ENTER_SEQUENCE
        -
        The code of event that indicates that we have started to evaluate the - items in a sequence. This does not include function call parameter lists.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_LEAVE_SEQUENCE

        -
        static final int EVENT_LEAVE_SEQUENCE
        -
        The code of event that indicates that we have finished to evaluate the - items in a sequence.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_ENTER_HASH

        -
        static final int EVENT_ENTER_HASH
        -
        The code of event that indicates that we have started to evaluate the - items in a hash.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        EVENT_LEAVE_HASH

        -
        static final int EVENT_LEAVE_HASH
        -
        The code of event that indicates that we have finished to evaluate the - items in a sequence.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        RETURN_SKIP

        -
        static final Object RETURN_SKIP
        -
      • -
      - - - -
        -
      • -

        RETURN_FRAGMENT

        -
        static final Object RETURN_FRAGMENT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        evalFunctionCall

        -
        Object evalFunctionCall(FunctionCall fc,
        -                        Interpreter ip)
        -                 throws Exception
        -
        Evaluates the function call. This method may simply returns its - parameter, which means that the function was not resolved, and thus the - function call will be availble for further interpretation in the result - of the TDD expression evaluation.
        -
        -
        Parameters:
        -
        fc - the function call to evaluate.
        -
        Returns:
        -
        the return value of the function call. During the evaluation of - a TDD expression, function calls will be replaced with their return - values. - If the return value is a FunctionCall object, it will not be - evaluated again. This way, the final result of a TDD expression - evaluation can contain FunctionCall objects.
        -
        Throws:
        -
        Exception
        -
        -
      • -
      - - - -
        -
      • -

        notify

        -
        Object notify(int event,
        -              Interpreter ip,
        -              String name,
        -              Object extra)
        -       throws Exception
        -
        Notifies about an event during expression evaluation.
        -
        -
        Parameters:
        -
        event - An EVENT_... constant. Further events may will - be added later, so the implementation must silently ignore events - that it does not know. It is guaranteed that for each - EVENT_ENTER_... event there will be an - EVENT_LEAVE_... event later, except if - notifyContextChange has thrown exception during handling - EVENT_ENTER_..., in which case it is guaranteed that - there will be no corresponding EVENT_LEAVE_... event.
        -
        ip - the Interpreter instance that evaluates the text. - The value returned by Interpreter.getPosition() will be - the position in the text where the this even has been created: -
        -
        name - For EVENT_ENTER_HASH_KEY and - EVENT_ENTER_FUNCTION_PARAMS, the name of the hash key or - function. It is null otherwise.
        -
        extra - Even specific extra information. -
        -
        Returns:
        -
        return The allowed return values and their meaning depends on - the event. But return value null always means - "do nothing special". The currently defiend non-null - return values for the events: -
          -
        • EVENT_ENTER_HASH_KEY: -
            -
          • RETURN_SKIP: Skip the key:value - pair. That is, the key:value pair will not be added to - the map. The value expression will not be evaluated. -
          • RETURN_FRAGMENT: The value of the key:value pair - will be the Fragment that stores the value - expression. The value expression will not be evaluated. - However, if the value is implicit boolean - true, (i.e. you omit the value) then - RETURN_FRAGMENT has no effect. -
          -
        • -
        • EVENT_ENTER_HASH if the hash uses { and - }): -
            -
          • RETURN_FRAGMENT: The value of the hash will be - the Fragment that stores the hash expression. - The hash expression will not be evaluated. -
          -
        • -
        -
        Throws:
        -
        Exception
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/Fragment.html b/fmpp/docs/api/fmpp/tdd/Fragment.html deleted file mode 100644 index 33369e6..0000000 --- a/fmpp/docs/api/fmpp/tdd/Fragment.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - -Fragment (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class Fragment

-
-
- -
-
    -
  • -
    -
    -
    public class Fragment
    -extends Object
    -
    Fragment extracted from a TDD expression.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Fragment

        -
        public Fragment(String text,
        -                int fragmentStart,
        -                int fragmentEnd,
        -                String fileName)
        -
        Creates new TDD fragment.
        -
        -
        Parameters:
        -
        text - the full TDD text that contains the fragment. (In extreme - case the fragment and the full text is the same.)
        -
        fragmentStart - the start index of the fragment in the text.
        -
        fragmentEnd - the start index of the fragment in the text
        -
        fileName - the name of the file the text comes from (for - informational purposes only). It can be null if the source - file is unknown or there is no source file.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getFileName

        -
        public String getFileName()
        -
        Returns the name of the file the text comes from (for informational - purposes only). It can be null if the source file is unknown - or there is no source file.
        -
      • -
      - - - -
        -
      • -

        getText

        -
        public String getText()
        -
        Returns the full TDD text that contains the fragmet.
        -
      • -
      - - - -
        -
      • -

        getFragmentStart

        -
        public int getFragmentStart()
        -
        Returns the start index of the fragment in the text.
        -
      • -
      - - - -
        -
      • -

        getFragmentEnd

        -
        public int getFragmentEnd()
        -
        Returns the end index (exclusive) of the fragment in the text.
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        Returns the fragment text.
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/FunctionCall.html b/fmpp/docs/api/fmpp/tdd/FunctionCall.html deleted file mode 100644 index e35160c..0000000 --- a/fmpp/docs/api/fmpp/tdd/FunctionCall.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - -FunctionCall (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class FunctionCall

-
-
- -
-
    -
  • -
    -
    -
    public class FunctionCall
    -extends Object
    -
    Symbolizes a TDD function call. - Function calls that are not evaluated during the evaluation of a TDD - expressions will be present in the result as the instances of this class.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FunctionCall

        -
        public FunctionCall(String name,
        -                    List params)
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/Interpreter.html b/fmpp/docs/api/fmpp/tdd/Interpreter.html deleted file mode 100644 index 9cefdd2..0000000 --- a/fmpp/docs/api/fmpp/tdd/Interpreter.html +++ /dev/null @@ -1,701 +0,0 @@ - - - - - - -Interpreter (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class Interpreter

-
-
- -
-
    -
  • -
    -
    -
    public class Interpreter
    -extends Object
    -
    Evaluates TDD expressions.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/TddUtil.html b/fmpp/docs/api/fmpp/tdd/TddUtil.html deleted file mode 100644 index d4705fc..0000000 --- a/fmpp/docs/api/fmpp/tdd/TddUtil.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - -TddUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tdd
-

Class TddUtil

-
-
- -
-
    -
  • -
    -
    -
    public class TddUtil
    -extends Object
    -
    Utility methods for TDD related tasks.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TddUtil

        -
        public TddUtil()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/DataLoader.html b/fmpp/docs/api/fmpp/tdd/class-use/DataLoader.html deleted file mode 100644 index ffe8b4f..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/DataLoader.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - -Uses of Interface fmpp.tdd.DataLoader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Interface
fmpp.tdd.DataLoader

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/DataLoaderEvaluationEnvironment.html b/fmpp/docs/api/fmpp/tdd/class-use/DataLoaderEvaluationEnvironment.html deleted file mode 100644 index 52955a1..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/DataLoaderEvaluationEnvironment.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.DataLoaderEvaluationEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.DataLoaderEvaluationEnvironment

-
-
No usage of fmpp.tdd.DataLoaderEvaluationEnvironment
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/EvalException.html b/fmpp/docs/api/fmpp/tdd/class-use/EvalException.html deleted file mode 100644 index 279f39e..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/EvalException.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.EvalException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.EvalException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/EvaluationEnvironment.html b/fmpp/docs/api/fmpp/tdd/class-use/EvaluationEnvironment.html deleted file mode 100644 index 814dddf..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/EvaluationEnvironment.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - -Uses of Interface fmpp.tdd.EvaluationEnvironment (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Interface
fmpp.tdd.EvaluationEnvironment

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/Fragment.html b/fmpp/docs/api/fmpp/tdd/class-use/Fragment.html deleted file mode 100644 index c32ffad..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/Fragment.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.Fragment (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.Fragment

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/FunctionCall.html b/fmpp/docs/api/fmpp/tdd/class-use/FunctionCall.html deleted file mode 100644 index 8e75ab6..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/FunctionCall.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.FunctionCall (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.FunctionCall

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/Interpreter.html b/fmpp/docs/api/fmpp/tdd/class-use/Interpreter.html deleted file mode 100644 index 4fb8a08..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/Interpreter.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.Interpreter (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.Interpreter

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/class-use/TddUtil.html b/fmpp/docs/api/fmpp/tdd/class-use/TddUtil.html deleted file mode 100644 index d75b2e5..0000000 --- a/fmpp/docs/api/fmpp/tdd/class-use/TddUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.tdd.TddUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tdd.TddUtil

-
-
No usage of fmpp.tdd.TddUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/package-frame.html b/fmpp/docs/api/fmpp/tdd/package-frame.html deleted file mode 100644 index dc87089..0000000 --- a/fmpp/docs/api/fmpp/tdd/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - -fmpp.tdd (FMPP 0.9.15 API) - - - - - -

fmpp.tdd

- - - diff --git a/fmpp/docs/api/fmpp/tdd/package-summary.html b/fmpp/docs/api/fmpp/tdd/package-summary.html deleted file mode 100644 index fc0a048..0000000 --- a/fmpp/docs/api/fmpp/tdd/package-summary.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - -fmpp.tdd (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.tdd

-
-
Textual Data Definition related classes.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - -
    Interface Summary 
    InterfaceDescription
    DataLoader -
    Creates an object that will be accessed in FreeMarker templates.
    -
    EvaluationEnvironment -
    Callbacks that let you control the behaviour of TDD expression evaluation.
    -
    -
  • -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    DataLoaderEvaluationEnvironment -
    Evaluates function calls as data loader invocations.
    -
    Fragment -
    Fragment extracted from a TDD expression.
    -
    FunctionCall -
    Symbolizes a TDD function call.
    -
    Interpreter -
    Evaluates TDD expressions.
    -
    TddUtil -
    Utility methods for TDD related tasks.
    -
    -
  • -
  • - - - - - - - - - - - - -
    Exception Summary 
    ExceptionDescription
    EvalException 
    -
  • -
- - - -

Package fmpp.tdd Description

-

Textual Data Definition related classes. - TDD is a very simple expression language created for defining hierarchical data - (vectors, dictionaries) as plain text (maybe a command-line argument). - Its syntax is similar to FreeMarker expression syntax. - -

TDD is not for defining large amount of data. - Rather, it is for give a uniform syntax for simple setting (configuration) values.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/package-tree.html b/fmpp/docs/api/fmpp/tdd/package-tree.html deleted file mode 100644 index 36eff60..0000000 --- a/fmpp/docs/api/fmpp/tdd/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -fmpp.tdd Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.tdd

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tdd/package-use.html b/fmpp/docs/api/fmpp/tdd/package-use.html deleted file mode 100644 index 03ff451..0000000 --- a/fmpp/docs/api/fmpp/tdd/package-use.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - -Uses of Package fmpp.tdd (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.tdd

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/AntTask.AntAttributeSubstitution.html b/fmpp/docs/api/fmpp/tools/AntTask.AntAttributeSubstitution.html deleted file mode 100644 index 14d7907..0000000 --- a/fmpp/docs/api/fmpp/tools/AntTask.AntAttributeSubstitution.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - -AntTask.AntAttributeSubstitution (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tools
-

Class AntTask.AntAttributeSubstitution

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.apache.tools.ant.ProjectComponent
    • -
    • -
        -
      • fmpp.tools.AntTask.AntAttributeSubstitution
      • -
      -
    • -
    -
  • -
-
-
    -
  • -
    -
    Enclosing class:
    -
    AntTask
    -
    -
    -
    -
    public static class AntTask.AntAttributeSubstitution
    -extends org.apache.tools.ant.ProjectComponent
    -
    Used internally (must be public class for technical reasons).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntAttributeSubstitution

        -
        public AntAttributeSubstitution()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        setExpandProperties

        -
        public void setExpandProperties(boolean expandProperties)
        -
      • -
      - - - -
        -
      • -

        addText

        -
        public void addText(String text)
        -
      • -
      - - - -
        -
      • -

        getText

        -
        public String getText()
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tools/AntTask.html b/fmpp/docs/api/fmpp/tools/AntTask.html deleted file mode 100644 index 657daef..0000000 --- a/fmpp/docs/api/fmpp/tools/AntTask.html +++ /dev/null @@ -1,1202 +0,0 @@ - - - - - - -AntTask (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tools
-

Class AntTask

-
-
-
    -
  • java.lang.Object
  • -
  • -
      -
    • org.apache.tools.ant.ProjectComponent
    • -
    • -
        -
      • org.apache.tools.ant.Task
      • -
      • -
          -
        • org.apache.tools.ant.taskdefs.MatchingTask
        • -
        • -
            -
          • fmpp.tools.AntTask
          • -
          -
        • -
        -
      • -
      -
    • -
    -
  • -
-
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    org.apache.tools.ant.types.selectors.SelectorContainer
    -
    -
    -
    -
    public class AntTask
    -extends org.apache.tools.ant.taskdefs.MatchingTask
    -
    Ant task to process files selected by pattern sets.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AntTask

        -
        public AntTask()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        setConfiguration

        -
        public void setConfiguration(File outputFile)
        -
      • -
      - - - -
        -
      • -

        setAntTaskFailOnError

        -
        public void setAntTaskFailOnError(boolean antTaskFailOnError)
        -
      • -
      - - - -
        -
      • -

        setConfigurationBase

        -
        public void setConfigurationBase(File f)
        -
      • -
      - - - -
        -
      • -

        setInheritConfiguration

        -
        public void setInheritConfiguration(File f)
        -
      • -
      - - - -
        -
      • -

        setOutputFile

        -
        public void setOutputFile(File outputFile)
        -
      • -
      - - - -
        -
      • -

        setOutputRoot

        -
        public void setOutputRoot(File outputRoot)
        -
      • -
      - - - -
        -
      • -

        setDestDir

        -
        public void setDestDir(File outputRoot)
        -
      • -
      - - - -
        -
      • -

        setOutputRoot_common

        -
        public void setOutputRoot_common(File outputRoot,
        -                                 boolean alt)
        -
      • -
      - - - -
        -
      • -

        setSourceFile

        -
        public void setSourceFile(File sourceFile)
        -
      • -
      - - - -
        -
      • -

        setSourceRoot

        -
        public void setSourceRoot(File sourceRoot)
        -
      • -
      - - - -
        -
      • -

        setSrcDir

        -
        public void setSrcDir(File sourceRoot)
        -
      • -
      - - - -
        -
      • -

        setSourceRoot_common

        -
        public void setSourceRoot_common(File sourceRoot,
        -                                 boolean alt)
        -
      • -
      - - - -
        -
      • -

        setFreemarkerIncompatibleImprovements

        -
        public void setFreemarkerIncompatibleImprovements(String fmIcI)
        -
      • -
      - - - -
        -
      • -

        setObjectWrapper

        -
        public void setObjectWrapper(String objectWrapper)
        -
      • -
      - - - -
        -
      • -

        setFreemarkerLinks

        -
        public void setFreemarkerLinks(String freemarkerLinks)
        -
      • -
      - - - -
        -
      • -

        setBorders

        -
        public void setBorders(String border)
        -
      • -
      - - - -
        -
      • -

        setCaseSensitive

        -
        public void setCaseSensitive(boolean caseSensitive)
        -
        -
        Overrides:
        -
        setCaseSensitive in class org.apache.tools.ant.taskdefs.MatchingTask
        -
        -
      • -
      - - - -
        -
      • -

        setDataRoot

        -
        public void setDataRoot(File dataRoot)
        -
      • -
      - - - -
        -
      • -

        setData

        -
        public void setData(String data)
        -
      • -
      - - - -
        -
      • -

        setLocalData

        -
        public void setLocalData(String localData)
        -
      • -
      - - - -
        -
      • -

        setTurns

        -
        public void setTurns(String turn)
        -
      • -
      - - - -
        -
      • -

        setExpert

        -
        public void setExpert(boolean expert)
        -
      • -
      - - - -
        -
      • -

        setAlwaysCreateDirs

        -
        public void setAlwaysCreateDirs(boolean copy)
        -
        Same as setAlwaysCreateDirectories(boolean); added as this name - is closer to the Ant naming conventions.
        -
      • -
      - - - -
        -
      • -

        setAlwaysCreateDirectories

        -
        public void setAlwaysCreateDirectories(boolean copy)
        -
      • -
      - - - -
        -
      • -

        setLocale

        -
        public void setLocale(String locale)
        -
      • -
      - - - -
        -
      • -

        setLogFile

        -
        public void setLogFile(File logFile)
        -
      • -
      - - - -
        -
      • -

        setAppendLogFile

        -
        public void setAppendLogFile(boolean append)
        -
      • -
      - - - -
        -
      • -

        setModes

        -
        public void setModes(String mode)
        -
      • -
      - - - -
        -
      • -

        setNumberFormat

        -
        public void setNumberFormat(String numberFormat)
        -
      • -
      - - - -
        -
      • -

        setBooleanFormat

        -
        public void setBooleanFormat(String booleanFormat)
        -
      • -
      - - - -
        -
      • -

        setDateFormat

        -
        public void setDateFormat(String dateFormat)
        -
      • -
      - - - -
        -
      • -

        setTimeFormat

        -
        public void setTimeFormat(String timeFormat)
        -
      • -
      - - - -
        -
      • -

        setDateTimeFormat

        -
        public void setDateTimeFormat(String dateTimeFormat)
        -
      • -
      - - - -
        -
      • -

        setTimeZone

        -
        public void setTimeZone(String timeZone)
        -
      • -
      - - - -
        -
      • -

        setSQLDateAndTimeTimeZone

        -
        public void setSQLDateAndTimeTimeZone(String timeZone)
        -
      • -
      - - - -
        -
      • -

        setTagSyntax

        -
        public void setTagSyntax(String tagSyntax)
        -
      • -
      - - - -
        -
      • -

        setOutputEncoding

        -
        public void setOutputEncoding(String outputEncoding)
        -
      • -
      - - - -
        -
      • -

        setUrlEscapingCharset

        -
        public void setUrlEscapingCharset(String urlEscapingCharset)
        -
      • -
      - - - -
        -
      • -

        setXpathEngine

        -
        public void setXpathEngine(String engine)
        -
      • -
      - - - -
        -
      • -

        setXmlCatalogFiles

        -
        public void setXmlCatalogFiles(String files)
        -
      • -
      - - - -
        -
      • -

        setXmlCatalogPrefer

        -
        public void setXmlCatalogPrefer(String prefer)
        -
      • -
      - - - -
        -
      • -

        setValidateXml

        -
        public void setValidateXml(String validate)
        -
      • -
      - - - -
        -
      • -

        setXmlRenderings

        -
        public void setXmlRenderings(String prefer)
        -
      • -
      - - - -
        -
      • -

        setQuiet

        -
        public void setQuiet(String quiet)
        -
      • -
      - - - -
        -
      • -

        setReplaceExtensions

        -
        public void setReplaceExtensions(String replaceExtension)
        -
      • -
      - - - -
        -
      • -

        setRemoveExtensions

        -
        public void setRemoveExtensions(String removeExtension)
        -
      • -
      - - - -
        -
      • -

        setRemovePostfixes

        -
        public void setRemovePostfixes(String removePostfix)
        -
      • -
      - - - -
        -
      • -

        setReplaceExtension

        -
        public void setReplaceExtension(String replaceExtension)
        -
      • -
      - - - -
        -
      • -

        setRemoveExtension

        -
        public void setRemoveExtension(String removeExtension)
        -
      • -
      - - - -
        -
      • -

        setRemovePostfix

        -
        public void setRemovePostfix(String removePostfix)
        -
      • -
      - - - -
        -
      • -

        setSourceEncoding

        -
        public void setSourceEncoding(String sourceEncoding)
        -
      • -
      - - - -
        -
      • -

        setStopOnError

        -
        public void setStopOnError(boolean stopOnError)
        -
      • -
      - - - -
        -
      • -

        setSkipUnchanged

        -
        public void setSkipUnchanged(String skipUnchanged)
        -
      • -
      - - - -
        -
      • -

        setTemplateData

        -
        public void setTemplateData(String templateData)
        -
      • -
      - - - -
        -
      • -

        setDir

        -
        public void setDir(File dir)
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        getTarget

        -
        public org.apache.tools.ant.Target getTarget()
        -
      • -
      - - - -
        -
      • -

        execute

        -
        public void execute()
        -             throws fmpp.tools.AntTask.CausePrinterBuildException
        -
        -
        Overrides:
        -
        execute in class org.apache.tools.ant.Task
        -
        Throws:
        -
        fmpp.tools.AntTask.CausePrinterBuildException
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tools/CommandLine.html b/fmpp/docs/api/fmpp/tools/CommandLine.html deleted file mode 100644 index 9abf4b3..0000000 --- a/fmpp/docs/api/fmpp/tools/CommandLine.html +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - -CommandLine (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.tools
-

Class CommandLine

-
-
- -
-
    -
  • -
    -
    -
    public class CommandLine
    -extends Object
    -
    Command-line tool for preprocessing single files or entire directories.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        FMPP_CONSOLE_COLS

        -
        public static final String FMPP_CONSOLE_COLS
        -
        The number of console (terminal) columns can be passed in with this environment variable, supposedly by the - OS-specific starter executable (shell script). Note that if the Settings.NAME_COLUMNS is set, that will - override this (but by default it isn't set). The value of the environment variable should be just an integer - (with possible white space around it), however, if it's not a number, CommandLine will attempt to parse - it as the output of the Windows mode con /status command (also then [BR] can be used instead of - real line-breaks, to ease bat programming). On UN*X-es usually this should be the output of tput cols.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommandLine

        -
        public CommandLine()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        main

        -
        public static void main(String[] args)
        -
        Runs the command line interface.
        -
        -
        See Also:
        -
        FMPP_CONSOLE_COLS
        -
        -
      • -
      - - - -
        -
      • -

        execute

        -
        public static int execute(String[] args,
        -                          PrintWriter stdout,
        -                          PrintWriter stderr)
        -
        Emulates the command-line invocation of the tool.
        -
        -
        Parameters:
        -
        args - the command line arguments
        -
        stdout - the PrintWriter used as stdout. - If it is null then it defaults to the real stdout.
        -
        stderr - the PrintWriter used as stderr. - If it is null then it defaults to the real stderr.
        -
        Returns:
        -
        exit code. 0 if everything was OK, non-0 if there was an error.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/tools/class-use/AntTask.AntAttributeSubstitution.html b/fmpp/docs/api/fmpp/tools/class-use/AntTask.AntAttributeSubstitution.html deleted file mode 100644 index 80db2ef..0000000 --- a/fmpp/docs/api/fmpp/tools/class-use/AntTask.AntAttributeSubstitution.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - -Uses of Class fmpp.tools.AntTask.AntAttributeSubstitution (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tools.AntTask.AntAttributeSubstitution

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/class-use/AntTask.html b/fmpp/docs/api/fmpp/tools/class-use/AntTask.html deleted file mode 100644 index 174cc6b..0000000 --- a/fmpp/docs/api/fmpp/tools/class-use/AntTask.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.tools.AntTask (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tools.AntTask

-
-
No usage of fmpp.tools.AntTask
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/class-use/CommandLine.html b/fmpp/docs/api/fmpp/tools/class-use/CommandLine.html deleted file mode 100644 index 55bc2d9..0000000 --- a/fmpp/docs/api/fmpp/tools/class-use/CommandLine.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.tools.CommandLine (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.tools.CommandLine

-
-
No usage of fmpp.tools.CommandLine
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/package-frame.html b/fmpp/docs/api/fmpp/tools/package-frame.html deleted file mode 100644 index a38e681..0000000 --- a/fmpp/docs/api/fmpp/tools/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -fmpp.tools (FMPP 0.9.15 API) - - - - - -

fmpp.tools

- - - diff --git a/fmpp/docs/api/fmpp/tools/package-summary.html b/fmpp/docs/api/fmpp/tools/package-summary.html deleted file mode 100644 index 1f570f8..0000000 --- a/fmpp/docs/api/fmpp/tools/package-summary.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - -fmpp.tools (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.tools

-
-
Tools (front-ends) that end-user can use out-of-the-box.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    AntTask -
    Ant task to process files selected by pattern sets.
    -
    AntTask.AntAttributeSubstitution -
    Used internally (must be public class for technical reasons).
    -
    CommandLine -
    Command-line tool for preprocessing single files or entire directories.
    -
    -
  • -
- - - -

Package fmpp.tools Description

-

Tools (front-ends) that end-user can use out-of-the-box.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/package-tree.html b/fmpp/docs/api/fmpp/tools/package-tree.html deleted file mode 100644 index 1cfcae9..0000000 --- a/fmpp/docs/api/fmpp/tools/package-tree.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -fmpp.tools Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.tools

-Package Hierarchies: - -
-
-

Class Hierarchy

-
    -
  • java.lang.Object -
      -
    • fmpp.tools.CommandLine
    • -
    • org.apache.tools.ant.ProjectComponent -
        -
      • fmpp.tools.AntTask.AntAttributeSubstitution
      • -
      • org.apache.tools.ant.Task -
          -
        • org.apache.tools.ant.taskdefs.MatchingTask (implements org.apache.tools.ant.types.selectors.SelectorContainer) - -
        • -
        -
      • -
      -
    • -
    -
  • -
-
- - - - - - diff --git a/fmpp/docs/api/fmpp/tools/package-use.html b/fmpp/docs/api/fmpp/tools/package-use.html deleted file mode 100644 index 205ec5b..0000000 --- a/fmpp/docs/api/fmpp/tools/package-use.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - -Uses of Package fmpp.tools (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.tools

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/ArgsParser.BadArgsException.html b/fmpp/docs/api/fmpp/util/ArgsParser.BadArgsException.html deleted file mode 100644 index 3276fbe..0000000 --- a/fmpp/docs/api/fmpp/util/ArgsParser.BadArgsException.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -ArgsParser.BadArgsException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class ArgsParser.BadArgsException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    Enclosing class:
    -
    ArgsParser
    -
    -
    -
    -
    public static class ArgsParser.BadArgsException
    -extends Exception
    -
    The user has entered invalid options in the command-line. - Use the getMessage() method to get the description of the - problem, that you can directly print to the terminal for the user.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/ArgsParser.OptionDefinition.html b/fmpp/docs/api/fmpp/util/ArgsParser.OptionDefinition.html deleted file mode 100644 index 57056bd..0000000 --- a/fmpp/docs/api/fmpp/util/ArgsParser.OptionDefinition.html +++ /dev/null @@ -1,611 +0,0 @@ - - - - - - -ArgsParser.OptionDefinition (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class ArgsParser.OptionDefinition

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Cloneable
    -
    -
    -
    Enclosing class:
    -
    ArgsParser
    -
    -
    -
    -
    public class ArgsParser.OptionDefinition
    -extends Object
    -implements Cloneable
    -
    Describes and option. It does not store the actual value of the - option after parsing; it is just the definition of the option.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        OptionDefinition

        -
        public OptionDefinition()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        property

        -
        public ArgsParser.OptionDefinition property(String pName)
        -
        Sets the property name for this option. - If you don't override the property name with this, it will be - the long-name of the option if the option has long-name, otherwise - the short-name of the option.
        -
        -
        See Also:
        -
        property(String, String)
        -
        -
      • -
      - - - -
        -
      • -

        propertyValue

        -
        public ArgsParser.OptionDefinition propertyValue(String value)
        -
        Sets the property value for this option. - This only allowed for options that do no support argument, as - the value of options that has argument will be the actual value - of the argument. - If you don't override the property value with this, it will be - "" (0 length String) for those options.
        -
        -
        Throws:
        -
        IllegalArgumentException - if the option has argument.
        -
        See Also:
        -
        property(String, String)
        -
        -
      • -
      - - - - - - - - - - - - - - - -
        -
      • -

        implied

        -
        public ArgsParser.OptionDefinition implied(String impliedArg)
        -
        Ensures that the option will be seemingly present with the given - argument value if args[] does not contains this option, or any - other option that mutually excludes this option. - This version of the method applies only for options that support - argument.
        -
        -
        Throws:
        -
        IllegalArgumentException - if the option has no argument.
        -
        See Also:
        -
        implied()
        -
        -
      • -
      - - - -
        -
      • -

        defaultArg

        -
        public ArgsParser.OptionDefinition defaultArg(String defaultValue)
        -
        Gives default argument value for an option that supports arguments, - thus it will be optional to specify the argument value in the - command-line. - -

        Note that introducing default value for an option is not a - backward compatible step. For example if "color" has no default - value, then "--color red" is interpreted as "color" - has an argument that is "red". But, if "color" has a default value, - then it is interpreted as "color" has the default value, and - we have a non-option "red". Of coruse, there would not be problem - if we use "--color=red".

        -
      • -
      - - - - - - - -
        -
      • -

        hide

        -
        public void hide()
        -
        Hides option, that is, it will not be shown in the option help.
        -
      • -
      - - - -
        -
      • -

        copy

        -
        public ArgsParser.OptionDefinition copy(String shortName,
        -                                        String longName)
        -
        Creates a copy of the option with different short- and long-name, - but with the same property name (and other attributes). - This is mostly useful to create alias options.
        -
        -
        Parameters:
        -
        longName - the long-name of option or null. - Do not use the long-name=ARGNAME form here.
        -
        shortName - the short-name of option or null. - Do not use the s=ARGNAME form here.
        -
        Returns:
        -
        the newly created OptionDefinition.
        -
        Throws:
        -
        IllegalArgumentException - If an option with the same - long-name or short-name is already added, or if the given long- - or short-name is malformed.
        -
        -
      • -
      - - - -
        -
      • -

        getArgName

        -
        public String getArgName()
        -
        Returns the name of the argument, or null if the option does not - support argument.
        -
      • -
      - - - -
        -
      • -

        getDefaultArg

        -
        public String getDefaultArg()
        -
        Returns the default argument of the option, or null if the option - has no default argument.
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        public String getDescription()
        -
        Returns the description of the option, or null if no description is - available.
        -
      • -
      - - - -
        -
      • -

        getLongName

        -
        public String getLongName()
        -
        Returns the long-name of the option, or null if the option has no - long-name.
        -
      • -
      - - - -
        -
      • -

        getShortName

        -
        public String getShortName()
        -
        Returns the short-name of the option, or null if the option has no - short-name.
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/ArgsParser.html b/fmpp/docs/api/fmpp/util/ArgsParser.html deleted file mode 100644 index d18f762..0000000 --- a/fmpp/docs/api/fmpp/util/ArgsParser.html +++ /dev/null @@ -1,846 +0,0 @@ - - - - - - -ArgsParser (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class ArgsParser

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    -
    public class ArgsParser
    -extends Object
    -implements Serializable
    -
    Simple command-line argument parser that mimics the logic of UN*X - tools as ls. It does not support the logic of tools like - gcc. - -

    Features: short (1 character) and long option names, options - with no argument, with optional argument and with mandatory argument, option - groups (a.k.a. mutually exclusive options), implied options, alias options, - retrieval of non-options, automatically generates formatted options help. - -

    For example, here it is a typical "UN*X command-line": - -

    $ ls -laT4 --color=auto --quote-name etc etc/mysql - -

    Here, we have 3 options given with short-name: "l", "a" and "T", and - 2 options given with long-name: "color" and "quote-name". Two options have - argument: "T" and "color". Also, we have 2 non-option arguments: - "etc" and "etc/mysql". According to Java logic, the - main method doesn't get the program name (here: "ls"), so we don't deal with - that. - -

    A short example, that defines a subset of ls options: -

    - // 1. Create parser instance:
    - ArgsParser ap = new ArgsParser();
    - 
    - // 2. Define the options:
    - ap.addOption("a", "all")
    -         .desc("do not hide entries starting with .");
    - ap.addOption("A", "almost-all")
    -         .desc("do not list implied . and ..");
    - ap.addOption("l", null)
    -         .desc("use a long list format");
    - ap.addOption("T", "tabsize=COLS")
    -         .desc("assume tab stops at each COLS instead of 8");
    - ap.addOption(null, "color=WHEN")
    -         .defaultArg("always")
    -         .desc("control whether color is used ...[too long].");
    - ap.addOption("Q", "quote-name")
    -         .desc("enclose entry names in double-quotes");
    - 
    - // 3. Parse args[]:
    - try {
    -     ap.parse(args);
    - } catch (ArgsParser.BadArgsException exc) {
    -     System.out.println(exc.getMessage());
    -     System.exit(-1);
    - }
    - 
    - // 4. Get the results:
    - Properties ops = ap.getOptions();
    - String[] nonOps = ap.getNonOptions();
    -
    - // 5. Print the results for the sake of testing:
    - System.out.println("Options:");
    - Iterator it = ops.entrySet().iterator();
    - while (it.hasNext()) {
    -     Map.Entry e = (Map.Entry) it.next();
    -     System.out.println(
    -             "- " + e.getKey() + " = " + e.getValue());
    - }
    - System.out.println("Non-options:");
    - for (int i = 0; i < nonOps.length; i++) {
    -     System.out.println("- " + nonOps[i]);
    - }
    - 
    - -

    This defines the following options:

    - -
    short-namelong-nameargument? -
    aallno -
    Aalmost-allno -
    l no -
    Ttabsizemandatory -
     coloroptional, defaults to "always" -
    Qquote-nameno -
    -

    and will parse command-line arguments like: -
    -laT4 --color=auto --quote-name etc etc/mysql - -

    The resulting properties will be:

    - - -
    namevalue -
    all"" -
    l"" -
    tabsize"4" -
    color"auto" -
    quote-name"" -
    - -

    Note that the property name is always the long-name of the option if the - option has a long-name, otherwise the short-name. Also note that the value of - options that do not allow argument is 0 length String when the option is - present, otherwise no property is made for the option (there is no - "almost-all" propery). - -

    For options that has argument it is maybe practical to use implied values - as: -

    - ...
    - ap.addOption("T", "tabsize=COLS")
    -         .implied("8")
    -         .desc("assume tab stops at each COLS instead of 8");
    - ap.addOption(null, "color=WHEN")
    -         .implied("none")
    -         .defaultArg("always")
    -         .desc("control whether color is used ...[too long].");
    - ...
    - 
    - -

    If you parse this with the above modification: -
    -la --quote-name etc etc/mysql
    - then the "tabsize" property will be "8", and the - "color" property will be "none". If you parse this: -
    -laT4 --color --quote-name etc etc/mysql
    - then the "tabsize" property will be "4", and the - "color" property will be "always" (note that it is - the default argument of "color", as there was no argument given for that in - the command-line). - -

    You may want to use the same propery name but different value for options - as "a" and "A". They should be mutually exclusive options anyway: - -

    - ...
    - ap.addOption("a", "all")
    -         .property("show", "all")
    -         .desc("do not hide entries starting with .");
    - ap.addOption("A", "almost-all")
    -         .property("show", "almost-all")
    -         .desc("do not list implied . and ..");
    - ...
    - 
    - -

    Here you say that both option sets the value of the "show" property - (instead of setting "all" and "almost-all" properties) to the given values - ("all" and "almost-all") if the option is present. As usually you want the - option long-name (or short-name if there is no long-name) as the value of - the property, there is a conveniece method for this: - -

    - ...
    - ap.addOption("a", "all")
    -         .group("show")
    -         .desc("do not hide entries starting with .");
    - ap.addOption("A", "almost-all")
    -         .group("show")
    -         .desc("do not list implied . and ..");
    - ...
    - 
    - -

    The parse method will throw exception if two options in - args[] tries to set the same property, so the two options will mutually - exclude each other here. - -

    For grouped options you may want to choose an implied option. Say, assume - you have "format-normal", and a "format-terse" and a "format-verbose" options - that are mutually exclusively set the value of "format" property. If the user - do not use any of the "format-..." options, then you want see it as if it - were a "--format-nomal" in the command-line: - -

    - ...
    - ap.addOption(null, "format-normal")
    -         .property("format", "normal")
    -         .implied();
    - ap.addOption(null, "format-terse")
    -         .property("format", "terse");
    - ap.addOption(null, "format-verbose")
    -         .property("format", "verbose");
    - ...
    - 
    - -

    You can print the options help to the screen: -

    - System.out.println(ap.getOptionsHelp(80));
    - 
    - -

    For more information please read the documentation of methods.

    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArgsParser

        -
        public ArgsParser()
        -
        Creates a parser.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        parse

        -
        public Properties parse(String[] args)
        -                 throws ArgsParser.BadArgsException
        -
        Parses the args[]. After this, you can get the options and non-options - with getOptions and - getNonOptions.
        -
        -
        Parameters:
        -
        args - the array of Strings that you get as the parameter of - main method.
        -
        Returns:
        -
        the properties object that stores the options. This is the - same object as getOptions() returns.
        -
        Throws:
        -
        ArgsParser.BadArgsException - if the user has entered bad command-line - arguments. The message in the exception (call - exception.getMessage()) contains the (relatively) - user-frinedly desription of the problem.
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public Properties getOptions()
        -
        Returns the options resulting from the latest parse - call as Properties object. An empty - Properties object will be returned if there was no - parse call yet.
        -
      • -
      - - - -
        -
      • -

        getOption

        -
        public String getOption(String name)
        -
        Convenience funtcion to read the option Properties object.
        -
      • -
      - - - -
        -
      • -

        getNonOptions

        -
        public String[] getNonOptions()
        -
        Retruns the non-options resulting from the latest parse - call. An empty array will be returned if there was no parse - call yet. - -

        Non-options are the elements of args[] that are not not options - (as "-l" or "--quote-name"), nor option - arguments (as the "4" after "--tabsize 4", - assuming that "tabsize" has mandatory argument). For - example, in "-l etc --tabsize 8 etc/mysql" there are 2 - non-options: "etc" and "etc/mysql".

        -
      • -
      - - - -
        -
      • -

        getPropertyNames

        -
        public Set getPropertyNames()
        -
        Returns the property names used in the options.
        -
      • -
      - - - -
        -
      • -

        addOption

        -
        public ArgsParser.OptionDefinition addOption(String shortName,
        -                                             String longName)
        -
        Defines an option for the parser. - -

        Note that if you create an option that supports argument, then - the argument will be initially mandatory. To have optional argument, - you have to give a default argument value by calling the - defaultArg method of the returned - object.

        -
        -
        Parameters:
        -
        shortName - the short-name of option or null. Examples of - short-names are "a" and "l" in - "$ ls -la" If the option has argument, then this - parameter has to be in the form "s ARGNAME" or - "s=ARGNAME"; for example: "T COLS". - The space or = indicates that the option supports - argument. - The ARGNAME is used only for showing the help, otherwise its - value is unimportant. - Note that if you will indicate in the longName - parameter that the option has argument, you don't have to indicate it - here.
        -
        longName - the long-name of option or null. An example of long-name - is "quote-name" in "$ ls --quote-name" - If the option supports argument, then this parameter has to - be in the form "long-name=ARGNAME" or - "long-name ARGNAME"; for example: - "tabsize=COLS". The = or space indicates - that the option supports argument. The ARGNAME is used only - for showing the help, otherwise its value is unimportant. - Note that if you have already indicated in the shortName - parameter that the option has argument, you don't have to indicate it - agian here.
        -
        Returns:
        -
        the newly created OptionDefinition; this is - returned to let you addjust the new option with methods like - desc, - property, - implied - or defaultArg.
        -
        Throws:
        -
        IllegalArgumentException - If an option with the same long-name or - short-name is already added, or if the given long- or short-name is - malformed.
        -
        -
      • -
      - - - -
        -
      • -

        setDefaultProperties

        -
        public void setDefaultProperties(Properties defaultProperties)
        -
        Sets the properies object that will be the default properties object for - the properies object that parse creates for the options - (See Properties.Properties(Properties defaults)). - Also, parse will put the implied option values into - the default properties object. - By default there is no default properties object. - -

        This setting takes effect only when you call parse next - time.

        -
      • -
      - - - -
        -
      • -

        setMessages

        -
        public void setMessages(Properties messages)
        -
        Customizes the error messages shown to the user. - The Properties should contain the following keys, - associated with the translation of the following sentences: -
          -
        • "OPTION_CONFLICT": - "This option conflicts with a preceding option: " -
        • "ARG_MISSING": "The argument is missing for this option: " -
        • "OPTION_UNKNOWN": "Unknown option: " -
        • "ARG_NOT_ALLOWED": "This option does not allow argument: " -
        - You may use the MSG_... constants for the key values.
        -
      • -
      - - - - - - - - - - - -
        -
      • -

        getOptionsHelp

        -
        public String getOptionsHelp(int screenWidth)
        -
        Generates options help for the defined options.
        -
        -
        Parameters:
        -
        screenWidth - the (minimum) width of the console screen.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/BorderedReader.html b/fmpp/docs/api/fmpp/util/BorderedReader.html deleted file mode 100644 index a1da709..0000000 --- a/fmpp/docs/api/fmpp/util/BorderedReader.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - - -BorderedReader (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class BorderedReader

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Closeable, AutoCloseable, Readable
    -
    -
    -
    -
    public class BorderedReader
    -extends Reader
    -
    Reader that can insert a string before and after an encapsulated - character stream.
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/BugException.html b/fmpp/docs/api/fmpp/util/BugException.html deleted file mode 100644 index bca134a..0000000 --- a/fmpp/docs/api/fmpp/util/BugException.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -BugException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class BugException

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BugException

        -
        public BugException(String message)
        -
      • -
      - - - -
        -
      • -

        BugException

        -
        public BugException(String message,
        -                    Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/DataLoaderUtil.html b/fmpp/docs/api/fmpp/util/DataLoaderUtil.html deleted file mode 100644 index 3925881..0000000 --- a/fmpp/docs/api/fmpp/util/DataLoaderUtil.html +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - -DataLoaderUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class DataLoaderUtil

-
-
- -
-
    -
  • -
    -
    -
    public class DataLoaderUtil
    -extends Object
    -
    Utility methods for writing data loaders.
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataLoaderUtil

        -
        public DataLoaderUtil()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getStringArgument

        -
        public static String getStringArgument(int index,
        -                                       Object value)
        -
      • -
      - - - -
        -
      • -

        getStringOption

        -
        public static String getStringOption(String name,
        -                                     Object value)
        -
      • -
      - - - -
        -
      • -

        getCharArgument

        -
        public static char getCharArgument(int index,
        -                                   Object value)
        -
      • -
      - - - -
        -
      • -

        getCharOption

        -
        public static char getCharOption(String name,
        -                                 Object value)
        -
      • -
      - - - -
        -
      • -

        getBooleanArgument

        -
        public static boolean getBooleanArgument(int index,
        -                                         Object value)
        -
      • -
      - - - -
        -
      • -

        getBooleanOption

        -
        public static boolean getBooleanOption(String name,
        -                                       Object value)
        -
      • -
      - - - -
        -
      • -

        getIntArgument

        -
        public static int getIntArgument(int index,
        -                                 Object value)
        -
      • -
      - - - -
        -
      • -

        getIntOption

        -
        public static int getIntOption(String name,
        -                               Object value)
        -
      • -
      - - - -
        -
      • -

        getStringArrayArgument

        -
        public static String[] getStringArrayArgument(int index,
        -                                              Object value)
        -
      • -
      - - - -
        -
      • -

        getStringArrayOption

        -
        public static String[] getStringArrayOption(String name,
        -                                            Object value)
        -
      • -
      - - - -
        -
      • -

        getStringArrayArgument

        -
        public static String[] getStringArrayArgument(int index,
        -                                              Object value,
        -                                              boolean allowString)
        -
        -
        Parameters:
        -
        allowString - if true a value that is a single string - will be treated as a 1 long sequence that contains that string.
        -
        -
      • -
      - - - -
        -
      • -

        getStringArrayOption

        -
        public static String[] getStringArrayOption(String name,
        -                                            Object value,
        -                                            boolean allowString)
        -
        -
        Parameters:
        -
        allowString - if true a value that is a single string - will be treated as a 1 long sequence that contains that string.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/ExceptionCC.html b/fmpp/docs/api/fmpp/util/ExceptionCC.html deleted file mode 100644 index 12b3d4e..0000000 --- a/fmpp/docs/api/fmpp/util/ExceptionCC.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - -ExceptionCC (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class ExceptionCC

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ExceptionCC

        -
        public ExceptionCC()
        -
      • -
      - - - -
        -
      • -

        ExceptionCC

        -
        public ExceptionCC(String s)
        -
      • -
      - - - -
        -
      • -

        ExceptionCC

        -
        public ExceptionCC(Throwable cause)
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/FileUtil.html b/fmpp/docs/api/fmpp/util/FileUtil.html deleted file mode 100644 index 3ac57eb..0000000 --- a/fmpp/docs/api/fmpp/util/FileUtil.html +++ /dev/null @@ -1,529 +0,0 @@ - - - - - - -FileUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class FileUtil

-
-
- -
-
    -
  • -
    -
    -
    public class FileUtil
    -extends Object
    -
    Collection of file and path related functions.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FileUtil

        -
        public FileUtil()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getRelativePath

        -
        public static String getRelativePath(File fromDir,
        -                                     File toFileOrDir)
        -                              throws IOException
        -
        Reaturns the path of a file or directory relative to a directory, - in native format.
        -
        -
        Returns:
        -
        The relative path. - It never starts with separator char (/ on UN*X).
        -
        Throws:
        -
        IOException - if the two paths has no common parent directory - (such as C:\foo.txt and D:\foo.txt), or - the the paths are malformed.
        -
        -
      • -
      - - - -
        -
      • -

        copyFile

        -
        public static void copyFile(File src,
        -                            File dst,
        -                            boolean copyLMD)
        -                     throws IOException
        -
        Copies a file; silently overwrites the destination if already exists.
        -
        -
        Parameters:
        -
        copyLMD - tells if the last modification time of the original - file will be copied too.
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - - - - - -
        -
      • -

        isInsideOrEquals

        -
        public static boolean isInsideOrEquals(File file,
        -                                       File ascendant)
        -
        Returns true if file is inside ascendant or - file is the same as the ascendant, otherwise - returns false.
        -
      • -
      - - - -
        -
      • -

        isInside

        -
        public static boolean isInside(File file,
        -                               File ascendant)
        -
        Returns true if file is inside ascendant, - otherwise returns false.
        -
      • -
      - - - -
        -
      • -

        resolveRelativeUnixPath

        -
        public static File resolveRelativeUnixPath(File root,
        -                                           File wd,
        -                                           String path)
        -                                    throws IOException
        -
        Resolves relative UN*X path based on given root and working directory.
        -
        -
        Parameters:
        -
        root - root directory
        -
        wd - working directory (current direcory)
        -
        Throws:
        -
        IOException
        -
        -
      • -
      - - - -
        -
      • -

        compressPath

        -
        public static String compressPath(String path,
        -                                  int maxPathLength)
        -
        Returns a compressed version of the path. - For example, /foo/ba.../baaz.txt instead of - /foo/bar/blah/blah/blah/baaz.txt.
        -
        -
        Parameters:
        -
        path - the path to compress. Either native or UNIX format.
        -
        maxPathLength - the maximum length of the result. - Must be at least 4.
        -
        -
      • -
      - - - -
        -
      • -

        pathToUnixStyle

        -
        public static String pathToUnixStyle(String path)
        -
        Brings the path to UNI*X style format, so that it can be handled - with path pattern handling functions.
        -
      • -
      - - - -
        -
      • -

        removeSlashPrefix

        -
        public static String removeSlashPrefix(String path)
        -
      • -
      - - - -
        -
      • -

        pathPatternToPerl5Regex

        -
        public static String pathPatternToPerl5Regex(String text)
        -
        Converts UN*X style path to regular expression (originally, for Perl 5 dialect, but also works for Java's - dialect). - In additional to standard UN*X path meta characters (*, - ?) it understands **, that is the same as - in Ant. It assumes that the paths what you will later match - with the pattern are always starting with slash (they are absoulte paths - to an imaginary base).
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/FreemarkerUtil.html b/fmpp/docs/api/fmpp/util/FreemarkerUtil.html deleted file mode 100644 index 63acd9e..0000000 --- a/fmpp/docs/api/fmpp/util/FreemarkerUtil.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - -FreemarkerUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class FreemarkerUtil

-
-
- -
-
    -
  • -
    -
    -
    public class FreemarkerUtil
    -extends Object
    -
    FreeMarker related utilities.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FreemarkerUtil

        -
        public FreemarkerUtil()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        ftlVarToCoreJavaObject

        -
        public static Object ftlVarToCoreJavaObject(TemplateModel m)
        -                                     throws TemplateModelException
        -
        Converts TemplateModel-s to java.util.* and - java.lang.* objects. -
          -
        • FTL hash will be converted to java.util.Map -
        • FTL sequence and collection will be converted to - java.util.List -
        • FTL numbers will be converted to java.lang.Number -
        • FTL dates will be converted to java.util.Date -
        • FTL booleans will be converted to java.lang.Boolean -
        • FTL strings will be converted to java.lang.String -
        • Other FTL variables (transforms, methods, etc.) will be returned as - is. -
        - -

        Container types (hash, equence, etc.) will be converted recursively, - so the subvariables are also converted, and the subvariables of - subvariables are converted, etc. - -

        For multi-type variables a single type will be choosen, which is the - first type in the above list. - -

        If the TemplateModel supports - WrapperTemplateModel, unwrapping will be used only if - the type of the unwrapped object is proper according to the above list.

        -
        -
        Returns:
        -
        The converted object. You may do not modify the returned - objects, as it is unpredicalbe if it has effect on the converted - TemplateModel-s.
        -
        Throws:
        -
        TemplateModelException
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/InstallationException.html b/fmpp/docs/api/fmpp/util/InstallationException.html deleted file mode 100644 index 66ebda0..0000000 --- a/fmpp/docs/api/fmpp/util/InstallationException.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - -InstallationException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class InstallationException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    -
    public class InstallationException
    -extends ExceptionCC
    -
    There is a problem with the software environment.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        InstallationException

        -
        public InstallationException(String s)
        -
      • -
      - - - -
        -
      • -

        InstallationException

        -
        public InstallationException(String s,
        -                             Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/JSONParseException.html b/fmpp/docs/api/fmpp/util/JSONParseException.html deleted file mode 100644 index 5f15b06..0000000 --- a/fmpp/docs/api/fmpp/util/JSONParseException.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - -JSONParseException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class JSONParseException

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JSONParseException

        -
        public JSONParseException(String message,
        -                          String text,
        -                          int position,
        -                          String fileName)
        -
      • -
      - - - -
        -
      • -

        JSONParseException

        -
        public JSONParseException(String message,
        -                          String text,
        -                          int position,
        -                          String fileName,
        -                          Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/JSONParser.html b/fmpp/docs/api/fmpp/util/JSONParser.html deleted file mode 100644 index de526af..0000000 --- a/fmpp/docs/api/fmpp/util/JSONParser.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - -JSONParser (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class JSONParser

-
-
- -
-
    -
  • -
    -
    -
    public class JSONParser
    -extends Object
    -
    Simple JSON parser where JSON objects create Map-s, JSON array-s create List-s, and the others - create the obvious Java equivalents. Numbers will be Integer-s where they fit into that, otherwise they - will be Long-s, and if not even can store the value or if the value is not whole, BigDecimal-s.
    -
    -
    Since:
    -
    0.9.15
    -
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/MiscUtil.html b/fmpp/docs/api/fmpp/util/MiscUtil.html deleted file mode 100644 index a928051..0000000 --- a/fmpp/docs/api/fmpp/util/MiscUtil.html +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - -MiscUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class MiscUtil

-
-
- -
-
    -
  • -
    -
    -
    public class MiscUtil
    -extends Object
    -
    Miscellaneous utility methods.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        EMPTY_CLASS_ARRAY

        -
        public static final Class[] EMPTY_CLASS_ARRAY
        -
      • -
      - - - -
        -
      • -

        EMPTY_OBJECT_ARRAY

        -
        public static final Object[] EMPTY_OBJECT_ARRAY
        -
      • -
      - - - -
        -
      • -

        EMPTY_STRING_ARRAY

        -
        public static final String[] EMPTY_STRING_ARRAY
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MiscUtil

        -
        public MiscUtil()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        causeTrace

        -
        public static String causeTrace(Throwable e)
        -
        Returns the cause trace of an exception. This is similar to a J2SE 1.4+ - stack-trace, but it's shorter, because it does not contain the "at" - lines.
        -
      • -
      - - - - - - - -
        -
      • -

        dictionaryToMap

        -
        public static Map dictionaryToMap(Dictionary dict)
        -
      • -
      - - - - - - - -
        -
      • -

        listContainsObject

        -
        public static boolean listContainsObject(List list,
        -                                         Object o)
        -
        Checks if the list contains the given object (exactly the same instance).
        -
      • -
      - - - -
        -
      • -

        mapContainsObject

        -
        public static boolean mapContainsObject(Map map,
        -                                        Object o)
        -
        Checks if the map contains the given object (exactly the same instance) - as value.
        -
      • -
      - - - -
        -
      • -

        findObject

        -
        public static int findObject(List list,
        -                             Object o)
        -
        Returns the first index of the given object (exactly the same instance) - in the list.
        -
        -
        Returns:
        -
        the index of the first occurance, or -1 if not found.
        -
        -
      • -
      - - - -
        -
      • -

        checkXmlSupportAvailability

        -
        public static void checkXmlSupportAvailability(String requiredForThis)
        -                                        throws InstallationException
        -
        Checks if XML API-s (JAXP, SAX2, DOM) are present. - Can be a bit slow depending on the actual class loader setup.
        -
        -
        Parameters:
        -
        requiredForThis - a short sentence that describes for human reader - if for what do we need the XML support (e.g. - "Usage of xml data loader." or - "Set XML entity resolver."). This sentence is used - in error message of the InstallationException. - Can be null.
        -
        Throws:
        -
        InstallationException
        -
        -
      • -
      - - - -
        -
      • -

        numberToInt

        -
        public static int numberToInt(Number value)
        -
        Loseless convertion to int.
        -
        -
        Throws:
        -
        IllegalArgumentException - if the loseless conversion is not - possible. The error message contains the details.
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public static String[] add(String[] a1,
        -                           String[] a2)
        -
        Concatenates two arrays.
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/MultiListIterator.html b/fmpp/docs/api/fmpp/util/MultiListIterator.html deleted file mode 100644 index e3b6211..0000000 --- a/fmpp/docs/api/fmpp/util/MultiListIterator.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - -MultiListIterator (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class MultiListIterator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Iterator
    -
    -
    -
    -
    public class MultiListIterator
    -extends Object
    -implements Iterator
    -
    Iterates over multiple List-s. The elements of a list that was - added earlier will be iterated earlier.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MultiListIterator

        -
        public MultiListIterator()
        -
      • -
      - - - -
        -
      • -

        MultiListIterator

        -
        public MultiListIterator(List ls1)
        -
      • -
      - - - -
        -
      • -

        MultiListIterator

        -
        public MultiListIterator(List ls1,
        -                         List ls2)
        -
      • -
      - - - -
        -
      • -

        MultiListIterator

        -
        public MultiListIterator(List ls1,
        -                         List ls2,
        -                         List ls3)
        -
      • -
      - - - -
        -
      • -

        MultiListIterator

        -
        public MultiListIterator(List ls1,
        -                         List ls2,
        -                         List ls3,
        -                         List ls4)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        addList

        -
        public void addList(List ls)
        -
        Use this to add more lists after the constructor.
        -
      • -
      - - - -
        -
      • -

        hasNext

        -
        public boolean hasNext()
        -
        -
        Specified by:
        -
        hasNext in interface Iterator
        -
        -
      • -
      - - - - - - - -
        -
      • -

        remove

        -
        public void remove()
        -
        -
        Specified by:
        -
        remove in interface Iterator
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/NullOutputStream.html b/fmpp/docs/api/fmpp/util/NullOutputStream.html deleted file mode 100644 index 70e2c67..0000000 --- a/fmpp/docs/api/fmpp/util/NullOutputStream.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - -NullOutputStream (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class NullOutputStream

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/NullWriter.html b/fmpp/docs/api/fmpp/util/NullWriter.html deleted file mode 100644 index 302b5b0..0000000 --- a/fmpp/docs/api/fmpp/util/NullWriter.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - -NullWriter (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class NullWriter

-
-
- -
- -
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/RuntimeExceptionCC.html b/fmpp/docs/api/fmpp/util/RuntimeExceptionCC.html deleted file mode 100644 index 9dd00fc..0000000 --- a/fmpp/docs/api/fmpp/util/RuntimeExceptionCC.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - -RuntimeExceptionCC (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class RuntimeExceptionCC

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Serializable
    -
    -
    -
    Direct Known Subclasses:
    -
    BugException
    -
    -
    -
    -
    public class RuntimeExceptionCC
    -extends RuntimeException
    -
    RuntimeException that emulates J2SE 1.4+ cause-chains if it runs - on earlier versions. Furthermore, in FMPP error messages, the message of this - exception is trusted (i.e. no need to print the class name), as it is inside - an fmpp.* package.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
- -
-
- -
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/StringUtil.ParseException.html b/fmpp/docs/api/fmpp/util/StringUtil.ParseException.html deleted file mode 100644 index 8d6084a..0000000 --- a/fmpp/docs/api/fmpp/util/StringUtil.ParseException.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - -StringUtil.ParseException (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class StringUtil.ParseException

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message)
        -
      • -
      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message,
        -                      int position)
        -
      • -
      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message,
        -                      String text,
        -                      int position,
        -                      String fileName)
        -
      • -
      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message,
        -                      Throwable cause)
        -
      • -
      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message,
        -                      int position,
        -                      Throwable cause)
        -
      • -
      - - - -
        -
      • -

        ParseException

        -
        public ParseException(String message,
        -                      String text,
        -                      int position,
        -                      String fileName,
        -                      Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/StringUtil.html b/fmpp/docs/api/fmpp/util/StringUtil.html deleted file mode 100644 index a8a3d21..0000000 --- a/fmpp/docs/api/fmpp/util/StringUtil.html +++ /dev/null @@ -1,1218 +0,0 @@ - - - - - - -StringUtil (FMPP 0.9.15 API) - - - - - - - - - - - - -
-
fmpp.util
-

Class StringUtil

-
-
- -
-
    -
  • -
    -
    -
    public class StringUtil
    -extends Object
    -
    Collection of string manipulation functions.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        LINE_BREAK

        -
        public static final String LINE_BREAK
        -
        The default line-break string used by the methods in this class.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringUtil

        -
        public StringUtil()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        htmlEnc

        -
        public static String htmlEnc(String s)
        -
        HTML encoding (does not convert line breaks). - Replaces all '>' '<' '&' and '"' with entity reference
        -
      • -
      - - - -
        -
      • -

        xmlEnc

        -
        public static String xmlEnc(String s)
        -
        XML Encoding. - Replaces all '>' '<' '&', "'" and '"' with entity reference
        -
      • -
      - - - -
        -
      • -

        xmlEncNQ

        -
        public static String xmlEncNQ(String s)
        -
        XML encoding without replacing apostrophes and quotation marks.
        -
        -
        See Also:
        -
        xmlEnc(String)
        -
        -
      • -
      - - - -
        -
      • -

        rtfEnc

        -
        public static String rtfEnc(String s)
        -
        Rich Text Format encoding (does not replace line breaks). - Escapes all '\' '{' '}' and '"'
        -
      • -
      - - - -
        -
      • -

        jQuoteOrName

        -
        public static String jQuoteOrName(char c)
        -
        Quotes character as Java language character, except quote characters, - which are referred with name.
        -
      • -
      - - - -
        -
      • -

        jQuote

        -
        public static String jQuote(char c)
        -
        Quotes string as Java language character.
        -
      • -
      - - - -
        -
      • -

        jQuote

        -
        public static String jQuote(String s)
        -
        Quotes string as Java language string literal.
        -
      • -
      - - - -
        -
      • -

        ftlStringLiteralDec

        -
        public static String ftlStringLiteralDec(String s)
        -                                  throws StringUtil.ParseException
        -
        FTL string literal decoding. - - \\, \", \', \n, \t, \r, \b and \f will be replaced according to - Java rules. In additional, it knows \g, \l, \a and \{ which are - replaced with <, >, & and { respectively. - \x works as hexadecimal character code escape. The character - codes are interpreted according to UCS basic plane (Unicode). - "f\x006Fo", "f\x06Fo" and "f\x6Fo" will be "foo". - "f\x006F123" will be "foo123" as the maximum number of digits is 4. - - All other \X (where X is any character not mentioned above or - End-of-string) will cause a StringUtil.ParseException.
        -
        -
        Parameters:
        -
        s - String literal without the surrounding quotation marks
        -
        Returns:
        -
        String with all escape sequences resolved
        -
        Throws:
        -
        StringUtil.ParseException - if there string contains illegal escapes
        -
        -
      • -
      - - - -
        -
      • -

        stringToPerl5Regex

        -
        public static String stringToPerl5Regex(String text)
        -
        Convers string to Perl 5 regular expression. - This means that regular expression metacharacters will be escaped.
        -
      • -
      - - - - - - - -
        -
      • -

        split

        -
        public static String[] split(String s,
        -                             char c,
        -                             boolean trim)
        -
        Splits a string at the specified character, and optionally trims the - items.
        -
      • -
      - - - -
        -
      • -

        split

        -
        public static String[] split(String s,
        -                             String sep)
        -
        Splits a string at the specified string.
        -
      • -
      - - - -
        -
      • -

        splitAtWS

        -
        public static String[] splitAtWS(String text)
        -
        Splits a string at white-spaces. A continous sequence of one or more - white-space is considered as a single separator. If the string is - starting or ending with a separator, then that separator is silently - ignored. Thus, the result array contains only trimmed non-0-length - strings.
        -
      • -
      - - - -
        -
      • -

        replace

        -
        public static String replace(String text,
        -                             String oldsub,
        -                             String newsub)
        -
        Replaces all occurances of a sub-string in a string.
        -
        -
        Parameters:
        -
        text - The string where it will replace oldsub with - newsub.
        -
        Returns:
        -
        String The string after the replacements.
        -
        -
      • -
      - - - - - - - -
        -
      • -

        expandTabs

        -
        public static String expandTabs(String text,
        -                                int tabWidth,
        -                                int startCol)
        -
        Replaces all occurances of character tab with spaces.
        -
        -
        Parameters:
        -
        tabWidth - the distance of tab stops.
        -
        startCol - the index of the column in which the first character of - the string is from the left edge of the page. The index of the first - column is 0.
        -
        Returns:
        -
        String The string after the replacements.
        -
        -
      • -
      - - - -
        -
      • -

        chomp

        -
        public static String chomp(String s)
        -
        Removes the line-break from the end of the string.
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        wrap

        -
        public static String wrap(String text,
        -                          int screenWidth,
        -                          int indent)
        -
        Hard-wraps flow-text. This is a convenience method that equivalent with - wrap(text, screenWidth, indent, indent, LINE_BREAK, false).
        -
        -
        See Also:
        -
        wrap(String, int, int, int, String, boolean)
        -
        -
      • -
      - - - -
        -
      • -

        wrap

        -
        public static String wrap(String text,
        -                          int screenWidth,
        -                          int firstIndent,
        -                          int indent)
        -
        Hard-wraps flow-text. This is a convenience method that equivalent with - wrap(text, screenWidth, firstIndent, indent, LINE_BREAK, - false).
        -
        -
        See Also:
        -
        wrap(String, int, int, int, String, boolean)
        -
        -
      • -
      - - - - - - - -
        -
      • -

        wrap

        -
        public static String wrap(String text,
        -                          int screenWidth,
        -                          int firstIndent,
        -                          int indent,
        -                          String lineBreak)
        -
        Hard-wraps flow-text. This is a convenience method that equivalent with - wrap(text, screenWidth, firstIndent, indent, lineBreak, - false).
        -
        -
        See Also:
        -
        wrap(String, int, int, int, String, boolean)
        -
        -
      • -
      - - - - - - - -
        -
      • -

        wrap

        -
        public static String wrap(String text,
        -                          int screenWidth,
        -                          int firstIndent,
        -                          int indent,
        -                          String lineBreak,
        -                          boolean traceMode)
        -
        Hard-wraps flow-text.
        -
        -
        Parameters:
        -
        text - The flow-text to wrap. The explicit line-breaks of the - source text will be kept. All types of line-breaks (UN*X, Mac, DOS/Win) - are understood.
        -
        screenWidth - The (minimum) width of the screen. It does not - utilize the screenWidth-th column of the screen to store - characters, except line-breaks (because some terminals/editors - do an automatic line-break when you write visible character there, - and some doesn't... so it is unpredictable if an explicit line-break - is needed or not.).
        -
        firstIndent - The indentation of the first line
        -
        indent - The indentation of all lines but the first line
        -
        lineBreak - The String used for line-breaks
        -
        traceMode - Set this true if the input text is a Java stack - trace. In this mode, all lines starting with - optional indentation + 'at' + space are treated as location - lines, and will be indented and wrapped in a slightly special way.
        -
        Throws:
        -
        IllegalArgumentException - if the number of columns remaining for - the text is less than 2.
        -
        -
      • -
      - - - -
        -
      • -

        wrap

        -
        public static StringBuffer wrap(StringBuffer text,
        -                                int screenWidth,
        -                                int firstIndent,
        -                                int indent,
        -                                String lineBreak,
        -                                boolean traceMode)
        -
        Hard-wraps flow-text. Uses StringBuffer-s instead of String-s. - This is the method that is internally used by all other wrap - variations, so if you are working with StringBuffers anyway, it gives - better performance.
        -
        -
        See Also:
        -
        wrap(String, int, int, int, String, boolean)
        -
        -
      • -
      - - - -
        -
      • -

        createSourceCodeErrorMessage

        -
        public static String createSourceCodeErrorMessage(String message,
        -                                                  String srcCode,
        -                                                  int position,
        -                                                  String fileName,
        -                                                  int maxQuotLength)
        -
      • -
      - - - - - - - - - - - - - - - - - - - - - - - -
        -
      • -

        normalizeLinebreaks

        -
        public static String normalizeLinebreaks(String s)
        -
        Converts all line-breaks to UN*X linebreaks ("\n"). The - input text can contain UN*X, DOS (Windows) and Mac linebreaks mixed.
        -
      • -
      - - - -
        -
      • -

        repeat

        -
        public static String repeat(String s,
        -                            int n)
        -
        -
        Since:
        -
        0.9.15
        -
        -
      • -
      - - - -
        -
      • -

        capitalizeFirst

        -
        public static String capitalizeFirst(String s)
        -
        -
        Since:
        -
        0.9.15
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.BadArgsException.html b/fmpp/docs/api/fmpp/util/class-use/ArgsParser.BadArgsException.html deleted file mode 100644 index 0301a59..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.BadArgsException.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class fmpp.util.ArgsParser.BadArgsException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.ArgsParser.BadArgsException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.OptionDefinition.html b/fmpp/docs/api/fmpp/util/class-use/ArgsParser.OptionDefinition.html deleted file mode 100644 index 8b65089..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.OptionDefinition.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - -Uses of Class fmpp.util.ArgsParser.OptionDefinition (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.ArgsParser.OptionDefinition

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.html b/fmpp/docs/api/fmpp/util/class-use/ArgsParser.html deleted file mode 100644 index e1c1f81..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/ArgsParser.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.ArgsParser (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.ArgsParser

-
-
No usage of fmpp.util.ArgsParser
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/BorderedReader.html b/fmpp/docs/api/fmpp/util/class-use/BorderedReader.html deleted file mode 100644 index 8561a0a..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/BorderedReader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.BorderedReader (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.BorderedReader

-
-
No usage of fmpp.util.BorderedReader
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/BugException.html b/fmpp/docs/api/fmpp/util/class-use/BugException.html deleted file mode 100644 index 286db77..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/BugException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.BugException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.BugException

-
-
No usage of fmpp.util.BugException
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/DataLoaderUtil.html b/fmpp/docs/api/fmpp/util/class-use/DataLoaderUtil.html deleted file mode 100644 index b891f29..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/DataLoaderUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.DataLoaderUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.DataLoaderUtil

-
-
No usage of fmpp.util.DataLoaderUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/ExceptionCC.html b/fmpp/docs/api/fmpp/util/class-use/ExceptionCC.html deleted file mode 100644 index e946f4e..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/ExceptionCC.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - -Uses of Class fmpp.util.ExceptionCC (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.ExceptionCC

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/FileUtil.html b/fmpp/docs/api/fmpp/util/class-use/FileUtil.html deleted file mode 100644 index 1b503de..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/FileUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.FileUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.FileUtil

-
-
No usage of fmpp.util.FileUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/FreemarkerUtil.html b/fmpp/docs/api/fmpp/util/class-use/FreemarkerUtil.html deleted file mode 100644 index ceeb3bf..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/FreemarkerUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.FreemarkerUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.FreemarkerUtil

-
-
No usage of fmpp.util.FreemarkerUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/InstallationException.html b/fmpp/docs/api/fmpp/util/class-use/InstallationException.html deleted file mode 100644 index c09fd46..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/InstallationException.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - -Uses of Class fmpp.util.InstallationException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.InstallationException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/JSONParseException.html b/fmpp/docs/api/fmpp/util/class-use/JSONParseException.html deleted file mode 100644 index 95a6d49..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/JSONParseException.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - -Uses of Class fmpp.util.JSONParseException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.JSONParseException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/JSONParser.html b/fmpp/docs/api/fmpp/util/class-use/JSONParser.html deleted file mode 100644 index 22a1a21..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/JSONParser.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.JSONParser (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.JSONParser

-
-
No usage of fmpp.util.JSONParser
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/MiscUtil.html b/fmpp/docs/api/fmpp/util/class-use/MiscUtil.html deleted file mode 100644 index 36cdb01..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/MiscUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.MiscUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.MiscUtil

-
-
No usage of fmpp.util.MiscUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/MultiListIterator.html b/fmpp/docs/api/fmpp/util/class-use/MultiListIterator.html deleted file mode 100644 index 4babb2a..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/MultiListIterator.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.MultiListIterator (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.MultiListIterator

-
-
No usage of fmpp.util.MultiListIterator
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/NullOutputStream.html b/fmpp/docs/api/fmpp/util/class-use/NullOutputStream.html deleted file mode 100644 index 5b21517..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/NullOutputStream.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class fmpp.util.NullOutputStream (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.NullOutputStream

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/NullWriter.html b/fmpp/docs/api/fmpp/util/class-use/NullWriter.html deleted file mode 100644 index c0e1a90..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/NullWriter.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class fmpp.util.NullWriter (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.NullWriter

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/RuntimeExceptionCC.html b/fmpp/docs/api/fmpp/util/class-use/RuntimeExceptionCC.html deleted file mode 100644 index 03f3903..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/RuntimeExceptionCC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class fmpp.util.RuntimeExceptionCC (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.RuntimeExceptionCC

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/StringUtil.ParseException.html b/fmpp/docs/api/fmpp/util/class-use/StringUtil.ParseException.html deleted file mode 100644 index 6323352..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/StringUtil.ParseException.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - -Uses of Class fmpp.util.StringUtil.ParseException (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.StringUtil.ParseException

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/class-use/StringUtil.html b/fmpp/docs/api/fmpp/util/class-use/StringUtil.html deleted file mode 100644 index 8774d5b..0000000 --- a/fmpp/docs/api/fmpp/util/class-use/StringUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class fmpp.util.StringUtil (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Class
fmpp.util.StringUtil

-
-
No usage of fmpp.util.StringUtil
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/package-frame.html b/fmpp/docs/api/fmpp/util/package-frame.html deleted file mode 100644 index ad0011b..0000000 --- a/fmpp/docs/api/fmpp/util/package-frame.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -fmpp.util (FMPP 0.9.15 API) - - - - - -

fmpp.util

- - - diff --git a/fmpp/docs/api/fmpp/util/package-summary.html b/fmpp/docs/api/fmpp/util/package-summary.html deleted file mode 100644 index 7cc914c..0000000 --- a/fmpp/docs/api/fmpp/util/package-summary.html +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - -fmpp.util (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Package fmpp.util

-
-
Collection of more-less FMPP independent utility classes.
-
-

See: Description

-
-
-
    -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Class Summary 
    ClassDescription
    ArgsParser -
    Simple command-line argument parser that mimics the logic of UN*X - tools as ls.
    -
    BorderedReader -
    Reader that can insert a string before and after an encapsulated - character stream.
    -
    DataLoaderUtil -
    Utility methods for writing data loaders.
    -
    FileUtil -
    Collection of file and path related functions.
    -
    FreemarkerUtil -
    FreeMarker related utilities.
    -
    JSONParser -
    Simple JSON parser where JSON objects create Map-s, JSON array-s create List-s, and the others - create the obvious Java equivalents.
    -
    MiscUtil -
    Miscellaneous utility methods.
    -
    MultiListIterator -
    Iterates over multiple List-s.
    -
    NullOutputStream -
    OutputStream that simply drops what it gets.
    -
    NullWriter -
    Writer that simply drops what it gets.
    -
    StringUtil -
    Collection of string manipulation functions.
    -
    -
  • -
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Exception Summary 
    ExceptionDescription
    ArgsParser.BadArgsException -
    The user has entered invalid options in the command-line.
    -
    BugException -
    A bug has been detected.
    -
    ExceptionCC -
    This was used for emulating cause-chains on Java earlier than 1.4, but as FMPP now requires 1.4, it just dispatches - to Exception.
    -
    InstallationException -
    There is a problem with the software environment.
    -
    JSONParseException 
    RuntimeExceptionCC -
    RuntimeException that emulates J2SE 1.4+ cause-chains if it runs - on earlier versions.
    -
    StringUtil.ParseException -
    Formal (syntactical) problem with the text.
    -
    -
  • -
- - - -

Package fmpp.util Description

-

Collection of more-less FMPP independent utility classes.

-
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/package-tree.html b/fmpp/docs/api/fmpp/util/package-tree.html deleted file mode 100644 index 3cb59c9..0000000 --- a/fmpp/docs/api/fmpp/util/package-tree.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -fmpp.util Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Hierarchy For Package fmpp.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- - - - - - diff --git a/fmpp/docs/api/fmpp/util/package-use.html b/fmpp/docs/api/fmpp/util/package-use.html deleted file mode 100644 index b0318c6..0000000 --- a/fmpp/docs/api/fmpp/util/package-use.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - -Uses of Package fmpp.util (FMPP 0.9.15 API) - - - - - - - - - - - -
-

Uses of Package
fmpp.util

-
-
- -
- - - - - - diff --git a/fmpp/docs/api/help-doc.html b/fmpp/docs/api/help-doc.html deleted file mode 100644 index c607cfd..0000000 --- a/fmpp/docs/api/help-doc.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -API Help (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
-
    -
  • -

    Overview

    -

    The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

    -
  • -
  • -

    Package

    -

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    -
      -
    • Interfaces (italic)
    • -
    • Classes
    • -
    • Enums
    • -
    • Exceptions
    • -
    • Errors
    • -
    • Annotation Types
    • -
    -
  • -
  • -

    Class/Interface

    -

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
      -
    • Class inheritance diagram
    • -
    • Direct Subclasses
    • -
    • All Known Subinterfaces
    • -
    • All Known Implementing Classes
    • -
    • Class/interface declaration
    • -
    • Class/interface description
    • -
    -
      -
    • Nested Class Summary
    • -
    • Field Summary
    • -
    • Constructor Summary
    • -
    • Method Summary
    • -
    -
      -
    • Field Detail
    • -
    • Constructor Detail
    • -
    • Method Detail
    • -
    -

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    -
  • -
  • -

    Annotation Type

    -

    Each annotation type has its own separate page with the following sections:

    -
      -
    • Annotation Type declaration
    • -
    • Annotation Type description
    • -
    • Required Element Summary
    • -
    • Optional Element Summary
    • -
    • Element Detail
    • -
    -
  • -
  • -

    Enum

    -

    Each enum has its own separate page with the following sections:

    -
      -
    • Enum declaration
    • -
    • Enum description
    • -
    • Enum Constant Summary
    • -
    • Enum Constant Detail
    • -
    -
  • -
  • -

    Use

    -

    Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

    -
  • -
  • -

    Tree (Class Hierarchy)

    -

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    -
      -
    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • -
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
    • -
    -
  • -
  • -

    Deprecated API

    -

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

    -
  • -
  • -

    Index

    -

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

    -
  • -
  • -

    Prev/Next

    -

    These links take you to the next or previous class, interface, package, or related page.

    -
  • -
  • -

    Frames/No Frames

    -

    These links show and hide the HTML frames. All pages are available with or without frames.

    -
  • -
  • -

    All Classes

    -

    The All Classes link shows all classes and interfaces except non-static nested types.

    -
  • -
  • -

    Serialized Form

    -

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

    -
  • -
  • -

    Constant Field Values

    -

    The Constant Field Values page lists the static final fields and their values.

    -
  • -
-This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/index-all.html b/fmpp/docs/api/index-all.html deleted file mode 100644 index 6250f1e..0000000 --- a/fmpp/docs/api/index-all.html +++ /dev/null @@ -1,3456 +0,0 @@ - - - - - - -Index (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J K L M N O P Q R S T U V W X  - - -

A

-
-
AbstractTextDataLoader - Class in fmpp.dataloaders
-
-
Returns a string based on a plain text file.
-
-
AbstractTextDataLoader() - Constructor for class fmpp.dataloaders.AbstractTextDataLoader
-
 
-
add(String, Object) - Method in class fmpp.setting.Settings
-
-
Adds a setting value.
-
-
add(Map) - Method in class fmpp.setting.Settings
-
-
Adds all name-value pairs stored in the map with - Settings.add(String, Object).
-
-
add(String[], String[]) - Static method in class fmpp.util.MiscUtil
-
-
Concatenates two arrays.
-
-
addConfiguredBorders(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredData(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredFreemarkerLinks(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredLocalData(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredModes(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredTurns(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addConfiguredXmlRenderings(AntTask.AntAttributeSubstitution) - Method in class fmpp.tools.AntTask
-
 
-
addData(String, Object) - Method in class fmpp.Engine
-
-
Adds a variable that will be visible for all templates when the - processing session executes.
-
-
addData(String, byte) - Method in class fmpp.Engine
-
-
Convenience method for adding a Byte object.
-
-
addData(String, short) - Method in class fmpp.Engine
-
-
Convenience method for adding a Short object.
-
-
addData(String, int) - Method in class fmpp.Engine
-
-
Convenience method for adding a Integer object.
-
-
addData(String, long) - Method in class fmpp.Engine
-
-
Convenience method for adding a Long object.
-
-
addData(String, float) - Method in class fmpp.Engine
-
-
Convenience method for adding a Float object.
-
-
addData(String, double) - Method in class fmpp.Engine
-
-
Convenience method for adding a Double object.
-
-
addData(String, char) - Method in class fmpp.Engine
-
-
Convenience method for adding a Character object.
-
-
addData(String, boolean) - Method in class fmpp.Engine
-
-
Convenience method for adding a Boolean object.
-
-
addData(Map) - Method in class fmpp.Engine
-
-
Adds all entries with Engine.addData(String, Object).
-
-
addDefault(String, Object) - Method in class fmpp.setting.Settings
-
-
Adds a setting value with low priority.
-
-
addDefaults(Map) - Method in class fmpp.setting.Settings
-
-
Adds all entries stored in the map with - Settings.addDefault(String, Object).
-
-
addDefaultsWithStrings(Properties) - Method in class fmpp.setting.Settings
-
-
Same as Settings.addDefaults(Map), but uses a Properties - object, so the values are strings.
-
-
addDefaultWithString(String, String) - Method in class fmpp.setting.Settings
-
-
Same as Settings.addDefault(String, Object), but uses string value.
-
-
addDocumentElement(String, String) - Method in class fmpp.XmlRenderingConfiguration
-
-
Adds an element to the list of document elements.
-
-
addFooterChooser(String, String) - Method in class fmpp.Engine
-
- -
-
addFooterChooser(int, String, String) - Method in class fmpp.Engine
-
-
Adds a new entry to the end of path-pattern -> footer mapping list of the - given layer.
-
-
addFreemarkerLink(String, File) - Method in class fmpp.Engine
-
-
Adds a FreeMarker link.
-
-
addHeaderChooser(String, String) - Method in class fmpp.Engine
-
- -
-
addHeaderChooser(int, String, String) - Method in class fmpp.Engine
-
-
Adds a new entry to the end of path-pattern -> header mapping list of the - given layer.
-
-
addList(List) - Method in class fmpp.util.MultiListIterator
-
-
Use this to add more lists after the constructor.
-
-
addLocalDataBuilder(int, String, LocalDataBuilder) - Method in class fmpp.Engine
-
-
Adds a local data builder.
-
-
addLocalDataBuilder(LocalDataBuilder) - Method in class fmpp.XmlRenderingConfiguration
-
-
Adds an extra local data builder that is invoked after all other - local data builders.
-
-
addModeChooser(String, int) - Method in class fmpp.Engine
-
-
Adds a new entry to the end of path-pattern -> processing-mode - mapping list.
-
-
addOption(String, String) - Method in class fmpp.util.ArgsParser
-
-
Defines an option for the parser.
-
-
addProgressListener(ProgressListener) - Method in class fmpp.Engine
-
-
Adds a progress listener to the list of progress listeners.
-
-
addProgressListener(ProgressListener) - Method in class fmpp.setting.Settings
-
-
Adds a progress listener.
-
-
addRemoveExtension(String) - Method in class fmpp.Engine
-
-
Adds an extension to the list of extensions to remove.
-
-
addRemovePostfix(String) - Method in class fmpp.Engine
-
-
Adds a postfix to the list of file name postfixes to remove.
-
-
addReplaceExtension(String, String) - Method in class fmpp.Engine
-
-
Adds an old-exension -> new-extension pair to the list of - extension replacements.
-
-
addSourcePathPattern(String) - Method in class fmpp.XmlRenderingConfiguration
-
-
Adds a path to the list of source path patterns.
-
-
addText(String) - Method in class fmpp.tools.AntTask.AntAttributeSubstitution
-
 
-
AddTransform - Class in fmpp.models
-
-
Adds/inserts an item to a WritableSequence.
-
-
AddTransform() - Constructor for class fmpp.models.AddTransform
-
 
-
addTurnChooser(String, int) - Method in class fmpp.Engine
-
-
Adds a new entry to the end of path-pattern -> turn-number mapping list.
-
-
addWithString(String, String) - Method in class fmpp.setting.Settings
-
-
Same as Settings.add(String, Object), but uses string value.
-
-
addWithStrings(Properties) - Method in class fmpp.setting.Settings
-
-
Same as Settings.add(Map), but uses a Properties object, - so the values are strings.
-
-
addXmlDataLoaderOption(String, Object) - Method in class fmpp.XmlRenderingConfiguration
-
-
Adds or replaces an option in the map of xml data loader - options.
-
-
addXmlRenderingConfiguration(XmlRenderingConfiguration) - Method in class fmpp.Engine
-
-
Adds as XML rendering configuration.
-
-
AntAttributeSubstitution() - Constructor for class fmpp.tools.AntTask.AntAttributeSubstitution
-
 
-
AntDataLoader - Class in fmpp.dataloaders
-
-
Abstract base class of Ant related data loaders.
-
-
AntDataLoader() - Constructor for class fmpp.dataloaders.AntDataLoader
-
 
-
AntProgressListener - Class in fmpp.progresslisteners
-
-
Designed to show the progress for Ant tasks.
-
-
AntProgressListener(Task) - Constructor for class fmpp.progresslisteners.AntProgressListener
-
-
Output will be printed to the stdout.
-
-
AntProgressListener(Task, boolean) - Constructor for class fmpp.progresslisteners.AntProgressListener
-
 
-
AntProjectDataLoader - Class in fmpp.dataloaders
-
-
Returns the Ant project object.
-
-
AntProjectDataLoader() - Constructor for class fmpp.dataloaders.AntProjectDataLoader
-
 
-
AntPropertiesDataLoader - Class in fmpp.dataloaders
-
-
Returns the Map of all Ant properties, or of the selected Ant properties.
-
-
AntPropertiesDataLoader() - Constructor for class fmpp.dataloaders.AntPropertiesDataLoader
-
 
-
AntPropertyDataLoader - Class in fmpp.dataloaders
-
-
Returns the value of an Ant property.
-
-
AntPropertyDataLoader() - Constructor for class fmpp.dataloaders.AntPropertyDataLoader
-
 
-
AntTask - Class in fmpp.tools
-
-
Ant task to process files selected by pattern sets.
-
-
AntTask() - Constructor for class fmpp.tools.AntTask
-
 
-
AntTask.AntAttributeSubstitution - Class in fmpp.tools
-
-
Used internally (must be public class for technical reasons).
-
-
AntTaskDataLoader - Class in fmpp.dataloaders
-
-
Returns the FMPP Ant task object.
-
-
AntTaskDataLoader() - Constructor for class fmpp.dataloaders.AntTaskDataLoader
-
 
-
args - Variable in class fmpp.dataloaders.FileDataLoader
-
 
-
ArgsParser - Class in fmpp.util
-
-
Simple command-line argument parser that mimics the logic of UN*X - tools as ls.
-
-
ArgsParser() - Constructor for class fmpp.util.ArgsParser
-
-
Creates a parser.
-
-
ArgsParser.BadArgsException - Exception in fmpp.util
-
-
The user has entered invalid options in the command-line.
-
-
ArgsParser.OptionDefinition - Class in fmpp.util
-
-
Describes and option.
-
-
ATTRIBUTE_ANT_TASK - Static variable in class fmpp.dataloaders.AntDataLoader
-
-
The name of the Engine attribute that must store the Ant task - object.
-
-
- - - -

B

-
-
beginNestedOutputFile(String) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the begin tag of the corresponding directive of the - pp hash.
-
-
beginNestedOutputFile(String, boolean) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the begin tag of the corresponding directive of the - pp hash.
-
-
boolParam(Object, String) - Method in class fmpp.models.TemplateModelUtils
-
 
-
BorderedReader - Class in fmpp.util
-
-
Reader that can insert a string before and after an encapsulated - character stream.
-
-
BorderedReader(String, Reader, String) - Constructor for class fmpp.util.BorderedReader
-
 
-
BshLocalDataBuilder - Class in fmpp.localdatabuilders
-
-
Deduces the file name of a BeanShell scrip file from the source file - name, and executes that script to create local data.
-
-
BshLocalDataBuilder() - Constructor for class fmpp.localdatabuilders.BshLocalDataBuilder
-
-
Creates new instance.
-
-
BugException - Exception in fmpp.util
-
-
A bug has been detected.
-
-
BugException(String) - Constructor for exception fmpp.util.BugException
-
 
-
BugException(String, Throwable) - Constructor for exception fmpp.util.BugException
-
 
-
build(Engine, TemplateEnvironment) - Method in interface fmpp.LocalDataBuilder
-
-
Returns the variables that could be added to the local data.
-
-
build(Engine, TemplateEnvironment) - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
build(Engine, TemplateEnvironment) - Method in class fmpp.localdatabuilders.CachingLocalDataBuilder
-
-
Takes care of caching, and calls CachingLocalDataBuilder.build(Engine) if no cached - result is available.
-
-
build(Engine) - Method in class fmpp.localdatabuilders.CachingLocalDataBuilder
-
-
Override this method in your local data builder class.
-
-
build(Engine, TemplateEnvironment) - Method in class fmpp.localdatabuilders.MapLocalDataBuilder
-
 
-
build(Engine) - Method in class fmpp.localdatabuilders.TddHashLocalDataBuilder
-
 
-
build(Engine, Template, File) - Method in interface fmpp.TemplateDataModelBuilder
-
-
Deprecated.
-
Returns the top-level variables that will be available for the template.
-
-
- - - -

C

-
-
CachingLocalDataBuilder - Class in fmpp.localdatabuilders
-
-
Stores the returned Map, and reuses it - CachingLocalDataBuilder.build(Engine, TemplateEnvironment) is invoked again during the same - processing session.
-
-
CachingLocalDataBuilder() - Constructor for class fmpp.localdatabuilders.CachingLocalDataBuilder
-
 
-
capitalizeFirst(String) - Static method in class fmpp.util.StringUtil
-
 
-
causeMessages(Throwable) - Static method in class fmpp.util.MiscUtil
-
-
This is the same as MiscUtil.causeTrace(java.lang.Throwable), but it doesn't print the - exception class name if the class is inside an fmpp package.
-
-
causeTrace(Throwable) - Static method in class fmpp.util.MiscUtil
-
-
Returns the cause trace of an exception.
-
-
changeOutputFile(String) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
changeOutputFile(String, boolean) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
checkXmlSupportAvailability(String) - Method in class fmpp.Engine
-
-
Checks if XML support is available.
-
-
checkXmlSupportAvailability(String) - Static method in class fmpp.util.MiscUtil
-
-
Checks if XML API-s (JAXP, SAX2, DOM) are present.
-
-
chomp(String) - Static method in class fmpp.util.StringUtil
-
-
Removes the line-break from the end of the string.
-
-
chomp(StringBuffer) - Static method in class fmpp.util.StringUtil
-
-
Removes the line-break from the end of the StringBuffer.
-
-
classForName(String) - Static method in class fmpp.util.MiscUtil
-
-
Tries to load the class with the current context class loader, - and only then with the current defining class loader.
-
-
clearAttribues() - Method in class fmpp.Engine
-
-
Removes all attributes.
-
-
clearAttribues() - Method in class fmpp.setting.Settings
-
-
Removes all engine attributes.
-
-
clearData() - Method in class fmpp.Engine
-
-
Removes all data.
-
-
clearDocumentElements() - Method in class fmpp.XmlRenderingConfiguration
-
-
Empties the document element list.
-
-
clearFooterChoosers() - Method in class fmpp.Engine
-
-
Removes all footer choosers.
-
-
clearFreemarkerLinks() - Method in class fmpp.Engine
-
-
Removes all FreeMarker links.
-
-
clearHeaderChoosers() - Method in class fmpp.Engine
-
-
Removes all header choosers.
-
-
clearLocalDataBuilders() - Method in class fmpp.Engine
-
-
Removes all local data builders.
-
-
clearLocalDataBuilders() - Method in class fmpp.XmlRenderingConfiguration
-
-
Removes all local data builders.
-
-
clearModeChoosers() - Method in class fmpp.Engine
-
-
Removes all processing mode choosers.
-
-
clearProgressListeners() - Method in class fmpp.Engine
-
-
Removes all progress listeners from the list of progress listeners that - were added with Engine.addProgressListener(fmpp.ProgressListener).
-
-
clearProgressListeners() - Method in class fmpp.setting.Settings
-
-
Removes all progress listeneres.
-
-
clearRemoveExtensions() - Method in class fmpp.Engine
-
 
-
clearRemovePostfixes() - Method in class fmpp.Engine
-
 
-
clearReplaceExtensions() - Method in class fmpp.Engine
-
 
-
clearSharedVariables() - Method in class fmpp.Engine
-
-
Deprecated. -
Use Engine.clearData() instead.
-
-
-
clearSourcePathPatterns() - Method in class fmpp.XmlRenderingConfiguration
-
-
Empties the list of source path patterns.
-
-
ClearTransform - Class in fmpp.models
-
-
Removes all items from a WritableSequence or WritableHash.
-
-
ClearTransform() - Constructor for class fmpp.models.ClearTransform
-
 
-
clearTurnChoosers() - Method in class fmpp.Engine
-
-
Removes all turn choosers.
-
-
clearXmlDataLoaderOptions() - Method in class fmpp.XmlRenderingConfiguration
-
-
Removes all xml data loader options.
-
-
clearXmlRenderingConfigurations() - Method in class fmpp.Engine
-
-
Removes all XML rendering configurations.
-
-
clone() - Method in class fmpp.models.WritableHash
-
 
-
clone() - Method in class fmpp.models.WritableSequence
-
 
-
close() - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Closes the PrintWriter used for printing into the log.
-
-
close() - Method in class fmpp.util.BorderedReader
-
 
-
close() - Method in class fmpp.util.NullWriter
-
 
-
CommandLine - Class in fmpp.tools
-
-
Command-line tool for preprocessing single files or entire directories.
-
-
CommandLine() - Constructor for class fmpp.tools.CommandLine
-
 
-
compressPath(String, int) - Static method in class fmpp.util.FileUtil
-
-
Returns a compressed version of the path.
-
-
ConsoleProgressListener - Class in fmpp.progresslisteners
-
-
Designed to show the progress on console screen.
-
-
ConsoleProgressListener() - Constructor for class fmpp.progresslisteners.ConsoleProgressListener
-
-
Output will be printed to the stdout.
-
-
ConsoleProgressListener(OutputStream) - Constructor for class fmpp.progresslisteners.ConsoleProgressListener
-
 
-
ConsoleProgressListener(PrintWriter) - Constructor for class fmpp.progresslisteners.ConsoleProgressListener
-
 
-
ConsoleProgressListener(OutputStream, boolean) - Constructor for class fmpp.progresslisteners.ConsoleProgressListener
-
 
-
ConsoleProgressListener(PrintWriter, boolean) - Constructor for class fmpp.progresslisteners.ConsoleProgressListener
-
 
-
copy(String, String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Creates a copy of the option with different short- and long-name, - but with the same property name (and other attributes).
-
-
copyFile(File, File, boolean) - Static method in class fmpp.util.FileUtil
-
-
Copies a file; silently overwrites the destination if already exists.
-
-
copyFile(File, File) - Static method in class fmpp.util.FileUtil
-
- -
-
CopyWritableVariableMethod - Class in fmpp.models
-
-
Creates a new, empty WritableHash.
-
-
CopyWritableVariableMethod() - Constructor for class fmpp.models.CopyWritableVariableMethod
-
 
-
createInstanceForSetting(String, List) - Static method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
createSourceCodeErrorMessage(String, String, int, String, int) - Static method in class fmpp.util.StringUtil
-
 
-
CsvDataLoader - Class in fmpp.dataloaders
-
-
Data loaders that loads CSV (Column Separated Values) files or other files of - similar formats (as tab divided text), and returns a - fmpp.models.CsvSequence object.
-
-
CsvDataLoader() - Constructor for class fmpp.dataloaders.CsvDataLoader
-
 
-
CsvSequence - Class in fmpp.models
-
-
Sequence variable implementation that wraps text of CSV or tab separated - values format, or any other format that is the same as CSV except that it - uses different column separator char.
-
-
CsvSequence() - Constructor for class fmpp.models.CsvSequence
-
-
Creates a new instance.
-
-
- - - -

D

-
-
dataFile - Variable in class fmpp.dataloaders.FileDataLoader
-
 
-
DataLoader - Interface in fmpp.tdd
-
-
Creates an object that will be accessed in FreeMarker templates.
-
-
DataLoaderEvaluationEnvironment - Class in fmpp.tdd
-
-
Evaluates function calls as data loader invocations.
-
-
DataLoaderEvaluationEnvironment(Engine) - Constructor for class fmpp.tdd.DataLoaderEvaluationEnvironment
-
 
-
DataLoaderUtil - Class in fmpp.util
-
-
Utility methods for writing data loaders.
-
-
DataLoaderUtil() - Constructor for class fmpp.util.DataLoaderUtil
-
 
-
DataModelBuildingException - Exception in fmpp
-
-
Error while trying to build the data-model for a template.
-
-
DataModelBuildingException(Throwable) - Constructor for exception fmpp.DataModelBuildingException
-
 
-
DataModelBuildingException(String) - Constructor for exception fmpp.DataModelBuildingException
-
 
-
DataModelBuildingException(String, Throwable) - Constructor for exception fmpp.DataModelBuildingException
-
 
-
DEFAULT_CFG_FILE_NAME - Static variable in class fmpp.setting.Settings
-
-
Primary default file name.
-
-
DEFAULT_CFG_FILE_NAME_OLD - Static variable in class fmpp.setting.Settings
-
-
Secondary (legacy) default file name.
-
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONArrayNode
-
 
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONBooleanNode
-
 
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONNullNode
-
 
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONNumberNode
-
 
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONObjectNode
-
 
-
DEFAULT_NODE_NAME - Static variable in class fmpp.models.JSONStringNode
-
 
-
defaultArg(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Gives default argument value for an option that supports arguments, - thus it will be optional to specify the argument value in the - command-line.
-
-
define(String, Settings.SettingType, boolean, boolean) - Method in class fmpp.setting.Settings
-
-
Defines a new setting.
-
-
desc(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Sets the description (used in help) of the option.
-
-
dictionaryToMap(Dictionary) - Static method in class fmpp.util.MiscUtil
-
 
-
dieWithMissingParam(String) - Method in class fmpp.models.TemplateModelUtils
-
- -
-
dieWithParamsNotAllowed() - Method in class fmpp.models.TemplateModelUtils
-
- -
-
dieWithUnknownParam(String) - Method in class fmpp.models.TemplateModelUtils
-
- -
-
doProcessing(Engine, File[], File, File) - Method in class fmpp.setting.Settings
-
-
Executes the processing session(s) on the Engine level, - using the already initialized Engine object.
-
-
dropOutputFile() - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
dump() - Method in class fmpp.setting.Settings
-
-
Dumps the current content of this object for debugging purposes.
-
-
dump(Object) - Static method in class fmpp.tdd.Interpreter
-
-
Converts an object to a TDD-like representation (not necessary valid - TDD).
-
-
- - - -

E

-
-
EMPTY_CLASS_ARRAY - Static variable in class fmpp.util.MiscUtil
-
 
-
EMPTY_OBJECT_ARRAY - Static variable in class fmpp.util.MiscUtil
-
 
-
EMPTY_STRING_ARRAY - Static variable in class fmpp.util.MiscUtil
-
 
-
endNestedOutputFile() - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the end tag of the corresponding directive of the - pp hash.
-
-
engine - Variable in class fmpp.dataloaders.FileDataLoader
-
 
-
Engine - Class in fmpp
-
-
The bare-bone, low-level preprocessor engine.
-
-
Engine() - Constructor for class fmpp.Engine
-
-
Deprecated. - -
-
-
Engine(BeansWrapper) - Constructor for class fmpp.Engine
-
-
Deprecated. - -
-
-
Engine(BeansWrapper, Version) - Constructor for class fmpp.Engine
-
-
Creates a new FMPP engine instance.
-
-
eval(String, EvaluationEnvironment, boolean, String) - Static method in class fmpp.tdd.Interpreter
-
-
Evaluates text as single TDD expression.
-
-
eval(Fragment, EvaluationEnvironment, boolean) - Static method in class fmpp.tdd.Interpreter
-
-
Evaluates a Fragment as single TDD expression.
-
-
eval(String, String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as eval(text, null, false, fileName).
-
-
eval(String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as eval(text, null, false, null).
-
-
evalAsHash(String, EvaluationEnvironment, boolean, String) - Static method in class fmpp.tdd.Interpreter
-
-
Evaluates text as a list of key:value pairs.
-
-
evalAsHash(String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as evalAsHash(text, null, false, null).
-
-
evalAsHash(String, String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as evalAsHash(text, null, false, fileName).
-
-
evalAsSequence(String, EvaluationEnvironment, boolean, String) - Static method in class fmpp.tdd.Interpreter
-
-
Evaluates text as a list values.
-
-
evalAsSequence(String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as evalAsList(text, null, false, null).
-
-
evalAsSequence(String, String) - Static method in class fmpp.tdd.Interpreter
-
-
Same as evalAsList(text, null, false, fileName).
-
-
EvalDataLoader - Class in fmpp.dataloaders
-
-
Evaluates a BeanShell expression (looks like as Java).
-
-
EvalDataLoader() - Constructor for class fmpp.dataloaders.EvalDataLoader
-
 
-
EvalException - Exception in fmpp.tdd
-
 
-
EvalException(String) - Constructor for exception fmpp.tdd.EvalException
-
 
-
EvalException(String, Throwable) - Constructor for exception fmpp.tdd.EvalException
-
 
-
EvalException(String, int) - Constructor for exception fmpp.tdd.EvalException
-
 
-
EvalException(String, int, Throwable) - Constructor for exception fmpp.tdd.EvalException
-
 
-
EvalException(String, String, int, String) - Constructor for exception fmpp.tdd.EvalException
-
 
-
EvalException(String, String, int, String, Throwable) - Constructor for exception fmpp.tdd.EvalException
-
 
-
evalFunctionCall(FunctionCall, Interpreter) - Method in class fmpp.tdd.DataLoaderEvaluationEnvironment
-
 
-
evalFunctionCall(FunctionCall, Interpreter) - Method in interface fmpp.tdd.EvaluationEnvironment
-
-
Evaluates the function call.
-
-
EvaluationEnvironment - Interface in fmpp.tdd
-
-
Callbacks that let you control the behaviour of TDD expression evaluation.
-
-
EVENT_BEGIN_FILE_PROCESSING - Static variable in interface fmpp.ProgressListener
-
-
The processing of a single file has been started.
-
-
EVENT_BEGIN_PROCESSING_SESSION - Static variable in interface fmpp.ProgressListener
-
-
Engine.process has started the work.
-
-
EVENT_CREATED_EMPTY_DIR - Static variable in interface fmpp.ProgressListener
-
-
An empty directory was created due to the copyEmptyDirs setting.
-
-
EVENT_END_FILE_PROCESSING - Static variable in interface fmpp.ProgressListener
-
-
The processing of a single file has been finished.
-
-
EVENT_END_PROCESSING_SESSION - Static variable in interface fmpp.ProgressListener
-
-
Engine.process has finished the work.
-
-
EVENT_ENTER_FUNCTION_PARAMS - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have started to evaluate the - parameter list in a function call.
-
-
EVENT_ENTER_HASH - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have started to evaluate the - items in a hash.
-
-
EVENT_ENTER_HASH_KEY - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have started to evaluate the - value in a key:value pair.
-
-
EVENT_ENTER_SEQUENCE - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have started to evaluate the - items in a sequence.
-
-
EVENT_IGNORING_DIR - Static variable in interface fmpp.ProgressListener
-
-
A source directory has been ignored (skipped.)
-
-
EVENT_LEAVE_FUNCTION_PARAMS - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have finished to evaluate the - parameter list in a function call.
-
-
EVENT_LEAVE_HASH - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have finished to evaluate the - items in a sequence.
-
-
EVENT_LEAVE_HASH_KEY - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have finished to evaluate the - value in a key:value pair.
-
-
EVENT_LEAVE_SEQUENCE - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
-
The code of event that indicates that we have finished to evaluate the - items in a sequence.
-
-
EVENT_SOURCE_NOT_MODIFIED - Static variable in interface fmpp.ProgressListener
-
-
The processing of source was skipped because the output was generated - after the last modification of the source file.
-
-
EVENT_WARNING - Static variable in interface fmpp.ProgressListener
-
-
A warning message has been received from a template or from the - engine.
-
-
ExceptionCC - Exception in fmpp.util
-
-
This was used for emulating cause-chains on Java earlier than 1.4, but as FMPP now requires 1.4, it just dispatches - to Exception.
-
-
ExceptionCC() - Constructor for exception fmpp.util.ExceptionCC
-
 
-
ExceptionCC(String) - Constructor for exception fmpp.util.ExceptionCC
-
 
-
ExceptionCC(Throwable) - Constructor for exception fmpp.util.ExceptionCC
-
 
-
ExceptionCC(String, Throwable) - Constructor for exception fmpp.util.ExceptionCC
-
 
-
exec(List) - Method in class fmpp.models.CopyWritableVariableMethod
-
 
-
exec(List) - Method in class fmpp.models.NewWritableHashMethod
-
 
-
exec(List) - Method in class fmpp.models.NewWritableSequenceMethod
-
 
-
execute() - Method in class fmpp.setting.Settings
-
-
Executes a processing session based on the setting values.
-
-
execute() - Method in class fmpp.tools.AntTask
-
 
-
execute(String[], PrintWriter, PrintWriter) - Static method in class fmpp.tools.CommandLine
-
-
Emulates the command-line invocation of the tool.
-
-
expandTabs(String, int) - Static method in class fmpp.util.StringUtil
-
-
Same as expandTabs(text, tabWidth, 0).
-
-
expandTabs(String, int, int) - Static method in class fmpp.util.StringUtil
-
-
Replaces all occurances of character tab with spaces.
-
-
- - - -

F

-
-
FileDataLoader - Class in fmpp.dataloaders
-
-
Ancestor of data loaders that create the result based on a file.
-
-
FileDataLoader() - Constructor for class fmpp.dataloaders.FileDataLoader
-
 
-
FileUtil - Class in fmpp.util
-
-
Collection of file and path related functions.
-
-
FileUtil() - Constructor for class fmpp.util.FileUtil
-
 
-
FileWithConfigurationBase - Class in fmpp.setting
-
-
File that stores the current configuration base directory at - the time it was instantiated.
-
-
FileWithConfigurationBase(File, String, String) - Constructor for class fmpp.setting.FileWithConfigurationBase
-
-
Creates a new instance.
-
-
FileWithSettingValue - Class in fmpp.setting
-
-
File that stores the original setting value (string) it was - constructed from.
-
-
FileWithSettingValue(File, String, String) - Constructor for class fmpp.setting.FileWithSettingValue
-
 
-
FileWithSettingValue(String, String) - Constructor for class fmpp.setting.FileWithSettingValue
-
 
-
FileWithSettingValue(String, String, String) - Constructor for class fmpp.setting.FileWithSettingValue
-
 
-
finalizeResult(Object) - Method in class fmpp.dataloaders.JSONDataLoader
-
-
Converts the POJO created from the JSON to its final form.
-
-
findObject(List, Object) - Static method in class fmpp.util.MiscUtil
-
-
Returns the first index of the given object (exactly the same instance) - in the list.
-
-
findTopLevelVariable(String) - Method in class fmpp.tdd.DataLoaderEvaluationEnvironment
-
-
Override this to help TDD get function to find top level - variables.
-
-
fixBoolean(String) - Method in class fmpp.models.CsvSequence
-
-
Override this if you want to correct boolean values come from the file.
-
-
fixNumber(String) - Method in class fmpp.models.CsvSequence
-
-
Override this if you want to correct numerical values come from the - file.
-
-
fixVersion08SettingNames(Properties) - Static method in class fmpp.setting.Settings
-
-
Backward compatibility hack: renames properties that use - pre-FMPP 0.9.0 names of settings.
-
-
flush() - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Flushes the PrintWriter used for printing into the log.
-
-
flush() - Method in class fmpp.util.NullWriter
-
 
-
fmpp - package fmpp
-
-
The very core, the foundation of FMPP.
-
-
fmpp.dataloaders - package fmpp.dataloaders
-
-
fmpp.DataLoader implementations.
-
-
fmpp.localdatabuilders - package fmpp.localdatabuilders
-
-
fmpp.LocalDataBuilder implementations.
-
-
fmpp.models - package fmpp.models
-
-
freemarker.template.TemplateModel implementations.
-
-
fmpp.progresslisteners - package fmpp.progresslisteners
-
-
fmpp.ProgressListener implementations.
-
-
fmpp.setting - package fmpp.setting
-
-
FMPP settings.
-
-
fmpp.tdd - package fmpp.tdd
-
-
Textual Data Definition related classes.
-
-
fmpp.tools - package fmpp.tools
-
-
Tools (front-ends) that end-user can use out-of-the-box.
-
-
fmpp.util - package fmpp.util
-
-
Collection of more-less FMPP independent utility classes.
-
-
FMPP_CONSOLE_COLS - Static variable in class fmpp.tools.CommandLine
-
-
The number of console (terminal) columns can be passed in with this environment variable, supposedly by the - OS-specific starter executable (shell script).
-
-
Fragment - Class in fmpp.tdd
-
-
Fragment extracted from a TDD expression.
-
-
Fragment(String, int, int, String) - Constructor for class fmpp.tdd.Fragment
-
-
Creates new TDD fragment.
-
-
FreemarkerUtil - Class in fmpp.util
-
-
FreeMarker related utilities.
-
-
FreemarkerUtil() - Constructor for class fmpp.util.FreemarkerUtil
-
 
-
ftlStringLiteralDec(String) - Static method in class fmpp.util.StringUtil
-
-
FTL string literal decoding.
-
-
ftlVarToCoreJavaObject(TemplateModel) - Static method in class fmpp.util.FreemarkerUtil
-
-
Converts TemplateModel-s to java.util.* and - java.lang.* objects.
-
-
FunctionCall - Class in fmpp.tdd
-
-
Symbolizes a TDD function call.
-
-
FunctionCall(String, List) - Constructor for class fmpp.tdd.FunctionCall
-
 
-
- - - -

G

-
-
get(int) - Method in class fmpp.models.CsvSequence
-
 
-
get(String) - Method in class fmpp.models.CsvSequence
-
 
-
get(int) - Method in class fmpp.models.JSONArrayNode
-
-
Returns the JSONNode at the given index from this JSON array, using a Java null for JSON - null-s.
-
-
get(String) - Method in class fmpp.models.JSONObjectNode
-
-
Returns the JSONNode for the given key from this JSON object, using a Java null for JSON - null-s.
-
-
get(int) - Method in class fmpp.models.StringArraySequence
-
 
-
get(int) - Method in class fmpp.models.TemplateModelListSequence
-
 
-
get(String) - Method in class fmpp.models.WritableHash
-
 
-
get(int) - Method in class fmpp.models.WritableSequence
-
 
-
get(String) - Method in class fmpp.setting.Settings
-
-
Gets the current value of a setting.
-
-
getAccessed() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of files that the engine has tried to process.
-
-
getAltFalse() - Method in class fmpp.models.CsvSequence
-
 
-
getAltTrue() - Method in class fmpp.models.CsvSequence
-
 
-
getAlwaysCreateDirectories() - Method in class fmpp.Engine
-
 
-
getArgName() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Returns the name of the argument, or null if the option does not - support argument.
-
-
getAsBoolean() - Method in class fmpp.models.JSONBooleanNode
-
 
-
getAsNumber() - Method in class fmpp.models.JSONNumberNode
-
 
-
getAsString() - Method in class fmpp.models.JSONStringNode
-
 
-
getAttribute(String) - Method in class fmpp.Engine
-
-
Reads an engine attribute.
-
-
getBooleanArgument(int, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getBooleanOption(String, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getBuildInfo() - Static method in class fmpp.Engine
-
-
Returns FMPP build info.
-
-
getCaseSensitive() - Method in class fmpp.Engine
-
 
-
getCause() - Method in exception fmpp.util.RuntimeExceptionCC
-
 
-
getCauseException(Throwable) - Static method in class fmpp.util.MiscUtil
-
 
-
getCharArgument(int, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getCharOption(String, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getChildNodes() - Method in class fmpp.models.JSONArrayNode
-
-
Returns the JSONNode-s in this JSON array, using a JSONNullNode for JSON null-s.
-
-
getChildNodes() - Method in class fmpp.models.JSONBooleanNode
-
-
Always returns null.
-
-
getChildNodes() - Method in class fmpp.models.JSONNullNode
-
 
-
getChildNodes() - Method in class fmpp.models.JSONNumberNode
-
-
Always returns null.
-
-
getChildNodes() - Method in class fmpp.models.JSONObjectNode
-
 
-
getChildNodes() - Method in class fmpp.models.JSONStringNode
-
-
Always returns null.
-
-
getConfigurationBase() - Method in class fmpp.setting.FileWithConfigurationBase
-
 
-
getCopied() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of files successfully copied.
-
-
getCurrentInstance() - Static method in class fmpp.TemplateEnvironment
-
-
Returns the TemplateEnvironment object used for the template - currently being executed by FMPP in the current thread.
-
-
getDashedName(String) - Static method in class fmpp.setting.Settings
-
-
Converts mixed-case setting name to dashed form, - as sourceRoot to source-root.
-
-
getData(String) - Method in class fmpp.Engine
-
-
Gets the value of a variable.
-
-
getData(String) - Method in class fmpp.TemplateEnvironment
-
-
Similar to Engine.getData(java.lang.String), but it also sees file processing - specifict variables (local data).
-
-
getDataLoaderInstance(Engine, String) - Static method in class fmpp.tdd.TddUtil
-
-
Resolves a data loader name to a data loader instance.
-
-
getDataRoot() - Method in class fmpp.Engine
-
-
Returns the directory used as data root directory.
-
-
getDateFormat() - Method in class fmpp.Engine
-
 
-
getDateFormatPattern() - Method in class fmpp.models.CsvSequence
-
 
-
getDateTimeFormat() - Method in class fmpp.Engine
-
 
-
getDateTimeFormatPattern() - Method in class fmpp.models.CsvSequence
-
 
-
getDecimalSeparator() - Method in class fmpp.models.CsvSequence
-
 
-
getDefaultArg() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Returns the default argument of the option, or null if the option - has no default argument.
-
-
getDefaultConfigurationFile(File) - Static method in class fmpp.setting.Settings
-
-
Returns the default configuration file in the directory.
-
-
getDefaultNodeName() - Method in class fmpp.models.JSONArrayNode
-
 
-
getDefaultNodeName() - Method in class fmpp.models.JSONBooleanNode
-
 
-
getDefaultNodeName() - Method in class fmpp.models.JSONNode
-
-
Returns the name of the node if it has no explicit name.
-
-
getDefaultNodeName() - Method in class fmpp.models.JSONNullNode
-
 
-
getDefaultNodeName() - Method in class fmpp.models.JSONNumberNode
-
 
-
getDefaultNodeName() - Method in class fmpp.models.JSONObjectNode
-
 
-
getDefaultNodeName() - Method in class fmpp.models.JSONStringNode
-
 
-
getDescription() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Returns the description of the option, or null if no description is - available.
-
-
getDontTraverseDirectories() - Method in class fmpp.Engine
-
 
-
getDontTraverseDirectories() - Method in class fmpp.setting.Settings
-
 
-
getEmptyValues() - Method in class fmpp.models.CsvSequence
-
 
-
getEncoding() - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
getEnding() - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
getEngine() - Method in class fmpp.TemplateEnvironment
-
-
Returns the FMPP engine object in use.
-
-
getEngineAttribute(String) - Method in class fmpp.setting.Settings
-
-
Reads an engine attribute.
-
-
getErrorCount() - Method in class fmpp.progresslisteners.AntProgressListener
-
 
-
getEvaluationEnvironment() - Method in class fmpp.tdd.Interpreter
-
 
-
getExecuted() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of files successfully executed (templates).
-
-
getExpertMode() - Method in class fmpp.Engine
-
 
-
getExternalHeaderRow() - Method in class fmpp.models.CsvSequence
-
 
-
getFailed() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of files where processing was failed.
-
-
getFileName() - Method in class fmpp.tdd.Fragment
-
-
Returns the name of the file the text comes from (for informational - purposes only).
-
-
getFileName() - Method in class fmpp.tdd.Interpreter
-
 
-
getFragmentEnd() - Method in class fmpp.tdd.Fragment
-
-
Returns the end index (exclusive) of the fragment in the text.
-
-
getFragmentStart() - Method in class fmpp.tdd.Fragment
-
-
Returns the start index of the fragment in the text.
-
-
getFreemarkerEnvironment() - Method in class fmpp.TemplateEnvironment
-
-
Returns the FreeMarker environment currently in use.
-
-
getFreemarkerLink(String) - Method in class fmpp.Engine
-
-
Returns the list of files associated with a FreeMarker link name.
-
-
getFreeMarkerVersionNumber() - Static method in class fmpp.Engine
-
 
-
getGroupingSeparator() - Method in class fmpp.models.CsvSequence
-
 
-
getHasHeaderRow() - Method in class fmpp.models.CsvSequence
-
 
-
getHomePath() - Method in class fmpp.TemplateEnvironment
-
-
Returns URL-style path of the output root relative to the current output - file.
-
-
getIgnoreCvsFiles() - Method in class fmpp.Engine
-
 
-
getIgnoreMissing() - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
-
Set if it will be ignored no script file found for the source file, - rather than throwing an exception.
-
-
getIgnoreSvnFiles() - Method in class fmpp.Engine
-
 
-
getIgnoreTemporaryFiles() - Method in class fmpp.Engine
-
 
-
getIntArgument(int, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getIntOption(String, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getList() - Method in class fmpp.models.WritableSequence
-
 
-
getLocale() - Method in class fmpp.Engine
-
-
Returns the actual (non-null) locale in use.
-
-
getLongName() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Returns the long-name of the option, or null if the option has no - long-name.
-
-
getMap() - Method in class fmpp.models.WritableHash
-
 
-
getMessage() - Method in exception fmpp.ProcessingException
-
-
Returns always the same text: "FMPP processing session failed."
-
-
getName() - Method in class fmpp.tdd.FunctionCall
-
 
-
getNames() - Method in class fmpp.setting.Settings
-
-
Lists the names of settings that were set.
-
-
getNodeName() - Method in class fmpp.models.JSONNode
-
-
Returns the same as TemplateNodeModel.getNodeType(), except when the node is the value in a key-value pair in a - JSON object, in which case it returns the key value.
-
-
getNodeNamespace() - Method in class fmpp.models.JSONNode
-
 
-
getNodeType() - Method in class fmpp.models.JSONArrayNode
-
- -
-
getNodeType() - Method in class fmpp.models.JSONBooleanNode
-
- -
-
getNodeType() - Method in class fmpp.models.JSONNullNode
-
 
-
getNodeType() - Method in class fmpp.models.JSONNumberNode
-
- -
-
getNodeType() - Method in class fmpp.models.JSONObjectNode
-
 
-
getNodeType() - Method in class fmpp.models.JSONStringNode
-
- -
-
getNonOptions() - Method in class fmpp.util.ArgsParser
-
-
Retruns the non-options resulting from the latest parse - call.
-
-
getNormalizeHeaders() - Method in class fmpp.models.CsvSequence
-
 
-
getNumberFormat() - Method in class fmpp.Engine
-
 
-
getOldTemplateSyntax() - Method in class fmpp.Engine
-
 
-
getOption(String) - Method in class fmpp.util.ArgsParser
-
-
Convenience funtcion to read the option Properties object.
-
-
getOptionDefinition(String) - Method in class fmpp.util.ArgsParser
-
-
Returns the ArgsParser.OptionDefinition for the given option name.
-
-
getOptionDefintions() - Method in class fmpp.util.ArgsParser
-
-
Returns the list of ArgsParser.OptionDefinition-s, sorted as they should - appear in an option help.
-
-
getOptions() - Method in class fmpp.util.ArgsParser
-
-
Returns the options resulting from the latest parse - call as Properties object.
-
-
getOptionsHelp(int) - Method in class fmpp.util.ArgsParser
-
-
Generates options help for the defined options.
-
-
getOutputEncoding() - Method in class fmpp.Engine
-
-
Retruns the output encoding used; It can be "source" - (since that can't be resolved to a concrete charset), but never - null or "host".
-
-
getOutputEncoding() - Method in class fmpp.TemplateEnvironment
-
-
Returns the output encoding.
-
-
getOutputFile() - Method in class fmpp.TemplateEnvironment
-
-
Returns the output file.
-
-
getOutputRoot() - Method in class fmpp.Engine
-
-
Returns the output root directory.
-
-
getParams() - Method in class fmpp.tdd.FunctionCall
-
 
-
getParentNode() - Method in class fmpp.models.JSONNode
-
-
Returns the JSON "object" or JSON "array" that contains this value.
-
-
getPathTo(String) - Method in class fmpp.TemplateEnvironment
-
-
Calculates the path of another output file relatively to current output - file, in UN*X format.
-
-
getPosition() - Method in class fmpp.tdd.Interpreter
-
 
-
getPrintWriter() - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Returns the PrintWriter used for printing into the log.
-
-
getProcessingTime() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
The duration of the last - BEGIN_ALL_PROCESSING-END_ALL_PROCESSING - in milliseconds, or -1 if that is not known.
-
-
getProgressListenerEventName(int) - Static method in class fmpp.Engine
-
-
Converts an ProgressListener.EVENT_... constant to English - text.
-
-
getPropertyNames() - Method in class fmpp.util.ArgsParser
-
-
Returns the property names used in the options.
-
-
getRelativePath(File, File) - Static method in class fmpp.util.FileUtil
-
-
Reaturns the path of a file or directory relative to a directory, - in native format.
-
-
getRemoveExtension() - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
getSeparator() - Method in class fmpp.models.CsvSequence
-
 
-
getSettingValue() - Method in class fmpp.setting.FileWithSettingValue
-
 
-
getShortName() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Returns the short-name of the option, or null if the option has no - short-name.
-
-
getSkipUnchanged() - Method in class fmpp.Engine
-
 
-
getSourceEncoding() - Method in class fmpp.Engine
-
-
Returns the source encoding used for the template files.
-
-
getSourceFile() - Method in exception fmpp.ProcessingException
-
-
Returns the source file the faliure relates to.
-
-
getSourceFile() - Method in class fmpp.TemplateEnvironment
-
-
Returns the source file.
-
-
getSourcePathTo(String) - Method in class fmpp.TemplateEnvironment
-
-
Same as TemplateEnvironment.getPathTo(java.lang.String) but with the source file and - source root directory.
-
-
getSourceRoot() - Method in class fmpp.Engine
-
-
Returns the source root directory.
-
-
getSourceRoot() - Method in exception fmpp.ProcessingException
-
-
Returns the "sourceRoot" used during the processing session that failed.
-
-
getStandardSettingNames() - Static method in class fmpp.setting.Settings
-
-
Returns if the given name is the name of a standard setting.
-
-
getStopOnError() - Method in class fmpp.Engine
-
 
-
getStringArgument(int, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getStringArrayArgument(int, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getStringArrayArgument(int, Object, boolean) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getStringArrayOption(String, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getStringArrayOption(String, Object, boolean) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getStringOption(String, Object) - Static method in class fmpp.util.DataLoaderUtil
-
 
-
getSuccesful() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of files where processing was successfull.
-
-
getTagSyntax() - Method in class fmpp.Engine
-
 
-
getTarget() - Method in class fmpp.tools.AntTask
-
 
-
getTemplate() - Method in class fmpp.TemplateEnvironment
-
-
Retuns the FreeMarker Template object for the source file.
-
-
getTemplateDataModelBuilder() - Method in class fmpp.Engine
-
 
-
getTemplateEnvironment() - Method in class fmpp.Engine
-
-
Returns the TemplateEnvironment.
-
-
getText() - Method in class fmpp.tdd.Fragment
-
-
Returns the full TDD text that contains the fragmet.
-
-
getText() - Method in class fmpp.tdd.Interpreter
-
 
-
getText() - Method in class fmpp.tools.AntTask.AntAttributeSubstitution
-
 
-
getTimeFormat() - Method in class fmpp.Engine
-
 
-
getTimeFormatPattern() - Method in class fmpp.models.CsvSequence
-
 
-
getTimeZone() - Method in class fmpp.Engine
-
 
-
getTimeZone() - Method in class fmpp.models.CsvSequence
-
 
-
getTrimCells() - Method in class fmpp.models.CsvSequence
-
 
-
getTypeName(Object) - Static method in class fmpp.tdd.Interpreter
-
 
-
getUrlEscapingCharset() - Method in class fmpp.Engine
-
-
Retruns the output encoding used; It can be "output" - (since that can't be resolved to a concrete charset), but never - null.
-
-
getValidateXml() - Method in class fmpp.Engine
-
 
-
getVersionNumber() - Static method in class fmpp.Engine
-
-
Returns the FMPP version number string.
-
-
getWarnings() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Total number of warnings.
-
-
getWrappedObject() - Method in class fmpp.models.TemplateModelListSequence
-
 
-
getWrappedXmlDocument() - Method in class fmpp.TemplateEnvironment
-
-
The same as TemplateEnvironment.getXmlDocument(), but returns the document as - NodeModel.
-
-
getWriter(Writer, Map) - Method in class fmpp.models.AddTransform
-
 
-
getWriter(Writer, Map) - Method in class fmpp.models.ClearTransform
-
 
-
getWriter(Writer, Map) - Method in class fmpp.models.RemoveTransform
-
 
-
getWriter(Writer, Map) - Method in class fmpp.models.SetTransform
-
 
-
getXmlDocument() - Method in class fmpp.TemplateEnvironment
-
-
Returns the processed XML document (pp.doc) as - Document.
-
-
getXmlEntiryResolver() - Method in class fmpp.Engine
-
-
Gets the XML entiry resolver used for reading XML documents.
-
-
getXmlRendered() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Number of XML files successfully rendered.
-
-
getXpathEngine() - Method in class fmpp.Engine
-
 
-
group(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Convenience method; same as calling - property(propertyName, optionName), where optionName - is the long-name if that exists, otherwise the short-name.
-
-
- - - -

H

-
-
hasNext() - Method in class fmpp.util.MultiListIterator
-
 
-
hide() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Hides option, that is, it will not be shown in the option help.
-
-
htmlEnc(String) - Static method in class fmpp.util.StringUtil
-
-
HTML encoding (does not convert line breaks).
-
-
HtmlUtilsDataLoader - Class in fmpp.dataloaders
-
-
Returns a hash that contains useful directives for HTML generation.
-
-
HtmlUtilsDataLoader() - Constructor for class fmpp.dataloaders.HtmlUtilsDataLoader
-
 
-
- - - -

I

-
-
implied() - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Ensures that the option will be seemingly present if the - args[] does not contains this option or any other option that - mutually excludes this option.
-
-
implied(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Ensures that the option will be seemingly present with the given - argument value if args[] does not contains this option, or any - other option that mutually excludes this option.
-
-
InstallationException - Exception in fmpp.util
-
-
There is a problem with the software environment.
-
-
InstallationException(String) - Constructor for exception fmpp.util.InstallationException
-
 
-
InstallationException(String, Throwable) - Constructor for exception fmpp.util.InstallationException
-
 
-
INSTANCE - Static variable in class fmpp.util.NullOutputStream
-
 
-
INSTANCE - Static variable in class fmpp.util.NullWriter
-
 
-
Interpreter - Class in fmpp.tdd
-
-
Evaluates TDD expressions.
-
-
intParam(Object, String) - Method in class fmpp.models.TemplateModelUtils
-
 
-
isDefined(String) - Method in class fmpp.setting.Settings
-
-
Returns if a setting with the given name is defined (do not mix it up - with being set).
-
-
isEmpty() - Method in class fmpp.models.CsvSequence
-
 
-
isEmpty() - Method in class fmpp.models.JSONObjectNode
-
 
-
isEmpty() - Method in class fmpp.models.WritableHash
-
 
-
isInside(File, File) - Static method in class fmpp.util.FileUtil
-
-
Returns true if file is inside ascendant, - otherwise returns false.
-
-
isInsideOrEquals(File, File) - Static method in class fmpp.util.FileUtil
-
-
Returns true if file is inside ascendant or - file is the same as the ascendant, otherwise - returns false.
-
-
isOptionName(String) - Static method in class fmpp.dataloaders.XmlDataLoader
-
-
Checks if the string is a valid xml data loader option name.
-
-
isTemplateEnvironmentAvailable() - Method in class fmpp.Engine
-
-
Tells if Engine.getTemplateEnvironment() will throw exception or not.
-
-
isXmlSupportAvailabile() - Method in class fmpp.Engine
-
-
Quickly tells if XML support is available.
-
-
iterator() - Method in class fmpp.models.TemplateModelArrayCollection
-
 
-
iterator() - Method in class fmpp.models.TemplateModelListCollection
-
 
-
- - - -

J

-
-
jQuote(char) - Static method in class fmpp.util.StringUtil
-
-
Quotes string as Java language character.
-
-
jQuote(String) - Static method in class fmpp.util.StringUtil
-
-
Quotes string as Java language string literal.
-
-
jQuoteOrName(char) - Static method in class fmpp.util.StringUtil
-
-
Quotes character as Java language character, except quote characters, - which are referred with name.
-
-
JSONArrayNode - Class in fmpp.models
-
-
JSON "array" value; see http://www.json.org/.
-
-
JSONArrayNode(JSONNode, String, List) - Constructor for class fmpp.models.JSONArrayNode
-
 
-
JSONBooleanNode - Class in fmpp.models
-
-
JSON "true" and "false" value; see http://www.json.org/.
-
-
JSONBooleanNode(JSONNode, String, boolean) - Constructor for class fmpp.models.JSONBooleanNode
-
 
-
JSONDataLoader - Class in fmpp.dataloaders
-
-
Creates a JSONNode based on a JSON file.
-
-
JSONDataLoader() - Constructor for class fmpp.dataloaders.JSONDataLoader
-
 
-
JSONNode - Class in fmpp.models
-
-
Node in a hierarchy of JSON values.
-
-
JSONNode(JSONNode, String) - Constructor for class fmpp.models.JSONNode
-
 
-
JSONNullNode - Class in fmpp.models
-
-
JSON "null" value; see http://www.json.org/.
-
-
JSONNullNode(JSONNode, String) - Constructor for class fmpp.models.JSONNullNode
-
 
-
JSONNumberNode - Class in fmpp.models
-
-
JSON "number" value; see http://www.json.org/.
-
-
JSONNumberNode(JSONNode, String, Number) - Constructor for class fmpp.models.JSONNumberNode
-
 
-
JSONObjectNode - Class in fmpp.models
-
-
JSON "object" value; see http://www.json.org/.
-
-
JSONObjectNode(JSONNode, String, Map) - Constructor for class fmpp.models.JSONObjectNode
-
 
-
JSONParseException - Exception in fmpp.util
-
 
-
JSONParseException(String, String, int, String) - Constructor for exception fmpp.util.JSONParseException
-
 
-
JSONParseException(String, String, int, String, Throwable) - Constructor for exception fmpp.util.JSONParseException
-
 
-
JSONParser - Class in fmpp.util
-
-
Simple JSON parser where JSON objects create Map-s, JSON array-s create List-s, and the others - create the obvious Java equivalents.
-
-
JSONStringNode - Class in fmpp.models
-
-
JSON "string" value; see http://www.json.org/.
-
-
JSONStringNode(JSONNode, String, String) - Constructor for class fmpp.models.JSONStringNode
-
 
-
- - - -

K

-
-
keys() - Method in class fmpp.models.JSONObjectNode
-
 
-
keys() - Method in class fmpp.models.WritableHash
-
 
-
- - - -

L

-
-
LINE_BREAK - Static variable in class fmpp.util.StringUtil
-
-
The default line-break string used by the methods in this class.
-
-
listContainsObject(List, Object) - Static method in class fmpp.util.MiscUtil
-
-
Checks if the list contains the given object (exactly the same instance).
-
-
load(InputStream) - Method in class fmpp.dataloaders.AbstractTextDataLoader
-
 
-
load(Engine, List) - Method in class fmpp.dataloaders.AntDataLoader
-
-
Gets the Ant task object, and invoked AntDataLoader.load(Engine, List, Task).
-
-
load(Engine, List, Task) - Method in class fmpp.dataloaders.AntDataLoader
-
-
Override this method to implement your Ant related data loader.
-
-
load(Engine, List, Task) - Method in class fmpp.dataloaders.AntProjectDataLoader
-
 
-
load(Engine, List, Task) - Method in class fmpp.dataloaders.AntPropertiesDataLoader
-
 
-
load(Engine, List, Task) - Method in class fmpp.dataloaders.AntPropertyDataLoader
-
 
-
load(Engine, List, Task) - Method in class fmpp.dataloaders.AntTaskDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.CsvDataLoader
-
 
-
load(Engine, List) - Method in class fmpp.dataloaders.EvalDataLoader
-
 
-
load(Engine, List) - Method in class fmpp.dataloaders.FileDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.FileDataLoader
-
-
FileDataLoader subclasess override this method to parse - the file.
-
-
load(Engine, List) - Method in class fmpp.dataloaders.HtmlUtilsDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.JSONDataLoader
-
 
-
load(Engine, List) - Method in class fmpp.dataloaders.NowDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.PropertiesDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.TddDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.TddSequenceDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.TextDataLoader
-
 
-
load(Engine, List) - Method in class fmpp.dataloaders.XmlDataLoader
-
 
-
load(Engine, List, Document) - Method in class fmpp.dataloaders.XmlDataLoader
-
 
-
load(InputStream) - Method in class fmpp.dataloaders.XmlInfosetDataLoader
-
-
Deprecated.
-
load(Reader) - Method in class fmpp.models.CsvSequence
-
-
Loads data from text of CSV (or whatever similar) format.
-
-
load(File) - Method in class fmpp.setting.Settings
-
-
Loads settings from a configuration file.
-
-
load(Engine, List) - Method in interface fmpp.tdd.DataLoader
-
 
-
loadByteArray(InputStream) - Static method in class fmpp.util.FileUtil
-
 
-
loadDefaults(File) - Method in class fmpp.setting.Settings
-
-
Same as load, except that it adds the settings with - Settings.addDefaults(Map).
-
-
loadString(InputStream, String) - Static method in class fmpp.util.FileUtil
-
 
-
loadTdd(InputStream, String) - Static method in class fmpp.tdd.Interpreter
-
-
Loads a TDD file with utilizing #encoding:enc header.
-
-
loadTdd(byte[], String) - Static method in class fmpp.tdd.Interpreter
-
-
Loads a TDD file with utilizing #encoding:enc header.
-
-
loadXmlFile(Engine, File, boolean, boolean) - Static method in class fmpp.dataloaders.XmlDataLoader
-
 
-
loadXmlFile(Engine, File, boolean, boolean, boolean) - Static method in class fmpp.dataloaders.XmlDataLoader
-
 
-
LocalDataBuilder - Interface in fmpp
-
-
Contains callback to build the local data for a file processing.
-
-
LoggerProgressListener - Class in fmpp.progresslisteners
-
-
Writes detailed information about errors and warning messages into a file - or into any character stream.
-
-
LoggerProgressListener() - Constructor for class fmpp.progresslisteners.LoggerProgressListener
-
-
Output will be printed to the stderr.
-
-
LoggerProgressListener(OutputStream) - Constructor for class fmpp.progresslisteners.LoggerProgressListener
-
 
-
LoggerProgressListener(PrintWriter) - Constructor for class fmpp.progresslisteners.LoggerProgressListener
-
 
-
LoggerProgressListener(File) - Constructor for class fmpp.progresslisteners.LoggerProgressListener
-
 
-
LoggerProgressListener(File, boolean) - Constructor for class fmpp.progresslisteners.LoggerProgressListener
-
 
-
- - - -

M

-
-
main(String[]) - Static method in class fmpp.tools.CommandLine
-
-
Runs the command line interface.
-
-
mapContainsObject(Map, Object) - Static method in class fmpp.util.MiscUtil
-
-
Checks if the map contains the given object (exactly the same instance) - as value.
-
-
MapLocalDataBuilder - Class in fmpp.localdatabuilders
-
-
Trivial local data builder that returns the Map passed to - its constructor.
-
-
MapLocalDataBuilder(Map) - Constructor for class fmpp.localdatabuilders.MapLocalDataBuilder
-
 
-
MiscUtil - Class in fmpp.util
-
-
Miscellaneous utility methods.
-
-
MiscUtil() - Constructor for class fmpp.util.MiscUtil
-
 
-
MSG_ARG_MISSING - Static variable in class fmpp.util.ArgsParser
-
 
-
MSG_ARG_NOT_ALLOWED - Static variable in class fmpp.util.ArgsParser
-
 
-
MSG_OPTION_CONFLICT - Static variable in class fmpp.util.ArgsParser
-
 
-
MSG_OPTION_UNKNOWN - Static variable in class fmpp.util.ArgsParser
-
 
-
MultiListIterator - Class in fmpp.util
-
-
Iterates over multiple List-s.
-
-
MultiListIterator() - Constructor for class fmpp.util.MultiListIterator
-
 
-
MultiListIterator(List) - Constructor for class fmpp.util.MultiListIterator
-
 
-
MultiListIterator(List, List) - Constructor for class fmpp.util.MultiListIterator
-
 
-
MultiListIterator(List, List, List) - Constructor for class fmpp.util.MultiListIterator
-
 
-
MultiListIterator(List, List, List, List) - Constructor for class fmpp.util.MultiListIterator
-
 
-
- - - -

N

-
-
NAME_ALWAYS_CREATE_DIRECTORIES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_APPEND_LOG_FILE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_BOOLEAN_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_BORDERS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_CASE_SENSITIVE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_COLUMNS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_CONFIGURATION_BASE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_DATA - Static variable in class fmpp.setting.Settings
-
 
-
NAME_DATA_ROOT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_DATE_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_DATETIME_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_ECHO_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_EXPERT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_FREEMARKER_LINKS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_IGNORE_CVS_FILES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_IGNORE_SVN_FILES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_IGNORE_TEMPORARY_FILES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_INHERIT_CONFIGURATION - Static variable in class fmpp.setting.Settings
-
 
-
NAME_LOCAL_DATA - Static variable in class fmpp.setting.Settings
-
 
-
NAME_LOCALE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_LOG_FILE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_MODES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_NUMBER_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_OBJECT_WRAPPER - Static variable in class fmpp.setting.Settings
-
 
-
NAME_OUTPUT_ENCODING - Static variable in class fmpp.setting.Settings
-
 
-
NAME_OUTPUT_FILE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_OUTPUT_ROOT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_PRINT_STACK_TRACE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_QUIET - Static variable in class fmpp.setting.Settings
-
 
-
NAME_REMOVE_EXTENSIONS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_REMOVE_POSTFIXES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_REPLACE_EXTENSIONS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SKIP_UNCHANGED - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SNIP - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SOURCE_ENCODING - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SOURCE_ROOT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SOURCES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_SQL_DATE_AND_TIME_TIME_ZONE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_STOP_ON_ERROR - Static variable in class fmpp.setting.Settings
-
 
-
NAME_TAG_SYNTAX - Static variable in class fmpp.setting.Settings
-
 
-
NAME_TEMPLATE_DATA - Static variable in class fmpp.setting.Settings
-
 
-
NAME_TIME_FORMAT - Static variable in class fmpp.setting.Settings
-
 
-
NAME_TIME_ZONE - Static variable in class fmpp.setting.Settings
-
 
-
NAME_TURNS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_URL_ESCAPING_CHARSET - Static variable in class fmpp.setting.Settings
-
 
-
NAME_VALIDATE_XML - Static variable in class fmpp.setting.Settings
-
 
-
NAME_XML_CATALOG_FILES - Static variable in class fmpp.setting.Settings
-
 
-
NAME_XML_CATALOG_PREFER - Static variable in class fmpp.setting.Settings
-
 
-
NAME_XML_RENDERINGS - Static variable in class fmpp.setting.Settings
-
 
-
NAME_XPATH_ENGINE - Static variable in class fmpp.setting.Settings
-
 
-
newMissingParamException(String) - Method in class fmpp.models.TemplateModelUtils
-
 
-
newNoParamsAllowedException() - Method in class fmpp.models.TemplateModelUtils
-
 
-
newUnsupportedParamException(String) - Method in class fmpp.models.TemplateModelUtils
-
 
-
NewWritableHashMethod - Class in fmpp.models
-
-
Creates a new, empty WritableHash.
-
-
NewWritableHashMethod() - Constructor for class fmpp.models.NewWritableHashMethod
-
 
-
NewWritableSequenceMethod - Class in fmpp.models
-
-
Creates a new, empty WritableSequence.
-
-
NewWritableSequenceMethod() - Constructor for class fmpp.models.NewWritableSequenceMethod
-
 
-
next() - Method in class fmpp.util.MultiListIterator
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONArrayNode
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONBooleanNode
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONNullNode
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONNumberNode
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONObjectNode
-
 
-
NODE_TYPE - Static variable in class fmpp.models.JSONStringNode
-
 
-
nodeTypeToDefaultNodeName(String) - Static method in class fmpp.models.JSONNode
-
-
Returns the FTL node name for a node that has otherwise no name.
-
-
normalizeLinebreaks(String) - Static method in class fmpp.util.StringUtil
-
-
Converts all line-breaks to UN*X linebreaks ("\n").
-
-
notify(int, Interpreter, String, Object) - Method in class fmpp.tdd.DataLoaderEvaluationEnvironment
-
 
-
notify(int, Interpreter, String, Object) - Method in interface fmpp.tdd.EvaluationEnvironment
-
-
Notifies about an event during expression evaluation.
-
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.localdatabuilders.CachingLocalDataBuilder
-
-
Discards the cached result on - ProgressListener.EVENT_END_PROCESSING_SESSION.
-
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in interface fmpp.ProgressListener
-
-
Method called be the engine to notify events.
-
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.progresslisteners.AntProgressListener
-
 
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.progresslisteners.ConsoleProgressListener
-
 
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
 
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
 
-
notifyProgressEvent(Engine, int, File, int, Throwable, Object) - Method in class fmpp.progresslisteners.TerseConsoleProgressListener
-
 
-
NowDataLoader - Class in fmpp.dataloaders
-
-
Data loader that produces string from the current date.
-
-
NowDataLoader() - Constructor for class fmpp.dataloaders.NowDataLoader
-
 
-
NullOutputStream - Class in fmpp.util
-
-
OutputStream that simply drops what it gets.
-
-
NullWriter - Class in fmpp.util
-
-
Writer that simply drops what it gets.
-
-
numberToInt(Number) - Static method in class fmpp.util.MiscUtil
-
-
Loseless convertion to int.
-
-
- - - -

O

-
-
OLD_NAME_REMOVE_EXTENSION - Static variable in class fmpp.setting.Settings
-
 
-
OLD_NAME_REMOVE_POSTFIX - Static variable in class fmpp.setting.Settings
-
 
-
OLD_NAME_REPLACE_EXTENSION - Static variable in class fmpp.setting.Settings
-
 
-
OPTION_INDEX - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_NAME_ENCODING - Static variable in class fmpp.util.DataLoaderUtil
-
 
-
OPTION_NAMESPACE_AWARE - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_REMOVE_COMMENTS - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_REMOVE_PIS - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_VALIDATE - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_XINCLUDE_AWARE - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OPTION_XMLNS - Static variable in class fmpp.dataloaders.XmlDataLoader
-
 
-
OptionDefinition() - Constructor for class fmpp.util.ArgsParser.OptionDefinition
-
 
-
- - - -

P

-
-
PARAMETER_VALUE_HOST - Static variable in class fmpp.Engine
-
-
A commonly used reserved parameter value: "host".
-
-
PARAMETER_VALUE_OUTPUT - Static variable in class fmpp.Engine
-
-
A commonly used reserved parameter value: "source".
-
-
PARAMETER_VALUE_SOURCE - Static variable in class fmpp.Engine
-
-
A commonly used reserved parameter value: "source".
-
-
parse(String[]) - Method in class fmpp.util.ArgsParser
-
-
Parses the args[].
-
-
parse(String, String) - Static method in class fmpp.util.JSONParser
-
 
-
ParseException(String) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
ParseException(String, int) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
ParseException(String, String, int, String) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
ParseException(String, Throwable) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
ParseException(String, int, Throwable) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
ParseException(String, String, int, String, Throwable) - Constructor for exception fmpp.util.StringUtil.ParseException
-
 
-
parseExtraArguments(List) - Method in class fmpp.dataloaders.AbstractTextDataLoader
-
-
Parses the argument list, except the 1st (file name) argument.
-
-
parseExtraArguments(List) - Method in class fmpp.dataloaders.SlicedTextDataLoader
-
 
-
parseText(String) - Method in class fmpp.dataloaders.AbstractTextDataLoader
-
-
Parses the file content to the final object that the data loader - will return.
-
-
parseText(String) - Method in class fmpp.dataloaders.SlicedTextDataLoader
-
 
-
pathPatternToPerl5Regex(String) - Static method in class fmpp.util.FileUtil
-
-
Converts UN*X style path to regular expression (originally, for Perl 5 dialect, but also works for Java's - dialect).
-
-
pathToUnixStyle(String) - Static method in class fmpp.util.FileUtil
-
-
Brings the path to UNI*X style format, so that it can be handled - with path pattern handling functions.
-
-
PMODE_COPY - Static variable in class fmpp.Engine
-
-
Processing mode: Copy the file as-is (binary copy).
-
-
PMODE_EXECUTE - Static variable in class fmpp.Engine
-
-
Processing mode: Execute the file as template
-
-
PMODE_IGNORE - Static variable in class fmpp.Engine
-
-
Processing mode: Ignore the file.
-
-
PMODE_NONE - Static variable in class fmpp.Engine
-
-
Processing mode: N/A
-
-
PMODE_RENDER_XML - Static variable in class fmpp.Engine
-
-
Processing mode: Render XML with an FTL template.
-
-
postProcessItems(List) - Method in class fmpp.dataloaders.SlicedTextDataLoader
-
-
Override this if you want to post-process the items.
-
-
println() - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints line-break into the log.
-
-
println(Object) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints into the log with word-wrapping.
-
-
println(String) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints into the log with word-wrapping.
-
-
println(String, int) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints into the log with word-wrapping and indentation.
-
-
printlnNW(String) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints into the log without word-wrapping.
-
-
printNW(String) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
-
Prints into the log without word-wrapping.
-
-
printStackTrace(Throwable) - Method in class fmpp.progresslisteners.LoggerProgressListener
-
 
-
printStackTrace() - Method in exception fmpp.util.RuntimeExceptionCC
-
 
-
printStackTrace(PrintStream) - Method in exception fmpp.util.RuntimeExceptionCC
-
 
-
printStackTrace(PrintWriter) - Method in exception fmpp.util.RuntimeExceptionCC
-
 
-
process(File[]) - Method in class fmpp.Engine
-
-
Processes a list of files.
-
-
process(File, File) - Method in class fmpp.Engine
-
-
Hack to processes a single file.
-
-
ProcessingException - Exception in fmpp
-
-
Error while performing the processing session.
-
-
ProcessingException(Engine, File, Throwable) - Constructor for exception fmpp.ProcessingException
-
 
-
ProgressListener - Interface in fmpp
-
-
Interface to monitor the events of an Engine.
-
-
PropertiesDataLoader - Class in fmpp.dataloaders
-
-
Returns a Map based on a Java properties file.
-
-
PropertiesDataLoader() - Constructor for class fmpp.dataloaders.PropertiesDataLoader
-
 
-
property(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Sets the property name for this option.
-
-
property(String, String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Convenience method; same as calling property(String) and - then propertyValue.
-
-
propertyValue(String) - Method in class fmpp.util.ArgsParser.OptionDefinition
-
-
Sets the property value for this option.
-
-
- - - -

Q

-
-
quietSettingValueToInt(String, String) - Static method in class fmpp.setting.Settings
-
-
Returns 0 for verbose mode, 1 for quiet mode, 2 for really-quiet mode.
-
-
- - - -

R

-
-
read() - Method in class fmpp.util.BorderedReader
-
 
-
read(char[], int, int) - Method in class fmpp.util.BorderedReader
-
 
-
remove(String) - Method in class fmpp.setting.Settings
-
-
Removes a setting value.
-
-
remove() - Method in class fmpp.util.MultiListIterator
-
 
-
removeAttribute(String) - Method in class fmpp.Engine
-
-
Removes an attribute.
-
-
removeAttribute(String) - Method in class fmpp.setting.Settings
-
-
Removes an engine attribute.
-
-
removeData(String) - Method in class fmpp.Engine
-
-
Removes a variable that would be visible for all templates when the - processing session executes.
-
-
removeSlashPrefix(String) - Static method in class fmpp.util.FileUtil
-
 
-
RemoveTransform - Class in fmpp.models
-
-
Removes an item from a WritableSequence or WritableHash.
-
-
RemoveTransform() - Constructor for class fmpp.models.RemoveTransform
-
 
-
renameOutputFile(String) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
repeat(String, int) - Static method in class fmpp.util.StringUtil
-
 
-
replace(String, String, String) - Static method in class fmpp.util.StringUtil
-
-
Replaces all occurances of a sub-string in a string.
-
-
reset() - Method in class fmpp.progresslisteners.StatisticsProgressListener
-
-
Rests all counters.
-
-
resolveOutputPath(String) - Method in class fmpp.TemplateEnvironment
-
-
Resolves a output path to a File object.
-
-
resolveRelativeUnixPath(File, File, String) - Static method in class fmpp.util.FileUtil
-
-
Resolves relative UN*X path based on given root and working directory.
-
-
resolveSourcePath(String) - Method in class fmpp.TemplateEnvironment
-
-
Resolves a source path to a File object.
-
-
restartOutputFile() - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
RETURN_FRAGMENT - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
 
-
RETURN_SKIP - Static variable in interface fmpp.tdd.EvaluationEnvironment
-
 
-
rtfEnc(String) - Static method in class fmpp.util.StringUtil
-
-
Rich Text Format encoding (does not replace line breaks).
-
-
RuntimeExceptionCC - Exception in fmpp.util
-
-
RuntimeException that emulates J2SE 1.4+ cause-chains if it runs - on earlier versions.
-
-
RuntimeExceptionCC() - Constructor for exception fmpp.util.RuntimeExceptionCC
-
 
-
RuntimeExceptionCC(String) - Constructor for exception fmpp.util.RuntimeExceptionCC
-
 
-
RuntimeExceptionCC(Throwable) - Constructor for exception fmpp.util.RuntimeExceptionCC
-
 
-
RuntimeExceptionCC(String, Throwable) - Constructor for exception fmpp.util.RuntimeExceptionCC
-
 
-
- - - -

S

-
-
set(String, Object) - Method in class fmpp.setting.Settings
-
-
Sets the value of a setting.
-
-
set(String, boolean) - Method in class fmpp.setting.Settings
-
-
Convenience method for setting a Boolean value.
-
-
set(String, int) - Method in class fmpp.setting.Settings
-
-
Convenience method for setting an Integer value.
-
-
set(Map) - Method in class fmpp.setting.Settings
-
-
Sets all name-value pairs stored in the map with - Settings.set(String, Object).
-
-
setAltFalse(String) - Method in class fmpp.models.CsvSequence
-
-
Alternative word used to indicate boolean false in the CSV file.
-
-
setAltTrue(String) - Method in class fmpp.models.CsvSequence
-
-
Alternative word used to indicate boolean true in the CSV file.
-
-
setAlwaysCreateDirectories(boolean) - Method in class fmpp.Engine
-
-
Sets whether for source directories a corresponding output directory - will be created even if no file output went into it.
-
-
setAlwaysCreateDirectories(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setAlwaysCreateDirs(boolean) - Method in class fmpp.tools.AntTask
-
-
Same as AntTask.setAlwaysCreateDirectories(boolean); added as this name - is closer to the Ant naming conventions.
-
-
setAntTaskFailOnError(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setAppendLogFile(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setAttribute(String, Object) - Method in class fmpp.Engine
-
-
Adds/replaces an engine attribute.
-
-
setBooleanFormat(String) - Method in class fmpp.Engine
-
-
Sets the boolean format used to convert boolean to strings, as defined - by Configurable.setBooleanFormat(String).
-
-
setBooleanFormat(String) - Method in class fmpp.tools.AntTask
-
 
-
setBorders(String) - Method in class fmpp.tools.AntTask
-
 
-
setCaseSensitive(boolean) - Method in class fmpp.Engine
-
-
Sets if the engine differentiates upper- and lower-case letters when it - compares paths or matches path patterns with paths.
-
-
setCaseSensitive(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setConfiguration(File) - Method in class fmpp.tools.AntTask
-
 
-
setConfigurationBase(File) - Method in class fmpp.tools.AntTask
-
 
-
setCopy(boolean) - Method in class fmpp.XmlRenderingConfiguration
-
-
Sets if the XML file should be copied as is, or renderd with a template.
-
-
setData(String) - Method in class fmpp.tools.AntTask
-
 
-
setDataRoot(File) - Method in class fmpp.Engine
-
-
Sets the root directory of data files.
-
-
setDataRoot(File) - Method in class fmpp.tools.AntTask
-
 
-
setDateFormat(String) - Method in class fmpp.Engine
-
-
Sets the format used to convert date values (year + month + day) to - strings.
-
-
setDateFormat(String) - Method in class fmpp.tools.AntTask
-
 
-
setDateFormatPattern(String) - Method in class fmpp.models.CsvSequence
-
-
Sets the pattern used to parse date columns.
-
-
setDateTimeFormat(String) - Method in class fmpp.Engine
-
-
Sets the format used to convert date-time values (year + month + day + - hour + minute + second + millisecond) to strings.
-
-
setDateTimeFormat(String) - Method in class fmpp.tools.AntTask
-
 
-
setDateTimeFormatPattern(String) - Method in class fmpp.models.CsvSequence
-
-
Sets the pattern used to parse date-time columns.
-
-
setDecimalSeparator(char) - Method in class fmpp.models.CsvSequence
-
-
Sets the alternative symbol used for the decimal dot in - the file for numbers.
-
-
setDefault(String, Object) - Method in class fmpp.setting.Settings
-
-
Sets the value of a setting if the value doesn't exists yet.
-
-
setDefault(String, boolean) - Method in class fmpp.setting.Settings
-
-
Convenience method for setting a Boolean value.
-
-
setDefault(String, int) - Method in class fmpp.setting.Settings
-
-
Convenience method for setting an Integer value.
-
-
setDefaultProperties(Properties) - Method in class fmpp.util.ArgsParser
-
-
Sets the properies object that will be the default properties object for - the properies object that parse creates for the options - (See Properties.Properties(Properties defaults)).
-
-
setDefaults(Map) - Method in class fmpp.setting.Settings
-
-
Sets all name-value pairs stored in the map with - Settings.setDefault(String, Object).
-
-
setDefaultsWithStrings(Properties) - Method in class fmpp.setting.Settings
-
-
Same as Settings.setDefaults(Map), but uses a Properties - object, so the values are strings.
-
-
setDefaultWithString(String, String) - Method in class fmpp.setting.Settings
-
-
Same as Settings.setDefault(String, Object), but uses string value.
-
-
setDestDir(File) - Method in class fmpp.tools.AntTask
-
 
-
setDir(File) - Method in class fmpp.tools.AntTask
-
 
-
setDontTraverseDirectories(boolean) - Method in class fmpp.Engine
-
-
Sets the Engine should automatically process the files and - directories inside a directory whose processing was asked through the - public Engine API.
-
-
setDontTraverseDirectories(boolean) - Method in class fmpp.setting.Settings
-
- -
-
setEmptyValues(String[]) - Method in class fmpp.models.CsvSequence
-
-
Specifies the list of cell values that will be replaced with an empty - (0 length) string.
-
-
setEncoding(String) - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
-
Sets the encoding of the script files.
-
-
setEnding(String) - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
-
Sets the string appended at the end of the source file name.
-
-
setEngineAttribute(String, Object) - Method in class fmpp.setting.Settings
-
-
Sets an engine attribute.
-
-
setExpandProperties(boolean) - Method in class fmpp.tools.AntTask.AntAttributeSubstitution
-
 
-
setExpert(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setExpertMode(boolean) - Method in class fmpp.Engine
-
-
Allows some features that are considerd dangerous.
-
-
setExternalHeaderRow(String[]) - Method in class fmpp.models.CsvSequence
-
-
If it is not null, then it is used as the header row - instead of the first row of the CSV file.
-
-
setFreemarkerIncompatibleImprovements(String) - Method in class fmpp.tools.AntTask
-
 
-
setFreemarkerLinks(String) - Method in class fmpp.tools.AntTask
-
 
-
setGroupingSeparator(char) - Method in class fmpp.models.CsvSequence
-
-
Set the grouping separator symbol used for grouping in the file - for numbers.
-
-
setHasHeaderRow(boolean) - Method in class fmpp.models.CsvSequence
-
-
Specifies if the file contains header row or not.
-
-
setIgnoreCvsFiles(boolean) - Method in class fmpp.Engine
-
-
Sets if the CVS files inside the source root directory should be - ignored or not.
-
-
setIgnoreMissing(boolean) - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
 
-
setIgnoreSvnFiles(boolean) - Method in class fmpp.Engine
-
-
Sets if the SVN files inside the source root directory should be - ignored or not.
-
-
setIgnoreTemporaryFiles(boolean) - Method in class fmpp.Engine
-
-
Set if well-known temporary files inside the source root directory should - be ignored or not.
-
-
setInheritConfiguration(File) - Method in class fmpp.tools.AntTask
-
 
-
setList(List) - Method in class fmpp.models.WritableSequence
-
 
-
setLocalData(String) - Method in class fmpp.tools.AntTask
-
 
-
setLocale(Locale) - Method in class fmpp.Engine
-
-
Sets the locale (country, language).
-
-
setLocale(String) - Method in class fmpp.Engine
-
-
Sets the locale (country, language).
-
-
setLocale(String) - Method in class fmpp.tools.AntTask
-
 
-
setLogFile(File) - Method in class fmpp.tools.AntTask
-
 
-
setMap(Map) - Method in class fmpp.models.WritableHash
-
 
-
setMessages(Properties) - Method in class fmpp.util.ArgsParser
-
-
Customizes the error messages shown to the user.
-
-
setModes(String) - Method in class fmpp.tools.AntTask
-
 
-
setNormalizeHeaders(boolean) - Method in class fmpp.models.CsvSequence
-
-
Specifies if the header names coming from the file will be normalized - or should be left as is.
-
-
setNumberFormat(String) - Method in class fmpp.Engine
-
-
Sets the number format used to convert numbers to strings, as defined - by Configurable.setNumberFormat(String).
-
-
setNumberFormat(String) - Method in class fmpp.tools.AntTask
-
 
-
setObjectWrapper(String) - Method in class fmpp.tools.AntTask
-
 
-
setOldTemplateSyntax(boolean) - Method in class fmpp.Engine
-
-
Sets if the # is required in FTL tags or not.
-
-
setOutputEncoding(String) - Method in class fmpp.Engine
-
-
Sets the encoding used for textural output (template generated files).
-
-
setOutputEncoding(String) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
setOutputEncoding(String) - Method in class fmpp.tools.AntTask
-
 
-
setOutputFile(File) - Method in class fmpp.tools.AntTask
-
 
-
setOutputRoot(File) - Method in class fmpp.Engine
-
-
Sets the root directory of output files.
-
-
setOutputRoot(File) - Method in class fmpp.tools.AntTask
-
 
-
setOutputRoot_common(File, boolean) - Method in class fmpp.tools.AntTask
-
 
-
setQuiet(String) - Method in class fmpp.tools.AntTask
-
 
-
setRemoveExtension(boolean) - Method in class fmpp.localdatabuilders.BshLocalDataBuilder
-
-
Sets if the extension from the source file name should be removed before - appending the ending.
-
-
setRemoveExtension(String) - Method in class fmpp.tools.AntTask
-
 
-
setRemoveExtensions(String) - Method in class fmpp.tools.AntTask
-
 
-
setRemovePostfix(String) - Method in class fmpp.tools.AntTask
-
 
-
setRemovePostfixes(String) - Method in class fmpp.tools.AntTask
-
 
-
setReplaceExtension(String) - Method in class fmpp.tools.AntTask
-
 
-
setReplaceExtensions(String) - Method in class fmpp.tools.AntTask
-
 
-
setSeparator(char) - Method in class fmpp.models.CsvSequence
-
-
Separator char between cloumns.
-
-
setSkipUnchanged(int) - Method in class fmpp.Engine
-
-
Sets what source file can be skipped if it was not modified after the - last modification time of the output file.
-
-
setSkipUnchanged(String) - Method in class fmpp.tools.AntTask
-
 
-
setSourceEncoding(String) - Method in class fmpp.Engine
-
-
Sets the encoding (charset) of textual source files.
-
-
setSourceEncoding(String) - Method in class fmpp.tools.AntTask
-
 
-
setSourceFile(File) - Method in class fmpp.tools.AntTask
-
 
-
setSourceRoot(File) - Method in class fmpp.Engine
-
-
Sets the root directory of source files.
-
-
setSourceRoot(File) - Method in class fmpp.tools.AntTask
-
 
-
setSourceRoot_common(File, boolean) - Method in class fmpp.tools.AntTask
-
 
-
setSQLDateAndTimeTimeZone(TimeZone) - Method in class fmpp.Engine
-
-
Sets the time zone used when dealing with java.sql.Date and - java.sql.Time values.
-
-
setSQLDateAndTimeTimeZone(String) - Method in class fmpp.Engine
-
-
Same as Engine.setSQLDateAndTimeTimeZone(TimeZone), but lets FreeMarker parse the value to time zone.
-
-
setSQLDateAndTimeTimeZone(String) - Method in class fmpp.tools.AntTask
-
 
-
setSrcDir(File) - Method in class fmpp.tools.AntTask
-
 
-
setStopOnError(boolean) - Method in class fmpp.Engine
-
 
-
setStopOnError(boolean) - Method in class fmpp.tools.AntTask
-
 
-
setTagSyntax(int) - Method in class fmpp.Engine
-
-
Sets the tagSyntax setting of FreeMarker.
-
-
setTagSyntax(String) - Method in class fmpp.tools.AntTask
-
 
-
setTemplate(String) - Method in class fmpp.XmlRenderingConfiguration
-
-
Sets the renderer template.
-
-
setTemplateData(String) - Method in class fmpp.tools.AntTask
-
 
-
setTemplateDataModelBuilder(TemplateDataModelBuilder) - Method in class fmpp.Engine
-
-
Sets the class that will be instantiated to create the template specfic - variables.
-
-
setTemplateDataModelBuilder(String) - Method in class fmpp.Engine
-
 
-
setTimeFormat(String) - Method in class fmpp.Engine
-
-
Sets the format used to convert time values (hour + minute + second - + millisecond) to strings.
-
-
setTimeFormat(String) - Method in class fmpp.tools.AntTask
-
 
-
setTimeFormatPattern(String) - Method in class fmpp.models.CsvSequence
-
-
Sets the pattern used to parse time columns.
-
-
setTimeZone(TimeZone) - Method in class fmpp.Engine
-
-
Sets the time zone used to display date/time/date-time values.
-
-
setTimeZone(String) - Method in class fmpp.Engine
-
-
Same as Engine.setTimeZone(TimeZone), but lets FreeMarker parse the value to time zone.
-
-
setTimeZone(TimeZone) - Method in class fmpp.models.CsvSequence
-
-
Sets the time zone used for parsing date/time/date-time that does not - specify a time zone explicitly.
-
-
setTimeZone(String) - Method in class fmpp.tools.AntTask
-
 
-
SettingException - Exception in fmpp.setting
-
-
Bad setting or setting combination, or failure when trying to setup the - engine with the settings.
-
-
SettingException(String) - Constructor for exception fmpp.setting.SettingException
-
 
-
SettingException(String, Throwable) - Constructor for exception fmpp.setting.SettingException
-
 
-
Settings - Class in fmpp.setting
-
-
Stores FMPP settings, loads configuration files, provides other setting - handling related utilities.
-
-
Settings(File) - Constructor for class fmpp.setting.Settings
-
-
Creates a new instance.
-
-
SetTransform - Class in fmpp.models
-
-
Changes items an item in a WritableSequence or sets/adds and - item to a WritableHash.
-
-
SetTransform() - Constructor for class fmpp.models.SetTransform
-
 
-
setTrimCells(boolean) - Method in class fmpp.models.CsvSequence
-
-
Specifies if all cells will be trimmed.
-
-
setTurns(String) - Method in class fmpp.tools.AntTask
-
 
-
setUrlEscapingCharset(String) - Method in class fmpp.Engine
-
-
Sets the charset used for URL escaping.
-
-
setUrlEscapingCharset(String) - Method in class fmpp.tools.AntTask
-
 
-
setValidateXml(boolean) - Method in class fmpp.Engine
-
-
Sets if XML documents should be validated when they are loaded.
-
-
setValidateXml(String) - Method in class fmpp.tools.AntTask
-
 
-
setWithString(String, String) - Method in class fmpp.setting.Settings
-
-
Same as Settings.set(String, Object), but uses string value.
-
-
setWithStrings(Properties) - Method in class fmpp.setting.Settings
-
-
Same as Settings.set(Map), but uses a Properties object, - so the values are strings.
-
-
setXHtml(boolean) - Method in class fmpp.dataloaders.HtmlUtilsDataLoader
-
 
-
setXmlCatalogFiles(String) - Method in class fmpp.tools.AntTask
-
 
-
setXmlCatalogPrefer(String) - Method in class fmpp.tools.AntTask
-
 
-
setXmlEntityResolver(Object) - Method in class fmpp.Engine
-
-
Sets the XML entiry resolver used for reading XML documents.
-
-
setXmlRenderings(String) - Method in class fmpp.tools.AntTask
-
 
-
setXpathEngine(String) - Method in class fmpp.Engine
-
-
Sets if which XPath engine should be used.
-
-
setXpathEngine(String) - Method in class fmpp.tools.AntTask
-
 
-
SIMPLE_EVALUATION_ENVIRONMENT - Static variable in class fmpp.tdd.Interpreter
-
-
Evaluates function calls to itself.
-
-
size() - Method in class fmpp.models.CsvSequence
-
 
-
size() - Method in class fmpp.models.JSONArrayNode
-
 
-
size() - Method in class fmpp.models.JSONObjectNode
-
 
-
size() - Method in class fmpp.models.StringArraySequence
-
 
-
size() - Method in class fmpp.models.TemplateModelListSequence
-
 
-
size() - Method in class fmpp.models.WritableHash
-
 
-
size() - Method in class fmpp.models.WritableSequence
-
 
-
skip(long) - Method in class fmpp.util.BorderedReader
-
 
-
SKIP_ALL - Static variable in class fmpp.Engine
-
-
Used with the "skipUnchanged" engine parameter: skip all unchanged - files
-
-
SKIP_NONE - Static variable in class fmpp.Engine
-
-
Used with the "skipUnchnaged" engine parameter: never skip files
-
-
SKIP_STATIC - Static variable in class fmpp.Engine
-
-
Used with the "skipUnchanged" engine parameter: skip unchanged static - files
-
-
SlicedTextDataLoader - Class in fmpp.dataloaders
-
-
Returns a sequence of strings based on a plain text file, where the specified - symbol is used as separator.
-
-
SlicedTextDataLoader() - Constructor for class fmpp.dataloaders.SlicedTextDataLoader
-
 
-
split(String, char) - Static method in class fmpp.util.StringUtil
-
- -
-
split(String, char, boolean) - Static method in class fmpp.util.StringUtil
-
-
Splits a string at the specified character, and optionally trims the - items.
-
-
split(String, String) - Static method in class fmpp.util.StringUtil
-
-
Splits a string at the specified string.
-
-
splitAtWS(String) - Static method in class fmpp.util.StringUtil
-
-
Splits a string at white-spaces.
-
-
StatisticsProgressListener - Class in fmpp.progresslisteners
-
-
Spins some counters regarding the work of the Engine.
-
-
StatisticsProgressListener() - Constructor for class fmpp.progresslisteners.StatisticsProgressListener
-
 
-
StringArraySequence - Class in fmpp.models
-
-
Sequence variable implementation that wraps a String[] with relatively low - resource utilization.
-
-
StringArraySequence(String[]) - Constructor for class fmpp.models.StringArraySequence
-
-
Warning: Does not copy the argument array!
-
-
stringToBigDecimal(String) - Static method in class fmpp.util.StringUtil
-
-
Converts a string to BigDecimal.
-
-
stringToBoolean(String) - Static method in class fmpp.util.StringUtil
-
 
-
stringToDate(String, TimeZone) - Static method in class fmpp.util.StringUtil
-
-
Parses a date of format "yyyy-MM-dd" - or "yyyy-MM-dd z" and returns it as - TemplateDateModel.
-
-
stringToDateTime(String, TimeZone) - Static method in class fmpp.util.StringUtil
-
-
Parses a date-time of format "yyyy-MM-dd H:mm:ss" - or "yyyy-MM-dd h:mm:ss a" or - "yyyy-MM-dd H:mm:ss z" - or "yyyy-MM-dd h:mm:ss a z" and returns it as - TemplateDateModel.
-
-
stringToPerl5Regex(String) - Static method in class fmpp.util.StringUtil
-
-
Convers string to Perl 5 regular expression.
-
-
stringToTime(String, TimeZone) - Static method in class fmpp.util.StringUtil
-
-
Parses a time of format "H:mm:ss" - or "h:mm:ss a" or "H:mm:ss z" - or "h:mm:ss a z" and returns it as - TemplateDateModel.
-
-
StringUtil - Class in fmpp.util
-
-
Collection of string manipulation functions.
-
-
StringUtil() - Constructor for class fmpp.util.StringUtil
-
 
-
StringUtil.ParseException - Exception in fmpp.util
-
-
Formal (syntactical) problem with the text.
-
-
strParam(Object, String) - Method in class fmpp.models.TemplateModelUtils
-
 
-
- - - -

T

-
-
TddDataLoader - Class in fmpp.dataloaders
-
-
Creates a Map based on a TDD file.
-
-
TddDataLoader() - Constructor for class fmpp.dataloaders.TddDataLoader
-
 
-
TddHashLocalDataBuilder - Class in fmpp.localdatabuilders
-
-
Builds data from a TDD hash, interpreting function calls as data loader - invocations.
-
-
TddHashLocalDataBuilder(String) - Constructor for class fmpp.localdatabuilders.TddHashLocalDataBuilder
-
 
-
TddHashLocalDataBuilder(Fragment) - Constructor for class fmpp.localdatabuilders.TddHashLocalDataBuilder
-
 
-
TddSequenceDataLoader - Class in fmpp.dataloaders
-
-
Creates a List based on a TDD file.
-
-
TddSequenceDataLoader() - Constructor for class fmpp.dataloaders.TddSequenceDataLoader
-
 
-
TddUtil - Class in fmpp.tdd
-
-
Utility methods for TDD related tasks.
-
-
TddUtil() - Constructor for class fmpp.tdd.TddUtil
-
 
-
TemplateDataModelBuilder - Interface in fmpp
-
-
Deprecated. -
Use LocalDataBuilder instead.
-
-
-
TemplateEnvironment - Class in fmpp
-
-
The runtime FMPP environment of an executing template.
-
-
TemplateModelArrayCollection - Class in fmpp.models
-
-
Collection variable implementation that wraps an array of already - wrapped objects directly.
-
-
TemplateModelArrayCollection(TemplateModel[]) - Constructor for class fmpp.models.TemplateModelArrayCollection
-
 
-
TemplateModelListCollection - Class in fmpp.models
-
-
Collection variable implementation that wraps a java.util.List of already - wrapped objects directly.
-
-
TemplateModelListCollection(List) - Constructor for class fmpp.models.TemplateModelListCollection
-
 
-
TemplateModelListSequence - Class in fmpp.models
-
-
Sequence that wraps a java.util.List of already wrapped objects - directly, with minimal resource usage.
-
-
TemplateModelListSequence(List) - Constructor for class fmpp.models.TemplateModelListSequence
-
 
-
TemplateModelUtils - Class in fmpp.models
-
-
Constains utility methods for transform and method variable implementation.
-
-
TemplateModelUtils() - Constructor for class fmpp.models.TemplateModelUtils
-
 
-
TerseConsoleProgressListener - Class in fmpp.progresslisteners
-
-
Designed to show the progress on console screen in a - very terse way (prints a symbol for each processed file).
-
-
TerseConsoleProgressListener() - Constructor for class fmpp.progresslisteners.TerseConsoleProgressListener
-
-
Output will be printed to the stdout.
-
-
TerseConsoleProgressListener(OutputStream) - Constructor for class fmpp.progresslisteners.TerseConsoleProgressListener
-
 
-
TerseConsoleProgressListener(PrintWriter) - Constructor for class fmpp.progresslisteners.TerseConsoleProgressListener
-
 
-
TextDataLoader - Class in fmpp.dataloaders
-
-
Returns a string based on a plain text file.
-
-
TextDataLoader() - Constructor for class fmpp.dataloaders.TextDataLoader
-
 
-
toOutputRelatitvePath(String) - Method in class fmpp.TemplateEnvironment
-
-
Same as TemplateEnvironment.toSourceRootRelativePath(String) but with the output - file and output root directory.
-
-
toOutputRootRelativePath(File) - Method in class fmpp.TemplateEnvironment
-
-
Convets a file object to an output root relative UN*X style path.
-
-
toSourceRootRelativePath(String) - Method in class fmpp.TemplateEnvironment
-
-
Returns the path relative to the source root.
-
-
toSourceRootRelativePath(File) - Method in class fmpp.TemplateEnvironment
-
-
Convets a file object to a source root relative UN*X style path.
-
-
toString() - Method in class fmpp.localdatabuilders.TddHashLocalDataBuilder
-
 
-
toString() - Method in class fmpp.setting.FileWithConfigurationBase
-
 
-
toString() - Method in class fmpp.setting.FileWithSettingValue
-
 
-
toString() - Method in class fmpp.tdd.Fragment
-
-
Returns the fragment text.
-
-
toString() - Method in class fmpp.tdd.FunctionCall
-
 
-
toString() - Method in class fmpp.XmlRenderingConfiguration
-
 
-
trimValues(Properties) - Method in class fmpp.setting.Settings
-
-
Trims all property values.
-
-
TYPE_ANY - Static variable in class fmpp.setting.Settings
-
-
Any object.
-
-
TYPE_BOOLEAN - Static variable in class fmpp.setting.Settings
-
-
Boolean setting type.
-
-
TYPE_CFG_RELATIVE_PATH - Static variable in class fmpp.setting.Settings
-
-
"Configuration relative path" setting type.
-
-
TYPE_CFG_RELATIVE_PATHS - Static variable in class fmpp.setting.Settings
-
-
"Configuration relative paths" setting type.
-
-
TYPE_DATA_MODEL - Static variable in class fmpp.setting.Settings
-
-
Data model setting type.
-
-
TYPE_HASH - Static variable in class fmpp.setting.Settings
-
-
Hash setting type.
-
-
TYPE_HASH_OF_SEQUENCE_OF_CFG_RELATIVE_PATHS - Static variable in class fmpp.setting.Settings
-
-
Hash-of-configuration-relative-paths setting type.
-
-
TYPE_INTEGER - Static variable in class fmpp.setting.Settings
-
-
Integer setting type.
-
-
TYPE_LOCAL_DATA_MODEL - Static variable in class fmpp.setting.Settings
-
-
Local data model setting type.
-
-
TYPE_SEQUENCE - Static variable in class fmpp.setting.Settings
-
-
Sequence setting type.
-
-
TYPE_STRING - Static variable in class fmpp.setting.Settings
-
-
String setting type.
-
-
TYPE_UNRESOLVED_CFG_RELATIVE_PATHS - Static variable in class fmpp.setting.Settings
-
-
"Unresolved configuration relative paths" setting type.
-
-
- - - -

U

-
-
undashNames(Properties) - Method in class fmpp.setting.Settings
-
-
Converts legacy dashed setting names to the standard format, as - source-root to sourceRoot.
-
-
urlEnc(String, String) - Static method in class fmpp.util.StringUtil
-
-
URL encoding (like%20this).
-
-
urlPathEnc(String, String) - Static method in class fmpp.util.StringUtil
-
-
URL encoding without escaping slashes.
-
-
- - - -

V

-
-
VALUE_GLOBAL_DEFAULT - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_HOST - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_NONE - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_OBJECTWRAPPER_SHARED_BEANS_WRAPPER - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_OUTPUT - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_REALLY_QUIET - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_SOURCE - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_TAG_SYNTAX_ANGLE_BRACKET - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_TAG_SYNTAX_AUTO_DETECT - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_TAG_SYNTAX_SQUARE_BRACKET - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_XML_CATALOG_PREFER_PUBLIC - Static variable in class fmpp.setting.Settings
-
 
-
VALUE_XML_CATALOG_PREFER_SYSTEM - Static variable in class fmpp.setting.Settings
-
 
-
values() - Method in class fmpp.models.JSONObjectNode
-
-
Returns the values from the key-value pairs of this JSON object, returning Java null for JSON - null-s.
-
-
values() - Method in class fmpp.models.WritableHash
-
 
-
- - - -

W

-
-
warning(String) - Method in class fmpp.TemplateEnvironment
-
-
It does the same as the directive in the pp hash.
-
-
wrap(Object) - Method in class fmpp.Engine
-
-
Wraps any object as TemplateModel.
-
-
wrap(Object) - Static method in class fmpp.models.JSONNode
-
-
Wraps a List, a Map with string keys, a String, a Number or a Boolean - into a JSONNode.
-
-
wrap(Object, JSONNode, String, boolean) - Static method in class fmpp.models.JSONNode
-
 
-
wrap(String, int) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, String) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, int) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, int, int) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, int, String) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, int, int, String) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(StringBuffer, int, int, int) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(String, int, int, int, String, boolean) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrap(StringBuffer, int, int, int, String, boolean) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
wrapTrace(String, int) - Static method in class fmpp.util.StringUtil
-
-
Hard-wraps flow-text.
-
-
WritableHash - Class in fmpp.models
-
-
Hash variable that can be changed during template execution with the proper - method variables.
-
-
WritableHash() - Constructor for class fmpp.models.WritableHash
-
 
-
WritableHash(Map) - Constructor for class fmpp.models.WritableHash
-
 
-
WritableSequence - Class in fmpp.models
-
-
Sequence variable that can be changed during template execution with the - proper method variables.
-
-
WritableSequence() - Constructor for class fmpp.models.WritableSequence
-
 
-
WritableSequence(List) - Constructor for class fmpp.models.WritableSequence
-
 
-
write(int) - Method in class fmpp.util.NullOutputStream
-
 
-
write(byte[], int, int) - Method in class fmpp.util.NullOutputStream
-
 
-
write(char[], int, int) - Method in class fmpp.util.NullWriter
-
 
-
- - - -

X

-
-
XmlDataLoader - Class in fmpp.dataloaders
-
-
Returns a variable that exposes the content of an XML file.
-
-
XmlDataLoader() - Constructor for class fmpp.dataloaders.XmlDataLoader
-
 
-
xmlEnc(String) - Static method in class fmpp.util.StringUtil
-
-
XML Encoding.
-
-
xmlEncNQ(String) - Static method in class fmpp.util.StringUtil
-
-
XML encoding without replacing apostrophes and quotation marks.
-
-
XmlInfosetDataLoader - Class in fmpp.dataloaders
-
-
Deprecated. -
Use XmlDataLoader instead.
-
-
-
XmlInfosetDataLoader() - Constructor for class fmpp.dataloaders.XmlInfosetDataLoader
-
-
Deprecated.
-
XmlRenderingConfiguration - Class in fmpp
-
-
Stores options that describe when and how to process an XML file in - "renderXml" processing mode.
-
-
XmlRenderingConfiguration() - Constructor for class fmpp.XmlRenderingConfiguration
-
-
Creates new object.
-
-
XPATH_ENGINE_DEFAULT - Static variable in class fmpp.Engine
-
-
Used as the value of the "xmlEngine" engine parameter: Let FreeMarker - choose.
-
-
XPATH_ENGINE_DONT_SET - Static variable in class fmpp.Engine
-
-
Used as the value of the "xmlEngine" engine parameter: keep the current - JVM level setting.
-
-
XPATH_ENGINE_JAXEN - Static variable in class fmpp.Engine
-
-
Used as the value of the "xmlEngine" engine parameter: Force the usage - of Jaxen.
-
-
XPATH_ENGINE_XALAN - Static variable in class fmpp.Engine
-
-
Used as the value of the "xmlEngine" engine parameter: Force the usage - of Xalan.
-
-
-A B C D E F G H I J K L M N O P Q R S T U V W X 
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/index.html b/fmpp/docs/api/index.html deleted file mode 100644 index f00f488..0000000 --- a/fmpp/docs/api/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - -FMPP 0.9.15 API - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/fmpp/docs/api/overview-frame.html b/fmpp/docs/api/overview-frame.html deleted file mode 100644 index 37bcbff..0000000 --- a/fmpp/docs/api/overview-frame.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - -Overview List (FMPP 0.9.15 API) - - - - - - - -

 

- - diff --git a/fmpp/docs/api/overview-summary.html b/fmpp/docs/api/overview-summary.html deleted file mode 100644 index b3157b4..0000000 --- a/fmpp/docs/api/overview-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - -Overview (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
-

FMPP 0.9.15 API

-
-
-
-
FMPP is a general-purpose text file preprocessor tool that uses FreeMarker - templates.
-
-

See: Description

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
fmpp -
The very core, the foundation of FMPP.
-
fmpp.dataloaders -
fmpp.DataLoader implementations.
-
fmpp.localdatabuilders -
fmpp.LocalDataBuilder implementations.
-
fmpp.models -
freemarker.template.TemplateModel implementations.
-
fmpp.progresslisteners -
fmpp.ProgressListener implementations.
-
fmpp.setting -
FMPP settings.
-
fmpp.tdd -
Textual Data Definition related classes.
-
fmpp.tools -
Tools (front-ends) that end-user can use out-of-the-box.
-
fmpp.util -
Collection of more-less FMPP independent utility classes.
-
-
-
- - -

FMPP is a general-purpose text file preprocessor tool that uses FreeMarker - templates. It is especially designed for HTML preprocessor, for the generation - of complete (static) homepages: directory structure that contains HTML-s, - image files, etc. FMPP can pull data from external data sources (database, - XML files, Java property files, etc.) and embed the data into the - generated files. - -

For detailed instructions, read the FMPP Manual. - -

Report bugs and send suggestions to "ddekany at freemail dot hu" - or use the mailing list, forums and trackers on the source forge project page: - http://sourceforge.net/projects/fmpp/. - -

For the latest version, and for more information visit: - http://fmpp.sourceforge.net/.

-
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/overview-tree.html b/fmpp/docs/api/overview-tree.html deleted file mode 100644 index c07e550..0000000 --- a/fmpp/docs/api/overview-tree.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - -Class Hierarchy (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/package-list b/fmpp/docs/api/package-list deleted file mode 100644 index 56747eb..0000000 --- a/fmpp/docs/api/package-list +++ /dev/null @@ -1,9 +0,0 @@ -fmpp -fmpp.dataloaders -fmpp.localdatabuilders -fmpp.models -fmpp.progresslisteners -fmpp.setting -fmpp.tdd -fmpp.tools -fmpp.util diff --git a/fmpp/docs/api/script.js b/fmpp/docs/api/script.js deleted file mode 100644 index c3a1cae..0000000 --- a/fmpp/docs/api/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/fmpp/docs/api/serialized-form.html b/fmpp/docs/api/serialized-form.html deleted file mode 100644 index 8b37ba4..0000000 --- a/fmpp/docs/api/serialized-form.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - - -Serialized Form (FMPP 0.9.15 API) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/fmpp/docs/api/stylesheet.css b/fmpp/docs/api/stylesheet.css deleted file mode 100644 index ad00323..0000000 --- a/fmpp/docs/api/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet - JDK 8 usability fix regexp substitutions applied */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'Courier New', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'Courier New', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'Courier New', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'Courier New', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin: 5px 0 10px 20px; - font-size:14px; - -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; - width:100%; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:Arial, sans-serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/fmpp/docs/basics.html b/fmpp/docs/basics.html deleted file mode 100644 index 1fb6c69..0000000 --- a/fmpp/docs/basics.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - -Basics - FMPP - - - - - - - - - - - - - - - -
-

Basics

- -
-
-

Chapter Contents

- -
- -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/bsh.html b/fmpp/docs/bsh.html deleted file mode 100644 index 9905e74..0000000 --- a/fmpp/docs/bsh.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - -BeanShell language - FMPP - - - - - - - - - - - - - - - -
-

BeanShell language

- -
-
- -

From the BeanShell documentation: "BeanShell is a small, free, embeddable, Java source interpreter with object scripting language features, written in Java. BeanShell executes standard Java statements and expressions but also extends Java into the scripting domain with common scripting language conventions and syntax." So if you know Java programming language, and already used some scripting languages, you will find it quite easy to learn and use. For more information, please visit: http://www.beanshell.org/

- -

In FMPP, BeanShell is used for: -

    -
  • Creating Java objects to be used in setting values. For example when the data setting used together with the eval data loader. -
  • Pre-processing data for individual templates. See the localData setting and its bsh function. -
  • Accessing Java classes and objects from FTL templates, using the pp.loadData directive with the eval data loader. -
- - -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/commandline.html b/fmpp/docs/commandline.html deleted file mode 100644 index 07f28d7..0000000 --- a/fmpp/docs/commandline.html +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - - -The Command-line Tool - FMPP - - - - - - - - - - - - - - - -
-

The Command-line Tool

- -
- -
- - -

Basic usage

- -

FMPP can work in two modes: as a recursive directory processor, or as single file processor.

- -

When you're using it as recursive directory processor, it needs a source root directory and an output root directory. It processes all files inside the source root (including the files in its subdirectories), and writes the processed files into the output root directory with similar path as in the source root (that is, the output of <source-root>/foo/bar.txt will be <output-root>/foo/bar.txt. If /home/me/sample-project/src is the source root and /home/me/sample-project/out is the output root, then you issue:

- -
fmpp -S /home/me/sample-project/src -O /home/me/sample-project/out
- -

It's possible to tell FMPP to process only certain files and/or directories of the source root directory:

- -
fmpp -S /home/me/sample-project/src -O /home/me/sample-project/out index.html foo/bar.txt somedir
- -

Note that these paths are interpreted relatively to the source root directory, not to the current working directory.

- -

When you use FMPP as single file processor, you specify a single input file, and then an output file with the -o option. It's the -o option is what triggers single file mode.

- -
fmpp /home/me/file-to-process.txt -o /home/me/processed-file.txt
- -

In single file mode, the source root and output root directory defaults to the directory of source and output files respectively. (It has significance for example if the source file wants to include another file), but you can override them with the -S and -O switches. The source file and output file path is always interpreted relatively to the current working directory.

- -

It's often more convenient and manageable to use a project configuration file instead of entering everything as command-line arguments. For example, create file config.fmpp with this content:

- -
sourceRoot: src
-outputRoot: out
-logFile: fmpp.log
-modes: [ ignore(tmp/), copy(**/*.dwg, bin/) ]
-data: {
-  contact: me@example.com
-  clients: csv(data/clients.csv)
-}
-

then use it as:

- -
fmpp -C /home/me/sample-project/config.fmpp
- -

or since config.fmpp is the default configuration file name, you can simply issue:

- -
fmpp -C /home/me/sample-project
- -

or if you are in the same directory as config.fmpp then just issue:

- -
fmpp
- -

Note that paths in the configuration file are resolved relatively to the configuration file's directory, so it doesn't mater where do you invoke it from. Also note that you can override the settings stored in the configuration file with the command line:

- -
fmpp -C /home/me/sample-project/config.fmpp -O other/destination
- -

Much of what should be known about FMPP is not specific to its command line interface, so look around in the Table of Contents for more information!

- - - - -

Command-line argument syntax primer

- -

This section is for users who are not too familiar with using the command-line. No FMPP specific information can be found here, so you may skip to the next section.

- -

The exact command-line syntax depends on what shell do you use (sh, csh, DOS shell, etc.), because the shell is responsible to split the command-line to an executable name and a list of arguments. FMPP just gets the list from the shell.

- -

Most shells will parse this command-line:

- -
test -f t 1.txt 2.txt
- -

as the executable name is test, and the list of arguments is:

- -
    -
  1. -f -
  2. t -
  3. 1.txt -
  4. 2.txt -
- -

As you may guess, the arguments are delimited by the spaces. If you want to put spaces into the value of arguments, in most shells you should use quotation marks:

- -
test -f t -D "x:1, y:2"
- -

Here, the list of arguments will be:

- -
    -
  1. -f -
  2. t -
  3. -D -
  4. x:1, y:2 -
- -

The shell has removed the quotation marks. Thus, command-line tools like FMPP will not know that there were quotation marks, as they just gets the above list from the shell.

- -

With shells as sh, you can use apostrophe-quotes (') instead of quotation marks. In Windows/DOS shell you can use quotation marks (") only.

- -

You have to quote the argument if you use characters that are reserved by the shell for other purposes. For example > and | is reserved in most shells. &, ; and ( is reserved in sh. Also, if you use an UN*X shell, sometimes you need to quote arguments that contain *, ? or ~, because otherwise the shell interprets the argument as a path, and replaces that with the list of matching files.

- -

Most shells understand partially quoted arguments. For example:

- -
test -D"x:1, y:2"
- -

will be interpreted as:

- -
    -
  1. -Dx:1, y:2 -
- -

A tricky situation is when you want to use quotation marks in an argument value. To prevent this situations use apostrophe-quotes instead of plain quotes and vice versa. For example:

- -
test -D"x:'red led', y:2"
- -

or (will not work in Windows/DOS shell!):

- -
test -D'x:"red led", y:2'
- - - - -

FMPP command-line argument syntax

- -

The FMPP command-line tool uses similar argument syntax to usual UN*X command-line tools, such as ls. UN*X users should be able to use the tool even without reading this section.

- -

This is a possible FMPP command-line:

- -
fmpp -C mycfg.fmpp -q --case-sensitive products index.html
- -

The FMPP command-line tool interprets command-line arguments as either:

-
    -
  • Option, as -q, --case-sensitive and -C mycfg.fmpp -
  • Non-option, as products and index.html -
- -

An option always starts with dash (-), or with double dash. (--), followed by the name of the option (e.g. q, C, case-sensitive). If the option requires parameter, then it is followed by the parameter to the option (as mycfg.fmpp in -C mycfg.fmpp), which counts as the part of the option, not as non-option.

- -

If the option uses single dash, then the name of the option is exactly 1 character long; this is called short form. If the option uses double dash, then the name can be arbitrary long; this is called long form. All options have long form, and many options have both long and short form versions, which are equivalent (for example -q and --quiet). Short form options can be grouped together, for example you can write
-qxs
instead of
-q -x -s

- -

Some options require a parameter. To demonstrate the syntactical rules with examples, here are the valid ways to give cp852 as parameter to option -E alias --source-encoding:

- -
    -
  • -E cp852: here the parameter was the next argument after the option -
  • -Ecp852: here I have utilized that a short option name is always 1 character long, and thus, since -E require parameter, the rest of this argument will be interpreted as the parameter of the option. (Note, that because if this, grouping (as -qxs) will not work if an option in the group, other than the very last option, requires parameter.) The next argument of the command-line will not be interpreted as parameter to -E. -
  • -E=cp852: This is similar to the latest, but the option name and parameter value is separated with = -
  • --source-encoding cp852 -
  • --source-encoding=cp852 -
- -

I didn't show the combinations like -E="cp852", as the usage of quotation marks is shell dependent. See the section about using the command-line for more information.

- -

The order in which options occur in the command-line argument list is not significant.

- -

Options are case sensitive. This means that -c and -C are not the same.

- -

Any argument that does not start with dash and is not directly after an option that needs parameter, is a non-option. In FMPP, non-options are used to list the name of the files or directories that you want to process; see more about this later. The position of a non-option in the argument list relatively to the options is not significant. That is, these command-line argument lists are equivalent:

- -
    -
  • -C mycfg.fmpp -q products index.html -
  • products index.html -C mycfg.fmpp -q -
  • products -C mycfg.fmpp index.html -q -
- -

Sometimes it happens that a non-option should start with dash (for example, because the name of the file you want to refer to starts with dash). In this case you can use a special character sequence, -- followed by no option name, to indicate that all subsequent arguments are non-options:

- -
fmpp -Cmycfg.fmpp -- -this-is-a-non-option
- - - -

Invoking the command-line tool

- -

The command-line tool can be invoked with the fmpp shell script (<FMPP>/bin/fmpp or <FMPP>/bin/fmpp.bat), assuming you have installed it properly.

- -

When you invoke this tool, it will immediately run a processing session, with the settings you have set with its arguments (see later how), and then terminates. (With some command-line options, however, it will do something else, as with -h it just prints help.)

- - - - -

Specifying settings in the command-line

- -

Most command-line options specify FMPP settings. The option name is the name of the setting, but with lower case dashed form (as source-root) instead of the usual mixed case form (as sourceRoot). The value of the setting is given as the parameter of the option. The configuration base for the values is the current working directory (i.e. the directory you are in).

- -

Example: Runs a processing session with sourceRoot set to src and outputRoot set to out (so this will process all files in the src directory, and store the output in the out directory):

- -
fmpp --source-root src --output-root out
- -

For the most frequently used settings there is short option name too. For example, this is equivalent with the previous example:

- -
fmpp -S src -O out
- -

If the setting value is of scalar type (as string, boolean, number) then just enter the value simply as is, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then you use TDD syntax for it. For hash settings the value is a hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted. For example:

- -
fmpp -S src -O out -D "online:false, tdd(data/style.tdd)" --replaceExtensions "ftl, html"
- -

Note that the quotation marks were needed only for the command-line parser of the shell (see earlier on this page), so they are not visible for FMPP.

- -

Boolean settings (and quiet) are specified with parameterless options:

- - - - - - - - - - - - - - - - - - - - - - - -
Command-line option - Meaning -
Setting name - Value -
-s, --stop-on-error - stopOnError - true -
-c, --continue-on-error - stopOnError - false -
--case-sensitive - caseSensitive - true -
--ignore-case - caseSensitive - false -
--ignore-cvs-files - ignoreCvsFiles - true -
--dont-ignore-cvs-files - ignoreCvsFiles - false -
--ignore-svn-files - ignoreSvnFiles - true -
--dont-ignore-svn-files - ignoreSvnFiles - false -
--ignore-temporary-files - ignoreTemporaryFiles - true -
--dont-ignore-temporary-files - ignoreTemporaryFiles - false -
--print-stack-trace - printStackTrace - true -
--dont-print-stack-trace - printStackTrace - false -
-x, --expert - expert - true -
--not-expert - expert - false -
--append-log-file - appendLogFile - true -
--dont-append-log-file - appendLogFile - false -
-q, --quiet - quiet - true -
-v, --verbose - quiet - false -
-Q, --really-quiet - quiet - reallyQuiet -
- -

Example:

- -
fmpp -S src -O out --dont-ignore-cvs-files -cqx
- -

where the last few options mean: ignoreCvsFiles is false, stopOnError is false, quiet is true, expert is true.

- -

The value of the sources setting can be given as the non-option arguments to the tool. For example, to process only files index.html and directory products of the source root:

- -
fmpp -S src -O out index.html products
- -

Notes for Windows users:

-
    -
  • In paths you can optionally use slash (/) instead of backslash (\) anywhere.
  • -
  • You can't use * and ? in paths (except in settings that explicitly want path patterns, e.g. modes)
  • -
- - - - -

Using configuration files

- -

With option --configuration or -C you can load a configuration file. As you may know it from the chapter about configuration files, it is enough to give the directory of the configuration file, if the file uses one of the standard names. Example:

- -
fmpp -C works/project1
- -

If you don't use option --configuration/-C, fmpp will look for a configuration file in the current working directory, and if it finds one with standard name, it will load that automatically. To prevent this, use --configuration/-C with none parameter (as -C none).

- - -

Settings loaded from the configuration file have lower priority than settings given as command-line arguments. For example, here you add an extra variable to the data specified in the configuration file, or if variable online was already created there then replace its value:

- -
fmpp -C works/project1 -D online:true
- -

Options configurationBase and inheritConfiguration can be used to emulate that settings configurationBase and inheritConfiguration are present with the given value in the configuration file.

- - - - -

Global options

- -

The default of some settings that can't influence the output files can be set in a configuration file called .fmpprc. This file is searched in these directories, in this order:

-
    -
  1. In your home directory.
  2. -
  3. On Windows, in the directory pointed by the HOME environment variable.
  4. -
  5. In the directory pointed by the FMPP_HOME environment variable. This is usually automatically set to the directory where you have installed FMPP.
  6. -
- -

Only the first .fmpprc found will be loaded.

- -

The settings you can set in the .fmpprc are:

- - - - - -

Supported front-end dependent settings

- -

All logging related settings are supported.

- -

All recommended echoFormat-s are supported, but verbose is the same as normal. It depends on the terminal implementation you use, but terse echo format can substantially speed up the processing session if you have many files.

- -

All quiet values are supported.

- - - - -

List of all options

- -

The complete list of command-line options with brief description is included further below in the output of fmpp -h. -Almost all options correspond to FMPP settings; see the complete descriptions of FMPP settings here.

- -
-Typical usages:
-   fmpp -C configfile
-   fmpp -S sourcedir -O outputdir
-   fmpp sourcefile -o outputfile
-For more examples: http://fmpp.sourceforge.net/commandline.html
-
-Options:
-  -A, --locale=<LOC>             The locale (as ar_SA). Use the special value "host" (-A host) if the default
-                                   locale of the host machine should be used. The default value of the option
-                                   is en_US.
-      --always-create-directories Create output subdirectory even if it will remain empty. Defaults to false.
-      --append-log-file          If the log file already exists, it will be continuted, instead of restarting
-                                   it.
-      --boolean-format=<FORMAT>  The boolean format used to show boolean values, like "Yes,No". Not
-                                   "true,false"; use ${myBool?c} for that. The default is error on ${myBool}.
-      --borders=<SEQ>            The list of TDD function calls that choose header and footer for templates,
-                                   e.g.:
-                                   -M 'border("<#escape x as x?html>", "</#escape>", *.htm, *.html),
-                                   header("<#include \"/css.ftl\">", *.css)'
-  -c, --continue-on-error        Skip to the next file on failed file processing (and log the error: see -L)
-  -C, --configuration=<FILE>     Load settings from a configuration file. Settings given with command-line
-                                   options have higher priority (note that some settings are merged, rather
-                                   than overridden). Be default fmpp will use ./config.fmpp or ./fmpp.cfg if
-                                   that exists. Use value "none" (-C none) to prevent this.
-      --case-sensitive           Upper- and lower-case letters are considered as different characters when
-                                   comparing or matching paths.
-      --columns=<COLS>           The number of columns on the console screen. Use when auto-detection gives
-                                   bad result.
-      --configuration-base=<DIR> The directory used as base to resolve relative paths in the configuration
-                                   file. It defaults to the directory of the configuration file.
-  -D, --data=<TDD>               Creates shared data that all template will see. <TDD> is the Textual Data
-                                   Definition, e.g.:
-                                   -D "properties(style.properties), onLine:true"
-                                   Note that paths like "style.properties" are relatve to the data root
-                                   directory.
-      --data-root=<DIR>          Sets the root directory of data files. The reserved value "source" means
-                                   that the data root is the same as the source root. The default value is
-                                   "source".
-      --date-format=<FORMAT>     The format used to show date (year+month+day) values. The default is locale
-                                   dependent.
-      --datetime-format=<FORMAT> The format used to show date-time values. The default is locale dependent.
-      --dont-append-log-file     If the log file already exists, it will be restarted. This is the default.
-      --dont-ignore-cvs-files    Don't ignore CVS files in the source root directory.
-      --dont-ignore-svn-files    Don't ignore SVN files in the source root directory.
-      --dont-ignore-temporary-files Don't ignore well-known temporary files in the source root directory.
-      --dont-print-stack-trace   Don't print stack trace on error, just cause chain. This is the default.
-      --dont-snip                Deprecated; alias of printStackTrace.
-      --dont-validate-xml        Sets that XML files will not be validated by default. This is the default.
-  -E, --source-encoding=<ENC>    The encoding of textual sources (templates). Use the special value "host"
-                                   (-E host) if the default encoding of the host machine should be used. The
-                                   default is "ISO-8859-1".
-  -F, --echo-format=<FORMAT>     The format used for displaying the progress. <FORMAT> is n[ormal], t[erse]
-                                   or q[uiet] (or v[erbose], which is the same as normal). The default is
-                                   normal.
-      --freemarker-incompatible-improvements=<VER> Enables the FreeMarker fixes/improvements that are not
-                                   100% backward compatible, and were implemented in FreeMarker version
-                                   <VER>. In older projects using the highest available 2.3.x is usually a
-                                   good compromise. New projects should use the maximum, which is currently
-                                   "2.3.21". The default is "2.3.0".
-      --freemarker-links=<MAP>   The map of FreeMarker links (external includes).
-  -h, --help                     Prints help on options.
-      --ignore-case              Upper- and lower-case letters are considered as the same characters when
-                                   comparing or matching paths. This is the default.
-      --ignore-cvs-files         Ignore CVS files in the source root directory. This is the default.
-      --ignore-svn-files         Ignore SVN files in the source root directory. This is the default.
-      --ignore-temporary-files   Ignore well-known temporary files (e.g. **/?*~) in the source root
-                                   directory. This is the default.
-      --inherit-configuration=<FILE> Inherits options from a configuration file. The options in the primary
-                                   configuration file (-C) has higher precednece.
-  -L, --log-file=<FILE>          Sets the log file. Use "none" (-L none) to disable logging. The default is
-                                   "none".
-      --local-data=<SEQ>         Creates data that is visible only for certain templates. This is a list of
-                                   case(...) and layer() function calls.
-      --long-help                Deprecated; same as -h
-  -M, --modes=<SEQ>              The list of TDD function calls that choose the file processing mode, e.g.:
-                                   -M "ignore(**/tmp/), execute(**/*.htm, **/*.html), copy(**/*)"
-      --not-expert               Disables expert mode. This is the default.
-      --number-format=<FORMAT>   The number format used to show numerical values. The default is
-                                   0.############
-  -o, --output-file=<FILE>       The output file. This switches FMPP to single-file mode.
-  -O, --output-root=<DIR>        Sets the root directory of output files.
-      --object-wrapper=<BSH>     Specifies the ObjectWrapper to use with a BeanShell expression that must
-                                   evaluate to an object that extends BeansWrapper. The default value is a
-                                   BeansWrapper instance with simpleMapWrapper set to true.
-      --output-encoding=<ENC>    The encoding of template output. Use the special value "source" if the
-                                   encoding of the template file should be used. Use the special value "host"
-                                   if the default encoding of the host machine should be used. The default is
-                                   "source".
-      --print-locales            Prints the locale codes that Java platform knows.
-      --print-stack-trace        Print stack trace on error.
-  -q, --quiet                    Don't write to the stdout, unless the command-line arguments are wrong.
-                                   Print warning and error messages to the stderr.
-  -Q, --really-quiet             As -q, but doesn't even write to the stderr.
-  -R, --remove-extensions=<SEQ>  These extensions will be removed from the output file name. <SEQ> contains
-                                   the extensions without the dot.
-      --remove-postfixes=<SEQ>   If the source file name without the extension ends with a string in the
-                                   <SEQ>, then that string will be removed from the output file name.
-      --replace-extensions=<SEQ> Replaces the extensions with another exensions. The list contains the old
-                                   and new extensions alternately; old1, new1, old2, new2, etc. The
-                                   extensions in the <SEQ> do not contain the dot.
-  -s, --stop-on-error            Terminate fmpp on failed file processing. This is the default behaviour. Use
-                                   -c to override this.
-  -S, --source-root=<DIR>        Sets the root directory of source files. In bulk-mode it defaults to the
-                                   current working directory.
-      --snip                     Deprecated; alias of dont-printStackTrace.
-      --sql-date-and-time-time-zone=<ZONE> Sets a different time zone for java.sql.Date and java.sql.Time
-                                   only.
-      --tag-syntax=<WHAT>        Sets the tag syntax for templates that doesn't start with the ftl directive.
-                                   Possible values are: angleBracket, squareBracket, autoDetect. The default
-                                   depends on the FreeMarker version. The recommended value is autoDetect.
-      --time-format=<FORMAT>     The format used to show time values. The default is locale dependent.
-      --time-zone=<ZONE>         Sets the time zone in which date/time/date-time values are shown. The
-                                   default is the time zone of the host machine. Example: GMT+02
-      --turns=<SEQ>              The list of turn(...)-s that choose the turns of processings, e.g.:
-                                   --turns "turn(2, **/*_t2.*, ), turn(3, **/*_t3.*, **/*.toc)"
-                                   By default all files will be procesed in the first turn.
-  -U, --skip-unchanged=<WHAT>    Skip <WHAT> files if the source was not modified after the output file was
-                                   last modified. <WHAT> can be "all", "none" or "static"
-      --url-escaping-charset=<ENC> The charset used for URL escaping. Use the special value "output" if the
-                                   encoding of the output file should be used. The default is "output".
-  -v, --verbose                  The opposite of -Q: prints everything to the stdout. This is the default.
-      --validate-xml             Sets that XML files will be validated by default.
-      --version                  Prints version information.
-  -x, --expert                   Expert mode.
-      --xml-catalog-files=<SEQ>  Sets the catalog files used for XML entity resolution. Catalog based
-                                   resolution is enabled if and only if this settings is specified.
-      --xml-catalog-prefer=<WHAT> Sets if catalog file based XML entity resolution prefers public or system
-                                   identifiers. Valid values are: public, system, globalDefault. Defaults to
-                                   public.
-      --xml-renderings=<SEQ>     Sets the sequence of XML renderings. Each item is hash, that stores the
-                                   options of an XML rendering configuration.
-      --xpath-engine=<NAME>      Sets the XPath engine to be used. Legal values are: dontSet, default, jaxen,
-                                   xalan, and any adapter class name.
-
-Most options above directly correspond to FMPP settings. See their full descriptions here:
-http://fmpp.sourceforge.net/settings.html
-
-
-
-
- - - -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/configfile.html b/fmpp/docs/configfile.html deleted file mode 100644 index e90ef66..0000000 --- a/fmpp/docs/configfile.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - -Configuration Files - FMPP - - - - - - - - - - - - - - - -
-

Configuration Files

- -
- -
- - -

Basics

- -

Configuration files are text files that store setting values. They can use two syntaxes (two formats):

-
    -
  • TDD: This is the preferred format.
  • -
  • Java "Properties": This is mostly supported for backward compatibility with the FMPP 0.8.X series.
  • -
- -

The syntax that a configuration file uses is detected with the file extension. For "properties" configuration files, the file extension must be cfg or properties. For TDD files, the preferred file extension is fmpp, but it can be anything but cfg and properties.

- -

When you want to load a configuration file, you specify the path of the file for the front-end somehow (read the documentation of the front-end). But if the configuration file name is one of these standard names:

-
    -
  • config.fmpp
  • -
  • fmpp.cfg
  • -
- -

then it is enough to give the path of the directory that contains the configuration file. (config.fmpp has higher priority if both file is present.)

- - - - -

The configuration base

- -

The configuration base is the directory used as base for resolving relative real paths in setting values. Be default, the configuration base is the directory that contains the configuration file. For example, if /home/me/project1/config.fmpp contains sourceRoot: src, then the sourceRoot will be /home/me/project1/src.

- -

The configuration base can be changed with the configurationBase meta setting. For example, if in the previous example config.fmpp contains configurationBase: ../project2, then the sourceRoot will be /home/me/project2/src. The configurationBase setting applies only for the setting values specified in the same file it is stored in.

- -

Not all relative paths in settings are resolved relatively to the configurationBase. Relative virtual paths, for example, are relative to the sourceRoot or outputRoot. Relative paths of data files passed to data loaders are relative to the dataRoot.

- -

If the setting value comes not from a configuration file (such as from a command-line argument), then the front-end specifies what the configuration base is for that setting value (see the documentation of the front-end).

- - - - -

Configuration inheritance

- -

A configuration file can inherit setting values from another configuration file, with the inheritConfiguration meta setting. When the FMPP core loads a configuration file, and it finds inheritConfiguration setting in it, it will automatically load that configuration file too, and then merge its settings with the settings loaded from the inheriting (the first) configuration file. The settings stored in the inheriting configuration file have higher priority than the settings stored in the inherited configuration file. Thus, if both file contains the same setting, then the value stored in the inheriting file will be used, or it will be merged with the other value if the setting supports merging.

- -

The above description is applicable recursively. That is, an inherited configuration file can inherit another configuration file, and that can inherit yet another configuration file, and so on.

- -

Meta settings (as inheritConfiguration and configurationBase) are never inherited. They influence only the file where they are actually present.

- -

A possible usage of configuration inheritance is to customize a common configuration file. See: <FMPP>/docs/examples/inherit_config.

- - - - -

Configuration files with TDD syntax

- -

These files start in TDD hash mode. For example:

- -
sourceRoot: src
-outputRoot: out
-data: {tdd(data/style.tdd), birds:csv(data/birds.csv)}
-removeExtensions: [ftl, t2]
-datetimeFormat: "MMM d, yyyy hh:mm a zzz"
-caseSensitive
-

According the TDD syntax, values of type sequence (as removeExtensions) was put into square brackets. However, for sequence settings, if the sequence would contain exactly 1 element, then you can just give that element directly:

- -
removeExtensions: ftl
-

and the value will be automatically converted to a sequence that contains the a single string ftl, as it is known that removeExtensions must be a sequence. This is a feature of the setting handling mechanism, not TDD, so don't try to use this trick elsewhere.

- -

TDD configuration files always use ISO-8859-1 encoding, if there is no other encoding suggested in the file with TDD's encoding comment.

- -

For more information about TDD, please read the chapter about TDD.

- - - - -

Configuration files with "properties" syntax

- -

Attention: "properties" configuration files must use cfg or properties file extension.

- -

This is the previous example configuration file with "properties" format:

- -
sourceRoot = src
-outputRoot = out
-data = tdd(data/style.tdd), birds:csv(data/birds.csv)
-removeExtensions = ftl, t2
-datetimeFormat = MMM d, yyyy hh:mm a zzz
-caseSensitive
-

The differences to TDD configuration files are:

-
    -
  • It uses "properties" syntax...
  • -
  • The values do not use TDD syntax, except for composite types as hashes and sequences. For example, the value of datetimeFormat is not quoted (in TDD it was, as the string contains spaces and coma), it is just entered directly.
  • -
  • The { and } for the data hash and the [ and ] for the removeExtensions sequence is omitted. This is because the value of a hash setting is parsed as hash mode TDD, and the value of a sequence setting is parsed as sequence mode TDD, so the brackets are implied.
  • -
  • For boolean settings, empty-string is considered as true (see the line that sets caseSensitive).
  • -
  • Setting names can be written with lower case dashed form (as output-root) instead of mixed case (as outputRoot). This is for backward compatibility with FMPP 0.8.X, where configuration files were use to store options to the command-line tool. The two forms can be used mixed in the same configuration file.
  • -
- -

Otherwise "properties" configuration files work in the same way as TDD configuration files. For example, they can inherit an other configuration file. It is not a problem if a "properties" configuration file inherits TDD configuration file or the opposite.

- - - -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/dataloader.html b/fmpp/docs/dataloader.html deleted file mode 100644 index a8a6f5d..0000000 --- a/fmpp/docs/dataloader.html +++ /dev/null @@ -1,769 +0,0 @@ - - - - - - - -Data Loaders - FMPP - - - - - - - - - - - - - - - -
-

Data Loaders

- -
-
-

Page contents

- -
-

Alphabetical index of keys:

- -
-
- - -

Introduction

- -

Data loaders are Java objects that load data from certain type of data source, such as a CSV file or MySQL data-base, and expose the data as variables for the templates. For example, a data loader was invoked in the Quick Tour when you have written csv(data/birds.csv).

- -

Data loaders are typically invoked: -

    -
  • ... by TDD functions used in the data setting -
  • ... by TDD functions used in the localData setting -
  • ... by the pp.loadData method used in FreeMarker templates -
- - - - -

Predefined data loaders

- -

Data loaders that load data directly from files will want you to give the path of the file as parameter. There you have to give real path. If you give a relative path, then it will be interpreted relatively to the dataRoot, which defaults to the sourceRoot if you didn't specified it. The data files can be outside the dataRoot directory; it is used only as a base directory.

- -

Note: I have not written a database/SQL/JDBC data loader yet... Of coruse, you can write a such data loader yourself. Contributions are welcome!

- - - -

csv

- Parameters: -
    -
  1. path: string. - The path of the CSV file. -
  2. options: hash, optional. - The list of valid options: -
      -
    • separator: The character that separates the columns. Defaults to ";". It can be any character. It also understands the string "tab", which means that the separtor character will be the tab character.
    • - -
    • encoding: The charset used for reading CSV file. Defaults to the value of the sourceEncoding setting.
    • - -
    • trimCells: Specifies if all cells will be trimmed (boolean). Trimming means the removal of all leading and trailing white-space. Defaults to no trimming (in which case only header cells are trimmed). For tables directly entered by humans (like in Excel) it is strongly recommended to turn this on. - -
    • decimalSeparator: Alternative character used for the decimal dot in the CSV files. The dot will be always assumed as decimal separator, except if groupingSeparator is set to dot. Note that this option has significance only if you use :n (or :number) in the headers, so the data loader has to interpret the text as numbers.
    • - -
    • groupingSeparator: The character used for grouping symbol in the CSV file (as the coma in $20,000,000). Be default, grouping is not allowed. Note that this option has significance only if you use :n (or :number) in the headers.
    • - -
    • altTrue: Alternative word interpreted as boolean true. Note that this option has significance only if you use :b (or :boolean) in the headers, so the data loader has to parse the text as booleans.
    • - -
    • altFalse: Alternative word interpreted as boolean false. Note that this option has significance only if you use :b (or :boolean) in the headers.
    • - -
    • emptyValue: A string or a sequence of strings which define the values that are equal to an empty cell. For example, if this is ["-", "N/A"], then cells whose content is a minus sign or N/A will look like they were left empty. The comparison is case-sensitive. The header row is not affected by this option. - -
    • dateFormat: The pattern used for parsing date-only values. Note that this option has significance only if you use :d (or :date) in the headers.
    • - -
    • timeFormat: The pattern used for parsing time-only values. Note that this option has significance only if you use :t (or :time) in the headers.
    • - -
    • dateTimeFormat: The pattern used for parsing date-time values. Note that this option has significance only if you use :dt (or :dateTime) in the headers.
    • - -
    • normalizeHeaders: Specifies if the header names coming from the file will be normalized - or should be left as is (boolean). Normalization means: -
        -
      1. Remove the part between the first "(" and last - ")", before the header is parsed for column type - identifier (like ":n"; column type identifiers are discussed somewhere later). -
      2. After the type identifier was extracted and removed, the cell value is trimmed. (Note that this happens even if this option is off.) -
      3. Then it's converted to lower case. -
      4. Then the following characters are replaced with "_": - space, comma, semicolon, colon.
      5. Then all "__" - and "___" and so on is replaced with a single - "_". -
      - For example, "Price, old (category: A, B, F): n" will be normailzed to "price_old", and the column type identifier will be n. -
    • - -
    • headers: Use this if the CSV file has no header row, that is, if the first row doesn't store column names. The option value must be a sequence of strings. Each item in the sequence corresponds to a cell value of the imaginary (actually missing) header row, and will be parsed on the same way as a real header row would be.
    • - -
    • replaceHeaders: Use this if the CSV file does have a header row, but you don't like/trust the content of it. The rules are the same as with the header option, except of course that it replaces the existing header row.
    • -
    - -
- - -

Examples (with TDD syntax):

-
    -
  • csv(data/foo.txt) -
  • csv(data/foo.txt, {separator:tab, encoding:UTF-8}) -
  • csv(data/foo.txt, {separator:',', encoding:ISO-8859-2, headers:[name, size:n, lastModified:dt]}) -
- -

The csv data loader parses CSV (Column Separated Values) file, or other file of similar formats (as tab divided text, comma separated values), and returns it as a sequence. The sequence is the list of the table rows, and each row is a hash, where you can access the cells with the column name. The column names (headers) are stored in the first row of the CSV file (unless you use the headers option), so this row is not part of the result sequence.

- -

For example, if this is the CSV file:

- -
name;color;price
-rose;red;10
-rose;yellow;15
-tulip;white;6
-

and you load it into the variable flowers, then you can print it as:

- -
<table border=1>
-<#list flowers as flower>
-  <tr><td>${flower.name}<td>${flower.color}<td>${flower.price}
-</#list>
-</table>
-

and the output will be:

- -
<table border=1>
-  <tr><td>rose<td>red<td>10
-  <tr><td>rose<td>yellow<td>15
-  <tr><td>tulip<td>white<td>6
-</table>
-

The rows are not only hashes, but also sequences, so instead of the column name you can use the 0 based column index. Thus the above template could be written like this as well, just it is less readable:

- -
<table border=1>
-<#list flowers as flower>
-  <tr><td>${flower[0]}<td>${flower[1]}<td>${flower[2]}
-</#list>
-</table>
-

and actually then it would be simpler to write:

- -
<table border=1>
-<#list flowers as flower>
-  <tr><#list flower as cell><td>${cell}</#list>
-</#list>
-</table>
-

The values (cells) in the CSV file will be always exposed as string variables, unless you specify a different type in the header cells directly. To specify the type, type a colon after the column name, and a type identifier. The type identifier can be: n (or number) or b (or boolean) or d (or date) or t (or time) or dt (or dateTime) or s (or string). For example, if you want to expose the price column as number, and not as string (so you can do arithmetic with it, or use the number formatting facilities), then the CSV file would be:

- -
name;color;price:n
-rose;red;10
-rose;yellow;15
-tulip;white;6
-

Numerical values must use dot (.) as decimal separator, and no grouping, unless you change these with the decimalSeparator and/or groupingSeparator options.

- -

Boolean values must be one of true, yes, y, 1, false, no, n, 0, or the words defined be the altTrue and altFalse options. Upper- and lower-case letters are not distinguished.

- -

Date, time and date-time values use common SQL format with optional time zone, as "2003-06-25", "22:30:08", "2003-06-25 10:30:08 PM", "2003-06-25 10:30:08 PM GMT+02:00". But if you use option dateFormat, timeFormat, or datetimeFormat, then that format has to be used for dates, times, and date-times respectively. If the time zone is not given in a value, the value of the timeZone setting is used.

- -

The variable returned by the csv data loader is not only a sequence, but also a hash at the same time, that contains one key: headers. This is a sequence that stores the column names.

- -
<#list flowers.headers as h>
-- ${h}
-</#list>
-

will print:

- -
- name
-- color
-- price
-

Note that only the name of the column is returned, not the type identifier stuff (as :n).

- - - - - -

json

- Parameters: -
    -
  1. path: string. - The path of the JSON file. -
  2. charset: string, optional. - The charset used for reading the JSON file. Defaults to the sourceEncoding setting. -
- - - -

Examples (with TDD syntax):

-
    -
  • json(data/foo.json) -
  • json(data/foo.json, UTF-8) -
- -

This data loader parses a JSON file. The JSON file must contain a single top-level JSON value of any type, like a JSON array, or a JSON object, or a JSON string, etc. Example file content (this contains a JSON array on the top-level):

- -
[
-  {
-    "name": "Jean Test",
-    "maidenName": "Jean Test",
-    "age": 20,
-    "skills": [ "HTML", "CSS" ],
-    "testResults": { "a": 10.5, "b": 20, "c": 30 },
-    "decided": true
-  },
-  {
-    "name": "José Test",
-    "maidenName": null,
-    "age": 30,
-    "skills": [ "Ruby", "C++", "Cuda" ],
-    "testResults": { "a": 20, "b": 30, "c": 40 },
-    "decided": false
-  }
-]
-

Assuming you have loaded the above JSON into the applicants variable, you could print the name and age of all applicants, and print their skills in nested listing like this:

- -
<#list applicants as applicant>
-  ${applicant.name} (age: ${applicant.age})
-  <#list applicant.skills as skill>
-    - ${skill}
-  </#list>
-</#list>
-

That is, JSON arrays will be FTL (FreeMarker Template Language) sequences, JSON objects will be FTL hashes, JSON strings will be FTL strings, JSON numbers will be FTL numbers, JSON boolean will be FTL boolean. JSON null-s will be FTL undefined variables (Java null-s), so for applicants[1].maindenName FreeMarker would give an undefined variable error, and you need to write something like applicants[1].maindenName!'N/A' instead.

- -

The loaded JSON will also act as an FTL node tree (and advanced FreeMarker feature), similarly to an XML. This means, among others, that you can get the parent of a value. The parent of a value is its containing array or object:

- -
<#-- We just pick some skill for the example below: -->
-<#assign skill = applicants[0].skills[0]>
-<#-- Now let's say we only have the skill variable, and we don't know
-     how was it get. We can still get whose skill it was: -->
-${skill} is the skill of ${skill?parent?parent.name},
-<#-- skill?parent is the array, the parent of that is the JSON object -->
-

More details about the node nature:

-
    -
  • The ?node_type of a value will be the name of the JSON type, like "string", "array", "object", etc.
  • -
  • If a value is the right-side of a key-value pair in a JSON object, its ?node_name will be the value of the key (like "name", "age", etc.). Otherwise, it will be "unnamed" + capital node type, like "unnamedString".
  • -
  • When traversing the tree with <#visit ...>/<#recurse>, or using ?children, JSON null-s will appear as existing nodes with ?node_type "null" and no FTL type other than node (thus they are unprintable, uncomparable, unlistable, etc.).
  • -
- -

See the FreeMarker Manual for more about nodes and the related directives and built-ins!

- - - - - - -

text

- Parameters: -
    -
  1. path: string. - The path of the text file. -
  2. charset: string, optional. - The charset used for reading text file. Defaults to the sourceEncoding setting. -
- - - -

Examples (with TDD syntax):

-
    -
  • text(C:/autoexec.bat) -
  • text(C:/autoexec.bat, CP850) -
- -

This data loader loads a plain text file, and returns that as a string.

- - - - -

slicedText

- Parameters: -
    -
  1. path: string. - The path of the text file. -
  2. options: hash, optional. - The list of valid options: -
      -
    • separator: The string that slices the text file into items, that is, the string between two adjoining items. It defaults to "\n", so each line of the text will be an item. Examples: If you want the items to be separated with empty lines, then you should write "\n\n" (this is what is between two items if you imagine it). Of course in this case the items can contain single line-breaks (but not multiple consequent line breaks), not like in the default case. If you want to separate the items with a "---" that is considered as separator only if it's alone in a line (not in the middle of a line) then the separator should be "\n---\n". If you simply want to separate the items with semicolon then the separator should be ";" (in this case you certainly want to use the trim option described below). There is some "magic" involved in the handling of line-breaks: 1.: no mater if you are using UN*X, DOS/Windows or Mac line-breaks in the separator option and in the text file, they will be considered to be equal, 2.: when the text file is searched for a multi-line separator string, those evil invisible extra spaces and tabs at the end of the lines will be tolerated.
    • -
    • trim: If it's true, then each item will be trimmed individually, that is, the leading and trailing white space will be removed from them. Defaults to false.
    • -
    • dropEmptyLastItem: If it's true then the last item will be removed from the result if it's a 0 length string (after trimming, if the trim option is true). Defaults to true, so if the text file ends with a separator or the text file is empty, you will not get a needless empty item.
    • -
    • encoding: The charset used for reading text file. Defaults to the value of the sourceEncoding setting.
    • -
    - -
- - -

Examples (with TDD syntax):

-
    -
  • slicedText(data/foo.txt)
  • -
  • slicedText(data/foo.txt, {separator:\n---\n, encoding:UTF-8})
  • -
  • slicedText(data/foo.txt, {separator:';', trim})
  • -
- -

This data loader loads a text file and slices it to items (strings) by cutting out all occurences of the separator string specified with the separator option. The result is a sequence of strings.

- -

For example, if this is the data/stuff.txt file:

-
This is the first item.
-
-Still the first item...
-
---8<--
-
-The items are separated with this:
---8<--
-just don't forget to surround it with
-empty lines.
-
---8<--
-
-This is the last item.
-

and it's loaded in the configuration file like: - -

data: {
-    stuff: slicedText(data/stuff.txt, {separator:"\n\n--8<--\n\n"})
-}
-

then the output of this template file

- -
<#escape x as x?html>
-
-<#list stuff as i>
-<pre>
-${i}
-</pre>
-</#list>
-
-</#escape>
-

will be this:

- -
-<pre>
-This is the first item.
-
-Still the first item...
-</pre>
-<pre>
-The items are separated with this:
---8&lt;--
-just don't forget to surround it with
-empty lines.
-</pre>
-<pre>
-This is the last item.
-</pre>
-
-

Note the double \n-s in the separator that causes the data loader to treat "–8<--" as separator only if it is surrounded with empty lines.

- - - - - -

tdd

- Parameters: -
    -
  1. path: string. - The path of the TDD file. -
  2. charset: string, optional. - The charset used for reading TDD file. Defaults to the sourceEncoding setting. -
- - - -

Examples (with TDD syntax):

-
    -
  • tdd(data/foo.tdd) -
  • tdd(data/foo.tdd, ISO-8859-5) -
- -

This data loader parses a TDD file. The loaded TDD is interpreted in hash mode, and TDD functions will invoke data loaders, exactly like with the data setting.

- -

See <FMPP>/docs/examples/tdd for a concrete example.

- - - - - -

tddSequence

- Parameters: -
    -
  1. path: string. - The path of the TDD file. -
  2. charset: string, optional. - The charset used for reading TDD file. Defaults to the sourceEncoding setting. -
- - - -

This is like the tdd dataloader, except that it interprets the file as a TDD sequence (TDD "sequence mode"), rather than as a TDD hash. So the result will be a sequence (a list), not a hash.

- - - - -

properties

- Parameters: -
    -
  1. path: string. - The path of the "properties" file. -
- - -

Loads a "properties" file. The result is a hash.

- - - - - -

xml

- Parameters: -
    -
  1. path: string. - The path of the XML file. -
  2. options: hash, optional. - Options. See later... -
- - - -

Note: Sometimes XML files are rather source files (as the HTML-s and the JPG in the Quick Tour) than data files (as data/birds.tdd in the Quick Tour), just you need to invoke a template to render them to their final form (e.g. to HTML pages). If this is the case, you should use renderXml processing mode (see here...), not XML data loader. An example that uses this approach is <FMPP>/docs/examples/xml_rendering.

- -

Loads an XML file. This uses the built-in XML wrapper of FreeMarker 2.3 and later; please read FreeMarker Manual/XML Processing Guide for more information about the usage of the returned variable.

- -

Notes:

-
    -
  • Comment nodes will be removed by default (see option removeComments below). -
  • Processing instruction well be keep by default (see option removePIs below). -
  • CDATA sections count as plain text nodes. -
  • There are no adjacent text nodes in the node tree; adjacent text nodes will be joined. -
- -

The example <FMPP>/docs/examples/xml_try is a good tool to understand this data loader and its options.

- -

Options:

-
    -
  • removeComments: Optional, defaults to true: Specifies if XML comment nodes will be removed from the node tree. - -
  • removePIs: Optional, defaults to false: Specifies if XML processing instruction nodes will be removed from the node tree. - -
  • validate: Optional, defaults to the value of the validateXml setting: Specifies if the XML file should be validated (checked agains the DTD). If it's true, and the XML is not valid, then the data loading fails. - -
  • namespaceAware: Optional, defaults to true: Specifies if the XML parsing should be XML name-space aware or not. If the parsing is not name-space aware, colons in element and attribute names will not be considered as name-space prefix delimiters, so the "local name" of the node will contain the colon and the name-space prefix before that. - -
  • xincludeAware: Optional, defaults to false: Basically, it specifies whether the XML parsing should replace the XInclude-s with the included content. For most practical purposes you should set it to true (but due to backward-compatibility issues it defaults to false). Note that for setting this successfully to true you need at least Java 5. - -
  • xmlns: Optional. This is a hash that maps prefixes to XML name-space URI-s. The prefixes can be used in the other options. This option has no impact outside the XML data loader invocation, so the prefixes will not be available in the templates. The XML name-space for prefixless elements (with other words, the default name-space) is "no name-space" initially, but it can be changed by assigning name-space URI to the reserved prefix D (similar as if you use xmlns="..." in an XML document). - -
  • index: Adds attributes to element nodes, that can be helpful when later you process the XML with the templates. We say on this, that you index the elements. Well, it's hard to explain... :) Look at the output of example <FMPP>/docs/examples/xml_try; the id attributes were added by this option, they are not present in the XML file. Also you can easily try other aspects of indexing with that example. The value of this option is a hash that contains the indexing options, or a sequence of hashes if you want to do more indexing successively. The hash accepts these subvariables (sub-options): - -
      -
    • element: Required. The name of the XML element or elements to index. If this is a string, then it selects a single element only. If this is a sequence, then it must be the sequence of element names that it selects. To use name-space prefixes, see option xmlns. - -
    • attribute: Optional, defaults to id. This is the name of the XML attribute that will be added to the indexed elements (the indexed elements are the elements selected by the sub-option element). If the element has this attribute already, then the original value of the attribute will be kept. To use name-space prefixes, see option xmlns. - -
    • numbering: Optional, defaults to sequential: The rule for the numbering of the indexed elements. The number is used in the attribute values; see option value. This must be one of the following strings: -
        -
      • sequential: The number for the first indexed element is 1, for the second indexed element is 2, etc. The element numbering is done in the "document order", that is, in the order in which the first character of the XML representation of each node occurs (after expansion of general entities). -
      • hierarchical: Similar to sequential numbering, but, for example, if we have an indexed element that got number 2, then indexed elements nested into this element will get numbers 2_1, 2_2, 2_3, etc. The indexed elements that are nested into the element numbered as 2_1, will get numbers 2_1_1, 2_1_2, 2_1_3, etc. For example, look at the output file names in <FMPP>/docs/examples/xml_rendering; they are generated with the hierarchical indexing of the part and chapter elements. Or use <FMPP>/docs/examples/xml_try to try it. -
      - -
    • value: Optional, defaults to 'ppi_%n': A string that describes the format of index values. All character will go directly into the value, except that % is used for place holders. The valid place holders are: -
        -
      • '%n': This will be replaced with the value generated based on the value of option numbering. -
      • '%e': This will be replaced with the name (local, prefixless name) of the element -
      • '%%': This will be replaced with a single %. -
      -
    -
- - - - - -

eval

- Parameters: -
    -
  1. expression: string. - Expression in BeansShell language. -
  2. variables: hash, optional. - Values that will be visible for the expression as variables. -
- - - -

Evaluates a BeanShell expression, or runs a more complex BeanShell script and uses its return-ed value.

-

You can use the predefined variable engine to access the current FMPP engine instance.

- -

Examples (with TDD syntax):

-
    -
  • eval('System.getProperties()') -
  • eval('fmpp.Engine.getVersionNumber()') -
  • eval('
    -     f = engine.getSourceRoot().getParentFile();
    -     if (f == null) {
    -         return new String[]{};
    -     } else {
    -         return f.list();
    -     }
    - ')
    -
  • In a configuration file:
    - width: 100 -
    height: 50 -
    area: eval('a * b', {a:get(width), b:get(height)})
    -
- - - - - -

htmlUtils

- Parameters: - none
-

The returned hash contains custom directives that help HTML template development.

- -

Currently it contains only 1 directive: img. This is used as HTML img element, but the width and height attributes are calculated automatically (unless these attributes are specified in the template). Also, the processing will stop with error, if the image file pointed by the src attribute is missing.

- -

Example: If you have loaded the hash into the html variable, then you can do this in a template:

- -
<@html.img src="falcon.png" alt="Falcon" />
-

and the output will be something like this (depending on the concrete dimensions of the image):

- -
<img src="falcon.png" alt="Falcon" width="80" height="120">
-

See also the example in <FMPP>/docs/examples/img_dims.

- -

Directive img accepts any extra parameters (attributes). The extra parameters will be printed as the attributes of the HTML img element. - - - - - - -

xhtmlUtils

- Parameters: - none
- -

This is the same as htmlUtils, but it is for XHTML output.

- - - - - - -

now

- Parameters: -
    -
  1. options: hash, optional. - The supported options are: -
      -
    • locale: The locale (language) used for displaying the date. It defaults to the "locale" setting of the FMPP engine. The value of the option is a usual java locale strings, such as en_GB, fr, ar_SA, ...etc. To see the complete list of locale codes, call the command line FMPP tool:
      fmpp --print-locales -
    • date: The format of the date (year, month, day) part of the date: short, medium, long, default. The exact meaning of these formats are locale dependent, and it is defined by the Java platform implementation. You can't use this option together with the pattern option. -
    • time: The format of the time (hour, minute, second, millisecond) part of the date: short, medium, long, default. The exact meaning of these formats are locale dependent, and it is defined by the Java platform implementation. You can't use this option together with the pattern option. -
    • pattern: A pattern that specifies the formatting of the date. -
    • zone: The time zone you would like to use ford displaying the date. Defaults to the "time zone" FMPP engine setting. The zone is given with a string, for example: GMT, GMT+02, GMT-02 or GMT+02:30. -
    - -
- -

Note: FreeMarker now has a .now variable, so you don't need this data loader any more. You can print the current date and time with ${.now} (or ${.now?date} or ${.now?time}), and the format and zone is specified by the global datetimeFormat (or dateFormat or timeFormat) and timeZone FMPP settings.

- -

Examples (with TDD syntax): -

    -
  • now() -
  • now({pattern:"EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'"}) -
    This will print something like: Tuesday, April 08, 2003, 09:24:44 PM (GMT+02) -
  • now({date:short, time:short, zone:GMT}) -
- -

This data loader loads the current date and time from the system clock, and produces a string from it. Since FreeMarker has introduced native date/time value support, it is maybe better to use pp.sessionStart or pp.now instead of this data loader.

- - - - -

get

- Parameters: -
    -
  1. varName: string. - The name of the variable. -
  2. subVarName: string, optional. - The name of the sub-variable. -
  3. subSubVarName: string, optional. - ...etc. You can specify any number of parameters. -
- - - - -

This data loader returns the value of a variable that was already put into the data hash. For example:

- -
data: {
-    a: 123
-    b: get(a)
-}
-

Here the value of b will be the same as the value of a, which is 123. You can retrieve the value of subvariables with additional parameters:

- -
data: {
-    a: {
-        x: 123
-        y: {
-            q:234
-        }
-    }
-    b: get(a, x)
-    c: get(a, y, q)
-}
-

Here b will be 123, c will be 234.

- -

The get data loader was introduced so that data loaders can get the values loaded by other data loaders previously. For example:

- -
data: {
-    doc: xml(data/foo.xml)
-    index: com.example.MyIndexBuilderDataLoader(get(doc))
-}
-

The get data loader sees the variables that were already put into the hash in the same enclosing data/localData hash TDD expression where it is called, but it doesn't see values that are put into the data model elsewhere, as in other (inherited or inheriting) configuration files. However, if you use get in the localData setting, it will also see the session level data (see data).

- - - - - -

antProperty

- Parameters: -
    -
  1. properyName: string. - The name of the Ant property. -
  2. defaultValue: any, optional. - The value returned if the Ant property does not exist. -
- - - -

This data loader returns the value of an Ant property. If no Ant property with the given name exists, it will return nothing (i.e. will not add new variable to the shared data model), or it will return the value of the second parameter if you use that. - -

The values of Ant properties are strings. But sometimes you want to see a property as numerical variable, or as boolean variable, etc. If the property name you give as data loader parameter ends with ?n, then the string will be converted to number variable, and the ?n itself will not count as the part of the actual property name. The complete list of postfixes:

-
    -
  • ?n: Convert to number. The string value must follow Java language number format, that is, the decimal separator is always dot (.).
  • -
  • ?b: Convert to boolean. Valid values are: true, false, yes, no, y, n, 0, 1. Upper- and lowercase letters are considered as equivalent.
  • -
  • ?d: Convert to date. Use common SQL format with optional time zone, as "2003-06-25 GMT". If the time zone is omitted, the value of the timeZone setting is used.
  • -
  • ?t: Convert to time. Use common SQL format with optional time zone, as "22:05:30 GMT-02:00". The usage of AM/PM is also supported, e.g. "10:05:30 PM". If the time zone is omitted, then the value of the timeZone setting is used.
  • -
  • ?dt: Convert to date-time. The date and time format is the same as with ?d and ?t, e.g. "2003-06-25 10:05:30 PM GMT".
  • -
  • ?s: Keep the property as string. This can be useful if the actual property name ends with a prefix, so you must protect it against misinterpretation: foo?t?s.
  • -
- -

To see a concrete example, look at <FMPP>/docs/examples/ant2.

- -

This data loader will work only if you execute FMPP as Ant task.

- - - - - -

antProperites

- Parameters: -
    -
  1. properyName1: string, optional. - The name of an Ant property to expose. -
  2. properyName2: string, optional. - The name of another Ant property to expose. -
  3. properyNameN: string, optional. - ...etc. You can specify any number of Ant parameters. -
- - - - -

Returns the set of all Ant properties, or the set of selected ant properties, as a hash. - -

If you use this data loader without parameters, then it returns the hash of all Ant properties. To see a concrete example, look at <FMPP>/docs/examples/ant.

- -

You can also give the name of properties to expose as parameters. For example if you want to put only the Ant properties foo and bar into the shared data model, then you write: antProperties(foo, bar). Parameters that refer to not existing Ant properties will be silently ignored. The same postfixes (as ?n) are supported as with antProperty.

- -

To see a concrete example, look at <FMPP>/docs/examples/ant2.

- -

This data loader will work only if you execute FMPP as Ant task.

- - - - - -

antProject

- Parameters: - none
-

Returns the current Ant project object (org.apache.tools.ant.Project). See the example in <FMPP>/docs/examples/ant.

-

This data loader will work only if you execute FMPP as Ant task.

- - - - - -

antTask

- Parameters: - none
-

Returns the current Ant task object (org.apache.tools.ant.Task). See the example in <FMPP>/docs/examples/ant.

-

This data loader will work only if you execute FMPP as Ant task.

- - - - - -

Custom data loaders

- -

If you want to write custom data loader, you have to write a Java class that implements the fmpp.tdd.DataLoader interface (see in the API documentation). Then, if the class is available in the class path, or if you drop its jar into the lib directory of the FMPP installation, you can call it similarly as a predefined data loader, just you use the full-qualified class name as the data loader name. For example:
com.example.fmpp.SQLDataLoader("SELECT * FROM products").

- -

If you have written a data loader that can be useful for other FMPP users, I will be happy to make it available on the FMPP home page for download. So if you want to contribute with your data loader, drop me a mail (ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)) or write to the mailing list. Thank you!

- - - -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/details.html b/fmpp/docs/details.html deleted file mode 100644 index 7bdec76..0000000 --- a/fmpp/docs/details.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -Core Details - FMPP - - - - - - - - - - - - - - - -
-

Core Details

- -
-
-

Chapter Contents

- -
- -
-
-
-
- - - \ No newline at end of file diff --git a/fmpp/docs/examples/README.txt b/fmpp/docs/examples/README.txt deleted file mode 100644 index e36930f..0000000 --- a/fmpp/docs/examples/README.txt +++ /dev/null @@ -1,95 +0,0 @@ -FMPP Examples -============= - -How to try them ---------------- - -To run the examples, the command-line FMPP tool must be installed (see -the FMPP Manual). Then, go to the directory of the example, and simply -issue the fmpp command there. Or, you can run the example without -entering into its directory with: fmpp -C the/example/directory - -The above does not apply for the Ant examples (their name starts with -"ant"). To run those, FMPP must be installed for Ant (see the FMPP -Manual). Then, go to the directory of the example, and simply issue the -ant command there. Or, you can run the example without -entering into its directory with: ant -f the/example/directory/build.xml - -The output will be created in the out subdirectory of the example. - -The build.xml in this directory: if you run it with Ant, it will run all -examples. In this case, the command-line FMPP tool need not be -installed. - - -List of examples ----------------- - -qtour_step... The examples used in the Manual/Quick Tour chapter. - 1 - The idea of bulk processing - 2 - Data loading basics. Interpolations. - 3 - Data loading from multiple sources. Directives. - 4 - Multiple output files from single source file - -capture Generates Table of Contents on the top of the page - based on the headers used further down, using - block assignments to resolve the x-dependency. - -border Uses headers and footers to automate including, - interpolation escaping, and to convert *.c files - to HTML files. - -session Demonstrates session variables and turns with the - generation of an index page that contains links to - the other generated pages. - -img_dims Shows HTML with calculated image dimensions. - -csv Detects the columns of a CSV file. - Uses typed columns (numerical colum, boolean column). - -check_links Uses a macro instead of HTML that sends - warning if the link is broken. - -tdd Loads data model from a tdd file. - -xml XML data loader basics. - If you use earlier J2SE version than 1.4, the you have - to install some JAXP 1.2+ implementation. Say, Crimson. - -xml2 Product catalog that uses two related XML-s as data source. - FreeMarker requires XPath support for this example; see the - FMPP Manual/Installing for more information about XPath - availability. - -xml_try You can play with xml data loader options here, and examine - XML wrapping in general: It displays the resulting node - tree. - -xml_validating Demonstrates the usage of OASIS catalogs (public ID - resolution), validation, and the usage of XML name spaces - through the processing of an XHTML document. - -xml_rendering Renders XML source files to HTML-s, using "renderXml" - processing mode. Also demonstrates features as indexing, - declarative XML processing, XPath expressions. - -eval Demonstrates eval (BeanShell) data loader. - -inherit_config Demonstrates the usage of configuration inheritance. - -local_data Demonstrates the usage of the localData setting. - -ant Uses FMPP as Ant task: Basics. - You can't use the command-line tool here. - -ant2 Uses FMPP as Ant task: More property data loaders. - You can't use the command-line tool here. - -ant3 Uses FMPP as Ant task: Executes qtour_step4 with - changed text color. - -multipage_list Lists a sequence on multiple pages, like a Google search - result. Demonstrates the usage of BeanShell calculated local - data to prevent template overcomplication. Kinf of MVC style - separation. \ No newline at end of file diff --git a/fmpp/docs/examples/ant/build.xml b/fmpp/docs/examples/ant/build.xml deleted file mode 100644 index 9bf9c8a..0000000 --- a/fmpp/docs/examples/ant/build.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/ant/src/test.txt b/fmpp/docs/examples/ant/src/test.txt deleted file mode 100644 index b15806d..0000000 --- a/fmpp/docs/examples/ant/src/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -Hello property: ${hello} -Basedir property: ${basedir} -Project name: ${proj.name} -Target name: ${task.target.name} -${true} \ No newline at end of file diff --git a/fmpp/docs/examples/ant2/build.xml b/fmpp/docs/examples/ant2/build.xml deleted file mode 100644 index d184e7c..0000000 --- a/fmpp/docs/examples/ant2/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - antProperties(p1, p2, x?n, test?b, time?t, thisWillBeIgnored) - wombat1: antProperty(p3) - wombat2: antProperty(p4) - wombat3: antProperty(p4, 'P4?') - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/ant2/src/test.txt b/fmpp/docs/examples/ant2/src/test.txt deleted file mode 100644 index 90bf9da..0000000 --- a/fmpp/docs/examples/ant2/src/test.txt +++ /dev/null @@ -1,10 +0,0 @@ -p1: ${p1!"not found"} -p2: ${p2!"not found"} -p3: ${p3!"not found"} -wombat1: ${wombat1!"not found"} -wombat2: ${wombat2!"not found"} -wombat3: ${wombat3!"not found"} - -x + 1: ${x + 1} -<#if test>It's a test.<#else>It's not a test. -time: ${time} \ No newline at end of file diff --git a/fmpp/docs/examples/ant3/build.xml b/fmpp/docs/examples/ant3/build.xml deleted file mode 100644 index dc1998b..0000000 --- a/fmpp/docs/examples/ant3/build.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/border/config.fmpp b/fmpp/docs/examples/border/config.fmpp deleted file mode 100644 index c657f57..0000000 --- a/fmpp/docs/examples/border/config.fmpp +++ /dev/null @@ -1,15 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -borders: [ - border( - "<#include '/include/test.ftl'><#escape x as x?html>" - "" - *.html - ) - border( - "<@pp.renameOutputFile name=pp.outputFileName+'.html'/>
<@html_escape><#noparse>"
-        "
" - *.c - ) -] \ No newline at end of file diff --git a/fmpp/docs/examples/border/src/include/ignoredir.fmpp b/fmpp/docs/examples/border/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/border/src/include/test.ftl b/fmpp/docs/examples/border/src/include/test.ftl deleted file mode 100644 index bb86337..0000000 --- a/fmpp/docs/examples/border/src/include/test.ftl +++ /dev/null @@ -1 +0,0 @@ -<#assign test = "Hello"> \ No newline at end of file diff --git a/fmpp/docs/examples/border/src/test.c b/fmpp/docs/examples/border/src/test.c deleted file mode 100644 index dd6d393..0000000 --- a/fmpp/docs/examples/border/src/test.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include "futil_i.h" - -zxz_ec_t -zxz_f_child_path_can_match(zxz_bool_t *pbMatches, - const char *sPath, const char *sPattern) -{ - zxz_ec_t ec; - int i; - char *sNew = NULL; - - i = strlen(sPath); - if (i != 0 && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR_CHR - && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR2_CHR) { - sNew = malloc(i+2); /* <-- +sNew */ - strcpy(sNew, sPath); - sNew[i] = ZXZ_CFGM_PATH_SEPARATOR_CHR; - sNew[i+1] = '\0'; - sPath = sNew; - } - ec = zxz_f_path_matches_ex(pbMatches, sPath, sPattern, FALSE, 1); - free(sNew); /* <-- -sNew */ - return ec; -} diff --git a/fmpp/docs/examples/border/src/test.html b/fmpp/docs/examples/border/src/test.html deleted file mode 100644 index 975bb9f..0000000 --- a/fmpp/docs/examples/border/src/test.html +++ /dev/null @@ -1,3 +0,0 @@ -${test} -

${"a < b & c"} -

A C program \ No newline at end of file diff --git a/fmpp/docs/examples/build.xml b/fmpp/docs/examples/build.xml deleted file mode 100644 index 5d7bfa2..0000000 --- a/fmpp/docs/examples/build.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/capture/config.fmpp b/fmpp/docs/examples/capture/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/docs/examples/capture/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/docs/examples/capture/src/include/ignoredir.fmpp b/fmpp/docs/examples/capture/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/capture/src/include/page.ftl b/fmpp/docs/examples/capture/src/include/page.ftl deleted file mode 100644 index 87c7d11..0000000 --- a/fmpp/docs/examples/capture/src/include/page.ftl +++ /dev/null @@ -1,24 +0,0 @@ -<#assign h1Counter = 0> -<#assign contents = pp.newWritableSequence()> - -<#macro h1> - <#local title><#nested> - <#assign h1Counter = h1Counter + 1> - <@pp.add seq=contents value={"anchor":h1Counter, "title":title} /> - -

${title}

- - -<#macro page> - <#local output> - <#nested> - - Contents: - -
- ${output} - \ No newline at end of file diff --git a/fmpp/docs/examples/capture/src/test.html b/fmpp/docs/examples/capture/src/test.html deleted file mode 100644 index af44b9d..0000000 --- a/fmpp/docs/examples/capture/src/test.html +++ /dev/null @@ -1,100 +0,0 @@ -<#include "/include/page.ftl"> -<@page> - -<@h1>Foo - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -<@h1>Bar - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -<@h1>Baaz - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - - \ No newline at end of file diff --git a/fmpp/docs/examples/check_links/config.fmpp b/fmpp/docs/examples/check_links/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/docs/examples/check_links/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/docs/examples/check_links/src/good_target.html b/fmpp/docs/examples/check_links/src/good_target.html deleted file mode 100644 index 2f9031f..0000000 --- a/fmpp/docs/examples/check_links/src/good_target.html +++ /dev/null @@ -1 +0,0 @@ -Hi! \ No newline at end of file diff --git a/fmpp/docs/examples/check_links/src/include/a.ftl b/fmpp/docs/examples/check_links/src/include/a.ftl deleted file mode 100644 index 2a07d93..0000000 --- a/fmpp/docs/examples/check_links/src/include/a.ftl +++ /dev/null @@ -1,13 +0,0 @@ -<#macro a href> - <#-- remove anchor link ending --> - <#local x = href?index_of('#')> - <#if x != -1> - <#local href = href?substring(0, x)> - - <#-- check existence --> - <#if !pp.sourceFileExists(href)> - <@pp.warning message="Broken link in " + pp.sourceFile + ": " + href /> - - <#-- print HTML --> - <#nested><#t> - \ No newline at end of file diff --git a/fmpp/docs/examples/check_links/src/include/ignoredir.fmpp b/fmpp/docs/examples/check_links/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/check_links/src/index.html b/fmpp/docs/examples/check_links/src/index.html deleted file mode 100644 index 7fafe7f..0000000 --- a/fmpp/docs/examples/check_links/src/index.html +++ /dev/null @@ -1,3 +0,0 @@ -<#include "/include/a.ftl"> -

<@a href="good_target.html">Working link -

<@a href="bad_target.html">Broken link \ No newline at end of file diff --git a/fmpp/docs/examples/csv/config.fmpp b/fmpp/docs/examples/csv/config.fmpp deleted file mode 100644 index 94e53b0..0000000 --- a/fmpp/docs/examples/csv/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {csv: csv(data/test.csv)} \ No newline at end of file diff --git a/fmpp/docs/examples/csv/src/data/ignoredir.fmpp b/fmpp/docs/examples/csv/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/csv/src/data/test.csv b/fmpp/docs/examples/csv/src/data/test.csv deleted file mode 100644 index a17bb9e..0000000 --- a/fmpp/docs/examples/csv/src/data/test.csv +++ /dev/null @@ -1,5 +0,0 @@ -name;protected:b;price:n;entered:dt -arctic-tern;yes;10000;2003-01-25 03:10:06 -house-sparrow;no;50;2003-02-15 01:20:30 PM -hoachim;yes;; -sakeret;yes;200000;2002-12-18 20:45:00 \ No newline at end of file diff --git a/fmpp/docs/examples/csv/src/test.html b/fmpp/docs/examples/csv/src/test.html deleted file mode 100644 index bfe6d97..0000000 --- a/fmpp/docs/examples/csv/src/test.html +++ /dev/null @@ -1,8 +0,0 @@ -<#setting number_format=",##0.00"> -<#setting datetime_format="MMM dd, yyyy hh:mm:ss a"> - - <#list csv.headers as h><#list csv.headers as h>
${h} -<#list csv as row> -
${(row[h]!"N/A")?string} - -
\ No newline at end of file diff --git a/fmpp/docs/examples/eval/config.fmpp b/fmpp/docs/examples/eval/config.fmpp deleted file mode 100644 index 122ca80..0000000 --- a/fmpp/docs/examples/eval/config.fmpp +++ /dev/null @@ -1,7 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - props: eval('System.getProperties()') - exampleDir: eval('engine.getSourceRoot().getParentFile().getParentFile().list()') -} \ No newline at end of file diff --git a/fmpp/docs/examples/eval/src/test.html b/fmpp/docs/examples/eval/src/test.html deleted file mode 100644 index defa5ae..0000000 --- a/fmpp/docs/examples/eval/src/test.html +++ /dev/null @@ -1,17 +0,0 @@ -<#escape x as x?html> - -

System properties: -

    -<#list props?keys?sort as k> -
  • ${k} = ${props[k]} - -
- -

Example dir: -

    -<#list exampleDir?sort as f> -
  • ${f} - -
- - \ No newline at end of file diff --git a/fmpp/docs/examples/ignoredir.fmpp b/fmpp/docs/examples/ignoredir.fmpp deleted file mode 100644 index 7562186..0000000 --- a/fmpp/docs/examples/ignoredir.fmpp +++ /dev/null @@ -1 +0,0 @@ -Not copied as part of the FMPP documentation generation. \ No newline at end of file diff --git a/fmpp/docs/examples/img_dims/config.fmpp b/fmpp/docs/examples/img_dims/config.fmpp deleted file mode 100644 index 8bb1c12..0000000 --- a/fmpp/docs/examples/img_dims/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {h:htmlUtils()} \ No newline at end of file diff --git a/fmpp/docs/examples/img_dims/src/falcon.png b/fmpp/docs/examples/img_dims/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 calcualted: -<@h.img src="falcon.png" alt="Falcon" /> - -

Width calculated: -<@h.img src="falcon.png" alt="Falcon" height=20/> - - -

Height calculated: -<@h.img src="falcon.png" alt="Falcon" width=20/> - -

Nothing calculated: -<@h.img src="falcon.png" alt="Falcon" height="20" width="20"/> diff --git a/fmpp/docs/examples/inherit_config/README.txt b/fmpp/docs/examples/inherit_config/README.txt deleted file mode 100644 index 605ed9d..0000000 --- a/fmpp/docs/examples/inherit_config/README.txt +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how to "customize" another configuration file, that -is, how to make configuration variations without actually editing or -copy/pasting the common configuration file. - -In this example, config_red.fmpp and config_dark.fmpp executes a -slightly modified version of config.fmpp. To try them type: - - fmpp -C config_red.fmpp - -and - - fmpp -C config_dark.fmpp - -respectively. \ No newline at end of file diff --git a/fmpp/docs/examples/inherit_config/config.fmpp b/fmpp/docs/examples/inherit_config/config.fmpp deleted file mode 100644 index 6830455..0000000 --- a/fmpp/docs/examples/inherit_config/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {backgroundColor:#C0C0FF, textColor:blue} \ No newline at end of file diff --git a/fmpp/docs/examples/inherit_config/config_dark.fmpp b/fmpp/docs/examples/inherit_config/config_dark.fmpp deleted file mode 100644 index 00fbceb..0000000 --- a/fmpp/docs/examples/inherit_config/config_dark.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -inheritConfiguration: config.fmpp -data: {backgroundColor:black} \ No newline at end of file diff --git a/fmpp/docs/examples/inherit_config/config_red.fmpp b/fmpp/docs/examples/inherit_config/config_red.fmpp deleted file mode 100644 index 8842538..0000000 --- a/fmpp/docs/examples/inherit_config/config_red.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -inheritConfiguration: config.fmpp -data: {textColor:red} \ No newline at end of file diff --git a/fmpp/docs/examples/inherit_config/src/index.html b/fmpp/docs/examples/inherit_config/src/index.html deleted file mode 100644 index 9205087..0000000 --- a/fmpp/docs/examples/inherit_config/src/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -

Test. - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/config.fmpp b/fmpp/docs/examples/local_data/config.fmpp deleted file mode 100644 index 638d145..0000000 --- a/fmpp/docs/examples/local_data/config.fmpp +++ /dev/null @@ -1,29 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp - -modes: ignore(**/*.bsh) - -data: { - bgColor: green - author: Anonymous -} - -localData: [ - # Run the attached BeanShell script for HTML-s, if there is one available. - case(**/*.htm, **/*.html, bsh({ignoreMissing})) - - # Independently of the above, - # set "bgColor" to "yellow" when processing the files of the "sub" folder: - # except for the files in "sun/sky/**", where use "blue". - # But, never override the "bgColor" if the file name starts with "foo" - layer() - case(**/foo*, {}) - case(sub/sky/**, {bgColor: blue}) - case(sub/**, sub2/**, {bgColor: yellow}) - - # Independently of all above, set the "author"... - layer() - case(**/*_j.*, {author: Joe}) - case(**/*_a.*, {author: Amy}) -] \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/index.html b/fmpp/docs/examples/local_data/src/index.html deleted file mode 100644 index 05f62c1..0000000 --- a/fmpp/docs/examples/local_data/src/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - -

Test

-

Other pages: -

- -

Here it is the config file used: -
-
${pp.loadData('text', '../config.fmpp')?html}
-
- - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/1.html b/fmpp/docs/examples/local_data/src/sub/1.html deleted file mode 100644 index 32f023d..0000000 --- a/fmpp/docs/examples/local_data/src/sub/1.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

1

-

Author: ${author} -

x: ${x} -

y: ${y} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/1.html.bsh b/fmpp/docs/examples/local_data/src/sub/1.html.bsh deleted file mode 100644 index 14c8e0f..0000000 --- a/fmpp/docs/examples/local_data/src/sub/1.html.bsh +++ /dev/null @@ -1,4 +0,0 @@ -res = new HashMap(); -res.put("x", "Just for test: " + templateEnvironment.getData("author")); -res.put("y", "Blah for 1..."); -return res; \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/2.html b/fmpp/docs/examples/local_data/src/sub/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/docs/examples/local_data/src/sub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

2

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/3_j.html b/fmpp/docs/examples/local_data/src/sub/3_j.html deleted file mode 100644 index b89c36c..0000000 --- a/fmpp/docs/examples/local_data/src/sub/3_j.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

3_j

-

Author: ${author} -

x: ${x} -

y: ${y} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/3_j.html.bsh b/fmpp/docs/examples/local_data/src/sub/3_j.html.bsh deleted file mode 100644 index cb052d2..0000000 --- a/fmpp/docs/examples/local_data/src/sub/3_j.html.bsh +++ /dev/null @@ -1,4 +0,0 @@ -res = new HashMap(); -res.put("x", "Just for test: " + templateEnvironment.getData("author")); -res.put("y", "Blah for 3_j..."); -return res; \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/food.html b/fmpp/docs/examples/local_data/src/sub/food.html deleted file mode 100644 index e817607..0000000 --- a/fmpp/docs/examples/local_data/src/sub/food.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

Food

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/sky/1.html b/fmpp/docs/examples/local_data/src/sub/sky/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/docs/examples/local_data/src/sub/sky/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

1

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/sky/2.html b/fmpp/docs/examples/local_data/src/sub/sky/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/docs/examples/local_data/src/sub/sky/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

2

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/sky/3_a.html b/fmpp/docs/examples/local_data/src/sub/sky/3_a.html deleted file mode 100644 index 6734b3f..0000000 --- a/fmpp/docs/examples/local_data/src/sub/sky/3_a.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

3_a

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/subsub/1.html b/fmpp/docs/examples/local_data/src/sub/subsub/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/docs/examples/local_data/src/sub/subsub/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

1

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub/subsub/2.html b/fmpp/docs/examples/local_data/src/sub/subsub/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/docs/examples/local_data/src/sub/subsub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

2

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub2/1.html b/fmpp/docs/examples/local_data/src/sub2/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/docs/examples/local_data/src/sub2/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

1

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/local_data/src/sub2/2.html b/fmpp/docs/examples/local_data/src/sub2/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/docs/examples/local_data/src/sub2/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

2

-

Author: ${author} - - \ No newline at end of file diff --git a/fmpp/docs/examples/multipage_list/config.fmpp b/fmpp/docs/examples/multipage_list/config.fmpp deleted file mode 100644 index ea19e9d..0000000 --- a/fmpp/docs/examples/multipage_list/config.fmpp +++ /dev/null @@ -1,35 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - foos: [ - {name:"qweqwe", url:"http://qweqwe.com"} - {name:"asdasd", url:"http://asdasd.com"} - {name:"cvbcvbcv", url:"http://cvbcvbcvb.com"} - {name:"iopiopi", url:"http://iopiopo.com"} - {name:"bmbnmbm", url:"http://bnmnbmb.com"} - {name:"uiouioui", url:"http://uiouiouio.com"} - {name:"bvnbvnbv", url:"http://bvnbvnbvnbv.com"} - {name:"hghjghjghjg", url:"http://hghjghjghjg.com"} - {name:"werwer", url:"http://werwerr.com"} - {name:"mnmbnbm", url:"http://mbnmbnmb.com"} - {name:"gfhfghgfgfh", url:"http://fghgfhgfhg.com"} - {name:"asdasas", url:"http://asdasdasd.com"} - {name:"yuuiyiyu", url:"http://yuiyuiyui.com"} - {name:"rtytryytr", url:"http://rttryytr.com"} - {name:"kjhkjhk", url:"http://khjkhjkhjk.com"} - {name:"rrrrr", url:"http://rrrrr.com"} - {name:"ddfdgfgf", url:"http://ddffdg.com"} - {name:"jhjhhgjh", url:"http://jghjjhj.com"} - {name:"zzzzzzzz", url:"http://zzzzzzzz.com"} - {name:"zxzxxzzx", url:"http://zzxzxzxzx.com"} - {name:"cvvcvvcv", url:"http://ccvvcvcvcv.com"} - {name:"bnvvbnvb", url:"http://vbnvbnnvbnb.com"} - {name:"asdsadasd", url:"http://asdasdasd.com"} - {name:"vvvvvv", url:"http://vvvvvvv.com"} - {name:"ssssss", url:"http://sssss.com"} - {name:"qqqqqqq", url:"http://qqqqqq.com"} - {name:"xxxxxxx", url:"http://xxxxx.com"} - {name:"vvvvv", url:"http://vvvvv.com"} - {name:"aaaaaaa", url:"http://aaaaaaaa.com"} - ] -} diff --git a/fmpp/docs/examples/multipage_list/src/result.html b/fmpp/docs/examples/multipage_list/src/result.html deleted file mode 100644 index 8c371fc..0000000 --- a/fmpp/docs/examples/multipage_list/src/result.html +++ /dev/null @@ -1,56 +0,0 @@ -<#escape x as x?html> -<@pp.dropOutputFile /> -<#assign pages = foos?chunk(5)> -<#assign entryIndex = 0> -<#list pages as page> - <@pp.changeOutputFile name="result${page_index+1}.html" /> - - - Results - page ${page_index+1} of ${pages?size} - - -

Results

- - <#list page as entry> - <#assign entryIndex = entryIndex + 1> -

${entryIndex}. ${entry.name?cap_first}: ${entry.url} - - -


- Pages:   - <#if page_index != 0> - <<  - <#else> - <<  - - <#list 0..pages?size-1 as i> - <#if i != page_index> - ${i+1} - <#else> - ${i+1} - - <#if i_has_next>| - - <#if page_index != pages?size-1> -  >> - <#else> -  >> - - - - - -<#if pages?size == 0> - <@pp.changeOutputFile name="result1.html" /> - - - Results - No foos - - -

Results

-

Sorry, no foos available.

- - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step1/config.fmpp b/fmpp/docs/examples/qtour_step1/config.fmpp deleted file mode 100644 index 1a65d4c..0000000 --- a/fmpp/docs/examples/qtour_step1/config.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -sourceRoot: src -outputRoot: out \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step1/src/falcon.png b/fmpp/docs/examples/qtour_step1/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 zcmV-f6Q=BmP)^VKz80DJCu>AQ}-A7(zfWdSqUjkbsJYZ@R*Q%)G9y zmWeGNAAxLcG$<}rQcO%gKQT2ib9#ZLwY@w(LqbYVc6m}FBQ0oENiQxQQfN_3Qa>p( zFD^JlU3OE~M5w%7m912dpG?R6BGLc=5*A5B zK~#9!U0DfxqD-@GKpG9=pwNI2*O-V~LdGSTtj_=cQ{Oq&WZwJSiVGU;)3u$dYSrd& zIBpi{PZ-jn-WJ z>5CtrL9f;btuem7WbYs1rjJh%3t}%sm)0HD8Sk=V+!dZ6@_^TPpX+m(cJb@C`1fiJ zMAgJ>*UxXOoP6Z_`X7e%^~a}pg91&S+KX1i6d&^CU;jnU|M9N4r(N*JIec~fXjc#z z3u52;XhGnne-Q27zCZtqPiqyck9EvdRuZlL(h=f`Co$8{$^v2cuhur62ttp-6Ibif z>%S<)`eOJ`M(7n=eEN_zpbA#QZm#n3>7Os&+x5A70YMV9_WH8^<|lr%`6bo{f;Aa( z4Icj$|HyC{0pr)__fJNA{1c1uw0;zyY}OV~0-%MF++|>XTE~mX>c8S4{^Hn$ctaO& zFxO$c>-AH-@Y(wQ=_k6VfS8N7^=9*vh3_Aq?Xpnhv&H!3##qw@2KFD}K8!rijeuw^ zX?OJb**aVT^+(ipE6KR|Pac1=K=dHU=f|hp+Q%ct&`YAk6PUzO za@lU{bqjJhv?%|Akve?}f(rm5Kn>R&y1+>iuPBOyFmMe$_Wdu81!ess>T)?YB;Xnx zd^`f>V9h3>@J^kGfIZ_zp{2OEuYF(czV9U7ko)=k=M0O2zG3z9j|_xPHRhAfYB$aoQKBBz>)nQVJ#;+}_@D^S8p}x7N@5{SHg2S9rcTT~5ue zu6N=besX){^V9u(97k9OW=RI{1_F4{hjGlC%1J? z6V>&8-yC0G&&_Txjt2slKM{!_HT*)&c80d{`qM1!L2hn(X`W`rcu}PBqmvpbWPrV`+mPBdr{n3=G*}moKUg~nQVoHJ0J3;l#rHt*`f2Z`RMqn4=Fju<^WC3G zH!UkuQYxdWstnCwFc|i;DPW?N7JcT`re`APSXbm@x?ZQ$|7!zidGp_4agrxitHF z*Fcko2(T8FIBW^w#4W~sJnj@7fV};=`BOeWZ=EqvCRV6Xo{Kt}Ny8{v4C4g) z)OEY$p80qSJ#-$%Z*N$h zYC!UwATU~`t2{8-Vqv0zI7KLae>gCB7YYvFA+Dgpe0M(2AAVayEvx(A)I(S5x%2RL zN02{&dw5{nmiZkqQlt)W0M_l6#!PjVB;j;XGwaEa`@Mkd00QIfaRrdw+#d^wJdELS zrK)G>!tlD82nOQ0Dxtu#o8phUv={=KP*nvY*e3F+59@ z-?%}OXE4|E+gtJWTp_j~Z*R}g!wT(nw`?!+CGKS!A}_O=DQRo%5qWHWe*i~U+3ZQs(mv@;Y*uG7cJEB-rWr8%SbXW5_u00 z2kX2c8Cn@*T@;hIw+i`C-901ouw&*3cFtvObmb`o*MT-!&@F=yu1A@LZw{=5dtqT{ zbh^9(1p6)To)NV_C=UdAdsEM)M3byYDFexN@}ykIyMWK~42lNfw%L=6Q856vrccPh zVzmVlc-gHGv@}1FkRosjq>>;)V!%YmJyn5;wNSBA89)N@zl1ezw{1Q`4<@}rA!&$l zJ|E97_}FCmti%BYu*N_k0vNYqN{~lN)X6D|ASPP>>q|hgSW1pdN<2KEMJbqzlWxxXf$bX-IyKOP2qjIUa#hMvaDGmnNmH=F zXf|84su1R+V7${SF<)O7VQ-R`%j(T39ET5u(?NnW;9$nmR9Uvr$-qm9f_4IR7~PVl z#r!I_nUV|T%);sRB5pyUKOPnOMqs?~{u1_jVLn*~<$`gro3B=mtMW+~=|~;(YN32# zK^At;9S#QGpzmqrE7O{5S>^zl^#Z-!qBq&HA~stkh4FMI#>=ADTR?Dym*+VsbMEMT z)I(LAOnQ@vLUs2da7QxDR1&%Dz0tHLg;yv6St3c&bTsPq;Cgnyr^^|SN>Y6XKE41X z=q+};7b~`T0XgTr9uU|{++dl|L9;!KT}OG*fE^iHy}tI1CCYq>W+NRQQ04p*P${C&hC3nW`GO#n9z9bUO%zN(E(est_Xk54ePmT) zea{aW!js8t2G_q{z`Gzxby&mn3kx$}K_jsheR7hXi3I?DX;B0wM{k9lK*VBnZ>gM!v#A6A zs^pddCHBfu4kAW`rQrZgD`vL?i`JU^2Mmmd>1W$ul0fap-|4W~i@WHWl`{_rLsjx1 z$PH4wqPYsdRNw-<4*UqMK{u#?(aphMgIb1%{a&H{-fU`;B{;bT!<-}z_9squP_;RW z{~br8nVisSIUts%Kwy=nAAwOyVNFx!rSGY{SB|=QFYN~5U|SR7a8P@yRCAU)a8cHn zz5SP%lidxRH5hO>$a(@Z=>`5`fl(oHz?Wz?P)$m7`5EfG290)mc@LaCGYe@^nw?@{ zvD7bZ>J|eeF>GM4+1T$fVGQ~lw{(Tzq%z%!=GF^0(m|>4eo4m|60!kN_JVG@$ii^3 zoA2pbC9J}pqB*vLq73+2+CS)WSU=rjYEKFdx;a6hiOMwi-Bg9^7D{=ZZ%h$ke1vDx zpxaAlNZD|@sOxu|3q>GVxiSstvw5P%Sz>6?da}`l#VpO2Ztnf?t zMxn2Ff#B<+fHHvuSDnT!fji=J8dC%R;a~uh+Xcia@;u0#*!0vJB9g zW|dRqUG3?zL~=qS4b(ErOqPxUBy51Hg19+13XKY=k_`(yfp7+^yu6-Q94uQ5@O=~y zy~uGfW>XcSEYX#q=;{Ihu2%u2KwV)^oaqpJpJ$n8!Vs-JL0-gAoKCPNrf#XlE8Aic zW3yiPnC!qGgRf@(R7H<5VS8$x%~)fqqE~ zNV7*vWEuF<$iXcWaW4%yBYCHtPAAX2d)MKylPeap7!ziAfx9VzQaXMaV3t?N{VWZz z5%d>^PLYIAGWs$G7)sdq4+wcnql++sap6@L7;fRkZlo+qS>*<{GHf+eQ28Ji&`Sjk z;E--_S%#?zQB-I!3_<(7ZH2cq*Fm0SOh)ZSLxeE#qA{ccW^%{l!mIL>B?Ik|j|>k` zko_ed5qv7h18IyRA@Y}GsZkr@SrOm z!)!W5MF*=Rco&YzE6`Yghfb$}@t{XQkX{~)Mz9x3)n2u~I5bB%dP`IBwA*ob*5RX9 zEluA;J?i*{ANgYxCRd}rYh+=h5z)}nWbBAd(Gl8*&)E*MYz66TiF~YAYek6Tc2nB{ zUQBh1FN60Wold2bqB90PIX(->xD%^*>@slSsK~2OyTD@TPfdZ21+y2FK+@xBl%})p zY_Ypu>u6ajOQve z4W(C9!-eD|5~A=!na^y~&8}c8_-yuTd}x5&Mz)SzUg3Sg+@$9K;nq^%x8mk#b$9 z@@49Fil}nqNL+#qAS;YhEd%TZ?Khf)Rm4^C>||0Zi%}Z``R_ebCw|C4xmf{`bvWl`z1JLVgV-I9{iJs z=xWvB=hvnU+PsB$n>m7l-XD0=j5JY3ag1Kh?ZhrBZj5wP=pPC&Jxjb{0j@YW$aIr; zr9Sr<#3SQI3&$P&_+*1boL801W)*l&XPEtU7NpPv-i}cgQB~YhkK=Ldg4i7otr7O1 zK=mch56I44o*xio0-ul40Z;ewJ=HQ*J=Zd4DrWB@TSWaSyqRU0qdSZ!f*=)3HRb`8 zkA~69W&jDY5V^;p)DDc@k(D$br95+uU482+G9iV7pdg^(z$`e#2m)(mXsA0#ZMW0$ zF-WRP$*EyfmL3|F0E7-@W$vBWx(pd1?-2(PWJy2E ziU{@_D=@uVA?s0;c>D=_f#-+5oOfE@rMoRguQ!{8uyxkW6S&fKRX`VO0iYIa1E@)6 zre+#t*o$AH$*sU!9)bul<;O93U)_O&$C8B$f=ouzi`$+&Me_)2V(dbWX*bD9wpu(< z3|*DN0DwWif$SRgF&BW2hDiohQ~UmUKkBS zWq+bjhK|)i4qd2DmL)@;lqYHGyC$gg5Ur>IooJSp@i<~7^guIU0iDlywqkLR>S>D7 z6<`1_^JV6TA)-q>0-ADNA0ssWACzI3h9*qnVG@~906u3@W53ExJP;)6V+?NArNUQ? z@40AwvMfxc=T8|nWxl|e#0t<$(cZg?;vp&rJo7gn$M}z*a zcsNRu)cDBA+;~YAgebt67G2W;5p!{ - - Index - - -

Index

-

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step1/src/subdir/something.html b/fmpp/docs/examples/qtour_step1/src/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/docs/examples/qtour_step1/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

Something else

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step2/config.fmpp b/fmpp/docs/examples/qtour_step2/config.fmpp deleted file mode 100644 index d9978be..0000000 --- a/fmpp/docs/examples/qtour_step2/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -data: tdd(data/style.tdd) \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step2/src/data/ignoredir.fmpp b/fmpp/docs/examples/qtour_step2/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/qtour_step2/src/data/style.tdd b/fmpp/docs/examples/qtour_step2/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/docs/examples/qtour_step2/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step2/src/falcon.png b/fmpp/docs/examples/qtour_step2/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 zcmV-f6Q=BmP)^VKz80DJCu>AQ}-A7(zfWdSqUjkbsJYZ@R*Q%)G9y zmWeGNAAxLcG$<}rQcO%gKQT2ib9#ZLwY@w(LqbYVc6m}FBQ0oENiQxQQfN_3Qa>p( zFD^JlU3OE~M5w%7m912dpG?R6BGLc=5*A5B zK~#9!U0DfxqD-@GKpG9=pwNI2*O-V~LdGSTtj_=cQ{Oq&WZwJSiVGU;)3u$dYSrd& zIBpi{PZ-jn-WJ z>5CtrL9f;btuem7WbYs1rjJh%3t}%sm)0HD8Sk=V+!dZ6@_^TPpX+m(cJb@C`1fiJ zMAgJ>*UxXOoP6Z_`X7e%^~a}pg91&S+KX1i6d&^CU;jnU|M9N4r(N*JIec~fXjc#z z3u52;XhGnne-Q27zCZtqPiqyck9EvdRuZlL(h=f`Co$8{$^v2cuhur62ttp-6Ibif z>%S<)`eOJ`M(7n=eEN_zpbA#QZm#n3>7Os&+x5A70YMV9_WH8^<|lr%`6bo{f;Aa( z4Icj$|HyC{0pr)__fJNA{1c1uw0;zyY}OV~0-%MF++|>XTE~mX>c8S4{^Hn$ctaO& zFxO$c>-AH-@Y(wQ=_k6VfS8N7^=9*vh3_Aq?Xpnhv&H!3##qw@2KFD}K8!rijeuw^ zX?OJb**aVT^+(ipE6KR|Pac1=K=dHU=f|hp+Q%ct&`YAk6PUzO za@lU{bqjJhv?%|Akve?}f(rm5Kn>R&y1+>iuPBOyFmMe$_Wdu81!ess>T)?YB;Xnx zd^`f>V9h3>@J^kGfIZ_zp{2OEuYF(czV9U7ko)=k=M0O2zG3z9j|_xPHRhAfYB$aoQKBBz>)nQVJ#;+}_@D^S8p}x7N@5{SHg2S9rcTT~5ue zu6N=besX){^V9u(97k9OW=RI{1_F4{hjGlC%1J? z6V>&8-yC0G&&_Txjt2slKM{!_HT*)&c80d{`qM1!L2hn(X`W`rcu}PBqmvpbWPrV`+mPBdr{n3=G*}moKUg~nQVoHJ0J3;l#rHt*`f2Z`RMqn4=Fju<^WC3G zH!UkuQYxdWstnCwFc|i;DPW?N7JcT`re`APSXbm@x?ZQ$|7!zidGp_4agrxitHF z*Fcko2(T8FIBW^w#4W~sJnj@7fV};=`BOeWZ=EqvCRV6Xo{Kt}Ny8{v4C4g) z)OEY$p80qSJ#-$%Z*N$h zYC!UwATU~`t2{8-Vqv0zI7KLae>gCB7YYvFA+Dgpe0M(2AAVayEvx(A)I(S5x%2RL zN02{&dw5{nmiZkqQlt)W0M_l6#!PjVB;j;XGwaEa`@Mkd00QIfaRrdw+#d^wJdELS zrK)G>!tlD82nOQ0Dxtu#o8phUv={=KP*nvY*e3F+59@ z-?%}OXE4|E+gtJWTp_j~Z*R}g!wT(nw`?!+CGKS!A}_O=DQRo%5qWHWe*i~U+3ZQs(mv@;Y*uG7cJEB-rWr8%SbXW5_u00 z2kX2c8Cn@*T@;hIw+i`C-901ouw&*3cFtvObmb`o*MT-!&@F=yu1A@LZw{=5dtqT{ zbh^9(1p6)To)NV_C=UdAdsEM)M3byYDFexN@}ykIyMWK~42lNfw%L=6Q856vrccPh zVzmVlc-gHGv@}1FkRosjq>>;)V!%YmJyn5;wNSBA89)N@zl1ezw{1Q`4<@}rA!&$l zJ|E97_}FCmti%BYu*N_k0vNYqN{~lN)X6D|ASPP>>q|hgSW1pdN<2KEMJbqzlWxxXf$bX-IyKOP2qjIUa#hMvaDGmnNmH=F zXf|84su1R+V7${SF<)O7VQ-R`%j(T39ET5u(?NnW;9$nmR9Uvr$-qm9f_4IR7~PVl z#r!I_nUV|T%);sRB5pyUKOPnOMqs?~{u1_jVLn*~<$`gro3B=mtMW+~=|~;(YN32# zK^At;9S#QGpzmqrE7O{5S>^zl^#Z-!qBq&HA~stkh4FMI#>=ADTR?Dym*+VsbMEMT z)I(LAOnQ@vLUs2da7QxDR1&%Dz0tHLg;yv6St3c&bTsPq;Cgnyr^^|SN>Y6XKE41X z=q+};7b~`T0XgTr9uU|{++dl|L9;!KT}OG*fE^iHy}tI1CCYq>W+NRQQ04p*P${C&hC3nW`GO#n9z9bUO%zN(E(est_Xk54ePmT) zea{aW!js8t2G_q{z`Gzxby&mn3kx$}K_jsheR7hXi3I?DX;B0wM{k9lK*VBnZ>gM!v#A6A zs^pddCHBfu4kAW`rQrZgD`vL?i`JU^2Mmmd>1W$ul0fap-|4W~i@WHWl`{_rLsjx1 z$PH4wqPYsdRNw-<4*UqMK{u#?(aphMgIb1%{a&H{-fU`;B{;bT!<-}z_9squP_;RW z{~br8nVisSIUts%Kwy=nAAwOyVNFx!rSGY{SB|=QFYN~5U|SR7a8P@yRCAU)a8cHn zz5SP%lidxRH5hO>$a(@Z=>`5`fl(oHz?Wz?P)$m7`5EfG290)mc@LaCGYe@^nw?@{ zvD7bZ>J|eeF>GM4+1T$fVGQ~lw{(Tzq%z%!=GF^0(m|>4eo4m|60!kN_JVG@$ii^3 zoA2pbC9J}pqB*vLq73+2+CS)WSU=rjYEKFdx;a6hiOMwi-Bg9^7D{=ZZ%h$ke1vDx zpxaAlNZD|@sOxu|3q>GVxiSstvw5P%Sz>6?da}`l#VpO2Ztnf?t zMxn2Ff#B<+fHHvuSDnT!fji=J8dC%R;a~uh+Xcia@;u0#*!0vJB9g zW|dRqUG3?zL~=qS4b(ErOqPxUBy51Hg19+13XKY=k_`(yfp7+^yu6-Q94uQ5@O=~y zy~uGfW>XcSEYX#q=;{Ihu2%u2KwV)^oaqpJpJ$n8!Vs-JL0-gAoKCPNrf#XlE8Aic zW3yiPnC!qGgRf@(R7H<5VS8$x%~)fqqE~ zNV7*vWEuF<$iXcWaW4%yBYCHtPAAX2d)MKylPeap7!ziAfx9VzQaXMaV3t?N{VWZz z5%d>^PLYIAGWs$G7)sdq4+wcnql++sap6@L7;fRkZlo+qS>*<{GHf+eQ28Ji&`Sjk z;E--_S%#?zQB-I!3_<(7ZH2cq*Fm0SOh)ZSLxeE#qA{ccW^%{l!mIL>B?Ik|j|>k` zko_ed5qv7h18IyRA@Y}GsZkr@SrOm z!)!W5MF*=Rco&YzE6`Yghfb$}@t{XQkX{~)Mz9x3)n2u~I5bB%dP`IBwA*ob*5RX9 zEluA;J?i*{ANgYxCRd}rYh+=h5z)}nWbBAd(Gl8*&)E*MYz66TiF~YAYek6Tc2nB{ zUQBh1FN60Wold2bqB90PIX(->xD%^*>@slSsK~2OyTD@TPfdZ21+y2FK+@xBl%})p zY_Ypu>u6ajOQve z4W(C9!-eD|5~A=!na^y~&8}c8_-yuTd}x5&Mz)SzUg3Sg+@$9K;nq^%x8mk#b$9 z@@49Fil}nqNL+#qAS;YhEd%TZ?Khf)Rm4^C>||0Zi%}Z``R_ebCw|C4xmf{`bvWl`z1JLVgV-I9{iJs z=xWvB=hvnU+PsB$n>m7l-XD0=j5JY3ag1Kh?ZhrBZj5wP=pPC&Jxjb{0j@YW$aIr; zr9Sr<#3SQI3&$P&_+*1boL801W)*l&XPEtU7NpPv-i}cgQB~YhkK=Ldg4i7otr7O1 zK=mch56I44o*xio0-ul40Z;ewJ=HQ*J=Zd4DrWB@TSWaSyqRU0qdSZ!f*=)3HRb`8 zkA~69W&jDY5V^;p)DDc@k(D$br95+uU482+G9iV7pdg^(z$`e#2m)(mXsA0#ZMW0$ zF-WRP$*EyfmL3|F0E7-@W$vBWx(pd1?-2(PWJy2E ziU{@_D=@uVA?s0;c>D=_f#-+5oOfE@rMoRguQ!{8uyxkW6S&fKRX`VO0iYIa1E@)6 zre+#t*o$AH$*sU!9)bul<;O93U)_O&$C8B$f=ouzi`$+&Me_)2V(dbWX*bD9wpu(< z3|*DN0DwWif$SRgF&BW2hDiohQ~UmUKkBS zWq+bjhK|)i4qd2DmL)@;lqYHGyC$gg5Ur>IooJSp@i<~7^guIU0iDlywqkLR>S>D7 z6<`1_^JV6TA)-q>0-ADNA0ssWACzI3h9*qnVG@~906u3@W53ExJP;)6V+?NArNUQ? z@40AwvMfxc=T8|nWxl|e#0t<$(cZg?;vp&rJo7gn$M}z*a zcsNRu)cDBA+;~YAgebt67G2W;5p!{ - - Index - - -

Index

-

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step2/src/subdir/something.html b/fmpp/docs/examples/qtour_step2/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/docs/examples/qtour_step2/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

Something else

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step3/config.fmpp b/fmpp/docs/examples/qtour_step3/config.fmpp deleted file mode 100644 index 0957840..0000000 --- a/fmpp/docs/examples/qtour_step3/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step3/src/data/birds.csv b/fmpp/docs/examples/qtour_step3/src/data/birds.csv deleted file mode 100644 index 3105e8c..0000000 --- a/fmpp/docs/examples/qtour_step3/src/data/birds.csv +++ /dev/null @@ -1,4 +0,0 @@ -name;description;favoriteFood -arctic-tern;Flies very long distances all years.;sardine -house-sparrow;Don't you say you don't know it...;sunflower -sakeret;Great hunter of the sky.;pigeon \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step3/src/data/ignoredir.fmpp b/fmpp/docs/examples/qtour_step3/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/qtour_step3/src/data/style.tdd b/fmpp/docs/examples/qtour_step3/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/docs/examples/qtour_step3/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step3/src/falcon.png b/fmpp/docs/examples/qtour_step3/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

Index

-

Birds: -

    - <#list birds as bird> -
  • ${bird.name?cap_first}: ${bird.description} - Favorite food: ${bird.favoriteFood} - -
-
-

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step3/src/subdir/something.html b/fmpp/docs/examples/qtour_step3/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/docs/examples/qtour_step3/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

Something else

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/config.fmpp b/fmpp/docs/examples/qtour_step4/config.fmpp deleted file mode 100644 index 0957840..0000000 --- a/fmpp/docs/examples/qtour_step4/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/src/bird.html b/fmpp/docs/examples/qtour_step4/src/bird.html deleted file mode 100644 index 670719a..0000000 --- a/fmpp/docs/examples/qtour_step4/src/bird.html +++ /dev/null @@ -1,16 +0,0 @@ -<@pp.dropOutputFile /> -<#list birds as bird> -<@pp.changeOutputFile name=bird.name+".html" /> - - - ${bird.name?cap_first} - - -

${bird.name?cap_first}

- -

${bird.description}

- -

Favorite food: ${bird.favoriteFood}

- - - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/src/data/birds.csv b/fmpp/docs/examples/qtour_step4/src/data/birds.csv deleted file mode 100644 index 3105e8c..0000000 --- a/fmpp/docs/examples/qtour_step4/src/data/birds.csv +++ /dev/null @@ -1,4 +0,0 @@ -name;description;favoriteFood -arctic-tern;Flies very long distances all years.;sardine -house-sparrow;Don't you say you don't know it...;sunflower -sakeret;Great hunter of the sky.;pigeon \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/src/data/ignoredir.fmpp b/fmpp/docs/examples/qtour_step4/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/qtour_step4/src/data/style.tdd b/fmpp/docs/examples/qtour_step4/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/docs/examples/qtour_step4/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/src/falcon.png b/fmpp/docs/examples/qtour_step4/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

Index

-

Birds: -

-
-

- - \ No newline at end of file diff --git a/fmpp/docs/examples/qtour_step4/src/subdir/something.html b/fmpp/docs/examples/qtour_step4/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/docs/examples/qtour_step4/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

Something else

- - \ No newline at end of file diff --git a/fmpp/docs/examples/session/config.fmpp b/fmpp/docs/examples/session/config.fmpp deleted file mode 100644 index 013c036..0000000 --- a/fmpp/docs/examples/session/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -turns: turn(2, index.html) \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/01_foo.html b/fmpp/docs/examples/session/src/01_foo.html deleted file mode 100644 index 078bb05..0000000 --- a/fmpp/docs/examples/session/src/01_foo.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Foo"> - -

Blah blah blah - - \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/02_bar.html b/fmpp/docs/examples/session/src/02_bar.html deleted file mode 100644 index d7f4607..0000000 --- a/fmpp/docs/examples/session/src/02_bar.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Bar"> - -

Blah blah blah - - \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/03_baaz.html b/fmpp/docs/examples/session/src/03_baaz.html deleted file mode 100644 index d942675..0000000 --- a/fmpp/docs/examples/session/src/03_baaz.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Baaz"> - -

Blah blah blah - - \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/04_wombat.html b/fmpp/docs/examples/session/src/04_wombat.html deleted file mode 100644 index 81b1ae6..0000000 --- a/fmpp/docs/examples/session/src/04_wombat.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Wombat"> - -

Blah blah blah - - \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/include/ignoredir.fmpp b/fmpp/docs/examples/session/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/session/src/include/page.ftl b/fmpp/docs/examples/session/src/include/page.ftl deleted file mode 100644 index 25fdcfb..0000000 --- a/fmpp/docs/examples/session/src/include/page.ftl +++ /dev/null @@ -1,17 +0,0 @@ -<#escape x as x?html> - -<#macro page title> - <#if !pp.s.contents??> - <@pp.set hash=pp.s key="contents" value=pp.newWritableSequence() /> - - <@pp.add seq=pp.s.contents value={"link":pp.outputFile, "title":title} /> - - ${title} - - -

${title}

- <#nested> - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/session/src/index.html b/fmpp/docs/examples/session/src/index.html deleted file mode 100644 index e9c3c5a..0000000 --- a/fmpp/docs/examples/session/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ -<#escape x as x?html> - -Index - -

Index

- <#assign pages = pp.s.contents?sort_by("link")> - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/tdd/config.fmpp b/fmpp/docs/examples/tdd/config.fmpp deleted file mode 100644 index 1fb8ea0..0000000 --- a/fmpp/docs/examples/tdd/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: tdd(data/test.tdd) \ No newline at end of file diff --git a/fmpp/docs/examples/tdd/src/data/ignoredir.fmpp b/fmpp/docs/examples/tdd/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/tdd/src/data/test.tdd b/fmpp/docs/examples/tdd/src/data/test.tdd deleted file mode 100644 index ffefb40..0000000 --- a/fmpp/docs/examples/tdd/src/data/test.tdd +++ /dev/null @@ -1,7 +0,0 @@ -user:"Big Joe", -tall -animals:[ - {name:"white mouse", price:30}, - {name:"black mouse", price:25}, - {name:"green mouse", price:150} -] \ No newline at end of file diff --git a/fmpp/docs/examples/tdd/src/index.html b/fmpp/docs/examples/tdd/src/index.html deleted file mode 100644 index 4e8efb2..0000000 --- a/fmpp/docs/examples/tdd/src/index.html +++ /dev/null @@ -1,10 +0,0 @@ -

Hello ${user}!

- -

Our offers: -

    - <#list animals as animal> -
  • ${animal.name?cap_first} for ${animal.price} credits - -
- -

Note that we know that you are <#if !tall>not tall, ${user}.

\ No newline at end of file diff --git a/fmpp/docs/examples/xml/config.fmpp b/fmpp/docs/examples/xml/config.fmpp deleted file mode 100644 index a095251..0000000 --- a/fmpp/docs/examples/xml/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {doc: xml(data/test.xml)} \ No newline at end of file diff --git a/fmpp/docs/examples/xml/src/data/ignoredir.fmpp b/fmpp/docs/examples/xml/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/xml/src/data/test.xml b/fmpp/docs/examples/xml/src/data/test.xml deleted file mode 100644 index 4375656..0000000 --- a/fmpp/docs/examples/xml/src/data/test.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - Preface blah blah... - And preface blah blah... - - - Blah blah blah... - And blah blah blah... - - - Foo blah blah... - And foo blah blah... - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml/src/test.html b/fmpp/docs/examples/xml/src/test.html deleted file mode 100644 index 66b913c..0000000 --- a/fmpp/docs/examples/xml/src/test.html +++ /dev/null @@ -1,7 +0,0 @@ -

${doc.book.@title}

-<#list doc.book.chapter as ch> -

${ch.@title}

- <#list ch.para as p> -

${p}

- - \ No newline at end of file diff --git a/fmpp/docs/examples/xml2/config.fmpp b/fmpp/docs/examples/xml2/config.fmpp deleted file mode 100644 index fa29ced..0000000 --- a/fmpp/docs/examples/xml2/config.fmpp +++ /dev/null @@ -1,7 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - prodXml: xml(data/products.xml, {index: {element: product, value: '%n'}}) - manuXml: xml(data/manufacturers.xml) -} \ No newline at end of file diff --git a/fmpp/docs/examples/xml2/src/data/ignoredir.fmpp b/fmpp/docs/examples/xml2/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/xml2/src/data/manufacturers.xml b/fmpp/docs/examples/xml2/src/data/manufacturers.xml deleted file mode 100644 index d1db011..0000000 --- a/fmpp/docs/examples/xml2/src/data/manufacturers.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - Foo Incorporated -
3 Traktor Road, Budapest, 1234, Hungary
- 45-456-7461 - http://www.foo.hu/ -
- - Acmee Incorporated -
5 Kili Street, Tarawa, Kiribati
- http://www.acmee.com/ - bounche@acmee.com -
- - Batman International -
77 Cash Square, Palo Alto, California 94531, U.S.A
- 07-798-456-985 - http://www.batmaninternational.com/ - devnul@batmaninternational.com -
-
\ No newline at end of file diff --git a/fmpp/docs/examples/xml2/src/data/products.xml b/fmpp/docs/examples/xml2/src/data/products.xml deleted file mode 100644 index a389a11..0000000 --- a/fmpp/docs/examples/xml2/src/data/products.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - K8 Widget - 500 - Foo Incorporated - This is a standard widget with highly durable thingamy. - - - Giant/S2 Widget - 2500 - Acmee Incorporated - This is an extra-large widget. - - - Micro Widget - 800 - Acmee Incorporated - This widget can even fit into your suitcase. - - - CXC Widget - 350 - Batman International - I have no idea... this is just a stupid example, OK? - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml2/src/index.html b/fmpp/docs/examples/xml2/src/index.html deleted file mode 100644 index 1953250..0000000 --- a/fmpp/docs/examples/xml2/src/index.html +++ /dev/null @@ -1,19 +0,0 @@ -<#escape x as x?html> - - - Product Catalog - - - -

Product Catalog

- -

The available products are: - -

    -<#list prodXml.products.product?sort_by('name') as p> -
  • ${p.name} - -
- - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml2/src/product.html b/fmpp/docs/examples/xml2/src/product.html deleted file mode 100644 index b40cf35..0000000 --- a/fmpp/docs/examples/xml2/src/product.html +++ /dev/null @@ -1,36 +0,0 @@ -<@pp.dropOutputFile /> -<#list prodXml.products.product as p> -<@pp.changeOutputFile name="product_${p.@id}.html" /> -<#escape x as x?html> - - - ${p.name} - - - -

${p.name}

- -

Price: $${p.price} - -

Description: -
${p.description} -

- -

Manufacturer: -
Name: ${p.manufacturer} -<#assign m = manuXml.manufacturers['manufacturer[name="${p.manufacturer}"]']> -<#if m?has_content> - <#if m.address?has_content>
Address: ${m.address} - <#if m.phone?has_content>
Phone: ${m.phone} - <#if m.homepage?has_content>
Homepage: ${m.homepage} - <#if m.email?has_content>
Email: ${m.email} -<#else> - <@pp.warning message="Referenced manufacturer not found: ${p.manufacturer}" /> - - -


-Back... - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/config.fmpp b/fmpp/docs/examples/xml_rendering/config.fmpp deleted file mode 100644 index 21fc6ef..0000000 --- a/fmpp/docs/examples/xml_rendering/config.fmpp +++ /dev/null @@ -1,19 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -xmlRenderings: [ - { - ifDocumentElementIs: product - template: renderer/product.html - } - { - ifDocumentElementIs: book - template: renderer/book.html - index: { - element: [part, chapter] - attribute: ppFile - numbering: hierarchical - value: '%e_%n.html' - } - } -] \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/bigwidget.xml b/fmpp/docs/examples/xml_rendering/src/bigwidget.xml deleted file mode 100644 index 72b8a0d..0000000 --- a/fmpp/docs/examples/xml_rendering/src/bigwidget.xml +++ /dev/null @@ -1,8 +0,0 @@ - - big widget - $15 - - This is an extra large widget, manufactured with a technology - developed by the NASA. - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/example1.xml b/fmpp/docs/examples/xml_rendering/src/example1.xml deleted file mode 100644 index f37601d..0000000 --- a/fmpp/docs/examples/xml_rendering/src/example1.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - -

This is an example "book" that demonstrates FreeMarker and FMPP.

-
- - - -

A paragraph with emphasized and marked sections.

- - A quotation with emphasized and marked sections. - -

A emphasized section with a marked section in it.

-
- - -

Blah...

-

Blah blah...

-
-
- - -

Blah blah blah...

-

Blah blah blah blah...

-
- - -

Blah blah blah blah blah...

-

Blah blah blah blah blah blah...

-
- - -

Blah blah blah blah blah blah blah...

-

Blah blah blah blah blah blah blah blah...

-
-
-
\ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/example2.xml b/fmpp/docs/examples/xml_rendering/src/example2.xml deleted file mode 100644 index d63a0b9..0000000 --- a/fmpp/docs/examples/xml_rendering/src/example2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - -

Yet another example book.

-
- - - -

So you have seen that you can have more books...

-
-
-
\ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/index.html b/fmpp/docs/examples/xml_rendering/src/index.html deleted file mode 100644 index 8154588..0000000 --- a/fmpp/docs/examples/xml_rendering/src/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - XML rendering example - - -

XML rendering example

-

The "books": -

-

The "products": -

- \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/normalwidget.xml b/fmpp/docs/examples/xml_rendering/src/normalwidget.xml deleted file mode 100644 index fcb0753..0000000 --- a/fmpp/docs/examples/xml_rendering/src/normalwidget.xml +++ /dev/null @@ -1,7 +0,0 @@ - - normal widget - $5 - - This is a standard widget, with great quality pink painting. - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/renderer/book.html b/fmpp/docs/examples/xml_rendering/src/renderer/book.html deleted file mode 100644 index 8c155ae..0000000 --- a/fmpp/docs/examples/xml_rendering/src/renderer/book.html +++ /dev/null @@ -1,155 +0,0 @@ -<#-- -Renders a "book" XML to multiple HTML files. -This is a rather complex stuff... check the product.html first. ---> -<#escape x as x?html> -<@pp.dropOutputFile /> - -<#-- Calculating the prefix of output file names --> -<#assign prefix = pp.sourceFileName> -<#assign prefix = prefix?substring(0, prefix?last_index_of('.'))> -<#assign prefix = prefix + '_'> - -<#-- Calculate the ordered list of HTML pages, used for the nav. bar. --> -<#assign pages = pp.doc["//*[@ppFile != '']"]> - -<#-- Render the HTML pages --> -<#recurse pp.doc> - - -<#-- - *********************************************************************************** - Node handlers - *********************************************************************************** ---> - -<#macro book> - <@pp.nestOutputFile name="${prefix}index.html"> - <@Html title="${.node.@title}"> -

Table of Contents

-
    - <#list .node.part as part> -
  • ${part.@title} - <#local cs = part.chapter> - <#if cs?has_content> - - - -
- <#recurse> - - - - -<#macro part> - <@pp.nestOutputFile name=prefix+.node.@ppFile> - <@Html title="${.node.@title}"> - <#local cs = .node.chapter> - <#if cs?has_content> -

Part Contents

- - - <#recurse> - - - - -<#macro chapter> - <@pp.nestOutputFile name=prefix+.node.@ppFile> - <@Html title="${.node.@title}"> - <#recurse> - - - - -<#macro p> -

<#recurse>

- - -<#macro quote> -
<#recurse>
- - -<#macro e> - <#recurse><#t> - - -<#macro mark> - <#recurse><#t> - - -<#macro @text> - ${.node}<#t> - - - -<#-- - *********************************************************************************** - Other macros - *********************************************************************************** ---> - -<#macro Html title> - - - ${title} - - - <@NavBar /> -
-

${title}

- <#nested> -
- <@NavBar /> - - - - -<#macro NavBar> - <#local nodeName = .node?node_name> - <#if nodeName == 'book'> - Prev | Up | Next | ToC | Home - <#else> - <#local ppFile = .node.@ppFile> - <#local max = pages?size - 1> - <#list 0..max as i> - <#if pages[i].@ppFile == ppFile> - <#local idx = i> - <#break> - - - <#if idx != 0> - Prev<#t> - <#else> - Prev<#t> - - | - <#list .node?ancestors as a> - <#if a.@ppFile[0]??> - Up<#t> - <#break> - <#elseif a?node_name == 'book'> - Up<#t> - <#break> - - - | - <#if idx != max> - Next - <#else> - Next<#t> - - | - ToC | Home - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp b/fmpp/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/xml_rendering/src/renderer/product.html b/fmpp/docs/examples/xml_rendering/src/renderer/product.html deleted file mode 100644 index 832fb06..0000000 --- a/fmpp/docs/examples/xml_rendering/src/renderer/product.html +++ /dev/null @@ -1,20 +0,0 @@ -<#-- -Renders a "product" XML to a HTML files. ---> -<#escape x as x?html> -<@pp.renameOutputFile extension="html" /> -<#assign prod = pp.doc.product> - - - Product: ${prod.name?cap_first} - - -

${prod.name?cap_first}

-

Price: only ${prod.price} -

Description:
- ${prod.description} -


- Back... - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_rendering/src/smallwidget.xml b/fmpp/docs/examples/xml_rendering/src/smallwidget.xml deleted file mode 100644 index d23985c..0000000 --- a/fmpp/docs/examples/xml_rendering/src/smallwidget.xml +++ /dev/null @@ -1,8 +0,0 @@ - - small widget - $10 - - Always wanted a small widget, but never found it? - Now, then this one is for You! - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_try/config.fmpp b/fmpp/docs/examples/xml_try/config.fmpp deleted file mode 100644 index 735bdd4..0000000 --- a/fmpp/docs/examples/xml_try/config.fmpp +++ /dev/null @@ -1,12 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - doc:xml( - data/test.xml - { - removeComments: false - index: {element: [part, chapter, para], value: '%n'} - } - ) -} \ No newline at end of file diff --git a/fmpp/docs/examples/xml_try/src/data/ignoredir.fmpp b/fmpp/docs/examples/xml_try/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/xml_try/src/data/test.xml b/fmpp/docs/examples/xml_try/src/data/test.xml deleted file mode 100644 index 24836d7..0000000 --- a/fmpp/docs/examples/xml_try/src/data/test.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - A - - - - A - B - - - A - B - - - - - A - B - C - - - A - B - C - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_try/src/index.html b/fmpp/docs/examples/xml_try/src/index.html deleted file mode 100644 index 8b5883a..0000000 --- a/fmpp/docs/examples/xml_try/src/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - XML Tree Dump - - <@pp.setOutputEncoding encoding="UTF-8" /> - - - -

XML Tree Dump

- -<@dumpXml doc /> - -

Legend: -

    -
  • <foo bar="123">: Element node -
  • "Blah blah": Text node -
  • <?foo bar ?>: Processing instruction node -
  • <!-- Blah blah -->: Comment node -
  • foo: Other node -
- - - -<#function showXmlSource s> - <#return s?xml?xml?replace(" ", r" ")?replace('\n', '&#xA;')?replace('\r', '&#xD;')> - - -<#-- -Prints an XML node tree as colored HTML. ---> -<#macro dumpXml node> -
    - <@dumpXml_internal node /> -
- - -<#macro dumpXml_internal node> - <#local type = node?node_type> - <#if type == 'element'> -
  • <<#rt> - <#if node?node_namespace?? && node?node_namespace != ''> - '${node?node_namespace}':<#t> - - ${node?node_name}<#t> - <#list node.@@ as att> - ${' '}<#t> - <#if att?node_namespace?? && att?node_namespace != ''> - '${att?node_namespace}':<#t> - - ${att?node_name}="${showXmlSource(att)}"<#t> - - ><#lt> - <#elseif type == 'text'> -
  • "${showXmlSource(node)}"<#lt> - <#elseif type == 'pi'> - <#local nodeName = node?node_name> -
  • <?${nodeName?substring(4)} ${showXmlSource(node)}?><#lt> - <#elseif type == 'comment'> -
  • <!-- ${node} --><#lt> - <#else> -
  • ${node?node_type}<#lt> - - <#if node?children?size != 0> -
      - <#list node?children as c> - <@dumpXml_internal c /><#t> - -
    - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_validating/config.fmpp b/fmpp/docs/examples/xml_validating/config.fmpp deleted file mode 100644 index 96ec9ec..0000000 --- a/fmpp/docs/examples/xml_validating/config.fmpp +++ /dev/null @@ -1,8 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - doc: xml(data/test.xhtml) -} -xmlCatalogFiles: dtds/catalog.xml -validateXml \ No newline at end of file diff --git a/fmpp/docs/examples/xml_validating/dtds/catalog.xml b/fmpp/docs/examples/xml_validating/dtds/catalog.xml deleted file mode 100644 index c180196..0000000 --- a/fmpp/docs/examples/xml_validating/dtds/catalog.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_validating/dtds/xhtml-lat1.ent b/fmpp/docs/examples/xml_validating/dtds/xhtml-lat1.ent deleted file mode 100644 index ffee223..0000000 --- a/fmpp/docs/examples/xml_validating/dtds/xhtml-lat1.ent +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/docs/examples/xml_validating/dtds/xhtml-special.ent b/fmpp/docs/examples/xml_validating/dtds/xhtml-special.ent deleted file mode 100644 index ca358b2..0000000 --- a/fmpp/docs/examples/xml_validating/dtds/xhtml-special.ent +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/docs/examples/xml_validating/dtds/xhtml-symbol.ent b/fmpp/docs/examples/xml_validating/dtds/xhtml-symbol.ent deleted file mode 100644 index 63c2abf..0000000 --- a/fmpp/docs/examples/xml_validating/dtds/xhtml-symbol.ent +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd b/fmpp/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd deleted file mode 100644 index 1b99c61..0000000 --- a/fmpp/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd +++ /dev/null @@ -1,1201 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/docs/examples/xml_validating/src/data/ignoredir.fmpp b/fmpp/docs/examples/xml_validating/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/docs/examples/xml_validating/src/data/test.xhtml b/fmpp/docs/examples/xml_validating/src/data/test.xhtml deleted file mode 100644 index f73cf96..0000000 --- a/fmpp/docs/examples/xml_validating/src/data/test.xhtml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Test - - - -

    Test

    -

    p1

    -

    p2

    -

    p3

    - - - \ No newline at end of file diff --git a/fmpp/docs/examples/xml_validating/src/test.txt b/fmpp/docs/examples/xml_validating/src/test.txt deleted file mode 100644 index be308fa..0000000 --- a/fmpp/docs/examples/xml_validating/src/test.txt +++ /dev/null @@ -1,16 +0,0 @@ -<#ftl ns_prefixes={'D':'http://www.w3.org/1999/xhtml'}> -<#-- Note: Prefix D is a reserver in FreeMarker, and stands for Default --> - -Title: -${doc.html.head.title} - -Paragraphs: -<#list doc.**.p as p> -- ${p} - - -Paragraphs where class is "foo": -<#-- Note that in XPath expressions you must use explicit prefix --> -<#list doc['//D:p[@class="foo"]'] as p> -- ${p} - \ No newline at end of file diff --git a/fmpp/docs/figures/fmpparch.png b/fmpp/docs/figures/fmpparch.png deleted file mode 100644 index fbfe283a30b8694ead62fe5e038dbb4964d110d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8093 zcmb7pXE+?tv$trg?&{s@B?zLdwjnx+-V-IFlND{Ti`7{*2ob$TZ>vX%5>X?fBwC`Z z-h$ObaQ*Ld@B4mxpXdE>&YUtc=X{tsGru{p26~#5WGrNOczBfBT53jkc=({Z@jnuR zyMEBF6?jJgaBW?6z>j;B3CCuB~nkVXFhm%qTK&!_bOKw-rg+|IxFicr=`Uw#Ala~h?t+JXJCXnIx53p?#<1P<>gUf zLHzvuKp?GdXsA(aEE^kN@Z_XtN5|mcU~6lu$y3$3x_TiYh@G9C_bZ2IFP~XhSm;~n zM@L0f%>29*V8sme564H{P~z>X$`|hLT(eWPHq=h}yxJAwG?bK$5#sIZ={|p=`fG4d zPEL8Zq3#Ioeg&1hrYG4P8TwO@b8cmFCCs_q{&92s`(Ea|b5mU$(&rK)%&o=E2jRP4 zc3Pb!jyFWV-BN5+wK57l>_b{fP5~P$elw4>oW@qMPIO`?@ z(a0kTdUJYGe$wsU?#cSP-LhiM)(5%#pf5~hW;y(y)q$rGsQtHzYrI4T7~$~X00#xy zG;T(j)&~di(Wh>9DT#3{1~krDd_{H)$XKopZ5j?Sj{6VT3Ws(x(R!@n@o-n2D$x;Z&K)6-FrQ-=u1KHz~$ z2pB{8tyBb^HTb=C1p*BPV$As7Tl3`D@>v-_X@c<#`3ua23vb3fxXF;Xb>(uleePgw zstJ`Ub>O-+V!90#nn2x;wG!|2;zycEZYD~lJ4k+bB~e-l(nNk*{ZzgrJKa~@Z7;Tk_Fg^q*GBxemtkHyi>^M%{1Zu`YfETw5#mtsJ#d{OHK$`{sbqif*G&;rb{`}6L zdH8Z*;dmQ)9~M_{A=1UKt2U^iDGH>dh(5EH`?2n5@zDacSjyThBkTE6miieFQ5zlW zQ;K{LrA_-;0D5p+!2WshrM#Qy3rcH}q;$N<{3_fz7AsVG8xkuf{%(hrbUI!!;_R{R3i(iiabXoq9@=#;;F(ZOADT65I*N7*y{m z_BR8|IC5PpF57{TU9VqJr@UBYBnFA|j%eqatJJ+wAW&tAE$lV7aBPCEeS#poBA&)t z#o3Tp+uxK-?d*QM%qmXrt;G4fw`jwDxRh5_?ccB-u`1Jes;vg!+S%0;cyj7yyk$2b z_nwy){%Feb3Alhko=tuO-fmKsMcm!?Ca5tUFz!#>k*k-zW4sjRQ7t^hfJ#v_;nY}o=fS8)}?h#Nso4)kIzXs(ZJ;cSJSvWb!QD zOTr19!CB!u$ZD-vWrYeDlF*KN?RtwZJAEnwB3`x`196*L3@Ra36Ck6L;_sM#2fIm zUlnSz34d-HmNjkuebnvE2aUm0$*CWquKV|yL0)Edvo%>XnE(^1tc4L1v0~bic*QY_$m{u5E_>{g(&VXa z(`_MBuX;l$Mp>ez(qX@kc$>|K6K1+(n-|H^t6uTD$5hA&vG>KF8FVI;kIJ~GDGuqV zhmPtye)>M_vdz!Bl))mZMkAOiHS#&k*US6CId>$4w;i1982Ka0>Mc&3_ z{A!|=WMF2G?H?TYTz^5rmZ;gcx_a_`R?Axi%*slsulBZ-RUs=YkXN&m138>G8g8#4S!-%vuGxNkA2t^T0{Ed~YRjYbFxX?}3o_ zPju9|CE;moukFV)oZj+GQ3**y@^y67?WbaY=!i(ai_?qhlbo2Cb2xwt$?4WS7JB#y zKjmyvS*pSTPImSUy=n9p@v )q5pEl|wKs6Yf{j~h<8@buqzfs@eZXQ!Um?Jk{6T8QJoKU}L0*Aaji~c^a zGL>@Sz^$mrod4C@2D4N8X9wY4a>V^jRYXw^tj}+M?4!NRmAQV;8^{@xFIxa5$gqwxShyQ?AGGexK`)>{>=KlWO*6yVG@;)1V z&@f+mEq|gUe26#4WV3uP__&@~81zv5a5!z4ARs?Aqn>(JPKmg1{9oDI$LcU*B;Hr5 z{Dvd(dm2SD^x9d|b~M+inHE`StJmN9TV-?2Obfr>vVZ-m>fl%FABL{47#{xXm5SzN zU!}>*%ZV@h)A#T9ZwImUm#;;c2Mva|+q9cleHw>UVQ${9MPbb##An_dnS3?6a?KPe zq?Yc3Zh>iwPs#zPk_qp41x^O<`{`DGP?Wet+g2KhiF|2#-lwgEpVFDPGp#v#Wt9`V zNp+tXd9u!jXuw6rsZ+x$_4Lz7v!B0Z-5*)b2M_%$Y7D6F^=7R?sjmN?kb}R&VtRLE zJMv~4VWulWucEylCq+f)j{UW|JbRT?uP5SsQqxOa<`Ysuvss5J`YiX8BDk1t@kPbS zx3Iw$xm;e;+N`HZ?^ph0(zw6`n_}P5jlJ3}?Ij25^0gFf$q^aK$KQB^&aZQ%Y9W^K3HAUfO!WWAyf-V`F!7b7z0_%r5TaA#vsNM`2>)U#+72rItRG?95Qpn=pkECe7W)5Ta7As43sP-`trNiL9!!~qa@8pLU)p4hJbp2< z+%rl*TYiuy1$yCosh2UL@&e-Zv2XjzRtR*uppLu6qP4TrK zA!t^n6^19qNY;ZW*8z{^1l_Es+TOef_^W-f+s~MkkKE3@xe>_cbCz%<-9rNN*Z$H9 z*aXM1q|xd>@(srsWI~gtB6H-rmO>nq?jq%-j%mH3KfBi6o(ES2k;J%>|yR1 z2QEbtkJwdV#ls$ILI)BnuptEh6L@ppy$rBFyh{ddr8dsV*FKhX$~JI-SG8CVL&K;D zZntl4%1BoWix9I(__UAnqLff&o@KYOH&a_0iu!sYhn_T~+abgjxO>FcVod~O7A`QS z|7g#Aa72S3S(E$yJLEr#k0jT$NBUgLL!mf|hrR=m8>BC8eF*b+=~fFRkO(ryriXAso3CGNL~e>`B`Q&4CG& zjp7aJhn*YvfBxJz%tMvYtYkt1`s%x~_Le<8JH>K2?BReKUp$v_G+QeXTSboanZW z_2{+>oJ_Y0p+)qZy)qF7g`Cc`2)GaTBM^NX^4TYhA+F}5XWKks`g0*EM;pD{UdN6l zVnq8pmRYSYJEfBvu4+vY2tJL@g=&i5lQ z`u-n1`8ft6P?zBydwtVl;rpQ95yFrvLgOWZx%(sd``mMU-j)i#HydPw7Pl?EjDB@O zwo^mg%ts;HwNk)G9(>f%-sAk&SdKaRM%~L*DNu;rf#VyPul!f@jl$_Zhn?WK zKCJthjiZnB5#~=Gc)a+m6jtHe1VCPte>1Om0)}#Y4!=;$PHp)SK==9*+#zPf1%>~t z*6n5_`FF#jUr~XpmC#mlPg2CqJzfUE;;sru8%;?-t*;JjQiEj<59jsp9{s3q5BzJY z=#sR^dZC?d2MlhXL@ZBd;Bj2!N|((==p9r2J9OTQYuiCyv^AGy9z*H8rm9SS9vejF zZ1yTX1W$_&L>xaC16A^8v=xgg@rEL_3x2U(({hKEWCS*sXt;I6XVZ{t7X{@wcaGbRE?#v}ww~kz!hI(9Is2Bj7*lw;Gp(D3d<*A3U zbT-pSRT}X`6LCf;I-1jE+!#*u*@f&7udRGU8UKoKK@=>@UGoj$>8T{d$-6dco43U# zkWBPT;IV;qG~oFw+%tA)#xp%ZP@HYKvbs5?4ZW|9wdy-w(Q#31SCdpd!CHt7J~db z58lYox2NQFByDUeOT=&uH@Hy!6psOR2dh6U;GLo~WN?&B;1=>EY+y+`^bF@zVJ09> z$OC8+;wvXKosLh=Oxl*QrKwQ>Sq(_yjtQL}2)@p~RJE7AVkteL(%p`PcTvS_sYnH}XqX;Lydh%uBtbW z+4rNKiMI$+kgZ^N6&5R*->--1K_zcK0)LXHVC3(pc2+j_LiJqx6GAhx1hV#tG% z3hw2!yLqnp?vRS&i0H;90=$P<3;Vp@FK}SpoBsjo!T?6J>;8#Q`D9`9*+8fnAM+^( zK+im>19sqJuXw}C_C5kIbuttK6x*!ZHKPRa(M^ki@56bLsx7)L1|q;~g|jo9x0r%W z6ASI+T^g|>=fWO-z;t5kA>JEqu~=ev)zpG6(naESW+4QrJY{8}dCq#606r%#fGb&> zaqL5`~FXWqTHbcWBQffgTPys>3f5U`25G^Wnjgs6P~tI&@bdiv4w!j}XP zSS@!H`@zz`*};(E(u}G%0D_MCPyjH&DLGl>bM@}xZYRz0wWFF+J^vi zph@{(`(km}lT6~>)8oSdG;C56KfgiP?fg@S;qG}rP;=hvNoxuadGlq|`rB{eiZ^aZ zjIL5R$_4UO8p>9A%n1UAn0rC#OnRA^?q0)8)E2Lt^@z7yof8yB2>La@x@Z&|*#j&iceQ1(lC>lPfROc!zy&zg; zdzke)cE<3^GsN#kFwmLMixMR5P_p+JjA6eQc#Bz}4!n=~%3Z#)93Z-IYd>^J)=Xk! zH5SpFJ7NePoqG(+pmrd&uEiF{!)p#rTJ4K@&QzG*a%QvBRThr0aB|)^$^zsL$^Tn( zl&#)jf%#z4BpE{A#{xG(XSOiLy=-v(D{0=$8*KIMp$iMz=sU@Z8MqU04QOQ}Sg(2! zBUHws3>>VBmu(uSlGXlV#;*;@u8P2)AhcnWE~3_^BeGtj;C7iCv!w(9D6LIT3aZQD zaOR^PTIHSrA!p>r1I%zl&0<76V(X~vT@v8J*WT4uaC?!A`eu5kyYhvT zl;xxb67-JGGSZWYj0zvmMJvcUY#v}OmD38!0~xXHH~bZ<#lCdB2O_>8eQu!YlT`Qd zF^+o8chp4rdw&EsDPclX@;YXU-(@?;0GNrZzrtgVFAfJOceo^>A-NbpOY<1lcu^~2}7(jo&T$mWe zZdRyzNU1^>)KA3pRt;Yft?@nC_GNWp=j?0akn=%2bkZ+c-*MD6V;->an#(^)rp7~* zJtBtu;dhd&yYjmei4tiOvGar|%?YOt3HaFe<%wX); zHvjjaYN{)T{ImdnL=UbCHY>E%E26!S5 zTcBdLA9DdV<{vpVokI$yLUEmPSPMTh3@7SziLO=LG(&E}0)h}1qz9mXArJ`{f}jrz zhPN**dp(>w>tw-FK^+`RH;kqeoJIzcqs#*o&rBvGWE!A{YBFj$5Myfk394$JMD3Nh z#%NOt5c^sIvM=||oBV%U*zn`96KKE-!*!yrl|)I|WgQOhfar&YCA8>@FE9;(IFVH? z3a}4Y0Pwjhh+AY-dSFVs_(XaPv7-Tg^H-t|;+DhuV&SUvaRDbN?D2Qa;4TZWNux7m z%QgkxtaVaXk=y~TZ9$mHl)+;>c`X5Zj`Hhdk_$%s`{A1JafbudriV0T^8!kt3*R{Q z+NM_9b}@s;wRv|@5Pfij*xy5>K+;sQ0afzYmm z-;@K>k3O&U?q$+T_49c@9ZR*2dthLAv&TTV&k0E)&BHzH<(ey49NuMIKdSI$|0A$jJFcdP}Tc8 z1KeP;Q5Lg@(B-XRlqGP%Omn_d__(Kd@ZBADC@2_?F2$Zx9>$Yo6}d)t3YKG<<~(?Q zRY^)FDEnK(77cUIiRArL~|-d5)cLX(gl*ltjdX( zJDE-EMDl@B-3Yr1$_=iJ4X!#u!h=Y4an9BF&*e?Ds=WvY_c$g29OGcLnWJ@8bzA=Az znOGY>$4uzFq97}zC)Mv<#$peZtvgK!5pT4%R2+4PN{@yw!`?h^oc01QUSZsq4*Xa_ z?Ag~h5r3-~+YnSF474=4=csx!7tFJY2ZLTpWZx02>wuf_P1R)QT4l_rPwMB zn5pXpUrwW@m*L;qnOrFi(8 z2m1D&4SO4*A|73G^Zvh^2tWh+FiU+(8t_9 zSA2Kw5!S7JH`#y_gK45-e3^8l zdHxUc|H!KTjk%M(%S(NKS>I&~?(-Wbl+~L5TOxd?0Fs8FJ|*989mzrKW@kdo@@O`f bZwY>CGz6oSwj=I-4Dqzp_0(!rY{UNxl{7JZ diff --git a/fmpp/docs/figures/qtour_step1.png b/fmpp/docs/figures/qtour_step1.png deleted file mode 100644 index 7e37afa31129a401c3dbf2b538313df7b28b071f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3142 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 R2H^7!VsGnAePZpy|1Szr)HeVC diff --git a/fmpp/docs/figures/qtour_step1_src.png b/fmpp/docs/figures/qtour_step1_src.png deleted file mode 100644 index 14c11e8e36a9dc2243a4b1d6fd0f1321c879a4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1095 zcmV-N1i1T&P)WdKMZF*zV=VQwxUGB7YSATlyKGdVgmH6SZ6F)%PNHv?k;000McNliru z)BzO&2s#pt{ZIe^010qNS#tmYP9OjPP9OmmeVN_>000DMK}|sb0I`n?{9y$E003Z6 zOjJex|Nj600KmY&fPjGi|Nj7hfB*ph004l<$jIpE=={XQ=KuiqjEwN`@a;G_*x1*6%y;bGK9zz`GQTfcp;2CPC<+bm zq?9AfuC4K|Z#4ZZ#%Nx-g79jgx_f*FmUvNT9)AWFQH_Q0bZx8Wti;*Qw z1q^Pxv$%ZW7;&5=ahjx>1@vRCSPsaM%xiRhqi#M>l^u1$5?>G@P7nrhGz*YLyLUuL zR5vr-=7hPv=mvQQ`FQ`x;_}R0IjUah zy!-Km{rLIbG(~x)u0ZdDCt<8`os26!S?v3$XjvK(Ec(AmW}=q~fLssh;db|ZrHyII zir?A9j_!J=^C5bum%^pK=q63kGA!29yk4L!7PbLPe}IIlqBOqPRgV2wXuMRX`gCqt z3f_3RqPU9ashL~$i?BRnsVM3fa7?fFIk?~dE5qV z)fDs2qSsz|OVfBkmb}IYt~U8;tAsN@#$G^{SFy$I%hMNItox*U26J_+@WoMV8D?2k zRT=liQEb_n#aV3Wlv2o(>n2r|QD26OEi^ZwPxLdZDv$W$D7JJ{C{=(`L$V=@<;zg9 zrJpJ=KP-dAmVVk|;$=UUp<;_&N+Gd3x2m$3Wo@zLpJe%Oi!CpW>o0O&FTI73mC*nI N002ovPDHLkV1m+|^aua| diff --git a/fmpp/docs/figures/qtour_step2.png b/fmpp/docs/figures/qtour_step2.png deleted file mode 100644 index ec0d321cbff51b34b2bcca9fb065072f2988f6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6176 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°#Qz4fhax2kNC^4=Lnh(ubq*KQvYtk~V=~pPTSEbgK zEDs_b{EGDC*hb6&eynXY%hHi zugR>rLIxpWx69@+50;DY`NyP)+EE_<`chR78ueYxZl5~q4aOBjH?nl~VBnv1EAc6W zl(-m&VP0eSWL#vxB^hIXQ+@fo&Pvi@Xv8-G(a#@O`N}Z zbq!pF7KmH!{Y>L;qUY4Fob-CrQ?I;sCkO*;+^rxQ+y0lSI@f^#=gF~all_IoT_jWT z#-7Mj-IcH`Wf($Ty}9|)jr%ItrML>p_4-@@F%j8b&@ov8_xD(&R9_n3FU8?14r`RL z+fl7r36Q&4%83o$D_`VCLFuhR+siiT;Vx^&_QTsmt|!&&i%&xw3Z^i%XZ($80n|PW^KgMy6!SP;K`U)LJ}^PT5)M&t+0C#Jrl;=HM<| ziEMBW{Fdf_e=1cpSKul16|Uyz*9UT=8Xe7iR(Ygt(U=}Pu6*=7`)LH*lTv{MO2x0h zz+dI}RcvQNOPs?1%zMl-nE-fwY@F$ zv`Pw`+X21kT~}4}CYd6d+qzrk+F2{DY~L)k5Tds#cJ4b?pWB?q*-gFldW*YIBA#?GX2qz3JFShTqnXK z5bJpc!MspRj>$5Yq@V~l&)+sK;}4{E)sG_t8^7hPxDC>;f;~dE2B}C)mue!r)(sB4 z?L_9(aHA@LxXxFJejcphe6cCPl3WsdWgV4v(kJjRvHmb2^OJEUHM>3P%nLjY@1WIW zP751xxw1zzAK_`+YxT!(M>(@RH0rGR-tuu#8W+4EmfVjc&WWZ2ao7zpA<0bJb0&c zn4cQdr&vN#)58bjrri&HZ(Usb$IXOnu}fKc1>t)C%yRmC_Y(+@oW>@c=Tq**(OEZ+ z{}52S6pCHaFygrk|GS?@N_SE%hfcSHp|THtYW_ig$hNfuh?{i;sUtSnuC?P%&Fi}* zzDfv!jA>Olm2^Vh>+Z}~zeGF~`Hk;3+N7ejt%NXXef{&BY{#qeF;7wt=SIzNC(dzm z+NBIwDB?HL_s^C~n<#8&zMl1+hIeOD3^BnGIU^6p?!O6@6fSK-wFbQDs__#mzkztX z>7_b`#(o#cc8@gkl{dumZ-$Z7A?O@T1cxssVqcCzIhv3mTTikyaa&aZ? zqWgK8OL4d##g-s^L+M(wUve>GN&2t-dDx2)i-Mndv_emU`kABWpCfq;-37ho5|BTl zy3YI)Z`Jwpr;!l~bdG%K+p)4tRb3jEO2Mdx?j7f*=;QF*BaRhZs^qlrutm!6UXhz( za%v&fcvPWKa70H0yM4a2UxeY1)_wg038|c8Rfuf-vxxw&WjkLq8#DM6+g-{Fh10C~ zb%(Y0MbXjhLv`k>7T9Q;1=i?6x>~T`o3Dzas1OV5yeZte>ZM{;iN+#Q3dC*syl{cI z7IyBOs1M!{VOiKwL8%kRBa3yNJ0$RQLvqgVztQVOEWmk5Bk%=;u+9*YO%ks6|8_3c lLr7$BsF_>6Go9`Jz%-@(GBLg#RrJhUF{{XkSh1385 diff --git a/fmpp/docs/freemarker/alphaidx.html b/fmpp/docs/freemarker/alphaidx.html deleted file mode 100644 index d29c26c..0000000 --- a/fmpp/docs/freemarker/alphaidx.html +++ /dev/null @@ -1,1529 +0,0 @@ - - - - - - - - FreeMarker Manual - Alphabetical Index - - - - - - - - -
    - - - - - -

    -Alphabetical Index

    - -

    -$ | # | < | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | R | S | T | U | V | W | X

    - -
    - -

    $

    -
    -
    - ${...},  Interpolations -
    -
    -
    - -

    #

    -
    -
    - #,  Overall structure, -Directives -
    -
    - #{...},  #{...}: Numerical interpolation -
    -
    -
    - -

    <

    -
    -
    - <#...>,  Directives -
    -
    - <#--...-->,  Overall structure -
    -
    -
    - -

    A

    -
    -
    - abs built-in,  abs -
    -
    - absolute value,  abs -
    -
    - acquisition,  Using acquisition -
    -
    - adding hashes,  Concatenation -
    -
    - adding sequences,  Concatenation -
    -
    - adding strings,  Interpolation (or concatenation) -
    -
    - addition,  Arithmetical calculations -
    -
    - alternative syntax,  Alternative (square bracket) syntax -
    -
    - ancestors built-in,  ancestors -
    -
    - and,  Logical operations -
    -
    - ant task,  Using FreeMarker with Ant -
    -
    - arithmetic,  Arithmetical calculations -
    -
    - assign directive,  assign -
    -
    - attempt directive,  attempt, recover -
    -
    -
    - -

    B

    -
    -
    - beans
    -
    -
    wrapping, Bean wrapper
    -
    -
    - boolean
    -
    -
    built-ins, Built-ins for booleans
    -
    Java side, Scalars
    -
    literal, Booleans
    -
    operations, Logical operations
    -
    printing, string (when used with a boolean value)
    -
    the FTL value type, Scalars
    -
    -
    - boolean_format,  setting -
    -
    - boolean built-in,  boolean -
    -
    - break directive,  list, break, -switch, case, default, break -
    -
    - built-in,  Built-ins, -Built-in Reference, -Alphabetical index -
    -
    - byte built-in,  byte, double, float, int, long, short -
    -
    -
    - -

    C

    -
    -
    - caching,  Template caching -
    -
    - call a method,  Method call -
    -
    - cap_first built-in,  cap_first -
    -
    - capitalize built-in,  capitalize -
    -
    - case directive,  switch, case, default, break -
    -
    - c built-in,  c (when used with numerical value), -c (when used with boolean) -
    -
    - ceiling built-in,  round, floor, ceiling -
    -
    - charAt,  Getting a character -
    -
    - charset,  Charset issues, -ftl -
    -
    - children built-in,  children -
    -
    - chop_linebreak built-in,  chop_linebreak -
    -
    - chunk built-in,  chunk -
    -
    - classic_compatible,  setting -
    -
    - collection
    -
    -
    Java side, Containers
    -
    the FTL value type, Containers
    -
    -
    - columnar printing of sequences,  chunk -
    -
    - command-line,  Using FreeMarker with Ant -
    -
    - comment,  Overall structure -
    -
    - comparison operators,  Comparison -
    -
    - compress directive,  compress -
    -
    - concatenate hashes,  Concatenation -
    -
    - concatenate sequences,  Concatenation -
    -
    - concatenate strings,  Interpolation (or concatenation) -
    -
    - configuration,  Create a configuration instance -
    -
    - Configuration,  The Configuration -
    -
    - constant,  Specify values directly -
    -
    - contact,  Preface -
    -
    - containers
    -
    -
    Java side, Containers
    -
    -
    - contains built-in,  contains -
    -
    - converting between types,  boolean, -date, time, datetime, -number, -c (when used with numerical value), -string (when used with a numerical value), -date, time, datetime (when used with a date/time/date-time - value), -string (when used with a date/time/date-time value), -c (when used with boolean), -string (when used with a boolean value), -byte, double, float, int, long, short, -number_to_date, number_to_time, number_to_datetime -
    -
    - converting date to long,  byte, double, float, int, long, short -
    -
    - converting date to string,  string (when used with a date/time/date-time value) -
    -
    - converting long to date,  number_to_date, number_to_time, number_to_datetime -
    -
    - converting string to boolean,  boolean -
    -
    - converting string to date,  date, time, datetime -
    -
    - converting string to number,  number -
    -
    - converting string to time,  date, time, datetime -
    -
    - converting time to string,  string (when used with a date/time/date-time value) -
    -
    - current date-time,  Special Variable Reference -
    -
    - custom directive,  Defining your own directives -
    -
    - custom tags,  Using FreeMarker with servlets -
    -
    -
    - -

    D

    -
    -
    - data-model,  Template + data-model = output -
    -
    -
    assembling with Java, Create a data-model
    -
    assembling with Java, without object wrapper, Basics
    -
    -
    - date
    -
    -
    built-ins, Built-ins for date/time/date-time values
    -
    Java API related difficulties, Scalars
    -
    Java side, Scalars
    -
    the FTL value type, Scalars
    -
    -
    - date_format,  setting -
    -
    - date built-in,  date, time, datetime, -date, time, datetime (when used with a date/time/date-time - value) -
    -
    - datetime
    -
    -
    built-ins, Built-ins for date/time/date-time values
    -
    -
    - date-time
    -
    -
    the FTL value type, Scalars
    -
    -
    - datetime_format,  setting -
    -
    - datetime built-in,  date, time, datetime, -date, time, datetime (when used with a date/time/date-time - value) -
    -
    - date to long,  byte, double, float, int, long, short -
    -
    - date to string,  string (when used with a date/time/date-time value) -
    -
    - default built-in,  List of deprecated built-ins -
    -
    - default directive,  switch, case, default, break -
    -
    - default value operator,  Default value operator -
    -
    - defining macro,  Defining your own directives -
    -
    - deprecated,  Deprecated FTL constructs -
    -
    - directive,  Directives, -Directive Reference, -Alphabetical index -
    -
    -
    the FTL value type, User-defined directives
    -
    user-defined, Defining your own directives
    -
    -
    - directives
    -
    -
    Java side, Directives
    -
    -
    - division,  Arithmetical calculations -
    -
    - double built-in,  byte, double, float, int, long, short -
    -
    - download,  Preface -
    -
    -
    - -

    E

    -
    -
    - else directive,  if, else, elseif -
    -
    - elseif directive,  if, else, elseif -
    -
    - encoding,  Charset issues, -ftl -
    -
    -
    URL, url
    -
    URL path, url_path
    -
    -
    - ends_with built-in,  ends_with -
    -
    - ensure_ends_with built-in,  ensure_ends_with, -ensure_starts_with -
    -
    - enum,  Accessing enums -
    -
    - error,  Special Variable Reference -
    -
    - error handling,  Handling missing values, -Error handling, -attempt, recover -
    -
    - escape directive,  escape, noescape -
    -
    - escape sequences,  Strings -
    -
    - escaping
    -
    -
    output, html, rtf, xhtml, xml
    -
    URL, url
    -
    URL path, url_path
    -
    -
    - eval,  eval -
    -
    - evaluate string,  eval -
    -
    - exception handling,  Error handling -
    -
    - existence test operator,  Missing value test operator -
    -
    - exists built-in,  List of deprecated built-ins -
    -
    - expression,  Expressions -
    -
    - -
    - -

    G

    -
    -
    - get character,  Getting a character -
    -
    - global directive,  global -
    -
    - groups built-in,  groups -
    -
    -
    - -

    H

    -
    -
    - handling null-s,  Handling missing values -
    -
    - has_content built-in,  has_content -
    -
    - hash
    -
    -
    accessing subvariable, Retrieving data from a hash
    -
    built-ins, Built-ins for hashes
    -
    concatenate, Concatenation
    -
    Java side, Containers
    -
    key type, FAQ
    -
    literal, Hashes
    -
    modify, FAQ
    -
    operations, Hash operations
    -
    the FTL value type, Containers
    -
    -
    - header,  ftl -
    -
    - help,  Preface -
    -
    - homepage,  Preface -
    -
    - html built-in,  html -
    -
    - HTTP,  Using FreeMarker with servlets -
    -
    -
    - -

    I

    -
    -
    - if_exists built-in,  List of deprecated built-ins -
    -
    - if directive,  if, else, elseif -
    -
    - import directive,  import -
    -
    - include
    -
    -
    JSP, Including content from other web application - resources
    -
    servlet, Including content from other web application - resources
    -
    -
    - include directive,  include -
    -
    - index_of built-in,  index_of -
    -
    - infinite,  is_infinite -
    -
    - install,  Installing FreeMarker -
    -
    - instantiating variable,  new -
    -
    - int built-in,  byte, double, float, int, long, short -
    -
    - integer division,  Arithmetical calculations -
    -
    - integer part,  Arithmetical calculations -
    -
    - interpolation,  Overall structure, -Interpolation (or concatenation), -Interpolations -
    -
    - interpret built-in,  interpret -
    -
    - is_... built-in,  is_... -
    -
    - is_infinte built-in,  is_infinite -
    -
    - is_nan built-in,  is_nan -
    -
    - is null,  Missing value test operator -
    -
    - iso_... built-ins,  iso_... -
    -
    - ISO 8601,  setting -
    -
    - ISO 8601 parsing,  date, time, datetime -
    -
    - iso built-in,  iso_... -
    -
    -
    - -

    J

    -
    -
    - j_string built-in,  j_string -
    -
    - JDBC time zone,  setting -
    -
    - join built-in,  join -
    -
    - joining hashes,  Concatenation -
    -
    - joining sequences,  Concatenation -
    -
    - joining strings,  Interpolation (or concatenation) -
    -
    - js_string built-in,  js_string -
    -
    - json_string built-in,  json_string -
    -
    - JSP,  Using FreeMarker with servlets, -FAQ -
    -
    -
    include, Including content from other web application - resources
    -
    taglib, Using FreeMarker with servlets, Using FreeMarker with servlets
    -
    -
    - jython
    -
    -
    wrapping, Jython wrapper
    -
    -
    -
    - -

    K

    -
    -
    - keep_after built-in,  keep_after -
    -
    - keep_before built-in,  keep_before -
    -
    - keys built-in,  keys -
    -
    -
    - -

    L

    -
    -
    - lang,  Special Variable Reference -
    -
    - language,  Special Variable Reference -
    -
    - last_index_of built-in,  last_index_of -
    -
    - last built-in,  last -
    -
    - left_pad built-in,  left_pad -
    -
    - length built-in,  length -
    -
    - libraries,  Namespaces -
    -
    - library path,  Namespaces -
    -
    - license,  License -
    -
    - list directive,  list, break -
    -
    - literal,  Specify values directly -
    -
    -
    boolean, Booleans
    -
    hash, Hashes
    -
    -
    - loading templates,  Template loading -
    -
    - local directive,  local -
    -
    - locale,  setting, -Special Variable Reference -
    -
    - locale_object,  Special Variable Reference -
    -
    - localization,  Localized lookup -
    -
    - local variable,  Defining variables in the template -
    -
    - logging,  Logging -
    -
    - logical operations,  Logical operations -
    -
    - long built-in,  byte, double, float, int, long, short -
    -
    - long to date,  number_to_date, number_to_time, number_to_datetime -
    -
    - loop variable,  Macros with loop variables, -Defining variables in the template -
    -
    - lower_case built-in,  lower_case -
    -
    - lt directive,  t, lt, rt -
    -
    -
    - -

    M

    -
    -
    - macro,  Defining your own directives -
    -
    -
    the FTL value type, User-defined directives
    -
    -
    - macro directive,  macro, nested, return -
    -
    - matches built-in,  matches -
    -
    - math,  Arithmetical calculations -
    -
    - merging,  Merging the template with the data-model -
    -
    - method
    -
    -
    call, Method call
    -
    defining with FTL, function, return
    -
    Java side, Methods
    -
    the FTL value type, Methods and functions
    -
    -
    - missing value test operator,  Missing value test operator -
    -
    - missing variable,  Handling missing values -
    -
    - Model 2,  Using FreeMarker with servlets -
    -
    - modify hashes,  FAQ -
    -
    - modify sequences,  FAQ -
    -
    - modulus,  Arithmetical calculations -
    -
    - multithreading,  Multithreading -
    -
    - Multi-typed value,  Basics -
    -
    -
    - -

    N

    -
    -
    - namespace built-in,  namespace -
    -
    - namespaces,  Namespaces -
    -
    - NaN,  is_nan -
    -
    - nested directive,  macro, nested, return -
    -
    - new built-in,  new -
    -
    - new FTL syntax,  Old FTL syntax -
    -
    - node
    -
    -
    built-ins, Built-ins for nodes (for XML)
    -
    Java side, Node variables
    -
    the FTL value type, Nodes
    -
    -
    - node_name built-in,  node_name -
    -
    - node_namespace built-in,  node_namespace -
    -
    - node_type built-in,  node_type -
    -
    - noescape directive,  escape, noescape -
    -
    - noparse directive,  noparse -
    -
    - not,  Logical operations -
    -
    - now,  Special Variable Reference -
    -
    - nt directive,  nt -
    -
    - null,  Handling missing values, -FAQ -
    -
    - number
    -
    -
    built-ins, Built-ins for numbers
    -
    Java side, Scalars
    -
    literal, Numbers
    -
    the FTL value type, Scalars
    -
    -
    - number_format,  setting -
    -
    - number_to_date built-in,  number_to_date, number_to_time, number_to_datetime -
    -
    - number_to_datetime built-in,  number_to_date, number_to_time, number_to_datetime -
    -
    - number_to_time built-in,  number_to_date, number_to_time, number_to_datetime -
    -
    - number built-in,  number -
    -
    - numerical range expression,  Sequences -
    -
    - numerical sequence,  Sequences -
    -
    -
    - -

    O

    -
    -
    - object wrapper,  Basics, -Object wrappers -
    -
    - old FTL syntax,  Old FTL syntax -
    -
    - operator precedence,  Operator precedence -
    -
    - or,  Logical operations -
    -
    - output
    -
    -
    generate with Java, Merging the template with the data-model
    -
    -
    - output_encoding,  setting -
    -
    - output charset,  Charset issues, -url, -Special Variable Reference -
    -
    - output encoding,  Charset issues, -url, -Special Variable Reference -
    -
    -
    - -

    P

    -
    -
    - padding,  left_pad, -right_pad -
    -
    - parent built-in,  parent -
    -
    - parentheses,  Parentheses -
    -
    - parse string as boolean,  boolean -
    -
    - parse string as number,  number -
    -
    - parsing string as date,  date, time, datetime -
    -
    - parsing string as time,  date, time, datetime -
    -
    - path,  Template loading -
    -
    - positional parameter passing,  Positional parameter passing -
    -
    - precedence,  Operator precedence -
    -
    -
    - -

    R

    -
    -
    - range expression,  Sequences -
    -
    - raw string literal,  Strings -
    -
    - recover directive,  attempt, recover -
    -
    - recurse directive,  visit, recurse, fallback -
    -
    - recursion
    -
    -
    iterate, visit, recurse, fallback
    -
    -
    - regular expression
    -
    -
    built-ins, Common flags
    -
    -
    - remove_beginning built-in,  remove_beginning -
    -
    - remove_ending built-in,  remove_ending -
    -
    - replace built-in,  replace -
    -
    - reserved name,  Reserved names in FTL -
    -
    - return directive,  function, return, -macro, nested, return -
    -
    - reverse built-in,  reverse -
    -
    - right_pad built-in,  right_pad -
    -
    - root built-in,  root -
    -
    - round built-in,  round, floor, ceiling -
    -
    - rounding,  round, floor, ceiling -
    -
    - rt directive,  t, lt, rt -
    -
    - rtf built-in,  rtf -
    -
    -
    - -

    S

    -
    -
    - scalar
    -
    -
    Java side, Scalars
    -
    -
    - scopes,  Variables, scopes -
    -
    - security,  Configuring security policy for FreeMarker -
    -
    -
    user-provided templates, FAQ
    -
    -
    - seq_contains built-in,  seq_contains -
    -
    - seq_index_of built-in,  seq_index_of -
    -
    - seq_last_index_of built-in,  seq_last_index_of -
    -
    - sequence
    -
    -
    accessing subvariable, Retrieving data from a sequence
    -
    built-ins, Built-ins for sequences
    -
    concatenate, Concatenation
    -
    iterate, list, break
    -
    Java side, Containers
    -
    literal, Sequences
    -
    modify, FAQ
    -
    operations, Sequence operations
    -
    slice, Sequence slicing
    -
    sorting, sort, sort_by
    -
    the FTL value type, Containers
    -
    -
    - sequence slice,  Sequence slicing -
    -
    - servlet
    -
    -
    include, Including content from other web application - resources
    -
    -
    - Servlet,  Using FreeMarker with servlets -
    -
    - setting,  Settings -
    -
    - setting directive,  setting -
    -
    - shared variable,  Shared variables -
    -
    - short built-in,  byte, double, float, int, long, short -
    -
    - size built-in,  size -
    -
    - sort_by built-in,  sort_by -
    -
    - sort built-in,  sort -
    -
    - special variable,  Special Variable Reference -
    -
    - special variables,  Special variables -
    -
    - split built-in,  split -
    -
    - square bracket syntax,  Alternative (square bracket) syntax -
    -
    - starts_with built-in,  starts_with -
    -
    - static method
    -
    -
    accessing from templates, Bean wrapper
    -
    -
    - stop directive,  stop -
    -
    - storing templates,  Template loading -
    -
    - strict syntax,  Old FTL syntax -
    -
    - string
    -
    -
    built-ins, Built-ins for strings
    -
    concatenate, Interpolation (or concatenation)
    -
    interpolation, Interpolation (or concatenation)
    -
    Java side, Scalars
    -
    literal, Strings
    -
    operations, String operations
    -
    slice, String slicing (substrings)
    -
    substring, String slicing (substrings)
    -
    the FTL value type, Scalars
    -
    -
    - string built-in,  string (when used with a numerical value), -string (when used with a date/time/date-time value), -string (when used with a boolean value) -
    -
    - string slicing,  String slicing (substrings) -
    -
    - string to boolean,  boolean -
    -
    - string to date,  date, time, datetime -
    -
    - string to number,  number -
    -
    - string to time,  date, time, datetime -
    -
    - Struts,  Using FreeMarker with servlets -
    -
    - subsequence,  Sequence slicing -
    -
    - substring,  String slicing (substrings), -substring -
    -
    - substring built-in,  substring -
    -
    - subtraction,  Arithmetical calculations -
    -
    - subvariable
    -
    -
    accessing, Top-level variables, Retrieving data from a hash, Retrieving data from a sequence
    -
    -
    - switch directive,  switch, case, default, break -
    -
    -
    - -

    T

    -
    -
    - tabular printing of sequences,  chunk -
    -
    - tag
    -
    -
    user-defined, Defining your own directives
    -
    -
    - taglib,  Using FreeMarker with servlets -
    -
    - t directive,  t, lt, rt -
    -
    - template,  The Template -
    -
    -
    Java side, Get the template
    -
    -
    - template caching,  Template caching -
    -
    - template loaders,  Template loading -
    -
    - template loading,  Template loading -
    -
    - template name,  Template loading -
    -
    - template path,  Template loading -
    -
    - temporary variable,  Defining variables in the template -
    -
    - testing for missing,  Missing value test operator -
    -
    - testing for null,  Missing value test operator -
    -
    - testing for undefined,  Missing value test operator -
    -
    - text,  Overall structure -
    -
    - thread-safety,  Multithreading -
    -
    - time
    -
    -
    built-ins, Built-ins for date/time/date-time values
    -
    Java API related difficulties, Scalars
    -
    Java side, Scalars
    -
    the FTL value type, Scalars
    -
    -
    - time_format,  setting -
    -
    - time_zone,  setting, -setting -
    -
    - time built-in,  date, time, datetime, -date, time, datetime (when used with a date/time/date-time - value) -
    -
    - timestamp
    -
    -
    built-ins, Built-ins for date/time/date-time values
    -
    -
    - time to string,  string (when used with a date/time/date-time value) -
    -
    - transform,  Defining your own directives -
    -
    - transform directive,  Transform directive -
    -
    - tree nodes,  Node variables -
    -
    - trees,  Node variables -
    -
    - trim built-in,  trim -
    -
    - trimmer directives,  nt, -t, lt, rt -
    -
    - type-casting,  boolean, -date, time, datetime, -number, -c (when used with numerical value), -string (when used with a numerical value), -date, time, datetime (when used with a date/time/date-time - value), -string (when used with a date/time/date-time value), -c (when used with boolean), -string (when used with a boolean value), -byte, double, float, int, long, short, -number_to_date, number_to_time, number_to_datetime -
    -
    - type checking,  is_... -
    -
    -
    - -

    U

    -
    -
    - uncap_first built-in,  uncap_first -
    -
    - undefined variable,  Handling missing values -
    -
    - upper_case built-in,  upper_case -
    -
    - url_escaping_charset,  url, -setting -
    -
    - url_path built-in,  url_path -
    -
    - url built-in,  url -
    -
    - URL encoding,  url, -url_path -
    -
    - URL escaping,  url, -url_path -
    -
    - URL escaping charset,  Special Variable Reference, -Special Variable Reference -
    -
    - user-defined directive,  Defining your own directives, -User-defined directive (<@...>) -
    -
    -
    the FTL value type, User-defined directives
    -
    -
    -
    - -

    V

    -
    -
    - value,  What is a value? -
    -
    - values built-in,  values -
    -
    - variable,  Defining variables in the template -
    -
    - variables,  Variables, scopes -
    -
    -
    names, FAQ
    -
    -
    - variable scopes,  Variables, scopes -
    -
    - version,  Special Variable Reference -
    -
    - visit directive,  visit, recurse, fallback -
    -
    -
    - -

    W

    -
    -
    - web_safe built-in,  List of deprecated built-ins -
    -
    - Web application framework,  Using FreeMarker with servlets -
    -
    - white-space removal,  White-space handling -
    -
    -
    compress, White-space handling, compress
    -
    stripping, White-space stripping, ftl, nt
    -
    trimming, nt, t, lt, rt
    -
    -
    - word_list built-in,  word_list -
    -
    - wrapper,  Basics, -Object wrappers -
    -
    - wrapping
    -
    -
    beans, Bean wrapper
    -
    jython, Jython wrapper
    -
    reflection, Bean wrapper
    -
    -
    -
    - -

    X

    -
    -
    - xhtml built-in,  xhtml -
    -
    - XML
    -
    -
    declarative processing, Declarative XML processing
    -
    exposing, Exposing XML documents
    -
    imperative processing, Imperative XML processing
    -
    -
    - xml built-in,  xml -
    -
    - XML namespace
    -
    -
    in imperative processing, Basics
    -
    -
    - XML namespaces
    -
    -
    in declarative processing, Details
    -
    -
    - XML Schema date parsing,  date, time, datetime -
    -
    - XML Schema date rendering,  setting -
    -
    - XML Schema dateTime rendering,  setting -
    -
    - XML Schema time parsing,  date, time, datetime -
    -
    - XML Schema time rendering,  setting -
    -
    - XSLT,  Declarative XML processing -
    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/api/allclasses-frame.html b/fmpp/docs/freemarker/api/allclasses-frame.html deleted file mode 100644 index c4080d7..0000000 --- a/fmpp/docs/freemarker/api/allclasses-frame.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - -All Classes (FreeMarker 2.3.21 API) - - - - - -

    All Classes

    -
    - -
    - - diff --git a/fmpp/docs/freemarker/api/allclasses-noframe.html b/fmpp/docs/freemarker/api/allclasses-noframe.html deleted file mode 100644 index dd5823e..0000000 --- a/fmpp/docs/freemarker/api/allclasses-noframe.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - -All Classes (FreeMarker 2.3.21 API) - - - - - -

    All Classes

    -
    - -
    - - diff --git a/fmpp/docs/freemarker/api/constant-values.html b/fmpp/docs/freemarker/api/constant-values.html deleted file mode 100644 index 1cb4cd6..0000000 --- a/fmpp/docs/freemarker/api/constant-values.html +++ /dev/null @@ -1,2876 +0,0 @@ - - - - - - -Constant Field Values (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - - -
    - - -

    freemarker.core.*

    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.core.Configurable 
      Modifier and TypeConstant FieldValue
      - -public static final StringARITHMETIC_ENGINE_KEY"arithmetic_engine"
      - -public static final StringAUTO_FLUSH_KEY"auto_flush"
      - -public static final StringBOOLEAN_FORMAT_KEY"boolean_format"
      - -public static final StringCLASSIC_COMPATIBLE_KEY"classic_compatible"
      - -public static final StringDATE_FORMAT_KEY"date_format"
      - -public static final StringDATETIME_FORMAT_KEY"datetime_format"
      - -public static final StringLOCALE_KEY"locale"
      - -public static final StringNEW_BUILTIN_CLASS_RESOLVER_KEY"new_builtin_class_resolver"
      - -public static final StringNUMBER_FORMAT_KEY"number_format"
      - -public static final StringOBJECT_WRAPPER_KEY"object_wrapper"
      - -public static final StringOUTPUT_ENCODING_KEY"output_encoding"
      - -public static final StringSHOW_ERROR_TIPS_KEY"show_error_tips"
      - -public static final StringSQL_DATE_AND_TIME_TIME_ZONE_KEY"sql_date_and_time_time_zone"
      - -public static final StringSTRICT_BEAN_MODELS"strict_bean_models"
      - -public static final StringTEMPLATE_EXCEPTION_HANDLER_KEY"template_exception_handler"
      - -public static final StringTIME_FORMAT_KEY"time_format"
      - -public static final StringTIME_ZONE_KEY"time_zone"
      - -public static final StringURL_ESCAPING_CHARSET_KEY"url_escaping_charset"
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.core.CustomAttribute 
      Modifier and TypeConstant FieldValue
      - -public static final intSCOPE_CONFIGURATION2
      - -public static final intSCOPE_ENVIRONMENT0
      - -public static final intSCOPE_TEMPLATE1
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.core.ParseException 
      Modifier and TypeConstant FieldValue
      - -public static final int_INCLUDE17
      - -public static final intAND107
      - -public static final intAS120
      - -public static final intASCII_DIGIT125
      - -public static final intASSIGN14
      - -public static final intATTEMPT6
      - -public static final intBLANK1
      - -public static final intBREAK45
      - -public static final intBUILT_IN91
      - -public static final intCALL25
      - -public static final intCASE13
      - -public static final intCLOSE_BRACKET114
      - -public static final intCLOSE_PAREN116
      - -public static final intCLOSE_TAG14
      - -public static final intCLOSE_TAG25
      - -public static final intCLOSING_CURLY_BRACKET118
      - -public static final intCOLON112
      - -public static final intCOMMA110
      - -public static final intCOMMENT28
      - -public static final intCOMPRESS27
      - -public static final intDECIMAL86
      - -public static final intDEFAUL53
      - -public static final intDEFAULT0
      - -public static final intDIRECTIVE_END126
      - -public static final intDIVIDE105
      - -public static final intDOLLAR_INTERPOLATION_OPENING71
      - -public static final intDOT87
      - -public static final intDOT_DOT88
      - -public static final intDOT_DOT_ASTERISK90
      - -public static final intDOT_DOT_LESS89
      - -public static final intDOUBLE_EQUALS94
      - -public static final intDOUBLE_STAR103
      - -public static final intELLIPSIS104
      - -public static final intELSE44
      - -public static final intELSE_IF9
      - -public static final intEMPTY_DIRECTIVE_END127
      - -public static final intEND_ASSIGN38
      - -public static final intEND_ATTEMPT34
      - -public static final intEND_COMPRESS41
      - -public static final intEND_ESCAPE60
      - -public static final intEND_FOREACH35
      - -public static final intEND_FUNCTION39
      - -public static final intEND_GLOBAL37
      - -public static final intEND_IF31
      - -public static final intEND_LIST32
      - -public static final intEND_LOCAL36
      - -public static final intEND_MACRO40
      - -public static final intEND_NOESCAPE62
      - -public static final intEND_RECOVER33
      - -public static final intEND_SWITCH43
      - -public static final intEND_TAG3
      - -public static final intEND_TRANSFORM42
      - -public static final intEOF0
      - -public static final intEQUALS93
      - -public static final intESCAPE59
      - -public static final intESCAPED_CHAR80
      - -public static final intESCAPED_GT98
      - -public static final intESCAPED_GTE99
      - -public static final intEXCLAM109
      - -public static final intEXISTS92
      - -public static final intEXPRESSION_COMMENT5
      - -public static final intFALLBACK58
      - -public static final intFALSE83
      - -public static final intFLUSH48
      - -public static final intFM_EXPRESSION2
      - -public static final intFOREACH11
      - -public static final intFTL_HEADER65
      - -public static final intFUNCTION19
      - -public static final intGLOBALASSIGN15
      - -public static final intHALT47
      - -public static final intHASH_INTERPOLATION_OPENING72
      - -public static final intID122
      - -public static final intIF8
      - -public static final intIMPORT18
      - -public static final intIN119
      - -public static final intIN_PAREN3
      - -public static final intINTEGER85
      - -public static final intKEEP_GOING134
      - -public static final intLESS_THAN96
      - -public static final intLESS_THAN_EQUALS97
      - -public static final intLIST10
      - -public static final intLOCALASSIGN16
      - -public static final intLONE_LESS_THAN_OR_DASH135
      - -public static final intLTRIM50
      - -public static final intMACRO20
      - -public static final intMAYBE_END133
      - -public static final intMINUS101
      - -public static final intNAME_START_CHAR124
      - -public static final intNAMED_PARAMETER_EXPRESSION4
      - -public static final intNATURAL_GT128
      - -public static final intNATURAL_GTE129
      - -public static final intNESTED55
      - -public static final intNO_PARSE7
      - -public static final intNO_SPACE_EXPRESSION6
      - -public static final intNODIRECTIVE1
      - -public static final intNOESCAPE61
      - -public static final intNOPARSE30
      - -public static final intNOT_EQUALS95
      - -public static final intNOTRIM52
      - -public static final intOPEN_BRACKET113
      - -public static final intOPEN_MISPLACED_INTERPOLATION123
      - -public static final intOPEN_PAREN115
      - -public static final intOPENING_CURLY_BRACKET117
      - -public static final intOR108
      - -public static final intPERCENT106
      - -public static final intPLUS100
      - -public static final intRAW_STRING82
      - -public static final intRECOVER7
      - -public static final intRECURSE57
      - -public static final intRETURN24
      - -public static final intRTRIM51
      - -public static final intSEMICOLON111
      - -public static final intSETTING26
      - -public static final intSIMPLE_NESTED54
      - -public static final intSIMPLE_RECURSE56
      - -public static final intSIMPLE_RETURN46
      - -public static final intSTART_TAG2
      - -public static final intSTATIC_TEXT_FALSE_ALARM70
      - -public static final intSTATIC_TEXT_NON_WS69
      - -public static final intSTATIC_TEXT_WS68
      - -public static final intSTOP23
      - -public static final intSTRING_LITERAL81
      - -public static final intSWITCH12
      - -public static final intTERMINATING_EXCLAM131
      - -public static final intTERMINATING_WHITESPACE130
      - -public static final intTERSE_COMMENT29
      - -public static final intTERSE_COMMENT_END132
      - -public static final intTIMES102
      - -public static final intTRANSFORM21
      - -public static final intTRIM49
      - -public static final intTRIVIAL_FTL_HEADER66
      - -public static final intTRUE84
      - -public static final intUNIFIED_CALL63
      - -public static final intUNIFIED_CALL_END64
      - -public static final intUNKNOWN_DIRECTIVE67
      - -public static final intUSING121
      - -public static final intVISIT22
      -
    • -
    - - - -

    freemarker.debug.*

    - - - - -

    freemarker.ext.*

    - - -
      -
    • - - - - - - - - - - - - - - -
      freemarker.ext.util.IdentityHashMap 
      Modifier and TypeConstant FieldValue
      - -public static final longserialVersionUID362498820763181265L
      -
    • -
    - - - -

    freemarker.log.*

    - - - - -

    freemarker.template.*

    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.template.Configuration 
      Modifier and TypeConstant FieldValue
      - -public static final intANGLE_BRACKET_TAG_SYNTAX1
      - -public static final intAUTO_DETECT_TAG_SYNTAX0
      - -public static final StringAUTO_IMPORT_KEY"auto_import"
      - -public static final StringAUTO_INCLUDE_KEY"auto_include"
      - -public static final StringCACHE_STORAGE_KEY"cache_storage"
      - -public static final StringDEFAULT_ENCODING_KEY"default_encoding"
      - -public static final StringINCOMPATIBLE_ENHANCEMENTS"incompatible_enhancements"
      - -public static final StringINCOMPATIBLE_IMPROVEMENTS"incompatible_improvements"
      - -public static final StringLOCALIZED_LOOKUP_KEY"localized_lookup"
      - -public static final intSQUARE_BRACKET_TAG_SYNTAX2
      - -public static final StringSTRICT_SYNTAX_KEY"strict_syntax"
      - -public static final StringTAG_SYNTAX_KEY"tag_syntax"
      - -public static final StringTEMPLATE_LOADER_KEY"template_loader"
      - -public static final StringTEMPLATE_UPDATE_DELAY_KEY"template_update_delay"
      - -public static final StringWHITESPACE_STRIPPING_KEY"whitespace_stripping"
      -
    • -
    • - - - - - - - - - - - - - - - - - - - -
      freemarker.template.Template 
      Modifier and TypeConstant FieldValue
      - -public static final StringDEFAULT_NAMESPACE_PREFIX"D"
      - -public static final StringNO_NS_PREFIX"N"
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.template.Template.WrongEncodingException 
      Modifier and TypeConstant FieldValue
      - -public static final int_INCLUDE17
      - -public static final intAND107
      - -public static final intAS120
      - -public static final intASCII_DIGIT125
      - -public static final intASSIGN14
      - -public static final intATTEMPT6
      - -public static final intBLANK1
      - -public static final intBREAK45
      - -public static final intBUILT_IN91
      - -public static final intCALL25
      - -public static final intCASE13
      - -public static final intCLOSE_BRACKET114
      - -public static final intCLOSE_PAREN116
      - -public static final intCLOSE_TAG14
      - -public static final intCLOSE_TAG25
      - -public static final intCLOSING_CURLY_BRACKET118
      - -public static final intCOLON112
      - -public static final intCOMMA110
      - -public static final intCOMMENT28
      - -public static final intCOMPRESS27
      - -public static final intDECIMAL86
      - -public static final intDEFAUL53
      - -public static final intDEFAULT0
      - -public static final intDIRECTIVE_END126
      - -public static final intDIVIDE105
      - -public static final intDOLLAR_INTERPOLATION_OPENING71
      - -public static final intDOT87
      - -public static final intDOT_DOT88
      - -public static final intDOT_DOT_ASTERISK90
      - -public static final intDOT_DOT_LESS89
      - -public static final intDOUBLE_EQUALS94
      - -public static final intDOUBLE_STAR103
      - -public static final intELLIPSIS104
      - -public static final intELSE44
      - -public static final intELSE_IF9
      - -public static final intEMPTY_DIRECTIVE_END127
      - -public static final intEND_ASSIGN38
      - -public static final intEND_ATTEMPT34
      - -public static final intEND_COMPRESS41
      - -public static final intEND_ESCAPE60
      - -public static final intEND_FOREACH35
      - -public static final intEND_FUNCTION39
      - -public static final intEND_GLOBAL37
      - -public static final intEND_IF31
      - -public static final intEND_LIST32
      - -public static final intEND_LOCAL36
      - -public static final intEND_MACRO40
      - -public static final intEND_NOESCAPE62
      - -public static final intEND_RECOVER33
      - -public static final intEND_SWITCH43
      - -public static final intEND_TAG3
      - -public static final intEND_TRANSFORM42
      - -public static final intEOF0
      - -public static final intEQUALS93
      - -public static final intESCAPE59
      - -public static final intESCAPED_CHAR80
      - -public static final intESCAPED_GT98
      - -public static final intESCAPED_GTE99
      - -public static final intEXCLAM109
      - -public static final intEXISTS92
      - -public static final intEXPRESSION_COMMENT5
      - -public static final intFALLBACK58
      - -public static final intFALSE83
      - -public static final intFLUSH48
      - -public static final intFM_EXPRESSION2
      - -public static final intFOREACH11
      - -public static final intFTL_HEADER65
      - -public static final intFUNCTION19
      - -public static final intGLOBALASSIGN15
      - -public static final intHALT47
      - -public static final intHASH_INTERPOLATION_OPENING72
      - -public static final intID122
      - -public static final intIF8
      - -public static final intIMPORT18
      - -public static final intIN119
      - -public static final intIN_PAREN3
      - -public static final intINTEGER85
      - -public static final intKEEP_GOING134
      - -public static final intLESS_THAN96
      - -public static final intLESS_THAN_EQUALS97
      - -public static final intLIST10
      - -public static final intLOCALASSIGN16
      - -public static final intLONE_LESS_THAN_OR_DASH135
      - -public static final intLTRIM50
      - -public static final intMACRO20
      - -public static final intMAYBE_END133
      - -public static final intMINUS101
      - -public static final intNAME_START_CHAR124
      - -public static final intNAMED_PARAMETER_EXPRESSION4
      - -public static final intNATURAL_GT128
      - -public static final intNATURAL_GTE129
      - -public static final intNESTED55
      - -public static final intNO_PARSE7
      - -public static final intNO_SPACE_EXPRESSION6
      - -public static final intNODIRECTIVE1
      - -public static final intNOESCAPE61
      - -public static final intNOPARSE30
      - -public static final intNOT_EQUALS95
      - -public static final intNOTRIM52
      - -public static final intOPEN_BRACKET113
      - -public static final intOPEN_MISPLACED_INTERPOLATION123
      - -public static final intOPEN_PAREN115
      - -public static final intOPENING_CURLY_BRACKET117
      - -public static final intOR108
      - -public static final intPERCENT106
      - -public static final intPLUS100
      - -public static final intRAW_STRING82
      - -public static final intRECOVER7
      - -public static final intRECURSE57
      - -public static final intRETURN24
      - -public static final intRTRIM51
      - -public static final intSEMICOLON111
      - -public static final intSETTING26
      - -public static final intSIMPLE_NESTED54
      - -public static final intSIMPLE_RECURSE56
      - -public static final intSIMPLE_RETURN46
      - -public static final intSTART_TAG2
      - -public static final intSTATIC_TEXT_FALSE_ALARM70
      - -public static final intSTATIC_TEXT_NON_WS69
      - -public static final intSTATIC_TEXT_WS68
      - -public static final intSTOP23
      - -public static final intSTRING_LITERAL81
      - -public static final intSWITCH12
      - -public static final intTERMINATING_EXCLAM131
      - -public static final intTERMINATING_WHITESPACE130
      - -public static final intTERSE_COMMENT29
      - -public static final intTERSE_COMMENT_END132
      - -public static final intTIMES102
      - -public static final intTRANSFORM21
      - -public static final intTRIM49
      - -public static final intTRIVIAL_FTL_HEADER66
      - -public static final intTRUE84
      - -public static final intUNIFIED_CALL63
      - -public static final intUNIFIED_CALL_END64
      - -public static final intUNKNOWN_DIRECTIVE67
      - -public static final intUSING121
      - -public static final intVISIT22
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.template.TemplateDateModel 
      Modifier and TypeConstant FieldValue
      - -public static final intDATE2
      - -public static final intDATETIME3
      - -public static final intTIME1
      - -public static final intUNKNOWN0
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      freemarker.template.TransformControl 
      Modifier and TypeConstant FieldValue
      - -public static final intEND_EVALUATION1
      - -public static final intEVALUATE_BODY1
      - -public static final intREPEAT_EVALUATION0
      - -public static final intSKIP_BODY0
      -
    • -
    - -
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/deprecated-list.html b/fmpp/docs/freemarker/api/deprecated-list.html deleted file mode 100644 index 5fe69a9..0000000 --- a/fmpp/docs/freemarker/api/deprecated-list.html +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - -Deprecated List (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - - -
    - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/CacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/CacheStorage.html deleted file mode 100644 index 9eea630..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/CacheStorage.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - -CacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Interface CacheStorage

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/CacheStorageWithGetSize.html b/fmpp/docs/freemarker/api/freemarker/cache/CacheStorageWithGetSize.html deleted file mode 100644 index 90b561c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/CacheStorageWithGetSize.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - -CacheStorageWithGetSize (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Interface CacheStorageWithGetSize

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getSize

          -
          int getSize()
          -
          Returns the current number of cache entries. This is intended to be used for monitoring. Note that depending on - the implementation, the cost of this operation is not necessary trivial, although calling it a few times per - minute should not be a problem.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/ClassTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/ClassTemplateLoader.html deleted file mode 100644 index 0b6fee6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/ClassTemplateLoader.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - -ClassTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class ClassTemplateLoader

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ClassTemplateLoader

          -
          public ClassTemplateLoader()
          -
          Deprecated. confusing constructor, and seldom useful; - use ClassTemplateLoader(Class, String) instead.
          -
          Creates a template loader that will use the Class.getResource(String) - method of its own class to load the resources, and "/" as base path. - This means that that template paths will be resolved relatvively the root package - of the class hierarchy, so you hardly ever should use this constructor, rather do - something like this:
          - new ClassTemplateLoader(com.example.myapplication.SomeClass.class, "templates") - -

          If you extend this class, then the extending class will be used to load - the resources. - -

          Warning: this constructor was malfunctioned prior FreeMarker 2.3.4 - -- please update FreeMarker if needed.

          -
        • -
        - - - -
          -
        • -

          ClassTemplateLoader

          -
          public ClassTemplateLoader(Class baseClass)
          -
          Deprecated. it's confusing that the base path is ""; - use ClassTemplateLoader(Class, String) instead.
          -
          Creates a template loader that will use the Class.getResource(String) - method of the specified class to load the resources, and "" as base - path. This means that template paths will be resolved relatively to the class - location, that is, relatively to the directory (package) of the class.
          -
          -
          Parameters:
          -
          baseClass - the class whose - Class.getResource(String) will be used to load the templates.
          -
          -
        • -
        - - - -
          -
        • -

          ClassTemplateLoader

          -
          public ClassTemplateLoader(Class baseClass,
          -                           String packagePath)
          -
          Creates a template loader that will use the Class.getResource(String) method - of the specified class to load the resources, and the specified base path (absolute or relative). - -

          Examples: -

            -
          • Relative base path (will load from the - com.example.myapplication.templates package):
            - new ClassTemplateLoader(
            - com.example.myapplication.SomeClass.class,
            - "templates")
            -
          • Absolute base path:
            - new ClassTemplateLoader(
            - somepackage.SomeClass.class,
            - "/com/example/myapplication/templates")
            -
          -
          -
          Parameters:
          -
          baseClass - the class whose Class.getResource(String) method will be used - to load the templates. Be sure that you chose a class whose defining class-loader - sees the templates. This parameter can't be null.
          -
          packagePath - the path to the package that contains the templates. - A path that doesn't start with a slash (/) is relative to the - path (package) of the specified class. A path that starts with a slash - is an absolute path starting from the root of the package hierarchy. Path - components should be separated by forward slashes independently of the - separator character used by the underlying operating system. - This parameter can't be null.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getURL

          -
          protected URL getURL(String name)
          -
          Description copied from class: URLTemplateLoader
          -
          Given a template name (plus potential locale decorations) retrieves - an URL that points the template source.
          -
          -
          Specified by:
          -
          getURL in class URLTemplateLoader
          -
          Parameters:
          -
          name - the name of the sought template, including the locale - decorations.
          -
          Returns:
          -
          an URL that points to the template source, or null if it can - determine that the template source does not exist.
          -
          -
        • -
        - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Show class name and some details that are useful in template-not-found errors.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/ConcurrentCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/ConcurrentCacheStorage.html deleted file mode 100644 index 642ba1b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/ConcurrentCacheStorage.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - -ConcurrentCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Interface ConcurrentCacheStorage

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isConcurrent

          -
          boolean isConcurrent()
          -
          Returns true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
          Returns:
          -
          true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/FileTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/FileTemplateLoader.html deleted file mode 100644 index 0a6eef2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/FileTemplateLoader.html +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - -FileTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class FileTemplateLoader

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateLoader
      -
      -
      -
      -
      public class FileTemplateLoader
      -extends Object
      -implements TemplateLoader
      -
      A TemplateLoader that uses files in a specified directory as the - source of templates. If contains security checks that will prevent it - serving templates outside the template directory (like <include /etc/passwd>. - It compares canonical paths for this, so templates that are symbolically - linked into the template directory from outside of it won't work either.
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        - - - - - - - - - - -
        Fields 
        Modifier and TypeField and Description
        FilebaseDir 
        -
      • -
      - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - - - - - - - -
        Constructors 
        Constructor and Description
        FileTemplateLoader() -
        Creates a new file template cache that will use the current directory - (the value of the system property user.dir as the base - directory for loading templates.
        -
        FileTemplateLoader(File baseDir) -
        Creates a new file template loader that will use the specified directory - as the base directory for loading templates.
        -
        FileTemplateLoader(File baseDir, - boolean allowLinking) -
        Creates a new file template loader that will use the specified directory - as the base directory for loading templates.
        -
        -
      • -
      - - -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          baseDir

          -
          public final File baseDir
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          FileTemplateLoader

          -
          public FileTemplateLoader()
          -                   throws IOException
          -
          Creates a new file template cache that will use the current directory - (the value of the system property user.dir as the base - directory for loading templates. It will not allow access to template - files that are accessible through symlinks that point outside the - base directory.
          -
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          FileTemplateLoader

          -
          public FileTemplateLoader(File baseDir)
          -                   throws IOException
          -
          Creates a new file template loader that will use the specified directory - as the base directory for loading templates. It will not allow access to - template files that are accessible through symlinks that point outside - the base directory.
          -
          -
          Parameters:
          -
          baseDir - the base directory for loading templates
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          FileTemplateLoader

          -
          public FileTemplateLoader(File baseDir,
          -                          boolean allowLinking)
          -                   throws IOException
          -
          Creates a new file template loader that will use the specified directory - as the base directory for loading templates.
          -
          -
          Parameters:
          -
          baseDir - the base directory for loading templates
          -
          allowLinking - if true, it will allow
          -
          Throws:
          -
          IOException
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          findTemplateSource

          -
          public Object findTemplateSource(String name)
          -                          throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either TemplateLoader.getLastModified(Object) or - TemplateLoader.getReader(Object, String).
          -
          -
          Specified by:
          -
          findTemplateSource in interface TemplateLoader
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to TemplateLoader.getLastModified(Object) and - TemplateLoader.getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          public long getLastModified(Object templateSource)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Specified by:
          -
          getLastModified in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          public Reader getReader(Object templateSource,
          -                        String encoding)
          -                 throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling TemplateLoader.findTemplateSource(String) and TemplateLoader.getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Specified by:
          -
          getReader in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          Throws:
          -
          IOException - if an I/O error occurs while accessing the stream.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getBaseDirectory

          -
          public File getBaseDirectory()
          -
          Returns the base directory in which the templates are searched. This comes from the constructor argument, but - it's possibly a canonicalized version of that.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Show class name and some details that are useful in template-not-found errors.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/MruCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/MruCacheStorage.html deleted file mode 100644 index 0ab3868..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/MruCacheStorage.html +++ /dev/null @@ -1,486 +0,0 @@ - - - - - - -MruCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class MruCacheStorage

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      CacheStorage, CacheStorageWithGetSize
      -
      -
      -
      -
      public class MruCacheStorage
      -extends Object
      -implements CacheStorageWithGetSize
      -
      A cache storage that implements a two-level Most Recently Used cache. In the - first level, items are strongly referenced up to the specified maximum. When - the maximum is exceeded, the least recently used item is moved into the - second level cache, where they are softly referenced, up to another - specified maximum. When the second level maximum is also exceeded, the least - recently used item is discarded altogether. This cache storage is a - generalization of both StrongCacheStorage and - SoftCacheStorage - the effect of both of them can be achieved by - setting one maximum to zero and the other to the largest positive integer. - On the other hand, if you wish to use this storage in a strong-only mode, or - in a soft-only mode, you might consider using StrongCacheStorage or - SoftCacheStorage instead, as they can be used by - TemplateCache concurrently without any synchronization on a 5.0 or - later JRE. - -

      This class is NOT thread-safe. If it's accessed from multiple - threads concurrently, proper synchronization must be provided by the callers. - Note that TemplateCache, the natural user of this class provides the - necessary synchronizations when it uses the class. - Also you might consider whether you need this sort of a mixed storage at all - in your solution, as in most cases SoftCacheStorage can also be sufficient. - SoftCacheStorage will use Java soft references, and they already use access - timestamps internally to bias the garbage collector against clearing - recently used references, so you can get reasonably good (and - memory-sensitive) most-recently-used caching through - SoftCacheStorage as well.

      -
      -
      See Also:
      -
      Configuration.setCacheStorage(CacheStorage)
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          MruCacheStorage

          -
          public MruCacheStorage(int strongSizeLimit,
          -                       int softSizeLimit)
          -
          Creates a new MRU cache storage with specified maximum cache sizes. Each - cache size can vary between 0 and Integer.MAX_VALUE.
          -
          -
          Parameters:
          -
          strongSizeLimit - the maximum number of strongly referenced templates; when exceeded, the entry used - the least recently will be moved into the soft cache.
          -
          softSizeLimit - the maximum number of softly referenced templates; when exceeded, the entry used - the least recently will be discarded.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - - - - - -
          -
        • -

          clear

          -
          public void clear()
          -
          -
          Specified by:
          -
          clear in interface CacheStorage
          -
          -
        • -
        - - - -
          -
        • -

          getStrongSizeLimit

          -
          public int getStrongSizeLimit()
          -
          Returns the configured upper limit of the number of strong cache entries.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getSoftSizeLimit

          -
          public int getSoftSizeLimit()
          -
          Returns the configured upper limit of the number of soft cache entries.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getStrongSize

          -
          public int getStrongSize()
          -
          Returns the current number of strong cache entries.
          -
          -
          Since:
          -
          2.3.21
          -
          See Also:
          -
          getStrongSizeLimit()
          -
          -
        • -
        - - - -
          -
        • -

          getSoftSize

          -
          public int getSoftSize()
          -
          Returns a close approximation of the current number of soft cache entries.
          -
          -
          Since:
          -
          2.3.21
          -
          See Also:
          -
          getSoftSizeLimit()
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/MultiTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/MultiTemplateLoader.html deleted file mode 100644 index 3d64156..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/MultiTemplateLoader.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - -MultiTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class MultiTemplateLoader

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      StatefulTemplateLoader, TemplateLoader
      -
      -
      -
      -
      public class MultiTemplateLoader
      -extends Object
      -implements StatefulTemplateLoader
      -
      A TemplateLoader that uses a set of other loaders to load the templates. - On every request, loaders are queried in the order of their appearance in the - array of loaders provided to the constructor. However, if a request for some template - name was already satisfied in the past by one of the loaders, that Loader is queried - first (a soft affinity). - -

      This class is not thread-safe. If it's accessed from multiple - threads concurrently, proper synchronization must be provided by the callers. - Note that TemplateCache, the natural user of this class, provides the - necessary synchronizations when it uses this class, so then you don't have to worry - this.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          MultiTemplateLoader

          -
          public MultiTemplateLoader(TemplateLoader[] loaders)
          -
          Creates a new multi template Loader that will use the specified loaders.
          -
          -
          Parameters:
          -
          loaders - the loaders that are used to load templates.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          findTemplateSource

          -
          public Object findTemplateSource(String name)
          -                          throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either TemplateLoader.getLastModified(Object) or - TemplateLoader.getReader(Object, String).
          -
          -
          Specified by:
          -
          findTemplateSource in interface TemplateLoader
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to TemplateLoader.getLastModified(Object) and - TemplateLoader.getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          public long getLastModified(Object templateSource)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Specified by:
          -
          getLastModified in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          public Reader getReader(Object templateSource,
          -                        String encoding)
          -                 throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling TemplateLoader.findTemplateSource(String) and TemplateLoader.getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Specified by:
          -
          getReader in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          Throws:
          -
          IOException - if an I/O error occurs while accessing the stream.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Show class name and some details that are useful in template-not-found errors.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/NullCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/NullCacheStorage.html deleted file mode 100644 index 332b42a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/NullCacheStorage.html +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - -NullCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class NullCacheStorage

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NullCacheStorage

          -
          public NullCacheStorage()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isConcurrent

          -
          public boolean isConcurrent()
          -
          Description copied from interface: ConcurrentCacheStorage
          -
          Returns true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
          Specified by:
          -
          isConcurrent in interface ConcurrentCacheStorage
          -
          Returns:
          -
          true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          clear

          -
          public void clear()
          -
          -
          Specified by:
          -
          clear in interface CacheStorage
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/SoftCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/SoftCacheStorage.html deleted file mode 100644 index 2302542..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/SoftCacheStorage.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - -SoftCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class SoftCacheStorage

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SoftCacheStorage

          -
          public SoftCacheStorage()
          -
        • -
        - - - -
          -
        • -

          SoftCacheStorage

          -
          public SoftCacheStorage(Map backingMap)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isConcurrent

          -
          public boolean isConcurrent()
          -
          Description copied from interface: ConcurrentCacheStorage
          -
          Returns true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
          Specified by:
          -
          isConcurrent in interface ConcurrentCacheStorage
          -
          Returns:
          -
          true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          clear

          -
          public void clear()
          -
          -
          Specified by:
          -
          clear in interface CacheStorage
          -
          -
        • -
        - - - -
          -
        • -

          getSize

          -
          public int getSize()
          -
          Returns a close approximation of the number of cache entries.
          -
          -
          Specified by:
          -
          getSize in interface CacheStorageWithGetSize
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/StatefulTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/StatefulTemplateLoader.html deleted file mode 100644 index dfdf9da..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/StatefulTemplateLoader.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - -StatefulTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Interface StatefulTemplateLoader

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      TemplateLoader
      -
      -
      -
      All Known Implementing Classes:
      -
      MultiTemplateLoader
      -
      -
      -
      -
      public interface StatefulTemplateLoader
      -extends TemplateLoader
      -
      Interface that can be implemented by template loaders that maintain some - sort of internal state (i.e. caches of earlier lookups for performance - optimization purposes etc.) and support resetting of their state.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/StringTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/StringTemplateLoader.html deleted file mode 100644 index 408a3c9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/StringTemplateLoader.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - -StringTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class StringTemplateLoader

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateLoader
      -
      -
      -
      -
      public class StringTemplateLoader
      -extends Object
      -implements TemplateLoader
      -
      A TemplateLoader that uses a Map with Strings as its source of - templates. - - In most case the regular way of loading templates from files will be fine. - However, there can be situations where you don't want to or can't load a - template from a file, e.g. if you have to deploy a single jar for - JavaWebStart or if they are contained within a database. - A single template can be created manually - e.g. -
      -   String templateStr="Hello ${user}";
      -   Template t = new Template("name", new StringReader(templateStr),
      -               new Configuration());
      - 
      - If, however, you want to create templates from strings which import other - templates this method doesn't work. - - In that case you can create a StringTemplateLoader and add each template to - it: -
      -   StringTemplateLoader stringLoader = new StringTemplateLoader();
      -   stringLoader.putTemplate("greetTemplate", "<#macro greet>Hello</#macro>");
      -   stringLoader.putTemplate("myTemplate", "<#include \"greetTemplate\"><@greet/> World!");
      - 
      - Then you tell your Configuration object to use it: -
      -   cfg.setTemplateLoader(stringLoader);
      - 
      - After that you should be able to use the templates as usual. Often you will - want to combine a StringTemplateLoader with another loader. You can - do so using a MultiTemplateLoader.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          StringTemplateLoader

          -
          public StringTemplateLoader()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          putTemplate

          -
          public void putTemplate(String name,
          -                        String templateSource)
          -
          Puts a template into the loader. A call to this method is identical to - the call to the three-arg putTemplate(String, String, long) - passing System.currentTimeMillis() as the third argument.
          -
          -
          Parameters:
          -
          name - the name of the template.
          -
          templateSource - the source code of the template.
          -
          -
        • -
        - - - -
          -
        • -

          putTemplate

          -
          public void putTemplate(String name,
          -                        String templateSource,
          -                        long lastModified)
          -
          Puts a template into the loader. The name can contain slashes to denote - logical directory structure, but must not start with a slash. If the - method is called multiple times for the same name and with different - last modified time, the configuration's template cache will reload the - template according to its own refresh settings (note that if the refresh - is disabled in the template cache, the template will not be reloaded). - Also, since the cache uses lastModified to trigger reloads, calling the - method with different source and identical timestamp won't trigger - reloading.
          -
          -
          Parameters:
          -
          name - the name of the template.
          -
          templateSource - the source code of the template.
          -
          lastModified - the time of last modification of the template in - terms of System.currentTimeMillis()
          -
          -
        • -
        - - - - - - - -
          -
        • -

          findTemplateSource

          -
          public Object findTemplateSource(String name)
          -
          Description copied from interface: TemplateLoader
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either TemplateLoader.getLastModified(Object) or - TemplateLoader.getReader(Object, String).
          -
          -
          Specified by:
          -
          findTemplateSource in interface TemplateLoader
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to TemplateLoader.getLastModified(Object) and - TemplateLoader.getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          public long getLastModified(Object templateSource)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Specified by:
          -
          getLastModified in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          public Reader getReader(Object templateSource,
          -                        String encoding)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling TemplateLoader.findTemplateSource(String) and TemplateLoader.getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Specified by:
          -
          getReader in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          -
        • -
        - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Show class name and some details that are useful in template-not-found errors.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/StrongCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/StrongCacheStorage.html deleted file mode 100644 index 25a6f63..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/StrongCacheStorage.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - -StrongCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class StrongCacheStorage

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          StrongCacheStorage

          -
          public StrongCacheStorage()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isConcurrent

          -
          public boolean isConcurrent()
          -
          Returns true if the underlying Map is a ConcurrentMap.
          -
          -
          Specified by:
          -
          isConcurrent in interface ConcurrentCacheStorage
          -
          Returns:
          -
          true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          getSize

          -
          public int getSize()
          -
          Returns a close approximation of the number of cache entries.
          -
          -
          Specified by:
          -
          getSize in interface CacheStorageWithGetSize
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          clear

          -
          public void clear()
          -
          -
          Specified by:
          -
          clear in interface CacheStorage
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/TemplateCache.html b/fmpp/docs/freemarker/api/freemarker/cache/TemplateCache.html deleted file mode 100644 index 942e43d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/TemplateCache.html +++ /dev/null @@ -1,618 +0,0 @@ - - - - - - -TemplateCache (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class TemplateCache

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          createLegacyDefaultTemplateLoader

          -
          protected static TemplateLoader createLegacyDefaultTemplateLoader()
          -
          Creates the default TemplateLoader used in 2.3.0-compatible mode.
          -
        • -
        - - - - - - - -
          -
        • -

          getTemplateLoader

          -
          public TemplateLoader getTemplateLoader()
          -
        • -
        - - - -
          -
        • -

          getCacheStorage

          -
          public CacheStorage getCacheStorage()
          -
        • -
        - - - - - - - -
          -
        • -

          getDelay

          -
          public long getDelay()
          -
          Gets the delay in milliseconds between checking for newer versions of a - template source.
          -
          -
          Returns:
          -
          the current value of the delay
          -
          -
        • -
        - - - -
          -
        • -

          setDelay

          -
          public void setDelay(long delay)
          -
          Sets the delay in milliseconds between checking for newer versions of a - template sources.
          -
          -
          Parameters:
          -
          delay - the new value of the delay
          -
          -
        • -
        - - - -
          -
        • -

          getLocalizedLookup

          -
          public boolean getLocalizedLookup()
          -
          Returns if localized template lookup is enabled or not.
          -
        • -
        - - - -
          -
        • -

          setLocalizedLookup

          -
          public void setLocalizedLookup(boolean localizedLookup)
          -
          Setis if localized template lookup is enabled or not.
          -
        • -
        - - - - - - - -
          -
        • -

          removeTemplate

          -
          public void removeTemplate(String name,
          -                           Locale locale,
          -                           String encoding,
          -                           boolean parse)
          -                    throws IOException
          -
          Removes an entry from the cache, hence forcing the re-loading of it when - it's next time requested. It doesn't delete the template file itself. - This is to give the application finer control over cache updating than - setDelay(long) alone does. - - For the meaning of the parameters, see - getTemplate(String, Locale, String, boolean).
          -
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getFullTemplatePath

          -
          public static String getFullTemplatePath(Environment env,
          -                                         String currentTemplateDir,
          -                                         String targetTemplatePath)
          -
          Resolves a path-like reference to a template (like the one used in #include or #import), assuming - a current directory. This gives a full, even if non-normalized template name, that could be used for - getTemplate(String, Locale, String, boolean). This is mostly used when a template refers to another - template.
          -
          -
          Parameters:
          -
          targetTemplatePath - If starts with "/" or contains "://", it's an absolute path and currentDir - will be ignored, otherwise it's interpreted as relative to currentDir
          -
          currentTemplateDir - must end with "/", might contains "://".
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/TemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/TemplateLoader.html deleted file mode 100644 index e1edbf8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/TemplateLoader.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - -TemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Interface TemplateLoader

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          findTemplateSource

          -
          Object findTemplateSource(String name)
          -                   throws IOException
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either getLastModified(Object) or - getReader(Object, String).
          -
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to getLastModified(Object) and - getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          long getLastModified(Object templateSource)
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          Reader getReader(Object templateSource,
          -                 String encoding)
          -          throws IOException
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling findTemplateSource(String) and getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          Throws:
          -
          IOException - if an I/O error occurs while accessing the stream.
          -
          -
        • -
        - - - -
          -
        • -

          closeTemplateSource

          -
          void closeTemplateSource(Object templateSource)
          -                  throws IOException
          -
          Closes the template source. This is the last method that is called by - the TemplateCache for a template source. TemplateCache ensures that - this method will be called on every object that is returned from - findTemplateSource(String).
          -
          -
          Parameters:
          -
          templateSource - the template source that should be closed.
          -
          Throws:
          -
          IOException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/URLTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/URLTemplateLoader.html deleted file mode 100644 index 7b390d5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/URLTemplateLoader.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - -URLTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class URLTemplateLoader

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          URLTemplateLoader

          -
          public URLTemplateLoader()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          findTemplateSource

          -
          public Object findTemplateSource(String name)
          -                          throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either TemplateLoader.getLastModified(Object) or - TemplateLoader.getReader(Object, String).
          -
          -
          Specified by:
          -
          findTemplateSource in interface TemplateLoader
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to TemplateLoader.getLastModified(Object) and - TemplateLoader.getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getURL

          -
          protected abstract URL getURL(String name)
          -
          Given a template name (plus potential locale decorations) retrieves - an URL that points the template source.
          -
          -
          Parameters:
          -
          name - the name of the sought template, including the locale - decorations.
          -
          Returns:
          -
          an URL that points to the template source, or null if it can - determine that the template source does not exist.
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          public long getLastModified(Object templateSource)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Specified by:
          -
          getLastModified in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          public Reader getReader(Object templateSource,
          -                        String encoding)
          -                 throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling TemplateLoader.findTemplateSource(String) and TemplateLoader.getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Specified by:
          -
          getReader in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          Throws:
          -
          IOException - if an I/O error occurs while accessing the stream.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          canonicalizePrefix

          -
          protected static String canonicalizePrefix(String prefix)
          -
          Can be used by subclasses to canonicalize URL path prefixes.
          -
          -
          Parameters:
          -
          prefix - the path prefix to canonicalize
          -
          Returns:
          -
          the canonicalized prefix. All backslashes are replaced with - forward slashes, and a trailing slash is appended if the original - prefix wasn't empty and didn't already end with a slash.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setURLConnectionUsesCaches

          -
          public void setURLConnectionUsesCaches(Boolean urlConnectionUsesCaches)
          -
          Sets if URLConnection.setUseCaches(boolean) will be called, and with what value. By default this is - null; see the behavior then below. The recommended value is false, so that FreeMarker can always - reliably detect when a template was changed. The default is null only for backward compatibility, - and certainly will be changed to false in 2.4.0. As FreeMarker has its own template cache with its - own update delay setting (Configuration.setTemplateUpdateDelay(int)), setting this to false - shouldn't cause performance problems. - -

          Regarding null value: By default then URLConnection.setUseCaches(boolean) won't be called, - and so the default of the URLConnection subclass will be in effect (usually true). That's the - 2.3.0-compatible mode. However, if Configuration.getIncompatibleImprovements() is at least 2.3.21, then - when Configuration.getTemplate is used, null will mean false. Note that this 2.3.21 trick - only works if the template is loaded through Configuration.getTemplate (or TemplateCache).

          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/WebappTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/WebappTemplateLoader.html deleted file mode 100644 index be1bdcd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/WebappTemplateLoader.html +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - -WebappTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.cache
    -

    Class WebappTemplateLoader

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateLoader
      -
      -
      -
      -
      public class WebappTemplateLoader
      -extends Object
      -implements TemplateLoader
      -
      A TemplateLoader that uses streams reachable through - ServletContext.getResource(String) as its source of templates.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          WebappTemplateLoader

          -
          public WebappTemplateLoader(javax.servlet.ServletContext servletContext)
          -
          Creates a resource template cache that will use the specified servlet - context to load the resources. It will use the base path of - "/" meaning templates will be resolved relative to the - servlet context root location.
          -
          -
          Parameters:
          -
          servletContext - the servlet context whose - ServletContext.getResource(String) will be used to load the - templates.
          -
          -
        • -
        - - - -
          -
        • -

          WebappTemplateLoader

          -
          public WebappTemplateLoader(javax.servlet.ServletContext servletContext,
          -                            String subdirPath)
          -
          Creates a template loader that will use the specified servlet - context to load the resources. It will use the specified base path, - which is interpreted relatively to the context root (does not mater - if you start it with "/" or not). Path components - should be separated by forward slashes independently of the separator - character used by the underlying operating system.
          -
          -
          Parameters:
          -
          servletContext - the servlet context whose - ServletContext.getResource(String) will be used to load the - templates.
          -
          subdirPath - the base path to template resources.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          findTemplateSource

          -
          public Object findTemplateSource(String name)
          -                          throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Finds the object that acts as the source of the template with the - given name. This method is called by the TemplateCache when a template - is requested, before calling either TemplateLoader.getLastModified(Object) or - TemplateLoader.getReader(Object, String).
          -
          -
          Specified by:
          -
          findTemplateSource in interface TemplateLoader
          -
          Parameters:
          -
          name - the name of the template, already localized and normalized by - the cache. - It is completely up to the loader implementation to interpret - the name, however it should expect to receive hierarchical paths where - path components are separated by a slash (not backslash). Backslashes - (or any other OS specific separator character) are not considered as separators by - FreeMarker, and thus they will not be replaced with slash before passing to this method, - so it's up to the template loader to handle them (say, be throwing and exception that - tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- - typical mistake of Windows users). - The passed names are always considered relative to some loader-defined root - location (often referred as the "template root directory"), and will never start with - a slash, nor will they contain a path component consisting of either a single or a double - dot -- these are all resolved by the template cache before passing the name to the - loader. As a side effect, paths that trivially reach outside template root directory, - such as ../my.ftl, will be rejected by the template cache, so they never - reach the template loader. Note again, that if the path uses backslash as path separator - instead of slash as (the template loader should not accept that), the normalization will - not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
          -
          Returns:
          -
          an object representing the template source, which can be - supplied in subsequent calls to TemplateLoader.getLastModified(Object) and - TemplateLoader.getReader(Object, String). Null must be returned if the source - for the template can not be found (do not throw FileNotFoundException!). - The returned object may will be compared with a cached template source - object for equality, using the equals method. Thus, - objects returned for the same physical source must be equivalent - according to equals method, otherwise template caching - can become very ineffective!
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getLastModified

          -
          public long getLastModified(Object templateSource)
          -
          Description copied from interface: TemplateLoader
          -
          Returns the time of last modification of the specified template source. - This method is called after findTemplateSource().
          -
          -
          Specified by:
          -
          getLastModified in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          Returns:
          -
          the time of last modification of the specified template source, - or -1 if the time is not known.
          -
          -
        • -
        - - - -
          -
        • -

          getReader

          -
          public Reader getReader(Object templateSource,
          -                        String encoding)
          -                 throws IOException
          -
          Description copied from interface: TemplateLoader
          -
          Returns the character stream of a template represented by the specified - template source. This method is possibly called for multiple times for the - same template source object, and it must always return a Reader that - reads the template from its beginning. Before this method is called for the - second time (or later), its caller must close the previously returned - Reader, and it must not use it anymore. That is, this method is not - required to support multiple concurrent readers for the same source - templateSource object. - -

          Typically, this method is called if the template is missing from the cache, - or if after calling TemplateLoader.findTemplateSource(String) and TemplateLoader.getLastModified(Object) - it was determined that the cached copy of the template is stale. Then, if it turns out that the - encoding parameter passed doesn't match the actual template content, this method will be called for a - second time with the correct encoding parameter value.

          -
          -
          Specified by:
          -
          getReader in interface TemplateLoader
          -
          Parameters:
          -
          templateSource - an object representing a template source, obtained - through a prior call to TemplateLoader.findTemplateSource(String).
          -
          encoding - the character encoding used to translate source bytes - to characters. Some loaders may not have access to the byte - representation of the template stream, and instead directly obtain a - character stream. These loaders should ignore the encoding parameter.
          -
          Returns:
          -
          a reader representing the template character stream. It's - the responsibility of the caller (TemplateCache usually) to - close() it.
          -
          Throws:
          -
          IOException - if an I/O error occurs while accessing the stream.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Show class name and some details that are useful in template-not-found errors.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorage.html deleted file mode 100644 index 89dadad..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorage.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - -Uses of Interface freemarker.cache.CacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.cache.CacheStorage

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorageWithGetSize.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorageWithGetSize.html deleted file mode 100644 index ab70ff3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/CacheStorageWithGetSize.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - -Uses of Interface freemarker.cache.CacheStorageWithGetSize (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.cache.CacheStorageWithGetSize

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/ClassTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/ClassTemplateLoader.html deleted file mode 100644 index 2acd951..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/ClassTemplateLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.ClassTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.ClassTemplateLoader

    -
    -
    No usage of freemarker.cache.ClassTemplateLoader
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/ConcurrentCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/ConcurrentCacheStorage.html deleted file mode 100644 index f7be492..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/ConcurrentCacheStorage.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - -Uses of Interface freemarker.cache.ConcurrentCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.cache.ConcurrentCacheStorage

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/FileTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/FileTemplateLoader.html deleted file mode 100644 index dce4413..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/FileTemplateLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.FileTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.FileTemplateLoader

    -
    -
    No usage of freemarker.cache.FileTemplateLoader
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/MruCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/MruCacheStorage.html deleted file mode 100644 index 63663fd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/MruCacheStorage.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.MruCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.MruCacheStorage

    -
    -
    No usage of freemarker.cache.MruCacheStorage
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/MultiTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/MultiTemplateLoader.html deleted file mode 100644 index 001f758..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/MultiTemplateLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.MultiTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.MultiTemplateLoader

    -
    -
    No usage of freemarker.cache.MultiTemplateLoader
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/NullCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/NullCacheStorage.html deleted file mode 100644 index a3f57ba..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/NullCacheStorage.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.NullCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.NullCacheStorage

    -
    -
    No usage of freemarker.cache.NullCacheStorage
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/SoftCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/SoftCacheStorage.html deleted file mode 100644 index 974d677..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/SoftCacheStorage.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.SoftCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.SoftCacheStorage

    -
    -
    No usage of freemarker.cache.SoftCacheStorage
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StatefulTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/StatefulTemplateLoader.html deleted file mode 100644 index a9adaf2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StatefulTemplateLoader.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Interface freemarker.cache.StatefulTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.cache.StatefulTemplateLoader

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StringTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/StringTemplateLoader.html deleted file mode 100644 index 38d788f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StringTemplateLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.StringTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.StringTemplateLoader

    -
    -
    No usage of freemarker.cache.StringTemplateLoader
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StrongCacheStorage.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/StrongCacheStorage.html deleted file mode 100644 index c42b1ce..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/StrongCacheStorage.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.StrongCacheStorage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.StrongCacheStorage

    -
    -
    No usage of freemarker.cache.StrongCacheStorage
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateCache.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateCache.html deleted file mode 100644 index 23cf051..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateCache.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.TemplateCache (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.TemplateCache

    -
    -
    No usage of freemarker.cache.TemplateCache
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateLoader.html deleted file mode 100644 index 3ff189b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/TemplateLoader.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - -Uses of Interface freemarker.cache.TemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.cache.TemplateLoader

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/URLTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/URLTemplateLoader.html deleted file mode 100644 index d610b50..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/URLTemplateLoader.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.URLTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.URLTemplateLoader

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/class-use/WebappTemplateLoader.html b/fmpp/docs/freemarker/api/freemarker/cache/class-use/WebappTemplateLoader.html deleted file mode 100644 index 8d7364c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/class-use/WebappTemplateLoader.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.cache.WebappTemplateLoader (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.cache.WebappTemplateLoader

    -
    -
    No usage of freemarker.cache.WebappTemplateLoader
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/package-frame.html b/fmpp/docs/freemarker/api/freemarker/cache/package-frame.html deleted file mode 100644 index 58339ee..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - -freemarker.cache (FreeMarker 2.3.21 API) - - - - - -

    freemarker.cache

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/package-summary.html b/fmpp/docs/freemarker/api/freemarker/cache/package-summary.html deleted file mode 100644 index 96f32c7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/package-summary.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - -freemarker.cache (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.cache

    -
    -
    Template loading and caching.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Interface Summary 
      InterfaceDescription
      CacheStorage -
      Cache storage abstracts away the storage aspects of a cache - associating - an object with a key, retrieval and removal via the key.
      -
      CacheStorageWithGetSize -
      A cache storage that has a getSize() method for returning the current number of cache entries.
      -
      ConcurrentCacheStorage -
      An optional interface for cache storage that knows whether it can be - concurrently accessible without synchronization.
      -
      StatefulTemplateLoader -
      Interface that can be implemented by template loaders that maintain some - sort of internal state (i.e.
      -
      TemplateLoader -
      FreeMarker loads template "files" through objects that implement this interface, - thus the templates need not be real files, and can come from any kind of data source - (like classpath, servlet context, database, etc).
      -
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      ClassTemplateLoader -
      A TemplateLoader that uses streams reachable through - Class.getResourceAsStream(String) as its source of templates.
      -
      FileTemplateLoader -
      A TemplateLoader that uses files in a specified directory as the - source of templates.
      -
      MruCacheStorage -
      A cache storage that implements a two-level Most Recently Used cache.
      -
      MultiTemplateLoader -
      A TemplateLoader that uses a set of other loaders to load the templates.
      -
      NullCacheStorage -
      A cache storage that doesn't store anything.
      -
      SoftCacheStorage -
      Soft cache storage is a cache storage that uses SoftReference - objects to hold the objects it was passed, therefore allows the garbage - collector to purge the cache when it determines that it wants to free up - memory.
      -
      StringTemplateLoader -
      A TemplateLoader that uses a Map with Strings as its source of - templates.
      -
      StrongCacheStorage -
      Strong cache storage is a cache storage that simply wraps a Map.
      -
      TemplateCache -
      Performs caching and on-demand loading of the templates.
      -
      URLTemplateLoader -
      This is an abstract template loader that can load templates whose - location can be described by an URL.
      -
      WebappTemplateLoader -
      A TemplateLoader that uses streams reachable through - ServletContext.getResource(String) as its source of templates.
      -
      -
    • -
    - - - -

    Package freemarker.cache Description

    -

    Template loading and caching. -Beside the actual template cache, it contains loaders that can load template -files from the file system, from the classpath, or from a web application -context. If you have specific needs, you can plug custom template loaders into -the system by implementing the template loader interface. -

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/package-tree.html b/fmpp/docs/freemarker/api/freemarker/cache/package-tree.html deleted file mode 100644 index deb9054..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/package-tree.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -freemarker.cache Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.cache

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/cache/package-use.html b/fmpp/docs/freemarker/api/freemarker/cache/package-use.html deleted file mode 100644 index 961cf00..0000000 --- a/fmpp/docs/freemarker/api/freemarker/cache/package-use.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - -Uses of Package freemarker.cache (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.cache

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - -
      Packages that use freemarker.cache 
      PackageDescription
      freemarker.cache -
      Template loading and caching.
      -
      freemarker.ext.servlet -
      Servlet for legacy "Model 2" frameworks that allows using FreeMarker -templates instead of JSP as the MVC View -(see in the Manual).
      -
      freemarker.template -
      The fundamental, most commonly used API-s of FreeMarker; -start with Configuration (also see -Getting Stared in the Manual.)
      -
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Classes in freemarker.cache used by freemarker.cache 
      Class and Description
      CacheStorage -
      Cache storage abstracts away the storage aspects of a cache - associating - an object with a key, retrieval and removal via the key.
      -
      CacheStorageWithGetSize -
      A cache storage that has a getSize() method for returning the current number of cache entries.
      -
      ConcurrentCacheStorage -
      An optional interface for cache storage that knows whether it can be - concurrently accessible without synchronization.
      -
      StatefulTemplateLoader -
      Interface that can be implemented by template loaders that maintain some - sort of internal state (i.e.
      -
      TemplateLoader -
      FreeMarker loads template "files" through objects that implement this interface, - thus the templates need not be real files, and can come from any kind of data source - (like classpath, servlet context, database, etc).
      -
      URLTemplateLoader -
      This is an abstract template loader that can load templates whose - location can be described by an URL.
      -
      -
    • -
    • - - - - - - - - - - - - -
      Classes in freemarker.cache used by freemarker.ext.servlet 
      Class and Description
      TemplateLoader -
      FreeMarker loads template "files" through objects that implement this interface, - thus the templates need not be real files, and can come from any kind of data source - (like classpath, servlet context, database, etc).
      -
      -
    • -
    • - - - - - - - - - - - - - - - -
      Classes in freemarker.cache used by freemarker.template 
      Class and Description
      CacheStorage -
      Cache storage abstracts away the storage aspects of a cache - associating - an object with a key, retrieval and removal via the key.
      -
      TemplateLoader -
      FreeMarker loads template "files" through objects that implement this interface, - thus the templates need not be real files, and can come from any kind of data source - (like classpath, servlet context, database, etc).
      -
      -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.BigDecimalEngine.html b/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.BigDecimalEngine.html deleted file mode 100644 index 45b8249..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.BigDecimalEngine.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - -ArithmeticEngine.BigDecimalEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class ArithmeticEngine.BigDecimalEngine

    -
    -
    - -
    -
      -
    • -
      -
      Enclosing class:
      -
      ArithmeticEngine
      -
      -
      -
      -
      public static class ArithmeticEngine.BigDecimalEngine
      -extends ArithmeticEngine
      -
      This is the default arithmetic engine in FreeMarker. It converts every - number it receives into BigDecimal, then operates on these - converted BigDecimals.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.ConservativeEngine.html b/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.ConservativeEngine.html deleted file mode 100644 index 7d62555..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.ConservativeEngine.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - -ArithmeticEngine.ConservativeEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class ArithmeticEngine.ConservativeEngine

    -
    -
    - -
    -
      -
    • -
      -
      Enclosing class:
      -
      ArithmeticEngine
      -
      -
      -
      -
      public static class ArithmeticEngine.ConservativeEngine
      -extends ArithmeticEngine
      -
      An arithmetic engine that conservatively widens the operation arguments - to extent that they can hold the result of the operation. Widening - conversions occur in following situations: -
        -
      • byte and short are always widened to int (alike to Java language).
      • -
      • To preserve magnitude: when operands are of different types, the - result type is the type of the wider operand.
      • -
      • to avoid overflows: if add, subtract, or multiply would overflow on - integer types, the result is widened from int to long, or from long to - BigInteger.
      • -
      • to preserve fractional part: if a division of integer types would - have a fractional part, int and long are converted to double, and - BigInteger is converted to BigDecimal. An operation on a float and a - long results in a double. An operation on a float or double and a - BigInteger results in a BigDecimal.
      • -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.html b/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.html deleted file mode 100644 index c01c45d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/ArithmeticEngine.html +++ /dev/null @@ -1,579 +0,0 @@ - - - - - - -ArithmeticEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class ArithmeticEngine

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          BIGDECIMAL_ENGINE

          -
          public static final ArithmeticEngine.BigDecimalEngine BIGDECIMAL_ENGINE
          -
          Arithmetic engine that converts all numbers to BigDecimal and - then operates on them. This is FreeMarker's default arithmetic engine.
          -
        • -
        - - - -
          -
        • -

          CONSERVATIVE_ENGINE

          -
          public static final ArithmeticEngine.ConservativeEngine CONSERVATIVE_ENGINE
          -
          Arithmetic engine that uses (more-or-less) the widening conversions of - Java language to determine the type of result of operation, instead of - converting everything to BigDecimal up front.
          -
        • -
        - - - -
          -
        • -

          minScale

          -
          protected int minScale
          -
        • -
        - - - -
          -
        • -

          maxScale

          -
          protected int maxScale
          -
        • -
        - - - -
          -
        • -

          roundingPolicy

          -
          protected int roundingPolicy
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ArithmeticEngine

          -
          public ArithmeticEngine()
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/BugException.html b/fmpp/docs/freemarker/api/freemarker/core/BugException.html deleted file mode 100644 index 53e6472..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/BugException.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - -BugException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class BugException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class BugException
      -extends RuntimeException
      -
      An unexpected state was reached that is certainly caused by a bug in FreeMarker.
      -
      -
      Since:
      -
      2.3.21
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          BugException

          -
          public BugException()
          -
        • -
        - - - -
          -
        • -

          BugException

          -
          public BugException(String message)
          -
        • -
        - - - -
          -
        • -

          BugException

          -
          public BugException(Throwable cause)
          -
        • -
        - - - -
          -
        • -

          BugException

          -
          public BugException(String message,
          -                    Throwable cause)
          -
        • -
        - - - -
          -
        • -

          BugException

          -
          public BugException(int value)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/CommandLine.html b/fmpp/docs/freemarker/api/freemarker/core/CommandLine.html deleted file mode 100644 index 79423e7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/CommandLine.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - -CommandLine (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class CommandLine

    -
    -
    - -
    -
      -
    • -
      -
      Deprecated.  -
      Will be removed, as a main method in a server-side library is marked as a security issue by many tools.
      -
      -
      -
      public class CommandLine
      -extends Object
      -
      FreeMarker command-line utility, the Main-Class of freemarker.jar. - Currently it just prints the version number.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          CommandLine

          -
          public CommandLine()
          -
          Deprecated. 
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          main

          -
          public static void main(String[] args)
          -
          Deprecated. 
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/Configurable.SettingValueAssignmentException.html b/fmpp/docs/freemarker/api/freemarker/core/Configurable.SettingValueAssignmentException.html deleted file mode 100644 index 0b35ea2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/Configurable.SettingValueAssignmentException.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - -Configurable.SettingValueAssignmentException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class Configurable.SettingValueAssignmentException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      Enclosing class:
      -
      Configurable
      -
      -
      -
      -
      public static class Configurable.SettingValueAssignmentException
      -extends freemarker.core._MiscTemplateException
      -
      The setting name was recognized, but its value couldn't be parsed or the setting couldn't be set for some - other reason. This exception always has a cause exception.
      -
      -
      Since:
      -
      2.3.21
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    - -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/Configurable.UnknownSettingException.html b/fmpp/docs/freemarker/api/freemarker/core/Configurable.UnknownSettingException.html deleted file mode 100644 index 184c3ea..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/Configurable.UnknownSettingException.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - -Configurable.UnknownSettingException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class Configurable.UnknownSettingException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      Enclosing class:
      -
      Configurable
      -
      -
      -
      -
      public static class Configurable.UnknownSettingException
      -extends freemarker.core._MiscTemplateException
      -
      The setting name was not recognized.
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    - -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/Configurable.html b/fmpp/docs/freemarker/api/freemarker/core/Configurable.html deleted file mode 100644 index e6a69f3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/Configurable.html +++ /dev/null @@ -1,2291 +0,0 @@ - - - - - - -Configurable (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class Configurable

    -
    -
    - -
    -
      -
    • -
      -
      Direct Known Subclasses:
      -
      Configuration, Environment, Template
      -
      -
      -
      -
      public class Configurable
      -extends Object
      -
      This is a common superclass of Configuration, - Template, and Environment classes. - It provides settings that are common to each of them. FreeMarker - uses a three-level setting hierarchy - the return value of every setting - getter method on Configurable objects inherits its value from its parent - Configurable object, unless explicitly overridden by a call to a - corresponding setter method on the object itself. The parent of an - Environment object is a Template object, the - parent of a Template object is a Configuration - object.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          Configurable

          -
          public Configurable()
          -
          Deprecated. This shouldn't even be public; don't use it.
          -
          Creates a top-level configurable, one that doesn't inherit from a parent, and thus stores the default values.
          -
        • -
        - - - -
          -
        • -

          Configurable

          -
          protected Configurable(Version incompatibleImprovements)
          -
          Intended to be called from inside FreeMarker only. - Creates a top-level configurable, one that doesn't inherit from a parent, and thus stores the default values. - Called by the Configuration constructor.
          -
        • -
        - - - -
          -
        • -

          Configurable

          -
          public Configurable(Configurable parent)
          -
          Creates a new instance. Normally you do not need to use this constructor, - as you don't use Configurable directly, but its subclasses.
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - -
          -
        • -

          getParent

          -
          public final Configurable getParent()
          -
          Returns the parent Configurable object of this object. - The parent stores the default values for this configurable. For example, - the parent of the Template object is the - Configuration object, so setting values not - specified on template level are specified by the confuration object.
          -
          -
          Returns:
          -
          the parent Configurable object, or null, if this is - the root Configurable object.
          -
          -
        • -
        - - - -
          -
        • -

          setClassicCompatible

          -
          public void setClassicCompatible(boolean classicCompatibility)
          -
          Toggles the "Classic Compatible" mode. For a comprehensive description - of this mode, see isClassicCompatible().
          -
        • -
        - - - -
          -
        • -

          setClassicCompatibleAsInt

          -
          public void setClassicCompatibleAsInt(int classicCompatibility)
          -
          Same as setClassicCompatible(boolean), but allows some extra values.
          -
          -
          Parameters:
          -
          classicCompatibility - 0 means false, 1 means true, - 2 means true but with emulating bugs in early 2.x classic-compatibility mode. Currently - 2 affects how booleans are converted to string; with 1 it's always "true"/"", - but with 2 it's "true"/"false" for values wrapped by BeansWrapper as then - Boolean.toString() prevails. Note that someBoolean?string will always consistently format the - boolean according the boolean_format setting, just like in FreeMarker 2.3 and later.
          -
          -
        • -
        - - - -
          -
        • -

          isClassicCompatible

          -
          public boolean isClassicCompatible()
          -
          Returns whether the engine runs in the "Classic Compatibile" mode. - When this mode is active, the engine behavior is altered in following - way: (these resemble the behavior of the 1.7.x line of FreeMarker engine, - now named "FreeMarker Classic", hence the name). -
            -
          • handle undefined expressions gracefully. Namely when an expression - "expr" evaluates to null: -
              -
            • - in <assign varname=expr> directive, - or in ${expr} directive, - or in otherexpr == expr, - or in otherexpr != expr, - or in hash[expr], - or in expr[keyOrIndex] (since 2.3.20), - or in expr.key (since 2.3.20), - then it's treated as empty string. -
            • -
            • as argument of <list expr as item> or - <foreach item in expr>, the loop body is not executed - (as if it were a 0-length list) -
            • -
            • as argument of <if> directive, or on other places where a - boolean expression is expected, it's treated as false -
            • -
            -
          • -
          • Non-boolean models are accepted in <if> directive, - or as operands of logical operators. "Empty" models (zero-length string, - empty sequence or hash) are evaluated as false, all others are evaluated as - true.
          • -
          • When boolean value is treated as a string (i.e. output in - ${...} directive, or concatenated with other string), true - values are converted to string "true", false values are converted to - empty string. Except, if the value of the setting is 2, it will be - formatted according the boolean_format setting, just like in - 2.3.20 and later. -
          • -
          • Scalar models supplied to <list> and - <foreach> are treated as a one-element list consisting - of the passed model. -
          • -
          • Paths parameter of <include> will be interpreted as - absolute path. -
          • -
          - In all other aspects, the engine is a 2.1 engine even in compatibility - mode - you don't lose any of the new functionality by enabling it.
          -
        • -
        - - - -
          -
        • -

          getClassicCompatibleAsInt

          -
          public int getClassicCompatibleAsInt()
          -
        • -
        - - - -
          -
        • -

          setLocale

          -
          public void setLocale(Locale locale)
          -
          Sets the default locale used for number and date formatting (among others), also the locale used for searching - localized template variations when no locale was explicitly requested.
          -
          -
          See Also:
          -
          Configuration.getTemplate(String, Locale)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setTimeZone

          -
          public void setTimeZone(TimeZone timeZone)
          -
          Sets the time zone to use when formatting date/time values. - Defaults to the system time zone (TimeZone.getDefault()), regardless of the "locale" FreeMarker setting, - so in a server application you probably want to set it explicitly in the Environment to match the - preferred time zone of target audience (like the Web page visitor). - -

          If you or the templates set the time zone, you should probably also set - setSQLDateAndTimeTimeZone(TimeZone)!

          -
          -
          See Also:
          -
          setSQLDateAndTimeTimeZone(TimeZone)
          -
          -
        • -
        - - - -
          -
        • -

          setSQLDateAndTimeTimeZone

          -
          public void setSQLDateAndTimeTimeZone(TimeZone tz)
          -
          Sets the time zone used when dealing with java.sql.Date and - java.sql.Time values. It defaults to null for backward compatibility, but in most - application this should be set to the JVM default time zone (server default time zone), because that's what - most JDBC drivers will use when constructing the java.sql.Date and - java.sql.Time values. If this setting is null, FreeMarker will use the value of - (getTimeZone()) for java.sql.Date and java.sql.Time values, - which often gives bad results. - -

          This setting doesn't influence the formatting of other kind of values (like of - java.sql.Timestamp or plain java.util.Date values). - -

          To decide what value you need, a few things has to be understood: -

            -
          • Date-only and time-only values in SQL-oriented databases are usually store calendar and clock field - values directly (year, month, day, or hour, minute, seconds (with decimals)), as opposed to a set of points - on the physical time line. Thus, unlike SQL timestamps, these values usually aren't meant to be shown - differently depending on the time zone of the audience. - -
          • When a JDBC query has to return a date-only or time-only value, it has to convert it to a point on the - physical time line, because that's what Date and its subclasses store (milliseconds since - the epoch). Obviously, this is impossible to do. So JDBC just chooses a physical time which, when rendered - with the JVM default time zone, will give the same field values as those stored - in the database. (Actually, you can give JDBC a calendar, and so it can use other time zones too, but most - application won't care using those overloads.) For example, assume that the system time zone is GMT+02:00. - Then, 2014-07-12 in the database will be translated to physical time 2014-07-11 22:00:00 UTC, because that - rendered in GMT+02:00 gives 2014-07-12 00:00:00. Similarly, 11:57:00 in the database will be translated to - physical time 1970-01-01 09:57:00 UTC. Thus, the physical time stored in the returned value depends on the - default system time zone of the JDBC client, not just on the content in the database. (This used to be the - default behavior of ORM-s, like Hibernate, too.) - -
          • The value of the time_zone FreeMarker configuration setting sets the time zone used for the - template output. For example, when a web page visitor has a preferred time zone, the web application framework - may calls Environment.setTimeZone(TimeZone) with that time zone. Thus, the visitor will - see java.sql.Timestamp and plain java.util.Date values as - they look in his own time zone. While - this is desirable for those types, as they meant to represent physical points on the time line, this is not - necessarily desirable for date-only and time-only values. When sql_date_and_time_time_zone is - null, time_zone is used for rendering all kind of date/time/dateTime values, including - java.sql.Date and java.sql.Time, and then if, for example, - time_zone is GMT+00:00, the - values from the earlier examples will be shown as 2014-07-11 (one day off) and 09:57:00 (2 hours off). While - those are the time zone correct renderings, those values probably was meant to shown "as is". - -
          • You may wonder why this setting isn't simply "SQL time zone", since the time zone related behavior of JDBC - applies to java.sql.Timestamp too. FreeMarker assumes that you have set up your - application so that time stamps coming from the database go through the necessary conversion to store the - correct distance from the epoch (1970-01-01 00:00:00 UTC), as requested by Date. In that case - the time stamp can be safely rendered in different time zones, and thus it needs no special treatment. -
          -
          -
          Parameters:
          -
          tz - Maybe null, in which case java.sql.Date and - java.sql.Time values will be formatted in the time zone returned by - getTimeZone(). - (Note that since null is an allowed value for this setting, it will not cause - getSQLDateAndTimeTimeZone() to fall back to the parent configuration.)
          -
          Since:
          -
          2.3.21
          -
          See Also:
          -
          setTimeZone(TimeZone)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getLocale

          -
          public Locale getLocale()
          -
          Returns the assumed locale when searching for template files with no - explicit requested locale. Defaults to system locale.
          -
        • -
        - - - -
          -
        • -

          setNumberFormat

          -
          public void setNumberFormat(String numberFormat)
          -
          Sets the number format used to convert numbers to strings.
          -
        • -
        - - - -
          -
        • -

          getNumberFormat

          -
          public String getNumberFormat()
          -
          Returns the default number format used to convert numbers to strings. - Defaults to "number"
          -
        • -
        - - - -
          -
        • -

          setBooleanFormat

          -
          public void setBooleanFormat(String booleanFormat)
          -
          The string value for the boolean true and false values, intended for human audience (not for a - computer language), separated with comma. For example, "yes,no". Note that white-space is significant, - so "yes, no" is WRONG (unless you want that leading space before "no"). - -

          For backward compatibility the default is "true,false", but using that value is denied for automatic - boolean-to-string conversion (like ${myBoolean} will fail with it), only myBool?string will - allow it, which is deprecated since FreeMarker 2.3.20. - -

          Note that automatic boolean-to-string conversion only exists since FreeMarker 2.3.20. Earlier this setting - only influenced the result of myBool?string.

          -
        • -
        - - - - - - - -
          -
        • -

          setTimeFormat

          -
          public void setTimeFormat(String timeFormat)
          -
          Sets the format used to convert Date-s to string-s that are time (no date part) values, - also the format that someString?time will use to parse strings. - -

          For the possible values see setDateTimeFormat(String). - -

          Defaults to "", which means "use the FreeMarker default", which is currently "medium".

          -
        • -
        - - - - - - - -
          -
        • -

          setDateFormat

          -
          public void setDateFormat(String dateFormat)
          -
          Sets the format used to convert Date-s to string-s that are date (no time part) values, - also the format that someString?date will use to parse strings. - -

          For the possible values see setDateTimeFormat(String). - -

          Defaults to "", which means "use the FreeMarker default", which is currently "code".

          -
        • -
        - - - - - - - -
          -
        • -

          setDateTimeFormat

          -
          public void setDateTimeFormat(String dateTimeFormat)
          -
          Sets the format used to convert Date-s to string-s that are date-time (timestamp) values, - also the format that someString?datetime will use to parse strings. - -

          The possible setting values are (the quotation marks aren't part of the value itself): - -

            -
          • Patterns accepted by Java's SimpleDateFormat, for example "dd.MM.yyyy HH:mm:ss" (where - HH means 24 hours format) or "MM/dd/yyyy hh:mm:ss a" (where a prints AM or PM, if - the current language is English). - -

          • "xs" for XML Schema format, or "iso" for ISO 8601:2004 format. - These formats allow various additional options, separated with space, like in - "iso m nz" (or with _, like in "iso_m_nz"; this is useful in a case like - lastModified?string.iso_m_nz). The options and their meanings are: - -

              -
            • Accuracy options:
              - ms = Milliseconds, always shown with all 3 digits, even if it's all 0-s. - Example: 13:45:05.800
              - s = Seconds (fraction seconds are dropped even if non-0), like 13:45:05
              - m = Minutes, like 13:45. This isn't allowed for "xs".
              - h = Hours, like 13. This isn't allowed for "xs".
              - Neither = Up to millisecond accuracy, but trailing millisecond 0-s are removed, also the whole - milliseconds part if it would be 0 otherwise. Example: 13:45:05.8 - -

            • Time zone offset visibility options:
              - fz = "Force Zone", always show time zone offset (even for for - java.sql.Date and java.sql.Time values). - But, because ISO 8601 doesn't allow for dates (means date without time of the day) to - show the zone offset, this option will have no effect in the case of "iso" with - dates.
              - nz = "No Zone", never show time zone offset
              - Neither = always show time zone offset, except for java.sql.Date - and java.sql.Time, and for "iso" date values. - -

            • Time zone options:
              - u = Use UTC instead of what the time_zone setting suggests. However, - java.sql.Date and java.sql.Time aren't affected - by this (see setSQLDateAndTimeTimeZone(TimeZone) to understand why)
              - fu = "Force UTC", that is, use UTC instead of what the time_zone or the - sql_date_and_time_time_zone setting suggests. This also effects - java.sql.Date and java.sql.Time values
              - Neither = Use the time zone suggested by the time_zone or the - sql_date_and_time_time_zone configuration setting (setTimeZone(TimeZone) and - setSQLDateAndTimeTimeZone(TimeZone)). -

            - -

            The options can be specified in any order.

            - -

            Options from the same category are mutually exclusive, like using m and s - together is an error. - -

            The accuracy and time zone offset visibility options don't influence parsing, only formatting. - For example, even if you use "iso m nz", "2012-01-01T15:30:05.125+01" will be parsed successfully and with - milliseconds accuracy. - The time zone options (like "u") influence what time zone is chosen only when parsing a string that doesn't - contain time zone offset. - -

            Parsing with "iso" understands both extend format and basic format, like - 20141225T235018. It doesn't, however, support the parsing of all kind of ISO 8601 strings: if - there's a date part, it must use year, month and day of the month values (not week of the year), and the - day can't be omitted. - -

            The output of "iso" is deliberately so that it's also a good representation of the value with - XML Schema format, except for 0 and negative years, where it's impossible. Also note that the time zone - offset is omitted for date values in the "iso" format, while it's preserved for the "xs" - format. - -

          • "short", "medium", "long", or "full", which that has locale-dependent - meaning defined by the Java platform (see in the documentation of DateFormat). - For date-time values, you can specify the length of the date and time part independently, be separating - them with _, like "short_medium". ("medium" means - "medium_medium" for date-time values.) -

          - -

          Defaults to "", which means "use the FreeMarker default", which is currently "code".

          -
        • -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          -
        • -

          setOutputEncoding

          -
          public void setOutputEncoding(String outputEncoding)
          -
          Informs FreeMarker about the charset used for the output. As FreeMarker outputs character stream (not - byte stream), it's not aware of the output charset unless the software that encloses it tells it - with this setting. Some templates may use FreeMarker features that require this information. - Setting this to null means that the output encoding is not known. - -

          Defaults to null (unknown).

          -
        • -
        - - - -
          -
        • -

          getOutputEncoding

          -
          public String getOutputEncoding()
          -
        • -
        - - - -
          -
        • -

          setURLEscapingCharset

          -
          public void setURLEscapingCharset(String urlEscapingCharset)
          -
          Sets the URL escaping charset. If not set (null), the output encoding - (setOutputEncoding(String)) will be used for URL escaping. - - Defaults to null.
          -
        • -
        - - - -
          -
        • -

          getURLEscapingCharset

          -
          public String getURLEscapingCharset()
          -
        • -
        - - - - - - - -
          -
        • -

          getNewBuiltinClassResolver

          -
          public TemplateClassResolver getNewBuiltinClassResolver()
          -
          Retrieves the TemplateClassResolver used - to resolve classes when "SomeClassName"?new is called in a template.
          -
          -
          Since:
          -
          2.3.17
          -
          -
        • -
        - - - -
          -
        • -

          setAutoFlush

          -
          public void setAutoFlush(boolean autoFlush)
          -
          Sets whether the output Writer is automatically flushed at - the end of Template.process(Object, Writer) (and its - overloads). The default is true. - -

          Using false is needed for example when a Web page is composed - from several boxes (like portlets, GUI panels, etc.) that aren't inserted - with #include (or with similar directives) into a master - FreeMarker template, rather they are all processed with a separate - Template.process(Object, Writer) call. In a such scenario the - automatic flushes would commit the HTTP response after each box, hence - interfering with full-page buffering, and also possibly decreasing - performance with too frequent and too early response buffer flushes.

          -
          -
          Since:
          -
          2.3.17
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setShowErrorTips

          -
          public void setShowErrorTips(boolean showTips)
          -
          Sets if tips should be shown in error messages of errors arising during template processing. - The default is true.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setSetting

          -
          public void setSetting(String name,
          -                       String value)
          -                throws TemplateException
          -
          Sets a FreeMarker setting by a name and string value. If you can configure FreeMarker directly with Java (or - other programming language), you should use the dedicated setter methods instead (like - setObjectWrapper(ObjectWrapper). This meant to be used if you get the settings from somewhere - as text. Regardless, below you will find an overview of the settings available no matter how you set them. - -

          The list of settings commonly supported in all Configurable subclasses: -

          - -

          Configuration (a subclass of Configurable) also understands these:

          - - -

          Regarding object builder expressions (used by the setting values where it was - indicated): -

            -
          • Before FreeMarker 2.3.21 it had to be a fully qualified class name, and nothing else.

          • -
          • Since 2.3.21, the generic syntax is: - className(constrArg1, constrArg2, ... constrArgN, - propName1=propValue1, propName2=propValue2, ... - propNameN=propValueN), - where - className is the fully qualified class name of the instance to create (except if we have - builder class or INSTANCE field around, but see that later), - constrArg-s are the values of constructor arguments, - and propName=propValue-s set JavaBean properties (like x=1 means - setX(1)) on the created instance. You can have any number of constructor arguments and property - setters, including 0. Constructor arguments must precede any property setters. -

          • -
          • - Example: com.example.MyObjectWrapper(1, 2, exposeFields=true, cacheSize=5000) is nearly - equivalent with this Java code: - obj = new com.example.MyObjectWrapper(1, 2); obj.setExposeFields(true); obj.setCacheSize(5000); -
          • -
          • -

            If you have no constructor arguments and property setters, and the className class has - a public static INSTANCE field, the value of that filed will be the value of the expression, and - the constructor won't be called. -

          • -
          • -

            If there exists a class named classNameBuilder, then that class will be instantiated - instead with the given constructor arguments, and the JavaBean properties of that builder instance will be - set. After that, the public build() method of the instance will be called, whose return value - will be the value of the whole expression. (The builder class and the build() method is simply - found by name, there's no special interface to implement.) Note that if you use the backward compatible - syntax, where these's no parenthesis after the class name, then it will not look for builder class. -

          • -
          • -

            Currently, the values of arguments and properties can only be one of these: -

              -
            • A numerical literal, like 123 or -1.5. Like in FTL, there are no numerical types, - the value will be automatically converted to the type of the target.
            • -
            • A boolean literal: true or false -
            • The null literal: null -
            • A string literal with FTL syntax, except that it can't contain ${...}-s and - #{...}-s. Examples: "Line 1\nLine 2" or r"C:\temp". -
            • An object builder expression. That is, object builder expressions can be nested into each other. -
            -
          • -
          • -

            The top-level object builder expressions may omit (). In that case, for backward compatibility, - the INSTANCE field and the builder class is not searched, so the instance will be always - created with its parameterless constructor. (This behavior will possibly change in 2.4.) The () - can't be omitted for nested expressions. -

          • -
          • -

            The classes and methods that the expression meant to access must be all public. -

          • -
          -
          -
          Parameters:
          -
          name - the name of the setting.
          -
          value - the string that describes the new value of the setting.
          -
          Throws:
          -
          Configurable.UnknownSettingException - if the name is wrong.
          -
          TemplateException - if the new value of the setting can't be set for any other reasons.
          -
          -
        • -
        - - - -
          -
        • -

          setStrictBeanModels

          -
          public void setStrictBeanModels(boolean strict)
          -
        • -
        - - - -
          -
        • -

          getSetting

          -
          public String getSetting(String key)
          -
          Deprecated. It's not possible in general to convert setting values to string, - and thus it's impossible to ensure that setSetting(String, String) will work with - the returned value correctly.
          -
          Returns the textual representation of a setting.
          -
          -
          Parameters:
          -
          key - the setting key. Can be any of standard XXX_KEY - constants, or a custom key.
          -
          -
        • -
        - - - -
          -
        • -

          getSettings

          -
          public Map getSettings()
          -
          Deprecated. This method was always defective, and certainly it always - will be. Don't use it. (Simply, it's hardly possible in general to - convert setting values to text in a way that ensures that - setSettings(Properties) will work with them correctly.)
          -
          This meant to return the String-to-String Map of the - settings. So it actually should return a Properties object, - but it doesn't by mistake. The returned Map is read-only, - but it will reflect the further configuration changes (aliasing effect).
          -
        • -
        - - - -
          -
        • -

          getEnvironment

          -
          protected Environment getEnvironment()
          -
        • -
        - - - - - - - -
          -
        • -

          getCorrectedNameForUnknownSetting

          -
          protected String getCorrectedNameForUnknownSetting(String name)
          -
          -
          Parameters:
          -
          name - The wrong name
          -
          Returns:
          -
          The corrected name, or null if there's no known correction
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          setSettings

          -
          public void setSettings(Properties props)
          -                 throws TemplateException
          -
          Set the settings stored in a Properties object.
          -
          -
          Throws:
          -
          TemplateException - if the Properties object contains - invalid keys, or invalid setting values, or any other error occurs - while changing the settings.
          -
          -
        • -
        - - - -
          -
        • -

          setSettings

          -
          public void setSettings(InputStream propsIn)
          -                 throws TemplateException,
          -                        IOException
          -
          Reads a setting list (key and element pairs) from the input stream. - The stream has to follow the usual .properties format.
          -
          -
          Throws:
          -
          TemplateException - if the stream contains - invalid keys, or invalid setting values, or any other error occurs - while changing the settings.
          -
          IOException - if an error occurred when reading from the input stream.
          -
          -
        • -
        - - - -
          -
        • -

          setCustomAttribute

          -
          public void setCustomAttribute(String name,
          -                               Object value)
          -
          Sets a named custom attribute for this configurable.
          -
          -
          Parameters:
          -
          name - the name of the custom attribute
          -
          value - the value of the custom attribute. You can set the value to - null, however note that there is a semantic difference between an - attribute set to null and an attribute that is not present, see - removeCustomAttribute(String).
          -
          -
        • -
        - - - -
          -
        • -

          getCustomAttributeNames

          -
          public String[] getCustomAttributeNames()
          -
          Returns an array with names of all custom attributes defined directly - on this configurable. (That is, it doesn't contain the names of custom attributes - defined indirectly on its parent configurables.) The returned array is never null, - but can be zero-length. - The order of elements in the returned array is not defined and can change - between invocations.
          -
        • -
        - - - -
          -
        • -

          removeCustomAttribute

          -
          public void removeCustomAttribute(String name)
          -
          Removes a named custom attribute for this configurable. Note that this - is different than setting the custom attribute value to null. If you - set the value to null, getCustomAttribute(String) will return - null, while if you remove the attribute, it will return the value of - the attribute in the parent configurable (if there is a parent - configurable, that is).
          -
          -
          Parameters:
          -
          name - the name of the custom attribute
          -
          -
        • -
        - - - -
          -
        • -

          getCustomAttribute

          -
          public Object getCustomAttribute(String name)
          -
          Retrieves a named custom attribute for this configurable. If the - attribute is not present in the configurable, and the configurable has - a parent, then the parent is looked up as well.
          -
          -
          Parameters:
          -
          name - the name of the custom attribute
          -
          Returns:
          -
          the value of the custom attribute. Note that if the custom attribute - was created with <#ftl attributes={...}>, then this value is already - unwrapped (i.e. it's a String, or a List, or a - Map, ...etc., not a FreeMarker specific class).
          -
          -
        • -
        - - - - - - - - - - - - - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/CustomAttribute.html b/fmpp/docs/freemarker/api/freemarker/core/CustomAttribute.html deleted file mode 100644 index b62fc10..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/CustomAttribute.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - -CustomAttribute (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class CustomAttribute

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class CustomAttribute
      -extends Object
      -
      A class that allows one to associate custom data with a configuration, - a template, or environment. It works pretty much like ThreadLocal, a - class that allows one to associate custom data with a thread.
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        - - - - - - - - - - - - - - - - - - -
        Fields 
        Modifier and TypeField and Description
        static intSCOPE_CONFIGURATION -
        Constant used in the constructor specifying that this attribute is - scoped by the configuration.
        -
        static intSCOPE_ENVIRONMENT -
        Constant used in the constructor specifying that this attribute is - scoped by the environment.
        -
        static intSCOPE_TEMPLATE -
        Constant used in the constructor specifying that this attribute is - scoped by the template.
        -
        -
      • -
      - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - -
        Constructors 
        Constructor and Description
        CustomAttribute(int scope) -
        Creates a new custom attribute with the specified scope
        -
        -
      • -
      - - -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          SCOPE_ENVIRONMENT

          -
          public static final int SCOPE_ENVIRONMENT
          -
          Constant used in the constructor specifying that this attribute is - scoped by the environment.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          SCOPE_TEMPLATE

          -
          public static final int SCOPE_TEMPLATE
          -
          Constant used in the constructor specifying that this attribute is - scoped by the template.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          SCOPE_CONFIGURATION

          -
          public static final int SCOPE_CONFIGURATION
          -
          Constant used in the constructor specifying that this attribute is - scoped by the configuration.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          CustomAttribute

          -
          public CustomAttribute(int scope)
          -
          Creates a new custom attribute with the specified scope
          -
          -
          Parameters:
          -
          scope - one of SCOPE_ constants.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          create

          -
          protected Object create()
          -
          This method is invoked when get() is invoked without - set(Object) being invoked before it to define the value in the - current scope. Override it to create the attribute value on-demand.
          -
          -
          Returns:
          -
          the initial value for the custom attribute. By default returns null.
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public final Object get()
          -
          -
          Returns:
          -
          the value of the attribute in the context of the current environment.
          -
          Throws:
          -
          IllegalStateException - if there is no current environment (and - hence also no current template and configuration), therefore the - attribute's current scope object can't be resolved.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          set

          -
          public final void set(Object value)
          -
          Sets the value of the attribute in the context of the current environment.
          -
          -
          Parameters:
          -
          value - the new value of the attribute
          -
          Throws:
          -
          IllegalStateException - if there is no current environment (and - hence also no current template and configuration), therefore the - attribute's current scope object can't be resolved.
          -
          -
        • -
        - - - -
          -
        • -

          set

          -
          public final void set(Object value,
          -                      Template t)
          -
          Sets the value of a template-scope attribute in the context of the given - template.
          -
          -
          Parameters:
          -
          value - the new value of the attribute
          -
          t - the template
          -
          Throws:
          -
          UnsupportedOperationException - if this custom attribute is not a - template-scope attribute
          -
          NullPointerException - if t is null
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/Environment.Namespace.html b/fmpp/docs/freemarker/api/freemarker/core/Environment.Namespace.html deleted file mode 100644 index 81e546e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/Environment.Namespace.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - -Environment.Namespace (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class Environment.Namespace

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getTemplate

          -
          public Template getTemplate()
          -
          -
          Returns:
          -
          the Template object with which this Namespace is associated.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/Environment.html b/fmpp/docs/freemarker/api/freemarker/core/Environment.html deleted file mode 100644 index 4f2857d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/Environment.html +++ /dev/null @@ -1,1707 +0,0 @@ - - - - - - -Environment (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class Environment

    -
    -
    - -
    -
      -
    • -
      -
      -
      public final class Environment
      -extends Configurable
      -
      Object that represents the runtime environment during template processing. - For every invocation of a Template.process() method, a new instance - of this object is created, and then discarded when process() returns. - This object stores the set of temporary variables created by the template, - the value of settings set by the template, the reference to the data model root, - etc. Everything that is needed to fulfill the template processing job. - -

      Data models that need to access the Environment - object that represents the template processing on the current thread can use - the getCurrentEnvironment() method. - -

      If you need to modify or read this object before or after the process - call, use Template.createProcessingEnvironment(Object rootMap, Writer out, ObjectWrapper wrapper)

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getCurrentEnvironment

          -
          public static Environment getCurrentEnvironment()
          -
          Retrieves the environment object associated with the current - thread. Data model implementations that need access to the - environment can call this method to obtain the environment object - that represents the template processing that is currently running - on the current thread.
          -
        • -
        - - - -
          -
        • -

          getTemplate

          -
          public Template getTemplate()
          -
          Retrieves the currently processed template.
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          isInAttemptBlock

          -
          public boolean isInAttemptBlock()
          -
          Tells if we are inside an #attempt block (but before #recover). This can be useful for - TemplateExceptionHandler-s, as then they may don't want to print the error to the output, as - #attempt will roll it back anyway.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          setSQLDateAndTimeTimeZone

          -
          public void setSQLDateAndTimeTimeZone(TimeZone timeZone)
          -
          Description copied from class: Configurable
          -
          Sets the time zone used when dealing with java.sql.Date and - java.sql.Time values. It defaults to null for backward compatibility, but in most - application this should be set to the JVM default time zone (server default time zone), because that's what - most JDBC drivers will use when constructing the java.sql.Date and - java.sql.Time values. If this setting is null, FreeMarker will use the value of - (Configurable.getTimeZone()) for java.sql.Date and java.sql.Time values, - which often gives bad results. - -

          This setting doesn't influence the formatting of other kind of values (like of - java.sql.Timestamp or plain java.util.Date values). - -

          To decide what value you need, a few things has to be understood: -

            -
          • Date-only and time-only values in SQL-oriented databases are usually store calendar and clock field - values directly (year, month, day, or hour, minute, seconds (with decimals)), as opposed to a set of points - on the physical time line. Thus, unlike SQL timestamps, these values usually aren't meant to be shown - differently depending on the time zone of the audience. - -
          • When a JDBC query has to return a date-only or time-only value, it has to convert it to a point on the - physical time line, because that's what Date and its subclasses store (milliseconds since - the epoch). Obviously, this is impossible to do. So JDBC just chooses a physical time which, when rendered - with the JVM default time zone, will give the same field values as those stored - in the database. (Actually, you can give JDBC a calendar, and so it can use other time zones too, but most - application won't care using those overloads.) For example, assume that the system time zone is GMT+02:00. - Then, 2014-07-12 in the database will be translated to physical time 2014-07-11 22:00:00 UTC, because that - rendered in GMT+02:00 gives 2014-07-12 00:00:00. Similarly, 11:57:00 in the database will be translated to - physical time 1970-01-01 09:57:00 UTC. Thus, the physical time stored in the returned value depends on the - default system time zone of the JDBC client, not just on the content in the database. (This used to be the - default behavior of ORM-s, like Hibernate, too.) - -
          • The value of the time_zone FreeMarker configuration setting sets the time zone used for the - template output. For example, when a web page visitor has a preferred time zone, the web application framework - may calls setTimeZone(TimeZone) with that time zone. Thus, the visitor will - see java.sql.Timestamp and plain java.util.Date values as - they look in his own time zone. While - this is desirable for those types, as they meant to represent physical points on the time line, this is not - necessarily desirable for date-only and time-only values. When sql_date_and_time_time_zone is - null, time_zone is used for rendering all kind of date/time/dateTime values, including - java.sql.Date and java.sql.Time, and then if, for example, - time_zone is GMT+00:00, the - values from the earlier examples will be shown as 2014-07-11 (one day off) and 09:57:00 (2 hours off). While - those are the time zone correct renderings, those values probably was meant to shown "as is". - -
          • You may wonder why this setting isn't simply "SQL time zone", since the time zone related behavior of JDBC - applies to java.sql.Timestamp too. FreeMarker assumes that you have set up your - application so that time stamps coming from the database go through the necessary conversion to store the - correct distance from the epoch (1970-01-01 00:00:00 UTC), as requested by Date. In that case - the time stamp can be safely rendered in different time zones, and thus it needs no special treatment. -
          -
          -
          Overrides:
          -
          setSQLDateAndTimeTimeZone in class Configurable
          -
          Parameters:
          -
          timeZone - Maybe null, in which case java.sql.Date and - java.sql.Time values will be formatted in the time zone returned by - Configurable.getTimeZone(). - (Note that since null is an allowed value for this setting, it will not cause - Configurable.getSQLDateAndTimeTimeZone() to fall back to the parent configuration.)
          -
          See Also:
          -
          Configurable.setTimeZone(TimeZone)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setOutputEncoding

          -
          public void setOutputEncoding(String outputEncoding)
          -
          Description copied from class: Configurable
          -
          Informs FreeMarker about the charset used for the output. As FreeMarker outputs character stream (not - byte stream), it's not aware of the output charset unless the software that encloses it tells it - with this setting. Some templates may use FreeMarker features that require this information. - Setting this to null means that the output encoding is not known. - -

          Defaults to null (unknown).

          -
          -
          Overrides:
          -
          setOutputEncoding in class Configurable
          -
          -
        • -
        - - - - - - - -
          -
        • -

          applyEqualsOperatorLenient

          -
          public boolean applyEqualsOperatorLenient(TemplateModel leftValue,
          -                                          TemplateModel rightValue)
          -                                   throws TemplateException
          -
          Compares two TemplateModel-s according the rules of the FTL "==" operator, except that if the two types - are incompatible, they are treated as non-equal instead of throwing an exception. Comparing dates of - different types (date-only VS time-only VS date-time) will still throw an exception, however.
          -
          -
          Throws:
          -
          TemplateException
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - - - - - - - - - - - - - -
          -
        • -

          setOut

          -
          public void setOut(Writer out)
          -
        • -
        - - - -
          -
        • -

          getOut

          -
          public Writer getOut()
          -
        • -
        - - - -
          -
        • -

          setNumberFormat

          -
          public void setNumberFormat(String formatName)
          -
          Description copied from class: Configurable
          -
          Sets the number format used to convert numbers to strings.
          -
          -
          Overrides:
          -
          setNumberFormat in class Configurable
          -
          -
        • -
        - - - -
          -
        • -

          setTimeFormat

          -
          public void setTimeFormat(String timeFormat)
          -
          Description copied from class: Configurable
          -
          Sets the format used to convert Date-s to string-s that are time (no date part) values, - also the format that someString?time will use to parse strings. - -

          For the possible values see Configurable.setDateTimeFormat(String). - -

          Defaults to "", which means "use the FreeMarker default", which is currently "medium".

          -
          -
          Overrides:
          -
          setTimeFormat in class Configurable
          -
          -
        • -
        - - - -
          -
        • -

          setDateFormat

          -
          public void setDateFormat(String dateFormat)
          -
          Description copied from class: Configurable
          -
          Sets the format used to convert Date-s to string-s that are date (no time part) values, - also the format that someString?date will use to parse strings. - -

          For the possible values see Configurable.setDateTimeFormat(String). - -

          Defaults to "", which means "use the FreeMarker default", which is currently "code".

          -
          -
          Overrides:
          -
          setDateFormat in class Configurable
          -
          -
        • -
        - - - -
          -
        • -

          setDateTimeFormat

          -
          public void setDateTimeFormat(String dateTimeFormat)
          -
          Description copied from class: Configurable
          -
          Sets the format used to convert Date-s to string-s that are date-time (timestamp) values, - also the format that someString?datetime will use to parse strings. - -

          The possible setting values are (the quotation marks aren't part of the value itself): - -

            -
          • Patterns accepted by Java's SimpleDateFormat, for example "dd.MM.yyyy HH:mm:ss" (where - HH means 24 hours format) or "MM/dd/yyyy hh:mm:ss a" (where a prints AM or PM, if - the current language is English). - -

          • "xs" for XML Schema format, or "iso" for ISO 8601:2004 format. - These formats allow various additional options, separated with space, like in - "iso m nz" (or with _, like in "iso_m_nz"; this is useful in a case like - lastModified?string.iso_m_nz). The options and their meanings are: - -

              -
            • Accuracy options:
              - ms = Milliseconds, always shown with all 3 digits, even if it's all 0-s. - Example: 13:45:05.800
              - s = Seconds (fraction seconds are dropped even if non-0), like 13:45:05
              - m = Minutes, like 13:45. This isn't allowed for "xs".
              - h = Hours, like 13. This isn't allowed for "xs".
              - Neither = Up to millisecond accuracy, but trailing millisecond 0-s are removed, also the whole - milliseconds part if it would be 0 otherwise. Example: 13:45:05.8 - -

            • Time zone offset visibility options:
              - fz = "Force Zone", always show time zone offset (even for for - java.sql.Date and java.sql.Time values). - But, because ISO 8601 doesn't allow for dates (means date without time of the day) to - show the zone offset, this option will have no effect in the case of "iso" with - dates.
              - nz = "No Zone", never show time zone offset
              - Neither = always show time zone offset, except for java.sql.Date - and java.sql.Time, and for "iso" date values. - -

            • Time zone options:
              - u = Use UTC instead of what the time_zone setting suggests. However, - java.sql.Date and java.sql.Time aren't affected - by this (see Configurable.setSQLDateAndTimeTimeZone(TimeZone) to understand why)
              - fu = "Force UTC", that is, use UTC instead of what the time_zone or the - sql_date_and_time_time_zone setting suggests. This also effects - java.sql.Date and java.sql.Time values
              - Neither = Use the time zone suggested by the time_zone or the - sql_date_and_time_time_zone configuration setting (Configurable.setTimeZone(TimeZone) and - Configurable.setSQLDateAndTimeTimeZone(TimeZone)). -

            - -

            The options can be specified in any order.

            - -

            Options from the same category are mutually exclusive, like using m and s - together is an error. - -

            The accuracy and time zone offset visibility options don't influence parsing, only formatting. - For example, even if you use "iso m nz", "2012-01-01T15:30:05.125+01" will be parsed successfully and with - milliseconds accuracy. - The time zone options (like "u") influence what time zone is chosen only when parsing a string that doesn't - contain time zone offset. - -

            Parsing with "iso" understands both extend format and basic format, like - 20141225T235018. It doesn't, however, support the parsing of all kind of ISO 8601 strings: if - there's a date part, it must use year, month and day of the month values (not week of the year), and the - day can't be omitted. - -

            The output of "iso" is deliberately so that it's also a good representation of the value with - XML Schema format, except for 0 and negative years, where it's impossible. Also note that the time zone - offset is omitted for date values in the "iso" format, while it's preserved for the "xs" - format. - -

          • "short", "medium", "long", or "full", which that has locale-dependent - meaning defined by the Java platform (see in the documentation of DateFormat). - For date-time values, you can specify the length of the date and time part independently, be separating - them with _, like "short_medium". ("medium" means - "medium_medium" for date-time values.) -

          - -

          Defaults to "", which means "use the FreeMarker default", which is currently "code".

          -
          -
          Overrides:
          -
          setDateTimeFormat in class Configurable
          -
          -
        • -
        - - - -
          -
        • -

          getConfiguration

          -
          public Configuration getConfiguration()
          -
        • -
        - - - -
          -
        • -

          getCNumberFormat

          -
          public NumberFormat getCNumberFormat()
          -
          Returns the NumberFormat used for the c built-in. - This is always US English "0.################", without - grouping and without superfluous decimal separator.
          -
        • -
        - - - -
          -
        • -

          getLocalVariable

          -
          public TemplateModel getLocalVariable(String name)
          -                               throws TemplateModelException
          -
          Returns the loop or macro local variable corresponding to this - variable name. Possibly null. - (Note that the misnomer is kept for backward compatibility: loop variables - are not local variables according to our terminology.)
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getVariable

          -
          public TemplateModel getVariable(String name)
          -                          throws TemplateModelException
          -
          Returns the variable that is visible in this context. - This is the correspondent to an FTL top-level variable reading expression. - That is, it tries to find the the variable in this order: -
            -
          1. An loop variable (if we're in a loop or user defined directive body) such as foo_has_next -
          2. A local variable (if we're in a macro) -
          3. A variable defined in the current namespace (say, via <#assign ...>) -
          4. A variable defined globally (say, via <#global ....>) -
          5. Variable in the data model: -
              -
            1. A variable in the root hash that was exposed to this - rendering environment in the Template.process(...) call -
            2. A shared variable set in the configuration via a call to Configuration.setSharedVariable(...) -
            -
          6. -
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getGlobalVariable

          -
          public TemplateModel getGlobalVariable(String name)
          -                                throws TemplateModelException
          -
          Returns the globally visible variable of the given name (or null). - This is correspondent to FTL .globals.name. - This will first look at variables that were assigned globally via: - <#global ...> and then at the data model exposed to the template.
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          setGlobalVariable

          -
          public void setGlobalVariable(String name,
          -                              TemplateModel model)
          -
          Sets a variable that is visible globally. - This is correspondent to FTL <#global name=model>. - This can be considered a convenient shorthand for: - getGlobalNamespace().put(name, model)
          -
        • -
        - - - -
          -
        • -

          setVariable

          -
          public void setVariable(String name,
          -                        TemplateModel model)
          -
          Sets a variable in the current namespace. - This is correspondent to FTL <#assign name=model>. - This can be considered a convenient shorthand for: - getCurrentNamespace().put(name, model)
          -
        • -
        - - - -
          -
        • -

          setLocalVariable

          -
          public void setLocalVariable(String name,
          -                             TemplateModel model)
          -
          Sets a local variable (one effective only during a macro invocation). - This is correspondent to FTL <#local name=model>.
          -
          -
          Parameters:
          -
          name - the identifier of the variable
          -
          model - the value of the variable.
          -
          Throws:
          -
          IllegalStateException - if the environment is not executing a - macro body.
          -
          -
        • -
        - - - -
          -
        • -

          getKnownVariableNames

          -
          public Set getKnownVariableNames()
          -                          throws TemplateModelException
          -
          Returns a set of variable names that are known at the time of call. This - includes names of all shared variables in the Configuration, - names of all global variables that were assigned during the template processing, - names of all variables in the current name-space, names of all local variables - and loop variables. If the passed root data model implements the - TemplateHashModelEx interface, then all names it retrieves through a call to - TemplateHashModelEx.keys() method are returned as well. - The method returns a new Set object on each call that is completely - disconnected from the Environment. That is, modifying the set will have - no effect on the Environment object.
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          outputInstructionStack

          -
          public void outputInstructionStack(PrintWriter pw)
          -
          Prints the current FTL stack trace. Useful for debugging. - TemplateExceptions incorporate this information in their stack traces.
          -
        • -
        - - - -
          -
        • -

          getNamespace

          -
          public Environment.Namespace getNamespace(String name)
          -
          Returns the name-space for the name if exists, or null.
          -
          -
          Parameters:
          -
          name - the template path that you have used with the import directive - or importLib(String, String) call, in normalized form. That is, the path must be an absolute - path, and it must not contain "/../" or "/./". The leading "/" is optional.
          -
          -
        • -
        - - - -
          -
        • -

          getMainNamespace

          -
          public Environment.Namespace getMainNamespace()
          -
          Returns the main name-space. - This is correspondent of FTL .main hash.
          -
        • -
        - - - -
          -
        • -

          getCurrentNamespace

          -
          public Environment.Namespace getCurrentNamespace()
          -
          Returns the main name-space. - This is correspondent of FTL .namespace hash.
          -
        • -
        - - - -
          -
        • -

          getGlobalNamespace

          -
          public Environment.Namespace getGlobalNamespace()
          -
          Returns a fictitious name-space that contains the globally visible variables - that were created in the template, but not the variables of the data-model. - There is no such thing in FTL; this strange method was added because of the - JSP taglib support, since this imaginary name-space contains the page-scope - attributes.
          -
        • -
        - - - - - - - -
          -
        • -

          getGlobalVariables

          -
          public TemplateHashModel getGlobalVariables()
          -
          Returns the read-only hash of globally visible variables. - This is the correspondent of FTL .globals hash. - That is, you see the variables created with - <#global ...>, and the variables of the data-model. - To create new global variables, use setGlobalVariable.
          -
        • -
        - - - - - - - -
          -
        • -

          setCurrentVisitorNode

          -
          public void setCurrentVisitorNode(TemplateNodeModel node)
          -
          sets TemplateNodeModel as the current visitor node. .current_node
          -
        • -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          -
        • -

          getNamespaceForPrefix

          -
          public String getNamespaceForPrefix(String prefix)
          -
          -
          Returns:
          -
          the namespace URI registered for this prefix, or null. - This is based on the mappings registered in the current namespace.
          -
          -
        • -
        - - - -
          -
        • -

          getPrefixForNamespace

          -
          public String getPrefixForNamespace(String nsURI)
          -
        • -
        - - - -
          -
        • -

          getDefaultNS

          -
          public String getDefaultNS()
          -
          -
          Returns:
          -
          the default node namespace for the current FTL namespace
          -
          -
        • -
        - - - - - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/FreeMarkerTree.html b/fmpp/docs/freemarker/api/freemarker/core/FreeMarkerTree.html deleted file mode 100644 index 978fe64..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/FreeMarkerTree.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - -FreeMarkerTree (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class FreeMarkerTree

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          FreeMarkerTree

          -
          public FreeMarkerTree(Template template)
          -
          Deprecated. 
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setTemplate

          -
          public void setTemplate(Template template)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          convertValueToText

          -
          public String convertValueToText(Object value,
          -                                 boolean selected,
          -                                 boolean expanded,
          -                                 boolean leaf,
          -                                 int row,
          -                                 boolean hasFocus)
          -
          Deprecated. 
          -
          -
          Overrides:
          -
          convertValueToText in class JTree
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/InvalidReferenceException.html b/fmpp/docs/freemarker/api/freemarker/core/InvalidReferenceException.html deleted file mode 100644 index 9c2d301..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/InvalidReferenceException.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - -InvalidReferenceException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class InvalidReferenceException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class InvalidReferenceException
      -extends TemplateException
      -
      A subclass of TemplateException that says that an FTL expression has evaluated to null or it refers - to something that doesn't exist. At least in FreeMarker 2.3.x these two cases aren't distinguished.
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          InvalidReferenceException

          -
          public InvalidReferenceException(Environment env)
          -
          Creates and invalid reference exception that contains no information about what was missing or null. - As such, try to avoid this constructor.
          -
        • -
        - - - -
          -
        • -

          InvalidReferenceException

          -
          public InvalidReferenceException(String description,
          -                                 Environment env)
          -
          Creates and invalid reference exception that contains no programmatically extractable information about the - blamed expression. As such, try to avoid this constructor, unless need to raise this expression from outside - the FreeMarker core.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonBooleanException.html b/fmpp/docs/freemarker/api/freemarker/core/NonBooleanException.html deleted file mode 100644 index 91bbba9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonBooleanException.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -NonBooleanException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonBooleanException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonBooleanException

          -
          public NonBooleanException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonBooleanException

          -
          public NonBooleanException(String description,
          -                           Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonDateException.html b/fmpp/docs/freemarker/api/freemarker/core/NonDateException.html deleted file mode 100644 index b089ca5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonDateException.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -NonDateException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonDateException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonDateException

          -
          public NonDateException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonDateException

          -
          public NonDateException(String description,
          -                        Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonExtendedHashException.html b/fmpp/docs/freemarker/api/freemarker/core/NonExtendedHashException.html deleted file mode 100644 index 7dfe79f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonExtendedHashException.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -NonExtendedHashException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonExtendedHashException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonExtendedHashException

          -
          public NonExtendedHashException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonExtendedHashException

          -
          public NonExtendedHashException(String description,
          -                                Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonHashException.html b/fmpp/docs/freemarker/api/freemarker/core/NonHashException.html deleted file mode 100644 index a70c8ed..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonHashException.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -NonHashException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonHashException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonHashException

          -
          public NonHashException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonHashException

          -
          public NonHashException(String description,
          -                        Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonMethodException.html b/fmpp/docs/freemarker/api/freemarker/core/NonMethodException.html deleted file mode 100644 index 4d37110..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonMethodException.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -NonMethodException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonMethodException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonMethodException

          -
          public NonMethodException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonMethodException

          -
          public NonMethodException(String description,
          -                          Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonNodeException.html b/fmpp/docs/freemarker/api/freemarker/core/NonNodeException.html deleted file mode 100644 index aeec84f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonNodeException.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -NonNodeException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonNodeException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonNodeException

          -
          public NonNodeException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonNodeException

          -
          public NonNodeException(String description,
          -                        Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonNumericalException.html b/fmpp/docs/freemarker/api/freemarker/core/NonNumericalException.html deleted file mode 100644 index 2754103..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonNumericalException.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -NonNumericalException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonNumericalException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonNumericalException

          -
          public NonNumericalException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonNumericalException

          -
          public NonNumericalException(String description,
          -                             Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonSequenceException.html b/fmpp/docs/freemarker/api/freemarker/core/NonSequenceException.html deleted file mode 100644 index e8876e2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonSequenceException.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -NonSequenceException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonSequenceException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonSequenceException

          -
          public NonSequenceException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonSequenceException

          -
          public NonSequenceException(String description,
          -                            Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonSequenceOrCollectionException.html b/fmpp/docs/freemarker/api/freemarker/core/NonSequenceOrCollectionException.html deleted file mode 100644 index a27435d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonSequenceOrCollectionException.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - -NonSequenceOrCollectionException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonSequenceOrCollectionException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonSequenceOrCollectionException

          -
          public NonSequenceOrCollectionException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonSequenceOrCollectionException

          -
          public NonSequenceOrCollectionException(String description,
          -                                        Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/NonStringException.html b/fmpp/docs/freemarker/api/freemarker/core/NonStringException.html deleted file mode 100644 index 413a913..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/NonStringException.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - -NonStringException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class NonStringException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NonStringException

          -
          public NonStringException(Environment env)
          -
        • -
        - - - -
          -
        • -

          NonStringException

          -
          public NonStringException(String description,
          -                          Environment env)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/OptInTemplateClassResolver.html b/fmpp/docs/freemarker/api/freemarker/core/OptInTemplateClassResolver.html deleted file mode 100644 index 8f8bb90..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/OptInTemplateClassResolver.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - -OptInTemplateClassResolver (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class OptInTemplateClassResolver

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          OptInTemplateClassResolver

          -
          public OptInTemplateClassResolver(Set allowedClasses,
          -                                  List trustedTemplates)
          -
          Creates a new instance.
          -
          -
          Parameters:
          -
          allowedClasses - the Set of String-s that contains - the full-qualified names of the allowed classes. - Can be null (means not class is allowed).
          -
          trustedTemplates - the List of String-s that contains - template names (i.e., template root directory relative paths) - and prefix patterns (like "include/*") of templates - for which TemplateClassResolver.SAFER_RESOLVER will be - used (which is not as safe as OptInTemplateClassResolver). - The list items need not start with "/" (if they are, it - will be removed). List items ending with "*" are treated - as prefixes (i.e. "foo*" matches "foobar", - "foo/bar/baaz", "foowhatever/bar/baaz", - etc.). The "*" has no special meaning anywhere else. - The matched template name is the name (template root directory - relative path) of the template that directly (lexically) contains the - operation (like ?new) that wants to get the class. Thus, - if a trusted template includes a non-trusted template, the - allowedClasses restriction will apply in the included - template. - This parameter can be null (means no trusted templates).
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          resolve

          -
          public Class resolve(String className,
          -                     Environment env,
          -                     Template template)
          -              throws TemplateException
          -
          Description copied from interface: TemplateClassResolver
          -
          Gets a Class based on the class name.
          -
          -
          Specified by:
          -
          resolve in interface TemplateClassResolver
          -
          Parameters:
          -
          className - the full-qualified class name
          -
          env - the environment in which the template executes
          -
          template - the template where the operation that require the - class resolution resides in. This is null if the - call doesn't come from a template.
          -
          Throws:
          -
          TemplateException - if the class can't be found or shouldn't be - accessed from a template for security reasons.
          -
          -
        • -
        - - - -
          -
        • -

          safeGetTemplateName

          -
          protected String safeGetTemplateName(Template template)
          -
          Extract the template name from the template object which will be matched - against the trusted template names and pattern.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/ParseException.html b/fmpp/docs/freemarker/api/freemarker/core/ParseException.html deleted file mode 100644 index d4a2ecd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/ParseException.html +++ /dev/null @@ -1,3238 +0,0 @@ - - - - - - -ParseException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class ParseException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      Direct Known Subclasses:
      -
      Template.WrongEncodingException
      -
      -
      -
      -
      public class ParseException
      -extends IOException
      -
      Parsing-time exception in a template (as opposed to a runtime exception, a TemplateException). This usually - signals syntactical/lexical errors. - - Note that on JavaCC-level lexical errors throw TokenMgrError instead of this, however with the API-s that - most users use those will be wrapped into ParseException-s. - - This is a modified version of file generated by JavaCC from FTL.jj. - You can modify this class to customize the error reporting mechanisms so long as the public interface - remains compatible with the original.
      -
      -
      See Also:
      -
      TokenMgrError, -Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ParseException

          -
          public ParseException(freemarker.core.Token currentTokenVal,
          -                      int[][] expectedTokenSequencesVal,
          -                      String[] tokenImageVal)
          -
          This constructor is used by the method "generateParseException" - in the generated parser. Calling this constructor generates - a new object of this type with the fields "currentToken", - "expectedTokenSequences", and "tokenImage" set. - This constructor calls its super class with the empty string - to force the "toString" method of parent class "Throwable" to - print the error message in the form: - ParseException: <result of getMessage>
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          protected ParseException()
          -
          Deprecated. Use a constructor to which you pass description, template, and positions.
          -
          The following constructors are for use by you for whatever - purpose you can think of. Constructing the exception in this - manner makes the exception behave in the normal way - i.e., as - documented in the class "Throwable". The fields "errorToken", - "expectedTokenSequences", and "tokenImage" do not contain - relevant information. The JavaCC generated code does not use - these constructors.
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      int lineNumber,
          -                      int columnNumber)
          -
          Deprecated. Use a constructor to which you can also pass the template, and the end positions.
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      Template template,
          -                      int lineNumber,
          -                      int columnNumber,
          -                      int endLineNumber,
          -                      int endColumnNumber)
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      Template template,
          -                      int lineNumber,
          -                      int columnNumber,
          -                      int endLineNumber,
          -                      int endColumnNumber,
          -                      Throwable cause)
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      Template template,
          -                      freemarker.core.Token tk)
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      Template template,
          -                      freemarker.core.Token tk,
          -                      Throwable cause)
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      freemarker.core.TemplateObject tobj)
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          ParseException

          -
          public ParseException(String description,
          -                      freemarker.core.TemplateObject tobj,
          -                      Throwable cause)
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setTemplateName

          -
          public void setTemplateName(String templateName)
          -
          Should be used internally only; sets the name of the template that contains the error. - This is needed as the constructor that JavaCC automatically calls doesn't pass in the template, so we - set it somewhere later in an exception handler.
          -
        • -
        - - - - - - - -
          -
        • -

          getEditorMessage

          -
          public String getEditorMessage()
          -
          Returns the description of the error without error location or source quotations, or null if there's no - description available. This is useful in editors (IDE-s) where the error markers and the editor window itself - already carry this information, so it's redundant the repeat in the error dialog.
          -
        • -
        - - - -
          -
        • -

          getTemplateName

          -
          public String getTemplateName()
          -
          Returns the name (template-root relative path) of the template whose parsing was failed. - Maybe null if this is a non-stored template.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          getLineNumber

          -
          public int getLineNumber()
          -
          1-based line number of the failing section, or 0 is the information is not available.
          -
        • -
        - - - -
          -
        • -

          getColumnNumber

          -
          public int getColumnNumber()
          -
          1-based column number of the failing section, or 0 is the information is not available.
          -
        • -
        - - - -
          -
        • -

          getEndLineNumber

          -
          public int getEndLineNumber()
          -
          1-based line number of the last line that contains the failing section, or 0 if the information is not available.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getEndColumnNumber

          -
          public int getEndColumnNumber()
          -
          1-based column number of the last character of the failing section, or 0 if the information is not available. - Note that unlike with Java string API-s, this column number is inclusive.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          add_escapes

          -
          protected String add_escapes(String str)
          -
          Used to convert raw characters to their escaped version - when these raw version cannot be used as part of an ASCII - string literal.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/StopException.html b/fmpp/docs/freemarker/api/freemarker/core/StopException.html deleted file mode 100644 index 1d3226f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/StopException.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - -StopException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class StopException

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/TemplateClassResolver.html b/fmpp/docs/freemarker/api/freemarker/core/TemplateClassResolver.html deleted file mode 100644 index 3873f18..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/TemplateClassResolver.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - -TemplateClassResolver (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Interface TemplateClassResolver

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      OptInTemplateClassResolver
      -
      -
      -
      -
      public interface TemplateClassResolver
      -
      Used by built-ins and other template language features that get a class - based on a string. This can be handy both for implementing security - restrictions and for working around local class-loader issues. - - The implementation should be thread-safe, unless an - instance is always only used in a single Environment object.
      -
      -
      Since:
      -
      2.3.17
      -
      See Also:
      -
      Configurable.setNewBuiltinClassResolver(TemplateClassResolver)
      -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/UnexpectedTypeException.html b/fmpp/docs/freemarker/api/freemarker/core/UnexpectedTypeException.html deleted file mode 100644 index dc95183..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/UnexpectedTypeException.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - -UnexpectedTypeException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.core
    -

    Class UnexpectedTypeException

    -
    -
    - -
    - -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          UnexpectedTypeException

          -
          public UnexpectedTypeException(Environment env,
          -                               String description)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.BigDecimalEngine.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.BigDecimalEngine.html deleted file mode 100644 index 178475b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.BigDecimalEngine.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class freemarker.core.ArithmeticEngine.BigDecimalEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.ArithmeticEngine.BigDecimalEngine

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.ConservativeEngine.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.ConservativeEngine.html deleted file mode 100644 index 61a6777..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.ConservativeEngine.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - -Uses of Class freemarker.core.ArithmeticEngine.ConservativeEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.ArithmeticEngine.ConservativeEngine

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.html deleted file mode 100644 index b11f7d1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/ArithmeticEngine.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - -Uses of Class freemarker.core.ArithmeticEngine (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.ArithmeticEngine

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/BugException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/BugException.html deleted file mode 100644 index 22bfc51..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/BugException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.BugException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.BugException

    -
    -
    No usage of freemarker.core.BugException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/CommandLine.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/CommandLine.html deleted file mode 100644 index c3dfddd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/CommandLine.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.CommandLine (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.CommandLine

    -
    -
    No usage of freemarker.core.CommandLine
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.SettingValueAssignmentException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.SettingValueAssignmentException.html deleted file mode 100644 index cdd0d97..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.SettingValueAssignmentException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.Configurable.SettingValueAssignmentException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.Configurable.SettingValueAssignmentException

    -
    -
    No usage of freemarker.core.Configurable.SettingValueAssignmentException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.UnknownSettingException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.UnknownSettingException.html deleted file mode 100644 index 8e9889d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.UnknownSettingException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.Configurable.UnknownSettingException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.Configurable.UnknownSettingException

    -
    -
    No usage of freemarker.core.Configurable.UnknownSettingException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.html deleted file mode 100644 index a70814b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/Configurable.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - -Uses of Class freemarker.core.Configurable (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.Configurable

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/CustomAttribute.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/CustomAttribute.html deleted file mode 100644 index 4ed3e51..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/CustomAttribute.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.CustomAttribute (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.CustomAttribute

    -
    -
    No usage of freemarker.core.CustomAttribute
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.Namespace.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.Namespace.html deleted file mode 100644 index 93908d7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.Namespace.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - -Uses of Class freemarker.core.Environment.Namespace (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.Environment.Namespace

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.html deleted file mode 100644 index bc2fae0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/Environment.html +++ /dev/null @@ -1,529 +0,0 @@ - - - - - - -Uses of Class freemarker.core.Environment (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.Environment

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/FreeMarkerTree.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/FreeMarkerTree.html deleted file mode 100644 index 5016b65..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/FreeMarkerTree.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.FreeMarkerTree (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.FreeMarkerTree

    -
    -
    No usage of freemarker.core.FreeMarkerTree
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/InvalidReferenceException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/InvalidReferenceException.html deleted file mode 100644 index c245223..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/InvalidReferenceException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.InvalidReferenceException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.InvalidReferenceException

    -
    -
    No usage of freemarker.core.InvalidReferenceException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonBooleanException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonBooleanException.html deleted file mode 100644 index 95228f2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonBooleanException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonBooleanException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonBooleanException

    -
    -
    No usage of freemarker.core.NonBooleanException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonDateException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonDateException.html deleted file mode 100644 index 490bb24..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonDateException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonDateException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonDateException

    -
    -
    No usage of freemarker.core.NonDateException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonExtendedHashException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonExtendedHashException.html deleted file mode 100644 index 024326e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonExtendedHashException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonExtendedHashException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonExtendedHashException

    -
    -
    No usage of freemarker.core.NonExtendedHashException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonHashException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonHashException.html deleted file mode 100644 index c10cdf4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonHashException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonHashException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonHashException

    -
    -
    No usage of freemarker.core.NonHashException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonMethodException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonMethodException.html deleted file mode 100644 index 39a0762..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonMethodException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonMethodException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonMethodException

    -
    -
    No usage of freemarker.core.NonMethodException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNodeException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNodeException.html deleted file mode 100644 index ad2b0d6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNodeException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonNodeException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonNodeException

    -
    -
    No usage of freemarker.core.NonNodeException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNumericalException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNumericalException.html deleted file mode 100644 index f6b0cc4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonNumericalException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonNumericalException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonNumericalException

    -
    -
    No usage of freemarker.core.NonNumericalException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceException.html deleted file mode 100644 index 1d82014..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonSequenceException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonSequenceException

    -
    -
    No usage of freemarker.core.NonSequenceException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceOrCollectionException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceOrCollectionException.html deleted file mode 100644 index d4a55b4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonSequenceOrCollectionException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonSequenceOrCollectionException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonSequenceOrCollectionException

    -
    -
    No usage of freemarker.core.NonSequenceOrCollectionException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonStringException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/NonStringException.html deleted file mode 100644 index 8c16399..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/NonStringException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.NonStringException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.NonStringException

    -
    -
    No usage of freemarker.core.NonStringException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/OptInTemplateClassResolver.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/OptInTemplateClassResolver.html deleted file mode 100644 index 5e35742..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/OptInTemplateClassResolver.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.OptInTemplateClassResolver (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.OptInTemplateClassResolver

    -
    -
    No usage of freemarker.core.OptInTemplateClassResolver
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/ParseException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/ParseException.html deleted file mode 100644 index f74c58e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/ParseException.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - -Uses of Class freemarker.core.ParseException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.ParseException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/StopException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/StopException.html deleted file mode 100644 index 5e9fb8b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/StopException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.core.StopException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.StopException

    -
    -
    No usage of freemarker.core.StopException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/TemplateClassResolver.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/TemplateClassResolver.html deleted file mode 100644 index 30e08f8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/TemplateClassResolver.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -Uses of Interface freemarker.core.TemplateClassResolver (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.core.TemplateClassResolver

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/class-use/UnexpectedTypeException.html b/fmpp/docs/freemarker/api/freemarker/core/class-use/UnexpectedTypeException.html deleted file mode 100644 index 64d451f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/class-use/UnexpectedTypeException.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - -Uses of Class freemarker.core.UnexpectedTypeException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.core.UnexpectedTypeException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/package-frame.html b/fmpp/docs/freemarker/api/freemarker/core/package-frame.html deleted file mode 100644 index 5653c76..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/package-frame.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - -freemarker.core (FreeMarker 2.3.21 API) - - - - - -

    freemarker.core

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/package-summary.html b/fmpp/docs/freemarker/api/freemarker/core/package-summary.html deleted file mode 100644 index 04bc541..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/package-summary.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - -freemarker.core (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.core

    -
    -
    The seldom used or advanced parts of the fundamental FreeMarker API, compared to freemarker.template.
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.core Description

    -

    The seldom used or advanced parts of the fundamental FreeMarker API, compared to freemarker.template. -This package also encloses FreeMarker's core parsing/rendering functionality.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/package-tree.html b/fmpp/docs/freemarker/api/freemarker/core/package-tree.html deleted file mode 100644 index 9096558..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/package-tree.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - -freemarker.core Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.core

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/core/package-use.html b/fmpp/docs/freemarker/api/freemarker/core/package-use.html deleted file mode 100644 index eaf7f1d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/core/package-use.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - -Uses of Package freemarker.core (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.core

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/Breakpoint.html b/fmpp/docs/freemarker/api/freemarker/debug/Breakpoint.html deleted file mode 100644 index 1b1a4a8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/Breakpoint.html +++ /dev/null @@ -1,378 +0,0 @@ - - - - - - -Breakpoint (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Class Breakpoint

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          Breakpoint

          -
          public Breakpoint(String templateName,
          -                  int line)
          -
          Creates a new breakpoint.
          -
          -
          Parameters:
          -
          templateName - the name of the template
          -
          line - the line number in the template where to put the breakpoint
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getLine

          -
          public int getLine()
          -
          Returns the line number of the breakpoint
          -
        • -
        - - - -
          -
        • -

          getTemplateName

          -
          public String getTemplateName()
          -
          Returns the template name of the breakpoint
          -
        • -
        - - - -
          -
        • -

          hashCode

          -
          public int hashCode()
          -
          -
          Overrides:
          -
          hashCode in class Object
          -
          -
        • -
        - - - -
          -
        • -

          equals

          -
          public boolean equals(Object o)
          -
          -
          Overrides:
          -
          equals in class Object
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getLocationString

          -
          public String getLocationString()
          -
          Returns the template name and the line number separated with a colon
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/DebugModel.html b/fmpp/docs/freemarker/api/freemarker/debug/DebugModel.html deleted file mode 100644 index dbe6d12..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/DebugModel.html +++ /dev/null @@ -1,748 +0,0 @@ - - - - - - -DebugModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Interface DebugModel

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      Remote
      -
      -
      -
      All Known Subinterfaces:
      -
      DebuggedEnvironment
      -
      -
      -
      -
      public interface DebugModel
      -extends Remote
      -
      Represents the debugger-side mirror of a TemplateModel object, a Template - object, or a Configuration object. The Environment objects are also represented - by instances of this model, although not directly but through a separate - subinterface DebuggedEnvironment. The interface is a union of - almost all of FreeMarker template models with identical method signatures. - For purposes of optimizing network traffic there are bulk retrieval methods - for sequences and hashes, as well as a getModelTypes() method that - returns a bit mask of various TYPE_xxx constants flagging which - template models are implemented by the mirrored object.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/DebuggedEnvironment.html b/fmpp/docs/freemarker/api/freemarker/debug/DebuggedEnvironment.html deleted file mode 100644 index 8132865..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/DebuggedEnvironment.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - -DebuggedEnvironment (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Interface DebuggedEnvironment

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      DebugModel, Remote
      -
      -
      -
      -
      public interface DebuggedEnvironment
      -extends DebugModel
      -
      Represents the debugger-side mirror of a debugged - Environment object in the remote VM. This interface - extends DebugModel, and the properties of the Environment are exposed - as hash keys on it. Specifically, the following keys are supported: - "currentNamespace", "dataModel", "globalNamespace", "knownVariables", - "mainNamespace", and "template". -

      The debug model for the template supports keys "configuration" and "name". -

      The debug model for the configuration supports key "sharedVariables". -

      Additionally, all of the debug models for environment, template, and - configuration also support all the setting keys of - Configurable objects.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          resume

          -
          void resume()
          -     throws RemoteException
          -
          Resumes the processing of the environment in the remote VM after it was - stopped on a breakpoint.
          -
          -
          Throws:
          -
          RemoteException
          -
          -
        • -
        - - - -
          -
        • -

          stop

          -
          void stop()
          -   throws RemoteException
          -
          Stops the processing of the environment after it was stopped on - a breakpoint. Causes a StopException to be - thrown in the processing thread in the remote VM.
          -
          -
          Throws:
          -
          RemoteException
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/Debugger.html b/fmpp/docs/freemarker/api/freemarker/debug/Debugger.html deleted file mode 100644 index 7cd2072..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/Debugger.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - -Debugger (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Interface Debugger

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      Remote
      -
      -
      -
      -
      public interface Debugger
      -extends Remote
      -
      The main debugger interface. Allows management of breakpoints as well as - installation of listeners for debug events.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/DebuggerClient.html b/fmpp/docs/freemarker/api/freemarker/debug/DebuggerClient.html deleted file mode 100644 index 8f14651..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/DebuggerClient.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - -DebuggerClient (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Class DebuggerClient

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class DebuggerClient
      -extends Object
      -
      A utility class that allows you to connect to the FreeMarker debugger service - running on a specific host and port.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getDebugger

          -
          public static Debugger getDebugger(InetAddress host,
          -                                   int port,
          -                                   String password)
          -                            throws IOException
          -
          Connects to the FreeMarker debugger service running on a specific host - and port. The Java VM to which the connection is made must have defined - the system property freemarker.debug.password in order to enable - the debugger service. Additionally, the freemarker.debug.port - system property can be set to specify the port where the debugger service - is listening. When not specified, it defaults to - Debugger.DEFAULT_PORT.
          -
          -
          Parameters:
          -
          host - the host address of the machine where the debugger service is - running.
          -
          port - the port of the debugger service
          -
          password - the password required to connect to the debugger service
          -
          Returns:
          -
          Debugger a debugger object. null is returned in case incorrect - password was supplied.
          -
          Throws:
          -
          IOException - if an exception occurs.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/DebuggerListener.html b/fmpp/docs/freemarker/api/freemarker/debug/DebuggerListener.html deleted file mode 100644 index 63c11df..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/DebuggerListener.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - -DebuggerListener (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Interface DebuggerListener

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      EventListener, Remote
      -
      -
      -
      -
      public interface DebuggerListener
      -extends Remote, EventListener
      -
      An interface for components that wish to receive debugging events.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/EnvironmentSuspendedEvent.html b/fmpp/docs/freemarker/api/freemarker/debug/EnvironmentSuspendedEvent.html deleted file mode 100644 index 35e7783..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/EnvironmentSuspendedEvent.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - -EnvironmentSuspendedEvent (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.debug
    -

    Class EnvironmentSuspendedEvent

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class EnvironmentSuspendedEvent
      -extends EventObject
      -
      Event describing a suspension of an environment (ie because it hit a - breakpoint).
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getName

          -
          public String getName()
          -
          The name of the template where the execution of the environment - was suspended
          -
          -
          Returns:
          -
          String the template name
          -
          -
        • -
        - - - -
          -
        • -

          getLine

          -
          public int getLine()
          -
          The line number in the template where the execution of the environment - was suspended.
          -
          -
          Returns:
          -
          int the line number
          -
          -
        • -
        - - - -
          -
        • -

          getEnvironment

          -
          public DebuggedEnvironment getEnvironment()
          -
          The environment that was suspended
          -
          -
          Returns:
          -
          DebuggedEnvironment
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/Breakpoint.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/Breakpoint.html deleted file mode 100644 index 70cad68..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/Breakpoint.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -Uses of Class freemarker.debug.Breakpoint (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.debug.Breakpoint

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebugModel.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebugModel.html deleted file mode 100644 index cc51247..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebugModel.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - -Uses of Interface freemarker.debug.DebugModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.debug.DebugModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggedEnvironment.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggedEnvironment.html deleted file mode 100644 index 8def250..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggedEnvironment.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - -Uses of Interface freemarker.debug.DebuggedEnvironment (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.debug.DebuggedEnvironment

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/Debugger.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/Debugger.html deleted file mode 100644 index 24fb497..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/Debugger.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - -Uses of Interface freemarker.debug.Debugger (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.debug.Debugger

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerClient.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerClient.html deleted file mode 100644 index 18d9229..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerClient.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.debug.DebuggerClient (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.debug.DebuggerClient

    -
    -
    No usage of freemarker.debug.DebuggerClient
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerListener.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerListener.html deleted file mode 100644 index 2734282..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/DebuggerListener.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Interface freemarker.debug.DebuggerListener (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.debug.DebuggerListener

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/class-use/EnvironmentSuspendedEvent.html b/fmpp/docs/freemarker/api/freemarker/debug/class-use/EnvironmentSuspendedEvent.html deleted file mode 100644 index b663da8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/class-use/EnvironmentSuspendedEvent.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class freemarker.debug.EnvironmentSuspendedEvent (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.debug.EnvironmentSuspendedEvent

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/package-frame.html b/fmpp/docs/freemarker/api/freemarker/debug/package-frame.html deleted file mode 100644 index 884015a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/package-frame.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - -freemarker.debug (FreeMarker 2.3.21 API) - - - - - -

    freemarker.debug

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/package-summary.html b/fmpp/docs/freemarker/api/freemarker/debug/package-summary.html deleted file mode 100644 index 511c1fe..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/package-summary.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - -freemarker.debug (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.debug

    -
    -
    Debugging API; experimental status, might change! -This is to support debugging in IDE-s.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - -
      Interface Summary 
      InterfaceDescription
      DebuggedEnvironment -
      Represents the debugger-side mirror of a debugged - Environment object in the remote VM.
      -
      Debugger -
      The main debugger interface.
      -
      DebuggerListener -
      An interface for components that wish to receive debugging events.
      -
      DebugModel -
      Represents the debugger-side mirror of a TemplateModel object, a Template - object, or a Configuration object.
      -
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      Breakpoint -
      Represents a breakpoint location consisting of a template name and a line number.
      -
      DebuggerClient -
      A utility class that allows you to connect to the FreeMarker debugger service - running on a specific host and port.
      -
      EnvironmentSuspendedEvent -
      Event describing a suspension of an environment (ie because it hit a - breakpoint).
      -
      -
    • -
    - - - -

    Package freemarker.debug Description

    -

    Debugging API; experimental status, might change! -This is to support debugging in IDE-s. If you are working on a client for this, -don't hesitate to contact us!

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/package-tree.html b/fmpp/docs/freemarker/api/freemarker/debug/package-tree.html deleted file mode 100644 index a134c22..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/package-tree.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - -freemarker.debug Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.debug

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/debug/package-use.html b/fmpp/docs/freemarker/api/freemarker/debug/package-use.html deleted file mode 100644 index 4972440..0000000 --- a/fmpp/docs/freemarker/api/freemarker/debug/package-use.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - -Uses of Package freemarker.debug (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.debug

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Packages that use freemarker.debug 
      PackageDescription
      freemarker.debug -
      Debugging API; experimental status, might change! -This is to support debugging in IDE-s.
      -
      -
    • -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Classes in freemarker.debug used by freemarker.debug 
      Class and Description
      Breakpoint -
      Represents a breakpoint location consisting of a template name and a line number.
      -
      DebuggedEnvironment -
      Represents the debugger-side mirror of a debugged - Environment object in the remote VM.
      -
      Debugger -
      The main debugger interface.
      -
      DebuggerListener -
      An interface for components that wish to receive debugging events.
      -
      DebugModel -
      Represents the debugger-side mirror of a TemplateModel object, a Template - object, or a Configuration object.
      -
      EnvironmentSuspendedEvent -
      Event describing a suspension of an environment (ie because it hit a - breakpoint).
      -
      -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/FreemarkerXmlTask.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/FreemarkerXmlTask.html deleted file mode 100644 index 40e9ec6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/FreemarkerXmlTask.html +++ /dev/null @@ -1,796 +0,0 @@ - - - - - - -FreemarkerXmlTask (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.ant
    -

    Class FreemarkerXmlTask

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • org.apache.tools.ant.ProjectComponent
      • -
      • -
          -
        • org.apache.tools.ant.Task
        • -
        • -
            -
          • org.apache.tools.ant.taskdefs.MatchingTask
          • -
          • -
              -
            • freemarker.ext.ant.FreemarkerXmlTask
            • -
            -
          • -
          -
        • -
        -
      • -
      -
    • -
    -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      org.apache.tools.ant.types.selectors.SelectorContainer
      -
      -
      -
      Deprecated.  -
      FMPP is a more complete solution.
      -
      -
      -
      public class FreemarkerXmlTask
      -extends org.apache.tools.ant.taskdefs.MatchingTask
      -

      This is an Ant task for transforming - XML documents using FreeMarker templates. It uses the adapter class - NodeListModel. It will read a set of XML documents, and pass them to - the template for processing, building the corresponding output files in the - destination directory.

      -

      It makes the following variables available to the template in the data model:

      -
        -
      • document: Deprecated! The DOM tree of the currently processed XML file wrapped - with the legacy NodeListModel. - For new projects you should use the .node instead, which initially - contains the DOM Document wrapped with NodeModel.
      • -
      • properties: a SimpleHash containing - properties of the project that executes the task
      • -
      • userProperties: a SimpleHash containing - user properties of the project that executes the task
      • -
      • project: the DOM tree of the XML file specified by the - projectfile. It will not be available if you didn't specify the - projectfile attribute.
      • -
      • further custom models can be instantiated and made available to the - templates using the models attribute.
      • -
      -

      It supports the following attributes:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      AttributeDescriptionRequired
      basedirlocation of the XML files. Defaults to the project's - basedir.No
      destdirlocation to store the generated files.Yes
      includescomma-separated list of patterns of files that must be - included; all files are included when omitted.No
      includesfilethe name of a file that contains - include patterns.No
      excludescomma-separated list of patterns of files that must be - excluded; no files (except default excludes) are excluded when omitted.No
      excludesfilethe name of a file that contains - exclude patterns.No
      defaultexcludesindicates whether default excludes should be used - (yes | no); default excludes are used when omitted.No
      extensionextension of generated files. Defaults to .html.No
      templatename of the FreeMarker template file that will be - applied by default to XML filesNo
      templateDirlocation of the FreeMarker template(s) to be used, defaults - to the project's baseDirNo
      projectfilepath to the project file. The poject file must be an XML file. - If omitted, it will not be available to templates No
      incrementalindicates whether all files should be regenerated (no), or - only those that are older than the XML file, the template file, or the - project file (yes). Defaults to yes. No
      encodingThe encoding of the output files. Defaults to platform - default encoding.No
      templateEncodingThe encoding of the template files. Defaults to platform - default encoding.No
      validationWhether to validate the XML input. Defaults to off.No
      modelsA list of [name=]className pairs separated by spaces, - commas, or semicolons that specifies further models that should be - available to templates. If name is omitted, the unqualified class name - is used as the name. Every class that is specified must implement the - TemplateModel interface and have a no-args constructor.No
      - -

      It supports the following nesed elements:

      - - - - - - - - - - - - - - - - - -
      ElementDescriptionRequired
      prepareModel - This element executes Jython script before the processing of each XML - files, that you can use to modify the data model. - You either enter the Jython script directly nested into this - element, or specify a Jython script file with the file - attribute. - The following variables are added to the Jython runtime's local - namespace before the script is invoked: -
        -
      • model: The data model as java.util.HashMap. - You can read and modify the data model with this variable. -
      • doc: The XML document as org.w3c.dom.Document. -
      • project: The project document (if used) as - org.w3c.dom.Document. -
      - If this element is used, Jython classes (tried with Jython 2.1) - must be available. -
      No
      prepareEnvironmentThis element executes Jython script before the processing - of each XML files, that you can use to modify the freemarker environment - (Environment). The script is executed after the - prepareModel element. The accessible Jython variables are the - same as with the prepareModel element, except that there is no - model variable, but there is env variable, which is - the FreeMarker environment (Environment). - If this element is used, Jython classes (tried with Jython 2.1) - must be available. - No
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        -
          -
        • - - -

          Fields inherited from class org.apache.tools.ant.taskdefs.MatchingTask

          -fileset
        • -
        -
          -
        • - - -

          Fields inherited from class org.apache.tools.ant.Task

          -description, location, target, taskName, taskType, wrapper
        • -
        -
          -
        • - - -

          Fields inherited from class org.apache.tools.ant.ProjectComponent

          -project
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - -
        Constructors 
        Constructor and Description
        FreemarkerXmlTask() -
        Deprecated. 
        -
        Constructor creates the SAXBuilder.
        -
        -
      • -
      - -
        -
      • - - -

        Method Summary

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        All Methods Instance Methods Concrete Methods Deprecated Methods 
        Modifier and TypeMethod and Description
        voidaddConfiguredJython(JythonAntTask jythonAntTask) -
        Deprecated. 
        voidaddConfiguredPrepareEnvironment(JythonAntTask prepareEnvironment) -
        Deprecated. 
        voidaddConfiguredPrepareModel(JythonAntTask prepareModel) -
        Deprecated. 
        voidexecute() -
        Deprecated. 
        protected voidinsertDefaults(Map root) -
        Deprecated. 
        voidsetBasedir(File dir) -
        Deprecated. 
        -
        Set the base directory.
        -
        voidsetDestdir(File dir) -
        Deprecated. 
        -
        Set the destination directory into which the generated - files should be copied to
        -
        voidsetEncoding(String encoding) -
        Deprecated. 
        -
        Set encoding for generated files.
        -
        voidsetExtension(String extension) -
        Deprecated. 
        -
        Set the output file extension.
        -
        voidsetIncremental(String incremental) -
        Deprecated. 
        -
        Turn on/off incremental processing.
        -
        voidsetModels(String models) -
        Deprecated. 
        voidsetProjectfile(String projectAttribute) -
        Deprecated. 
        -
        Set the path to the project XML file
        -
        voidsetTemplate(String templateName) -
        Deprecated. 
        voidsetTemplateDir(File templateDir) -
        Deprecated. 
        voidsetTemplateEncoding(String inputEncoding) -
        Deprecated. 
        voidsetValidation(boolean validation) -
        Deprecated. 
        -
        Sets whether to validate the XML input.
        -
        -
          -
        • - - -

          Methods inherited from class org.apache.tools.ant.taskdefs.MatchingTask

          -add, addAnd, addContains, addContainsRegexp, addCustom, addDate, addDepend, addDepth, addDifferent, addFilename, addMajority, addModified, addNone, addNot, addOr, addPresent, addSelector, addSize, addType, appendSelector, createExclude, createExcludesFile, createInclude, createIncludesFile, createPatternSet, getDirectoryScanner, getImplicitFileSet, getSelectors, hasSelectors, selectorCount, selectorElements, setCaseSensitive, setDefaultexcludes, setExcludes, setExcludesfile, setFollowSymlinks, setIncludes, setIncludesfile, setProject, XsetIgnore, XsetItems
        • -
        -
          -
        • - - -

          Methods inherited from class org.apache.tools.ant.Task

          -getDescription, getLocation, getOwningTarget, getRuntimeConfigurableWrapper, getTaskName, getTaskType, getWrapper, handleErrorFlush, handleErrorOutput, handleFlush, handleInput, handleOutput, init, isInvalid, log, log, maybeConfigure, perform, reconfigure, setDescription, setLocation, setOwningTarget, setRuntimeConfigurableWrapper, setTaskName, setTaskType
        • -
        -
          -
        • - - -

          Methods inherited from class org.apache.tools.ant.ProjectComponent

          -getProject
        • -
        - -
      • -
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          FreemarkerXmlTask

          -
          public FreemarkerXmlTask()
          -
          Deprecated. 
          -
          Constructor creates the SAXBuilder.
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setBasedir

          -
          public void setBasedir(File dir)
          -
          Deprecated. 
          -
          Set the base directory. Defaults to .
          -
        • -
        - - - -
          -
        • -

          setDestdir

          -
          public void setDestdir(File dir)
          -
          Deprecated. 
          -
          Set the destination directory into which the generated - files should be copied to
          -
          -
          Parameters:
          -
          dir - the name of the destination directory
          -
          -
        • -
        - - - -
          -
        • -

          setExtension

          -
          public void setExtension(String extension)
          -
          Deprecated. 
          -
          Set the output file extension. .html by default.
          -
        • -
        - - - -
          -
        • -

          setTemplate

          -
          public void setTemplate(String templateName)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          setTemplateDir

          -
          public void setTemplateDir(File templateDir)
          -                    throws org.apache.tools.ant.BuildException
          -
          Deprecated. 
          -
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        - - - -
          -
        • -

          setProjectfile

          -
          public void setProjectfile(String projectAttribute)
          -
          Deprecated. 
          -
          Set the path to the project XML file
          -
        • -
        - - - -
          -
        • -

          setIncremental

          -
          public void setIncremental(String incremental)
          -
          Deprecated. 
          -
          Turn on/off incremental processing. On by default
          -
        • -
        - - - -
          -
        • -

          setEncoding

          -
          public void setEncoding(String encoding)
          -
          Deprecated. 
          -
          Set encoding for generated files. Defaults to platform default encoding.
          -
        • -
        - - - -
          -
        • -

          setTemplateEncoding

          -
          public void setTemplateEncoding(String inputEncoding)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          setValidation

          -
          public void setValidation(boolean validation)
          -
          Deprecated. 
          -
          Sets whether to validate the XML input.
          -
        • -
        - - - -
          -
        • -

          setModels

          -
          public void setModels(String models)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          execute

          -
          public void execute()
          -             throws org.apache.tools.ant.BuildException
          -
          Deprecated. 
          -
          -
          Overrides:
          -
          execute in class org.apache.tools.ant.Task
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        - - - -
          -
        • -

          addConfiguredJython

          -
          public void addConfiguredJython(JythonAntTask jythonAntTask)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          addConfiguredPrepareModel

          -
          public void addConfiguredPrepareModel(JythonAntTask prepareModel)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          addConfiguredPrepareEnvironment

          -
          public void addConfiguredPrepareEnvironment(JythonAntTask prepareEnvironment)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          insertDefaults

          -
          protected void insertDefaults(Map root)
          -
          Deprecated. 
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/JythonAntTask.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/JythonAntTask.html deleted file mode 100644 index 85180af..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/JythonAntTask.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - -JythonAntTask (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.ant
    -

    Class JythonAntTask

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • org.apache.tools.ant.ProjectComponent
      • -
      • -
          -
        • org.apache.tools.ant.Task
        • -
        • -
            -
          • freemarker.ext.ant.JythonAntTask
          • -
          -
        • -
        -
      • -
      -
    • -
    -
    -
      -
    • -
      -
      -
      public class JythonAntTask
      -extends org.apache.tools.ant.Task
      -
      Used internally, public for technical reasons only. - -

      This is an Ant sub-task of the FreemarkerXmlTask task. - -

      Warning! It must not be statically linked with Jython classes, - so users can use the XML ant task even if Jython is not installed.

      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        -
          -
        • - - -

          Fields inherited from class org.apache.tools.ant.Task

          -description, location, target, taskName, taskType, wrapper
        • -
        -
          -
        • - - -

          Fields inherited from class org.apache.tools.ant.ProjectComponent

          -project
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - -
        Constructors 
        Constructor and Description
        JythonAntTask() 
        -
      • -
      - -
        -
      • - - -

        Method Summary

        - - - - - - - - - - - - - - - - - - -
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidaddText(String text) 
        voidexecute(Map vars) 
        voidsetFile(File scriptFile) 
        -
          -
        • - - -

          Methods inherited from class org.apache.tools.ant.Task

          -execute, getDescription, getLocation, getOwningTarget, getRuntimeConfigurableWrapper, getTaskName, getTaskType, getWrapper, handleErrorFlush, handleErrorOutput, handleFlush, handleInput, handleOutput, init, isInvalid, log, log, maybeConfigure, perform, reconfigure, setDescription, setLocation, setOwningTarget, setRuntimeConfigurableWrapper, setTaskName, setTaskType
        • -
        -
          -
        • - - -

          Methods inherited from class org.apache.tools.ant.ProjectComponent

          -getProject, setProject
        • -
        - -
      • -
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JythonAntTask

          -
          public JythonAntTask()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setFile

          -
          public void setFile(File scriptFile)
          -             throws org.apache.tools.ant.BuildException
          -
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        - - - -
          -
        • -

          addText

          -
          public void addText(String text)
          -
        • -
        - - - -
          -
        • -

          execute

          -
          public void execute(Map vars)
          -             throws org.apache.tools.ant.BuildException
          -
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/UnlinkedJythonOperationsImpl.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/UnlinkedJythonOperationsImpl.html deleted file mode 100644 index 2dc7d49..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/UnlinkedJythonOperationsImpl.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - -UnlinkedJythonOperationsImpl (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.ant
    -

    Class UnlinkedJythonOperationsImpl

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class UnlinkedJythonOperationsImpl
      -extends Object
      -
      Used internally, public for technical reasons only.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          UnlinkedJythonOperationsImpl

          -
          public UnlinkedJythonOperationsImpl()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          execute

          -
          public void execute(String script,
          -                    Map vars)
          -             throws org.apache.tools.ant.BuildException
          -
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        - - - -
          -
        • -

          execute

          -
          public void execute(File file,
          -                    Map vars)
          -             throws org.apache.tools.ant.BuildException
          -
          -
          Throws:
          -
          org.apache.tools.ant.BuildException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/FreemarkerXmlTask.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/FreemarkerXmlTask.html deleted file mode 100644 index beb0f2b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/FreemarkerXmlTask.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.ant.FreemarkerXmlTask (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.ant.FreemarkerXmlTask

    -
    -
    No usage of freemarker.ext.ant.FreemarkerXmlTask
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/JythonAntTask.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/JythonAntTask.html deleted file mode 100644 index d7660b2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/JythonAntTask.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.ant.JythonAntTask (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.ant.JythonAntTask

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/UnlinkedJythonOperationsImpl.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/UnlinkedJythonOperationsImpl.html deleted file mode 100644 index 432063a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/class-use/UnlinkedJythonOperationsImpl.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.ant.UnlinkedJythonOperationsImpl (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.ant.UnlinkedJythonOperationsImpl

    -
    -
    No usage of freemarker.ext.ant.UnlinkedJythonOperationsImpl
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/package-frame.html deleted file mode 100644 index c069494..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -freemarker.ext.ant (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.ant

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/package-summary.html deleted file mode 100644 index f60425c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-summary.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -freemarker.ext.ant (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.ant

    -
    -
    -Ant task to transform XML files -with a template; a more powerful alternative is FMPP.
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.ext.ant Description

    -

    -Ant task to transform XML files -with a template; a more powerful alternative is FMPP.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/package-tree.html deleted file mode 100644 index 3cf4f4f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-tree.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -freemarker.ext.ant Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.ant

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    -
      -
    • java.lang.Object -
        -
      • org.apache.tools.ant.ProjectComponent -
          -
        • org.apache.tools.ant.Task -
            -
          • freemarker.ext.ant.JythonAntTask
          • -
          • org.apache.tools.ant.taskdefs.MatchingTask (implements org.apache.tools.ant.types.selectors.SelectorContainer) - -
          • -
          -
        • -
        -
      • -
      • freemarker.ext.ant.UnlinkedJythonOperationsImpl
      • -
      -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/ant/package-use.html deleted file mode 100644 index 79e6337..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/ant/package-use.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.ant (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.ant

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/ArrayModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/ArrayModel.html deleted file mode 100644 index ea39645..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/ArrayModel.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - - -ArrayModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class ArrayModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ArrayModel

          -
          public ArrayModel(Object array,
          -                  BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified array object.
          -
          -
          Parameters:
          -
          array - the array object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          Throws:
          -
          IllegalArgumentException - if the passed object is not a Java array.
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeanModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeanModel.html deleted file mode 100644 index c78285b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeanModel.html +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - -BeanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeanModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          BeanModel

          -
          public BeanModel(Object object,
          -                 BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified object. Note that there are - specialized subclasses of this class for wrapping arrays, collections, - enumeration, iterators, and maps. Note also that the superclass can be - used to wrap String objects if only scalar functionality is needed. You - can also choose to delegate the choice over which model class is used for - wrapping to BeansWrapper.wrap(Object).
          -
          -
          Parameters:
          -
          object - the object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          public TemplateModel get(String key)
          -                  throws TemplateModelException
          -
          Uses Beans introspection to locate a property or method with name - matching the key name. If a method or property is found, it's wrapped - into TemplateMethodModelEx (for a method or - indexed property), or evaluated on-the-fly and the return value wrapped - into appropriate model (for a simple property) Models for various - properties and methods are cached on a per-class basis, so the costly - introspection is performed only once per property or method of a class. - (Side-note: this also implies that any class whose method has been called - will be strongly referred to by the framework and will not become - unloadable until this class has been unloaded first. Normally this is not - an issue, but can be in a rare scenario where you create many classes on- - the-fly. Also, as the cache grows with new classes and methods introduced - to the framework, it may appear as if it were leaking memory. The - framework does, however detect class reloads (if you happen to be in an - environment that does this kind of things--servlet containers do it when - they reload a web application) and flushes the cache. If no method or - property matching the key is found, the framework will try to invoke - methods with signature - non-void-return-type get(java.lang.String), - then non-void-return-type get(java.lang.Object), or - alternatively (if the wrapped object is a resource bundle) - Object getObject(java.lang.String).
          -
          -
          Specified by:
          -
          get in interface TemplateHashModel
          -
          Parameters:
          -
          key - the name by which the TemplateModel - is identified in the template.
          -
          Returns:
          -
          the TemplateModel referred to by the key, - or null if not found.
          -
          Throws:
          -
          TemplateModelException - if there was no property nor method nor - a generic get method to invoke.
          -
          -
        • -
        - - - -
          -
        • -

          hasPlainGetMethod

          -
          protected boolean hasPlainGetMethod()
          -
          Whether the model has a plain get(String) or get(Object) method
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          isEmpty

          -
          public boolean isEmpty()
          -
          Tells whether the model is empty. It is empty if either the wrapped - object is null, or it's a Boolean with false value.
          -
          -
          Specified by:
          -
          isEmpty in interface TemplateHashModel
          -
          -
        • -
        - - - -
          -
        • -

          getAdaptedObject

          -
          public Object getAdaptedObject(Class hint)
          -
          Returns the same as getWrappedObject(); to ensure that, this method will be final starting from 2.4. - This behavior of BeanModel is assumed by some FreeMarker code.
          -
          -
          Specified by:
          -
          getAdaptedObject in interface AdapterTemplateModel
          -
          Parameters:
          -
          hint - the desired class of the returned value. An implementation - should make reasonable effort to retrieve an object of the requested - class, but if that is impossible, it must at least return the underlying - object as-is. As a minimal requirement, an implementation must always - return the exact underlying object when - hint.isInstance(underlyingObject) holds. When called - with java.lang.Object.class, it should return a generic Java - object (i.e. if the model is wrapping a scripting language object that is - further wrapping a Java object, the deepest underlying Java object should - be returned).
          -
          Returns:
          -
          the underlying object, or its value accommodated for the hint - class.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateHashModelEx
          -
          Returns:
          -
          the number of key/value mappings in the hash.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          keySet

          -
          protected Set keySet()
          -
          Helper method to support TemplateHashModelEx. Returns the Set of - Strings which are available via the TemplateHashModel - interface. Subclasses that override invokeGenericGet to - provide additional hash keys should also override this method.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansModelCache.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansModelCache.html deleted file mode 100644 index db6e104..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansModelCache.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - -BeansModelCache (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansModelCache

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class BeansModelCache
      -extends ModelCache
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecision.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecision.html deleted file mode 100644 index fc4da14..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecision.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - -BeansWrapper.MethodAppearanceDecision (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansWrapper.MethodAppearanceDecision

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
      • -
      -
    • -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          MethodAppearanceDecision

          -
          public MethodAppearanceDecision()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - -
          -
        • -

          setExposeAsProperty

          -
          public void setExposeAsProperty(PropertyDescriptor exposeAsProperty)
          -
        • -
        - - - -
          -
        • -

          getExposeMethodAs

          -
          public String getExposeMethodAs()
          -
        • -
        - - - -
          -
        • -

          setExposeMethodAs

          -
          public void setExposeMethodAs(String exposeAsMethod)
          -
        • -
        - - - -
          -
        • -

          getMethodShadowsProperty

          -
          public boolean getMethodShadowsProperty()
          -
        • -
        - - - -
          -
        • -

          setMethodShadowsProperty

          -
          public void setMethodShadowsProperty(boolean shadowEarlierProperty)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecisionInput.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecisionInput.html deleted file mode 100644 index 70c1ba0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.MethodAppearanceDecisionInput.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - -BeansWrapper.MethodAppearanceDecisionInput (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansWrapper.MethodAppearanceDecisionInput

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput
      • -
      -
    • -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          MethodAppearanceDecisionInput

          -
          public MethodAppearanceDecisionInput()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getMethod

          -
          public Method getMethod()
          -
        • -
        - - - -
          -
        • -

          getContainingClass

          -
          public Class getContainingClass()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.html deleted file mode 100644 index ceb9c08..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapper.html +++ /dev/null @@ -1,1499 +0,0 @@ - - - - - - -BeansWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansWrapper

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          EXPOSE_ALL

          -
          public static final int EXPOSE_ALL
          -
          At this level of exposure, all methods and properties of the - wrapped objects are exposed to the template.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          EXPOSE_SAFE

          -
          public static final int EXPOSE_SAFE
          -
          At this level of exposure, all methods and properties of the wrapped - objects are exposed to the template except methods that are deemed - not safe. The not safe methods are java.lang.Object methods wait() and - notify(), java.lang.Class methods getClassLoader() and newInstance(), - java.lang.reflect.Method and java.lang.reflect.Constructor invoke() and - newInstance() methods, all java.lang.reflect.Field set methods, all - java.lang.Thread and java.lang.ThreadGroup methods that can change its - state, as well as the usual suspects in java.lang.System and - java.lang.Runtime.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          EXPOSE_PROPERTIES_ONLY

          -
          public static final int EXPOSE_PROPERTIES_ONLY
          -
          At this level of exposure, only property getters are exposed. - Additionally, property getters that map to unsafe methods are not - exposed (i.e. Class.classLoader and Thread.contextClassLoader).
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          EXPOSE_NOTHING

          -
          public static final int EXPOSE_NOTHING
          -
          At this level of exposure, no bean properties and methods are exposed. - Only map items, resource bundle items, and objects retrieved through - the generic get method (on objects of classes that have a generic get - method) can be retrieved through the hash interface. You might want to - call setMethodsShadowItems(boolean) with false value to - speed up map item retrieval.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Constructor Detail

        - - - - - - - -
          -
        • -

          BeansWrapper

          -
          public BeansWrapper(Version incompatibleImprovements)
          -
          Use BeansWrapperBuilder instead of the public constructors if possible. - The main disadvantage of using the public constructors is that the instances won't share caches. So unless having - a private cache is your goal, don't use them. See
          -
          -
          Parameters:
          -
          incompatibleImprovements - Sets which of the non-backward-compatible improvements should be enabled. Not null. This version number - is the same as the FreeMarker version number with which the improvements were implemented. - -

          For new projects, it's recommended to set this to the FreeMarker version that's used during the development. - For released products that are still actively developed it's a low risk change to increase the 3rd - version number further as FreeMarker is updated, but of course you should always check the list of effects - below. Increasing the 2nd or 1st version number possibly mean substantial changes with higher risk of breaking - the application, but again, see the list of effects below. - -

          The reason it's separate from Configuration.setIncompatibleImprovements(Version) is that - ObjectWrapper objects are often shared among multiple Configuration-s, so the two version - numbers are technically independent. But it's recommended to keep those two version numbers the same. - -

          The changes enabled by incompatibleImprovements are: -

            -
          • -

            2.3.0: No changes; this is the starting point, the version used in older projects. -

          • -
          • -

            2.3.21 (or higher): - Several glitches were fixed in overloaded method selection. This usually just gets - rid of errors (like ambiguity exceptions and numerical precision loses due to bad overloaded method - choices), still, as in some cases the method chosen can be a different one now (that was the point of - the reworking after all), it can mean a change in the behavior of the application. The most important - change is that the treatment of null arguments were fixed, as earlier they were only seen - applicable to parameters of type Object. Now null-s are seen to be applicable to any - non-primitive parameters, and among those the one with the most specific type will be preferred (just - like in Java), which is hence never the one with the Object parameter type. For more details - about overloaded method selection changes see the version history in the FreeMarker Manual. -

          • -
          - -

          Note that the version will be normalized to the lowest version where the same incompatible - BeansWrapper improvements were already present, so getIncompatibleImprovements() might returns - a lower version than what you have specified.

          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          writeProtect

          -
          public void writeProtect()
          -
          Makes the configuration properties (settings) of this BeansWrapper object read-only. As changing them - after the object has become visible to multiple threads leads to undefined behavior, it's recommended to call - this when you have finished configuring the object. - -

          Consider using BeansWrapperBuilder instead, which gives an instance that's already - write protected and also uses some shared caches/pools.

          -
          -
          Specified by:
          -
          writeProtect in interface WriteProtectable
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - -
          -
        • -

          checkModifiable

          -
          protected void checkModifiable()
          -
          If this object is already read-only according to WriteProtectable, throws IllegalStateException, - otherwise does nothing.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setStrict

          -
          public void setStrict(boolean strict)
          -
          Specifies if an attempt to read a bean property that doesn't exist in the - wrapped object should throw an InvalidPropertyException. - -

          If this property is false (the default) then an attempt to read - a missing bean property is the same as reading an existing bean property whose - value is null. The template can't tell the difference, and thus always - can use ?default('something') and ?exists and similar built-ins - to handle the situation. - -

          If this property is true then an attempt to read a bean propertly in - the template (like myBean.aProperty) that doesn't exist in the bean - object (as opposed to just holding null value) will cause - InvalidPropertyException, which can't be suppressed in the template - (not even with myBean.noSuchProperty?default('something')). This way - ?default('something') and ?exists and similar built-ins can be used to - handle existing properties whose value is null, without the risk of - hiding typos in the property names. Typos will always cause error. But mind you, it - goes against the basic approach of FreeMarker, so use this feature only if you really - know what you are doing.

          -
        • -
        - - - -
          -
        • -

          setOuterIdentity

          -
          public void setOuterIdentity(ObjectWrapper outerIdentity)
          -
          When wrapping an object, the BeansWrapper commonly needs to wrap - "sub-objects", for example each element in a wrapped collection. - Normally it wraps these objects using itself. However, this makes - it difficult to delegate to a BeansWrapper as part of a custom - aggregate ObjectWrapper. This method lets you set the ObjectWrapper - which will be used to wrap the sub-objects.
          -
          -
          Parameters:
          -
          outerIdentity - the aggregate ObjectWrapper
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setSimpleMapWrapper

          -
          public void setSimpleMapWrapper(boolean simpleMapWrapper)
          -
          When set to true, the keys in Map-s won't mix with the method names when looking at them - from templates. The default is false for backward-compatibility, but is not recommended. - -

          When this is false, myMap.foo or myMap['foo'] either returns the method foo, - or calls Map.get("foo"). If both exists (the method and the Map key), one will hide the other, - depending on the isMethodsShadowItems(), which default to true (the method - wins). Some frameworks use this so that you can call myMap.get(nonStringKey) from templates [*], but it - comes on the cost of polluting the key-set with the method names, and risking methods accidentally hiding - Map entries (or the other way around). Thus, this setup is not recommended. - (Technical note: Map-s will be wrapped into MapModel in this case.) - -

          When this is true, myMap.foo or myMap['foo'] always calls Map.get("foo"). - The methods of the Map object aren't visible from templates in this case. This, however, spoils the - myMap.get(nonStringKey) workaround. But now you can use myMap(nonStringKey) instead, that is, you - can use the map itself as the get method. - (Technical note: Map-s will be wrapped into SimpleMapModel in this case.) - -

          *: For historical reasons, FreeMarker 2.3.X doesn't support non-string keys with the [] operator, - hence the workarounds. This will be likely fixed in FreeMarker 2.4.0. Also note that the method- and - the "field"-namespaces aren't separate in FreeMarker, hence myMap.get can return the get - method.

          -
        • -
        - - - -
          -
        • -

          isSimpleMapWrapper

          -
          public boolean isSimpleMapWrapper()
          -
          Tells whether Maps are exposed as simple maps, without access to their - method. See setSimpleMapWrapper(boolean) for details.
          -
          -
          Returns:
          -
          true if Maps are exposed as simple hashes, false if they're - exposed as full JavaBeans.
          -
          -
        • -
        - - - -
          -
        • -

          setExposureLevel

          -
          public void setExposureLevel(int exposureLevel)
          -
          Sets the method exposure level. By default, set to EXPOSE_SAFE.
          -
          -
          Parameters:
          -
          exposureLevel - can be any of the EXPOSE_xxx - constants.
          -
          -
        • -
        - - - -
          -
        • -

          getExposureLevel

          -
          public int getExposureLevel()
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          setExposeFields

          -
          public void setExposeFields(boolean exposeFields)
          -
          Controls whether public instance fields of classes are exposed to - templates.
          -
          -
          Parameters:
          -
          exposeFields - if set to true, public instance fields of classes - that do not have a property getter defined can be accessed directly by - their name. If there is a property getter for a property of the same - name as the field (i.e. getter "getFoo()" and field "foo"), then - referring to "foo" in template invokes the getter. If set to false, no - access to public instance fields of classes is given. Default is false.
          -
          -
        • -
        - - - -
          -
        • -

          isExposeFields

          -
          public boolean isExposeFields()
          -
          Returns whether exposure of public instance fields of classes is - enabled. See setExposeFields(boolean) for details.
          -
          -
          Returns:
          -
          true if public instance fields are exposed, false otherwise.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          isClassIntrospectionCacheRestricted

          -
          public boolean isClassIntrospectionCacheRestricted()
          -
          Tells if this instance acts like if its class introspection cache is sharable with other BeansWrapper-s. - A restricted cache denies certain too "antisocial" operations, like clearClassIntrospecitonCache(). - The value depends on how the instance - was created; with a public constructor (then this is false), or with BeansWrapperBuilder - (then it's true). Note that in the last case it's possible that the introspection cache - will not be actually shared because there's no one to share with, but this will true even then.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          setMethodsShadowItems

          -
          public void setMethodsShadowItems(boolean methodsShadowItems)
          -
          Sets whether methods shadow items in beans. When true (this is the - default value), ${object.name} will first try to locate - a bean method or property with the specified name on the object, and - only if it doesn't find it will it try to call - object.get(name), the so-called "generic get method" that - is usually used to access items of a container (i.e. elements of a map). - When set to false, the lookup order is reversed and generic get method - is called first, and only if it returns null is method lookup attempted.
          -
        • -
        - - - -
          -
        • -

          setDefaultDateType

          -
          public void setDefaultDateType(int defaultDateType)
          -
          Sets the default date type to use for date models that result from - a plain java.util.Date instead of java.sql.Date or - java.sql.Time or java.sql.Timestamp. Default value is - TemplateDateModel.UNKNOWN.
          -
          -
          Parameters:
          -
          defaultDateType - the new default date type.
          -
          -
        • -
        - - - -
          -
        • -

          getDefaultDateType

          -
          public int getDefaultDateType()
          -
          Returns the default date type. See setDefaultDateType(int) for - details.
          -
          -
          Returns:
          -
          the default date type
          -
          -
        • -
        - - - -
          -
        • -

          setUseCache

          -
          public void setUseCache(boolean useCache)
          -
          Sets whether this wrapper caches the TemplateModel-s created for the Java objects that has wrapped with - this object wrapper. Default is false. - When set to true, calling wrap(Object) multiple times for - the same object will likely return the same model (although there is - no guarantee as the cache items can be cleared any time).
          -
        • -
        - - - -
          -
        • -

          getUseCache

          -
          public boolean getUseCache()
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          setNullModel

          -
          public void setNullModel(TemplateModel nullModel)
          -
          Sets the null model. This model is returned from the - wrap(Object) method whenever the underlying object - reference is null. It defaults to null reference, which is dealt - with quite strictly on engine level, however you can substitute an - arbitrary (perhaps more lenient) model, such as - TemplateScalarModel.EMPTY_STRING.
          -
        • -
        - - - -
          -
        • -

          getIncompatibleImprovements

          -
          public Version getIncompatibleImprovements()
          -
          Returns the version given with BeansWrapper(Version), normalized to the lowest version where a change - has occurred. Thus, this is not necessarily the same version than that was given to the constructor.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          normalizeIncompatibleImprovementsVersion

          -
          protected static Version normalizeIncompatibleImprovementsVersion(Version incompatibleImprovements)
          -
          Returns the lowest version number that is equivalent with the parameter version.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getDefaultInstance

          -
          public static final BeansWrapper getDefaultInstance()
          -
          Deprecated. Use BeansWrapperBuilder instead. The instance returned here is not read-only, so it's - dangerous to use.
          -
          Returns the default instance of the wrapper. This instance is used - when you construct various bean models without explicitly specifying - a wrapper. It is also returned by - ObjectWrapper.BEANS_WRAPPER - and this is the sole instance that is used by the JSP adapter. - You can modify the properties of the default instance (caching, - exposure level, null model) to affect its operation. By default, the - default instance is not caching, uses the EXPOSE_SAFE - exposure level, and uses null reference as the null model.
          -
        • -
        - - - - - - - -
          -
        • -

          getInstance

          -
          protected TemplateModel getInstance(Object object,
          -                                    ModelFactory factory)
          -
          Deprecated. override getModelFactory(Class) instead. Using this - method will now bypass wrapper caching (if it's enabled) and always - result in creation of a new wrapper. This method will be removed in 2.4
          -
          -
          Parameters:
          -
          object - The object to wrap
          -
          factory - The factory that wraps the object
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          unwrap

          -
          public Object unwrap(TemplateModel model,
          -                     Class hint)
          -              throws TemplateModelException
          -
          Attempts to unwrap a model into an object of the desired class. - Generally, this method is the inverse of the wrap(Object) - method. It recognizes a wide range of hint classes - all Java built-in - primitives, primitive wrappers, numbers, dates, sets, lists, maps, and - native arrays.
          -
          -
          Parameters:
          -
          model - the model to unwrap
          -
          hint - the class of the unwrapped result
          -
          Returns:
          -
          the unwrapped result of the desired class
          -
          Throws:
          -
          TemplateModelException - if an attempted unwrapping fails.
          -
          -
        • -
        - - - -
          -
        • -

          getStaticModels

          -
          public TemplateHashModel getStaticModels()
          -
          Returns a hash model that represents the so-called class static models. - Every class static model is itself a hash through which you can call - static methods on the specified class. To obtain a static model for a - class, get the element of this hash with the fully qualified class name. - For example, if you place this hash model inside the root data model - under name "statics", you can use i.e. statics["java.lang. - System"]. currentTimeMillis() to call the System.currentTimeMillis() method.
          -
          -
          Returns:
          -
          a hash model whose keys are fully qualified class names, and - that returns hash models whose elements are the static models of the - classes.
          -
          -
        • -
        - - - -
          -
        • -

          getEnumModels

          -
          public TemplateHashModel getEnumModels()
          -
          Returns a hash model that represents the so-called class enum models. - Every class' enum model is itself a hash through which you can access - enum value declared by the specified class, assuming that class is an - enumeration. To obtain an enum model for a class, get the element of this - hash with the fully qualified class name. For example, if you place this - hash model inside the root data model under name "enums", you can use - i.e. statics["java.math.RoundingMode"].UP to access the - RoundingMode.UP value.
          -
          -
          Returns:
          -
          a hash model whose keys are fully qualified class names, and - that returns hash models whose elements are the enum models of the - classes.
          -
          Throws:
          -
          UnsupportedOperationException - if this method is invoked on a - pre-1.5 JRE, as Java enums aren't supported there.
          -
          -
        • -
        - - - -
          -
        • -

          newInstance

          -
          public Object newInstance(Class clazz,
          -                          List arguments)
          -                   throws TemplateModelException
          -
          Creates a new instance of the specified class using the method call logic of this object wrapper for calling the - constructor. Overloaded constructors and varargs are supported. Only public constructors will be called.
          -
          -
          Parameters:
          -
          clazz - The class whose constructor we will call.
          -
          arguments - The list of TemplateModel-s to pass to the constructor after unwrapping them
          -
          Returns:
          -
          The instance created; it's not wrapped into TemplateModel.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          removeFromClassIntrospectionCache

          -
          public void removeFromClassIntrospectionCache(Class clazz)
          -
          Removes the introspection data for a class from the cache. - Use this if you know that a class is not used anymore in templates. - If the class will be still used, the cache entry will be silently - re-created, so this isn't a dangerous operation.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          clearClassIntrospecitonCache

          -
          public void clearClassIntrospecitonCache()
          -
          Removes all class introspection data from the cache. - -

          Use this if you want to free up memory on the expense of recreating - the cache entries for the classes that will be used later in templates.

          -
          -
          Throws:
          -
          IllegalStateException - if isClassIntrospectionCacheRestricted() is true.
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - -
          -
        • -

          coerceBigDecimals

          -
          public static void coerceBigDecimals(AccessibleObject callable,
          -                                     Object[] args)
          -
          Converts any BigDecimals in the passed array to the type of - the corresponding formal argument of the method.
          -
        • -
        - - - -
          -
        • -

          coerceBigDecimals

          -
          public static void coerceBigDecimals(Class[] formalTypes,
          -                                     Object[] args)
          -
          Converts any BigDecimals in the passed array to the type of - the corresponding formal argument of the method.
          -
        • -
        - - - - - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Returns the exact class name and the identity hash, also the values of the most often used BeansWrapper - configuration properties, also if which (if any) shared class introspection cache it uses.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperBuilder.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperBuilder.html deleted file mode 100644 index 0a7ce03..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperBuilder.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - -BeansWrapperBuilder (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansWrapperBuilder

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Cloneable
      -
      -
      -
      -
      public class BeansWrapperBuilder
      -extends BeansWrapperConfiguration
      -
      Gets/creates a BeansWrapper singleton instance that's already configured as specified in the properties of - this object; this is recommended over using the BeansWrapper constructors. The returned instance can't be - further configured (it's write protected). - -

      The builder meant to be used as a drop-away object (not stored in a field), like in this example: -

      -    BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build();
      - 
      - -

      Or, a more complex example:

      -
      -    // Create the builder:
      -    BeansWrapperBuilder builder = new BeansWrapperBuilder(Configuration.VERSION_2_3_21);
      -    // Set desired BeansWrapper configuration properties:
      -    builder.setUseMoldeCache(true);
      -    builder.setExposeFields(true);
      -    
      -    // Get the singleton:
      -    BeansWrapper beansWrapper = builder.build();
      -    // You don't need the builder anymore.
      - 
      - -

      Despite that builders aren't meant to be used as long-lived objects (singletons), the builder is thread-safe after - you have stopped calling its setters and it was safely published (see JSR 133) to other threads. This can be useful - if you have to put the builder into an IoC container, rather than the singleton it produces. - -

      The main benefit of using a builder instead of a BeansWrapper constructor is that this way the - internal object wrapping-related caches (most notably the class introspection cache) will come from a global, - JVM-level (more precisely, freemarker.jar-class-loader-level) cache. Also the BeansWrapper singletons - themselves are stored in this global cache. Some of the wrapping-related caches are expensive to build and can take - significant amount of memory. Using builders, components that use FreeMarker will share BeansWrapper - instances and said caches even if they use separate FreeMarker Configuration-s. (Many Java libraries use - FreeMarker internally, so Configuration sharing is not an option.) - -

      Note that the returned BeansWrapper instances are only weak-referenced from inside the builder mechanism, - so singletons are garbage collected when they go out of usage, just like non-singletons. - -

      About the object wrapping-related caches: -

        -
      • Class introspection cache: Stores information about classes that once had to be wrapped. The cache is - stored in the static fields of certain FreeMarker classes. Thus, if you have two BeansWrapper - instances, they might share the same class introspection cache. But if you have two - freemarker.jar-s (typically, in two Web Application's WEB-INF/lib directories), those won't - share their caches (as they don't share the same FreeMarker classes). - Also, currently there's a separate cache for each permutation of the property values that influence class - introspection: expose_fields and - exposure_level. So only BeansWrapper where those - properties are the same may share class introspection caches among each other. -

      • -
      • Model caches: These are local to a BeansWrapper. BeansWrapperBuilder returns the same - BeansWrapper instance for equivalent properties (unless the existing instance was garbage collected - and thus a new one had to be created), hence these caches will be re-used too. BeansWrapper instances - are cached in the static fields of FreeMarker too, but there's a separate cache for each - Thread Context Class Loader, which in a servlet container practically means a separate cache for each Web - Application (each servlet context). (This is like so because for resolving class names to classes FreeMarker - uses the Thread Context Class Loader, so the result of the resolution can be different for different - Thread Context Class Loaders.) The model caches are: -

          -
        • - Static model caches: These are used by the hash returned by BeansWrapper.getEnumModels() and - BeansWrapper.getStaticModels(), for caching TemplateModel-s for the static methods/fields - and Java 5 enums that were accessed through them. To use said hashes, you have to put them - explicitly into the data-model or expose them to the template explicitly otherwise, so in most applications - these caches aren't unused. -

        • -
        • - Instance model cache: By default off (see BeansWrapper.setUseCache(boolean)). Caches the - TemplateModel-s for all Java objects that were accessed from templates. -

        • -
        -
      • -
      - -

      Note that what this method documentation says about BeansWrapper also applies to - DefaultObjectWrapperBuilder.

      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperConfiguration.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperConfiguration.html deleted file mode 100644 index 6fedc07..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BeansWrapperConfiguration.html +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - -BeansWrapperConfiguration (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BeansWrapperConfiguration

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Cloneable
      -
      -
      -
      Direct Known Subclasses:
      -
      BeansWrapperBuilder, DefaultObjectWrapperBuilder
      -
      -
      -
      -
      public abstract class BeansWrapperConfiguration
      -extends Object
      -implements Cloneable
      -
      Holds BeansWrapper configuration settings and defines their defaults. - You will not use this abstract class directly, but concrete subclasses like BeansWrapperBuilder and - DefaultObjectWrapperBuilder. Unless, you are developing a builder for a custom BeansWrapper subclass. - -

      This class is designed so that its instances can be used as lookup keys in a singleton cache. This is also why - this class defines the configuration setting defaults for BeansWrapper, instead of leaving that to - BeansWrapper itself. (Because, the default values influence the lookup key, and the singleton needs to be - looked up without creating a BeansWrapper instance.) However, because instances are mutable, you should - deep-clone it with clone(boolean) before using it as cache key.

      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/BooleanModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/BooleanModel.html deleted file mode 100644 index 7ab9953..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/BooleanModel.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - -BooleanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class BooleanModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getAsBoolean

          -
          public boolean getAsBoolean()
          -
          -
          Specified by:
          -
          getAsBoolean in interface TemplateBooleanModel
          -
          Returns:
          -
          whether to interpret this object as true or false in a boolean context
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/CollectionModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/CollectionModel.html deleted file mode 100644 index 48e4108..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/CollectionModel.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - -CollectionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class CollectionModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          CollectionModel

          -
          public CollectionModel(Collection collection,
          -                       BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified collection object.
          -
          -
          Parameters:
          -
          collection - the collection object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -                  throws TemplateModelException
          -
          Retrieves the i-th object from the collection, wrapped as a TemplateModel.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException - if the index is out of bounds, or the - underlying collection is not a List.
          -
          -
        • -
        - - - -
          -
        • -

          getSupportsIndexedAccess

          -
          public boolean getSupportsIndexedAccess()
          -
          Tells if get(int) will always fail for this object. - As this object implements TemplateSequenceModel, - get(int) should always work, but due to a design flaw, for - non-List wrapped objects get(int) will always fail. - This method exists to ease working this problem around.
          -
          -
          Since:
          -
          2.3.17
          -
          -
        • -
        - - - - - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/DateModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/DateModel.html deleted file mode 100644 index 4340a73..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/DateModel.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - -DateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class DateModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/EnumerationModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/EnumerationModel.html deleted file mode 100644 index 6f6a7e3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/EnumerationModel.html +++ /dev/null @@ -1,407 +0,0 @@ - - - - - - -EnumerationModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class EnumerationModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/HashAdapter.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/HashAdapter.html deleted file mode 100644 index b5eb66b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/HashAdapter.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - -HashAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class HashAdapter

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/InvalidPropertyException.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/InvalidPropertyException.html deleted file mode 100644 index fc15842..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/InvalidPropertyException.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - -InvalidPropertyException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class InvalidPropertyException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class InvalidPropertyException
      -extends TemplateModelException
      -
      An exception thrown when there is an attempt to access - an invalid bean property when we are in a "strict bean" mode
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    - -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          InvalidPropertyException

          -
          public InvalidPropertyException(String description)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/IteratorModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/IteratorModel.html deleted file mode 100644 index 738386f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/IteratorModel.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - -IteratorModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class IteratorModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/MapModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/MapModel.html deleted file mode 100644 index 95f304c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/MapModel.html +++ /dev/null @@ -1,475 +0,0 @@ - - - - - - -MapModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class MapModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          MapModel

          -
          public MapModel(Map map,
          -                BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified map object.
          -
          -
          Parameters:
          -
          map - the map object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          isEmpty

          -
          public boolean isEmpty()
          -
          Description copied from class: BeanModel
          -
          Tells whether the model is empty. It is empty if either the wrapped - object is null, or it's a Boolean with false value.
          -
          -
          Specified by:
          -
          isEmpty in interface TemplateHashModel
          -
          Overrides:
          -
          isEmpty in class BeanModel
          -
          -
        • -
        - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateHashModelEx
          -
          Overrides:
          -
          size in class BeanModel
          -
          Returns:
          -
          the number of key/value mappings in the hash.
          -
          -
        • -
        - - - -
          -
        • -

          keySet

          -
          protected Set keySet()
          -
          Description copied from class: BeanModel
          -
          Helper method to support TemplateHashModelEx. Returns the Set of - Strings which are available via the TemplateHashModel - interface. Subclasses that override invokeGenericGet to - provide additional hash keys should also override this method.
          -
          -
          Overrides:
          -
          keySet in class BeanModel
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/MethodAppearanceFineTuner.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/MethodAppearanceFineTuner.html deleted file mode 100644 index d7b7407..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/MethodAppearanceFineTuner.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - -MethodAppearanceFineTuner (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Interface MethodAppearanceFineTuner

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/NumberModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/NumberModel.html deleted file mode 100644 index 5561d5d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/NumberModel.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - -NumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class NumberModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NumberModel

          -
          public NumberModel(Number number,
          -                   BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified number object.
          -
          -
          Parameters:
          -
          number - the number object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/OverloadedMethodsModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/OverloadedMethodsModel.html deleted file mode 100644 index 6acc412..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/OverloadedMethodsModel.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - -OverloadedMethodsModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class OverloadedMethodsModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          exec

          -
          public Object exec(List arguments)
          -            throws TemplateModelException
          -
          Invokes the method, passing it the arguments from the list. The actual - method to call from several overloaded methods will be chosen based - on the classes of the arguments.
          -
          -
          Specified by:
          -
          exec in interface TemplateMethodModel
          -
          Specified by:
          -
          exec in interface TemplateMethodModelEx
          -
          Parameters:
          -
          arguments - a List of TemplateModel-s, - containing the arguments passed to the method. If the implementation absolutely wants - to operate on POJOs, it can use the static utility methods in the DeepUnwrap - class to easily obtain them. However, unwrapping is not always possible (or not perfectly), and isn't always - efficient, so it's recommended to use the original TemplateModel value as much as possible.
          -
          Returns:
          -
          the return value of the method, or null. If the returned value - does not implement TemplateModel, it will be automatically - wrapped using the environment's - object wrapper.
          -
          Throws:
          -
          TemplateModelException - if the method cannot be chosen - unambiguously.
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -                  throws TemplateModelException
          -
          Description copied from interface: TemplateSequenceModel
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/ResourceBundleModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/ResourceBundleModel.html deleted file mode 100644 index f067dc5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/ResourceBundleModel.html +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - -ResourceBundleModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class ResourceBundleModel

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      WrapperTemplateModel, AdapterTemplateModel, TemplateHashModel, TemplateHashModelEx, TemplateMethodModel, TemplateMethodModelEx, TemplateModel
      -
      -
      -
      -
      public class ResourceBundleModel
      -extends BeanModel
      -implements TemplateMethodModelEx
      -

      A hash model that wraps a resource bundle. Makes it convenient to store - localized content in the data model. It also acts as a method model that will - take a resource key and arbitrary number of arguments and will apply - MessageFormat with arguments on the string represented by the key.

      - -

      Typical usages:

      -
        -
      • bundle.resourceKey will retrieve the object from resource bundle - with key resourceKey
      • -
      • bundle("patternKey", arg1, arg2, arg3) will retrieve the string - from resource bundle with key patternKey, and will use it as a pattern - for MessageFormat with arguments arg1, arg2 and arg3
      • -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateHashModelEx
          -
          Overrides:
          -
          size in class BeanModel
          -
          Returns:
          -
          the number of key/value mappings in the hash.
          -
          -
        • -
        - - - -
          -
        • -

          keySet

          -
          protected Set keySet()
          -
          Description copied from class: BeanModel
          -
          Helper method to support TemplateHashModelEx. Returns the Set of - Strings which are available via the TemplateHashModel - interface. Subclasses that override invokeGenericGet to - provide additional hash keys should also override this method.
          -
          -
          Overrides:
          -
          keySet in class BeanModel
          -
          -
        • -
        - - - -
          -
        • -

          exec

          -
          public Object exec(List arguments)
          -            throws TemplateModelException
          -
          Takes first argument as a resource key, looks up a string in resource bundle - with this key, then applies a MessageFormat.format on the string with the - rest of the arguments. The created MessageFormats are cached for later reuse.
          -
          -
          Specified by:
          -
          exec in interface TemplateMethodModel
          -
          Specified by:
          -
          exec in interface TemplateMethodModelEx
          -
          Parameters:
          -
          arguments - a List of TemplateModel-s, - containing the arguments passed to the method. If the implementation absolutely wants - to operate on POJOs, it can use the static utility methods in the DeepUnwrap - class to easily obtain them. However, unwrapping is not always possible (or not perfectly), and isn't always - efficient, so it's recommended to use the original TemplateModel value as much as possible.
          -
          Returns:
          -
          the return value of the method, or null. If the returned value - does not implement TemplateModel, it will be automatically - wrapped using the environment's - object wrapper.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMapModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMapModel.html deleted file mode 100644 index 635ca98..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMapModel.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - -SimpleMapModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class SimpleMapModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SimpleMapModel

          -
          public SimpleMapModel(Map map,
          -                      BeansWrapper wrapper)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - - - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateHashModelEx
          -
          Returns:
          -
          the number of key/value mappings in the hash.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          getAdaptedObject

          -
          public Object getAdaptedObject(Class hint)
          -
          Description copied from interface: AdapterTemplateModel
          -
          Retrieves the underlying object, or some other object semantically - equivalent to its value narrowed by the class hint.
          -
          -
          Specified by:
          -
          getAdaptedObject in interface AdapterTemplateModel
          -
          Parameters:
          -
          hint - the desired class of the returned value. An implementation - should make reasonable effort to retrieve an object of the requested - class, but if that is impossible, it must at least return the underlying - object as-is. As a minimal requirement, an implementation must always - return the exact underlying object when - hint.isInstance(underlyingObject) holds. When called - with java.lang.Object.class, it should return a generic Java - object (i.e. if the model is wrapping a scripting language object that is - further wrapping a Java object, the deepest underlying Java object should - be returned).
          -
          Returns:
          -
          the underlying object, or its value accommodated for the hint - class.
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMethodModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMethodModel.html deleted file mode 100644 index 03ff155..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/SimpleMethodModel.html +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - -SimpleMethodModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class SimpleMethodModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - - - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -                  throws TemplateModelException
          -
          Description copied from interface: TemplateSequenceModel
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          explainTypeError

          -
          public Object[] explainTypeError(Class[] expectedClasses)
          -
          Implementation of experimental interface; don't use it, no backward compatibility guarantee!
          -
          -
          Specified by:
          -
          explainTypeError in interface freemarker.core._UnexpectedTypeErrorExplainerTemplateModel
          -
          -
        • -
        - - - -
          -
        • -

          getMember

          -
          protected Member getMember()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/SingletonCustomizer.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/SingletonCustomizer.html deleted file mode 100644 index e2aa2d6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/SingletonCustomizer.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - -SingletonCustomizer (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Interface SingletonCustomizer

    -
    -
    -
    -
      -
    • -
      -
      -
      public interface SingletonCustomizer
      -
      Marker interface useful when used together with MethodAppearanceFineTuner and such customizer objects, to - indicate that it doesn't contain reference to the ObjectWrapper (so beware with non-static inner - classes) and can be and should be used in call introspection cache keys. This also implies that you won't - create many instances of the class, rather just reuse the same (or same few) instances over and over. Furthermore, - the instances must be thread-safe. The typical pattern in which this instance should be used is like this: - -
      static class MyMethodAppearanceFineTuner implements MethodAppearanceFineTuner, SingletonCustomizer {
      -      
      -    // This is the singleton:
      -    static final MyMethodAppearanceFineTuner INSTANCE = new MyMethodAppearanceFineTuner();
      -     
      -    // Private, so it can't be constructed from outside this class.
      -    private MyMethodAppearanceFineTuner() { }
      -
      -    @Override
      -    public void fineTuneMethodAppearance(...) {
      -       // Do something here, only using the parameters and maybe some other singletons. 
      -       ...
      -    }
      -     
      - }
      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/StringModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/StringModel.html deleted file mode 100644 index d39fcef..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/StringModel.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - -StringModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.beans
    -

    Class StringModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          StringModel

          -
          public StringModel(Object object,
          -                   BeansWrapper wrapper)
          -
          Creates a new model that wraps the specified object with BeanModel + scalar - functionality.
          -
          -
          Parameters:
          -
          object - the object to wrap into a model.
          -
          wrapper - the BeansWrapper associated with this model. - Every model has to have an associated BeansWrapper instance. The - model gains many attributes from its wrapper, including the caching - behavior, method exposure level, method-over-item shadowing policy etc.
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ArrayModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ArrayModel.html deleted file mode 100644 index 664b1dc..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ArrayModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.ArrayModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.ArrayModel

    -
    -
    No usage of freemarker.ext.beans.ArrayModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeanModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeanModel.html deleted file mode 100644 index a0a5bd6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeanModel.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeanModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansModelCache.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansModelCache.html deleted file mode 100644 index a625e64..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansModelCache.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansModelCache (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansModelCache

    -
    -
    No usage of freemarker.ext.beans.BeansModelCache
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecision.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecision.html deleted file mode 100644 index 59cf9da..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecision.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecisionInput.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecisionInput.html deleted file mode 100644 index 3192a54..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.MethodAppearanceDecisionInput.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.html deleted file mode 100644 index 7fd20fa..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapper.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansWrapper

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperBuilder.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperBuilder.html deleted file mode 100644 index f7169f1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperBuilder.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansWrapperBuilder (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansWrapperBuilder

    -
    -
    No usage of freemarker.ext.beans.BeansWrapperBuilder
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperConfiguration.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperConfiguration.html deleted file mode 100644 index 764b518..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BeansWrapperConfiguration.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BeansWrapperConfiguration (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BeansWrapperConfiguration

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BooleanModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BooleanModel.html deleted file mode 100644 index 4d007ab..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/BooleanModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.BooleanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.BooleanModel

    -
    -
    No usage of freemarker.ext.beans.BooleanModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/CollectionModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/CollectionModel.html deleted file mode 100644 index c836ffe..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/CollectionModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.CollectionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.CollectionModel

    -
    -
    No usage of freemarker.ext.beans.CollectionModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/DateModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/DateModel.html deleted file mode 100644 index 9cacbe1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/DateModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.DateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.DateModel

    -
    -
    No usage of freemarker.ext.beans.DateModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/EnumerationModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/EnumerationModel.html deleted file mode 100644 index 40de8bf..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/EnumerationModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.EnumerationModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.EnumerationModel

    -
    -
    No usage of freemarker.ext.beans.EnumerationModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/HashAdapter.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/HashAdapter.html deleted file mode 100644 index 2907764..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/HashAdapter.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.HashAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.HashAdapter

    -
    -
    No usage of freemarker.ext.beans.HashAdapter
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/InvalidPropertyException.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/InvalidPropertyException.html deleted file mode 100644 index 0050204..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/InvalidPropertyException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.InvalidPropertyException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.InvalidPropertyException

    -
    -
    No usage of freemarker.ext.beans.InvalidPropertyException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/IteratorModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/IteratorModel.html deleted file mode 100644 index d9de3ee..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/IteratorModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.IteratorModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.IteratorModel

    -
    -
    No usage of freemarker.ext.beans.IteratorModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MapModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MapModel.html deleted file mode 100644 index 3ccc6fe..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MapModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.MapModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.MapModel

    -
    -
    No usage of freemarker.ext.beans.MapModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MethodAppearanceFineTuner.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MethodAppearanceFineTuner.html deleted file mode 100644 index dcc1bb4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/MethodAppearanceFineTuner.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - -Uses of Interface freemarker.ext.beans.MethodAppearanceFineTuner (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.ext.beans.MethodAppearanceFineTuner

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/NumberModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/NumberModel.html deleted file mode 100644 index e216825..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/NumberModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.NumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.NumberModel

    -
    -
    No usage of freemarker.ext.beans.NumberModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/OverloadedMethodsModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/OverloadedMethodsModel.html deleted file mode 100644 index df64522..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/OverloadedMethodsModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.OverloadedMethodsModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.OverloadedMethodsModel

    -
    -
    No usage of freemarker.ext.beans.OverloadedMethodsModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ResourceBundleModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ResourceBundleModel.html deleted file mode 100644 index a375034..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/ResourceBundleModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.ResourceBundleModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.ResourceBundleModel

    -
    -
    No usage of freemarker.ext.beans.ResourceBundleModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMapModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMapModel.html deleted file mode 100644 index 1de5f8b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMapModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.SimpleMapModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.SimpleMapModel

    -
    -
    No usage of freemarker.ext.beans.SimpleMapModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMethodModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMethodModel.html deleted file mode 100644 index 4f275fd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SimpleMethodModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.SimpleMethodModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.SimpleMethodModel

    -
    -
    No usage of freemarker.ext.beans.SimpleMethodModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SingletonCustomizer.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SingletonCustomizer.html deleted file mode 100644 index 9c3fc6d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/SingletonCustomizer.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Interface freemarker.ext.beans.SingletonCustomizer (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.ext.beans.SingletonCustomizer

    -
    -
    No usage of freemarker.ext.beans.SingletonCustomizer
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/StringModel.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/StringModel.html deleted file mode 100644 index 698459b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/class-use/StringModel.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.beans.StringModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.beans.StringModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/package-frame.html deleted file mode 100644 index 8058eed..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-frame.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - -freemarker.ext.beans (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.beans

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/package-summary.html deleted file mode 100644 index 56d378b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-summary.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - -freemarker.ext.beans (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.beans

    -
    -
    The default object wrapper of FreeMarker uses -this to expose Java Beans and POJO-s to templates, but it can also be used in itself as a -better alternative ObjectWrapper.
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.ext.beans Description

    -

    The default object wrapper of FreeMarker uses -this to expose Java Beans and POJO-s to templates, but it can also be used in itself as a -better alternative ObjectWrapper.

    - -

    Most of the issues dealing with beans are handled by the -BeansWrapper.wrap(Object)and BeansWrapper.getStaticModels() methods. In normal cases, - these are the only methods -you should use to turn an arbitrary Java object into a -FreeMarker TemplateModel. Additionally, you can manually create -instance of any wrapper class using its constructors. -Note, however that in such cases you bypass the eventual model caching -of the wrapper.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/package-tree.html deleted file mode 100644 index d356ae2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-tree.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - -freemarker.ext.beans Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.beans

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/beans/package-use.html deleted file mode 100644 index 21a6ca3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/beans/package-use.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.beans (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.beans

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/NodeModel.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/NodeModel.html deleted file mode 100644 index a507e53..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/NodeModel.html +++ /dev/null @@ -1,1013 +0,0 @@ - - - - - - -NodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.dom
    -

    Class NodeModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NodeModel

          -
          protected NodeModel(Node node)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setDocumentBuilderFactory

          -
          public static void setDocumentBuilderFactory(DocumentBuilderFactory docBuilderFactory)
          -
          Sets the DOM Parser implementation to be used when building NodeModel - objects from XML files.
          -
        • -
        - - - -
          -
        • -

          getDocumentBuilderFactory

          -
          public static DocumentBuilderFactory getDocumentBuilderFactory()
          -
          -
          Returns:
          -
          the DOM Parser implementation that is used when - building NodeModel objects from XML files.
          -
          -
        • -
        - - - -
          -
        • -

          setErrorHandler

          -
          public static void setErrorHandler(ErrorHandler errorHandler)
          -
          sets the error handler to use when parsing the document.
          -
        • -
        - - - -
          -
        • -

          getErrorHandler

          -
          public static ErrorHandler getErrorHandler()
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          parse

          -
          public static NodeModel parse(InputSource is,
          -                              boolean removeComments,
          -                              boolean removePIs)
          -                       throws SAXException,
          -                              IOException,
          -                              ParserConfigurationException
          -
          Create a NodeModel from a SAX input source. Adjacent text nodes will be merged (and CDATA sections - are considered as text nodes).
          -
          -
          Parameters:
          -
          removeComments - whether to remove all comment nodes - (recursively) from the tree before processing
          -
          removePIs - whether to remove all processing instruction nodes - (recursively from the tree before processing
          -
          Throws:
          -
          SAXException
          -
          IOException
          -
          ParserConfigurationException
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          getNode

          -
          public Node getNode()
          -
          -
          Returns:
          -
          the underling W3C DOM Node object that this TemplateNodeModel - is wrapping.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          getChildNodes

          -
          public TemplateSequenceModel getChildNodes()
          -
          -
          Specified by:
          -
          getChildNodes in interface TemplateNodeModel
          -
          Returns:
          -
          a sequence containing this node's children. - If the returned value is null or empty, this is essentially - a leaf node.
          -
          -
        • -
        - - - -
          -
        • -

          getNodeType

          -
          public final String getNodeType()
          -                         throws TemplateModelException
          -
          -
          Specified by:
          -
          getNodeType in interface TemplateNodeModel
          -
          Returns:
          -
          a String describing the type of node this is. - In the W3C DOM, this should be "element", "text", "attribute", etc. - A TemplateNodeModel implementation that models other kinds of - trees could return whatever it appropriate for that application. It - can be null, if you don't want to use node-types.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - - - - -
          -
        • -

          size

          -
          public final int size()
          -
          -
          Specified by:
          -
          size in interface TemplateSequenceModel
          -
          Returns:
          -
          the number of items in the list.
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public final TemplateModel get(int i)
          -
          Description copied from interface: TemplateSequenceModel
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          -
        • -
        - - - -
          -
        • -

          getNodeNamespace

          -
          public String getNodeNamespace()
          -
          -
          Specified by:
          -
          getNodeNamespace in interface TemplateNodeModel
          -
          Returns:
          -
          the XML namespace URI with which this node is - associated. If this TemplateNodeModel implementation is - not XML-related, it will almost certainly be null. Even - for XML nodes, this will often be null.
          -
          -
        • -
        - - - -
          -
        • -

          hashCode

          -
          public final int hashCode()
          -
          -
          Overrides:
          -
          hashCode in class Object
          -
          -
        • -
        - - - -
          -
        • -

          equals

          -
          public boolean equals(Object other)
          -
          -
          Overrides:
          -
          equals in class Object
          -
          -
        • -
        - - - - - - - -
          -
        • -

          removeComments

          -
          public static void removeComments(Node node)
          -
          Recursively removes all comment nodes - from the subtree.
          -
          -
          See Also:
          -
          simplify(org.w3c.dom.Node)
          -
          -
        • -
        - - - -
          -
        • -

          removePIs

          -
          public static void removePIs(Node node)
          -
          Recursively removes all processing instruction nodes - from the subtree.
          -
          -
          See Also:
          -
          simplify(org.w3c.dom.Node)
          -
          -
        • -
        - - - -
          -
        • -

          mergeAdjacentText

          -
          public static void mergeAdjacentText(Node node)
          -
          Merges adjacent text/cdata nodes, so that there are no - adjacent text/cdata nodes. Operates recursively - on the entire subtree. You thus lose information - about any CDATA sections occurring in the doc.
          -
          -
          See Also:
          -
          simplify(org.w3c.dom.Node)
          -
          -
        • -
        - - - -
          -
        • -

          simplify

          -
          public static void simplify(Node node)
          -
          Removes comments and processing instruction, and then unites adjacent text nodes. - Note that CDATA sections count as text nodes.
          -
        • -
        - - - -
          -
        • -

          useDefaultXPathSupport

          -
          public static void useDefaultXPathSupport()
          -
          Tells the system to use (restore) the default (initial) XPath system used by - this FreeMarker version on this system.
          -
        • -
        - - - -
          -
        • -

          useJaxenXPathSupport

          -
          public static void useJaxenXPathSupport()
          -                                 throws Exception
          -
          Convenience method. Tells the system to use Jaxen for XPath queries.
          -
          -
          Throws:
          -
          Exception - if the Jaxen classes are not present.
          -
          -
        • -
        - - - -
          -
        • -

          useXalanXPathSupport

          -
          public static void useXalanXPathSupport()
          -                                 throws Exception
          -
          Convenience method. Tells the system to use Xalan for XPath queries.
          -
          -
          Throws:
          -
          Exception - if the Xalan XPath classes are not present.
          -
          -
        • -
        - - - -
          -
        • -

          useSunInternalXPathSupport

          -
          public static void useSunInternalXPathSupport()
          -                                       throws Exception
          -
          -
          Throws:
          -
          Exception
          -
          -
        • -
        - - - -
          -
        • -

          setXPathSupportClass

          -
          public static void setXPathSupportClass(Class cl)
          -
          Set an alternative implementation of freemarker.ext.dom.XPathSupport to use - as the XPath engine.
          -
          -
          Parameters:
          -
          cl - the class, or null to disable XPath support.
          -
          -
        • -
        - - - -
          -
        • -

          getXPathSupportClass

          -
          public static Class getXPathSupportClass()
          -
          Get the currently used freemarker.ext.dom.XPathSupport used as the XPath engine. - Returns null if XPath support is disabled.
          -
        • -
        - - - -
          -
        • -

          getAdaptedObject

          -
          public Object getAdaptedObject(Class hint)
          -
          Description copied from interface: AdapterTemplateModel
          -
          Retrieves the underlying object, or some other object semantically - equivalent to its value narrowed by the class hint.
          -
          -
          Specified by:
          -
          getAdaptedObject in interface AdapterTemplateModel
          -
          Parameters:
          -
          hint - the desired class of the returned value. An implementation - should make reasonable effort to retrieve an object of the requested - class, but if that is impossible, it must at least return the underlying - object as-is. As a minimal requirement, an implementation must always - return the exact underlying object when - hint.isInstance(underlyingObject) holds. When called - with java.lang.Object.class, it should return a generic Java - object (i.e. if the model is wrapping a scripting language object that is - further wrapping a Java object, the deepest underlying Java object should - be returned).
          -
          Returns:
          -
          the underlying object, or its value accommodated for the hint - class.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          explainTypeError

          -
          public Object[] explainTypeError(Class[] expectedClasses)
          -
          -
          Specified by:
          -
          explainTypeError in interface freemarker.core._UnexpectedTypeErrorExplainerTemplateModel
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/Transform.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/Transform.html deleted file mode 100644 index d048cf2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/Transform.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - -Transform (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.dom
    -

    Class Transform

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class Transform
      -extends Object
      -
      A class that contains a main() method for command-line invocation - of a FreeMarker XML transformation.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          main

          -
          public static void main(String[] args)
          -
          A convenient main() method for command-line invocation.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/XPathSupport.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/XPathSupport.html deleted file mode 100644 index 290e2be..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/XPathSupport.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - -XPathSupport (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.dom
    -

    Interface XPathSupport

    -
    -
    -
    -
      -
    • -
      -
      -
      public interface XPathSupport
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/NodeModel.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/NodeModel.html deleted file mode 100644 index 5df1550..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/NodeModel.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.dom.NodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.dom.NodeModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/Transform.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/Transform.html deleted file mode 100644 index 4e99243..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/Transform.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.dom.Transform (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.dom.Transform

    -
    -
    No usage of freemarker.ext.dom.Transform
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/XPathSupport.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/XPathSupport.html deleted file mode 100644 index 33f7bfd..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/class-use/XPathSupport.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Interface freemarker.ext.dom.XPathSupport (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.ext.dom.XPathSupport

    -
    -
    No usage of freemarker.ext.dom.XPathSupport
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/package-frame.html deleted file mode 100644 index ac427e8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-frame.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -freemarker.ext.dom (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.dom

    -
    -

    Interfaces

    - -

    Classes

    - -
    - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/package-summary.html deleted file mode 100644 index 03589d9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-summary.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - -freemarker.ext.dom (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.dom

    -
    -
    Exposes DOM XML nodes to templates as easily traversable trees; -see in the Manual.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Interface Summary 
      InterfaceDescription
      XPathSupport 
      -
    • -
    • - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      NodeModel -
      A base class for wrapping a W3C DOM Node as a FreeMarker template model.
      -
      Transform -
      A class that contains a main() method for command-line invocation - of a FreeMarker XML transformation.
      -
      -
    • -
    - - - -

    Package freemarker.ext.dom Description

    -

    Exposes DOM XML nodes to templates as easily traversable trees; -see in the Manual. -The default object wrapper of FreeMarker -automatically wraps W3C nodes with this.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/package-tree.html deleted file mode 100644 index b729492..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-tree.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -freemarker.ext.dom Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.dom

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/dom/package-use.html deleted file mode 100644 index f088261..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/dom/package-use.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.dom (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.dom

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/NodeListModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/NodeListModel.html deleted file mode 100644 index 1dc27a7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/NodeListModel.html +++ /dev/null @@ -1,762 +0,0 @@ - - - - - - -NodeListModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jdom
    -

    Class NodeListModel

    -
    -
    - -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - - - - - - - - - - -
        Constructors 
        Constructor and Description
        NodeListModel(org.jdom.Document document) -
        Deprecated. 
        -
        Creates a node list that holds a single Document node.
        -
        NodeListModel(org.jdom.Element element) -
        Deprecated. 
        -
        Creates a node list that holds a single Element node.
        -
        NodeListModel(List nodes) -
        Deprecated. 
        -
        Creates a node list that holds a list of nodes.
        -
        NodeListModel(List nodes, - boolean copy) -
        Deprecated. 
        -
        Creates a node list that holds a list of nodes.
        -
        -
      • -
      - -
        -
      • - - -

        Method Summary

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods 
        Modifier and TypeMethod and Description
        Objectexec(List arguments) -
        Deprecated. 
        -
        Applies an XPath expression to the node list and returns the resulting node list.
        -
        TemplateModelget(int i) -
        Deprecated. 
        -
        Retrieves the i-th element of the node list.
        -
        TemplateModelget(String key) -
        Deprecated. 
        -
        Provides node list traversal as well as special functions: filtering by name, - filtering by node type, shallow-copying, and duplicate removal.
        -
        StringgetAsString() -
        Deprecated. 
        -
        This method returns the string resulting from concatenation - of string representations of its nodes.
        -
        booleanisEmpty() -
        Deprecated. 
        -
        Returns true if this model contains no nodes.
        -
        TemplateModelIteratoriterator() -
        Deprecated. 
        -
        Retrieves a template model iterator that is used to iterate over - the elements in this collection.
        -
        static voidmain(String[] args) -
        Deprecated. 
        -
        Loads a template from a file passed as the first argument, loads an XML - document from the standard input, passes it to the template as variable - document and writes the result of template processing to - standard output.
        -
        voidregisterNamespace(String prefix, - String uri) -
        Deprecated. 
        -
        Registers an XML namespace with this node list.
        -
        intsize() -
        Deprecated. 
        - -
      • -
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NodeListModel

          -
          public NodeListModel(org.jdom.Document document)
          -
          Deprecated. 
          -
          Creates a node list that holds a single Document node.
          -
        • -
        - - - -
          -
        • -

          NodeListModel

          -
          public NodeListModel(org.jdom.Element element)
          -
          Deprecated. 
          -
          Creates a node list that holds a single Element node.
          -
        • -
        - - - -
          -
        • -

          NodeListModel

          -
          public NodeListModel(List nodes)
          -
          Deprecated. 
          -
          Creates a node list that holds a list of nodes.
          -
          -
          Parameters:
          -
          nodes - the list of nodes this template should hold. The created template - will copy the passed nodes list, so changes to the passed list will not affect - the model.
          -
          -
        • -
        - - - -
          -
        • -

          NodeListModel

          -
          public NodeListModel(List nodes,
          -                     boolean copy)
          -
          Deprecated. 
          -
          Creates a node list that holds a list of nodes.
          -
          -
          Parameters:
          -
          nodes - the list of nodes this template should hold.
          -
          copy - if true, the created template will copy the passed nodes list, - so changes to the passed list will not affect the model. If false, the model - will reference the passed list and will sense changes in it, although no - operations on the list will be synchronized.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isEmpty

          -
          public boolean isEmpty()
          -
          Deprecated. 
          -
          Returns true if this model contains no nodes.
          -
          -
          Specified by:
          -
          isEmpty in interface TemplateHashModel
          -
          -
        • -
        - - - -
          -
        • -

          getAsString

          -
          public String getAsString()
          -                   throws TemplateModelException
          -
          Deprecated. 
          -
          This method returns the string resulting from concatenation - of string representations of its nodes. Each node is rendered using its XML - serialization format, while text (String) is rendered as itself. This greatly - simplifies creating XML-transformation templates, as to output a node contained - in variable x as XML fragment, you simply write ${x} in the template.
          -
          -
          Specified by:
          -
          getAsString in interface TemplateScalarModel
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public TemplateModel get(String key)
          -                  throws TemplateModelException
          -
          Deprecated. 
          -
          Provides node list traversal as well as special functions: filtering by name, - filtering by node type, shallow-copying, and duplicate removal. - While not as powerful as the full XPath support built into the - exec(List) method, it does not require the external Jaxen - library to be present at run time. Below are listed the recognized keys. - In key descriptions, "applicable to this-and-that node type" means that if - a key is applied to a node list that contains a node of non-applicable type - a TemplateMethodModel will be thrown. However, you can use _ftype - key to explicitly filter out undesired node types prior to applying the - restricted-applicability key. Also "current nodes" means nodes contained in this - set. -
            -
          • * or _children: all direct element children of current nodes (non-recursive). Applicable - to element and document nodes.
          • -
          • @* or _attributes: all attributes of current nodes. Applicable to elements only.
          • -
          • _content the complete content of current nodes (non-recursive). - Applicable to elements and documents.
          • -
          • _text: the text of current nodes, one string per node (non-recursive). - Applicable to elements, attributes, comments, processing instructions (returns its data) - and CDATA sections. The reserved XML characters ('<' and '&') are escaped.
          • -
          • _plaintext: same as _text, but does not escape any characters, - and instead of returning a NodeList returns a SimpleScalar.
          • -
          • _name: the names of current nodes, one string per node (non-recursive). - Applicable to elements and attributes (returns their local name), - entities, processing instructions (returns its target), doctypes - (returns its public ID)
          • -
          • _qname: the qualified names of current nodes in [namespacePrefix:]localName - form, one string per node (non-recursive). Applicable to elements and attributes
          • -
          • _cname: the canonical names of current nodes (namespace URI + local name), - one string per node (non-recursive). Applicable to elements and attributes
          • -
          • _nsprefix: namespace prefixes of current nodes, - one string per node (non-recursive). Applicable to elements and attributes
          • -
          • _nsuri: namespace URIs of current nodes, - one string per node (non-recursive). Applicable to elements and attributes
          • -
          • _parent: parent elements of current nodes. Applicable to element, attribute, comment, - entity, processing instruction.
          • -
          • _ancestor: all ancestors up to root element (recursive) of current nodes. Applicable - to same node types as _parent.
          • -
          • _ancestorOrSelf: all ancestors of current nodes plus current nodes. Applicable - to same node types as _parent.
          • -
          • _descendant: all recursive descendant element children of current nodes. Applicable to - document and element nodes. -
          • _descendantOrSelf: all recursive descendant element children of current nodes - plus current nodes. Applicable to document and element nodes. -
          • _document: all documents the current nodes belong to. - Applicable to all nodes except text. -
          • _doctype: doctypes of the current nodes. - Applicable to document nodes only. -
          • _fname: is a filter-by-name template method model. When called, - it will yield a node list that contains only those current nodes whose name - matches one of names passed as argument. Attribute names should NOT be prefixed with the - at sign (@). Applicable on all node types, however has no effect on unnamed nodes.
          • -
          • _ftype: is a filter-by-type template method model. When called, - it will yield a node list that contains only those current nodes whose type matches one - of types passed as argument. You should pass a single string to this method - containing the characters of all types to keep. Valid characters are: - e (Element), a (Attribute), n (Entity), d (Document), t (DocType), - c (Comment), p (ProcessingInstruction), x (text). If the string anywhere contains - the exclamation mark (!), the filter's effect is inverted.
          • -
          • _type: Returns a one-character String SimpleScalar containing - the typecode of the first node in the node list. Valid characters are: - e (Element), a (Attribute), n (Entity), d (Document), t (DocType), - c (Comment), p (ProcessingInstruction), x (text). If the type of the node - is unknown, returns '?'. If the node list is empty, returns an empty string scalar.
          • -
          • _unique: a copy of the current nodes that keeps only the - first occurrence of every node, eliminating duplicates. Duplicates can - occur in the node list by applying uptree-traversals _parent, - _ancestor, _ancestorOrSelf, and _document. - I.e. foo._children._parent will return a node list that has - duplicates of nodes in foo - each node will have the number of occurrences - equal to the number of its children. In these cases, use - foo._children._parent._unique to eliminate duplicates. Applicable - to all node types.
          • -
          • _copy: a copy of the current node list. It is a shallow copy that - shares the underlying node list with this node list, however it has a - separate namespace registry, so it can be used to guarantee that subsequent - changes to the set of registered namespaces does not affect the node lists - that were used to create this node list. Applicable to all node types.
          • -
          • _registerNamespace(prefix, uri): register a XML namespace - with the specified prefix and URI for the current node list and all node - lists that are derived from the current node list. After registering, - you can use the nodelist["prefix:localname"] or - nodelist["@prefix:localname"] syntaxes to reach elements and - attributes whose names are namespace-scoped. Note that the namespace - prefix need not match the actual prefix used by the XML document itself - since namespaces are compared solely by their URI. You can also register - namespaces from Java code using the - registerNamespace(String, String) method. -
          • -
          • @attributeName: named attributes of current nodes. Applicable to - elements, doctypes and processing instructions. On doctypes it supports - attributes publicId, systemId and elementName. On processing - instructions, it supports attributes target and data, as - well as any other attribute name specified in data as name="value" pair. - The attribute nodes for doctype and processing instruction are synthetic, and - as such have no parent. Note, however that @* does NOT operate on - doctypes or processing instructions.
          • -
          • any other key: element children of current nodes with name matching the key. - This allows for convenience child traversal in book.chapter.title style syntax. - Note that nodeset.childname is technically equivalent to - nodeset._children._fname("childname"), but is both shorter to write - and evaluates faster. Applicable to document and element nodes.
          • -
          - The order of nodes in the resulting set is the order of evaluation of the key - on each node in this set from left to right. Evaluation of the key on a single - node always yields the results in "natural" order (that of the document preorder - traversal), even for uptree traversals. As a consequence, if this node list's nodes - are listed in natural order, applying any of the keys will produce a node list that - is also naturally ordered. As a special case, all node lists that are directly or - indirectly generated from a single Document or Element node through repeated - invocations of this method will be naturally ordered.
          -
          -
          Specified by:
          -
          get in interface TemplateHashModel
          -
          Parameters:
          -
          key - a key that identifies a required set of nodes
          -
          Returns:
          -
          a new NodeListModel that represents the requested set of nodes.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - - - - -
          -
        • -

          get

          -
          public TemplateModel get(int i)
          -                  throws TemplateModelException
          -
          Deprecated. 
          -
          Retrieves the i-th element of the node list.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          size

          -
          public int size()
          -
          Deprecated. 
          -
          -
          Specified by:
          -
          size in interface TemplateSequenceModel
          -
          Returns:
          -
          the number of items in the list.
          -
          -
        • -
        - - - -
          -
        • -

          exec

          -
          public Object exec(List arguments)
          -            throws TemplateModelException
          -
          Deprecated. 
          -
          Applies an XPath expression to the node list and returns the resulting node list. - In order for this method to work, your application must have access - Jaxen library classes. The - implementation does cache the parsed format of XPath expressions in a weak hash - map, keyed by the string representation of the XPath expression. As the string - object passed as the argument is usually kept in the parsed FreeMarker template, - this ensures that each XPath expression is parsed only once during the lifetime - of the FreeMarker template that contains it.
          -
          -
          Specified by:
          -
          exec in interface TemplateMethodModel
          -
          Parameters:
          -
          arguments - the list of arguments. Must contain exactly one string that is - the XPath expression you wish to apply. The XPath expression can use any namespace - prefixes that were defined using the registerNamespace(String, String) - method or the nodelist._registerNamespace(prefix, uri) expression in the - template.
          -
          Returns:
          -
          a NodeListModel representing the nodes that are the result of application - of the XPath to the current node list.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          registerNamespace

          -
          public void registerNamespace(String prefix,
          -                              String uri)
          -
          Deprecated. 
          -
          Registers an XML namespace with this node list. Once registered, you can - refer to the registered namespace using its prefix in the - get(String) method from this node list and all other - node lists that are derived from this node list. Use the - nodelist["prefix:localname"] or the - nodelist["@prefix:localname"] syntax to reach elements and - attributes whose names are namespace-scoped. Note that the namespace - prefix need not match the actual prefix used by the XML document itself - since namespaces are compared solely by their URI. You can also register - namespaces during template evaluation using the - nodelist._registerNamespace(prefix, uri) syntax in the template. - This mechanism is completely independent from the namespace declarations - in the XML document itself; its purpose is to give you an easy way - to refer to namespace-scoped elements in get(String) and - in XPath expressions passed to exec(List). Note also that - the namespace prefix registry is shared among all node lists that - are created from a single node list - modifying the registry in one - affects all others as well. If you want to obtain a namespace - "detached" copy of the node list, use the _copy key on - it (or call nodeList.get("_copy") directly from your - Java code. The returned node list has all the namespaces that the - original node list has, but they can be manipulated independently - thereon.
          -
        • -
        - - - -
          -
        • -

          main

          -
          public static void main(String[] args)
          -                 throws Exception
          -
          Deprecated. 
          -
          Loads a template from a file passed as the first argument, loads an XML - document from the standard input, passes it to the template as variable - document and writes the result of template processing to - standard output.
          -
          -
          Throws:
          -
          Exception
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/class-use/NodeListModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/class-use/NodeListModel.html deleted file mode 100644 index 726816f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/class-use/NodeListModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jdom.NodeListModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jdom.NodeListModel

    -
    -
    No usage of freemarker.ext.jdom.NodeListModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-frame.html deleted file mode 100644 index 75d038b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -freemarker.ext.jdom (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.jdom

    -
    -

    Classes

    - -
    - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-summary.html deleted file mode 100644 index 117d020..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -freemarker.ext.jdom (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.jdom

    -
    -
    Deprecated, use W3C DOM (freemarker.ext.dom) instead; -Exposes JDOM XML nodes to templates.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      NodeListModelDeprecated -
      Use NodeModel instead.
      -
      -
    • -
    - - - -

    Package freemarker.ext.jdom Description

    -

    Deprecated, use W3C DOM (freemarker.ext.dom) instead; -Exposes JDOM XML nodes to templates.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-tree.html deleted file mode 100644 index 9a75893..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -freemarker.ext.jdom Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.jdom

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-use.html deleted file mode 100644 index e0e5738..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jdom/package-use.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.jdom (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.jdom

    -
    -
    No usage of freemarker.ext.jdom
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/EventForwarding.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/EventForwarding.html deleted file mode 100644 index cc8425b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/EventForwarding.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - -EventForwarding (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jsp
    -

    Class EventForwarding

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      EventListener, javax.servlet.http.HttpSessionAttributeListener, javax.servlet.http.HttpSessionListener, javax.servlet.ServletContextAttributeListener, javax.servlet.ServletContextListener
      -
      -
      -
      -
      public class EventForwarding
      -extends Object
      -implements javax.servlet.ServletContextAttributeListener, javax.servlet.ServletContextListener, javax.servlet.http.HttpSessionListener, javax.servlet.http.HttpSessionAttributeListener
      -
      An instance of this class should be registered as a <listener> in - the web.xml descriptor in order to correctly dispatch events to - event listeners that are specified in TLD files.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          EventForwarding

          -
          public EventForwarding()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          attributeAdded

          -
          public void attributeAdded(javax.servlet.ServletContextAttributeEvent arg0)
          -
          -
          Specified by:
          -
          attributeAdded in interface javax.servlet.ServletContextAttributeListener
          -
          -
        • -
        - - - -
          -
        • -

          attributeRemoved

          -
          public void attributeRemoved(javax.servlet.ServletContextAttributeEvent arg0)
          -
          -
          Specified by:
          -
          attributeRemoved in interface javax.servlet.ServletContextAttributeListener
          -
          -
        • -
        - - - -
          -
        • -

          attributeReplaced

          -
          public void attributeReplaced(javax.servlet.ServletContextAttributeEvent arg0)
          -
          -
          Specified by:
          -
          attributeReplaced in interface javax.servlet.ServletContextAttributeListener
          -
          -
        • -
        - - - -
          -
        • -

          contextInitialized

          -
          public void contextInitialized(javax.servlet.ServletContextEvent arg0)
          -
          -
          Specified by:
          -
          contextInitialized in interface javax.servlet.ServletContextListener
          -
          -
        • -
        - - - -
          -
        • -

          contextDestroyed

          -
          public void contextDestroyed(javax.servlet.ServletContextEvent arg0)
          -
          -
          Specified by:
          -
          contextDestroyed in interface javax.servlet.ServletContextListener
          -
          -
        • -
        - - - -
          -
        • -

          sessionCreated

          -
          public void sessionCreated(javax.servlet.http.HttpSessionEvent arg0)
          -
          -
          Specified by:
          -
          sessionCreated in interface javax.servlet.http.HttpSessionListener
          -
          -
        • -
        - - - -
          -
        • -

          sessionDestroyed

          -
          public void sessionDestroyed(javax.servlet.http.HttpSessionEvent arg0)
          -
          -
          Specified by:
          -
          sessionDestroyed in interface javax.servlet.http.HttpSessionListener
          -
          -
        • -
        - - - -
          -
        • -

          attributeAdded

          -
          public void attributeAdded(javax.servlet.http.HttpSessionBindingEvent arg0)
          -
          -
          Specified by:
          -
          attributeAdded in interface javax.servlet.http.HttpSessionAttributeListener
          -
          -
        • -
        - - - -
          -
        • -

          attributeRemoved

          -
          public void attributeRemoved(javax.servlet.http.HttpSessionBindingEvent arg0)
          -
          -
          Specified by:
          -
          attributeRemoved in interface javax.servlet.http.HttpSessionAttributeListener
          -
          -
        • -
        - - - -
          -
        • -

          attributeReplaced

          -
          public void attributeReplaced(javax.servlet.http.HttpSessionBindingEvent arg0)
          -
          -
          Specified by:
          -
          attributeReplaced in interface javax.servlet.http.HttpSessionAttributeListener
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/FreemarkerTag.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/FreemarkerTag.html deleted file mode 100644 index daf34f7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/FreemarkerTag.html +++ /dev/null @@ -1,491 +0,0 @@ - - - - - - -FreemarkerTag (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jsp
    -

    Class FreemarkerTag

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      javax.servlet.jsp.tagext.BodyTag, javax.servlet.jsp.tagext.IterationTag, javax.servlet.jsp.tagext.JspTag, javax.servlet.jsp.tagext.Tag
      -
      -
      -
      -
      public class FreemarkerTag
      -extends Object
      -implements javax.servlet.jsp.tagext.BodyTag
      -
      Simple implementation of JSP tag to allow use of FreeMarker templates in - JSP. Inspired by similar class in Velocity template engine developed by - Geir Magnusson Jr.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          FreemarkerTag

          -
          public FreemarkerTag()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getCaching

          -
          public boolean getCaching()
          -
        • -
        - - - -
          -
        • -

          setCaching

          -
          public void setCaching(boolean caching)
          -
        • -
        - - - -
          -
        • -

          setName

          -
          public void setName(String name)
          -
        • -
        - - - -
          -
        • -

          getParent

          -
          public javax.servlet.jsp.tagext.Tag getParent()
          -
          -
          Specified by:
          -
          getParent in interface javax.servlet.jsp.tagext.Tag
          -
          -
        • -
        - - - -
          -
        • -

          setParent

          -
          public void setParent(javax.servlet.jsp.tagext.Tag parent)
          -
          -
          Specified by:
          -
          setParent in interface javax.servlet.jsp.tagext.Tag
          -
          -
        • -
        - - - -
          -
        • -

          doStartTag

          -
          public int doStartTag()
          -
          -
          Specified by:
          -
          doStartTag in interface javax.servlet.jsp.tagext.Tag
          -
          -
        • -
        - - - -
          -
        • -

          setBodyContent

          -
          public void setBodyContent(javax.servlet.jsp.tagext.BodyContent bodyContent)
          -
          -
          Specified by:
          -
          setBodyContent in interface javax.servlet.jsp.tagext.BodyTag
          -
          -
        • -
        - - - -
          -
        • -

          setPageContext

          -
          public void setPageContext(javax.servlet.jsp.PageContext pageContext)
          -
          -
          Specified by:
          -
          setPageContext in interface javax.servlet.jsp.tagext.Tag
          -
          -
        • -
        - - - -
          -
        • -

          doInitBody

          -
          public void doInitBody()
          -
          -
          Specified by:
          -
          doInitBody in interface javax.servlet.jsp.tagext.BodyTag
          -
          -
        • -
        - - - -
          -
        • -

          doAfterBody

          -
          public int doAfterBody()
          -
          -
          Specified by:
          -
          doAfterBody in interface javax.servlet.jsp.tagext.IterationTag
          -
          -
        • -
        - - - -
          -
        • -

          release

          -
          public void release()
          -
          -
          Specified by:
          -
          release in interface javax.servlet.jsp.tagext.Tag
          -
          -
        • -
        - - - -
          -
        • -

          doEndTag

          -
          public int doEndTag()
          -             throws javax.servlet.jsp.JspException
          -
          -
          Specified by:
          -
          doEndTag in interface javax.servlet.jsp.tagext.Tag
          -
          Throws:
          -
          javax.servlet.jsp.JspException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/TaglibFactory.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/TaglibFactory.html deleted file mode 100644 index c25ef24..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/TaglibFactory.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - -TaglibFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jsp
    -

    Class TaglibFactory

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateHashModel, TemplateModel
      -
      -
      -
      -
      public class TaglibFactory
      -extends Object
      -implements TemplateHashModel
      -
      A hash model associated with a servlet context that can load JSP tag - libraries associated with that servlet context. An instance of this class is - made available in the root data model of templates executed by - FreemarkerServlet under key - JspTaglibs. It can be added to custom servlets as well to enable JSP - taglib integration in them as well.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          TaglibFactory

          -
          public TaglibFactory(javax.servlet.ServletContext ctx)
          -
          Creates a new JSP taglib factory that will be used to load JSP taglibs - for the web application represented by the passed servlet context.
          -
          -
          Parameters:
          -
          ctx - the servlet context whose JSP tag libraries will this factory - load.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          public TemplateModel get(String uri)
          -                  throws TemplateModelException
          -
          Retrieves a JSP tag library identified by an URI. The matching of the URI - to a JSP taglib is done as described in the JSP 1.2 FCS specification.
          -
          -
          Specified by:
          -
          get in interface TemplateHashModel
          -
          Parameters:
          -
          uri - the URI that describes the JSP taglib. It can be any of the - three forms allowed by the JSP specification: absolute URI, root relative - URI and non-root relative URI. Note that if a non-root relative URI is - used it's resolved relative to the URL of the current request. In this - case, the current request is obtained by looking up a - HttpRequestHashModel object named Request in the root - data model. FreemarkerServlet provides this object under the expected - name, and custom servlets that want to integrate JSP taglib support - should do the same.
          -
          Returns:
          -
          a hash model representing the JSP taglib. Each element of this - hash model represents a single custom tag from the library, implemented - as a TemplateTransformModel.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          isEmpty

          -
          public boolean isEmpty()
          -
          Returns false.
          -
          -
          Specified by:
          -
          isEmpty in interface TemplateHashModel
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/EventForwarding.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/EventForwarding.html deleted file mode 100644 index 1c5db60..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/EventForwarding.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jsp.EventForwarding (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jsp.EventForwarding

    -
    -
    No usage of freemarker.ext.jsp.EventForwarding
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/FreemarkerTag.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/FreemarkerTag.html deleted file mode 100644 index 4ecfb8b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/FreemarkerTag.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jsp.FreemarkerTag (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jsp.FreemarkerTag

    -
    -
    No usage of freemarker.ext.jsp.FreemarkerTag
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/TaglibFactory.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/TaglibFactory.html deleted file mode 100644 index dcb5bae..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/class-use/TaglibFactory.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jsp.TaglibFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jsp.TaglibFactory

    -
    -
    No usage of freemarker.ext.jsp.TaglibFactory
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-frame.html deleted file mode 100644 index c28bed0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -freemarker.ext.jsp (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.jsp

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-summary.html deleted file mode 100644 index afdbdfa..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-summary.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - -freemarker.ext.jsp (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.jsp

    -
    -
    -Classes for two-way FreeMarker-JSP integration.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      EventForwarding -
      An instance of this class should be registered as a <listener> in - the web.xml descriptor in order to correctly dispatch events to - event listeners that are specified in TLD files.
      -
      FreemarkerTag -
      Simple implementation of JSP tag to allow use of FreeMarker templates in - JSP.
      -
      TaglibFactory -
      A hash model associated with a servlet context that can load JSP tag - libraries associated with that servlet context.
      -
      -
    • -
    - - - -

    Package freemarker.ext.jsp Description

    -

    -Classes for two-way FreeMarker-JSP integration. It contains both a JSP -custom tag that allows embedding of FreeMarker templates inside JSP -pages, as well as the infrastructure that allows JSP custom tags to be -used inside FreeMarker templates.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-tree.html deleted file mode 100644 index 163b647..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -freemarker.ext.jsp Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.jsp

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    -
      -
    • java.lang.Object -
        -
      • freemarker.ext.jsp.EventForwarding (implements javax.servlet.http.HttpSessionAttributeListener, javax.servlet.http.HttpSessionListener, javax.servlet.ServletContextAttributeListener, javax.servlet.ServletContextListener)
      • -
      • freemarker.ext.jsp.FreemarkerTag (implements javax.servlet.jsp.tagext.BodyTag)
      • -
      • freemarker.ext.jsp.TaglibFactory (implements freemarker.template.TemplateHashModel)
      • -
      -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-use.html deleted file mode 100644 index 5ba032d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jsp/package-use.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.jsp (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.jsp

    -
    -
    No usage of freemarker.ext.jsp
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonHashModel.html deleted file mode 100644 index 40c90f4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonHashModel.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - -JythonHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonHashModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonModel.html deleted file mode 100644 index 7e33bc7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonModel.html +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - -JythonModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonModel

    -
    -
    - - -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonNumberModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonNumberModel.html deleted file mode 100644 index d009587..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonNumberModel.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - -JythonNumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonNumberModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonSequenceModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonSequenceModel.html deleted file mode 100644 index b38bfaa..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonSequenceModel.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - -JythonSequenceModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonSequenceModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonVersionAdapter.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonVersionAdapter.html deleted file mode 100644 index 2d4fd98..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonVersionAdapter.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - -JythonVersionAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonVersionAdapter

    -
    -
    - -
    -
      -
    • -
      -
      -
      public abstract class JythonVersionAdapter
      -extends Object
      -
      Functions that has a different implementation depending on the Jython version - used. This was introduced to work around class-loading errors because of - different classes/methods being present in different Jython versions.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JythonVersionAdapter

          -
          public JythonVersionAdapter()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isPyInstance

          -
          public abstract boolean isPyInstance(Object obj)
          -
          Returns - obj instanceof Py[Java]Instance.
          -
        • -
        - - - -
          -
        • -

          pyInstanceToJava

          -
          public abstract Object pyInstanceToJava(Object pyInstance)
          -
          Returns - ((PyInstance) py[Java]Instance).__tojava__(java.lang.Object.class).
          -
        • -
        - - - -
          -
        • -

          getPythonClassName

          -
          public abstract String getPythonClassName(org.python.core.PyObject pyObject)
          -
          Returns pyObject.__class__.__name__
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonWrapper.html deleted file mode 100644 index 287642d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/JythonWrapper.html +++ /dev/null @@ -1,429 +0,0 @@ - - - - - - -JythonWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.jython
    -

    Class JythonWrapper

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      ObjectWrapper
      -
      -
      -
      -
      public class JythonWrapper
      -extends Object
      -implements ObjectWrapper
      -
      An object wrapper that wraps Jython objects into FreeMarker template models - and vice versa.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JythonWrapper

          -
          public JythonWrapper()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setUseCache

          -
          public void setUseCache(boolean useCache)
          -
          Sets whether this wrapper caches model instances. Default is false. - When set to true, calling wrap(Object) multiple times for - the same object will return the same model.
          -
        • -
        - - - -
          -
        • -

          setAttributesShadowItems

          -
          public void setAttributesShadowItems(boolean attributesShadowItems)
          -
          Sets whether attributes shadow items in wrapped objects. When true - (this is the default value), ${object.name} will first - try to locate a python attribute with the specified name on the object - using PyObject.__findattr__(java.lang.String), and only if it - doesn't find the attribute will it call - PyObject.__getitem__(org.python.core.PyObject). - When set to false, the lookup order is reversed and items - are looked up before attributes.
          -
        • -
        - - - -
          -
        • -

          wrap

          -
          public TemplateModel wrap(Object obj)
          -
          Wraps the passed Jython object into a FreeMarker template model. If - the object is not a Jython object, it's first coerced into one using - Py.java2py(java.lang.Object). PyDictionary and PyStringMap are wrapped into a hash model, PySequence - descendants are wrapped into a sequence model, PyInteger, PyLong, and PyFloat are wrapped into a number model. All objects - are wrapped into a scalar model (using Object.toString() and a - boolean model (using PyObject.__nonzero__(). For internal - general-purpose PyObjects returned from a call to unwrap(TemplateModel), the template model that was passed to - unwrap is returned.
          -
          -
          Specified by:
          -
          wrap in interface ObjectWrapper
          -
          Parameters:
          -
          obj - The object to wrap into a TemplateModel. If it already implements TemplateModel, - it should just return the object as is.
          -
          Returns:
          -
          a TemplateModel wrapper of the object passed in. To support un-wrapping, you may consider the - return value to implement WrapperTemplateModel and AdapterTemplateModel. - The default expectation is that the TemplateModel isn't less thread safe than the wrapped object. - If the ObjectWrapper returns less thread safe objects, that should be clearly documented, as it - restricts how it can be used, like, then it can't be used to wrap "shared variables" - (Configuration.setSharedVaribles(Map)).
          -
          -
        • -
        - - - -
          -
        • -

          unwrap

          -
          public org.python.core.PyObject unwrap(TemplateModel model)
          -                                throws TemplateModelException
          -
          Coerces a template model into a PyObject.
          -
          -
          Parameters:
          -
          model - the model to coerce
          -
          Returns:
          -
          the coerced model. -
            -
          • -
          • AdapterTemplateModels (i.e. BeanModel) are marshalled - using the standard Python marshaller Py.java2py(Object) on - the result of getWrappedObject(PyObject.class)s. The - native JythonModel instances will just return the underlying PyObject. -
          • All other models that are scalars are - marshalled as PyString. -
          • All other models that are numbers are - marshalled using the standard Python marshaller - Py.java2py(Object) on their underlying Number
          • -
          • All other models are marshalled to a generic internal - PyObject subclass that'll correctly pass - __finditem__, __len__, - __nonzero__, and __call__ invocations to - appropriate hash, sequence, and method models.
          • -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonHashModel.html deleted file mode 100644 index dc3414d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonHashModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonHashModel

    -
    -
    No usage of freemarker.ext.jython.JythonHashModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonModel.html deleted file mode 100644 index 0d94029..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonModel.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonNumberModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonNumberModel.html deleted file mode 100644 index b2b0111..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonNumberModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonNumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonNumberModel

    -
    -
    No usage of freemarker.ext.jython.JythonNumberModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonSequenceModel.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonSequenceModel.html deleted file mode 100644 index 627f475..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonSequenceModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonSequenceModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonSequenceModel

    -
    -
    No usage of freemarker.ext.jython.JythonSequenceModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonVersionAdapter.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonVersionAdapter.html deleted file mode 100644 index 2b9e06c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonVersionAdapter.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonVersionAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonVersionAdapter

    -
    -
    No usage of freemarker.ext.jython.JythonVersionAdapter
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonWrapper.html deleted file mode 100644 index d9031c7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/class-use/JythonWrapper.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.jython.JythonWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.jython.JythonWrapper

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/package-frame.html deleted file mode 100644 index 58e4d09..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-frame.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -freemarker.ext.jython (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.jython

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/package-summary.html deleted file mode 100644 index 47c35f8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-summary.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - -freemarker.ext.jython (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.jython

    -
    -
    Exposes Jython objects to templates.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      JythonHashModel -
      Model for Jython dictionaries (PyDictionary - and PyStringMap).
      -
      JythonModel -
      Generic model for arbitrary Jython objects.
      -
      JythonNumberModel -
      Model for Jython numeric objects (PyInteger, PyLong, - PyFloat).
      -
      JythonSequenceModel -
      Model for Jython sequence objects (PySequence descendants).
      -
      JythonVersionAdapter -
      Functions that has a different implementation depending on the Jython version - used.
      -
      JythonWrapper -
      An object wrapper that wraps Jython objects into FreeMarker template models - and vice versa.
      -
      -
    • -
    - - - -

    Package freemarker.ext.jython Description

    -

    Exposes Jython objects to templates. -The default object wrapper of FreeMarker -automatically wraps Jython nodes with this. - -

    Most of the issues dealing with Jython objects are handled by the -JythonWrapper.wrap(Object) method. In -normal cases, this is the only method you should use to turn an -arbitrary Jython object into a FreeMarker -TemplateModel. Additionally, you can -manually create instances of any wrapper class using its constructors.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/package-tree.html deleted file mode 100644 index e73016a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-tree.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -freemarker.ext.jython Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.jython

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/jython/package-use.html deleted file mode 100644 index 2ece8d5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/jython/package-use.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.jython (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.jython

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoFunctionModel.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoFunctionModel.html deleted file mode 100644 index 849ff28..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoFunctionModel.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - -RhinoFunctionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.rhino
    -

    Class RhinoFunctionModel

    -
    -
    - - -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          RhinoFunctionModel

          -
          public RhinoFunctionModel(org.mozilla.javascript.Function function,
          -                          org.mozilla.javascript.Scriptable fnThis,
          -                          BeansWrapper wrapper)
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoScriptableModel.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoScriptableModel.html deleted file mode 100644 index 6a626a4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoScriptableModel.html +++ /dev/null @@ -1,545 +0,0 @@ - - - - - - -RhinoScriptableModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.rhino
    -

    Class RhinoScriptableModel

    -
    -
    - - -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          RhinoScriptableModel

          -
          public RhinoScriptableModel(org.mozilla.javascript.Scriptable scriptable,
          -                            BeansWrapper wrapper)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -                  throws TemplateModelException
          -
          Description copied from interface: TemplateSequenceModel
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - - - - - - - - - - - - - - - - -
          -
        • -

          getAsBoolean

          -
          public boolean getAsBoolean()
          -
          -
          Specified by:
          -
          getAsBoolean in interface TemplateBooleanModel
          -
          Returns:
          -
          whether to interpret this object as true or false in a boolean context
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getAsString

          -
          public String getAsString()
          -
          Description copied from interface: TemplateScalarModel
          -
          Returns the string representation of this model. Don't return null, as that will cause exception. - (In classic-compatible mode the engine will convert null into empty string, though.)
          -
          -
          Specified by:
          -
          getAsString in interface TemplateScalarModel
          -
          -
        • -
        - - - -
          -
        • -

          getAdaptedObject

          -
          public Object getAdaptedObject(Class hint)
          -
          Description copied from interface: AdapterTemplateModel
          -
          Retrieves the underlying object, or some other object semantically - equivalent to its value narrowed by the class hint.
          -
          -
          Specified by:
          -
          getAdaptedObject in interface AdapterTemplateModel
          -
          Parameters:
          -
          hint - the desired class of the returned value. An implementation - should make reasonable effort to retrieve an object of the requested - class, but if that is impossible, it must at least return the underlying - object as-is. As a minimal requirement, an implementation must always - return the exact underlying object when - hint.isInstance(underlyingObject) holds. When called - with java.lang.Object.class, it should return a generic Java - object (i.e. if the model is wrapping a scripting language object that is - further wrapping a Java object, the deepest underlying Java object should - be returned).
          -
          Returns:
          -
          the underlying object, or its value accommodated for the hint - class.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoWrapper.html deleted file mode 100644 index 9d23ec7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/RhinoWrapper.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - -RhinoWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.rhino
    -

    Class RhinoWrapper

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoFunctionModel.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoFunctionModel.html deleted file mode 100644 index 1c296f9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoFunctionModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.rhino.RhinoFunctionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.rhino.RhinoFunctionModel

    -
    -
    No usage of freemarker.ext.rhino.RhinoFunctionModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoScriptableModel.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoScriptableModel.html deleted file mode 100644 index 8652e5d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoScriptableModel.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.rhino.RhinoScriptableModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.rhino.RhinoScriptableModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoWrapper.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoWrapper.html deleted file mode 100644 index 50de297..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/class-use/RhinoWrapper.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.rhino.RhinoWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.rhino.RhinoWrapper

    -
    -
    No usage of freemarker.ext.rhino.RhinoWrapper
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-frame.html deleted file mode 100644 index 69d5a45..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - -freemarker.ext.rhino (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.rhino

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-summary.html deleted file mode 100644 index 30fef51..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-summary.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -freemarker.ext.rhino (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.rhino

    -
    -
    Exposes Rhino (ECMAScript) objects to templates.
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.ext.rhino Description

    -

    Exposes Rhino (ECMAScript) objects to templates.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-tree.html deleted file mode 100644 index d7ff882..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - -freemarker.ext.rhino Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.rhino

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-use.html deleted file mode 100644 index 1ebbd04..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/rhino/package-use.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.rhino (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.rhino

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/AllHttpScopesHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/AllHttpScopesHashModel.html deleted file mode 100644 index 4324286..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/AllHttpScopesHashModel.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - -AllHttpScopesHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class AllHttpScopesHashModel

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateHashModel, TemplateHashModelEx, TemplateModel, Serializable
      -
      -
      -
      -
      public class AllHttpScopesHashModel
      -extends SimpleHash
      -
      An extension of SimpleHash that looks up keys in the hash, then in the - request, session, and servlet context scopes. Makes "Application", "Session" - and "Request" keys largely obsolete, however we keep them for backward - compatibility (also, "Request" is required for proper operation of JSP - taglibs). - It is on purpose that we didn't override keys and values - methods. That way, only those variables assigned into the hash directly by a - subclass of FreemarkerServlet that overrides - preTemplateProcess) are discovered as "page" variables by the FM - JSP PageContext implementation.
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          AllHttpScopesHashModel

          -
          public AllHttpScopesHashModel(ObjectWrapper wrapper,
          -                              javax.servlet.ServletContext context,
          -                              javax.servlet.http.HttpServletRequest request)
          -
          Creates a new instance of AllHttpScopesHashModel for handling a single - HTTP servlet request.
          -
          -
          Parameters:
          -
          wrapper - the object wrapper to use
          -
          context - the servlet context of the web application
          -
          request - the HTTP servlet request being processed
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          putUnlistedModel

          -
          public void putUnlistedModel(String key,
          -                             TemplateModel model)
          -
          Stores a model in the hash so that it doesn't show up in keys() - and values() methods. Used to put the Application, Session, - Request, RequestParameters and JspTaglibs objects.
          -
          -
          Parameters:
          -
          key - the key under which the model is stored
          -
          model - the stored model
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/FreemarkerServlet.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/FreemarkerServlet.html deleted file mode 100644 index e874fed..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/FreemarkerServlet.html +++ /dev/null @@ -1,1033 +0,0 @@ - - - - - - -FreemarkerServlet (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class FreemarkerServlet

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • javax.servlet.GenericServlet
      • -
      • -
          -
        • javax.servlet.http.HttpServlet
        • -
        • -
            -
          • freemarker.ext.servlet.FreemarkerServlet
          • -
          -
        • -
        -
      • -
      -
    • -
    -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig
      -
      -
      -
      -
      public class FreemarkerServlet
      -extends javax.servlet.http.HttpServlet
      -

      This is a general-purpose FreeMarker view servlet.

      - -

      The main features are: - -

        - -
      • It makes all request, request parameters, session, and servlet - context attributes available to templates through Request, - RequestParameters, Session, and Application - variables. - -
      • The scope variables are also available via automatic scope discovery. That is, - writing Application.attrName, Session.attrName, - Request.attrName is not mandatory; it's enough to write attrName, - and if no such variable was created in the template, it will search the - variable in Request, and then in Session, - and finally in Application. - -
      • It creates a variable with name JspTaglibs, that can be used - to load JSP taglibs. For example:
        - <#assign tiles=JspTaglibs["/WEB-INF/struts-tiles.tld"]> - -
      • A custom directive named include_page allows you to - include the output of another servlet resource from your servlet container, - just as if you used ServletRequest.getRequestDispatcher(path).include():
        - <@include_page path="/myWebapp/somePage.jsp"/>. You can also - pass parameters to the newly included page by passing a hash named 'params': - <@include_page path="/myWebapp/somePage.jsp" params={lang: "en", q="5"}/>. - By default, the request parameters of the original request (the one being - processed by FreemarkerServlet) are also inherited by the include. You can - explicitly control this inheritance using the 'inherit_params' parameter: - <@include_page path="/myWebapp/somePage.jsp" params={lang: "en", q="5"} inherit_params=false/>. -
      - -

      The servlet will rethrow the errors occurring during template processing, - wrapped into ServletException, except if the class name of the - class set by the template_exception_handler contains the - substring "Debug". If it contains "Debug", then it - is assumed that the template exception handler prints the error message to the - page, thus FreemarkerServlet will suppress the exception, and - logs the problem with the servlet logger - (javax.servlet.GenericServlet.log(...)). - -

      Supported init-params are:

      - -
        - -
      • TemplatePath specifies the location of the templates. - By default, this is interpreted as web application directory relative URI.
        - Alternatively, you can prepend it with file:// to indicate a literal - path in the file system (i.e. file:///var/www/project/templates/). - Note that three slashes were used to specify an absolute path.
        - Also, you can prepend it with class://path/to/template/package to - indicate that you want to load templates from the specified package - accessible through the classloader of the servlet.
        - Default value is class:// (that is, the root of the class hierarchy). - Note that this default is different than the default in FreeMarker 1.x, when - it defaulted /, that is to loading from the webapp root directory.
      • - -
      • NoCache if set to true, generates headers in the response - that advise the HTTP client not to cache the returned page. - The default is false.
      • - -
      • ContentType if specified, response uses the specified - Content-type HTTP header. The value may include the charset (e.g. - "text/html; charset=ISO-8859-1"). If not specified, "text/html" - is used. If the charset is not specified in this init-param, then the charset - (encoding) of the actual template file will be used (in the response HTTP header - and for encoding the output stream). Note that this setting can be overridden - on a per-template basis by specifying a custom attribute named - content_type in the attributes parameter of the - <#ftl> directive. -
      • - -
      • The following init-params are supported only for backward compatibility, and - their usage is discouraged: TemplateUpdateInterval, DefaultEncoding, - ObjectWrapper, TemplateExceptionHandler. Use setting init-params such as - object_wrapper instead. - -
      • Any other init-param will be interpreted as Configuration - level setting. See Configuration.setSetting(java.lang.String, java.lang.String)
      • - -
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          FreemarkerServlet

          -
          public FreemarkerServlet()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          init

          -
          public void init()
          -          throws javax.servlet.ServletException
          -
          -
          Overrides:
          -
          init in class javax.servlet.GenericServlet
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          -
        • -
        - - - -
          -
        • -

          createTemplateLoader

          -
          protected TemplateLoader createTemplateLoader(String templatePath)
          -                                       throws IOException
          -
          Create the template loader. The default implementation will create a - ClassTemplateLoader if the template path starts with "class://", - a FileTemplateLoader if the template path starts with "file://", - and a WebappTemplateLoader otherwise.
          -
          -
          Parameters:
          -
          templatePath - the template path to create a loader for
          -
          Returns:
          -
          a newly created template loader
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          doGet

          -
          public void doGet(javax.servlet.http.HttpServletRequest request,
          -                  javax.servlet.http.HttpServletResponse response)
          -           throws javax.servlet.ServletException,
          -                  IOException
          -
          -
          Overrides:
          -
          doGet in class javax.servlet.http.HttpServlet
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          doPost

          -
          public void doPost(javax.servlet.http.HttpServletRequest request,
          -                   javax.servlet.http.HttpServletResponse response)
          -            throws javax.servlet.ServletException,
          -                   IOException
          -
          -
          Overrides:
          -
          doPost in class javax.servlet.http.HttpServlet
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          deduceLocale

          -
          protected Locale deduceLocale(String templatePath,
          -                              javax.servlet.http.HttpServletRequest request,
          -                              javax.servlet.http.HttpServletResponse response)
          -
          Returns the locale used for the - Configuration.getTemplate(String, Locale) call. - The base implementation simply returns the locale setting of the - configuration. Override this method to provide different behaviour, i.e. - to use the locale indicated in the request.
          -
        • -
        - - - - - - - -
          -
        • -

          requestUrlToTemplatePath

          -
          protected String requestUrlToTemplatePath(javax.servlet.http.HttpServletRequest request)
          -
          Maps the request URL to a template path that is passed to - Configuration.getTemplate(String, Locale). You can override it - (i.e. to provide advanced rewriting capabilities), but you are strongly - encouraged to call the overridden method first, then only modify its - return value.
          -
          -
          Parameters:
          -
          request - the currently processed request
          -
          Returns:
          -
          a String representing the template path
          -
          -
        • -
        - - - -
          -
        • -

          preprocessRequest

          -
          protected boolean preprocessRequest(javax.servlet.http.HttpServletRequest request,
          -                                    javax.servlet.http.HttpServletResponse response)
          -                             throws javax.servlet.ServletException,
          -                                    IOException
          -
          Called as the first step in request processing, before the templating mechanism - is put to work. By default does nothing and returns false. This method is - typically overridden to manage serving of non-template resources (i.e. images) - that reside in the template directory.
          -
          -
          Parameters:
          -
          request - the HTTP request
          -
          response - the HTTP response
          -
          Returns:
          -
          true to indicate this method has processed the request entirely, - and that the further request processing should not take place.
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          createConfiguration

          -
          protected Configuration createConfiguration()
          -
          This method is called from init() to create the - FreeMarker configuration object that this servlet will use - for template loading. This is a hook that allows you - to custom-configure the configuration object in a subclass. - The default implementation returns a new Configuration - instance.
          -
        • -
        - - - -
          -
        • -

          createObjectWrapper

          -
          protected ObjectWrapper createObjectWrapper()
          -
          This method is called from init() to create the - FreeMarker object wrapper object that this servlet will use - for adapting request, session, and servlet context attributes into - template models.. This is a hook that allows you - to custom-configure the wrapper object in a subclass. - The default implementation returns a wrapper that depends on the value - of ObjectWrapper init parameter. If simple is - specified, ObjectWrapper.SIMPLE_WRAPPER is used; if jython - is specified, JythonWrapper is used. In - every other case ObjectWrapper.DEFAULT_WRAPPER is used.
          -
        • -
        - - - -
          -
        • -

          getObjectWrapper

          -
          protected ObjectWrapper getObjectWrapper()
          -
        • -
        - - - -
          -
        • -

          getTemplatePath

          -
          protected final String getTemplatePath()
          -
        • -
        - - - -
          -
        • -

          createRequestParametersHashModel

          -
          protected HttpRequestParametersHashModel createRequestParametersHashModel(javax.servlet.http.HttpServletRequest request)
          -
        • -
        - - - -
          -
        • -

          initializeServletContext

          -
          protected void initializeServletContext(javax.servlet.http.HttpServletRequest request,
          -                                        javax.servlet.http.HttpServletResponse response)
          -                                 throws javax.servlet.ServletException,
          -                                        IOException
          -
          Called when servlet detects in a request processing that - application-global (that is, ServletContext-specific) attributes are not yet - set. - This is a generic hook you might use in subclasses to perform a specific - action on first request in the context. By default it does nothing.
          -
          -
          Parameters:
          -
          request - the actual HTTP request
          -
          response - the actual HTTP response
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          initializeSession

          -
          protected void initializeSession(javax.servlet.http.HttpServletRequest request,
          -                                 javax.servlet.http.HttpServletResponse response)
          -                          throws javax.servlet.ServletException,
          -                                 IOException
          -
          Called when servlet detects in a request processing that session-global - (that is, HttpSession-specific) attributes are not yet set. - This is a generic hook you might use in subclasses to perform a specific - action on first request in the session. By default it does nothing. It - is only invoked on newly created sessions; it's not invoked when a - replicated session is reinstantiated in another servlet container.
          -
          -
          Parameters:
          -
          request - the actual HTTP request
          -
          response - the actual HTTP response
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          preTemplateProcess

          -
          protected boolean preTemplateProcess(javax.servlet.http.HttpServletRequest request,
          -                                     javax.servlet.http.HttpServletResponse response,
          -                                     Template template,
          -                                     TemplateModel data)
          -                              throws javax.servlet.ServletException,
          -                                     IOException
          -
          Called before the execution is passed to template.process(). - This is a generic hook you might use in subclasses to perform a specific - action before the template is processed. By default does nothing. - A typical action to perform here is to inject application-specific - objects into the model root - -

          Example: Expose the Serlvet context path as "baseDir" for all templates: - -

          -    ((SimpleHash) data).put("baseDir", request.getContextPath() + "/");
          -    return true;
          -
          -
          -
          Parameters:
          -
          request - the actual HTTP request
          -
          response - the actual HTTP response
          -
          template - the template that will get executed
          -
          data - the data that will be passed to the template. By default this will be - an AllHttpScopesHashModel (which is a SimpleHash subclass). - Thus, you can add new variables to the data-model with the - SimpleHash.put(String, Object) subclass) method.
          -
          Returns:
          -
          true to process the template, false to suppress template processing.
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          postTemplateProcess

          -
          protected void postTemplateProcess(javax.servlet.http.HttpServletRequest request,
          -                                   javax.servlet.http.HttpServletResponse response,
          -                                   Template template,
          -                                   TemplateModel data)
          -                            throws javax.servlet.ServletException,
          -                                   IOException
          -
          Called after the execution returns from template.process(). - This is a generic hook you might use in subclasses to perform a specific - action after the template is processed. It will be invoked even if the - template processing throws an exception. By default does nothing.
          -
          -
          Parameters:
          -
          request - the actual HTTP request
          -
          response - the actual HTTP response
          -
          template - the template that was executed
          -
          data - the data that was passed to the template
          -
          Throws:
          -
          javax.servlet.ServletException
          -
          IOException
          -
          -
        • -
        - - - -
          -
        • -

          getConfiguration

          -
          protected Configuration getConfiguration()
          -
          Returns the Configuration object used by this servlet. - Please don't forget that Configuration is not thread-safe - when you modify it.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestHashModel.html deleted file mode 100644 index e53ed3c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestHashModel.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - -HttpRequestHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class HttpRequestHashModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          HttpRequestHashModel

          -
          public HttpRequestHashModel(javax.servlet.http.HttpServletRequest request,
          -                            ObjectWrapper wrapper)
          -
        • -
        - - - -
          -
        • -

          HttpRequestHashModel

          -
          public HttpRequestHashModel(javax.servlet.http.HttpServletRequest request,
          -                            javax.servlet.http.HttpServletResponse response,
          -                            ObjectWrapper wrapper)
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestParametersHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestParametersHashModel.html deleted file mode 100644 index ed3d1d3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpRequestParametersHashModel.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - -HttpRequestParametersHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class HttpRequestParametersHashModel

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • freemarker.ext.servlet.HttpRequestParametersHashModel
      • -
      -
    • -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          HttpRequestParametersHashModel

          -
          public HttpRequestParametersHashModel(javax.servlet.http.HttpServletRequest request)
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpSessionHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpSessionHashModel.html deleted file mode 100644 index 4a3e971..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/HttpSessionHashModel.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - -HttpSessionHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class HttpSessionHashModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          HttpSessionHashModel

          -
          public HttpSessionHashModel(javax.servlet.http.HttpSession session,
          -                            ObjectWrapper wrapper)
          -
          Use this constructor when the session already exists.
          -
          -
          Parameters:
          -
          session - the session
          -
          wrapper - an object wrapper used to wrap session attributes
          -
          -
        • -
        - - - -
          -
        • -

          HttpSessionHashModel

          -
          public HttpSessionHashModel(FreemarkerServlet servlet,
          -                            javax.servlet.http.HttpServletRequest request,
          -                            javax.servlet.http.HttpServletResponse response,
          -                            ObjectWrapper wrapper)
          -
          Use this constructor when the session isn't already created. It is passed - enough parameters so that the session can be properly initialized after - it's detected that it was created.
          -
          -
          Parameters:
          -
          servlet - the FreemarkerServlet that created this model. If the - model is not created through FreemarkerServlet, leave this argument as - null.
          -
          request - the actual request
          -
          response - the actual response
          -
          wrapper - an object wrapper used to wrap session attributes
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/IncludePage.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/IncludePage.html deleted file mode 100644 index 550d182..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/IncludePage.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - -IncludePage (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class IncludePage

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateDirectiveModel, TemplateModel
      -
      -
      -
      -
      public class IncludePage
      -extends Object
      -implements TemplateDirectiveModel
      -
      A model that when invoked with a 'path' parameter will perform a servlet - include. It also support an optional hash named 'params' which specifies - request parameters for the include - its keys are strings, its values - should be either strings or sequences of strings (for multiple valued - parameters). A third optional parameter 'inherit_params' should be a boolean - when specified, and it defaults to true when not specified. A value of true - means that the include inherits the request parameters from the current - request. In this case values in 'params' will get prepended to the existing - values of parameters.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          IncludePage

          -
          public IncludePage(javax.servlet.http.HttpServletRequest request,
          -                   javax.servlet.http.HttpServletResponse response)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          execute

          -
          public void execute(Environment env,
          -                    Map params,
          -                    TemplateModel[] loopVars,
          -                    TemplateDirectiveBody body)
          -             throws TemplateException,
          -                    IOException
          -
          Description copied from interface: TemplateDirectiveModel
          -
          Executes this user-defined directive; called by FreeMarker when the user-defined - directive is called in the template.
          -
          -
          Specified by:
          -
          execute in interface TemplateDirectiveModel
          -
          Parameters:
          -
          env - the current processing environment. Note that you can access - the output Writer by Environment.getOut().
          -
          params - the parameters (if any) passed to the directive as a - map of key/value pairs where the keys are String-s and the - values are TemplateModel instances. This is never - null. If you need to convert the template models to POJOs, - you can use the utility methods in the DeepUnwrap class.
          -
          loopVars - an array that corresponds to the "loop variables", in - the order as they appear in the directive call. ("Loop variables" are out-parameters - that are available to the nested body of the directive; see in the Manual.) - You set the loop variables by writing this array. The length of the array gives the - number of loop-variables that the caller has specified. - Never null, but can be a zero-length array.
          -
          body - an object that can be used to render the nested content (body) of - the directive call. If the directive call has no nested content (i.e., it's like - <@myDirective /> or <@myDirective></@myDirective>), then this will be - null.
          -
          Throws:
          -
          TemplateException - If any problem occurs that's not an IOException during writing the template - output.
          -
          IOException - When writing the template output fails.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/ServletContextHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/ServletContextHashModel.html deleted file mode 100644 index c4a242a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/ServletContextHashModel.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - -ServletContextHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.servlet
    -

    Class ServletContextHashModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          getServlet

          -
          public javax.servlet.GenericServlet getServlet()
          -
          Returns the underlying servlet. Can return null if this object was - created using the deprecated constructor.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/AllHttpScopesHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/AllHttpScopesHashModel.html deleted file mode 100644 index d2a9fca..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/AllHttpScopesHashModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.AllHttpScopesHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.AllHttpScopesHashModel

    -
    -
    No usage of freemarker.ext.servlet.AllHttpScopesHashModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/FreemarkerServlet.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/FreemarkerServlet.html deleted file mode 100644 index 325fdbb..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/FreemarkerServlet.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.FreemarkerServlet (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.FreemarkerServlet

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestHashModel.html deleted file mode 100644 index 49b5e86..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestHashModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.HttpRequestHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.HttpRequestHashModel

    -
    -
    No usage of freemarker.ext.servlet.HttpRequestHashModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestParametersHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestParametersHashModel.html deleted file mode 100644 index a956a06..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpRequestParametersHashModel.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.HttpRequestParametersHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.HttpRequestParametersHashModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpSessionHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpSessionHashModel.html deleted file mode 100644 index 606df09..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/HttpSessionHashModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.HttpSessionHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.HttpSessionHashModel

    -
    -
    No usage of freemarker.ext.servlet.HttpSessionHashModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/IncludePage.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/IncludePage.html deleted file mode 100644 index 33d4541..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/IncludePage.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.IncludePage (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.IncludePage

    -
    -
    No usage of freemarker.ext.servlet.IncludePage
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/ServletContextHashModel.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/ServletContextHashModel.html deleted file mode 100644 index 910dd67..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/class-use/ServletContextHashModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.servlet.ServletContextHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.servlet.ServletContextHashModel

    -
    -
    No usage of freemarker.ext.servlet.ServletContextHashModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-frame.html deleted file mode 100644 index 8d98bb1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - -freemarker.ext.servlet (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.servlet

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-summary.html deleted file mode 100644 index b57982a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-summary.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - -freemarker.ext.servlet (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.servlet

    -
    -
    Servlet for legacy "Model 2" frameworks that allows using FreeMarker -templates instead of JSP as the MVC View -(see in the Manual).
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      AllHttpScopesHashModel -
      An extension of SimpleHash that looks up keys in the hash, then in the - request, session, and servlet context scopes.
      -
      FreemarkerServlet -
      This is a general-purpose FreeMarker view servlet.
      -
      HttpRequestHashModel -
      TemplateHashModel wrapper for a HttpServletRequest attributes.
      -
      HttpRequestParametersHashModel -
      TemplateHashModel wrapper for a HttpServletRequest parameters.
      -
      HttpSessionHashModel -
      TemplateHashModel wrapper for a HttpSession attributes.
      -
      IncludePage -
      A model that when invoked with a 'path' parameter will perform a servlet - include.
      -
      ServletContextHashModel -
      TemplateHashModel wrapper for a ServletContext attributes.
      -
      -
    • -
    - - - -

    Package freemarker.ext.servlet Description

    -

    Servlet for legacy "Model 2" frameworks that allows using FreeMarker -templates instead of JSP as the MVC View -(see in the Manual).

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-tree.html deleted file mode 100644 index c6f84a8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -freemarker.ext.servlet Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.servlet

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-use.html deleted file mode 100644 index 48efa23..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/servlet/package-use.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.servlet (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.servlet

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/IdentityHashMap.html b/fmpp/docs/freemarker/api/freemarker/ext/util/IdentityHashMap.html deleted file mode 100644 index e907be2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/IdentityHashMap.html +++ /dev/null @@ -1,790 +0,0 @@ - - - - - - -IdentityHashMap (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.util
    -

    Class IdentityHashMap

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          IdentityHashMap

          -
          public IdentityHashMap(int initialCapacity,
          -                       float loadFactor)
          -
          Constructs a new, empty map with the specified initial - capacity and the specified load factor.
          -
          -
          Parameters:
          -
          initialCapacity - the initial capacity of the IdentityHashMap.
          -
          loadFactor - the load factor of the IdentityHashMap
          -
          Throws:
          -
          IllegalArgumentException - if the initial capacity is less - than zero, or if the load factor is nonpositive.
          -
          -
        • -
        - - - -
          -
        • -

          IdentityHashMap

          -
          public IdentityHashMap(int initialCapacity)
          -
          Constructs a new, empty map with the specified initial capacity - and default load factor, which is 0.75.
          -
          -
          Parameters:
          -
          initialCapacity - the initial capacity of the IdentityHashMap.
          -
          Throws:
          -
          IllegalArgumentException - if the initial capacity is less - than zero.
          -
          -
        • -
        - - - -
          -
        • -

          IdentityHashMap

          -
          public IdentityHashMap()
          -
          Constructs a new, empty map with a default capacity and load - factor, which is 0.75.
          -
        • -
        - - - -
          -
        • -

          IdentityHashMap

          -
          public IdentityHashMap(Map t)
          -
          Constructs a new map with the same mappings as the given map. The - map is created with a capacity of twice the number of mappings in - the given map or 11 (whichever is greater), and a default load factor, - which is 0.75.
          -
          -
          Parameters:
          -
          t - the map whose mappings are to be placed in this map.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          size

          -
          public int size()
          -
          Returns the number of key-value mappings in this map.
          -
          -
          Specified by:
          -
          size in interface Map
          -
          Overrides:
          -
          size in class AbstractMap
          -
          Returns:
          -
          the number of key-value mappings in this map.
          -
          -
        • -
        - - - -
          -
        • -

          isEmpty

          -
          public boolean isEmpty()
          -
          Returns true if this map contains no key-value mappings.
          -
          -
          Specified by:
          -
          isEmpty in interface Map
          -
          Overrides:
          -
          isEmpty in class AbstractMap
          -
          Returns:
          -
          true if this map contains no key-value mappings.
          -
          -
        • -
        - - - -
          -
        • -

          containsValue

          -
          public boolean containsValue(Object value)
          -
          Returns true if this map maps one or more keys to the - specified value.
          -
          -
          Specified by:
          -
          containsValue in interface Map
          -
          Overrides:
          -
          containsValue in class AbstractMap
          -
          Parameters:
          -
          value - value whose presence in this map is to be tested.
          -
          Returns:
          -
          true if this map maps one or more keys to the - specified value.
          -
          -
        • -
        - - - -
          -
        • -

          containsKey

          -
          public boolean containsKey(Object key)
          -
          Returns true if this map contains a mapping for the specified - key.
          -
          -
          Specified by:
          -
          containsKey in interface Map
          -
          Overrides:
          -
          containsKey in class AbstractMap
          -
          Parameters:
          -
          key - key whose presence in this Map is to be tested.
          -
          Returns:
          -
          true if this map contains a mapping for the specified - key.
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public Object get(Object key)
          -
          Returns the value to which this map maps the specified key. Returns - null if the map contains no mapping for this key. A return - value of null does not necessarily indicate that the - map contains no mapping for the key; it's also possible that the map - explicitly maps the key to null. The containsKey - operation may be used to distinguish these two cases.
          -
          -
          Specified by:
          -
          get in interface Map
          -
          Overrides:
          -
          get in class AbstractMap
          -
          Parameters:
          -
          key - key whose associated value is to be returned.
          -
          Returns:
          -
          the value to which this map maps the specified key.
          -
          -
        • -
        - - - -
          -
        • -

          put

          -
          public Object put(Object key,
          -                  Object value)
          -
          Associates the specified value with the specified key in this map. - If the map previously contained a mapping for this key, the old - value is replaced.
          -
          -
          Specified by:
          -
          put in interface Map
          -
          Overrides:
          -
          put in class AbstractMap
          -
          Parameters:
          -
          key - key with which the specified value is to be associated.
          -
          value - value to be associated with the specified key.
          -
          Returns:
          -
          previous value associated with specified key, or null - if there was no mapping for key. A null return can - also indicate that the IdentityHashMap previously associated - null with the specified key.
          -
          -
        • -
        - - - -
          -
        • -

          remove

          -
          public Object remove(Object key)
          -
          Removes the mapping for this key from this map if present.
          -
          -
          Specified by:
          -
          remove in interface Map
          -
          Overrides:
          -
          remove in class AbstractMap
          -
          Parameters:
          -
          key - key whose mapping is to be removed from the map.
          -
          Returns:
          -
          previous value associated with specified key, or null - if there was no mapping for key. A null return can - also indicate that the map previously associated null - with the specified key.
          -
          -
        • -
        - - - -
          -
        • -

          putAll

          -
          public void putAll(Map t)
          -
          Copies all of the mappings from the specified map to this one. - - These mappings replace any mappings that this map had for any of the - keys currently in the specified Map.
          -
          -
          Specified by:
          -
          putAll in interface Map
          -
          Overrides:
          -
          putAll in class AbstractMap
          -
          Parameters:
          -
          t - Mappings to be stored in this map.
          -
          -
        • -
        - - - -
          -
        • -

          clear

          -
          public void clear()
          -
          Removes all mappings from this map.
          -
          -
          Specified by:
          -
          clear in interface Map
          -
          Overrides:
          -
          clear in class AbstractMap
          -
          -
        • -
        - - - -
          -
        • -

          clone

          -
          public Object clone()
          -
          Returns a shallow copy of this IdentityHashMap instance: the keys and - values themselves are not cloned.
          -
          -
          Overrides:
          -
          clone in class AbstractMap
          -
          Returns:
          -
          a shallow copy of this map.
          -
          -
        • -
        - - - -
          -
        • -

          keySet

          -
          public Set keySet()
          -
          Returns a set view of the keys contained in this map. The set is - backed by the map, so changes to the map are reflected in the set, and - vice versa. The set supports element removal, which removes the - corresponding mapping from this map, via the Iterator.remove, - Set.remove, removeAll, retainAll, and - clear operations. It does not support the add or - addAll operations.
          -
          -
          Specified by:
          -
          keySet in interface Map
          -
          Overrides:
          -
          keySet in class AbstractMap
          -
          Returns:
          -
          a set view of the keys contained in this map.
          -
          -
        • -
        - - - -
          -
        • -

          values

          -
          public Collection values()
          -
          Returns a collection view of the values contained in this map. The - collection is backed by the map, so changes to the map are reflected in - the collection, and vice versa. The collection supports element - removal, which removes the corresponding mapping from this map, via the - Iterator.remove, Collection.remove, - removeAll, retainAll, and clear operations. - It does not support the add or addAll operations.
          -
          -
          Specified by:
          -
          values in interface Map
          -
          Overrides:
          -
          values in class AbstractMap
          -
          Returns:
          -
          a collection view of the values contained in this map.
          -
          -
        • -
        - - - -
          -
        • -

          entrySet

          -
          public Set entrySet()
          -
          Returns a collection view of the mappings contained in this map. Each - element in the returned collection is a Map.Entry. The - collection is backed by the map, so changes to the map are reflected in - the collection, and vice versa. The collection supports element - removal, which removes the corresponding mapping from the map, via the - Iterator.remove, Collection.remove, - removeAll, retainAll, and clear operations. - It does not support the add or addAll operations.
          -
          -
          Specified by:
          -
          entrySet in interface Map
          -
          Specified by:
          -
          entrySet in class AbstractMap
          -
          Returns:
          -
          a collection view of the mappings contained in this map.
          -
          See Also:
          -
          Map.Entry
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/ModelCache.html b/fmpp/docs/freemarker/api/freemarker/ext/util/ModelCache.html deleted file mode 100644 index bf4e2f7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/ModelCache.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - -ModelCache (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.util
    -

    Class ModelCache

    -
    -
    - -
    -
      -
    • -
      -
      Direct Known Subclasses:
      -
      BeansModelCache
      -
      -
      -
      -
      public abstract class ModelCache
      -extends Object
      -
      Internally used by various wrapper implementations to implement model - caching.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ModelCache

          -
          protected ModelCache()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          setUseCache

          -
          public void setUseCache(boolean useCache)
          -
          Sets whether this wrapper caches model instances. Default is false. - When set to true, calling getInstance(Object) - multiple times for the same object will return the same model.
          -
        • -
        - - - -
          -
        • -

          getUseCache

          -
          public boolean getUseCache()
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          isCacheable

          -
          protected abstract boolean isCacheable(Object object)
          -
        • -
        - - - -
          -
        • -

          clearCache

          -
          public void clearCache()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/ModelFactory.html b/fmpp/docs/freemarker/api/freemarker/ext/util/ModelFactory.html deleted file mode 100644 index faf4c8f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/ModelFactory.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -ModelFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.util
    -

    Interface ModelFactory

    -
    -
    -
    -
      -
    • -
      -
      -
      public interface ModelFactory
      -
      Interface used to create various wrapper models in the ModelCache.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          create

          -
          TemplateModel create(Object object,
          -                     ObjectWrapper wrapper)
          -
          Create a wrapping model for the specified object that belongs to - the specified wrapper.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/WrapperTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/ext/util/WrapperTemplateModel.html deleted file mode 100644 index 4ea9b74..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/WrapperTemplateModel.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - -WrapperTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.util
    -

    Interface WrapperTemplateModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWrappedObject

          -
          Object getWrappedObject()
          -
          Retrieves the original object wrapped by this model.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/IdentityHashMap.html b/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/IdentityHashMap.html deleted file mode 100644 index e789463..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/IdentityHashMap.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.util.IdentityHashMap (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.util.IdentityHashMap

    -
    -
    No usage of freemarker.ext.util.IdentityHashMap
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelCache.html b/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelCache.html deleted file mode 100644 index b769eac..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelCache.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.util.ModelCache (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.util.ModelCache

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelFactory.html b/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelFactory.html deleted file mode 100644 index 40e438b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/ModelFactory.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - -Uses of Interface freemarker.ext.util.ModelFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.ext.util.ModelFactory

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/WrapperTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/WrapperTemplateModel.html deleted file mode 100644 index 8687ca1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/class-use/WrapperTemplateModel.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - -Uses of Interface freemarker.ext.util.WrapperTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.ext.util.WrapperTemplateModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/util/package-frame.html deleted file mode 100644 index eefb4b1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - -freemarker.ext.util (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.util

    -
    -

    Interfaces

    - -

    Classes

    - -
    - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/util/package-summary.html deleted file mode 100644 index 6437785..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/package-summary.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - -freemarker.ext.util (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.util

    -
    -
    Various classes used by freemarker.ext but might be useful outside it too.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - - - - - -
      Interface Summary 
      InterfaceDescription
      ModelFactory -
      Interface used to create various wrapper models in the ModelCache.
      -
      WrapperTemplateModel -
      A generic interface for template models that wrap some underlying - object, and wish to provide access to that wrapped object.
      -
      -
    • -
    • - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      IdentityHashMap -
      A variant of HashMap that uses - System.identityHashCode(Object) for hashing, and reference comparison - instead of Object.equals(Object).
      -
      ModelCache -
      Internally used by various wrapper implementations to implement model - caching.
      -
      -
    • -
    - - - -

    Package freemarker.ext.util Description

    -

    Various classes used by freemarker.ext but might be useful outside it too.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/util/package-tree.html deleted file mode 100644 index dad6dea..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/package-tree.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -freemarker.ext.util Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.util

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/util/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/util/package-use.html deleted file mode 100644 index abc0e1b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/util/package-use.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.util (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.util

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/NodeListModel.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/NodeListModel.html deleted file mode 100644 index 5b71652..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/NodeListModel.html +++ /dev/null @@ -1,849 +0,0 @@ - - - - - - -NodeListModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.ext.xml
    -

    Class NodeListModel

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateHashModel, TemplateMethodModel, TemplateModel, TemplateNodeModel, TemplateScalarModel, TemplateSequenceModel
      -
      -
      -
      Deprecated.  -
      Use NodeModel instead.
      -
      -
      -
      public class NodeListModel
      -extends Object
      -implements TemplateHashModel, TemplateMethodModel, TemplateScalarModel, TemplateSequenceModel, TemplateNodeModel
      -

      A data model adapter for three widespread XML document object model - representations: W3C DOM, dom4j, and JDOM. The adapter automatically - recognizes the used XML object model and provides a unified interface for it - toward the template. The model provides access to all XML InfoSet features - of the XML document and includes XPath support if it has access to the XPath- - evaluator library Jaxen. The model's philosophy (which closely follows that - of XML InfoSet and XPath) is as follows: it always wraps a list of XML nodes - (the "nodelist"). The list can be empty, can have a single element, or can - have multiple elements. Every operation applied to the model is applied to - all nodes in its nodelist. You usually start with a single- element nodelist, - usually the root element node or the document node of the XML tree. - Additionally, the nodes can contain String objects as a result of certain - evaluations (getting the names of elements, values of attributes, etc.)

      -

      Implementation note: If you are using W3C DOM documents - built by the Crimson XML parser (or you are using the built-in JDK 1.4 XML - parser, which is essentially Crimson), make sure you call - setNamespaceAware(true) on the - javax.xml.parsers.DocumentBuilderFactory instance used for document - building even when your documents don't use XML namespaces. Failing to do so, - you will experience incorrect behavior when using the documents wrapped with - this model.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NodeListModel

          -
          public NodeListModel(Object nodes)
          -
          Deprecated. 
          -
          Creates a new NodeListModel, wrapping the passed nodes.
          -
          -
          Parameters:
          -
          nodes - you can pass it a single XML node from any supported - document model, or a Java collection containing any number of nodes. - Passing null is prohibited. To create an empty model, pass it an empty - collection. If a collection is passed, all passed nodes must belong to - the same XML object model, i.e. you can't mix JDOM and dom4j in a single - instance of NodeListModel. The model itself doesn't check for this condition, - as it can be time consuming, but will throw spurious - ClassCastExceptions when it encounters mixed objects.
          -
          Throws:
          -
          IllegalArgumentException - if you pass null
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          getAsString

          -
          public String getAsString()
          -                   throws TemplateModelException
          -
          Deprecated. 
          -
          Returns the string representation of the wrapped nodes. String objects in - the nodelist are rendered as-is (with no XML escaping applied). All other - nodes are rendered in the default XML serialization format ("plain XML"). - This makes the model quite suited for use as an XML-transformation tool.
          -
          -
          Specified by:
          -
          getAsString in interface TemplateScalarModel
          -
          Returns:
          -
          the string representation of the wrapped nodes. String objects - in the nodelist are rendered as-is (with no XML escaping applied). All - other nodes are rendered in the default XML serialization format ("plain - XML").
          -
          Throws:
          -
          TemplateModelException
          -
          See Also:
          -
          TemplateScalarModel.getAsString()
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -
          Deprecated. 
          -
          Selects a single node from this model's nodelist by its list index and - returns a new NodeListModel containing that single node.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Parameters:
          -
          index - the ordinal number of the selected node
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          See Also:
          -
          TemplateSequenceModel.get(int)
          -
          -
        • -
        - - - -
          -
        • -

          get

          -
          public TemplateModel get(String key)
          -                  throws TemplateModelException
          -
          Deprecated. 
          -
          Returns a new NodeListModel containing the nodes that result from applying - an operator to this model's nodes.
          -
          -
          Specified by:
          -
          get in interface TemplateHashModel
          -
          Parameters:
          -
          key - the operator to apply to nodes. Available operators are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Key nameEvaluates to
          * or _childrenall direct element children of current nodes (non-recursive). - Applicable to element and document nodes.
          @* or _attributesall attributes of current nodes. Applicable to elements only. -
          @attributeNamenamed attributes of current nodes. Applicable to elements, - doctypes and processing instructions. On doctypes it supports - attributes publicId, systemId and - elementName. On processing instructions, it supports - attributes target and data, as well as any - other attribute name specified in data as - name="value" pair on dom4j or JDOM models. - The attribute nodes for doctype and processing instruction are - synthetic, and as such have no parent. Note, however that - @* does NOT operate on doctypes or processing - instructions.
          _ancestorall ancestors up to root element (recursive) of current nodes. - Applicable to same node types as _parent.
          _ancestorOrSelfall ancestors of current nodes plus current nodes. Applicable - to same node types as _parent.
          _cnamethe canonical names of current nodes (namespace URI + local - name), one string per node (non-recursive). Applicable to - elements and attributes
          _contentthe complete content of current nodes, including children - elements, text, entity references, and processing instructions - (non-recursive). Applicable to elements and documents.
          _descendantall recursive descendant element children of current nodes. - Applicable to document and element nodes.
          _descendantOrSelfall recursive descendant element children of current nodes - plus current nodes. Applicable to document and element nodes. -
          _documentall documents the current nodes belong to. Applicable to all - nodes except text.
          _doctypedoctypes of the current nodes. Applicable to document nodes - only.
          _filterTypeis a filter-by-type template method model. When called, it - will yield a node list that contains only those current nodes - whose type matches one of types passed as argument. You can pass - as many string arguments as you want, each representing one of - the types to select: "attribute", "cdata", - "comment", "document", - "documentType", "element", - "entity", "entityReference", - "namespace", "processingInstruction", or - "text".
          _namethe names of current nodes, one string per node - (non-recursive). Applicable to elements and attributes - (returns their local names), entity references, processing - instructions (returns its target), doctypes (returns its public - ID)
          _nsprefixthe namespace prefixes of current nodes, one string per node - (non-recursive). Applicable to elements and attributes
          _nsurithe namespace URIs of current nodes, one string per node - (non-recursive). Applicable to elements and attributes
          _parentparent elements of current nodes. Applicable to element, - attribute, comment, entity, processing instruction.
          _qnamethe qualified names of current nodes in - [namespacePrefix:]localName form, one string per node - (non-recursive). Applicable to elements and attributes
          _registerNamespace(prefix, uri)register a XML namespace with the specified prefix and URI for - the current node list and all node lists that are derived from - the current node list. After registering, you can use the - nodelist["prefix:localname"] or - nodelist["@prefix:localname"] syntaxes to - reach elements and attributes whose names are namespace-scoped. - Note that the namespace prefix need not match the actual prefix - used by the XML document itself since namespaces are compared - solely by their URI.
          _textthe text of current nodes, one string per node - (non-recursive). Applicable to elements, attributes, comments, - processing instructions (returns its data) and CDATA sections. - The reserved XML characters ('<' and '&') are NOT - escaped.
          _typeReturns a string describing the type of nodes, one - string per node. The returned values are "attribute", - "cdata", "comment", "document", - "documentType", "element", - "entity", "entityReference", - "namespace", "processingInstruction", - "text", or "unknown".
          _uniquea copy of the current nodes that keeps only the first - occurrence of every node, eliminating duplicates. Duplicates can - occur in the node list by applying uptree-traversals - _parent, _ancestor, _ancestorOrSelf, - and _document on a node list with multiple elements. - I.e. foo._children._parent will return a node list that - has duplicates of nodes in foo - each node will have the number - of occurrences equal to the number of its children. In these - cases, use foo._children._parent._unique to eliminate - duplicates. Applicable to all node types.
          any other keyelement children of current nodes with name matching the key. - This allows for convenience child traversal in - book.chapter.title style syntax. Applicable to document - and element nodes.
          -
          Returns:
          -
          a new NodeListModel containing the nodes that result from applying - the operator to this model's nodes.
          -
          Throws:
          -
          TemplateModelException
          -
          See Also:
          -
          TemplateHashModel.get(String)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          registerNamespace

          -
          public void registerNamespace(String prefix,
          -                              String uri)
          -
          Deprecated. 
          -
          Registers a namespace prefix-URI pair for subsequent use in get(String) as well as for use in XPath expressions.
          -
          -
          Parameters:
          -
          prefix - the namespace prefix to use for the namespace
          -
          uri - the namespace URI that identifies the namespace.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getNodeName

          -
          public String getNodeName()
          -                   throws TemplateModelException
          -
          Deprecated. 
          -
          -
          Specified by:
          -
          getNodeName in interface TemplateNodeModel
          -
          Returns:
          -
          a String that is used to determine the processing - routine to use. In the XML implementation, if the node - is an element, it returns the element's tag name. If it - is an attribute, it returns the attribute's name. It - returns "@text" for text nodes, "@pi" for processing instructions, - and so on.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getNodeNamespace

          -
          public String getNodeNamespace()
          -                        throws TemplateModelException
          -
          Deprecated. 
          -
          -
          Specified by:
          -
          getNodeNamespace in interface TemplateNodeModel
          -
          Returns:
          -
          the XML namespace URI with which this node is - associated. If this TemplateNodeModel implementation is - not XML-related, it will almost certainly be null. Even - for XML nodes, this will often be null.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getNodeType

          -
          public String getNodeType()
          -                   throws TemplateModelException
          -
          Deprecated. 
          -
          -
          Specified by:
          -
          getNodeType in interface TemplateNodeModel
          -
          Returns:
          -
          a String describing the type of node this is. - In the W3C DOM, this should be "element", "text", "attribute", etc. - A TemplateNodeModel implementation that models other kinds of - trees could return whatever it appropriate for that application. It - can be null, if you don't want to use node-types.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/class-use/NodeListModel.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/class-use/NodeListModel.html deleted file mode 100644 index 65760b6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/class-use/NodeListModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.ext.xml.NodeListModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.ext.xml.NodeListModel

    -
    -
    No usage of freemarker.ext.xml.NodeListModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-frame.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/package-frame.html deleted file mode 100644 index d5187e1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -freemarker.ext.xml (FreeMarker 2.3.21 API) - - - - - -

    freemarker.ext.xml

    -
    -

    Classes

    - -
    - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-summary.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/package-summary.html deleted file mode 100644 index ca18160..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -freemarker.ext.xml (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.ext.xml

    -
    -
    Deprecated, use W3C DOM with freemarker.ext.dom instead; -Exposes XML from DOM, dom4j or JDOM nodes, uniformly.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      NodeListModelDeprecated -
      Use NodeModel instead.
      -
      -
    • -
    - - - -

    Package freemarker.ext.xml Description

    -

    Deprecated, use W3C DOM with freemarker.ext.dom instead; -Exposes XML from DOM, dom4j or JDOM nodes, uniformly.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-tree.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/package-tree.html deleted file mode 100644 index f72e7d9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -freemarker.ext.xml Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.ext.xml

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-use.html b/fmpp/docs/freemarker/api/freemarker/ext/xml/package-use.html deleted file mode 100644 index 78ba766..0000000 --- a/fmpp/docs/freemarker/api/freemarker/ext/xml/package-use.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Package freemarker.ext.xml (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.ext.xml

    -
    -
    No usage of freemarker.ext.xml
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/Logger.html b/fmpp/docs/freemarker/api/freemarker/log/Logger.html deleted file mode 100644 index c1e0b00..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/Logger.html +++ /dev/null @@ -1,739 +0,0 @@ - - - - - - -Logger (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.log
    -

    Class Logger

    -
    -
    - -
    -
      -
    • -
      -
      -
      public abstract class Logger
      -extends Object
      -
      The FreeMarker logging facility. This is a polymorphic implementation - that will use whatever logging package it can find on the system: - Apache Log4J, Apache Avalon LogKit, java.util.logging (in this - order). If it fails to find any of the above, logging will be suppressed - and a short notice will be printed to System.err. - -

      You can use the selectLoggerLibrary(int) static method to force - use of a specific logger package, or to turn off logging. - -

      SLF4J or Apache Commons Logging are supported (since FreeMarker 2.3.17) - and recommended, but are never selected automatically (until FreeMarker 2.4) - due to backward compatibility constraints; you have to select them - explicitly with selectLoggerLibrary(int).

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          Logger

          -
          public Logger()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          selectLoggerLibrary

          -
          public static void selectLoggerLibrary(int library)
          -                                throws ClassNotFoundException
          -
          Selects the logger library to use. - If you want to change the default setting, do it early in application - initialization phase, before calling any other FreeMarker API since once - various parts of the FreeMarker library bind to the logging subsystem, - the change in this value will have no effect on them.
          -
          -
          Parameters:
          -
          library - one of LIBRARY_XXX constants. By default, - LIBRARY_AUTO is used.
          -
          Throws:
          -
          ClassNotFoundException - if an explicit logging library is asked for - (that is, neither NONE, nor AUTO), and it's not found in the classpath.
          -
          -
        • -
        - - - -
          -
        • -

          setCategoryPrefix

          -
          public static void setCategoryPrefix(String prefix)
          -
          Sets a category prefix. This prefix is prepended to any logger category - name. This makes it possible to have different FreeMarker logger categories - on a per-application basis (better said, per-classloader basis). By default - the category prefix is the empty string. If you set a non-empty category - prefix, be sure to include the trailing separator dot (i.e. "MyApp.") - If you want to change the default setting, do it early in application - initialization phase, before calling any other FreeMarker API since once - various parts of the FreeMarker library bind to the logging subsystem, - the change in this value will have no effect on them.
          -
        • -
        - - - -
          -
        • -

          debug

          -
          public abstract void debug(String message)
          -
          Logs a debugging message.
          -
        • -
        - - - -
          -
        • -

          debug

          -
          public abstract void debug(String message,
          -                           Throwable t)
          -
          Logs a debugging message with accompanying throwable.
          -
        • -
        - - - -
          -
        • -

          info

          -
          public abstract void info(String message)
          -
          Logs an informational message.
          -
        • -
        - - - -
          -
        • -

          info

          -
          public abstract void info(String message,
          -                          Throwable t)
          -
          Logs an informational message with accompanying throwable.
          -
        • -
        - - - -
          -
        • -

          warn

          -
          public abstract void warn(String message)
          -
          Logs a warning message.
          -
        • -
        - - - -
          -
        • -

          warn

          -
          public abstract void warn(String message,
          -                          Throwable t)
          -
          Logs a warning message with accompanying throwable.
          -
        • -
        - - - -
          -
        • -

          error

          -
          public abstract void error(String message)
          -
          Logs an error message.
          -
        • -
        - - - -
          -
        • -

          error

          -
          public abstract void error(String message,
          -                           Throwable t)
          -
          Logs an error message with accompanying throwable.
          -
        • -
        - - - -
          -
        • -

          isDebugEnabled

          -
          public abstract boolean isDebugEnabled()
          -
          Returns true if this logger will log debug messages.
          -
        • -
        - - - -
          -
        • -

          isInfoEnabled

          -
          public abstract boolean isInfoEnabled()
          -
          Returns true if this logger will log informational messages.
          -
        • -
        - - - -
          -
        • -

          isWarnEnabled

          -
          public abstract boolean isWarnEnabled()
          -
          Returns true if this logger will log warning messages.
          -
        • -
        - - - -
          -
        • -

          isErrorEnabled

          -
          public abstract boolean isErrorEnabled()
          -
          Returns true if this logger will log error messages.
          -
        • -
        - - - -
          -
        • -

          isFatalEnabled

          -
          public abstract boolean isFatalEnabled()
          -
          Returns true if this logger will log fatal error messages.
          -
        • -
        - - - -
          -
        • -

          getLogger

          -
          public static Logger getLogger(String category)
          -
          Returns a logger for the specified category.
          -
          -
          Parameters:
          -
          category - a dot separated hierarchical category name. If a category - prefix is in effect, it's prepended to the category name.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/class-use/Logger.html b/fmpp/docs/freemarker/api/freemarker/log/class-use/Logger.html deleted file mode 100644 index 0ae3eec..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/class-use/Logger.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - -Uses of Class freemarker.log.Logger (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.log.Logger

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Packages that use Logger 
      PackageDescription
      freemarker.log -
      -Logging facility; dispatches FreeMarker log messages to the chosen logger library.
      -
      -
    • -
    • - -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/package-frame.html b/fmpp/docs/freemarker/api/freemarker/log/package-frame.html deleted file mode 100644 index 7493dc4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - -freemarker.log (FreeMarker 2.3.21 API) - - - - - -

    freemarker.log

    -
    -

    Classes

    - -
    - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/package-summary.html b/fmpp/docs/freemarker/api/freemarker/log/package-summary.html deleted file mode 100644 index 4180b48..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - -freemarker.log (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.log

    -
    -
    -Logging facility; dispatches FreeMarker log messages to the chosen logger library.
    -
    -

    See: Description

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      Logger -
      The FreeMarker logging facility.
      -
      -
    • -
    - - - -

    Package freemarker.log Description

    -

    -Logging facility; dispatches FreeMarker log messages to the chosen logger library.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/package-tree.html b/fmpp/docs/freemarker/api/freemarker/log/package-tree.html deleted file mode 100644 index d7d750e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/package-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -freemarker.log Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.log

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/log/package-use.html b/fmpp/docs/freemarker/api/freemarker/log/package-use.html deleted file mode 100644 index ce34854..0000000 --- a/fmpp/docs/freemarker/api/freemarker/log/package-use.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - -Uses of Package freemarker.log (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.log

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/AdapterTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/AdapterTemplateModel.html deleted file mode 100644 index 775da27..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/AdapterTemplateModel.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - -AdapterTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface AdapterTemplateModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getAdaptedObject

          -
          Object getAdaptedObject(Class hint)
          -
          Retrieves the underlying object, or some other object semantically - equivalent to its value narrowed by the class hint.
          -
          -
          Parameters:
          -
          hint - the desired class of the returned value. An implementation - should make reasonable effort to retrieve an object of the requested - class, but if that is impossible, it must at least return the underlying - object as-is. As a minimal requirement, an implementation must always - return the exact underlying object when - hint.isInstance(underlyingObject) holds. When called - with java.lang.Object.class, it should return a generic Java - object (i.e. if the model is wrapping a scripting language object that is - further wrapping a Java object, the deepest underlying Java object should - be returned).
          -
          Returns:
          -
          the underlying object, or its value accommodated for the hint - class.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/Configuration.html b/fmpp/docs/freemarker/api/freemarker/template/Configuration.html deleted file mode 100644 index 42e9281..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/Configuration.html +++ /dev/null @@ -1,2812 +0,0 @@ - - - - - - -Configuration (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class Configuration

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Cloneable
      -
      -
      -
      -
      public class Configuration
      -extends Configurable
      -implements Cloneable
      -
      The main entry point into the FreeMarker API; encapsulates the configuration settings of FreeMarker, - also serves as a central template-loading and caching service. - -

      This class is meant to be used in a singleton pattern. That is, you create an instance of this at the beginning of - the application life-cycle, set its configuration settings there (either with the - setter methods like setTemplateLoader(TemplateLoader) or by loading a .properties file), and then - use that single instance everywhere in your application. Frequently re-creating Configuration is a typical - and grave mistake from performance standpoint, as the Configuration holds the template cache, and often also - the class introspection cache, which then will be lost. (Note that, naturally, having multiple long-lived instances, - like one per component that internally uses FreeMarker is fine.) - -

      The basic usage pattern is like: - -

      -  // Where the application is initialized; in general you do this ONLY ONCE in the application life-cycle!
      -  Configuration cfg = new Configuration(VERSION_X_Y_Z));
      -  // Where X, Y, Z enables the not-100%-backward-compatible fixes introduced in
      -  // FreeMarker version X.Y.Z  and earlier (see Configuration(Version)).
      -  cfg.setSomeSetting(...);
      -  cfg.setOtherSetting(...);
      -  ...
      -  
      -  // Later, whenever the application needs a template (so you may do this a lot, and from multiple threads):
      -  Template myTemplate = cfg.getTemplate("myTemplate.html");
      -  myTemplate.process(dataModel, out);
      - -

      A couple of settings that you should not leave on its default value are: -

      - -

      A Configuration object is thread-safe only after you have stopped modifying the configuration settings, - and you have safely published it (see JSR 133 and related literature) to other threads. Generally, you set - everything directly after you have instantiated the Configuration object, then you don't change the settings - anymore, so then it's safe to make it accessible (again, via a "safe publication" technique) from multiple threads. - The methods that aren't for modifying settings, like getTemplate(String), are thread-safe.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - - - - - -
          -
        • -

          Configuration

          -
          public Configuration(Version incompatibleImprovements)
          -
          Creates a new instance and sets which of the non-backward-compatible bugfixes/improvements should be enabled. - Note that the specified versions corresponds to the incompatible_improvements configuration setting, and - can be changed later, with setIncompatibleImprovements(Version) for example. - -

          About the "incompatible improvements" setting - -

          The setting value is the FreeMarker version number where the bugfixes/improvements to enable were already - implemented (but possibly wasn't active by default, as that would break backward-compatibility). - -

          The default value is 2.3.0 for maximum backward-compatibility when upgrading freemkarer.jar under an - existing application. For actively developed applications usually you should set this to the highest possible - value where the 1st or 2nd version is still the same as in the version where you have started development. - As far as the 1st and 2nd version number remains, these changes are always very low-risk, so usually they don't - break anything. Of course, you are still encouraged to read the list of changes below. - -

          Note that at FreeMarker minor (2nd) or major (1st) version number increments, it's possible that emulating - some of the old bugs will become unsupported, that is, even if you set this setting to a low value, it silently - wont bring back the old behavior anymore. - -

          This setting doesn't affect important not-fully-backward compatible security fixes; they are always enabled, - regardless of what you set here. - -

          Currently the effects of this setting are: -

            -
          • - 2.3.0: This is the lowest supported value, the version used in older projects. This is the default in the - FreeMarker 2.3.x series. -

          • -
          • - 2.3.19 (or higher): Bug fix: Wrong # tags were printed as static text instead of - causing parsing error when there was no correct # or @ tag earlier in the - same template. -

          • -
          • - 2.3.20 (or higher): ?html will escape apostrophe-quotes just like ?xhtml does. Utilizing - this is highly recommended, because otherwise if interpolations are used inside attribute values that use - apostrophe-quotation (<foo bar='${val}'>) instead of plain quotation mark - (<foo bar="${val}">), they might produce HTML/XML that's not well-formed. Note that - ?html didn't do this because long ago there was no cross-browser way of doing this, but it's not a - concern anymore. -

          • -
          • - 2.3.21 (or higher): -

              -
            • - The default of the object_wrapper setting (Configurable.getObjectWrapper()) changes from - ObjectWrapper.DEFAULT_WRAPPER to another almost identical DefaultObjectWrapper singleton, - returned by DefaultObjectWrapperBuilder.build(). The new default object wrapper's - "incompatible improvements" version is set to the same as of the Configuration. - See BeansWrapper.BeansWrapper(Version) for further details. Furthermore, the new default - object wrapper doesn't allow changing its settings; setter methods throw IllegalStateException). - (If anything tries to call setters on the old default in your application, that's a dangerous bug that - won't remain hidden now. As the old default is a singleton too, potentially shared by independently - developed components, most of them expects the out-of-the-box behavior from it (and the others are - necessarily buggy). Also, then concurrency glitches can occur (and even pollute the class introspection - cache) because the singleton is modified after publishing to other threads.) - Furthermore the new default object wrapper shares class introspection cache with other - BeansWrapper-s created with BeansWrapperBuilder, which has an impact as - BeansWrapper.clearClassIntrospecitonCache() will be disallowed; see more about it there. -

            • -
            • - The ?iso_... built-ins won't show the time zone offset for Time values anymore, - because most databases store time values that aren't in any time zone, but just store hour, minute, - second, and decimal second field values. If you still want to show the offset (like for PostgreSQL - "time with time zone" columns you should), you can force showing the time zone offset by using - myTime?string.iso_fz (and its other variants). -

            • -
            • ?is_enumerable correctly returns false for Java methods get from Java objects that - are wrapped with BeansWrapper and its subclasses, like DefaultObjectWrapper. Although - method values implement TemplateSequenceModel (because of a historical design quirk in - BeansWrapper), trying to #list them will cause error, hence they aren't enumerable. -

            • -
            • - ?c will return "INF", "-INF" and "NaN" for positive/negative infinity - and IEEE floating point Not-a-Number, respectively. These are the XML Schema compatible representations - of these special values. Earlier it has returned what DecimalFormat did with US locale, none of - which was understood by any (common) computer language. -

            • -
            • - FTL hash literals that repeat keys now only have the key once with ?keys, and only has the last - value associated to that key with ?values. This is consistent with the behavior of - hash[key] and how maps work in Java. -

            • -
            • In most cases (where FreeMarker is able to do that), for TemplateLoader-s that use - URLConnection, URLConnection#setUseCaches(boolean) will called with false, - so that only FreeMarker will do caching, not the URL scheme's handler. - See URLTemplateLoader.setURLConnectionUsesCaches(Boolean) for more details. -

            • -
            • - The default of the template_loader setting (getTemplateLoader()) changes - to null, which means that FreeMarker will not find any templates. Earlier - the default was a FileTemplateLoader that used the current directory as the root. This was - dangerous and fragile as you usually don't have good control over what the current directory will be. - Luckily, the old default almost never looked for the templates at the right place - anyway, so pretty much all applications had to set the template_loader setting, so it's unlikely - that changing the default breaks your application. -

            • -
            • - Right-unlimited ranges become readable (like listable), so <#list 1.. as i>...</#list> works. - Earlier they were only usable for slicing (like hits[10..]). -

            • -
            • - Empty ranges return Constants.EMPTY_SEQUENCE instead of an empty SimpleSequence. This - is in theory backward compatible, as the API only promises to give something that implements - TemplateSequenceModel. -

            • -
            • - Unclosed comments (<#-- ...) and #noparse-s won't be silently closed at the end of - template anymore, but cause a parsing error instead. -

            • -
            -
          • -
          -
          -
          Throws:
          -
          IllegalArgumentException - if incompatibleImmprovements is greater than the current FreeMarker - version, or less than 2.3.0.
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - - - - - -
          -
        • -

          loadBuiltInEncodingMap

          -
          public void loadBuiltInEncodingMap()
          -
          Loads a preset language-to-encoding map, similarly as if you have called - clearEncodingMap() and then did multiple setEncoding(Locale, String) calls. - It assumes the usual character encodings for most languages. - The previous content of the encoding map will be lost. - This default map currently contains the following mappings: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          arISO-8859-6
          beISO-8859-5
          bgISO-8859-5
          caISO-8859-1
          csISO-8859-2
          daISO-8859-1
          deISO-8859-1
          elISO-8859-7
          enISO-8859-1
          esISO-8859-1
          etISO-8859-1
          fiISO-8859-1
          frISO-8859-1
          hrISO-8859-2
          huISO-8859-2
          isISO-8859-1
          itISO-8859-1
          iwISO-8859-8
          jaShift_JIS
          koEUC-KR
          ltISO-8859-2
          lvISO-8859-2
          mkISO-8859-5
          nlISO-8859-1
          noISO-8859-1
          plISO-8859-2
          ptISO-8859-1
          roISO-8859-2
          ruISO-8859-5
          shISO-8859-5
          skISO-8859-2
          slISO-8859-2
          sqISO-8859-2
          srISO-8859-5
          svISO-8859-1
          trISO-8859-9
          ukISO-8859-5
          zhGB2312
          zh_TWBig5
          -
          -
          See Also:
          -
          clearEncodingMap(), -setEncoding(Locale, String), -setDefaultEncoding(String)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getDefaultConfiguration

          -
          public static Configuration getDefaultConfiguration()
          -
          Deprecated. The usage of the static singleton (the "default") - Configuration instance can easily cause erroneous, unpredictable - behavior. This is because multiple independent software components may use - FreeMarker internally inside the same application, so they will interfere - because of the common Configuration instance. Each such component - should use its own private Configuration object instead, that it - typically creates with new Configuration() when the component - is initialized.
          -
          Returns the default (singleton) Configuration object. Note that you can - create as many separate configurations as you wish; this global instance - is provided for convenience, or when you have no reason to use a separate - instance.
          -
        • -
        - - - -
          -
        • -

          setDefaultConfiguration

          -
          public static void setDefaultConfiguration(Configuration config)
          -
          Deprecated. Using the "default" Configuration instance can - easily lead to erroneous, unpredictable behaviour. - See more here....
          -
          Sets the Configuration object that will be retrieved from future calls - to getDefaultConfiguration().
          -
        • -
        - - - -
          -
        • -

          setTemplateLoader

          -
          public void setTemplateLoader(TemplateLoader templateLoader)
          -
          Sets a TemplateLoader that is used to look up and load templates; - as a side effect the template cache will be emptied. - By providing your own TemplateLoader implementation, you can load templates from whatever kind of - storages, like from relational databases, NoSQL-storages, etc. - -

          Convenience methods exists to install commonly used loaders, instead of using this method: - setClassForTemplateLoading(Class, String), - setDirectoryForTemplateLoading(File), and - setServletContextForTemplateLoading(Object, String). - -

          You can chain several TemplateLoader-s together with MultiTemplateLoader. - -

          Default value: You should always set the template loader instead of relying on the default value. - (But if you still care what it is, before "incompatible improvements" 2.3.21 it's a FileTemplateLoader - that uses the current directory as its root; as it's hard tell what that directory will be, it's not very useful - and dangerous. Starting with "incompatible improvements" 2.3.21 the default is null.) - -

          Note that setting the template loader will re-create the template cache, so - all its content will be lost.

          -
        • -
        - - - - - - - -
          -
        • -

          setCacheStorage

          -
          public void setCacheStorage(CacheStorage storage)
          -
          Sets the CacheStorage used for caching Template-s; - the earlier content of the template cache will be dropt. - - The default is a SoftCacheStorage. If the total size of the Template - objects is significant but most templates are used rarely, using a - MruCacheStorage instead might be advisable. If you don't want caching at - all, use NullCacheStorage (you can't use null). - -

          Note that setting the cache storage will re-create the template cache, so - all its content will be lost.

          -
        • -
        - - - - - - - - - - - -
          -
        • -

          setServletContextForTemplateLoading

          -
          public void setServletContextForTemplateLoading(Object servletContext,
          -                                                String path)
          -
          Sets the servlet context from which to load templates. - This is equivalent to setTemplateLoader(new WebappTemplateLoader(sctxt, path)) - or setTemplateLoader(new WebappTemplateLoader(sctxt)) if path was - null, so see WebappTemplateLoader for more details.
          -
          -
          Parameters:
          -
          servletContext - the ServletContext object. (The declared type is Object - to prevent class loading error when using FreeMarker in an environment where - there's no servlet classes available.)
          -
          path - the path relative to the ServletContext.
          -
          See Also:
          -
          setTemplateLoader(TemplateLoader)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setTemplateUpdateDelay

          -
          public void setTemplateUpdateDelay(int seconds)
          -
          Sets the time in seconds that must elapse before checking whether there is a newer version of a template file - than the cached one. - -

          Historical note: Despite what the API documentation said earlier, this method is not thread-safe. - While it works well on most hardware, it's not guaranteed that FreeMarker will see the update in all threads, - and theoretically it's also possible that it will see a value that's a binary mixture of the new and the old one.

          -
        • -
        - - - -
          -
        • -

          setStrictSyntaxMode

          -
          public void setStrictSyntaxMode(boolean b)
          -
          Deprecated. Only true (the default) value will be supported sometimes in the future.
          -
          Sets whether directives such as if, else, etc must be written as #if, #else, etc. - Defaults to true. - -

          When this is true, - any tag not starting with <# or </# or <@ or </@ is considered as plain text - and will go to the output as is. Tag starting with <# or </# must - be valid FTL tag, or else the template is invalid (i.e. <#noSuchDirective> - is an error).

          -
        • -
        - - - - - - - - - - - -
          -
        • -

          setIncompatibleImprovements

          -
          public void setIncompatibleImprovements(Version incompatibleImprovements)
          -
          Use Configuration(Version) instead if possible; see the meaning of the parameter there. - If the default value of a setting depends on the incompatibleImprovements and the value of that setting - was never set in this Configuration object through the public API, its value will be set to the default - value appropriate for the new incompatibleImprovements. (This adjustment of a setting value doesn't - count as setting that setting, so setting incompatibleImprovements for multiple times also works as - expected.) Note that if the template_loader have to be changed because of this, the template cache will - be emptied.
          -
          -
          Throws:
          -
          IllegalArgumentException - if incompatibleImmprovements is greater than the current FreeMarker - version, or less than 2.3.0, or null.
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          getParsedIncompatibleEnhancements

          -
          public int getParsedIncompatibleEnhancements()
          -
          Deprecated. Use getIncompatibleImprovements() instead.
          -
        • -
        - - - -
          -
        • -

          setWhitespaceStripping

          -
          public void setWhitespaceStripping(boolean b)
          -
          Sets whether the FTL parser will try to remove - superfluous white-space around certain FTL tags.
          -
        • -
        - - - -
          -
        • -

          getWhitespaceStripping

          -
          public boolean getWhitespaceStripping()
          -
          Gets whether the FTL parser will try to remove - superfluous white-space around certain FTL tags.
          -
          -
          See Also:
          -
          setWhitespaceStripping(boolean)
          -
          -
        • -
        - - - -
          -
        • -

          setTagSyntax

          -
          public void setTagSyntax(int tagSyntax)
          -
          Determines the syntax of the template files (angle bracket VS square bracket) - that has no #ftl in it. The tagSyntax - parameter must be one of: - - -

          In FreeMarker 2.3.x ANGLE_BRACKET_TAG_SYNTAX is the - default for better backward compatibility. Starting from 2.4.x AUTO_DETECT_TAG_SYNTAX is the default, so it's recommended to use - that even for 2.3.x. - -

          This setting is ignored for the templates that have ftl directive in - it. For those templates the syntax used for the ftl directive determines - the syntax.

          -
        • -
        - - - -
          -
        • -

          getTagSyntax

          -
          public int getTagSyntax()
          -
          The getter pair of setTagSyntax(int).
          -
        • -
        - - - - - - - - - - - - - - - - - - - - - - - -
          -
        • -

          getTemplate

          -
          public Template getTemplate(String name,
          -                            Locale locale,
          -                            String encoding,
          -                            boolean parseAsFTL,
          -                            boolean ignoreMissing)
          -                     throws IOException
          -
          Retrieves the template with the given name (and according the specified further parameters) from the template - cache, loading it into the cache first if it's missing/staled. - -

          This method is thread-safe. - -

          See Configuration for an example of basic usage.

          -
          -
          Parameters:
          -
          name - The name or path of the template, which is not a real path, - but interpreted inside the current TemplateLoader. - Can't be null. The exact syntax of the name - is interpreted by the underlying TemplateLoader, but the - cache makes some assumptions. First, the name is expected to be - a hierarchical path, with path components separated by a slash - character (not with backslash!). The path (the name) given here must not begin with slash; - it's always interpreted relative to the "template root directory". - Then, the .. and . path meta-elements will be resolved. - For example, if the name is a/../b/./c.ftl, then it will be - simplified to b/c.ftl. The rules regarding this are the same as with conventional - UN*X paths. The path must not reach outside the template root directory, that is, - it can't be something like "../templates/my.ftl" (not even if this path - happens to be equivalent with "/my.ftl"). - Further, the path is allowed to contain at most - one path element whose name is * (asterisk). This path meta-element triggers the - acquisition mechanism. If the template is not found in - the location described by the concatenation of the path left to the - asterisk (called base path) and the part to the right of the asterisk - (called resource path), the cache will attempt to remove the rightmost - path component from the base path ("go up one directory") and concatenate - that with the resource path. The process is repeated until either a - template is found, or the base path is completely exhausted.
          -
          locale - The requested locale of the template. Can't be null. - Assuming you have specified en_US as the locale and - myTemplate.ftl as the name of the template, the cache will - first try to retrieve myTemplate_en_US.html, then - myTemplate.en.ftl, and finally myTemplate.ftl.
          -
          encoding - The charset used to interpret the template source code bytes. Can't be null.
          -
          parseAsFTL - If true, the loaded template is parsed and interpreted normally, - as a regular FreeMarker template. If false, the loaded template is - treated as a static text, so ${...}, <#...> etc. will not have special meaning - in it.
          -
          ignoreMissing - If true, the method won't throw FileNotFoundException if the template - doesn't exist, instead it returns null. Other kind of exceptions won't be suppressed.
          -
          Returns:
          -
          the requested template; maybe null when the ignoreMissing parameter is true.
          -
          Throws:
          -
          FileNotFoundException - if the template could not be found.
          -
          IOException - if there was a problem loading the template.
          -
          ParseException - (extends IOException) if the template is syntactically bad.
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          setDefaultEncoding

          -
          public void setDefaultEncoding(String encoding)
          -
          Sets the charset used for decoding byte sequences to character sequences when - reading template files in a locale for which no explicit encoding - was specified via setEncoding(Locale, String). Note that by default there is no locale specified for - any locale, so the default encoding is always in effect. - -

          Defaults to the default system encoding, which can change from one server to - another, so you should always set this setting. If you don't know what charset your should chose, - "UTF-8" is usually a good choice. - -

          Note that individual templates may specify their own charset by starting with - <#ftl encoding="...">

          -
          -
          Parameters:
          -
          encoding - The name of the charset, such as "UTF-8" or "ISO-8859-1"
          -
          -
        • -
        - - - -
          -
        • -

          getDefaultEncoding

          -
          public String getDefaultEncoding()
          -
          Gets the default encoding for converting bytes to characters when - reading template files in a locale for which no explicit encoding - was specified. Defaults to default system encoding.
          -
        • -
        - - - -
          -
        • -

          getEncoding

          -
          public String getEncoding(Locale locale)
          -
          Gets the preferred character encoding for the given locale, or the - default encoding if no encoding is set explicitly for the specified - locale. You can associate encodings with locales using - setEncoding(Locale, String) or loadBuiltInEncodingMap().
          -
        • -
        - - - - - - - -
          -
        • -

          setSharedVariable

          -
          public void setSharedVariable(String name,
          -                              TemplateModel tm)
          -
          Adds a shared variable to the configuration. - Shared sharedVariables are sharedVariables that are visible - as top-level sharedVariables for all templates which use this - configuration, if the data model does not contain a - variable with the same name. - -

          Never use TemplateModel implementation that is not thread-safe for shared sharedVariables, - if the configuration is used by multiple threads! It is the typical situation for Servlet based Web sites. - -

          This method is not thread safe; use it with the same restrictions as those that modify setting values.

          -
          -
          Parameters:
          -
          name - the name used to access the data object from your template. - If a shared variable with this name already exists, it will replace - that.
          -
          See Also:
          -
          setAllSharedVariables(freemarker.template.TemplateHashModelEx), -setSharedVariable(String,Object)
          -
          -
        • -
        - - - -
          -
        • -

          getSharedVariableNames

          -
          public Set getSharedVariableNames()
          -
          Returns the set containing the names of all defined shared sharedVariables. - The method returns a new Set object on each call that is completely - disconnected from the Configuration. That is, modifying the set will have - no effect on the Configuration object.
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          setAllSharedVariables

          -
          public void setAllSharedVariables(TemplateHashModelEx hash)
          -                           throws TemplateModelException
          -
          Adds all object in the hash as shared variable to the configuration; it's like doing several - setSharedVariable(String, Object) calls, one for each hash entry. It doesn't remove the already added - shared variable before doing this. - -

          Never use TemplateModel implementation that is not thread-safe for shared shared variable values, - if the configuration is used by multiple threads! It is the typical situation for Servlet based Web sites. - -

          This method is not thread safe; use it with the same restrictions as those that modify setting values.

          -
          -
          Parameters:
          -
          hash - a hash model whose objects will be copied to the - configuration with same names as they are given in the hash. - If a shared variable with these names already exist, it will be replaced - with those from the map.
          -
          Throws:
          -
          TemplateModelException
          -
          See Also:
          -
          setSharedVariable(String,Object), -setSharedVariable(String,TemplateModel)
          -
          -
        • -
        - - - - - - - -
          -
        • -

          clearSharedVariables

          -
          public void clearSharedVariables()
          -
          Removes all shared sharedVariables, except the predefined ones (compress, html_escape, etc.).
          -
        • -
        - - - -
          -
        • -

          clearTemplateCache

          -
          public void clearTemplateCache()
          -
          Removes all entries from the template cache, thus forcing reloading of templates - on subsequent getTemplate calls. - -

          This method is thread-safe and can be called while the engine processes templates.

          -
        • -
        - - - -
          -
        • -

          removeTemplateFromCache

          -
          public void removeTemplateFromCache(String name)
          -                             throws IOException
          -
          Equivalent to removeTemplateFromCache(name, thisCfg.getLocale(), thisCfg.getEncoding(thisCfg.getLocale()), true).
          -
          -
          Throws:
          -
          IOException
          -
          Since:
          -
          2.3.19
          -
          -
        • -
        - - - -
          -
        • -

          removeTemplateFromCache

          -
          public void removeTemplateFromCache(String name,
          -                                    Locale locale)
          -                             throws IOException
          -
          Equivalent to removeTemplateFromCache(name, locale, thisCfg.getEncoding(locale), true).
          -
          -
          Throws:
          -
          IOException
          -
          Since:
          -
          2.3.19
          -
          -
        • -
        - - - -
          -
        • -

          removeTemplateFromCache

          -
          public void removeTemplateFromCache(String name,
          -                                    String encoding)
          -                             throws IOException
          -
          Equivalent to removeTemplateFromCache(name, thisCfg.getLocale(), encoding, true).
          -
          -
          Throws:
          -
          IOException
          -
          Since:
          -
          2.3.19
          -
          -
        • -
        - - - -
          -
        • -

          removeTemplateFromCache

          -
          public void removeTemplateFromCache(String name,
          -                                    Locale locale,
          -                                    String encoding)
          -                             throws IOException
          -
          Equivalent to removeTemplateFromCache(name, locale, encoding, true).
          -
          -
          Throws:
          -
          IOException
          -
          Since:
          -
          2.3.19
          -
          -
        • -
        - - - -
          -
        • -

          removeTemplateFromCache

          -
          public void removeTemplateFromCache(String name,
          -                                    Locale locale,
          -                                    String encoding,
          -                                    boolean parse)
          -                             throws IOException
          -
          Removes a template from the template cache, hence forcing the re-loading - of it when it's next time requested. This is to give the application - finer control over cache updating than setTemplateUpdateDelay(int) - alone does. - -

          For the meaning of the parameters, see - getTemplate(String, Locale, String, boolean). - -

          This method is thread-safe and can be called while the engine processes templates.

          -
          -
          Throws:
          -
          IOException
          -
          Since:
          -
          2.3.19
          -
          -
        • -
        - - - -
          -
        • -

          getLocalizedLookup

          -
          public boolean getLocalizedLookup()
          -
          The getter pair of setLocalizedLookup(boolean). - -

          This method is thread-safe and can be called while the engine works.

          -
        • -
        - - - -
          -
        • -

          setLocalizedLookup

          -
          public void setLocalizedLookup(boolean localizedLookup)
          -
          Enables/disables localized template lookup. Enabled by default. - -

          Localized lookup works like this: Let's say your locale setting is "en_AU", and you call - cfg.getTemplate("foo.ftl"). Then FreeMarker will look for the template - under names, stopping at the first that exists: "foo_en_AU.ftl", "foo_en.ftl", "foo.ftl". - -

          Historical note: Despite what the API documentation said earlier, this method is not thread-safe. - While setting it can't cause any serious problems, and in fact it works well on most hardware, it's not - guaranteed that FreeMarker will see the update in all threads.

          -
        • -
        - - - -
          -
        • -

          setSetting

          -
          public void setSetting(String name,
          -                       String value)
          -                throws TemplateException
          -
          Description copied from class: Configurable
          -
          Sets a FreeMarker setting by a name and string value. If you can configure FreeMarker directly with Java (or - other programming language), you should use the dedicated setter methods instead (like - Configurable.setObjectWrapper(ObjectWrapper). This meant to be used if you get the settings from somewhere - as text. Regardless, below you will find an overview of the settings available no matter how you set them. - -

          The list of settings commonly supported in all Configurable subclasses: -

          - -

          Configuration (a subclass of Configurable) also understands these:

          -
            -
          • "auto_import": - See setAutoImports(Map) -
            String value is something like: -
            /lib/form.ftl as f, /lib/widget as w, "/lib/odd name.ftl" as odd - -

          • "auto_include": Sets the list of auto-includes. - See setAutoIncludes(List) -
            String value is something like: -
            /include/common.ftl, "/include/evil name.ftl" - -

          • "default_encoding": - See setDefaultEncoding(String). -
            As the default value is the system default, which can change - from one server to another, you should always set this! - -

          • "localized_lookup": - See setLocalizedLookup(boolean). -
            String value: "true", "false" (also the equivalents: "yes", "no", - "t", "f", "y", "n"). - Case insensitive. - -

          • "strict_syntax": - See setStrictSyntaxMode(boolean). Deprecated. -
            String value: "true", "false", yes, etc. - -

          • "whitespace_stripping": - See setWhitespaceStripping(boolean). -
            String value: "true", "false", yes, etc. - -

          • "cache_storage": - See setCacheStorage(freemarker.cache.CacheStorage). -
            String value: If the value contains dot, then it's interpreted as an object builder - expression. - If the value does not contain dot, - then a MruCacheStorage will be used with the - maximum strong and soft sizes specified with the setting value. Examples - of valid setting values: - - -
            Setting valuemax. strong sizemax. soft size -
            "strong:50, soft:500"50500 -
            "strong:100, soft"100Integer.MAX_VALUE -
            "strong:100"1000 -
            "soft:100"0100 -
            "strong"Integer.MAX_VALUE0 -
            "soft"0Integer.MAX_VALUE -
            - -

            The value is not case sensitive. The order of soft and strong - entries is not significant. - -

          • "template_update_delay": - See setTemplateUpdateDelay(int). -
            String value: Valid positive integer, the update delay measured in seconds. - -

          • "tag_syntax": - See setTagSyntax(int). -
            String value: Must be one of - "auto_detect", "angle_bracket", and "square_bracket". - -

          • "incompatible_improvements": - See setIncompatibleImprovements(Version). -
            String value: version number like 2.3.20. - -

          • "incompatible_enhancements": - See: setIncompatibleEnhancements(String). - This setting name is deprecated, use "incompatible_improvements" instead. - -

          • "template_loader": - See: setTemplateLoader(TemplateLoader). -
            String value: Interpreted as an object builder expression. -

          - -

          Regarding object builder expressions (used by the setting values where it was - indicated): -

            -
          • Before FreeMarker 2.3.21 it had to be a fully qualified class name, and nothing else.

          • -
          • Since 2.3.21, the generic syntax is: - className(constrArg1, constrArg2, ... constrArgN, - propName1=propValue1, propName2=propValue2, ... - propNameN=propValueN), - where - className is the fully qualified class name of the instance to create (except if we have - builder class or INSTANCE field around, but see that later), - constrArg-s are the values of constructor arguments, - and propName=propValue-s set JavaBean properties (like x=1 means - setX(1)) on the created instance. You can have any number of constructor arguments and property - setters, including 0. Constructor arguments must precede any property setters. -

          • -
          • - Example: com.example.MyObjectWrapper(1, 2, exposeFields=true, cacheSize=5000) is nearly - equivalent with this Java code: - obj = new com.example.MyObjectWrapper(1, 2); obj.setExposeFields(true); obj.setCacheSize(5000); -
          • -
          • -

            If you have no constructor arguments and property setters, and the className class has - a public static INSTANCE field, the value of that filed will be the value of the expression, and - the constructor won't be called. -

          • -
          • -

            If there exists a class named classNameBuilder, then that class will be instantiated - instead with the given constructor arguments, and the JavaBean properties of that builder instance will be - set. After that, the public build() method of the instance will be called, whose return value - will be the value of the whole expression. (The builder class and the build() method is simply - found by name, there's no special interface to implement.) Note that if you use the backward compatible - syntax, where these's no parenthesis after the class name, then it will not look for builder class. -

          • -
          • -

            Currently, the values of arguments and properties can only be one of these: -

              -
            • A numerical literal, like 123 or -1.5. Like in FTL, there are no numerical types, - the value will be automatically converted to the type of the target.
            • -
            • A boolean literal: true or false -
            • The null literal: null -
            • A string literal with FTL syntax, except that it can't contain ${...}-s and - #{...}-s. Examples: "Line 1\nLine 2" or r"C:\temp". -
            • An object builder expression. That is, object builder expressions can be nested into each other. -
            -
          • -
          • -

            The top-level object builder expressions may omit (). In that case, for backward compatibility, - the INSTANCE field and the builder class is not searched, so the instance will be always - created with its parameterless constructor. (This behavior will possibly change in 2.4.) The () - can't be omitted for nested expressions. -

          • -
          • -

            The classes and methods that the expression meant to access must be all public. -

          • -
          -
          -
          Overrides:
          -
          setSetting in class Configurable
          -
          Parameters:
          -
          name - the name of the setting.
          -
          value - the string that describes the new value of the setting.
          -
          Throws:
          -
          Configurable.UnknownSettingException - if the name is wrong.
          -
          TemplateException - if the new value of the setting can't be set for any other reasons.
          -
          -
        • -
        - - - -
          -
        • -

          getCorrectedNameForUnknownSetting

          -
          protected String getCorrectedNameForUnknownSetting(String name)
          -
          -
          Overrides:
          -
          getCorrectedNameForUnknownSetting in class Configurable
          -
          Parameters:
          -
          name - The wrong name
          -
          Returns:
          -
          The corrected name, or null if there's no known correction
          -
          -
        • -
        - - - -
          -
        • -

          addAutoImport

          -
          public void addAutoImport(String namespaceVarName,
          -                          String templateName)
          -
          Adds an invisible #import templateName as namespaceVarName at the beginning of all - templates. The order of the imports will be the same as the order in which they were added with this method.
          -
        • -
        - - - -
          -
        • -

          removeAutoImport

          -
          public void removeAutoImport(String namespaceVarName)
          -
          Removes an auto-import; see addAutoImport(String, String). Does nothing if the auto-import doesn't - exist.
          -
        • -
        - - - -
          -
        • -

          setAutoImports

          -
          public void setAutoImports(Map map)
          -
          Removes all auto-imports, then calls addAutoImport(String, String) for each Map-entry (the entry - key is the namespaceVarName). The order of the auto-imports will be the same as Map.keySet() - returns the keys, thus, it's not the best idea to use a HashMap (although the order of imports doesn't - mater for properly designed libraries).
          -
        • -
        - - - - - - - -
          -
        • -

          addAutoInclude

          -
          public void addAutoInclude(String templateName)
          -
          Adds an invisible #include templateName as namespaceVarName at the beginning of all - templates. The order of the inclusions will be the same as the order in which they were added with this method.
          -
        • -
        - - - -
          -
        • -

          setAutoIncludes

          -
          public void setAutoIncludes(List templateNames)
          -
          Removes all auto-includes, then calls addAutoInclude(String) for each List items.
          -
        • -
        - - - -
          -
        • -

          removeAutoInclude

          -
          public void removeAutoInclude(String templateName)
          -
          Removes a template from the auto-include list; see addAutoInclude(String). Does nothing if the template - is not there.
          -
        • -
        - - - -
          -
        • -

          getVersionNumber

          -
          public static String getVersionNumber()
          -
          Deprecated. Use getVersion() instead.
          -
          Returns FreeMarker version number string.
          -
        • -
        - - - -
          -
        • -

          getVersion

          -
          public static Version getVersion()
          -
          Returns the FreeMarker version information, most importantly the major.minor.micro version numbers. - - On FreeMarker version numbering rules: -
            -
          • For final/stable releases the version number is like major.minor.micro, like 2.3.19. (Historically, - when micro was 0 the version strings was like major.minor instead of the proper major.minor.0, but that's - not like that anymore.) -
          • When only the micro version is increased, compatibility with previous versions with the same - major.minor is kept. Thus freemarker.jar can be replaced in an existing application without - breaking it.
          • -
          • For non-final/unstable versions (that almost nobody uses), the format is: -
              -
            • Starting from 2.3.20: major.minor.micro-extraInfo, like - 2.3.20-nightly_20130506T123456Z, 2.4.0-RC01. The major.minor.micro - always indicates the target we move towards, so 2.3.20-nightly or 2.3.20-M01 is - after 2.3.19 and will eventually become to 2.3.20. "PRE", "M" and "RC" (uppercase!) means - "preview", "milestone" and "release candidate" respectively, and is always followed by a 2 digit - 0-padded counter, like M03 is the 3rd milestone release of a given major.minor.micro.
            • -
            • Before 2.3.20: The extraInfo wasn't preceded by a "-". - Instead of "nightly" there was "mod", where the major.minor.micro part has indicated where - are we coming from, so 2.3.19mod (read as: 2.3.19 modified) was after 2.3.19 but before 2.3.20. - Also, "pre" and "rc" was lowercase, and was followd by a number without 0-padding.
            • -
            -
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getSupportedBuiltInNames

          -
          public Set getSupportedBuiltInNames()
          -
          Returns the names of the supported "built-ins". These are the (expr?builtin_name-like things). As of this - writing, this information doesn't depend on the configuration options, so it could be a static method, but - to be future-proof, it's an instance method.
          -
          -
          Returns:
          -
          Set of String-s.
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          getSupportedBuiltInDirectiveNames

          -
          public Set getSupportedBuiltInDirectiveNames()
          -
          Returns the names of the directives that are predefined by FreeMarker. These are the things that you call like - <#directiveName ...>.
          -
          -
          Returns:
          -
          Set of String-s.
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapper.html deleted file mode 100644 index c948234..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapper.html +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - -DefaultObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class DefaultObjectWrapper

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      ObjectWrapper, WriteProtectable
      -
      -
      -
      Direct Known Subclasses:
      -
      SimpleObjectWrapper
      -
      -
      -
      -
      public class DefaultObjectWrapper
      -extends BeansWrapper
      -
      The default implementation of the ObjectWrapper interface. Note that instances of this class generally should - be made by DefaultObjectWrapperBuilder and its overloads, not with its constructor. - -

      This class is only thread-safe after you have finished calling its setter methods, and then safely published - it (see JSR 133 and related literature). When used as part of Configuration, of course it's enough if that - was safely published and then left unmodified.

      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapperBuilder.html b/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapperBuilder.html deleted file mode 100644 index 42e2367..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/DefaultObjectWrapperBuilder.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - -DefaultObjectWrapperBuilder (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class DefaultObjectWrapperBuilder

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Cloneable
      -
      -
      -
      -
      public class DefaultObjectWrapperBuilder
      -extends BeansWrapperConfiguration
      -
      Gets/creates a DefaultObjectWrapper singleton instance that's already configured as specified in the - properties of this object; this is recommended over using the DefaultObjectWrapper constructors. The returned - instance can't be further configured (it's write protected). - -

      See BeansWrapperBuilder for more info, as that works identically.

      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          DefaultObjectWrapperBuilder

          -
          public DefaultObjectWrapperBuilder(Version incompatibleImprovements)
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/LocalizedString.html b/fmpp/docs/freemarker/api/freemarker/template/LocalizedString.html deleted file mode 100644 index 9c2fbfe..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/LocalizedString.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - -LocalizedString (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class LocalizedString

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateScalarModel
      -
      -
      -
      Direct Known Subclasses:
      -
      ResourceBundleLocalizedString
      -
      -
      -
      -
      public abstract class LocalizedString
      -extends Object
      -implements TemplateScalarModel
      -
      An abstract base class for scalars that vary by locale. - Here is a silly usage example. - - TemplateScalarModel localizedYes = new LocalizedString() { - public String getLocalizedString(java.util.Locale locale) { - String lang = locale.getLanguage(); - if "fr".equals(lang) - return "oui"; - else if "de".equals(lang) - return "sĂ­"; - else - return "yes"; - } - }; -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/ObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/ObjectWrapper.html deleted file mode 100644 index d6e0513..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/ObjectWrapper.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - -ObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface ObjectWrapper

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          BEANS_WRAPPER

          -
          static final ObjectWrapper BEANS_WRAPPER
          -
          Deprecated. Use BeansWrapperBuilder.build() instead; this instance isn't read-only - and thus can't be trusted.
          -
          An ObjectWrapper that exposes the object methods and JavaBeans properties as hash elements, and has - custom handling for Java Map-s, ResourceBundle-s, etc. It doesn't treat - Node-s and Jython objects specially, however.
          -
        • -
        - - - -
          -
        • -

          DEFAULT_WRAPPER

          -
          static final ObjectWrapper DEFAULT_WRAPPER
          -
          Deprecated. Use BeansWrapperBuilder.build() instead; this instance isn't - read-only and thus can't be trusted.
          -
          The default object wrapper implementation, focusing on backward compatibility and out-of-the box extra features. - Extends BeansWrapper with the special handling of Node-s (for XML processing) and - Jython objects. However, for backward compatibility, it also somewhat downgrades BeansWrapper by using - SimpleHash for Map-s, SimpleSequence for List-s and collections/arrays. - Furthermore it uses SimpleScalar, SimpleNumber to wrap String-s and Number-s, - although this is not considered to be harmful.
          -
        • -
        - - - -
          -
        • -

          SIMPLE_WRAPPER

          -
          static final ObjectWrapper SIMPLE_WRAPPER
          -
          Deprecated. No replacement as it was seldom if ever used by anyone; this instance isn't - read-only and thus can't be trusted.
          -
          Object wrapper that uses SimpleXXX wrappers only. - It behaves like the DEFAULT_WRAPPER, but for objects - that it does not know how to wrap as a SimpleXXX it - throws an exception. It makes no use of reflection-based - exposure of anything, which may makes it a good candidate for security-restricted applications.
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/ResourceBundleLocalizedString.html b/fmpp/docs/freemarker/api/freemarker/template/ResourceBundleLocalizedString.html deleted file mode 100644 index fbcb162..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/ResourceBundleLocalizedString.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - -ResourceBundleLocalizedString (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class ResourceBundleLocalizedString

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ResourceBundleLocalizedString

          -
          public ResourceBundleLocalizedString(String resourceBundleLookupKey,
          -                                     String resourceKey)
          -
          -
          Parameters:
          -
          resourceBundleLookupKey - The lookup key for the resource bundle
          -
          resourceKey - the specific resource (assumed to be a string) to fish out of the resource bundle
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleCollection.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleCollection.html deleted file mode 100644 index b49519f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleCollection.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - - -SimpleCollection (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleCollection

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateCollectionModel, TemplateModel, Serializable
      -
      -
      -
      -
      public class SimpleCollection
      -extends WrappingTemplateModel
      -implements TemplateCollectionModel, Serializable
      -
      A simple implementation of TemplateCollectionModel. - It's able to wrap java.util.Iterator-s and java.util.Collection-s. - If you wrap an Iterator, the variable can be <#list>-ed only once! - -

      Consider using SimpleSequence instead of this class if you want to wrap Iterators. - SimpleSequence will read all elements of the Iterator, and store them in a List - (this may cause too high resource consumption in some applications), so you can list the variable - for unlimited times. Also, if you want to wrap Collections, and then list the resulting - variable for many times, SimpleSequence may gives better performance, as the - wrapping of non-TemplateModel objects happens only once. - -

      This class is thread-safe. The returned TemplateModelIterator-s - are not thread-safe.

      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          iterator

          -
          public TemplateModelIterator iterator()
          -
          Retrieves a template model iterator that is used to iterate over the elements in this collection. - -

          When you wrap an Iterator and you get TemplateModelIterator for multiple times, - only on of the returned TemplateModelIterator instances can be really used. When you have called a - method of a TemplateModelIterator instance, all other instance will throw a - TemplateModelException when you try to call their methods, since the wrapped Iterator - can't return the first element.

          -
          -
          Specified by:
          -
          iterator in interface TemplateCollectionModel
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleDate.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleDate.html deleted file mode 100644 index 00bb78f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleDate.html +++ /dev/null @@ -1,407 +0,0 @@ - - - - - - -SimpleDate (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleDate

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateDateModel, TemplateModel
      -
      -
      -
      -
      public class SimpleDate
      -extends Object
      -implements TemplateDateModel
      -
      A simple implementation of the TemplateDateModel - interface. Note that this class is immutable. -

      This class is thread-safe.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SimpleDate

          -
          public SimpleDate(Date date)
          -
          Creates a new date model wrapping the specified date object and - having DATE type.
          -
        • -
        - - - -
          -
        • -

          SimpleDate

          -
          public SimpleDate(Time time)
          -
          Creates a new date model wrapping the specified time object and - having TIME type.
          -
        • -
        - - - -
          -
        • -

          SimpleDate

          -
          public SimpleDate(Timestamp datetime)
          -
          Creates a new date model wrapping the specified time object and - having DATETIME type.
          -
        • -
        - - - -
          -
        • -

          SimpleDate

          -
          public SimpleDate(Date date,
          -                  int type)
          -
          Creates a new date model wrapping the specified date object and - having the specified type.
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleHash.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleHash.html deleted file mode 100644 index ab56202..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleHash.html +++ /dev/null @@ -1,689 +0,0 @@ - - - - - - -SimpleHash (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleHash

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          copyMap

          -
          protected Map copyMap(Map map)
          -
        • -
        - - - -
          -
        • -

          put

          -
          public void put(String key,
          -                Object obj)
          -
          Adds a key-value entry to the map.
          -
          -
          Parameters:
          -
          key - the name by which the object is - identified in the template.
          -
          obj - the object to store.
          -
          -
        • -
        - - - -
          -
        • -

          put

          -
          public void put(String key,
          -                boolean b)
          -
          Puts a boolean in the map
          -
          -
          Parameters:
          -
          key - the name by which the resulting TemplateModel - is identified in the template.
          -
          b - the boolean to store.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          containsKey

          -
          public boolean containsKey(String key)
          -
          Tells if the map contains a key or not, regardless if the associated value is null or not.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          remove

          -
          public void remove(String key)
          -
          Removes the given key from the underlying map.
          -
          -
          Parameters:
          -
          key - the key to be removed
          -
          -
        • -
        - - - -
          -
        • -

          putAll

          -
          public void putAll(Map m)
          -
          Adds all the key/value entries in the map
          -
          -
          Parameters:
          -
          m - the map with the entries to add, the keys are assumed to be strings.
          -
          -
        • -
        - - - -
          -
        • -

          toMap

          -
          public Map toMap()
          -          throws TemplateModelException
          -
          Note that this method creates and returns a deep-copy of the underlying hash used - internally. This could be a gotcha for some people - at some point who want to alter something in the data model, - but we should maintain our immutability semantics (at least using default SimpleXXX wrappers) - for the data model. It will recursively unwrap the stuff in the underlying container.
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Convenience method for returning the String value of the - underlying map.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          -
        • -
        - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateHashModelEx
          -
          Returns:
          -
          the number of key/value mappings in the hash.
          -
          -
        • -
        - - - - - - - - - - - - - - - -
          -
        • -

          synchronizedWrapper

          -
          public SimpleHash synchronizedWrapper()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleList.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleList.html deleted file mode 100644 index 2de41c2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleList.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - -SimpleList (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleList

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SimpleList

          -
          public SimpleList()
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          SimpleList

          -
          public SimpleList(List list)
          -
          Deprecated. 
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleNumber.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleNumber.html deleted file mode 100644 index 57abeb9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleNumber.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - -SimpleNumber (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleNumber

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(Number value)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(byte val)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(short val)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(int val)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(long val)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(float val)
          -
        • -
        - - - -
          -
        • -

          SimpleNumber

          -
          public SimpleNumber(double val)
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleObjectWrapper.html deleted file mode 100644 index 89785e4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleObjectWrapper.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - -SimpleObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleObjectWrapper

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleScalar.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleScalar.html deleted file mode 100644 index bbeecf2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleScalar.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - -SimpleScalar (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleScalar

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          SimpleScalar

          -
          public SimpleScalar(String value)
          -
          Constructs a SimpleScalar containing a string value.
          -
          -
          Parameters:
          -
          value - the string value.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getAsString

          -
          public String getAsString()
          -
          Description copied from interface: TemplateScalarModel
          -
          Returns the string representation of this model. Don't return null, as that will cause exception. - (In classic-compatible mode the engine will convert null into empty string, though.)
          -
          -
          Specified by:
          -
          getAsString in interface TemplateScalarModel
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/SimpleSequence.html b/fmpp/docs/freemarker/api/freemarker/template/SimpleSequence.html deleted file mode 100644 index 2580098..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/SimpleSequence.html +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - -SimpleSequence (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class SimpleSequence

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateSequenceModel, Serializable
      -
      -
      -
      Direct Known Subclasses:
      -
      SimpleList
      -
      -
      -
      -
      public class SimpleSequence
      -extends WrappingTemplateModel
      -implements TemplateSequenceModel, Serializable
      -

      A convenient implementation of a list. This - object implements TemplateSequenceModel, using an underlying - java.util.List implementation.

      - -

      A SimpleSequence can act as a cache for a - TemplateCollectionModel, e.g. one that gets data from a - database. When passed a TemplateCollectionModel as an - argument to its constructor, the SimpleSequence immediately - copies all the elements and discards the TemplateCollectionModel.

      - -

      This class is thread-safe if you don't call the add method after you - have made the object available for multiple threads, and you have published it - safely. - -

      Note:
      - As of 2.0, this class is unsynchronized by default. - To obtain a synchronized wrapper, call the synchronizedWrapper() method.

      -
      -
      See Also:
      -
      SimpleHash, -SimpleScalar, -Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/Template.WrongEncodingException.html b/fmpp/docs/freemarker/api/freemarker/template/Template.WrongEncodingException.html deleted file mode 100644 index dd2fdc2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/Template.WrongEncodingException.html +++ /dev/null @@ -1,2656 +0,0 @@ - - - - - - -Template.WrongEncodingException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class Template.WrongEncodingException

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/Template.html b/fmpp/docs/freemarker/api/freemarker/template/Template.html deleted file mode 100644 index a076777..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/Template.html +++ /dev/null @@ -1,1111 +0,0 @@ - - - - - - -Template (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class Template

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class Template
      -extends Configurable
      -

      Stores an already parsed template, ready to be processed (rendered) for unlimited times, possibly from - multiple threads. - -

      Typically, you will use Configuration.getTemplate(String) to create/get Template objects, so - you don't construct them directly. But you can also construct a template from a Reader or a String - that contains the template source code. But then it's - important to know that while the resulting Template is efficient for later processing, creating a new - Template itself is relatively expensive. So try to re-use Template objects if possible. - Configuration.getTemplate(String) does that (caching Template-s) for you, but the constructor of - course doesn't, so it's up to you to solve then. - -

      Objects of this class meant to be handled as immutable and thus thread-safe. However, it has some setter methods - for changing FreeMarker settings. Those must not be used while the template is being processed, or if the - template object is already accessible from multiple threads.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          Template

          -
          public Template(String name,
          -                Reader reader,
          -                Configuration cfg)
          -         throws IOException
          -
          Constructs a template from a character stream. Note that this is a relatively expensive operation; where - higher performance matters, you should re-use (cache) Template instances instead of re-creating them from - the same source again and again.
          -
          -
          Parameters:
          -
          name - the path of the template file relatively to the (virtual) directory that you use to store - the templates. Shouldn't start with '/'. Should use '/', not '\'. - Check getName() to see how the name will be used. The name should be independent of the - actual storage mechanism and physical location as far as possible. Even when the templates are stored - straightforwardly in real files (they often aren't; see TemplateLoader), the name shouldn't be an - absolute file path. Like if the template is stored in "/www/templates/forum/main.ftl", and you - are using "/www/templates/" as the template root directory via - Configuration.setDirectoryForTemplateLoading(java.io.File), then the template name will be - "forum/main.ftl".
          -
          reader - the character stream to read from. It will always be closed (Reader.close()).
          -
          cfg - the Configuration object that this Template is associated with. - If this is null, the "default" Configuration object is used, - which is highly discouraged, because it can easily lead to - erroneous, unpredictable behavior. - (See more here...)
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - - - - - -
          -
        • -

          Template

          -
          public Template(String name,
          -                Reader reader,
          -                Configuration cfg,
          -                String encoding)
          -         throws IOException
          -
          Deprecated. Use Template(String, Reader, Configuration) instead.
          -
          Same as Template(String, Reader, Configuration), but also specifies the template's encoding.
          -
          -
          Parameters:
          -
          encoding - This is the encoding that we are supposed to be using. But it's not really necessary because we - have a Reader which is already decoded, but it's kept as meta-info. It also has an impact when - #include-ing/#import-ing another template from this template, as its default encoding will - be this. But this behavior of said directives is considered to be harmful, and will be probably phased - out. Until that, it's better to leave this on null, so that the encoding will come from the - Configuration. Note that if this is non-null and there's an #ftl header with - encoding, they must match, or else a Template.WrongEncodingException is thrown.
          -
          Throws:
          -
          IOException
          -
          -
        • -
        - - - - -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getPlainTextTemplate

          -
          public static Template getPlainTextTemplate(String name,
          -                                            String content,
          -                                            Configuration config)
          -
          Returns a trivial template, one that is just a single block of - plain text, no dynamic content. (Used by the cache module to create - unparsed templates.)
          -
          -
          Parameters:
          -
          name - the path of the template file relative to the directory what you use to store - the templates. See getName() for more details.
          -
          content - the block of text that this template represents
          -
          config - the configuration to which this template belongs
          -
          -
        • -
        - - - -
          -
        • -

          process

          -
          public void process(Object dataModel,
          -                    Writer out)
          -             throws TemplateException,
          -                    IOException
          -
          Executes template, using the data-model provided, writing the generated output - to the supplied Writer. - -

          For finer control over the runtime environment setup, such as per-HTTP-request configuring of FreeMarker - settings, you may need to use createProcessingEnvironment(Object, Writer) instead.

          -
          -
          Parameters:
          -
          dataModel - the holder of the variables visible from the template (name-value pairs); usually a - Map<String, Object> or a JavaBean (where the JavaBean properties will be the variables). - Can be any object that the ObjectWrapper in use turns into a TemplateHashModel. - You can also use an object that already implements TemplateHashModel; in that case it won't be - wrapped. If it's null, an empty data model is used.
          -
          out - The Writer where the output of the template will go. Note that unless you have used - Configurable.setAutoFlush(boolean) to disable this, Writer.flush() will be called at the - when the template processing was finished. Writer.close() is not called.
          -
          Throws:
          -
          TemplateException - if an exception occurs during template processing
          -
          IOException - if an I/O exception occurs during writing to the writer.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          createProcessingEnvironment

          -
          public Environment createProcessingEnvironment(Object dataModel,
          -                                               Writer out,
          -                                               ObjectWrapper wrapper)
          -                                        throws TemplateException,
          -                                               IOException
          -
          Creates a Environment object, using this template, the data-model provided as - parameter. You have to call Environment.process() on the return value to set off the actual rendering. - -

          Use this method if you want to do some special initialization on the Environment before template - processing, or if you want to read the Environment after template processing. Otherwise using - process(Object, Writer) is simpler. - -

          Example: - -

          - Environment env = myTemplate.createProcessingEnvironment(root, out, null);
          - env.process();
          - -

          The above is equivalent with this: - -

          - myTemplate.process(root, out);
          - -

          But with createProcessingEnvironment, you can manipulate the environment - before and after the processing: - -

          - Environment env = myTemplate.createProcessingEnvironment(root, out);
          - 
          - env.setLocale(myUsersPreferredLocale);
          - env.setTimeZone(myUsersPreferredTimezone);
          - 
          - env.process();  // output is rendered here
          - 
          - TemplateModel x = env.getVariable("x");  // read back a variable set by the template
          -
          -
          Parameters:
          -
          dataModel - the holder of the variables visible from all templates; see process(Object, Writer) for - more details.
          -
          wrapper - The ObjectWrapper to use to wrap objects into TemplateModel - instances. Normally you left it null, in which case Configurable.getObjectWrapper() will be - used.
          -
          out - The Writer where the output of the template will go; see process(Object, Writer) for - more details.
          -
          Returns:
          -
          the Environment object created for processing. Call Environment.process() to process the - template.
          -
          Throws:
          -
          TemplateException - if an exception occurs while setting up the Environment object.
          -
          IOException - if an exception occurs doing any auto-imports
          -
          -
        • -
        - - - - - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Returns a string representing the raw template - text in canonical form.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          -
        • -
        - - - -
          -
        • -

          getName

          -
          public String getName()
          -
          The usually path-like (or URL-like) identifier of the template, or possibly null for non-stored - templates. It usually looks like a relative UN*X path; it should use /, not \, and shouldn't - start with / (but there are no hard guarantees). It's not a real path in a file-system, it's just - a name that a TemplateLoader used to load the backing resource. Or, it can also be a name that was never - used to load the template (directly created with Template(String, Reader, Configuration)). - Even if the templates are stored straightforwardly in files, this is relative to the base directory of the - TemplateLoader. So it really could be anything, except that it has importance in these situations: - -
            -
          • Relative paths to other templates in this template will be resolved relatively to the directory part of - this. Like if the template name is "foo/this.ftl", then <#include "other.ftl"> gets - the template with name "foo/other.ftl". -

          • It's shown in error messages. So it should be something based on which the user can find the template. -

          • Some tools, like an IDE plugin, uses this to identify (and find) templates. -

          - -

          Some frameworks use URL-like template names like "someSchema://foo/bar.ftl". FreeMarker understands - this notation, so an absolute path like "/baaz.ftl" in that template will be resolved too - "someSchema://baaz.ftl".

          -
        • -
        - - - -
          -
        • -

          getConfiguration

          -
          public Configuration getConfiguration()
          -
          Returns the Configuration object associated with this template.
          -
        • -
        - - - -
          -
        • -

          setEncoding

          -
          public void setEncoding(String encoding)
          -
          Sets the character encoding to use for - included files. Usually you don't set this value manually, - instead it's assigned to the template upon loading.
          -
        • -
        - - - -
          -
        • -

          getEncoding

          -
          public String getEncoding()
          -
          Returns the character encoding used for reading included files.
          -
        • -
        - - - - - - - -
          -
        • -

          dump

          -
          public void dump(PrintStream ps)
          -
          Dump the raw template in canonical form.
          -
        • -
        - - - - - - - -
          -
        • -

          addMacro

          -
          public void addMacro(freemarker.core.Macro macro)
          -
          Called by code internally to maintain - a table of macros
          -
        • -
        - - - -
          -
        • -

          addImport

          -
          public void addImport(freemarker.core.LibraryLoad ll)
          -
          Called by code internally to maintain - a list of imports
          -
        • -
        - - - -
          -
        • -

          getSource

          -
          public String getSource(int beginColumn,
          -                        int beginLine,
          -                        int endColumn,
          -                        int endLine)
          -
          Returns the template source at the location specified by the coordinates given, or null if unavailable.
          -
          -
          Parameters:
          -
          beginColumn - the first column of the requested source, 1-based
          -
          beginLine - the first line of the requested source, 1-based
          -
          endColumn - the last column of the requested source, 1-based
          -
          endLine - the last line of the requested source, 1-based
          -
          See Also:
          -
          TemplateObject.getSource()
          -
          -
        • -
        - - - -
          -
        • -

          getRootTreeNode

          -
          public freemarker.core.TemplateElement getRootTreeNode()
          -
          -
          Returns:
          -
          the root TemplateElement object.
          -
          -
        • -
        - - - -
          -
        • -

          getMacros

          -
          public Map getMacros()
          -
        • -
        - - - -
          -
        • -

          getImports

          -
          public List getImports()
          -
        • -
        - - - -
          -
        • -

          addPrefixNSMapping

          -
          public void addPrefixNSMapping(String prefix,
          -                               String nsURI)
          -
          This is used internally.
          -
        • -
        - - - -
          -
        • -

          getDefaultNS

          -
          public String getDefaultNS()
          -
        • -
        - - - -
          -
        • -

          getNamespaceForPrefix

          -
          public String getNamespaceForPrefix(String prefix)
          -
          -
          Returns:
          -
          the NamespaceUri mapped to this prefix in this template. (Or null if there is none.)
          -
          -
        • -
        - - - -
          -
        • -

          getPrefixForNamespace

          -
          public String getPrefixForNamespace(String nsURI)
          -
          -
          Returns:
          -
          the prefix mapped to this nsURI in this template. (Or null if there is none.)
          -
          -
        • -
        - - - -
          -
        • -

          getPrefixedName

          -
          public String getPrefixedName(String localName,
          -                              String nsURI)
          -
          -
          Returns:
          -
          the prefixed name, based on the ns_prefixes defined - in this template's header for the local name and node namespace - passed in as parameters.
          -
          -
        • -
        - - - -
          -
        • -

          containingElements

          -
          public TreePath containingElements(int column,
          -                                   int line)
          -
          Deprecated. This method will return TemplateElement starting from 2.4, as that doesn't require Swing; - don't use it.
          -
          -
          Parameters:
          -
          column - the column
          -
          line - the line
          -
          Returns:
          -
          an array of the elements containing the given column and line numbers.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateBooleanModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateBooleanModel.html deleted file mode 100644 index 3cee4a6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateBooleanModel.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - -TemplateBooleanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateBooleanModel

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateCollectionModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateCollectionModel.html deleted file mode 100644 index 5bdf93b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateCollectionModel.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - -TemplateCollectionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateCollectionModel

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateDateModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateDateModel.html deleted file mode 100644 index 6b3454d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateDateModel.html +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - -TemplateDateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateDateModel

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      TemplateModel
      -
      -
      -
      All Known Implementing Classes:
      -
      DateModel, SimpleDate
      -
      -
      -
      -
      public interface TemplateDateModel
      -extends TemplateModel
      -
      "date", "time" and "date-time" template language data types: corresponds to Date. Contrary to Java, - FreeMarker distinguishes date (no time part), time and date-time values.
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Fields 
        Modifier and TypeField and Description
        static intDATE -
        The date model represents a date value (no time part).
        -
        static intDATETIME -
        The date model represents a date-time value (also known as timestamp).
        -
        static intTIME -
        The date model represents a time value (no date part).
        -
        static ListTYPE_NAMES 
        static intUNKNOWN -
        It is not known whether the date represents a date, a time, or a date-time value.
        -
        - -
      • -
      - - -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          UNKNOWN

          -
          static final int UNKNOWN
          -
          It is not known whether the date represents a date, a time, or a date-time value. - This often leads to exceptions in templates due to ambiguities it causes, so avoid it if possible.
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          TIME

          -
          static final int TIME
          -
          The date model represents a time value (no date part).
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          DATE

          -
          static final int DATE
          -
          The date model represents a date value (no time part).
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          DATETIME

          -
          static final int DATETIME
          -
          The date model represents a date-time value (also known as timestamp).
          -
          -
          See Also:
          -
          Constant Field Values
          -
          -
        • -
        - - - -
          -
        • -

          TYPE_NAMES

          -
          static final List TYPE_NAMES
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveBody.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveBody.html deleted file mode 100644 index 015f3ad..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveBody.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - -TemplateDirectiveBody (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateDirectiveBody

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          render

          -
          void render(Writer out)
          -     throws TemplateException,
          -            IOException
          -
          Renders the body of the directive body to the specified writer. The - writer is not flushed after the rendering. If you pass the environment's - writer, there is no need to flush it. If you supply your own writer, you - are responsible to flush/close it when you're done with using it (which - might be after multiple renderings).
          -
          -
          Parameters:
          -
          out - the writer to write the output to.
          -
          Throws:
          -
          TemplateException
          -
          IOException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveModel.html deleted file mode 100644 index d10e8a3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateDirectiveModel.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - -TemplateDirectiveModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateDirectiveModel

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      TemplateModel
      -
      -
      -
      All Known Implementing Classes:
      -
      IncludePage
      -
      -
      -
      -
      public interface TemplateDirectiveModel
      -extends TemplateModel
      -
      "directive" template language data type: used as user-defined directives - (much like macros) in templates. They can do arbitrary actions, write arbitrary - text to the template output, and trigger rendering of their nested content for - any number of times. - -

      They are used in templates like <@myDirective foo=1 bar="wombat">...</@myDirective> (or as - <@myDirective foo=1 bar="wombat" /> - the nested content is optional).

      -
      -
      Since:
      -
      2.3.11
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          execute

          -
          void execute(Environment env,
          -             Map params,
          -             TemplateModel[] loopVars,
          -             TemplateDirectiveBody body)
          -      throws TemplateException,
          -             IOException
          -
          Executes this user-defined directive; called by FreeMarker when the user-defined - directive is called in the template.
          -
          -
          Parameters:
          -
          env - the current processing environment. Note that you can access - the output Writer by Environment.getOut().
          -
          params - the parameters (if any) passed to the directive as a - map of key/value pairs where the keys are String-s and the - values are TemplateModel instances. This is never - null. If you need to convert the template models to POJOs, - you can use the utility methods in the DeepUnwrap class.
          -
          loopVars - an array that corresponds to the "loop variables", in - the order as they appear in the directive call. ("Loop variables" are out-parameters - that are available to the nested body of the directive; see in the Manual.) - You set the loop variables by writing this array. The length of the array gives the - number of loop-variables that the caller has specified. - Never null, but can be a zero-length array.
          -
          body - an object that can be used to render the nested content (body) of - the directive call. If the directive call has no nested content (i.e., it's like - <@myDirective /> or <@myDirective></@myDirective>), then this will be - null.
          -
          Throws:
          -
          TemplateException - If any problem occurs that's not an IOException during writing the template - output.
          -
          IOException - When writing the template output fails.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateException.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateException.html deleted file mode 100644 index 82e2601..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateException.html +++ /dev/null @@ -1,803 +0,0 @@ - - - - - - -TemplateException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class TemplateException

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          TemplateException

          -
          public TemplateException(Environment env)
          -
          Constructs a TemplateException with no specified detail message - or underlying cause.
          -
        • -
        - - - -
          -
        • -

          TemplateException

          -
          public TemplateException(String description,
          -                         Environment env)
          -
          Constructs a TemplateException with the given detail message, - but no underlying cause exception.
          -
          -
          Parameters:
          -
          description - the description of the error that occurred
          -
          -
        • -
        - - - - - - - -
          -
        • -

          TemplateException

          -
          public TemplateException(Throwable cause,
          -                         Environment env)
          -
          Constructs a TemplateException with the given underlying Exception, - but no detail message.
          -
          -
          Parameters:
          -
          cause - the underlying Exception that caused this - exception to be raised
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - -
          -
        • -

          TemplateException

          -
          public TemplateException(String description,
          -                         Throwable cause,
          -                         Environment env)
          -
          Constructs a TemplateException with both a description of the error - that occurred and the underlying Exception that caused this exception - to be raised.
          -
          -
          Parameters:
          -
          description - the description of the error that occurred
          -
          cause - the underlying Exception that caused this exception to be raised
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          TemplateException

          -
          protected TemplateException(Throwable cause,
          -                            Environment env,
          -                            freemarker.core.Expression blamedExpr,
          -                            freemarker.core._ErrorDescriptionBuilder descriptionBuilder)
          -
          Don't use this; this is to be used internally by FreeMarker. No backward compatibility guarantees.
          -
          -
          Parameters:
          -
          blamedExpr - Maybe null. The FTL stack in the Environment only specifies the error location - with "template element" granularity, and this can be used to point to the expression inside the - template element.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getCauseException

          -
          public Exception getCauseException()
          -
          Deprecated. Java 1.4 has introduced Throwable.getCause() - use that instead, especially as this can't return - runtime exceptions and errors as is.
          -
        • -
        - - - -
          -
        • -

          getFTLInstructionStack

          -
          public String getFTLInstructionStack()
          -
          Returns the snapshot of the FTL stack trace at the time this exception was created.
          -
        • -
        - - - -
          -
        • -

          getEnvironment

          -
          public Environment getEnvironment()
          -
          -
          Returns:
          -
          the execution environment in which the exception occurred. - null if the exception was deserialized.
          -
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          printStackTrace

          -
          public void printStackTrace(PrintWriter out,
          -                            boolean heading,
          -                            boolean ftlStackTrace,
          -                            boolean javaStackTrace)
          -
          -
          Parameters:
          -
          heading - should the heading at the top be printed
          -
          ftlStackTrace - should the FTL stack trace be printed
          -
          javaStackTrace - should the Java stack trace be printed
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          printStackTrace

          -
          public void printStackTrace(PrintStream out,
          -                            boolean heading,
          -                            boolean ftlStackTrace,
          -                            boolean javaStackTrace)
          -
          -
          Parameters:
          -
          heading - should the heading at the top be printed
          -
          ftlStackTrace - should the FTL stack trace be printed
          -
          javaStackTrace - should the Java stack trace be printed
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          printStandardStackTrace

          -
          public void printStandardStackTrace(PrintStream ps)
          -
          Prints the stack trace as if wasn't overridden by TemplateException.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          printStandardStackTrace

          -
          public void printStandardStackTrace(PrintWriter pw)
          -
          Prints the stack trace as if wasn't overridden by TemplateException.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getMessageWithoutStackTop

          -
          public String getMessageWithoutStackTop()
          -
          Similar to getMessage(), but it doesn't contain the position of the failing instruction at then end - of the text. It might contains the position of the failing expression though as part of the expression - quotation, as that's the part of the description.
          -
        • -
        - - - -
          -
        • -

          getLineNumber

          -
          public Integer getLineNumber()
          -
          1-based line number of the failing section, or null if the information is not available.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getTemplateName

          -
          public String getTemplateName()
          -
          Returns the name of the template where the error has occurred, or null if the information isn't - available. This will be the full template name, regardless of how the template was invoked.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getColumnNumber

          -
          public Integer getColumnNumber()
          -
          1-based column number of the failing section, or null if the information is not available.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getEndLineNumber

          -
          public Integer getEndLineNumber()
          -
          1-based line number of the last line that contains the failing section, or null if the information is not - available.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getEndColumnNumber

          -
          public Integer getEndColumnNumber()
          -
          1-based column number of the last character of the failing template section, or null if the information - is not available. Note that unlike with Java string API-s, this column number is inclusive.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - -
          -
        • -

          getBlamedExpressionString

          -
          public String getBlamedExpressionString()
          -
          If there was a blamed expression attached to this exception, it returns its canonical form, otherwise it returns - null. This expression should always be inside the failing FTL instruction. - -

          The typical application of this is getting the undefined expression from InvalidReferenceException-s.

          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateExceptionHandler.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateExceptionHandler.html deleted file mode 100644 index dcc20f1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateExceptionHandler.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - -TemplateExceptionHandler (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateExceptionHandler

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          handleTemplateException

          -
          void handleTemplateException(TemplateException te,
          -                             Environment env,
          -                             Writer out)
          -                      throws TemplateException
          -
          Method called after a TemplateException was raised inside a template. The error is logged before this is - called, so there's no need to log it here. The exception should be re-thrown unless you want to - suppress the exception. - -

          Note that you can check with Environment.isInAttemptBlock() if you are inside a #attempt - block, which then will handle handle this exception and roll back the output generated inside it. - -

          Note that StopException-s (raised by #stop) won't be captured.

          -
          -
          Parameters:
          -
          te - The exception that occurred; don't forget to re-throw it unless you want to suppress it
          -
          env - The runtime environment of the template
          -
          out - This is where the output of the template is written
          -
          Throws:
          -
          TemplateException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModel.html deleted file mode 100644 index d7b9936..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModel.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - -TemplateHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateHashModel

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModelEx.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModelEx.html deleted file mode 100644 index 3e71b95..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateHashModelEx.html +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - -TemplateHashModelEx (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateHashModelEx

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModel.html deleted file mode 100644 index ccc3b4d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModel.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - -TemplateMethodModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateMethodModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          exec

          -
          Object exec(List arguments)
          -     throws TemplateModelException
          -
          Deprecated. 
          -
          Executes the method call. All arguments passed to the method call are - coerced to strings before being passed, if the FreeMarker rules allow - the coercion. If some of the passed arguments can not be coerced to a - string, an exception will be raised in the engine and the method will - not be called. If your method would like to act on actual data model - objects instead of on their string representations, implement the - TemplateMethodModelEx instead.
          -
          -
          Parameters:
          -
          arguments - a List of String objects - containing the values of the arguments passed to the method.
          -
          Returns:
          -
          the return value of the method, or null. If the returned value - does not implement TemplateModel, it will be automatically - wrapped using the environment - object wrapper.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModelEx.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModelEx.html deleted file mode 100644 index 17dd46b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateMethodModelEx.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - -TemplateMethodModelEx (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateMethodModelEx

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          exec

          -
          Object exec(List arguments)
          -     throws TemplateModelException
          -
          Executes the method call.
          -
          -
          Specified by:
          -
          exec in interface TemplateMethodModel
          -
          Parameters:
          -
          arguments - a List of TemplateModel-s, - containing the arguments passed to the method. If the implementation absolutely wants - to operate on POJOs, it can use the static utility methods in the DeepUnwrap - class to easily obtain them. However, unwrapping is not always possible (or not perfectly), and isn't always - efficient, so it's recommended to use the original TemplateModel value as much as possible.
          -
          Returns:
          -
          the return value of the method, or null. If the returned value - does not implement TemplateModel, it will be automatically - wrapped using the environment's - object wrapper.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateModel.html deleted file mode 100644 index 33535a9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateModel.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - -TemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateModel

    -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        - - - - - - - - - - -
        Fields 
        Modifier and TypeField and Description
        static TemplateModelNOTHING -
        A general-purpose object to represent nothing.
        -
        -
      • -
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          NOTHING

          -
          static final TemplateModel NOTHING
          -
          A general-purpose object to represent nothing. It acts as - an empty string, false, empty sequence, empty hash, and - null-returning method model.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelAdapter.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateModelAdapter.html deleted file mode 100644 index ec59bd2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelAdapter.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - -TemplateModelAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateModelAdapter

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      HashAdapter
      -
      -
      -
      -
      public interface TemplateModelAdapter
      -
      Implemented by classes that serve as adapters for template model objects in - some other object model. Actually a functional inverse of - AdapterTemplateModel. You will rarely implement this interface - directly. It is usually implemented by unwrapping adapter classes of various - object wrapper implementations.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getTemplateModel

          -
          TemplateModel getTemplateModel()
          -
          -
          Returns:
          -
          the template model this object is wrapping.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelException.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateModelException.html deleted file mode 100644 index 96eb81a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelException.html +++ /dev/null @@ -1,452 +0,0 @@ - - - - - - -TemplateModelException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class TemplateModelException

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          TemplateModelException

          -
          public TemplateModelException()
          -
          Constructs a TemplateModelException with no - specified detail message.
          -
        • -
        - - - -
          -
        • -

          TemplateModelException

          -
          public TemplateModelException(String description)
          -
          Constructs a TemplateModelException with the - specified detail message.
          -
          -
          Parameters:
          -
          description - the detail message.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          TemplateModelException

          -
          public TemplateModelException(Throwable cause)
          -
          Constructs a TemplateModelException with the given underlying - Exception, but no detail message.
          -
          -
          Parameters:
          -
          cause - the underlying Exception that caused this - exception to be raised
          -
          -
        • -
        - - - - - - - -
          -
        • -

          TemplateModelException

          -
          public TemplateModelException(String description,
          -                              Throwable cause)
          -
          Constructs a TemplateModelException with both a description of the error - that occurred and the underlying Exception that caused this exception - to be raised.
          -
          -
          Parameters:
          -
          description - the description of the error that occurred
          -
          cause - the underlying Exception that caused this - exception to be raised
          -
          -
        • -
        - - - -
          -
        • -

          TemplateModelException

          -
          protected TemplateModelException(Throwable cause,
          -                                 Environment env,
          -                                 String description,
          -                                 boolean preventAmbiguity)
          -
          Don't use this; this is to be used internally by FreeMarker.
          -
          -
          Parameters:
          -
          preventAmbiguity - its value is ignored; it's only to prevent constructor selection ambiguities for - backward-compatibility
          -
          -
        • -
        - - - -
          -
        • -

          TemplateModelException

          -
          protected TemplateModelException(Throwable cause,
          -                                 Environment env,
          -                                 freemarker.core._ErrorDescriptionBuilder descriptionBuilder,
          -                                 boolean preventAmbiguity)
          -
          Don't use this; this is to be used internally by FreeMarker.
          -
          -
          Parameters:
          -
          preventAmbiguity - its value is ignored; it's only to prevent constructor selection ambiguities for - backward-compatibility
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelIterator.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateModelIterator.html deleted file mode 100644 index f9c57c7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelIterator.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - -TemplateModelIterator (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateModelIterator

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelListSequence.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateModelListSequence.html deleted file mode 100644 index 3ee8575..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateModelListSequence.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - -TemplateModelListSequence (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class TemplateModelListSequence

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          TemplateModelListSequence

          -
          public TemplateModelListSequence(List list)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          public TemplateModel get(int index)
          -
          Description copied from interface: TemplateSequenceModel
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Specified by:
          -
          get in interface TemplateSequenceModel
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          -
        • -
        - - - -
          -
        • -

          size

          -
          public int size()
          -
          -
          Specified by:
          -
          size in interface TemplateSequenceModel
          -
          Returns:
          -
          the number of items in the list.
          -
          -
        • -
        - - - -
          -
        • -

          getWrappedObject

          -
          public Object getWrappedObject()
          -
          Returns the original List of TemplateModel-s, so it's not a fully unwrapped value.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateNodeModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateNodeModel.html deleted file mode 100644 index dec12b6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateNodeModel.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - -TemplateNodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateNodeModel

    -
    -
    -
    -
      -
    • -
      -
      All Superinterfaces:
      -
      TemplateModel
      -
      -
      -
      All Known Implementing Classes:
      -
      NodeListModel, NodeModel
      -
      -
      -
      -
      public interface TemplateNodeModel
      -extends TemplateModel
      -
      "node" template language data type: an object that is a node in a tree. - A tree of nodes can be recursively visited using the <#visit...> and <#recurse...> - directives. This API is largely based on the W3C Document Object Model - (DOM) API. However, it's meant to be generally useful for describing - any tree of objects that you wish to navigate using a recursive visitor - design pattern (or simply through being able to get the parent - and child nodes). - -

      See the XML - Processing Guide for a concrete application.

      -
      -
      Since:
      -
      FreeMarker 2.3
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          getNodeName

          -
          String getNodeName()
          -            throws TemplateModelException
          -
          -
          Returns:
          -
          a String that is used to determine the processing - routine to use. In the XML implementation, if the node - is an element, it returns the element's tag name. If it - is an attribute, it returns the attribute's name. It - returns "@text" for text nodes, "@pi" for processing instructions, - and so on.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getNodeType

          -
          String getNodeType()
          -            throws TemplateModelException
          -
          -
          Returns:
          -
          a String describing the type of node this is. - In the W3C DOM, this should be "element", "text", "attribute", etc. - A TemplateNodeModel implementation that models other kinds of - trees could return whatever it appropriate for that application. It - can be null, if you don't want to use node-types.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - -
          -
        • -

          getNodeNamespace

          -
          String getNodeNamespace()
          -                 throws TemplateModelException
          -
          -
          Returns:
          -
          the XML namespace URI with which this node is - associated. If this TemplateNodeModel implementation is - not XML-related, it will almost certainly be null. Even - for XML nodes, this will often be null.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateNumberModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateNumberModel.html deleted file mode 100644 index 7320fbb..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateNumberModel.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - -TemplateNumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateNumberModel

    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateScalarModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateScalarModel.html deleted file mode 100644 index 97ed3a9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateScalarModel.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - -TemplateScalarModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateScalarModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          EMPTY_STRING

          -
          static final TemplateModel EMPTY_STRING
          -
          A constant value to use as the empty string.
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getAsString

          -
          String getAsString()
          -            throws TemplateModelException
          -
          Returns the string representation of this model. Don't return null, as that will cause exception. - (In classic-compatible mode the engine will convert null into empty string, though.)
          -
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateSequenceModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateSequenceModel.html deleted file mode 100644 index b798651..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateSequenceModel.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - -TemplateSequenceModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateSequenceModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          TemplateModel get(int index)
          -           throws TemplateModelException
          -
          Retrieves the i-th template model in this sequence.
          -
          -
          Returns:
          -
          the item at the specified index, or null if - the index is out of bounds. Note that a null value is - interpreted by FreeMarker as "variable does not exist", and accessing - a missing variables is usually considered as an error in the FreeMarker - Template Language, so the usage of a bad index will not remain hidden.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        - - - - -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TemplateTransformModel.html b/fmpp/docs/freemarker/api/freemarker/template/TemplateTransformModel.html deleted file mode 100644 index 7c2bcf1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TemplateTransformModel.html +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - -TemplateTransformModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TemplateTransformModel

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          Writer getWriter(Writer out,
          -                 Map args)
          -          throws TemplateModelException,
          -                 IOException
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          Throws:
          -
          TemplateModelException
          -
          IOException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/TransformControl.html b/fmpp/docs/freemarker/api/freemarker/template/TransformControl.html deleted file mode 100644 index 86eb7a3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/TransformControl.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - -TransformControl (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Interface TransformControl

    -
    -
    -
    -
      -
    • -
      -
      -
      public interface TransformControl
      -
      An interface that can be implemented by writers returned from - TemplateTransformModel.getWriter(java.io.Writer, java.util.Map). The - methods on this - interfaces are callbacks that will be called by the template engine and that - give the writer a chance to better control the evaluation of the transform - body. The writer can instruct the engine to skip or to repeat body - evaluation, and gets notified about exceptions that are thrown during the - body evaluation.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/Version.html b/fmpp/docs/freemarker/api/freemarker/template/Version.html deleted file mode 100644 index 831d1da..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/Version.html +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - -Version (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class Version

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public final class Version
      -extends Object
      -implements Serializable
      -
      Represents a version number plus the further qualifiers and build into. This is - mostly used for representing a FreeMarker version number, but must also be able - to parse the version strings of 3rd party libraries.
      -
      -
      Since:
      -
      2.3.20
      -
      See Also:
      -
      Configuration.getVersion(), -Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - - - - - - - - - -
          -
        • -

          Version

          -
          public Version(int major,
          -               int minor,
          -               int micro)
          -
        • -
        - - - -
          -
        • -

          Version

          -
          public Version(int major,
          -               int minor,
          -               int micro,
          -               String extraInfo,
          -               Boolean gaeCompatible,
          -               Date buildDate)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          intValueFor

          -
          public static int intValueFor(int major,
          -                              int minor,
          -                              int micro)
          -
        • -
        - - - -
          -
        • -

          toString

          -
          public String toString()
          -
          Contains the major.minor.micor numbers and the extraInfo part, not the other information.
          -
          -
          Overrides:
          -
          toString in class Object
          -
          -
        • -
        - - - -
          -
        • -

          getMajor

          -
          public int getMajor()
          -
          The 1st version number, like 1 in "1.2.3".
          -
        • -
        - - - -
          -
        • -

          getMinor

          -
          public int getMinor()
          -
          The 2nd version number, like 2 in "1.2.3".
          -
        • -
        - - - -
          -
        • -

          getMicro

          -
          public int getMicro()
          -
          The 3rd version number, like 3 in "1.2.3".
          -
        • -
        - - - -
          -
        • -

          getExtraInfo

          -
          public String getExtraInfo()
          -
          The arbitrary string after the micro version number without leading dot, dash or underscore, - like "RC03" in "2.4.0-RC03". - This is usually a qualifier (RC, SNAPHOST, nightly, beta, etc) and sometimes build info (like - date).
          -
        • -
        - - - -
          -
        • -

          isGAECompliant

          -
          public Boolean isGAECompliant()
          -
          -
          Returns:
          -
          The Google App Engine compliance, or null.
          -
          -
        • -
        - - - -
          -
        • -

          getBuildDate

          -
          public Date getBuildDate()
          -
          -
          Returns:
          -
          The build date if known, or null.
          -
          -
        • -
        - - - -
          -
        • -

          intValue

          -
          public int intValue()
          -
          -
          Returns:
          -
          major * 1000000 + minor * 1000 + micro.
          -
          -
        • -
        - - - -
          -
        • -

          hashCode

          -
          public int hashCode()
          -
          -
          Overrides:
          -
          hashCode in class Object
          -
          -
        • -
        - - - -
          -
        • -

          equals

          -
          public boolean equals(Object obj)
          -
          -
          Overrides:
          -
          equals in class Object
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/WrappingTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/WrappingTemplateModel.html deleted file mode 100644 index 8f09578..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/WrappingTemplateModel.html +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - -WrappingTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template
    -

    Class WrappingTemplateModel

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          WrappingTemplateModel

          -
          protected WrappingTemplateModel()
          -
          Deprecated. Use WrappingTemplateModel(ObjectWrapper) instead; this method uses the deprecated.
          -
          Protected constructor that creates a new wrapping template model using - the default object wrapper.
          -
        • -
        - - - -
          -
        • -

          WrappingTemplateModel

          -
          protected WrappingTemplateModel(ObjectWrapper objectWrapper)
          -
          Protected constructor that creates a new wrapping template model using the specified object wrapper.
          -
          -
          Parameters:
          -
          objectWrapper - the wrapper to use. Passing null to it - is allowed but deprecated. If null is passed, the deprecated default object wrapper - is used.
          -
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/AdapterTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/AdapterTemplateModel.html deleted file mode 100644 index a7d5d21..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/AdapterTemplateModel.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.AdapterTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.AdapterTemplateModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/Configuration.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/Configuration.html deleted file mode 100644 index a804134..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/Configuration.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - -Uses of Class freemarker.template.Configuration (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.Configuration

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapper.html deleted file mode 100644 index 5ef83d7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapper.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - -Uses of Class freemarker.template.DefaultObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.DefaultObjectWrapper

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapperBuilder.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapperBuilder.html deleted file mode 100644 index ae00f03..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/DefaultObjectWrapperBuilder.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.DefaultObjectWrapperBuilder (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.DefaultObjectWrapperBuilder

    -
    -
    No usage of freemarker.template.DefaultObjectWrapperBuilder
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/LocalizedString.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/LocalizedString.html deleted file mode 100644 index 54e5609..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/LocalizedString.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - -Uses of Class freemarker.template.LocalizedString (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.LocalizedString

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/ObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/ObjectWrapper.html deleted file mode 100644 index 46d8155..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/ObjectWrapper.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.ObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.ObjectWrapper

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/ResourceBundleLocalizedString.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/ResourceBundleLocalizedString.html deleted file mode 100644 index 29b0a3d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/ResourceBundleLocalizedString.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.ResourceBundleLocalizedString (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.ResourceBundleLocalizedString

    -
    -
    No usage of freemarker.template.ResourceBundleLocalizedString
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleCollection.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleCollection.html deleted file mode 100644 index f3da43e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleCollection.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleCollection (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleCollection

    -
    -
    No usage of freemarker.template.SimpleCollection
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleDate.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleDate.html deleted file mode 100644 index fa92a78..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleDate.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleDate (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleDate

    -
    -
    No usage of freemarker.template.SimpleDate
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleHash.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleHash.html deleted file mode 100644 index 71a1ff0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleHash.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleHash (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleHash

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleList.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleList.html deleted file mode 100644 index dc4413f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleList.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleList (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleList

    -
    -
    No usage of freemarker.template.SimpleList
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleNumber.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleNumber.html deleted file mode 100644 index cd2186c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleNumber.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleNumber (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleNumber

    -
    -
    No usage of freemarker.template.SimpleNumber
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleObjectWrapper.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleObjectWrapper.html deleted file mode 100644 index 816e79f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleObjectWrapper.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleObjectWrapper (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleObjectWrapper

    -
    -
    No usage of freemarker.template.SimpleObjectWrapper
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleScalar.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleScalar.html deleted file mode 100644 index f6b4637..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleScalar.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleScalar (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleScalar

    -
    -
    No usage of freemarker.template.SimpleScalar
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleSequence.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleSequence.html deleted file mode 100644 index f1e2c3f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/SimpleSequence.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -Uses of Class freemarker.template.SimpleSequence (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.SimpleSequence

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.WrongEncodingException.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.WrongEncodingException.html deleted file mode 100644 index ee2be60..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.WrongEncodingException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.Template.WrongEncodingException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.Template.WrongEncodingException

    -
    -
    No usage of freemarker.template.Template.WrongEncodingException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.html deleted file mode 100644 index 08c9b1e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/Template.html +++ /dev/null @@ -1,479 +0,0 @@ - - - - - - -Uses of Class freemarker.template.Template (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.Template

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateBooleanModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateBooleanModel.html deleted file mode 100644 index 15fb955..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateBooleanModel.html +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateBooleanModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateBooleanModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateCollectionModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateCollectionModel.html deleted file mode 100644 index 405303d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateCollectionModel.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateCollectionModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateCollectionModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDateModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDateModel.html deleted file mode 100644 index bc50c94..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDateModel.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateDateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateDateModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveBody.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveBody.html deleted file mode 100644 index 4dfc203..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveBody.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateDirectiveBody (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateDirectiveBody

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveModel.html deleted file mode 100644 index a2feb98..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateDirectiveModel.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateDirectiveModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateDirectiveModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateException.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateException.html deleted file mode 100644 index 21959e2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateException.html +++ /dev/null @@ -1,671 +0,0 @@ - - - - - - -Uses of Class freemarker.template.TemplateException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.TemplateException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateExceptionHandler.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateExceptionHandler.html deleted file mode 100644 index ca4eaf8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateExceptionHandler.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateExceptionHandler (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateExceptionHandler

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModel.html deleted file mode 100644 index 185085e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModel.html +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateHashModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateHashModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModelEx.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModelEx.html deleted file mode 100644 index ed39435..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateHashModelEx.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateHashModelEx (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateHashModelEx

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModel.html deleted file mode 100644 index ba7b684..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModel.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateMethodModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateMethodModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModelEx.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModelEx.html deleted file mode 100644 index fa71bdb..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateMethodModelEx.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateMethodModelEx (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateMethodModelEx

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModel.html deleted file mode 100644 index 22ef208..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModel.html +++ /dev/null @@ -1,1492 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelAdapter.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelAdapter.html deleted file mode 100644 index efdef32..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelAdapter.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateModelAdapter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateModelAdapter

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelException.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelException.html deleted file mode 100644 index 5136a15..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelException.html +++ /dev/null @@ -1,1145 +0,0 @@ - - - - - - -Uses of Class freemarker.template.TemplateModelException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.TemplateModelException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelIterator.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelIterator.html deleted file mode 100644 index 9e768ba..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelIterator.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateModelIterator (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateModelIterator

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelListSequence.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelListSequence.html deleted file mode 100644 index 4940647..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateModelListSequence.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.TemplateModelListSequence (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.TemplateModelListSequence

    -
    -
    No usage of freemarker.template.TemplateModelListSequence
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNodeModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNodeModel.html deleted file mode 100644 index f145901..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNodeModel.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateNodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateNodeModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNumberModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNumberModel.html deleted file mode 100644 index c700918..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateNumberModel.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateNumberModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateNumberModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateScalarModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateScalarModel.html deleted file mode 100644 index 16da35a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateScalarModel.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateScalarModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateScalarModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateSequenceModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateSequenceModel.html deleted file mode 100644 index 18709e6..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateSequenceModel.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateSequenceModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateSequenceModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateTransformModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateTransformModel.html deleted file mode 100644 index 8d34aa7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TemplateTransformModel.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TemplateTransformModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TemplateTransformModel

    -
    -
    -
      -
    • - - - - - - - - - - - - -
      Packages that use TemplateTransformModel 
      PackageDescription
      freemarker.template.utility -
      Various classes used by core FreeMarker code but might be useful outside of it too.
      -
      -
    • -
    • -
        -
      • - - -

        Uses of TemplateTransformModel in freemarker.template.utility

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Classes in freemarker.template.utility that implement TemplateTransformModel 
        Modifier and TypeClass and Description
        class CaptureOutput -
        Deprecated.  -
        Use block-assignments instead, like <assign x>...</assign>.
        -
        -
        class HtmlEscape -
        Performs an HTML escape of a given template fragment.
        -
        class JythonRuntime -
        A crude first pass at an embeddable Jython interpreter
        -
        class NormalizeNewlines -
        Transformer that supports FreeMarker legacy behavior: all newlines appearing - within the transformed area will be transformed into the platform's default - newline.
        -
        class StandardCompress -
        A filter that compresses each sequence of consecutive whitespace - to a single line break (if the sequence contains a line break) or a - single space.
        -
        class XmlEscape -
        Performs an XML escaping of a given template fragment.
        -
        -
      • -
      -
    • -
    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/TransformControl.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/TransformControl.html deleted file mode 100644 index e8271e5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/TransformControl.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.TransformControl (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.TransformControl

    -
    -
    No usage of freemarker.template.TransformControl
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/Version.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/Version.html deleted file mode 100644 index e362ff9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/Version.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - -Uses of Class freemarker.template.Version (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.Version

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/class-use/WrappingTemplateModel.html b/fmpp/docs/freemarker/api/freemarker/template/class-use/WrappingTemplateModel.html deleted file mode 100644 index 9ee6565..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/class-use/WrappingTemplateModel.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - -Uses of Class freemarker.template.WrappingTemplateModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.WrappingTemplateModel

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/package-frame.html b/fmpp/docs/freemarker/api/freemarker/template/package-frame.html deleted file mode 100644 index 943917a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/package-frame.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - -freemarker.template (FreeMarker 2.3.21 API) - - - - - -

    freemarker.template

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/package-summary.html b/fmpp/docs/freemarker/api/freemarker/template/package-summary.html deleted file mode 100644 index 20958cf..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/package-summary.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - -freemarker.template (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.template

    -
    -
    The fundamental, most commonly used API-s of FreeMarker; -start with Configuration (also see -Getting Stared in the Manual.)
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.template Description

    -

    The fundamental, most commonly used API-s of FreeMarker; -start with Configuration (also see -Getting Stared in the Manual.)

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/package-tree.html b/fmpp/docs/freemarker/api/freemarker/template/package-tree.html deleted file mode 100644 index d28ca73..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/package-tree.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - -freemarker.template Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.template

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/package-use.html b/fmpp/docs/freemarker/api/freemarker/template/package-use.html deleted file mode 100644 index b69896d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/package-use.html +++ /dev/null @@ -1,1148 +0,0 @@ - - - - - - -Uses of Package freemarker.template (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.template

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/CaptureOutput.html b/fmpp/docs/freemarker/api/freemarker/template/utility/CaptureOutput.html deleted file mode 100644 index 1c9cb18..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/CaptureOutput.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - -CaptureOutput (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class CaptureOutput

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateTransformModel
      -
      -
      -
      Deprecated.  -
      Use block-assignments instead, like <assign x>...</assign>.
      -
      -
      -
      public class CaptureOutput
      -extends Object
      -implements TemplateTransformModel
      -
      A transform that captures the output of a block of FTL code and stores that in a variable. - -

      As this transform is initially present in the shared variable set, you can always - access it from the templates:

      - -
      - <@capture_output var="captured">
      -   ...
      - </@capture_output>
      - 
      - -

      And later in the template you can use the captured output:

      - - ${captured} - -

      This transform requires one of three parameters: var, local, or global. - Each of them specifies the name of the variable that stores the captured output, but the first creates a - variable in a name-space (as <#assign>), the second creates a macro-local variable (as <#local>), - and the last creates a global variable (as <#global>). -

      -

      In the case of an assignment within a namespace, there is an optional parameter - namespace that indicates in which namespace to do the assignment. - if this is omitted, the current namespace is used, and this will be, by far, the most - common usage pattern.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          CaptureOutput

          -
          public CaptureOutput()
          -
          Deprecated. 
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -                 throws TemplateModelException
          -
          Deprecated. 
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/ClassUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/ClassUtil.html deleted file mode 100644 index a515040..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/ClassUtil.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - -ClassUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class ClassUtil

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class ClassUtil
      -extends Object
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          getShortClassName

          -
          public static String getShortClassName(Class pClass,
          -                                       boolean shortenFreeMarkerClasses)
          -
          Returns a class name without "java.lang." and "java.util." prefix, also shows array types in a format like - int[]; useful for printing class names in error messages.
          -
          -
          Parameters:
          -
          pClass - can be null, in which case the method returns null.
          -
          shortenFreeMarkerClasses - if true, it will also shorten FreeMarker class names. The exact rules - aren't specified and might change over time, but right now, freemarker.ext.beans.NumberModel for - example becomes to f.e.b.NumberModel.
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - - - - - -
          -
        • -

          getShortClassNameOfObject

          -
          public static String getShortClassNameOfObject(Object obj,
          -                                               boolean shortenFreeMarkerClasses)
          -
          getShortClassName(Class, boolean) called with object.getClass(), but returns the fictional - class name Null for a null value.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          getFTLTypeDescription

          -
          public static String getFTLTypeDescription(TemplateModel tm)
          -
          Returns the type description of a value with FTL terms (not plain class name), as it should be used in - type-related error messages and for debugging purposes. The exact format is not specified and might change over - time, but currently it's something like "string (wrapper: f.t.SimpleScalar)" or - "sequence+hash+string (ArrayList wrapped into f.e.b.CollectionModel)".
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          primitiveClassToBoxingClass

          -
          public static Class primitiveClassToBoxingClass(Class primitiveClass)
          -
          Gets the wrapper class for a primitive class, like Integer for int, also returns Void - for void.
          -
          -
          Parameters:
          -
          primitiveClass - A Class like int.type, boolean.type, etc. If it's not a primitive - class, or it's null, then the parameter value is returned as is. Note that performance-wise the - method assumes that it's a primitive class.
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        - - - - - - - -
          -
        • -

          isNumerical

          -
          public static boolean isNumerical(Class type)
          -
          Tells if a type is numerical; works both for primitive types and classes.
          -
          -
          Parameters:
          -
          type - can't be null
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/CollectionUtils.html b/fmpp/docs/freemarker/api/freemarker/template/utility/CollectionUtils.html deleted file mode 100644 index ef5d9f9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/CollectionUtils.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - -CollectionUtils (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class CollectionUtils

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class CollectionUtils
      -extends Object
      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          EMPTY_OBJECT_ARRAY

          -
          public static final Object[] EMPTY_OBJECT_ARRAY
          -
        • -
        - - - -
          -
        • -

          EMPTY_CLASS_ARRAY

          -
          public static final Class[] EMPTY_CLASS_ARRAY
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/Collections12.html b/fmpp/docs/freemarker/api/freemarker/template/utility/Collections12.html deleted file mode 100644 index dbb8cba..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/Collections12.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - -Collections12 (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class Collections12

    -
    -
    - -
    -
      -
    • -
      -
      Deprecated.  -
      Not needed anymore, as FreeMarker now requires higher than Java 1.3
      -
      -
      -
      public class Collections12
      -extends Object
      -
      Implementation of missing JDK 1.3 collection features for JDK 1.2
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          EMPTY_MAP

          -
          public static final Map EMPTY_MAP
          -
          Deprecated. 
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          singletonMap

          -
          public static Map singletonMap(Object key,
          -                               Object value)
          -
          Deprecated. 
          -
        • -
        - - - -
          -
        • -

          singletonList

          -
          public static List singletonList(Object o)
          -
          Deprecated. 
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/Constants.html b/fmpp/docs/freemarker/api/freemarker/template/utility/Constants.html deleted file mode 100644 index 48c32c9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/Constants.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - -Constants (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class Constants

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class Constants
      -extends Object
      -
      Frequently used constant TemplateModel values. - -

      These constants should be stored in the TemplateModel - sub-interfaces, but for bacward compatibility they are stored here instead. - Starting from FreeMarker 2.4 they should be copyed (not moved!) into the - TemplateModel sub-interfaces, and this class should be marked as - deprecated.

      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DOMNodeModel.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DOMNodeModel.html deleted file mode 100644 index c5ff79c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DOMNodeModel.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - -DOMNodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DOMNodeModel

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.CalendarFieldsToDateConverter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.CalendarFieldsToDateConverter.html deleted file mode 100644 index bd31960..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.CalendarFieldsToDateConverter.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - -DateUtil.CalendarFieldsToDateConverter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Interface DateUtil.CalendarFieldsToDateConverter

    -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Summary

        - - - - - - - - - - -
        All Methods Instance Methods Abstract Methods 
        Modifier and TypeMethod and Description
        Datecalculate(int era, - int year, - int month, - int day, - int hours, - int minutes, - int secs, - int millisecs, - boolean addOneDay, - TimeZone tz) -
        Calculates the Date from the specified calendar fields.
        -
        -
      • -
      -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          calculate

          -
          Date calculate(int era,
          -               int year,
          -               int month,
          -               int day,
          -               int hours,
          -               int minutes,
          -               int secs,
          -               int millisecs,
          -               boolean addOneDay,
          -               TimeZone tz)
          -
          Calculates the Date from the specified calendar fields.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateParseException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateParseException.html deleted file mode 100644 index 6de4e95..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateParseException.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - -DateUtil.DateParseException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DateUtil.DateParseException

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          DateParseException

          -
          public DateParseException(String message)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateToISO8601CalendarFactory.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateToISO8601CalendarFactory.html deleted file mode 100644 index 181763e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.DateToISO8601CalendarFactory.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - -DateUtil.DateToISO8601CalendarFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Interface DateUtil.DateToISO8601CalendarFactory

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          get

          -
          GregorianCalendar get(TimeZone tz,
          -                      Date date)
          -
          Returns a GregorianCalendar with the desired time zone and - time and US locale. The returned calendar is used as read-only. - It must be guaranteed that within a thread the instance returned last time - is not in use anymore when this method is called again.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialCalendarFieldsToDateConverter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialCalendarFieldsToDateConverter.html deleted file mode 100644 index e1ac792..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialCalendarFieldsToDateConverter.html +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - -DateUtil.TrivialCalendarFieldsToDateConverter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DateUtil.TrivialCalendarFieldsToDateConverter

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter
      • -
      -
    • -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialDateToISO8601CalendarFactory.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialDateToISO8601CalendarFactory.html deleted file mode 100644 index 75d38aa..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.TrivialDateToISO8601CalendarFactory.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - -DateUtil.TrivialDateToISO8601CalendarFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DateUtil.TrivialDateToISO8601CalendarFactory

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory
      • -
      -
    • -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.html deleted file mode 100644 index 5664339..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DateUtil.html +++ /dev/null @@ -1,720 +0,0 @@ - - - - - - -DateUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DateUtil

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class DateUtil
      -extends Object
      -
      Date and time related utilities.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/DeepUnwrap.html b/fmpp/docs/freemarker/api/freemarker/template/utility/DeepUnwrap.html deleted file mode 100644 index 6dedb58..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/DeepUnwrap.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - -DeepUnwrap (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class DeepUnwrap

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class DeepUnwrap
      -extends Object
      -
      Utility methods for unwrapping TemplateModel-s.
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/Execute.html b/fmpp/docs/freemarker/api/freemarker/template/utility/Execute.html deleted file mode 100644 index 8a96df9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/Execute.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - -Execute (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class Execute

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateMethodModel, TemplateModel
      -
      -
      -
      -
      public class Execute
      -extends Object
      -implements TemplateMethodModel
      -

      Gives FreeMarker the the ability to execute external commands. Will fork - a process, and inline anything that process sends to stdout in the template. - Based on a patch submitted by Peter Molettiere.

      - -

      BE CAREFUL! this tag, depending on use, may allow you - to set something up so that users of your web - application could run arbitrary code on your server. - This can only happen if you allow unchecked GET/POST - submissions to be used as the command string in the - exec tag.

      - -

      Usage:
      - From java:

      -
      - SimpleHash root = new SimpleHash();
      -
      - root.put( "exec", new freemarker.template.utility.Execute() );
      -
      - ...
      - 
      - -

      From your FreeMarker template:

      -
      -
      - The following is executed:
      - ${exec( "/usr/bin/ls" )}
      -
      - ...
      - 
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          Execute

          -
          public Execute()
          -
        • -
        -
      • -
      - - -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/HtmlEscape.html b/fmpp/docs/freemarker/api/freemarker/template/utility/HtmlEscape.html deleted file mode 100644 index 6c5e73d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/HtmlEscape.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - -HtmlEscape (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class HtmlEscape

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateTransformModel
      -
      -
      -
      -
      public class HtmlEscape
      -extends Object
      -implements TemplateTransformModel
      -
      Performs an HTML escape of a given template fragment. Specifically, - < > " and & are all turned into entities. - -

      Usage:
      - From java:

      -
      - SimpleHash root = new SimpleHash();
      -
      - root.put( "htmlEscape", new freemarker.template.utility.HtmlEscape() );
      -
      - ...
      - 
      - -

      From your FreeMarker template:

      -
      -
      - The following is HTML-escaped:
      - <transform htmlEscape>
      -   <p>This paragraph has all HTML special characters escaped.</p>
      - </transform>
      -
      - ...
      - 
      -
      -
      See Also:
      -
      XmlEscape
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          HtmlEscape

          -
          public HtmlEscape()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/JythonRuntime.html b/fmpp/docs/freemarker/api/freemarker/template/utility/JythonRuntime.html deleted file mode 100644 index 044b5be..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/JythonRuntime.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - -JythonRuntime (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class JythonRuntime

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • org.python.util.PythonInterpreter
      • -
      • -
          -
        • freemarker.template.utility.JythonRuntime
        • -
        -
      • -
      -
    • -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Field Summary

        -
          -
        • - - -

          Fields inherited from class org.python.util.PythonInterpreter

          -cflags, systemState
        • -
        - -
      • -
      - -
        -
      • - - -

        Constructor Summary

        - - - - - - - - -
        Constructors 
        Constructor and Description
        JythonRuntime() 
        -
      • -
      - - -
    • -
    -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JythonRuntime

          -
          public JythonRuntime()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/NormalizeNewlines.html b/fmpp/docs/freemarker/api/freemarker/template/utility/NormalizeNewlines.html deleted file mode 100644 index fc7cb95..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/NormalizeNewlines.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - -NormalizeNewlines (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class NormalizeNewlines

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateTransformModel
      -
      -
      -
      -
      public class NormalizeNewlines
      -extends Object
      -implements TemplateTransformModel
      -

      Transformer that supports FreeMarker legacy behavior: all newlines appearing - within the transformed area will be transformed into the platform's default - newline. Unlike the old behavior, however, newlines generated by the data - model are also converted. Legacy behavior was to leave newlines in the - data model unaltered.

      - -

      Usage:
      - From java:

      -
      - SimpleHash root = new SimpleHash();
      -
      - root.put( "normalizeNewlines", new freemarker.template.utility.NormalizeNewlines() );
      -
      - ...
      - 
      - -

      From your FreeMarker template:

      -
      - <transform normalizeNewlines>
      -   <html>
      -   <head>
      -   ...
      -   <p>This template has all newlines normalized to the current platform's
      -   default.</p>
      -   ...
      -   </body>
      -   </html>
      - </transform>
      - 
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NormalizeNewlines

          -
          public NormalizeNewlines()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          -
        • -
        - - - -
          -
        • -

          transform

          -
          public void transform(Reader in,
          -                      Writer out)
          -               throws IOException
          -
          Performs newline normalization on FreeMarker output.
          -
          -
          Parameters:
          -
          in - the input to be transformed
          -
          out - the destination of the transformation
          -
          Throws:
          -
          IOException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/NullArgumentException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/NullArgumentException.html deleted file mode 100644 index 6fca163..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/NullArgumentException.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - -NullArgumentException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class NullArgumentException

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          NullArgumentException

          -
          public NullArgumentException(String argumentName)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          check

          -
          public static void check(String argumentName,
          -                         Object argumentValue)
          -
          Convenience method to protect against a null argument.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/NullWriter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/NullWriter.html deleted file mode 100644 index 8cd0614..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/NullWriter.html +++ /dev/null @@ -1,443 +0,0 @@ - - - - - - -NullWriter (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class NullWriter

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/NumberUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/NumberUtil.html deleted file mode 100644 index c02fb7c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/NumberUtil.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -NumberUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class NumberUtil

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class NumberUtil
      -extends Object
      -
      Number- and math-related utilities.
      -
      -
      Since:
      -
      2.3.20
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          isInfinite

          -
          public static boolean isInfinite(Number num)
          -
        • -
        - - - -
          -
        • -

          isNaN

          -
          public static boolean isNaN(Number num)
          -
        • -
        - - - - - - - -
          -
        • -

          isIntegerBigDecimal

          -
          public static boolean isIntegerBigDecimal(BigDecimal bd)
          -
          Tells if a BigDecimal stores a whole number. For example, it returns true for 1.0000, - but false for 1.0001.
          -
          -
          Since:
          -
          2.3.21
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/ObjectConstructor.html b/fmpp/docs/freemarker/api/freemarker/template/utility/ObjectConstructor.html deleted file mode 100644 index da1c05b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/ObjectConstructor.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - -ObjectConstructor (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class ObjectConstructor

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateMethodModel, TemplateMethodModelEx, TemplateModel
      -
      -
      -
      -
      public class ObjectConstructor
      -extends Object
      -implements TemplateMethodModelEx
      -
      An object that you can make available in a template - to instantiate arbitrary beans-wrapped objects in a template. - Beware of this class's security implications. It allows - the instantiation of arbitrary objects and invoking - methods on them. Usage is something like: -
      -
      myDataModel.put("objectConstructor", new ObjectConstructor()); -
      -
      And then from your FTL code: -
      -
      <#assign aList = objectConstructor("java.util.ArrayList", 100)>
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/OptimizerUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/OptimizerUtil.html deleted file mode 100644 index 77c5f4a..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/OptimizerUtil.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - -OptimizerUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class OptimizerUtil

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class OptimizerUtil
      -extends Object
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          optimizeListStorage

          -
          public static List optimizeListStorage(List list)
          -
        • -
        - - - -
          -
        • -

          optimizeNumberRepresentation

          -
          public static Number optimizeNumberRepresentation(Number number)
          -
          This is needed to reverse the extreme conversions in arithmetic - operations so that numbers can be meaningfully used with models that - don't know what to do with a BigDecimal. Of course, this will make - impossible for these models (i.e. Jython) to receive a BigDecimal even if - it was originally placed as such in the data model. However, since - arithmetic operations aggressively erase the information regarding the - original number type, we have no other choice to ensure expected operation - in majority of cases.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/SecurityUtilities.html b/fmpp/docs/freemarker/api/freemarker/template/utility/SecurityUtilities.html deleted file mode 100644 index 6cc8cda..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/SecurityUtilities.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - -SecurityUtilities (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class SecurityUtilities

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class SecurityUtilities
      -extends Object
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getSystemProperty

          -
          public static String getSystemProperty(String key)
          -
        • -
        - - - -
          -
        • -

          getSystemProperty

          -
          public static String getSystemProperty(String key,
          -                                       String defValue)
          -
        • -
        - - - -
          -
        • -

          getSystemProperty

          -
          public static Integer getSystemProperty(String key,
          -                                        int defValue)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/StandardCompress.html b/fmpp/docs/freemarker/api/freemarker/template/utility/StandardCompress.html deleted file mode 100644 index ae663c0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/StandardCompress.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - -StandardCompress (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class StandardCompress

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateTransformModel
      -
      -
      -
      -
      public class StandardCompress
      -extends Object
      -implements TemplateTransformModel
      -

      A filter that compresses each sequence of consecutive whitespace - to a single line break (if the sequence contains a line break) or a - single space. In addition, leading and trailing whitespace is - completely removed.

      - -

      Specify the transform parameter single_line = true - to always compress to a single space instead of a line break.

      - -

      The default buffer size can be overridden by specifying a - buffer_size transform parameter (in bytes).

      - -

      Note: The compress tag is implemented using this filter

      - -

      Usage:
      - From java:

      -
      - SimpleHash root = new SimpleHash();
      -
      - root.put( "standardCompress", new freemarker.template.utility.StandardCompress() );
      -
      - ...
      - 
      - -

      From your FreeMarker template:

      -
      - <transform standardCompress>
      -   <p>This    paragraph will have
      -       extraneous
      -
      - whitespace removed.</p>
      - </transform>
      - 
      - -

      Output:

      -
      - <p>This paragraph will have
      - extraneous
      - whitespace removed.</p>
      - 
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - - - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          StandardCompress

          -
          public StandardCompress()
          -
        • -
        - - - -
          -
        • -

          StandardCompress

          -
          public StandardCompress(int defaultBufferSize)
          -
          -
          Parameters:
          -
          defaultBufferSize - the default amount of characters to buffer
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -                 throws TemplateModelException
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          Throws:
          -
          TemplateModelException
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/StringUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/StringUtil.html deleted file mode 100644 index a1aab91..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/StringUtil.html +++ /dev/null @@ -1,1174 +0,0 @@ - - - - - - -StringUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class StringUtil

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class StringUtil
      -extends Object
      -
      Some text related utilities.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          StringUtil

          -
          public StringUtil()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          HTMLEnc

          -
          public static String HTMLEnc(String s)
          -
          Deprecated. Use XHTMLEnc(String) instead, because it escapes apostrophe-quote too.
          -
          HTML encoding (does not convert line breaks and apostrophe-quote). - Replaces all '>' '<' '&' and '"' with entity reference, but not "'" (apostrophe-quote). - The last is not escaped as back then when this was written some user agents didn't understood - "&apos;" nor "&#39;".
          -
        • -
        - - - -
          -
        • -

          XMLEnc

          -
          public static String XMLEnc(String s)
          -
          XML Encoding. - Replaces all '>' '<' '&', "'" and '"' with entity reference
          -
        • -
        - - - -
          -
        • -

          XHTMLEnc

          -
          public static String XHTMLEnc(String s)
          -
          XHTML Encoding. - Replaces all '>' '<' '&', "'" and '"' with entity reference - suitable for XHTML decoding in common user agents (including legacy - user agents, which do not decode "&apos;" to "'", so "&#39;" is used - instead [see http://www.w3.org/TR/xhtml1/#C_16])
          -
        • -
        - - - -
          -
        • -

          XMLEncNA

          -
          public static String XMLEncNA(String s)
          -
          XML encoding without replacing apostrophes.
          -
          -
          See Also:
          -
          XMLEnc(String)
          -
          -
        • -
        - - - -
          -
        • -

          XMLEncQAttr

          -
          public static String XMLEncQAttr(String s)
          -
          XML encoding for attributes values quoted with " (not with '!). - Also can be used for HTML attributes that are quoted with ".
          -
          -
          See Also:
          -
          XMLEnc(String)
          -
          -
        • -
        - - - -
          -
        • -

          XMLEncNQG

          -
          public static String XMLEncNQG(String s)
          -
          XML encoding without replacing apostrophes and quotation marks and - greater-thans (except in ]]>).
          -
          -
          See Also:
          -
          XMLEnc(String)
          -
          -
        • -
        - - - -
          -
        • -

          RTFEnc

          -
          public static String RTFEnc(String s)
          -
          Rich Text Format encoding (does not replace line breaks). - Escapes all '\' '{' '}' and '"'
          -
        • -
        - - - - - - - - - - - -
          -
        • -

          FTLStringLiteralEnc

          -
          public static String FTLStringLiteralEnc(String s)
          -
        • -
        - - - -
          -
        • -

          FTLStringLiteralDec

          -
          public static String FTLStringLiteralDec(String s)
          -                                  throws ParseException
          -
          FTL string literal decoding. - - \\, \", \', \n, \t, \r, \b and \f will be replaced according to - Java rules. In additional, it knows \g, \l, \a and \{ which are - replaced with <, >, & and { respectively. - \x works as hexadecimal character code escape. The character - codes are interpreted according to UCS basic plane (Unicode). - "f\x006Fo", "f\x06Fo" and "f\x6Fo" will be "foo". - "f\x006F123" will be "foo123" as the maximum number of digits is 4. - - All other \X (where X is any character not mentioned above or End-of-string) - will cause a ParseException.
          -
          -
          Parameters:
          -
          s - String literal without the surrounding quotation marks
          -
          Returns:
          -
          String with all escape sequences resolved
          -
          Throws:
          -
          ParseException - if there string contains illegal escapes
          -
          -
        • -
        - - - -
          -
        • -

          deduceLocale

          -
          public static Locale deduceLocale(String input)
          -
        • -
        - - - -
          -
        • -

          capitalize

          -
          public static String capitalize(String s)
          -
        • -
        - - - -
          -
        • -

          getYesNo

          -
          public static boolean getYesNo(String s)
          -
        • -
        - - - -
          -
        • -

          split

          -
          public static String[] split(String s,
          -                             char c)
          -
          Splits a string at the specified character.
          -
        • -
        - - - -
          -
        • -

          split

          -
          public static String[] split(String s,
          -                             String sep,
          -                             boolean caseInsensitive)
          -
          Splits a string at the specified string.
          -
        • -
        - - - - - - - -
          -
        • -

          replace

          -
          public static String replace(String text,
          -                             String oldsub,
          -                             String newsub,
          -                             boolean caseInsensitive,
          -                             boolean firstOnly)
          -
          Replaces all occurrences of a sub-string in a string.
          -
          -
          Parameters:
          -
          text - The string where it will replace oldsub with - newsub.
          -
          Returns:
          -
          String The string after the replacements.
          -
          -
        • -
        - - - -
          -
        • -

          chomp

          -
          public static String chomp(String s)
          -
          Removes the line-break from the end of the string.
          -
        • -
        - - - -
          -
        • -

          emptyToNull

          -
          public static String emptyToNull(String s)
          -
          Converts a 0-length string to null, leaves the string as is otherwise.
          -
          -
          Parameters:
          -
          s - maybe null.
          -
          -
        • -
        - - - -
          -
        • -

          jQuote

          -
          public static String jQuote(Object obj)
          -
          Converts the parameter with toString (if it's not null) and passes it to - jQuote(String).
          -
        • -
        - - - -
          -
        • -

          jQuote

          -
          public static String jQuote(String s)
          -
          Quotes string as Java Language string literal. - Returns string "null" if s - is null.
          -
        • -
        - - - -
          -
        • -

          jQuoteNoXSS

          -
          public static String jQuoteNoXSS(Object obj)
          -
          Converts the parameter with toString (if not - null)and passes it to jQuoteNoXSS(String).
          -
        • -
        - - - -
          -
        • -

          jQuoteNoXSS

          -
          public static String jQuoteNoXSS(String s)
          -
          Same as jQuoteNoXSS(String) but also escapes '<' - as \u003C. This is used for log messages to prevent XSS - on poorly written Web-based log viewers.
          -
        • -
        - - - -
          -
        • -

          javaStringEnc

          -
          public static String javaStringEnc(String s)
          -
          Escapes the String with the escaping rules of Java language - string literals, so it's safe to insert the value into a string literal. - The resulting string will not be quoted. - -

          All characters under UCS code point 0x20 will be escaped. - Where they have no dedicated escape sequence in Java, they will - be replaced with hexadecimal escape (\uXXXX).

          -
          -
          See Also:
          -
          jQuote(String)
          -
          -
        • -
        - - - -
          -
        • -

          javaScriptStringEnc

          -
          public static String javaScriptStringEnc(String s)
          -
          Escapes a String to be safely insertable into a JavaScript string literal; for more see - jsStringEnc(s, false).
          -
        • -
        - - - - - - - -
          -
        • -

          jsStringEnc

          -
          public static String jsStringEnc(String s,
          -                                 boolean json)
          -
          Escapes a String to be safely insertable into a JavaScript or a JSON string literal. - The resulting string will not be quoted; the caller must ensure that they are there in the final - output. Note that for JSON, the quotation marks must be ", not ', because JSON doesn't escape - '. - -

          The escaping rules guarantee that if the inside - of the literal is from one or more touching sections of strings escaped with this, no character sequence will - occur that closes the string literal or has special meaning in HTML/XML that can terminate the script section. - (If, however, the escaped section is preceded by or followed by strings from other sources, this can't be - guaranteed in some rare cases. Like x = "</${a?js_string}" might closes the "script" - element if a is is "script>".) - - The escaped characters are: - - - - - - - - - - - -
          Input - Output -
          " - \" -
          ' if not in JSON-mode - \' -
          \ - \\ -
          / if the method can't know that it won't be directly after < - \/ -
          > if the method can't know that it won't be directly after ]] or -- - JavaScript: \>; JSON: \u003E -
          < if the method can't know that it won't be directly followed by ! or ? - \u003C -
          - u0000-u001f (UNICODE control characters - disallowed by JSON)
          - u007f-u009f (UNICODE control characters - disallowed by JSON) -
          \n, \r and such, or if there's no such dedicated escape: - JavaScript: \xXX, JSON: \uXXXX -
          - u2028 (Line separator - source code line-break in ECMAScript)
          - u2029 (Paragraph separator - source code line-break in ECMAScript)
          -
          \uXXXX -

          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        - - - -
          -
        • -

          parseNameValuePairList

          -
          public static Map parseNameValuePairList(String s,
          -                                         String defaultValue)
          -                                  throws ParseException
          -
          Parses a name-value pair list, where the pairs are separated with comma, - and the name and value is separated with colon. - The keys and values can contain only letters, digits and _. They - can't be quoted. White-space around the keys and values are ignored. The - value can be omitted if defaultValue is not null. When a - value is omitted, then the colon after the key must be omitted as well. - The same key can't be used for multiple times.
          -
          -
          Parameters:
          -
          s - the string to parse. - For example: "strong:100, soft:900".
          -
          defaultValue - the value used when the value is omitted in a - key-value pair.
          -
          Returns:
          -
          the map that contains the name-value pairs.
          -
          Throws:
          -
          ParseException - if the string is not a valid name-value - pair list.
          -
          -
        • -
        - - - -
          -
        • -

          isXMLID

          -
          public static boolean isXMLID(String name)
          -
          -
          Returns:
          -
          whether the name is a valid XML tagname. - (This routine might only be 99% accurate. Should maybe REVISIT)
          -
          -
        • -
        - - - -
          -
        • -

          matchesName

          -
          public static boolean matchesName(String qname,
          -                                  String nodeName,
          -                                  String nsURI,
          -                                  Environment env)
          -
          -
          Returns:
          -
          whether the qname matches the combination of nodeName, nsURI, and environment prefix settings.
          -
          -
        • -
        - - - -
          -
        • -

          leftPad

          -
          public static String leftPad(String s,
          -                             int minLength)
          -
          Pads the string at the left with spaces until it reaches the desired - length. If the string is longer than this length, then it returns the - unchanged string.
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          -
        • -
        - - - -
          -
        • -

          leftPad

          -
          public static String leftPad(String s,
          -                             int minLength,
          -                             char filling)
          -
          Pads the string at the left with the specified character until it reaches - the desired length. If the string is longer than this length, then it - returns the unchanged string.
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          filling - the filling pattern.
          -
          -
        • -
        - - - -
          -
        • -

          leftPad

          -
          public static String leftPad(String s,
          -                             int minLength,
          -                             String filling)
          -
          Pads the string at the left with a filling pattern until it reaches the - desired length. If the string is longer than this length, then it returns - the unchanged string. For example: leftPad('ABC', 9, '1234') - returns "123412ABC".
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          filling - the filling pattern. Must be at least 1 characters long. - Can't be null.
          -
          -
        • -
        - - - -
          -
        • -

          rightPad

          -
          public static String rightPad(String s,
          -                              int minLength)
          -
          Pads the string at the right with spaces until it reaches the desired - length. If the string is longer than this length, then it returns the - unchanged string.
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          -
        • -
        - - - -
          -
        • -

          rightPad

          -
          public static String rightPad(String s,
          -                              int minLength,
          -                              char filling)
          -
          Pads the string at the right with the specified character until it - reaches the desired length. If the string is longer than this length, - then it returns the unchanged string.
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          filling - the filling pattern.
          -
          -
        • -
        - - - -
          -
        • -

          rightPad

          -
          public static String rightPad(String s,
          -                              int minLength,
          -                              String filling)
          -
          Pads the string at the right with a filling pattern until it reaches the - desired length. If the string is longer than this length, then it returns - the unchanged string. For example: rightPad('ABC', 9, '1234') - returns "ABC412341". Note that the filling pattern is - started as if you overlay "123412341" with the left-aligned - "ABC", so it starts with "4".
          -
          -
          Parameters:
          -
          s - the string that will be padded.
          -
          minLength - the length to reach.
          -
          filling - the filling pattern. Must be at least 1 characters long. - Can't be null.
          -
          -
        • -
        - - - -
          -
        • -

          versionStringToInt

          -
          public static int versionStringToInt(String version)
          -
          Converts a version number string to an integer for easy comparison. - The version number must start with numbers separated with - dots. There can be any number of such dot-separated numbers, but only - the first three will be considered. After the numbers arbitrary text can - follow, and will be ignored. - - The string will be trimmed before interpretation.
          -
          -
          Returns:
          -
          major * 1000000 + minor * 1000 + micro
          -
          -
        • -
        - - - -
          -
        • -

          tryToString

          -
          public static String tryToString(Object object)
          -
          Tries to run toString(), but if that fails, returns a "[toString failed: " + e + "]" instead. - Also, it returns null for null parameter.
          -
          -
          Since:
          -
          2.3.20
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/ToCanonical.html b/fmpp/docs/freemarker/api/freemarker/template/utility/ToCanonical.html deleted file mode 100644 index 5a8969c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/ToCanonical.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - -ToCanonical (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class ToCanonical

    -
    -
    - -
    -
      -
    • -
      -
      -
      public class ToCanonical
      -extends Object
      -
      Read in a template and convert it to a canonical format.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          ToCanonical

          -
          public ToCanonical()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          main

          -
          public static void main(String[] args)
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/UndeclaredThrowableException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/UndeclaredThrowableException.html deleted file mode 100644 index 17e3513..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/UndeclaredThrowableException.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - -UndeclaredThrowableException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class UndeclaredThrowableException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class UndeclaredThrowableException
      -extends RuntimeException
      -
      The equivalent of JDK 1.3 UndeclaredThrowableException.
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/UnrecognizedTimeZoneException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/UnrecognizedTimeZoneException.html deleted file mode 100644 index 5072c1d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/UnrecognizedTimeZoneException.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - -UnrecognizedTimeZoneException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class UnrecognizedTimeZoneException

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Serializable
      -
      -
      -
      -
      public class UnrecognizedTimeZoneException
      -extends Exception
      -
      Indicates that the time zone name is not recognized.
      -
      -
      See Also:
      -
      Serialized Form
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          UnrecognizedTimeZoneException

          -
          public UnrecognizedTimeZoneException(String timeZoneName)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getTimeZoneName

          -
          public String getTimeZoneName()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/UnsupportedNumberClassException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/UnsupportedNumberClassException.html deleted file mode 100644 index 9dfbeb4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/UnsupportedNumberClassException.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - -UnsupportedNumberClassException (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class UnsupportedNumberClassException

    -
    -
    - -
    - -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          UnsupportedNumberClassException

          -
          public UnsupportedNumberClassException(Class pClass)
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getUnsupportedClass

          -
          public Class getUnsupportedClass()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/WriteProtectable.html b/fmpp/docs/freemarker/api/freemarker/template/utility/WriteProtectable.html deleted file mode 100644 index 4fa5843..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/WriteProtectable.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - -WriteProtectable (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Interface WriteProtectable

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      BeansWrapper, DefaultObjectWrapper, RhinoWrapper, SimpleObjectWrapper
      -
      -
      -
      -
      public interface WriteProtectable
      -
      Implemented by objects that can be made permanently read-only. This usually meant to freeze the - configuration JavaBean properties, so that the object can be safely shared among independently developed components.
      -
      -
      Since:
      -
      2.3.21
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          writeProtect

          -
          void writeProtect()
          -
          Makes this object permanently read-only.
          -
        • -
        - - - -
          -
        • -

          isWriteProtected

          -
          boolean isWriteProtected()
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/XmlEscape.html b/fmpp/docs/freemarker/api/freemarker/template/utility/XmlEscape.html deleted file mode 100644 index 62b35cc..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/XmlEscape.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - -XmlEscape (FreeMarker 2.3.21 API) - - - - - - - - - - - - -
    -
    freemarker.template.utility
    -

    Class XmlEscape

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      TemplateModel, TemplateTransformModel
      -
      -
      -
      -
      public class XmlEscape
      -extends Object
      -implements TemplateTransformModel
      -
      Performs an XML escaping of a given template fragment. Specifically, - < > " ' and & are all turned into entity references. - -

      An instance of this transform is initially visible as shared - variable called xml_escape.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          XmlEscape

          -
          public XmlEscape()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          getWriter

          -
          public Writer getWriter(Writer out,
          -                        Map args)
          -
          Description copied from interface: TemplateTransformModel
          -
          Returns a writer that will be used by the engine to feed the - transformation input to the transform. Each call to this method - must return a new instance of the writer so that the transformation - is thread-safe.
          -
          -
          Specified by:
          -
          getWriter in interface TemplateTransformModel
          -
          Parameters:
          -
          out - the character stream to which to write the transformed output
          -
          args - the arguments (if any) passed to the transformation as a - map of key/value pairs where the keys are strings and the arguments are - TemplateModel instances. This is never null. If you need to convert the - template models to POJOs, you can use the utility methods in the - DeepUnwrap class.
          -
          Returns:
          -
          a writer to which the engine will feed the transformation - input, or null if the transform does not support nested content (body). - The returned writer can implement the TransformControl - interface if it needs advanced control over the evaluation of the - transformation body.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CaptureOutput.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CaptureOutput.html deleted file mode 100644 index c3a40d4..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CaptureOutput.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.CaptureOutput (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.CaptureOutput

    -
    -
    No usage of freemarker.template.utility.CaptureOutput
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ClassUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ClassUtil.html deleted file mode 100644 index 2e1cf9e..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ClassUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.ClassUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.ClassUtil

    -
    -
    No usage of freemarker.template.utility.ClassUtil
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CollectionUtils.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CollectionUtils.html deleted file mode 100644 index bbb8b91..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/CollectionUtils.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.CollectionUtils (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.CollectionUtils

    -
    -
    No usage of freemarker.template.utility.CollectionUtils
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Collections12.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Collections12.html deleted file mode 100644 index 6ea000f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Collections12.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.Collections12 (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.Collections12

    -
    -
    No usage of freemarker.template.utility.Collections12
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Constants.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Constants.html deleted file mode 100644 index 525e357..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Constants.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.Constants (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.Constants

    -
    -
    No usage of freemarker.template.utility.Constants
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DOMNodeModel.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DOMNodeModel.html deleted file mode 100644 index 4e90d71..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DOMNodeModel.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DOMNodeModel (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DOMNodeModel

    -
    -
    No usage of freemarker.template.utility.DOMNodeModel
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.CalendarFieldsToDateConverter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.CalendarFieldsToDateConverter.html deleted file mode 100644 index a538316..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.CalendarFieldsToDateConverter.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.utility.DateUtil.CalendarFieldsToDateConverter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.utility.DateUtil.CalendarFieldsToDateConverter

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateParseException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateParseException.html deleted file mode 100644 index e6e55b9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateParseException.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DateUtil.DateParseException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DateUtil.DateParseException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateToISO8601CalendarFactory.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateToISO8601CalendarFactory.html deleted file mode 100644 index 16caea0..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.DateToISO8601CalendarFactory.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.utility.DateUtil.DateToISO8601CalendarFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.utility.DateUtil.DateToISO8601CalendarFactory

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialCalendarFieldsToDateConverter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialCalendarFieldsToDateConverter.html deleted file mode 100644 index 0425d29..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialCalendarFieldsToDateConverter.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter

    -
    -
    No usage of freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialDateToISO8601CalendarFactory.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialDateToISO8601CalendarFactory.html deleted file mode 100644 index 8950c34..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.TrivialDateToISO8601CalendarFactory.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory

    -
    -
    No usage of freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.html deleted file mode 100644 index 795cad7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DateUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DateUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DateUtil

    -
    -
    No usage of freemarker.template.utility.DateUtil
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DeepUnwrap.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DeepUnwrap.html deleted file mode 100644 index 6a94ba9..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/DeepUnwrap.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.DeepUnwrap (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.DeepUnwrap

    -
    -
    No usage of freemarker.template.utility.DeepUnwrap
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Execute.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Execute.html deleted file mode 100644 index b4011e1..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/Execute.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.Execute (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.Execute

    -
    -
    No usage of freemarker.template.utility.Execute
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/HtmlEscape.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/HtmlEscape.html deleted file mode 100644 index 01816c8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/HtmlEscape.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.HtmlEscape (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.HtmlEscape

    -
    -
    No usage of freemarker.template.utility.HtmlEscape
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/JythonRuntime.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/JythonRuntime.html deleted file mode 100644 index dd09d5d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/JythonRuntime.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.JythonRuntime (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.JythonRuntime

    -
    -
    No usage of freemarker.template.utility.JythonRuntime
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NormalizeNewlines.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NormalizeNewlines.html deleted file mode 100644 index f30b2b2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NormalizeNewlines.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.NormalizeNewlines (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.NormalizeNewlines

    -
    -
    No usage of freemarker.template.utility.NormalizeNewlines
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullArgumentException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullArgumentException.html deleted file mode 100644 index 5851136..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullArgumentException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.NullArgumentException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.NullArgumentException

    -
    -
    No usage of freemarker.template.utility.NullArgumentException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullWriter.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullWriter.html deleted file mode 100644 index 749bad7..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NullWriter.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.NullWriter (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.NullWriter

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NumberUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NumberUtil.html deleted file mode 100644 index a1b30c8..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/NumberUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.NumberUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.NumberUtil

    -
    -
    No usage of freemarker.template.utility.NumberUtil
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ObjectConstructor.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ObjectConstructor.html deleted file mode 100644 index 8f8b498..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ObjectConstructor.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.ObjectConstructor (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.ObjectConstructor

    -
    -
    No usage of freemarker.template.utility.ObjectConstructor
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/OptimizerUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/OptimizerUtil.html deleted file mode 100644 index 499f416..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/OptimizerUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.OptimizerUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.OptimizerUtil

    -
    -
    No usage of freemarker.template.utility.OptimizerUtil
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/SecurityUtilities.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/SecurityUtilities.html deleted file mode 100644 index 4d6182d..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/SecurityUtilities.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.SecurityUtilities (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.SecurityUtilities

    -
    -
    No usage of freemarker.template.utility.SecurityUtilities
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StandardCompress.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StandardCompress.html deleted file mode 100644 index 8902f15..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StandardCompress.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.StandardCompress (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.StandardCompress

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StringUtil.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StringUtil.html deleted file mode 100644 index ce6c7a5..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/StringUtil.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.StringUtil (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.StringUtil

    -
    -
    No usage of freemarker.template.utility.StringUtil
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ToCanonical.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ToCanonical.html deleted file mode 100644 index a3af9c3..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/ToCanonical.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.ToCanonical (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.ToCanonical

    -
    -
    No usage of freemarker.template.utility.ToCanonical
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UndeclaredThrowableException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UndeclaredThrowableException.html deleted file mode 100644 index 20548c2..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UndeclaredThrowableException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.UndeclaredThrowableException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.UndeclaredThrowableException

    -
    -
    No usage of freemarker.template.utility.UndeclaredThrowableException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnrecognizedTimeZoneException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnrecognizedTimeZoneException.html deleted file mode 100644 index 20d0fcf..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnrecognizedTimeZoneException.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.UnrecognizedTimeZoneException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.UnrecognizedTimeZoneException

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnsupportedNumberClassException.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnsupportedNumberClassException.html deleted file mode 100644 index 4181e12..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/UnsupportedNumberClassException.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.UnsupportedNumberClassException (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.UnsupportedNumberClassException

    -
    -
    No usage of freemarker.template.utility.UnsupportedNumberClassException
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/WriteProtectable.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/WriteProtectable.html deleted file mode 100644 index 458179c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/WriteProtectable.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -Uses of Interface freemarker.template.utility.WriteProtectable (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Interface
    freemarker.template.utility.WriteProtectable

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/XmlEscape.html b/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/XmlEscape.html deleted file mode 100644 index a74bc59..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/class-use/XmlEscape.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - -Uses of Class freemarker.template.utility.XmlEscape (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Class
    freemarker.template.utility.XmlEscape

    -
    -
    No usage of freemarker.template.utility.XmlEscape
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/package-frame.html b/fmpp/docs/freemarker/api/freemarker/template/utility/package-frame.html deleted file mode 100644 index ae6840c..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/package-frame.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - -freemarker.template.utility (FreeMarker 2.3.21 API) - - - - - -

    freemarker.template.utility

    - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/package-summary.html b/fmpp/docs/freemarker/api/freemarker/template/utility/package-summary.html deleted file mode 100644 index b5b623b..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/package-summary.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - -freemarker.template.utility (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Package freemarker.template.utility

    -
    -
    Various classes used by core FreeMarker code but might be useful outside of it too.
    -
    -

    See: Description

    -
    -
    - - - - -

    Package freemarker.template.utility Description

    -

    Various classes used by core FreeMarker code but might be useful outside of it too.

    -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/package-tree.html b/fmpp/docs/freemarker/api/freemarker/template/utility/package-tree.html deleted file mode 100644 index 451d898..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/package-tree.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - -freemarker.template.utility Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Hierarchy For Package freemarker.template.utility

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/freemarker/template/utility/package-use.html b/fmpp/docs/freemarker/api/freemarker/template/utility/package-use.html deleted file mode 100644 index 579c87f..0000000 --- a/fmpp/docs/freemarker/api/freemarker/template/utility/package-use.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - -Uses of Package freemarker.template.utility (FreeMarker 2.3.21 API) - - - - - - - - - - - -
    -

    Uses of Package
    freemarker.template.utility

    -
    -
    - -
    - - - - - - diff --git a/fmpp/docs/freemarker/api/help-doc.html b/fmpp/docs/freemarker/api/help-doc.html deleted file mode 100644 index 7c6a7ba..0000000 --- a/fmpp/docs/freemarker/api/help-doc.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -API Help (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - -
    -

    How This API Document Is Organized

    -
    This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
    -
    -
    -
      -
    • -

      Overview

      -

      The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

      -
    • -
    • -

      Package

      -

      Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

      -
        -
      • Interfaces (italic)
      • -
      • Classes
      • -
      • Enums
      • -
      • Exceptions
      • -
      • Errors
      • -
      • Annotation Types
      • -
      -
    • -
    • -

      Class/Interface

      -

      Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

      -
        -
      • Class inheritance diagram
      • -
      • Direct Subclasses
      • -
      • All Known Subinterfaces
      • -
      • All Known Implementing Classes
      • -
      • Class/interface declaration
      • -
      • Class/interface description
      • -
      -
        -
      • Nested Class Summary
      • -
      • Field Summary
      • -
      • Constructor Summary
      • -
      • Method Summary
      • -
      -
        -
      • Field Detail
      • -
      • Constructor Detail
      • -
      • Method Detail
      • -
      -

      Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

      -
    • -
    • -

      Annotation Type

      -

      Each annotation type has its own separate page with the following sections:

      -
        -
      • Annotation Type declaration
      • -
      • Annotation Type description
      • -
      • Required Element Summary
      • -
      • Optional Element Summary
      • -
      • Element Detail
      • -
      -
    • -
    • -

      Enum

      -

      Each enum has its own separate page with the following sections:

      -
        -
      • Enum declaration
      • -
      • Enum description
      • -
      • Enum Constant Summary
      • -
      • Enum Constant Detail
      • -
      -
    • -
    • -

      Use

      -

      Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

      -
    • -
    • -

      Tree (Class Hierarchy)

      -

      There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

      -
        -
      • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
      • -
      • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
      • -
      -
    • -
    • -

      Deprecated API

      -

      The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

      -
    • -
    • -

      Index

      -

      The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

      -
    • -
    • -

      Prev/Next

      -

      These links take you to the next or previous class, interface, package, or related page.

      -
    • -
    • -

      Frames/No Frames

      -

      These links show and hide the HTML frames. All pages are available with or without frames.

      -
    • -
    • -

      All Classes

      -

      The All Classes link shows all classes and interfaces except non-static nested types.

      -
    • -
    • -

      Serialized Form

      -

      Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

      -
    • -
    • -

      Constant Field Values

      -

      The Constant Field Values page lists the static final fields and their values.

      -
    • -
    -This help file applies to API documentation generated using the standard doclet.
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/index-all.html b/fmpp/docs/freemarker/api/index-all.html deleted file mode 100644 index d85c5cd..0000000 --- a/fmpp/docs/freemarker/api/index-all.html +++ /dev/null @@ -1,5574 +0,0 @@ - - - - - - -Index (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - -
    A B C D E F G H I J K L M N O P R S T U V W X Z _  - - -

    A

    -
    -
    ACCURACY_HOURS - Static variable in class freemarker.template.utility.DateUtil
    -
    -
    Show hours (24h); always 2 digits, like 00, 05, etc.
    -
    -
    ACCURACY_MILLISECONDS - Static variable in class freemarker.template.utility.DateUtil
    -
    -
    Show hours, minutes and seconds and up to 3 fraction second digits, without trailing 0-s in the fraction part.
    -
    -
    ACCURACY_MILLISECONDS_FORCED - Static variable in class freemarker.template.utility.DateUtil
    -
    -
    Show hours, minutes and seconds and exactly 3 fraction second digits (even if it's 000)
    -
    -
    ACCURACY_MINUTES - Static variable in class freemarker.template.utility.DateUtil
    -
    -
    Show hours and minutes (even if minutes is 00).
    -
    -
    ACCURACY_SECONDS - Static variable in class freemarker.template.utility.DateUtil
    -
    -
    Show hours, minutes and seconds (even if seconds is 00).
    -
    -
    AdapterTemplateModel - Interface in freemarker.template
    -
    -
    A TemplateModel that can be unwrapped and then it considers a provided desired (hint) class.
    -
    -
    add(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    add(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    add(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    add(Object) - Method in class freemarker.template.SimpleSequence
    -
    -
    Adds an arbitrary object to the end of this SimpleSequence.
    -
    -
    add(boolean) - Method in class freemarker.template.SimpleSequence
    -
    -
    Adds a boolean to the end of this SimpleSequence, by - coercing the boolean into TemplateBooleanModel.TRUE or - TemplateBooleanModel.FALSE.
    -
    -
    add_escapes(String) - Method in exception freemarker.core.ParseException
    -
    -
    Used to convert raw characters to their escaped version - when these raw version cannot be used as part of an ASCII - string literal.
    -
    -
    addAutoImport(String, String) - Method in class freemarker.template.Configuration
    -
    -
    Adds an invisible #import templateName as namespaceVarName at the beginning of all - templates.
    -
    -
    addAutoInclude(String) - Method in class freemarker.template.Configuration
    -
    -
    Adds an invisible #include templateName as namespaceVarName at the beginning of all - templates.
    -
    -
    addBreakpoint(Breakpoint) - Method in interface freemarker.debug.Debugger
    -
    -
    Adds a breakpoint
    -
    -
    addConfiguredJython(JythonAntTask) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    addConfiguredPrepareEnvironment(JythonAntTask) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    addConfiguredPrepareModel(JythonAntTask) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    addDebuggerListener(DebuggerListener) - Method in interface freemarker.debug.Debugger
    -
    -
    Adds a listener for debugger events.
    -
    -
    addImport(LibraryLoad) - Method in class freemarker.template.Template
    -
    -
    Called by code internally to maintain - a list of imports
    -
    -
    addMacro(Macro) - Method in class freemarker.template.Template
    -
    -
    Called by code internally to maintain - a table of macros
    -
    -
    addPrefixNSMapping(String, String) - Method in class freemarker.template.Template
    -
    -
    This is used internally.
    -
    -
    addText(String) - Method in class freemarker.ext.ant.JythonAntTask
    -
     
    -
    afterBody() - Method in interface freemarker.template.TransformControl
    -
    -
    Called after the body has been evaluated.
    -
    -
    AllHttpScopesHashModel - Class in freemarker.ext.servlet
    -
    -
    An extension of SimpleHash that looks up keys in the hash, then in the - request, session, and servlet context scopes.
    -
    -
    AllHttpScopesHashModel(ObjectWrapper, ServletContext, HttpServletRequest) - Constructor for class freemarker.ext.servlet.AllHttpScopesHashModel
    -
    -
    Creates a new instance of AllHttpScopesHashModel for handling a single - HTTP servlet request.
    -
    -
    ALLOWS_NOTHING_RESOLVER - Static variable in interface freemarker.core.TemplateClassResolver
    -
    -
    Doesn't allow resolving any classes.
    -
    -
    ANGLE_BRACKET_TAG_SYNTAX - Static variable in class freemarker.template.Configuration
    -
     
    -
    applyEqualsOperator(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL "==" operator.
    -
    -
    applyEqualsOperatorLenient(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL "==" operator, except that if the two types - are incompatible, they are treated as non-equal instead of throwing an exception.
    -
    -
    applyGreaterThanOperator(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL ">" operator.
    -
    -
    applyLessThanOperator(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL "<" operator.
    -
    -
    applyLessThanOrEqualsOperator(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL "<" operator.
    -
    -
    applyWithGreaterThanOrEqualsOperator(TemplateModel, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Compares two TemplateModel-s according the rules of the FTL ">=" operator.
    -
    -
    ARITHMETIC_ENGINE_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    ArithmeticEngine - Class in freemarker.core
    -
    -
    Class to perform arithmetic operations.
    -
    -
    ArithmeticEngine() - Constructor for class freemarker.core.ArithmeticEngine
    -
     
    -
    ArithmeticEngine.BigDecimalEngine - Class in freemarker.core
    -
    -
    This is the default arithmetic engine in FreeMarker.
    -
    -
    ArithmeticEngine.ConservativeEngine - Class in freemarker.core
    -
    -
    An arithmetic engine that conservatively widens the operation arguments - to extent that they can hold the result of the operation.
    -
    -
    ArrayModel - Class in freemarker.ext.beans
    -
    -
    A class that will wrap an arbitrary array into TemplateCollectionModel - and TemplateSequenceModel interfaces.
    -
    -
    ArrayModel(Object, BeansWrapper) - Constructor for class freemarker.ext.beans.ArrayModel
    -
    -
    Creates a new model that wraps the specified array object.
    -
    -
    attributeAdded(ServletContextAttributeEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    attributeAdded(HttpSessionBindingEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    attributeRemoved(ServletContextAttributeEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    attributeRemoved(HttpSessionBindingEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    attributeReplaced(ServletContextAttributeEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    attributeReplaced(HttpSessionBindingEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    AUTO_DETECT_TAG_SYNTAX - Static variable in class freemarker.template.Configuration
    -
     
    -
    AUTO_FLUSH_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    AUTO_IMPORT_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    AUTO_INCLUDE_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    - - - -

    B

    -
    -
    baseDir - Variable in class freemarker.cache.FileTemplateLoader
    -
     
    -
    BeanModel - Class in freemarker.ext.beans
    -
    -
    A class that will wrap an arbitrary object into TemplateHashModel - interface allowing calls to arbitrary property getters and invocation of - accessible methods on the object from a template using the - object.foo to access properties and object.bar(arg1, arg2) to - invoke methods on it.
    -
    -
    BeanModel(Object, BeansWrapper) - Constructor for class freemarker.ext.beans.BeanModel
    -
    -
    Creates a new model that wraps the specified object.
    -
    -
    BEANS_WRAPPER - Static variable in interface freemarker.template.ObjectWrapper
    -
    -
    Deprecated. -
    Use BeansWrapperBuilder.build() instead; this instance isn't read-only - and thus can't be trusted.
    -
    -
    -
    BeansModelCache - Class in freemarker.ext.beans
    -
     
    -
    BeansWrapper - Class in freemarker.ext.beans
    -
    -
    ObjectWrapper that is able to expose the Java API of arbitrary Java objects.
    -
    -
    BeansWrapper() - Constructor for class freemarker.ext.beans.BeansWrapper
    -
    -
    Deprecated. - -
    -
    -
    BeansWrapper(Version) - Constructor for class freemarker.ext.beans.BeansWrapper
    -
    -
    Use BeansWrapperBuilder instead of the public constructors if possible.
    -
    -
    BeansWrapper(BeansWrapperConfiguration, boolean) - Constructor for class freemarker.ext.beans.BeansWrapper
    -
    -
    Initializes the instance based on the the BeansWrapperConfiguration specified.
    -
    -
    BeansWrapper.MethodAppearanceDecision - Class in freemarker.ext.beans
    -
    - -
    -
    BeansWrapper.MethodAppearanceDecisionInput - Class in freemarker.ext.beans
    -
    - -
    -
    BeansWrapperBuilder - Class in freemarker.ext.beans
    -
    -
    Gets/creates a BeansWrapper singleton instance that's already configured as specified in the properties of - this object; this is recommended over using the BeansWrapper constructors.
    -
    -
    BeansWrapperBuilder(Version) - Constructor for class freemarker.ext.beans.BeansWrapperBuilder
    -
    - -
    -
    BeansWrapperConfiguration - Class in freemarker.ext.beans
    -
    -
    Holds BeansWrapper configuration settings and defines their defaults.
    -
    -
    BeansWrapperConfiguration(Version) - Constructor for class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    BIGDECIMAL_ENGINE - Static variable in class freemarker.core.ArithmeticEngine
    -
    -
    Arithmetic engine that converts all numbers to BigDecimal and - then operates on them.
    -
    -
    BigDecimalEngine() - Constructor for class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    BOOLEAN_FORMAT_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    BooleanModel - Class in freemarker.ext.beans
    -
    -
    A class that will wrap instances of Boolean into a - TemplateBooleanModel.
    -
    -
    BooleanModel(Boolean, BeansWrapper) - Constructor for class freemarker.ext.beans.BooleanModel
    -
     
    -
    boxingClassToPrimitiveClass(Class) - Static method in class freemarker.template.utility.ClassUtil
    -
    - -
    -
    Breakpoint - Class in freemarker.debug
    -
    -
    Represents a breakpoint location consisting of a template name and a line number.
    -
    -
    Breakpoint(String, int) - Constructor for class freemarker.debug.Breakpoint
    -
    -
    Creates a new breakpoint.
    -
    -
    BugException - Exception in freemarker.core
    -
    -
    An unexpected state was reached that is certainly caused by a bug in FreeMarker.
    -
    -
    BugException() - Constructor for exception freemarker.core.BugException
    -
     
    -
    BugException(String) - Constructor for exception freemarker.core.BugException
    -
     
    -
    BugException(Throwable) - Constructor for exception freemarker.core.BugException
    -
     
    -
    BugException(String, Throwable) - Constructor for exception freemarker.core.BugException
    -
     
    -
    BugException(int) - Constructor for exception freemarker.core.BugException
    -
     
    -
    build() - Method in class freemarker.ext.beans.BeansWrapperBuilder
    -
    -
    Returns a BeansWrapper instance that matches the settings of this builder.
    -
    -
    build() - Method in class freemarker.template.DefaultObjectWrapperBuilder
    -
    -
    Returns a DefaultObjectWrapper instance that matches the settings of this builder.
    -
    -
    - - - -

    C

    -
    -
    CACHE_STORAGE_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    CacheStorage - Interface in freemarker.cache
    -
    -
    Cache storage abstracts away the storage aspects of a cache - associating - an object with a key, retrieval and removal via the key.
    -
    -
    CacheStorageWithGetSize - Interface in freemarker.cache
    -
    -
    A cache storage that has a getSize() method for returning the current number of cache entries.
    -
    -
    calculate(int, int, int, int, int, int, int, int, boolean, TimeZone) - Method in interface freemarker.template.utility.DateUtil.CalendarFieldsToDateConverter
    -
    -
    Calculates the Date from the specified calendar fields.
    -
    -
    calculate(int, int, int, int, int, int, int, int, boolean, TimeZone) - Method in class freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter
    -
     
    -
    canonicalizePrefix(String) - Static method in class freemarker.cache.URLTemplateLoader
    -
    -
    Can be used by subclasses to canonicalize URL path prefixes.
    -
    -
    capitalize(String) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    CaptureOutput - Class in freemarker.template.utility
    -
    -
    Deprecated. -
    Use block-assignments instead, like <assign x>...</assign>.
    -
    -
    -
    CaptureOutput() - Constructor for class freemarker.template.utility.CaptureOutput
    -
    -
    Deprecated.
    -
    check(String, Object) - Static method in exception freemarker.template.utility.NullArgumentException
    -
    -
    Convenience method to protect against a null argument.
    -
    -
    checkModifiable() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    If this object is already read-only according to WriteProtectable, throws IllegalStateException, - otherwise does nothing.
    -
    -
    chomp(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Removes the line-break from the end of the string.
    -
    -
    CLASSIC_COMPATIBLE_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    classIntrospectorFactory - Variable in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    ClassTemplateLoader - Class in freemarker.cache
    -
    -
    A TemplateLoader that uses streams reachable through - Class.getResourceAsStream(String) as its source of templates.
    -
    -
    ClassTemplateLoader() - Constructor for class freemarker.cache.ClassTemplateLoader
    -
    -
    Deprecated. -
    confusing constructor, and seldom useful; - use ClassTemplateLoader.ClassTemplateLoader(Class, String) instead.
    -
    -
    -
    ClassTemplateLoader(Class) - Constructor for class freemarker.cache.ClassTemplateLoader
    -
    -
    Deprecated. -
    it's confusing that the base path is ""; - use ClassTemplateLoader.ClassTemplateLoader(Class, String) instead.
    -
    -
    -
    ClassTemplateLoader(Class, String) - Constructor for class freemarker.cache.ClassTemplateLoader
    -
    -
    Creates a template loader that will use the Class.getResource(String) method - of the specified class to load the resources, and the specified base path (absolute or relative).
    -
    -
    ClassUtil - Class in freemarker.template.utility
    -
     
    -
    clear() - Method in interface freemarker.cache.CacheStorage
    -
     
    -
    clear() - Method in class freemarker.cache.MruCacheStorage
    -
     
    -
    clear() - Method in class freemarker.cache.NullCacheStorage
    -
     
    -
    clear() - Method in class freemarker.cache.SoftCacheStorage
    -
     
    -
    clear() - Method in class freemarker.cache.StrongCacheStorage
    -
     
    -
    clear() - Method in class freemarker.cache.TemplateCache
    -
    -
    Removes all entries from the cache, forcing reloading of templates - on subsequent TemplateCache.getTemplate(String, Locale, String, boolean) - calls.
    -
    -
    clear() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Removes all mappings from this map.
    -
    -
    clearCache() - Method in class freemarker.ext.util.ModelCache
    -
     
    -
    clearClassIntrospecitonCache() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Removes all class introspection data from the cache.
    -
    -
    clearEncodingMap() - Method in class freemarker.template.Configuration
    -
    -
    Clears language-to-encoding map.
    -
    -
    clearSharedVariables() - Method in class freemarker.template.Configuration
    -
    -
    Removes all shared sharedVariables, except the predefined ones (compress, html_escape, etc.).
    -
    -
    clearTemplateCache() - Method in class freemarker.template.Configuration
    -
    -
    Removes all entries from the template cache, thus forcing reloading of templates - on subsequent getTemplate calls.
    -
    -
    clone() - Method in class freemarker.core.Configurable
    -
     
    -
    clone(boolean) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    clone() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns a shallow copy of this IdentityHashMap instance: the keys and - values themselves are not cloned.
    -
    -
    clone() - Method in class freemarker.template.Configuration
    -
     
    -
    close() - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    closeTemplateSource(Object) - Method in class freemarker.cache.FileTemplateLoader
    -
     
    -
    closeTemplateSource(Object) - Method in class freemarker.cache.MultiTemplateLoader
    -
     
    -
    closeTemplateSource(Object) - Method in class freemarker.cache.StringTemplateLoader
    -
     
    -
    closeTemplateSource(Object) - Method in interface freemarker.cache.TemplateLoader
    -
    -
    Closes the template source.
    -
    -
    closeTemplateSource(Object) - Method in class freemarker.cache.URLTemplateLoader
    -
     
    -
    closeTemplateSource(Object) - Method in class freemarker.cache.WebappTemplateLoader
    -
     
    -
    coerceBigDecimal(BigDecimal, Class) - Static method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    coerceBigDecimals(AccessibleObject, Object[]) - Static method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Converts any BigDecimals in the passed array to the type of - the corresponding formal argument of the method.
    -
    -
    coerceBigDecimals(Class[], Object[]) - Static method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Converts any BigDecimals in the passed array to the type of - the corresponding formal argument of the method.
    -
    -
    CollectionModel - Class in freemarker.ext.beans
    -
    -
    A special case of BeanModel that can wrap Java collections - and that implements the TemplateCollectionModel in order to be usable - in a <#list> block.
    -
    -
    CollectionModel(Collection, BeansWrapper) - Constructor for class freemarker.ext.beans.CollectionModel
    -
    -
    Creates a new model that wraps the specified collection object.
    -
    -
    Collections12 - Class in freemarker.template.utility
    -
    -
    Deprecated. -
    Not needed anymore, as FreeMarker now requires higher than Java 1.3
    -
    -
    -
    CollectionUtils - Class in freemarker.template.utility
    -
     
    -
    columnNumber - Variable in exception freemarker.core.ParseException
    -
     
    -
    CommandLine - Class in freemarker.core
    -
    -
    Deprecated. -
    Will be removed, as a main method in a server-side library is marked as a security issue by many tools.
    -
    -
    -
    CommandLine() - Constructor for class freemarker.core.CommandLine
    -
    -
    Deprecated.
    -
    compareNumbers(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    compareNumbers(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    compareNumbers(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    compareTo(Object) - Method in class freemarker.debug.Breakpoint
    -
     
    -
    ConcurrentCacheStorage - Interface in freemarker.cache
    -
    -
    An optional interface for cache storage that knows whether it can be - concurrently accessible without synchronization.
    -
    -
    Configurable - Class in freemarker.core
    -
    -
    This is a common superclass of Configuration, - Template, and Environment classes.
    -
    -
    Configurable() - Constructor for class freemarker.core.Configurable
    -
    -
    Deprecated. -
    This shouldn't even be public; don't use it.
    -
    -
    -
    Configurable(Version) - Constructor for class freemarker.core.Configurable
    -
    -
    Intended to be called from inside FreeMarker only.
    -
    -
    Configurable(Configurable) - Constructor for class freemarker.core.Configurable
    -
    -
    Creates a new instance.
    -
    -
    Configurable.SettingValueAssignmentException - Exception in freemarker.core
    -
    -
    The setting name was recognized, but its value couldn't be parsed or the setting couldn't be set for some - other reason.
    -
    -
    Configurable.UnknownSettingException - Exception in freemarker.core
    -
    -
    The setting name was not recognized.
    -
    -
    Configuration - Class in freemarker.template
    -
    -
    The main entry point into the FreeMarker API; encapsulates the configuration settings of FreeMarker, - also serves as a central template-loading and caching service.
    -
    -
    Configuration() - Constructor for class freemarker.template.Configuration
    -
    -
    Deprecated. - -
    -
    -
    Configuration(Version) - Constructor for class freemarker.template.Configuration
    -
    -
    Creates a new instance and sets which of the non-backward-compatible bugfixes/improvements should be enabled.
    -
    -
    CONSERVATIVE_ENGINE - Static variable in class freemarker.core.ArithmeticEngine
    -
    -
    Arithmetic engine that uses (more-or-less) the widening conversions of - Java language to determine the type of result of operation, instead of - converting everything to BigDecimal up front.
    -
    -
    ConservativeEngine() - Constructor for class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    Constants - Class in freemarker.template.utility
    -
    -
    Frequently used constant TemplateModel values.
    -
    -
    Constants() - Constructor for class freemarker.template.utility.Constants
    -
     
    -
    containingElements(int, int) - Method in class freemarker.template.Template
    -
    -
    Deprecated. -
    This method will return TemplateElement starting from 2.4, as that doesn't require Swing; - don't use it.
    -
    -
    -
    containsKey(Object) - Method in class freemarker.ext.beans.HashAdapter
    -
     
    -
    containsKey(Object) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns true if this map contains a mapping for the specified - key.
    -
    -
    containsKey(String) - Method in class freemarker.template.SimpleHash
    -
    -
    Tells if the map contains a key or not, regardless if the associated value is null or not.
    -
    -
    containsValue(Object) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns true if this map maps one or more keys to the - specified value.
    -
    -
    contextDestroyed(ServletContextEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    contextInitialized(ServletContextEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    convertArray(Object) - Method in class freemarker.template.DefaultObjectWrapper
    -
    -
    Converts an array to a java.util.List
    -
    -
    convertValueToText(Object, boolean, boolean, boolean, int, boolean) - Method in class freemarker.core.FreeMarkerTree
    -
    -
    Deprecated.
    -
    copyMap(Map) - Method in class freemarker.template.SimpleHash
    -
     
    -
    create() - Method in class freemarker.core.CustomAttribute
    -
    -
    This method is invoked when CustomAttribute.get() is invoked without - CustomAttribute.set(Object) being invoked before it to define the value in the - current scope.
    -
    -
    create(Object) - Method in class freemarker.ext.beans.BeansModelCache
    -
     
    -
    create(Object) - Method in class freemarker.ext.util.ModelCache
    -
     
    -
    create(Object, ObjectWrapper) - Method in interface freemarker.ext.util.ModelFactory
    -
    -
    Create a wrapping model for the specified object that belongs to - the specified wrapper.
    -
    -
    createConfiguration() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    This method is called from FreemarkerServlet.init() to create the - FreeMarker configuration object that this servlet will use - for template loading.
    -
    -
    createLegacyDefaultTemplateLoader() - Static method in class freemarker.cache.TemplateCache
    -
    -
    Creates the default TemplateLoader used in 2.3.0-compatible mode.
    -
    -
    createModel(ObjectWrapper, ServletContext, HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    createObjectWrapper() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    This method is called from FreemarkerServlet.init() to create the - FreeMarker object wrapper object that this servlet will use - for adapting request, session, and servlet context attributes into - template models..
    -
    -
    createProcessingEnvironment(Object, Writer, ObjectWrapper) - Method in class freemarker.template.Template
    -
    -
    Creates a Environment object, using this template, the data-model provided as - parameter.
    -
    -
    createProcessingEnvironment(Object, Writer) - Method in class freemarker.template.Template
    -
    - -
    -
    createRequestParametersHashModel(HttpServletRequest) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    createTemplateLoader(String) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Create the template loader.
    -
    -
    currentToken - Variable in exception freemarker.core.ParseException
    -
    -
    This is the last token that has been consumed successfully.
    -
    -
    CustomAttribute - Class in freemarker.core
    -
    -
    A class that allows one to associate custom data with a configuration, - a template, or environment.
    -
    -
    CustomAttribute(int) - Constructor for class freemarker.core.CustomAttribute
    -
    -
    Creates a new custom attribute with the specified scope
    -
    -
    - - - -

    D

    -
    -
    DATE - Static variable in interface freemarker.template.TemplateDateModel
    -
    -
    The date model represents a date value (no time part).
    -
    -
    DATE_FORMAT_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    DateModel - Class in freemarker.ext.beans
    -
    -
    Wraps arbitrary subclass of Date into a reflective model.
    -
    -
    DateModel(Date, BeansWrapper) - Constructor for class freemarker.ext.beans.DateModel
    -
    -
    Creates a new model that wraps the specified date object.
    -
    -
    DateParseException(String) - Constructor for exception freemarker.template.utility.DateUtil.DateParseException
    -
     
    -
    DATETIME - Static variable in interface freemarker.template.TemplateDateModel
    -
    -
    The date model represents a date-time value (also known as timestamp).
    -
    -
    DATETIME_FORMAT_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    dateToISO8601String(Date, boolean, boolean, boolean, int, TimeZone, DateUtil.DateToISO8601CalendarFactory) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Format a date, time or dateTime with one of the ISO 8601 extended - formats that is also compatible with the XML Schema format (as far as you - don't have dates in the BC era).
    -
    -
    dateToXSString(Date, boolean, boolean, boolean, int, TimeZone, DateUtil.DateToISO8601CalendarFactory) - Static method in class freemarker.template.utility.DateUtil
    -
    - -
    -
    DateUtil - Class in freemarker.template.utility
    -
    -
    Date and time related utilities.
    -
    -
    DateUtil.CalendarFieldsToDateConverter - Interface in freemarker.template.utility
    -
    -
    Used internally by DateUtil; don't use its implementations for anything else.
    -
    -
    DateUtil.DateParseException - Exception in freemarker.template.utility
    -
     
    -
    DateUtil.DateToISO8601CalendarFactory - Interface in freemarker.template.utility
    -
    -
    Used internally by DateUtil; don't use its implementations for - anything else.
    -
    -
    DateUtil.TrivialCalendarFieldsToDateConverter - Class in freemarker.template.utility
    -
    -
    Non-thread-safe implementation that hard-references a calendar internally.
    -
    -
    DateUtil.TrivialDateToISO8601CalendarFactory - Class in freemarker.template.utility
    -
    -
    Non-thread-safe factory that hard-references a calendar internally.
    -
    -
    debug - Variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    debug(String) - Method in class freemarker.log.Logger
    -
    -
    Logs a debugging message.
    -
    -
    debug(String, Throwable) - Method in class freemarker.log.Logger
    -
    -
    Logs a debugging message with accompanying throwable.
    -
    -
    DEBUG_HANDLER - Static variable in interface freemarker.template.TemplateExceptionHandler
    -
    -
    TemplateExceptionHandler useful when you developing non-HTML templates.
    -
    -
    DebuggedEnvironment - Interface in freemarker.debug
    -
    -
    Represents the debugger-side mirror of a debugged - Environment object in the remote VM.
    -
    -
    Debugger - Interface in freemarker.debug
    -
    -
    The main debugger interface.
    -
    -
    DebuggerClient - Class in freemarker.debug
    -
    -
    A utility class that allows you to connect to the FreeMarker debugger service - running on a specific host and port.
    -
    -
    DebuggerListener - Interface in freemarker.debug
    -
    -
    An interface for components that wish to receive debugging events.
    -
    -
    DebugModel - Interface in freemarker.debug
    -
    -
    Represents the debugger-side mirror of a TemplateModel object, a Template - object, or a Configuration object.
    -
    -
    deduceLocale(String, HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Returns the locale used for the - Configuration.getTemplate(String, Locale) call.
    -
    -
    deduceLocale(String) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    DeepUnwrap - Class in freemarker.template.utility
    -
    -
    Utility methods for unwrapping TemplateModel-s.
    -
    -
    DeepUnwrap() - Constructor for class freemarker.template.utility.DeepUnwrap
    -
     
    -
    DEFAULT_ENCODING_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    DEFAULT_INCOMPATIBLE_ENHANCEMENTS - Static variable in class freemarker.template.Configuration
    -
    - -
    -
    DEFAULT_INCOMPATIBLE_IMPROVEMENTS - Static variable in class freemarker.template.Configuration
    -
    -
    The default of Configuration.getIncompatibleImprovements(), currently new Version(2, 3, 0).
    -
    -
    DEFAULT_NAMESPACE_PREFIX - Static variable in class freemarker.template.Template
    -
     
    -
    DEFAULT_PORT - Static variable in interface freemarker.debug.Debugger
    -
     
    -
    DEFAULT_WRAPPER - Static variable in interface freemarker.template.ObjectWrapper
    -
    -
    Deprecated. -
    Use BeansWrapperBuilder.build() instead; this instance isn't - read-only and thus can't be trusted.
    -
    -
    -
    DefaultObjectWrapper - Class in freemarker.template
    -
    -
    The default implementation of the ObjectWrapper interface.
    -
    -
    DefaultObjectWrapper() - Constructor for class freemarker.template.DefaultObjectWrapper
    -
    - -
    -
    DefaultObjectWrapper(Version) - Constructor for class freemarker.template.DefaultObjectWrapper
    -
    -
    Use DefaultObjectWrapperBuilder instead if possible.
    -
    -
    DefaultObjectWrapper(BeansWrapperConfiguration, boolean) - Constructor for class freemarker.template.DefaultObjectWrapper
    -
    - -
    -
    DefaultObjectWrapperBuilder - Class in freemarker.template
    -
    -
    Gets/creates a DefaultObjectWrapper singleton instance that's already configured as specified in the - properties of this object; this is recommended over using the DefaultObjectWrapper constructors.
    -
    -
    DefaultObjectWrapperBuilder(Version) - Constructor for class freemarker.template.DefaultObjectWrapperBuilder
    -
     
    -
    divide(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    divide(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    divide(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    doAfterBody() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    doAutoImportsAndIncludes(Environment) - Method in class freemarker.core.Configurable
    -
     
    -
    doAutoImportsAndIncludes(Environment) - Method in class freemarker.template.Configuration
    -
     
    -
    doEndTag() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    doGet(HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    doInitBody() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    DOMNodeModel - Class in freemarker.template.utility
    -
    -
    A convenient wrapper class for wrapping a Node in the W3C DOM API.
    -
    -
    DOMNodeModel(Node) - Constructor for class freemarker.template.utility.DOMNodeModel
    -
     
    -
    doPost(HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    doStartTag() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    dump(PrintStream) - Method in class freemarker.template.Template
    -
    -
    Dump the raw template in canonical form.
    -
    -
    dump(Writer) - Method in class freemarker.template.Template
    -
    -
    Dump the raw template in canonical form.
    -
    -
    - - - -

    E

    -
    -
    EMPTY_CLASS_ARRAY - Static variable in class freemarker.template.utility.CollectionUtils
    -
     
    -
    EMPTY_COLLECTION - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    EMPTY_HASH - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    EMPTY_ITERATOR - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    EMPTY_MAP - Static variable in class freemarker.template.utility.Collections12
    -
    -
    Deprecated.
    -
    EMPTY_OBJECT_ARRAY - Static variable in class freemarker.template.utility.CollectionUtils
    -
     
    -
    EMPTY_SEQUENCE - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    EMPTY_STRING - Static variable in interface freemarker.template.TemplateScalarModel
    -
    -
    A constant value to use as the empty string.
    -
    -
    EMPTY_STRING - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    emptyToNull(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Converts a 0-length string to null, leaves the string as is otherwise.
    -
    -
    END_EVALUATION - Static variable in interface freemarker.template.TransformControl
    -
    -
    Constant returned from TransformControl.afterBody() that tells the - template engine to end the transform and close the writer.
    -
    -
    endColumnNumber - Variable in exception freemarker.core.ParseException
    -
     
    -
    endLineNumber - Variable in exception freemarker.core.ParseException
    -
     
    -
    entrySet() - Method in class freemarker.ext.beans.HashAdapter
    -
     
    -
    entrySet() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns a collection view of the mappings contained in this map.
    -
    -
    EnumerationModel - Class in freemarker.ext.beans
    -
    -
    A class that adds TemplateModelIterator functionality to the - Enumeration interface implementers.
    -
    -
    EnumerationModel(Enumeration, BeansWrapper) - Constructor for class freemarker.ext.beans.EnumerationModel
    -
    -
    Creates a new model that wraps the specified enumeration object.
    -
    -
    Environment - Class in freemarker.core
    -
    -
    Object that represents the runtime environment during template processing.
    -
    -
    Environment(Template, TemplateHashModel, Writer) - Constructor for class freemarker.core.Environment
    -
     
    -
    Environment.Namespace - Class in freemarker.core
    -
     
    -
    environmentSuspended(EnvironmentSuspendedEvent) - Method in interface freemarker.debug.DebuggerListener
    -
    -
    Called whenever an environment gets suspended (ie hits a breakpoint).
    -
    -
    EnvironmentSuspendedEvent - Class in freemarker.debug
    -
    -
    Event describing a suspension of an environment (ie because it hit a - breakpoint).
    -
    -
    EnvironmentSuspendedEvent(Object, String, int, DebuggedEnvironment) - Constructor for class freemarker.debug.EnvironmentSuspendedEvent
    -
     
    -
    eol - Variable in exception freemarker.core.ParseException
    -
    -
    The end of line string for this machine.
    -
    -
    equals(Object) - Method in class freemarker.debug.Breakpoint
    -
     
    -
    equals(Object) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    equals(Object) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    equals(Object) - Method in class freemarker.template.Version
    -
     
    -
    error(String) - Method in class freemarker.log.Logger
    -
    -
    Logs an error message.
    -
    -
    error(String, Throwable) - Method in class freemarker.log.Logger
    -
    -
    Logs an error message with accompanying throwable.
    -
    -
    EVALUATE_BODY - Static variable in interface freemarker.template.TransformControl
    -
    -
    Constant returned from TransformControl.onStart() that tells the - template engine to evaluate the body.
    -
    -
    EventForwarding - Class in freemarker.ext.jsp
    -
    -
    An instance of this class should be registered as a <listener> in - the web.xml descriptor in order to correctly dispatch events to - event listeners that are specified in TLD files.
    -
    -
    EventForwarding() - Constructor for class freemarker.ext.jsp.EventForwarding
    -
     
    -
    exec(List) - Method in class freemarker.ext.beans.MapModel
    -
    -
    The first argument is used as a key to call the map's get method.
    -
    -
    exec(List) - Method in class freemarker.ext.beans.OverloadedMethodsModel
    -
    -
    Invokes the method, passing it the arguments from the list.
    -
    -
    exec(List) - Method in class freemarker.ext.beans.ResourceBundleModel
    -
    -
    Takes first argument as a resource key, looks up a string in resource bundle - with this key, then applies a MessageFormat.format on the string with the - rest of the arguments.
    -
    -
    exec(List) - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    exec(List) - Method in class freemarker.ext.beans.SimpleMethodModel
    -
    -
    Invokes the method, passing it the arguments from the list.
    -
    -
    exec(List) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    exec(List) - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Applies an XPath expression to the node list and returns the resulting node list.
    -
    -
    exec(List) - Method in class freemarker.ext.jython.JythonModel
    -
     
    -
    exec(List) - Method in class freemarker.ext.rhino.RhinoFunctionModel
    -
     
    -
    exec(List) - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Evaluates an XPath expression on XML nodes in this model.
    -
    -
    exec(List) - Method in interface freemarker.template.TemplateMethodModel
    -
    -
    Deprecated.
    -
    Executes the method call.
    -
    -
    exec(List) - Method in interface freemarker.template.TemplateMethodModelEx
    -
    -
    Executes the method call.
    -
    -
    exec(List) - Method in class freemarker.template.utility.Execute
    -
    -
    Executes a method call.
    -
    -
    exec(List) - Method in class freemarker.template.utility.ObjectConstructor
    -
     
    -
    execute() - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    execute(Map) - Method in class freemarker.ext.ant.JythonAntTask
    -
     
    -
    execute(String, Map) - Method in class freemarker.ext.ant.UnlinkedJythonOperationsImpl
    -
     
    -
    execute(File, Map) - Method in class freemarker.ext.ant.UnlinkedJythonOperationsImpl
    -
     
    -
    execute(Environment, Map, TemplateModel[], TemplateDirectiveBody) - Method in class freemarker.ext.servlet.IncludePage
    -
     
    -
    execute(Environment, Map, TemplateModel[], TemplateDirectiveBody) - Method in interface freemarker.template.TemplateDirectiveModel
    -
    -
    Executes this user-defined directive; called by FreeMarker when the user-defined - directive is called in the template.
    -
    -
    Execute - Class in freemarker.template.utility
    -
    -
    Gives FreeMarker the the ability to execute external commands.
    -
    -
    Execute() - Constructor for class freemarker.template.utility.Execute
    -
     
    -
    executeQuery(Object, String) - Method in interface freemarker.ext.dom.XPathSupport
    -
     
    -
    expectedTokenSequences - Variable in exception freemarker.core.ParseException
    -
    -
    Each entry in this array is an array of integers.
    -
    -
    explainTypeError(Class[]) - Method in class freemarker.ext.beans.SimpleMethodModel
    -
    -
    Implementation of experimental interface; don't use it, no backward compatibility guarantee!
    -
    -
    explainTypeError(Class[]) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    EXPOSE_ALL - Static variable in class freemarker.ext.beans.BeansWrapper
    -
    -
    At this level of exposure, all methods and properties of the - wrapped objects are exposed to the template.
    -
    -
    EXPOSE_NOTHING - Static variable in class freemarker.ext.beans.BeansWrapper
    -
    -
    At this level of exposure, no bean properties and methods are exposed.
    -
    -
    EXPOSE_PROPERTIES_ONLY - Static variable in class freemarker.ext.beans.BeansWrapper
    -
    -
    At this level of exposure, only property getters are exposed.
    -
    -
    EXPOSE_SAFE - Static variable in class freemarker.ext.beans.BeansWrapper
    -
    -
    At this level of exposure, all methods and properties of the wrapped - objects are exposed to the template except methods that are deemed - not safe.
    -
    -
    - - - -

    F

    -
    -
    FALSE - Static variable in interface freemarker.template.TemplateBooleanModel
    -
    -
    A singleton object to represent boolean false
    -
    -
    FALSE - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    FileTemplateLoader - Class in freemarker.cache
    -
    -
    A TemplateLoader that uses files in a specified directory as the - source of templates.
    -
    -
    FileTemplateLoader() - Constructor for class freemarker.cache.FileTemplateLoader
    -
    -
    Creates a new file template cache that will use the current directory - (the value of the system property user.dir as the base - directory for loading templates.
    -
    -
    FileTemplateLoader(File) - Constructor for class freemarker.cache.FileTemplateLoader
    -
    -
    Creates a new file template loader that will use the specified directory - as the base directory for loading templates.
    -
    -
    FileTemplateLoader(File, boolean) - Constructor for class freemarker.cache.FileTemplateLoader
    -
    -
    Creates a new file template loader that will use the specified directory - as the base directory for loading templates.
    -
    -
    findTemplateSource(String) - Method in class freemarker.cache.FileTemplateLoader
    -
     
    -
    findTemplateSource(String) - Method in class freemarker.cache.MultiTemplateLoader
    -
     
    -
    findTemplateSource(String) - Method in class freemarker.cache.StringTemplateLoader
    -
     
    -
    findTemplateSource(String) - Method in interface freemarker.cache.TemplateLoader
    -
    -
    Finds the object that acts as the source of the template with the - given name.
    -
    -
    findTemplateSource(String) - Method in class freemarker.cache.URLTemplateLoader
    -
     
    -
    findTemplateSource(String) - Method in class freemarker.cache.WebappTemplateLoader
    -
     
    -
    finetuneMethodAppearance(Class, Method, BeansWrapper.MethodAppearanceDecision) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Deprecated. -
    Use BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner); - no need to extend this class anymore. - Soon this method will be final, so trying to override it will break your app. - Note that if the methodAppearanceFineTuner property is set to non-null, this method is not - called anymore.
    -
    -
    -
    flush() - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    format(String, Object[]) - Method in class freemarker.ext.beans.ResourceBundleModel
    -
    -
    Provides direct access to caching format engine from code (instead of from script).
    -
    -
    forName(String) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    Similar to Class.forName(java.lang.String), but attempts to load - through the thread context class loader.
    -
    -
    freemarker.cache - package freemarker.cache
    -
    -
    Template loading and caching.
    -
    -
    freemarker.core - package freemarker.core
    -
    -
    The seldom used or advanced parts of the fundamental FreeMarker API, compared to freemarker.template.
    -
    -
    freemarker.debug - package freemarker.debug
    -
    -
    Debugging API; experimental status, might change! -This is to support debugging in IDE-s.
    -
    -
    freemarker.ext.ant - package freemarker.ext.ant
    -
    -
    -Ant task to transform XML files -with a template; a more powerful alternative is FMPP.
    -
    -
    freemarker.ext.beans - package freemarker.ext.beans
    -
    -
    The default object wrapper of FreeMarker uses -this to expose Java Beans and POJO-s to templates, but it can also be used in itself as a -better alternative ObjectWrapper.
    -
    -
    freemarker.ext.dom - package freemarker.ext.dom
    -
    -
    Exposes DOM XML nodes to templates as easily traversable trees; -see in the Manual.
    -
    -
    freemarker.ext.jdom - package freemarker.ext.jdom
    -
    -
    Deprecated, use W3C DOM (freemarker.ext.dom) instead; -Exposes JDOM XML nodes to templates.
    -
    -
    freemarker.ext.jsp - package freemarker.ext.jsp
    -
    -
    -Classes for two-way FreeMarker-JSP integration.
    -
    -
    freemarker.ext.jython - package freemarker.ext.jython
    -
    -
    Exposes Jython objects to templates.
    -
    -
    freemarker.ext.rhino - package freemarker.ext.rhino
    -
    -
    Exposes Rhino (ECMAScript) objects to templates.
    -
    -
    freemarker.ext.servlet - package freemarker.ext.servlet
    -
    -
    Servlet for legacy "Model 2" frameworks that allows using FreeMarker -templates instead of JSP as the MVC View -(see in the Manual).
    -
    -
    freemarker.ext.util - package freemarker.ext.util
    -
    -
    Various classes used by freemarker.ext but might be useful outside it too.
    -
    -
    freemarker.ext.xml - package freemarker.ext.xml
    -
    -
    Deprecated, use W3C DOM with freemarker.ext.dom instead; -Exposes XML from DOM, dom4j or JDOM nodes, uniformly.
    -
    -
    freemarker.log - package freemarker.log
    -
    -
    -Logging facility; dispatches FreeMarker log messages to the chosen logger library.
    -
    -
    freemarker.template - package freemarker.template
    -
    -
    The fundamental, most commonly used API-s of FreeMarker; -start with Configuration (also see -Getting Stared in the Manual.)
    -
    -
    freemarker.template.utility - package freemarker.template.utility
    -
    -
    Various classes used by core FreeMarker code but might be useful outside of it too.
    -
    -
    FreemarkerServlet - Class in freemarker.ext.servlet
    -
    -
    This is a general-purpose FreeMarker view servlet.
    -
    -
    FreemarkerServlet() - Constructor for class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    FreemarkerTag - Class in freemarker.ext.jsp
    -
    -
    Simple implementation of JSP tag to allow use of FreeMarker templates in - JSP.
    -
    -
    FreemarkerTag() - Constructor for class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    FreeMarkerTree - Class in freemarker.core
    -
    -
    Deprecated. -
    Will be removed, as Swing classes aren't accessible on Google App Engine.
    -
    -
    -
    FreeMarkerTree(Template) - Constructor for class freemarker.core.FreeMarkerTree
    -
    -
    Deprecated.
    -
    FreemarkerXmlTask - Class in freemarker.ext.ant
    -
    -
    Deprecated. -
    FMPP is a more complete solution.
    -
    -
    -
    FreemarkerXmlTask() - Constructor for class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Constructor creates the SAXBuilder.
    -
    -
    FTLStringLiteralDec(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    FTL string literal decoding.
    -
    -
    FTLStringLiteralEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    - - - -

    G

    -
    -
    get(Object) - Method in interface freemarker.cache.CacheStorage
    -
     
    -
    get(Object) - Method in class freemarker.cache.MruCacheStorage
    -
     
    -
    get(Object) - Method in class freemarker.cache.NullCacheStorage
    -
     
    -
    get(Object) - Method in class freemarker.cache.SoftCacheStorage
    -
     
    -
    get(Object) - Method in class freemarker.cache.StrongCacheStorage
    -
     
    -
    get() - Method in class freemarker.core.CustomAttribute
    -
     
    -
    get(Template) - Method in class freemarker.core.CustomAttribute
    -
     
    -
    get(int) - Method in interface freemarker.debug.DebugModel
    -
     
    -
    get(int, int) - Method in interface freemarker.debug.DebugModel
    -
     
    -
    get(String) - Method in interface freemarker.debug.DebugModel
    -
     
    -
    get(String[]) - Method in interface freemarker.debug.DebugModel
    -
     
    -
    get(int) - Method in class freemarker.ext.beans.ArrayModel
    -
     
    -
    get(String) - Method in class freemarker.ext.beans.BeanModel
    -
    -
    Uses Beans introspection to locate a property or method with name - matching the key name.
    -
    -
    get(int) - Method in class freemarker.ext.beans.CollectionModel
    -
    -
    Retrieves the i-th object from the collection, wrapped as a TemplateModel.
    -
    -
    get(Object) - Method in class freemarker.ext.beans.HashAdapter
    -
     
    -
    get(int) - Method in class freemarker.ext.beans.OverloadedMethodsModel
    -
     
    -
    get(String) - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    get(int) - Method in class freemarker.ext.beans.SimpleMethodModel
    -
     
    -
    get(String) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    get(int) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    get(String) - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Provides node list traversal as well as special functions: filtering by name, - filtering by node type, shallow-copying, and duplicate removal.
    -
    -
    get(int) - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Retrieves the i-th element of the node list.
    -
    -
    get(String) - Method in class freemarker.ext.jsp.TaglibFactory
    -
    -
    Retrieves a JSP tag library identified by an URI.
    -
    -
    get(String) - Method in class freemarker.ext.jython.JythonModel
    -
    -
    Calls PyObject.__findattr__(java.lang.String), then if it - returns null calls PyObject.__finditem__(java.lang.String).
    -
    -
    get(int) - Method in class freemarker.ext.jython.JythonSequenceModel
    -
    -
    Returns PyObject.__finditem__(int).
    -
    -
    get(String) - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    get(int) - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    get(String) - Method in class freemarker.ext.servlet.AllHttpScopesHashModel
    -
     
    -
    get(String) - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    get(String) - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    get(String) - Method in class freemarker.ext.servlet.HttpSessionHashModel
    -
     
    -
    get(String) - Method in class freemarker.ext.servlet.ServletContextHashModel
    -
     
    -
    get(Object) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns the value to which this map maps the specified key.
    -
    -
    get(int) - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Selects a single node from this model's nodelist by its list index and - returns a new NodeListModel containing that single node.
    -
    -
    get(String) - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Returns a new NodeListModel containing the nodes that result from applying - an operator to this model's nodes.
    -
    -
    get(String) - Method in class freemarker.template.SimpleHash
    -
     
    -
    get(int) - Method in class freemarker.template.SimpleSequence
    -
     
    -
    get(String) - Method in interface freemarker.template.TemplateHashModel
    -
    -
    Gets a TemplateModel from the hash.
    -
    -
    get(int) - Method in class freemarker.template.TemplateModelListSequence
    -
     
    -
    get(int) - Method in interface freemarker.template.TemplateSequenceModel
    -
    -
    Retrieves the i-th template model in this sequence.
    -
    -
    get(TimeZone, Date) - Method in interface freemarker.template.utility.DateUtil.DateToISO8601CalendarFactory
    -
    -
    Returns a GregorianCalendar with the desired time zone and - time and US locale.
    -
    -
    get(TimeZone, Date) - Method in class freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory
    -
     
    -
    get(String) - Method in class freemarker.template.utility.DOMNodeModel
    -
     
    -
    getActualTagSyntax() - Method in class freemarker.template.Template
    -
    -
    Returns the tag syntax the parser has chosen for this template.
    -
    -
    getAdaptedObject(Class) - Method in class freemarker.ext.beans.BeanModel
    -
    -
    Returns the same as BeanModel.getWrappedObject(); to ensure that, this method will be final starting from 2.4.
    -
    -
    getAdaptedObject(Class) - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    getAdaptedObject(Class) - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getAdaptedObject(Class) - Method in class freemarker.ext.jython.JythonModel
    -
     
    -
    getAdaptedObject(Class) - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    getAdaptedObject(Class) - Method in interface freemarker.template.AdapterTemplateModel
    -
    -
    Retrieves the underlying object, or some other object semantically - equivalent to its value narrowed by the class hint.
    -
    -
    getArithmeticEngine() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getAsBoolean() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getAsBoolean() - Method in class freemarker.ext.beans.BooleanModel
    -
     
    -
    getAsBoolean() - Method in class freemarker.ext.beans.EnumerationModel
    -
    - -
    -
    getAsBoolean() - Method in class freemarker.ext.beans.IteratorModel
    -
    - -
    -
    getAsBoolean() - Method in class freemarker.ext.jython.JythonModel
    -
    -
    Returns the value of PyObject.__nonzero__().
    -
    -
    getAsBoolean() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    getAsBoolean() - Method in interface freemarker.template.TemplateBooleanModel
    -
     
    -
    getAsDate() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getAsDate() - Method in class freemarker.ext.beans.DateModel
    -
     
    -
    getAsDate() - Method in class freemarker.template.SimpleDate
    -
     
    -
    getAsDate() - Method in interface freemarker.template.TemplateDateModel
    -
    -
    Returns the date value.
    -
    -
    getAsNumber() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getAsNumber() - Method in class freemarker.ext.beans.NumberModel
    -
     
    -
    getAsNumber() - Method in class freemarker.ext.jython.JythonNumberModel
    -
    -
    Returns either PyObject.__tojava__(java.lang.Class) with - Number.class as argument.
    -
    -
    getAsNumber() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    getAsNumber() - Method in class freemarker.template.SimpleNumber
    -
     
    -
    getAsNumber() - Method in interface freemarker.template.TemplateNumberModel
    -
    -
    Returns the numeric value.
    -
    -
    getAsString() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getAsString() - Method in class freemarker.ext.beans.StringModel
    -
    -
    Returns the result of calling Object.toString() on the wrapped - object.
    -
    -
    getAsString() - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    This method returns the string resulting from concatenation - of string representations of its nodes.
    -
    -
    getAsString() - Method in class freemarker.ext.jython.JythonModel
    -
    -
    Returns the value of Object.toString().
    -
    -
    getAsString() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    getAsString() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Returns the string representation of the wrapped nodes.
    -
    -
    getAsString() - Method in class freemarker.template.LocalizedString
    -
     
    -
    getAsString() - Method in class freemarker.template.SimpleScalar
    -
     
    -
    getAsString() - Method in interface freemarker.template.TemplateScalarModel
    -
    -
    Returns the string representation of this model.
    -
    -
    getAutoFlush() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getBaseDirectory() - Method in class freemarker.cache.FileTemplateLoader
    -
    -
    Returns the base directory in which the templates are searched.
    -
    -
    getBlamedExpressionString() - Method in exception freemarker.template.TemplateException
    -
    -
    If there was a blamed expression attached to this exception, it returns its canonical form, otherwise it returns - null.
    -
    -
    getBooleanFormat() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getBreakpoints() - Method in interface freemarker.debug.Debugger
    -
    -
    Retrieves a list of all Breakpoint objects.
    -
    -
    getBreakpoints(String) - Method in interface freemarker.debug.Debugger
    -
    -
    Retrieves a list of all Breakpoint objects for the specified - template.
    -
    -
    getBuildDate() - Method in class freemarker.template.Version
    -
     
    -
    getBundle() - Method in class freemarker.ext.beans.ResourceBundleModel
    -
     
    -
    getCacheStorage() - Method in class freemarker.cache.TemplateCache
    -
     
    -
    getCacheStorage() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getCaching() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    getCauseException() - Method in exception freemarker.template.TemplateException
    -
    -
    Deprecated. -
    Java 1.4 has introduced Throwable.getCause() - use that instead, especially as this can't return - runtime exceptions and errors as is.
    -
    -
    -
    getChildNodes() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getChildNodes() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    getChildNodes() - Method in interface freemarker.template.TemplateNodeModel
    -
     
    -
    getClassicCompatibleAsInt() - Method in class freemarker.core.Configurable
    -
     
    -
    getCNumberFormat() - Method in class freemarker.core.Environment
    -
    -
    Returns the NumberFormat used for the c built-in.
    -
    -
    getCollection() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getColumnNumber() - Method in exception freemarker.core.ParseException
    -
    -
    1-based column number of the failing section, or 0 is the information is not available.
    -
    -
    getColumnNumber() - Method in exception freemarker.template.TemplateException
    -
    -
    1-based column number of the failing section, or null if the information is not available.
    -
    -
    getConfiguration() - Method in class freemarker.core.Environment
    -
     
    -
    getConfiguration() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Returns the Configuration object used by this servlet.
    -
    -
    getConfiguration() - Method in class freemarker.template.Template
    -
    -
    Returns the Configuration object associated with this template.
    -
    -
    getContainingClass() - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput
    -
     
    -
    getCorrectedNameForUnknownSetting(String) - Method in class freemarker.core.Configurable
    -
     
    -
    getCorrectedNameForUnknownSetting(String) - Method in class freemarker.template.Configuration
    -
     
    -
    getCurrentEnvironment() - Static method in class freemarker.core.Environment
    -
    -
    Retrieves the environment object associated with the current - thread.
    -
    -
    getCurrentNamespace() - Method in class freemarker.core.Environment
    -
    -
    Returns the main name-space.
    -
    -
    getCurrentVisitorNode() - Method in class freemarker.core.Environment
    -
     
    -
    getCustomAttribute(String) - Method in class freemarker.core.Configurable
    -
    -
    Retrieves a named custom attribute for this configurable.
    -
    -
    getCustomAttributeNames() - Method in class freemarker.core.Configurable
    -
    -
    Returns an array with names of all custom attributes defined directly - on this configurable.
    -
    -
    getDataModel() - Method in class freemarker.core.Environment
    -
     
    -
    getDateFormat() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getDateTimeFormat() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getDateType() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getDateType() - Method in class freemarker.ext.beans.DateModel
    -
     
    -
    getDateType() - Method in class freemarker.template.SimpleDate
    -
     
    -
    getDateType() - Method in interface freemarker.template.TemplateDateModel
    -
    -
    Returns the type of the date.
    -
    -
    getDebugger(InetAddress, int, String) - Static method in class freemarker.debug.DebuggerClient
    -
    -
    Connects to the FreeMarker debugger service running on a specific host - and port.
    -
    -
    getDefaultConfiguration() - Static method in class freemarker.template.Configuration
    -
    -
    Deprecated. -
    The usage of the static singleton (the "default") - Configuration instance can easily cause erroneous, unpredictable - behavior. This is because multiple independent software components may use - FreeMarker internally inside the same application, so they will interfere - because of the common Configuration instance. Each such component - should use its own private Configuration object instead, that it - typically creates with new Configuration() when the component - is initialized.
    -
    -
    -
    getDefaultDateType() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns the default date type.
    -
    -
    getDefaultDateType() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getDefaultEncoding() - Method in class freemarker.template.Configuration
    -
    -
    Gets the default encoding for converting bytes to characters when - reading template files in a locale for which no explicit encoding - was specified.
    -
    -
    getDefaultInstance() - Static method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Deprecated. -
    Use BeansWrapperBuilder instead. The instance returned here is not read-only, so it's - dangerous to use.
    -
    -
    -
    getDefaultNS() - Method in class freemarker.core.Environment
    -
     
    -
    getDefaultNS() - Method in class freemarker.template.Template
    -
     
    -
    getDefaultObjectWrapper(Version) - Static method in class freemarker.template.Configuration
    -
    -
    Returns the default object wrapper for a given "incompatible_improvements" version.
    -
    -
    getDefaultObjectWrapper() - Static method in class freemarker.template.WrappingTemplateModel
    -
    -
    Deprecated. -
    Don't depend on this object, as it can be replace by anybody in the same JVM.
    -
    -
    -
    getDelay() - Method in class freemarker.cache.TemplateCache
    -
    -
    Gets the delay in milliseconds between checking for newer versions of a - template source.
    -
    -
    getDocumentBuilderFactory() - Static method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getEditorMessage() - Method in exception freemarker.core.ParseException
    -
    -
    Returns the description of the error without error location or source quotations, or null if there's no - description available.
    -
    -
    getEncoding(Locale) - Method in class freemarker.template.Configuration
    -
    -
    Gets the preferred character encoding for the given locale, or the - default encoding if no encoding is set explicitly for the specified - locale.
    -
    -
    getEncoding() - Method in class freemarker.template.Template
    -
    -
    Returns the character encoding used for reading included files.
    -
    -
    getEndColumnNumber() - Method in exception freemarker.core.ParseException
    -
    -
    1-based column number of the last character of the failing section, or 0 if the information is not available.
    -
    -
    getEndColumnNumber() - Method in exception freemarker.template.TemplateException
    -
    -
    1-based column number of the last character of the failing template section, or null if the information - is not available.
    -
    -
    getEndLineNumber() - Method in exception freemarker.core.ParseException
    -
    -
    1-based line number of the last line that contains the failing section, or 0 if the information is not available.
    -
    -
    getEndLineNumber() - Method in exception freemarker.template.TemplateException
    -
    -
    1-based line number of the last line that contains the failing section, or null if the information is not - available.
    -
    -
    getEnumModels() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns a hash model that represents the so-called class enum models.
    -
    -
    getEnvironment() - Method in class freemarker.core.Configurable
    -
     
    -
    getEnvironment() - Method in class freemarker.debug.EnvironmentSuspendedEvent
    -
    -
    The environment that was suspended
    -
    -
    getEnvironment() - Method in exception freemarker.template.TemplateException
    -
     
    -
    getErrorHandler() - Static method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getExposeAsProperty() - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    getExposeFields() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getExposeMethodAs() - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    getExposureLevel() - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    getExposureLevel() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getExtraInfo() - Method in class freemarker.template.Version
    -
    -
    The arbitrary string after the micro version number without leading dot, dash or underscore, - like "RC03" in "2.4.0-RC03".
    -
    -
    getFTLInstructionStack() - Method in exception freemarker.template.TemplateException
    -
    -
    Returns the snapshot of the FTL stack trace at the time this exception was created.
    -
    -
    getFTLTypeDescription(TemplateModel) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    Returns the type description of a value with FTL terms (not plain class name), as it should be used in - type-related error messages and for debugging purposes.
    -
    -
    getFullTemplatePath(Environment, String, String) - Static method in class freemarker.cache.TemplateCache
    -
    -
    Resolves a path-like reference to a template (like the one used in #include or #import), assuming - a current directory.
    -
    -
    getGlobalNamespace() - Method in class freemarker.core.Environment
    -
    -
    Returns a fictitious name-space that contains the globally visible variables - that were created in the template, but not the variables of the data-model.
    -
    -
    getGlobalVariable(String) - Method in class freemarker.core.Environment
    -
    -
    Returns the globally visible variable of the given name (or null).
    -
    -
    getGlobalVariables() - Method in class freemarker.core.Environment
    -
    -
    Returns the read-only hash of globally visible variables.
    -
    -
    getId() - Method in interface freemarker.debug.DebuggedEnvironment
    -
    -
    Returns a unique identifier for this environment
    -
    -
    getImports() - Method in class freemarker.template.Template
    -
     
    -
    getIncompatibleEnhancements() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getIncompatibleImprovements() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns the version given with BeansWrapper.BeansWrapper(Version), normalized to the lowest version where a change - has occurred.
    -
    -
    getIncompatibleImprovements() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getIncompatibleImprovements() - Method in class freemarker.template.Configuration
    -
     
    -
    getInstance(Object, ModelFactory) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Deprecated. -
    override BeansWrapper.getModelFactory(Class) instead. Using this - method will now bypass wrapper caching (if it's enabled) and always - result in creation of a new wrapper. This method will be removed in 2.4
    -
    -
    -
    getInstance(Object) - Method in class freemarker.ext.util.ModelCache
    -
     
    -
    getKnownVariableNames() - Method in class freemarker.core.Environment
    -
    -
    Returns a set of variable names that are known at the time of call.
    -
    -
    getLastModified(Object) - Method in class freemarker.cache.FileTemplateLoader
    -
     
    -
    getLastModified(Object) - Method in class freemarker.cache.MultiTemplateLoader
    -
     
    -
    getLastModified(Object) - Method in class freemarker.cache.StringTemplateLoader
    -
     
    -
    getLastModified(Object) - Method in interface freemarker.cache.TemplateLoader
    -
    -
    Returns the time of last modification of the specified template source.
    -
    -
    getLastModified(Object) - Method in class freemarker.cache.URLTemplateLoader
    -
     
    -
    getLastModified(Object) - Method in class freemarker.cache.WebappTemplateLoader
    -
     
    -
    getLine() - Method in class freemarker.debug.Breakpoint
    -
    -
    Returns the line number of the breakpoint
    -
    -
    getLine() - Method in class freemarker.debug.EnvironmentSuspendedEvent
    -
    -
    The line number in the template where the execution of the environment - was suspended.
    -
    -
    getLineNumber() - Method in exception freemarker.core.ParseException
    -
    -
    1-based line number of the failing section, or 0 is the information is not available.
    -
    -
    getLineNumber() - Method in exception freemarker.template.TemplateException
    -
    -
    1-based line number of the failing section, or null if the information is not available.
    -
    -
    getLocale() - Method in class freemarker.core.Configurable
    -
    -
    Returns the assumed locale when searching for template files with no - explicit requested locale.
    -
    -
    getLocalizedLookup() - Method in class freemarker.cache.TemplateCache
    -
    -
    Returns if localized template lookup is enabled or not.
    -
    -
    getLocalizedLookup() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getLocalizedString(Locale) - Method in class freemarker.template.LocalizedString
    -
     
    -
    getLocalizedString(Locale) - Method in class freemarker.template.ResourceBundleLocalizedString
    -
     
    -
    getLocalVariable(String) - Method in class freemarker.core.Environment
    -
    -
    Returns the loop or macro local variable corresponding to this - variable name.
    -
    -
    getLocationString() - Method in class freemarker.debug.Breakpoint
    -
    -
    Returns the template name and the line number separated with a colon
    -
    -
    getLogger(String) - Static method in class freemarker.log.Logger
    -
    -
    Returns a logger for the specified category.
    -
    -
    getMacros() - Method in class freemarker.template.Template
    -
     
    -
    getMainNamespace() - Method in class freemarker.core.Environment
    -
    -
    Returns the main name-space.
    -
    -
    getMajor() - Method in class freemarker.template.Version
    -
    -
    The 1st version number, like 1 in "1.2.3".
    -
    -
    getMessage() - Method in exception freemarker.core.ParseException
    -
    -
    Returns the error location plus the error description.
    -
    -
    getMessage() - Method in exception freemarker.template.TemplateException
    -
     
    -
    getMessageWithoutStackTop() - Method in exception freemarker.template.TemplateException
    -
    -
    Similar to TemplateException.getMessage(), but it doesn't contain the position of the failing instruction at then end - of the text.
    -
    -
    getMethod() - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput
    -
     
    -
    getMethodAppearanceFineTuner() - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    getMethodAppearanceFineTuner() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getMethodShadowsProperty() - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    getMicro() - Method in class freemarker.template.Version
    -
    -
    The 3rd version number, like 3 in "1.2.3".
    -
    -
    getMinor() - Method in class freemarker.template.Version
    -
    -
    The 2nd version number, like 2 in "1.2.3".
    -
    -
    getModelFactory(Class) - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    getModelFactory(Class) - Method in class freemarker.ext.rhino.RhinoWrapper
    -
     
    -
    getModelTypes() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    getName() - Method in class freemarker.debug.EnvironmentSuspendedEvent
    -
    -
    The name of the template where the execution of the environment - was suspended
    -
    -
    getName() - Method in class freemarker.template.Template
    -
    -
    The usually path-like (or URL-like) identifier of the template, or possibly null for non-stored - templates.
    -
    -
    getNamespace(String) - Method in class freemarker.core.Environment
    -
    -
    Returns the name-space for the name if exists, or null.
    -
    -
    getNamespaceForPrefix(String) - Method in class freemarker.core.Environment
    -
     
    -
    getNamespaceForPrefix(String) - Method in class freemarker.template.Template
    -
     
    -
    getNewBuiltinClassResolver() - Method in class freemarker.core.Configurable
    -
    -
    Retrieves the TemplateClassResolver used - to resolve classes when "SomeClassName"?new is called in a template.
    -
    -
    getNode() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getNodeName() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    getNodeName() - Method in interface freemarker.template.TemplateNodeModel
    -
     
    -
    getNodeNamespace() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getNodeNamespace() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    getNodeNamespace() - Method in interface freemarker.template.TemplateNodeModel
    -
     
    -
    getNodeType() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getNodeType() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    getNodeType() - Method in interface freemarker.template.TemplateNodeModel
    -
     
    -
    getNumberFormat() - Method in class freemarker.core.Configurable
    -
    -
    Returns the default number format used to convert numbers to strings.
    -
    -
    getObjectWrapper() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getObjectWrapper() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    getObjectWrapper() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    getObjectWrapper() - Method in class freemarker.template.WrappingTemplateModel
    -
    -
    Returns the object wrapper instance used by this wrapping template model.
    -
    -
    getOut() - Method in class freemarker.core.Environment
    -
     
    -
    getOuterIdentity() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    By default returns this.
    -
    -
    getOuterIdentity() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getOutputEncoding() - Method in class freemarker.core.Configurable
    -
     
    -
    getParent() - Method in class freemarker.core.Configurable
    -
    -
    Returns the parent Configurable object of this object.
    -
    -
    getParent() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    getParentNode() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getParentNode() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    getParentNode() - Method in interface freemarker.template.TemplateNodeModel
    -
     
    -
    getParsedIncompatibleEnhancements() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getPlainTextTemplate(String, String, Configuration) - Static method in class freemarker.template.Template
    -
    -
    Returns a trivial template, one that is just a single block of - plain text, no dynamic content.
    -
    -
    getPrefixedName(String, String) - Method in class freemarker.template.Template
    -
     
    -
    getPrefixForNamespace(String) - Method in class freemarker.core.Environment
    -
     
    -
    getPrefixForNamespace(String) - Method in class freemarker.template.Template
    -
     
    -
    getPythonClassName(PyObject) - Method in class freemarker.ext.jython.JythonVersionAdapter
    -
    -
    Returns pyObject.__class__.__name__
    -
    -
    getReader(Object, String) - Method in class freemarker.cache.FileTemplateLoader
    -
     
    -
    getReader(Object, String) - Method in class freemarker.cache.MultiTemplateLoader
    -
     
    -
    getReader(Object, String) - Method in class freemarker.cache.StringTemplateLoader
    -
     
    -
    getReader(Object, String) - Method in interface freemarker.cache.TemplateLoader
    -
    -
    Returns the character stream of a template represented by the specified - template source.
    -
    -
    getReader(Object, String) - Method in class freemarker.cache.URLTemplateLoader
    -
     
    -
    getReader(Object, String) - Method in class freemarker.cache.WebappTemplateLoader
    -
     
    -
    getRequest() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    getResponse() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    getRootTreeNode() - Method in class freemarker.template.Template
    -
     
    -
    getServlet() - Method in class freemarker.ext.servlet.ServletContextHashModel
    -
    -
    Returns the underlying servlet.
    -
    -
    getSetting(String) - Method in class freemarker.core.Configurable
    -
    -
    Deprecated. -
    It's not possible in general to convert setting values to string, - and thus it's impossible to ensure that Configurable.setSetting(String, String) will work with - the returned value correctly.
    -
    -
    -
    getSettings() - Method in class freemarker.core.Configurable
    -
    -
    Deprecated. -
    This method was always defective, and certainly it always - will be. Don't use it. (Simply, it's hardly possible in general to - convert setting values to text in a way that ensures that - Configurable.setSettings(Properties) will work with them correctly.)
    -
    -
    -
    getSharedVariable(String) - Method in class freemarker.template.Configuration
    -
    -
    Gets a shared variable.
    -
    -
    getSharedVariableNames() - Method in class freemarker.template.Configuration
    -
    -
    Returns the set containing the names of all defined shared sharedVariables.
    -
    -
    getShortClassName(Class) - Static method in class freemarker.template.utility.ClassUtil
    -
    - -
    -
    getShortClassName(Class, boolean) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    Returns a class name without "java.lang." and "java.util." prefix, also shows array types in a format like - int[]; useful for printing class names in error messages.
    -
    -
    getShortClassNameOfObject(Object) - Static method in class freemarker.template.utility.ClassUtil
    -
    - -
    -
    getShortClassNameOfObject(Object, boolean) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    ClassUtil.getShortClassName(Class, boolean) called with object.getClass(), but returns the fictional - class name Null for a null value.
    -
    -
    getShowErrorTips() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getSignum(Number) - Static method in class freemarker.template.utility.NumberUtil
    -
     
    -
    getSize() - Method in interface freemarker.cache.CacheStorageWithGetSize
    -
    -
    Returns the current number of cache entries.
    -
    -
    getSize() - Method in class freemarker.cache.MruCacheStorage
    -
    -
    Returns a close approximation of the current number of cache entries.
    -
    -
    getSize() - Method in class freemarker.cache.NullCacheStorage
    -
    -
    Always returns 0.
    -
    -
    getSize() - Method in class freemarker.cache.SoftCacheStorage
    -
    -
    Returns a close approximation of the number of cache entries.
    -
    -
    getSize() - Method in class freemarker.cache.StrongCacheStorage
    -
    -
    Returns a close approximation of the number of cache entries.
    -
    -
    getSoftSize() - Method in class freemarker.cache.MruCacheStorage
    -
    -
    Returns a close approximation of the current number of soft cache entries.
    -
    -
    getSoftSizeLimit() - Method in class freemarker.cache.MruCacheStorage
    -
    -
    Returns the configured upper limit of the number of soft cache entries.
    -
    -
    getSource(int, int, int, int) - Method in class freemarker.template.Template
    -
    -
    Returns the template source at the location specified by the coordinates given, or null if unavailable.
    -
    -
    getSQLDateAndTimeTimeZone() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getStaticModels() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns a hash model that represents the so-called class static models.
    -
    -
    getStrictSyntaxMode() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getStrongSize() - Method in class freemarker.cache.MruCacheStorage
    -
    -
    Returns the current number of strong cache entries.
    -
    -
    getStrongSizeLimit() - Method in class freemarker.cache.MruCacheStorage
    -
    -
    Returns the configured upper limit of the number of strong cache entries.
    -
    -
    getSupportedBuiltInDirectiveNames() - Method in class freemarker.template.Configuration
    -
    -
    Returns the names of the directives that are predefined by FreeMarker.
    -
    -
    getSupportedBuiltInNames() - Method in class freemarker.template.Configuration
    -
    -
    Returns the names of the supported "built-ins".
    -
    -
    getSupportsIndexedAccess() - Method in class freemarker.ext.beans.CollectionModel
    -
    -
    Tells if CollectionModel.get(int) will always fail for this object.
    -
    -
    getSuspendedEnvironments() - Method in interface freemarker.debug.Debugger
    -
    -
    Retrieves a collection of all DebuggedEnvironment objects that - are currently suspended.
    -
    -
    getSystemProperty(String) - Static method in class freemarker.template.utility.SecurityUtilities
    -
     
    -
    getSystemProperty(String, String) - Static method in class freemarker.template.utility.SecurityUtilities
    -
     
    -
    getSystemProperty(String, int) - Static method in class freemarker.template.utility.SecurityUtilities
    -
     
    -
    getTagSyntax() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplate(String, Locale, String, boolean) - Method in class freemarker.cache.TemplateCache
    -
    -
    Retrieves the template with the given name (and according the specified further parameters) from the - template cache, loading it into the cache first if it's missing/staled.
    -
    -
    getTemplate() - Method in class freemarker.core.Environment
    -
    -
    Retrieves the currently processed template.
    -
    -
    getTemplate() - Method in class freemarker.core.Environment.Namespace
    -
     
    -
    getTemplate(String) - Method in class freemarker.template.Configuration
    -
    -
    Retrieves the template with the given name from the template cache, loading it into the cache first if it's - missing/staled.
    -
    -
    getTemplate(String, Locale) - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplate(String, String) - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplate(String, Locale, String) - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplate(String, Locale, String, boolean) - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplate(String, Locale, String, boolean, boolean) - Method in class freemarker.template.Configuration
    -
    -
    Retrieves the template with the given name (and according the specified further parameters) from the template - cache, loading it into the cache first if it's missing/staled.
    -
    -
    getTemplateExceptionHandler() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getTemplateForImporting(String) - Method in class freemarker.core.Environment
    -
    -
    Gets a template for importing; used with - Environment.importLib(Template importedTemplate, String namespace).
    -
    -
    getTemplateForInclusion(String, String, boolean) - Method in class freemarker.core.Environment
    -
    - -
    -
    getTemplateForInclusion(String, String, boolean, boolean) - Method in class freemarker.core.Environment
    -
    -
    Gets a template for inclusion; used with Environment.include(Template includedTemplate).
    -
    -
    getTemplateLoader() - Method in class freemarker.cache.TemplateCache
    -
     
    -
    getTemplateLoader() - Method in class freemarker.template.Configuration
    -
    - -
    -
    getTemplateModel() - Method in class freemarker.ext.beans.HashAdapter
    -
     
    -
    getTemplateModel() - Method in interface freemarker.template.TemplateModelAdapter
    -
     
    -
    getTemplateName() - Method in exception freemarker.core.ParseException
    -
    -
    Returns the name (template-root relative path) of the template whose parsing was failed.
    -
    -
    getTemplateName() - Method in class freemarker.debug.Breakpoint
    -
    -
    Returns the template name of the breakpoint
    -
    -
    getTemplateName() - Method in exception freemarker.template.TemplateException
    -
    -
    Returns the name of the template where the error has occurred, or null if the information isn't - available.
    -
    -
    getTemplatePath() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    getTimeFormat() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getTimeZone() - Method in class freemarker.core.Configurable
    -
    - -
    -
    getTimeZone(String) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Returns the time zone object for the name (or ID).
    -
    -
    getTimeZoneName() - Method in exception freemarker.template.utility.UnrecognizedTimeZoneException
    -
     
    -
    getUndeclaredThrowable() - Method in exception freemarker.template.utility.UndeclaredThrowableException
    -
     
    -
    getUnsupportedClass() - Method in exception freemarker.template.utility.UnsupportedNumberClassException
    -
     
    -
    getURL(String) - Method in class freemarker.cache.ClassTemplateLoader
    -
     
    -
    getURL(String) - Method in class freemarker.cache.URLTemplateLoader
    -
    -
    Given a template name (plus potential locale decorations) retrieves - an URL that points the template source.
    -
    -
    getURLConnectionUsesCaches() - Method in class freemarker.cache.URLTemplateLoader
    -
    - -
    -
    getURLConnectionUsesCaches() - Method in class freemarker.cache.WebappTemplateLoader
    -
    - -
    -
    getURLEscapingCharset() - Method in class freemarker.core.Configurable
    -
     
    -
    getUseCache() - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    getUseCache() - Method in class freemarker.ext.util.ModelCache
    -
     
    -
    getUseModelCache() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    getVariable(String) - Method in class freemarker.core.Environment
    -
    -
    Returns the variable that is visible in this context.
    -
    -
    getVersion() - Static method in class freemarker.template.Configuration
    -
    -
    Returns the FreeMarker version information, most importantly the major.minor.micro version numbers.
    -
    -
    getVersionNumber() - Static method in class freemarker.template.Configuration
    -
    -
    Deprecated. - -
    -
    -
    getWhitespaceStripping() - Method in class freemarker.template.Configuration
    -
    -
    Gets whether the FTL parser will try to remove - superfluous white-space around certain FTL tags.
    -
    -
    getWrappedObject() - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    getWrappedObject() - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    getWrappedObject() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    getWrappedObject() - Method in class freemarker.ext.jython.JythonModel
    -
     
    -
    getWrappedObject() - Method in interface freemarker.ext.util.WrapperTemplateModel
    -
    -
    Retrieves the original object wrapped by this model.
    -
    -
    getWrappedObject() - Method in class freemarker.template.TemplateModelListSequence
    -
    -
    Returns the original List of TemplateModel-s, so it's not a fully unwrapped value.
    -
    -
    getWriter(Writer, Map) - Method in interface freemarker.template.TemplateTransformModel
    -
    -
    Returns a writer that will be used by the engine to feed the - transformation input to the transform.
    -
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.CaptureOutput
    -
    -
    Deprecated.
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.HtmlEscape
    -
     
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.JythonRuntime
    -
     
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.NormalizeNewlines
    -
     
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.StandardCompress
    -
     
    -
    getWriter(Writer, Map) - Method in class freemarker.template.utility.XmlEscape
    -
     
    -
    getXPathSupportClass() - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Get the currently used freemarker.ext.dom.XPathSupport used as the XPath engine.
    -
    -
    getYesNo(String) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    - - - -

    H

    -
    -
    handleTemplateException(TemplateException, Environment, Writer) - Method in interface freemarker.template.TemplateExceptionHandler
    -
    -
    Method called after a TemplateException was raised inside a template.
    -
    -
    handleUnknownType(Object) - Method in class freemarker.template.DefaultObjectWrapper
    -
    -
    Called if an unknown type is passed in.
    -
    -
    handleUnknownType(Object) - Method in class freemarker.template.SimpleObjectWrapper
    -
    -
    Called if a type other than the simple ones we know about is passed in.
    -
    -
    HashAdapter - Class in freemarker.ext.beans
    -
     
    -
    hashCode() - Method in class freemarker.debug.Breakpoint
    -
     
    -
    hashCode() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    hashCode() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    hashCode() - Method in class freemarker.template.Version
    -
     
    -
    hasNext() - Method in class freemarker.ext.beans.EnumerationModel
    -
    -
    Calls underlying Enumeration.nextElement().
    -
    -
    hasNext() - Method in class freemarker.ext.beans.IteratorModel
    -
    -
    Calls underlying Iterator.hasNext().
    -
    -
    hasNext() - Method in interface freemarker.template.TemplateModelIterator
    -
     
    -
    hasPlainGetMethod() - Method in class freemarker.ext.beans.BeanModel
    -
    -
    Whether the model has a plain get(String) or get(Object) method
    -
    -
    HTML_DEBUG_HANDLER - Static variable in interface freemarker.template.TemplateExceptionHandler
    -
    -
    TemplateExceptionHandler useful when you developing HTML templates.
    -
    -
    HTMLEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Deprecated. -
    Use StringUtil.XHTMLEnc(String) instead, because it escapes apostrophe-quote too.
    -
    -
    -
    HtmlEscape - Class in freemarker.template.utility
    -
    -
    Performs an HTML escape of a given template fragment.
    -
    -
    HtmlEscape() - Constructor for class freemarker.template.utility.HtmlEscape
    -
     
    -
    HttpRequestHashModel - Class in freemarker.ext.servlet
    -
    -
    TemplateHashModel wrapper for a HttpServletRequest attributes.
    -
    -
    HttpRequestHashModel(HttpServletRequest, ObjectWrapper) - Constructor for class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    HttpRequestHashModel(HttpServletRequest, HttpServletResponse, ObjectWrapper) - Constructor for class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    HttpRequestParametersHashModel - Class in freemarker.ext.servlet
    -
    -
    TemplateHashModel wrapper for a HttpServletRequest parameters.
    -
    -
    HttpRequestParametersHashModel(HttpServletRequest) - Constructor for class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    HttpSessionHashModel - Class in freemarker.ext.servlet
    -
    -
    TemplateHashModel wrapper for a HttpSession attributes.
    -
    -
    HttpSessionHashModel(HttpSession, ObjectWrapper) - Constructor for class freemarker.ext.servlet.HttpSessionHashModel
    -
    -
    Use this constructor when the session already exists.
    -
    -
    HttpSessionHashModel(FreemarkerServlet, HttpServletRequest, HttpServletResponse, ObjectWrapper) - Constructor for class freemarker.ext.servlet.HttpSessionHashModel
    -
    -
    Use this constructor when the session isn't already created.
    -
    -
    - - - -

    I

    -
    -
    IdentityHashMap - Class in freemarker.ext.util
    -
    -
    A variant of HashMap that uses - System.identityHashCode(Object) for hashing, and reference comparison - instead of Object.equals(Object).
    -
    -
    IdentityHashMap(int, float) - Constructor for class freemarker.ext.util.IdentityHashMap
    -
    -
    Constructs a new, empty map with the specified initial - capacity and the specified load factor.
    -
    -
    IdentityHashMap(int) - Constructor for class freemarker.ext.util.IdentityHashMap
    -
    -
    Constructs a new, empty map with the specified initial capacity - and default load factor, which is 0.75.
    -
    -
    IdentityHashMap() - Constructor for class freemarker.ext.util.IdentityHashMap
    -
    -
    Constructs a new, empty map with a default capacity and load - factor, which is 0.75.
    -
    -
    IdentityHashMap(Map) - Constructor for class freemarker.ext.util.IdentityHashMap
    -
    -
    Constructs a new map with the same mappings as the given map.
    -
    -
    IGNORE_HANDLER - Static variable in interface freemarker.template.TemplateExceptionHandler
    -
    -
    TemplateExceptionHandler that simply skips the failing instructions, letting the template continue - executing.
    -
    -
    importLib(String, String) - Method in class freemarker.core.Environment
    -
    -
    Emulates import directive, except that name must be tempate - root relative.
    -
    -
    importLib(Template, String) - Method in class freemarker.core.Environment
    -
    -
    Emulates import directive.
    -
    -
    include(String, String, boolean) - Method in class freemarker.core.Environment
    -
    -
    Emulates include directive, except that name must be tempate - root relative.
    -
    -
    include(Template) - Method in class freemarker.core.Environment
    -
    -
    Processes a Template in the context of this Environment, including its - output in the Environment's Writer.
    -
    -
    IncludePage - Class in freemarker.ext.servlet
    -
    -
    A model that when invoked with a 'path' parameter will perform a servlet - include.
    -
    -
    IncludePage(HttpServletRequest, HttpServletResponse) - Constructor for class freemarker.ext.servlet.IncludePage
    -
     
    -
    INCOMPATIBLE_ENHANCEMENTS - Static variable in class freemarker.template.Configuration
    -
    -
    Deprecated. - -
    -
    -
    INCOMPATIBLE_IMPROVEMENTS - Static variable in class freemarker.template.Configuration
    -
     
    -
    info(String) - Method in class freemarker.log.Logger
    -
    -
    Logs an informational message.
    -
    -
    info(String, Throwable) - Method in class freemarker.log.Logger
    -
    -
    Logs an informational message with accompanying throwable.
    -
    -
    init() - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    initializeServletContext(HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Called when servlet detects in a request processing that - application-global (that is, ServletContext-specific) attributes are not yet - set.
    -
    -
    initializeSession(HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Called when servlet detects in a request processing that session-global - (that is, HttpSession-specific) attributes are not yet set.
    -
    -
    insertDefaults(Map) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    INSTANCE - Static variable in class freemarker.ext.jython.JythonWrapper
    -
     
    -
    INSTANCE - Static variable in class freemarker.template.utility.NullWriter
    -
     
    -
    INSTANCE - Static variable in class freemarker.template.utility.StandardCompress
    -
     
    -
    intValue() - Method in class freemarker.template.Version
    -
     
    -
    intValueFor(int, int, int) - Static method in class freemarker.template.Version
    -
     
    -
    InvalidPropertyException - Exception in freemarker.ext.beans
    -
    -
    An exception thrown when there is an attempt to access - an invalid bean property when we are in a "strict bean" mode
    -
    -
    InvalidPropertyException(String) - Constructor for exception freemarker.ext.beans.InvalidPropertyException
    -
     
    -
    InvalidReferenceException - Exception in freemarker.core
    -
    -
    A subclass of TemplateException that says that an FTL expression has evaluated to null or it refers - to something that doesn't exist.
    -
    -
    InvalidReferenceException(Environment) - Constructor for exception freemarker.core.InvalidReferenceException
    -
    -
    Creates and invalid reference exception that contains no information about what was missing or null.
    -
    -
    InvalidReferenceException(String, Environment) - Constructor for exception freemarker.core.InvalidReferenceException
    -
    -
    Creates and invalid reference exception that contains no programmatically extractable information about the - blamed expression.
    -
    -
    invalidSettingValueException(String, String) - Method in class freemarker.core.Configurable
    -
     
    -
    invokeGenericGet(Map, Class, String) - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    invokeGenericGet(Map, Class, String) - Method in class freemarker.ext.beans.MapModel
    -
    -
    Overridden to invoke the generic get method by casting to Map instead of - through reflection - should yield better performance.
    -
    -
    invokeGenericGet(Map, Class, String) - Method in class freemarker.ext.beans.ResourceBundleModel
    -
    -
    Overridden to invoke the getObject method of the resource bundle.
    -
    -
    isCacheable(Object) - Method in class freemarker.ext.beans.BeansModelCache
    -
     
    -
    isCacheable(Object) - Method in class freemarker.ext.util.ModelCache
    -
     
    -
    isClassicCompatible() - Method in class freemarker.core.Configurable
    -
    -
    Returns whether the engine runs in the "Classic Compatibile" mode.
    -
    -
    isClassIntrospectionCacheRestricted() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Tells if this instance acts like if its class introspection cache is sharable with other BeansWrapper-s.
    -
    -
    isConcurrent() - Method in interface freemarker.cache.ConcurrentCacheStorage
    -
    -
    Returns true if this instance of cache storage is concurrently - accessible from multiple threads without synchronization.
    -
    -
    isConcurrent() - Method in class freemarker.cache.NullCacheStorage
    -
     
    -
    isConcurrent() - Method in class freemarker.cache.SoftCacheStorage
    -
     
    -
    isConcurrent() - Method in class freemarker.cache.StrongCacheStorage
    -
    -
    Returns true if the underlying Map is a ConcurrentMap.
    -
    -
    isDebugEnabled() - Method in class freemarker.log.Logger
    -
    -
    Returns true if this logger will log debug messages.
    -
    -
    isEmpty() - Method in class freemarker.ext.beans.ArrayModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.beans.BeanModel
    -
    -
    Tells whether the model is empty.
    -
    -
    isEmpty() - Method in class freemarker.ext.beans.HashAdapter
    -
     
    -
    isEmpty() - Method in class freemarker.ext.beans.MapModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.beans.ResourceBundleModel
    -
    -
    Returns true if this bundle contains no objects.
    -
    -
    isEmpty() - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Returns true if this model contains no nodes.
    -
    -
    isEmpty() - Method in class freemarker.ext.jsp.TaglibFactory
    -
    -
    Returns false.
    -
    -
    isEmpty() - Method in class freemarker.ext.jython.JythonModel
    -
    -
    Returns PyObject.__len__() == 0.
    -
    -
    isEmpty() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.servlet.HttpSessionHashModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.servlet.ServletContextHashModel
    -
     
    -
    isEmpty() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns true if this map contains no key-value mappings.
    -
    -
    isEmpty() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Returns true if this NodeListModel contains no nodes.
    -
    -
    isEmpty() - Method in class freemarker.template.SimpleHash
    -
     
    -
    isEmpty() - Method in interface freemarker.template.TemplateHashModel
    -
     
    -
    isEmpty() - Method in class freemarker.template.utility.DOMNodeModel
    -
     
    -
    isErrorEnabled() - Method in class freemarker.log.Logger
    -
    -
    Returns true if this logger will log error messages.
    -
    -
    isExposeFields() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns whether exposure of public instance fields of classes is - enabled.
    -
    -
    isFatalEnabled() - Method in class freemarker.log.Logger
    -
    -
    Returns true if this logger will log fatal error messages.
    -
    -
    isGAECompliant() - Method in class freemarker.template.Version
    -
     
    -
    isInAttemptBlock() - Method in class freemarker.core.Environment
    -
    -
    Tells if we are inside an #attempt block (but before #recover).
    -
    -
    isInfinite(Number) - Static method in class freemarker.template.utility.NumberUtil
    -
     
    -
    isInfoEnabled() - Method in class freemarker.log.Logger
    -
    -
    Returns true if this logger will log informational messages.
    -
    -
    isIntegerBigDecimal(BigDecimal) - Static method in class freemarker.template.utility.NumberUtil
    -
    -
    Tells if a BigDecimal stores a whole number.
    -
    -
    isNaN(Number) - Static method in class freemarker.template.utility.NumberUtil
    -
     
    -
    isNumerical(Class) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    Tells if a type is numerical; works both for primitive types and classes.
    -
    -
    isPyInstance(Object) - Method in class freemarker.ext.jython.JythonVersionAdapter
    -
    -
    Returns - obj instanceof Py[Java]Instance.
    -
    -
    isSimpleMapWrapper() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Tells whether Maps are exposed as simple maps, without access to their - method.
    -
    -
    isSimpleMapWrapper() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    isStrict() - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    isStrict() - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
     
    -
    isWarnEnabled() - Method in class freemarker.log.Logger
    -
    -
    Returns true if this logger will log warning messages.
    -
    -
    isWriteProtected() - Method in class freemarker.ext.beans.BeansWrapper
    -
     
    -
    isWriteProtected() - Method in interface freemarker.template.utility.WriteProtectable
    -
     
    -
    isXMLID(String) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    iterator() - Method in class freemarker.ext.beans.ArrayModel
    -
     
    -
    iterator() - Method in class freemarker.ext.beans.CollectionModel
    -
     
    -
    iterator() - Method in class freemarker.ext.beans.EnumerationModel
    -
    -
    This allows the enumeration to be used in a <#list> block.
    -
    -
    iterator() - Method in class freemarker.ext.beans.IteratorModel
    -
    -
    This allows the iterator to be used in a <#list> block.
    -
    -
    iterator() - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    iterator() - Method in class freemarker.ext.jython.JythonSequenceModel
    -
     
    -
    iterator() - Method in class freemarker.template.SimpleCollection
    -
    -
    Retrieves a template model iterator that is used to iterate over the elements in this collection.
    -
    -
    iterator() - Method in interface freemarker.template.TemplateCollectionModel
    -
    -
    Retrieves a template model iterator that is used to iterate over - the elements in this collection.
    -
    -
    IteratorModel - Class in freemarker.ext.beans
    -
    -
    A class that adds TemplateModelIterator functionality to the - Iterator interface implementers.
    -
    -
    IteratorModel(Iterator, BeansWrapper) - Constructor for class freemarker.ext.beans.IteratorModel
    -
    -
    Creates a new model that wraps the specified iterator object.
    -
    -
    - - - -

    J

    -
    -
    javaScriptStringEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Escapes a String to be safely insertable into a JavaScript string literal; for more see - jsStringEnc(s, false).
    -
    -
    javaStringEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Escapes the String with the escaping rules of Java language - string literals, so it's safe to insert the value into a string literal.
    -
    -
    jQuote(Object) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Converts the parameter with toString (if it's not null) and passes it to - StringUtil.jQuote(String).
    -
    -
    jQuote(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Quotes string as Java Language string literal.
    -
    -
    jQuoteNoXSS(Object) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Converts the parameter with toString (if not - null)and passes it to StringUtil.jQuoteNoXSS(String).
    -
    -
    jQuoteNoXSS(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Same as StringUtil.jQuoteNoXSS(String) but also escapes '<' - as \u003C.
    -
    -
    jsonStringEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Escapes a String to be safely insertable into a JSON string literal; for more see - jsStringEnc(s, true).
    -
    -
    jsStringEnc(String, boolean) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Escapes a String to be safely insertable into a JavaScript or a JSON string literal.
    -
    -
    JythonAntTask - Class in freemarker.ext.ant
    -
    -
    Used internally, public for technical reasons only.
    -
    -
    JythonAntTask() - Constructor for class freemarker.ext.ant.JythonAntTask
    -
     
    -
    JythonHashModel - Class in freemarker.ext.jython
    -
    -
    Model for Jython dictionaries (PyDictionary - and PyStringMap).
    -
    -
    JythonHashModel(PyObject, JythonWrapper) - Constructor for class freemarker.ext.jython.JythonHashModel
    -
     
    -
    JythonModel - Class in freemarker.ext.jython
    -
    -
    Generic model for arbitrary Jython objects.
    -
    -
    JythonModel(PyObject, JythonWrapper) - Constructor for class freemarker.ext.jython.JythonModel
    -
     
    -
    JythonNumberModel - Class in freemarker.ext.jython
    -
    -
    Model for Jython numeric objects (PyInteger, PyLong, - PyFloat).
    -
    -
    JythonNumberModel(PyObject, JythonWrapper) - Constructor for class freemarker.ext.jython.JythonNumberModel
    -
     
    -
    JythonRuntime - Class in freemarker.template.utility
    -
    -
    A crude first pass at an embeddable Jython interpreter
    -
    -
    JythonRuntime() - Constructor for class freemarker.template.utility.JythonRuntime
    -
     
    -
    JythonSequenceModel - Class in freemarker.ext.jython
    -
    -
    Model for Jython sequence objects (PySequence descendants).
    -
    -
    JythonSequenceModel(PyObject, JythonWrapper) - Constructor for class freemarker.ext.jython.JythonSequenceModel
    -
     
    -
    JythonVersionAdapter - Class in freemarker.ext.jython
    -
    -
    Functions that has a different implementation depending on the Jython version - used.
    -
    -
    JythonVersionAdapter() - Constructor for class freemarker.ext.jython.JythonVersionAdapter
    -
     
    -
    JythonWrapper - Class in freemarker.ext.jython
    -
    -
    An object wrapper that wraps Jython objects into FreeMarker template models - and vice versa.
    -
    -
    JythonWrapper() - Constructor for class freemarker.ext.jython.JythonWrapper
    -
     
    -
    - - - -

    K

    -
    -
    KEY_APPLICATION - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_APPLICATION_PRIVATE - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_INCLUDE - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_JSP_TAGLIBS - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_REQUEST - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_REQUEST_PARAMETERS - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_REQUEST_PRIVATE - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    KEY_SESSION - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    keys() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    keys() - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    keys() - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    keys() - Method in class freemarker.ext.jython.JythonHashModel
    -
    -
    Returns either object.__findattr__("keys").__call__() - or object.__findattr__("keySet").__call__().
    -
    -
    keys() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    keys() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    keys() - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    keys() - Method in class freemarker.template.SimpleHash
    -
     
    -
    keys() - Method in interface freemarker.template.TemplateHashModelEx
    -
     
    -
    keySet() - Method in class freemarker.ext.beans.BeanModel
    -
    -
    Helper method to support TemplateHashModelEx.
    -
    -
    keySet() - Method in class freemarker.ext.beans.MapModel
    -
     
    -
    keySet() - Method in class freemarker.ext.beans.ResourceBundleModel
    -
     
    -
    keySet() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns a set view of the keys contained in this map.
    -
    -
    - - - -

    L

    -
    -
    leftPad(String, int) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the left with spaces until it reaches the desired - length.
    -
    -
    leftPad(String, int, char) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the left with the specified character until it reaches - the desired length.
    -
    -
    leftPad(String, int, String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the left with a filling pattern until it reaches the - desired length.
    -
    -
    LIBRARY_AUTO - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should automatically lookup and use any available logger library.
    -
    -
    LIBRARY_AVALON - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use the Apache Jakarta Avalon LogKit logger package.
    -
    -
    LIBRARY_COMMONS - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use the Apache commons-logging logger adapter package.
    -
    -
    LIBRARY_JAVA - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use the java.util.logging logger package.
    -
    -
    LIBRARY_LOG4J - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use the Apache Jakarta Log4J logger package.
    -
    -
    LIBRARY_NONE - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use no logger package (i.e.
    -
    -
    LIBRARY_SLF4J - Static variable in class freemarker.log.Logger
    -
    -
    Constant used with Logger.selectLoggerLibrary(int) that indicates the - engine should use the SLF4J logger adapter package.
    -
    -
    lineNumber - Variable in exception freemarker.core.ParseException
    -
     
    -
    list - Variable in class freemarker.template.SimpleSequence
    -
     
    -
    loadBuiltInEncodingMap() - Method in class freemarker.template.Configuration
    -
    -
    Loads a preset language-to-encoding map, similarly as if you have called - Configuration.clearEncodingMap() and then did multiple Configuration.setEncoding(Locale, String) calls.
    -
    -
    LOCALE_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    LOCALIZED_LOOKUP_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    LocalizedString - Class in freemarker.template
    -
    -
    An abstract base class for scalars that vary by locale.
    -
    -
    LocalizedString() - Constructor for class freemarker.template.LocalizedString
    -
     
    -
    Logger - Class in freemarker.log
    -
    -
    The FreeMarker logging facility.
    -
    -
    Logger() - Constructor for class freemarker.log.Logger
    -
     
    -
    - - - -

    M

    -
    -
    main(String[]) - Static method in class freemarker.core.CommandLine
    -
    -
    Deprecated.
    -
    main(String[]) - Static method in class freemarker.ext.dom.Transform
    -
    -
    A convenient main() method for command-line invocation.
    -
    -
    main(String[]) - Static method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Loads a template from a file passed as the first argument, loads an XML - document from the standard input, passes it to the template as variable - document and writes the result of template processing to - standard output.
    -
    -
    main(String[]) - Static method in class freemarker.template.utility.ToCanonical
    -
     
    -
    MapModel - Class in freemarker.ext.beans
    -
    -
    A special case of BeanModel that adds implementation - for TemplateMethodModelEx on map objects that is a shortcut for the - Map.get() method.
    -
    -
    MapModel(Map, BeansWrapper) - Constructor for class freemarker.ext.beans.MapModel
    -
    -
    Creates a new model that wraps the specified map object.
    -
    -
    matchesName(String, String, String, Environment) - Static method in class freemarker.template.utility.StringUtil
    -
     
    -
    maxScale - Variable in class freemarker.core.ArithmeticEngine
    -
     
    -
    mergeAdjacentText(Node) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Merges adjacent text/cdata nodes, so that there are no - adjacent text/cdata nodes.
    -
    -
    MethodAppearanceDecision() - Constructor for class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    MethodAppearanceDecisionInput() - Constructor for class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput
    -
     
    -
    MethodAppearanceFineTuner - Interface in freemarker.ext.beans
    -
    -
    Used for customizing how the methods are visible from templates, via - BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner).
    -
    -
    minScale - Variable in class freemarker.core.ArithmeticEngine
    -
     
    -
    MINUS_ONE - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    ModelCache - Class in freemarker.ext.util
    -
    -
    Internally used by various wrapper implementations to implement model - caching.
    -
    -
    ModelCache() - Constructor for class freemarker.ext.util.ModelCache
    -
     
    -
    ModelFactory - Interface in freemarker.ext.util
    -
    -
    Interface used to create various wrapper models in the ModelCache.
    -
    -
    modulus(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    modulus(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    modulus(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    MruCacheStorage - Class in freemarker.cache
    -
    -
    A cache storage that implements a two-level Most Recently Used cache.
    -
    -
    MruCacheStorage(int, int) - Constructor for class freemarker.cache.MruCacheStorage
    -
    -
    Creates a new MRU cache storage with specified maximum cache sizes.
    -
    -
    multiply(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    multiply(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    multiply(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    MultiTemplateLoader - Class in freemarker.cache
    -
    -
    A TemplateLoader that uses a set of other loaders to load the templates.
    -
    -
    MultiTemplateLoader(TemplateLoader[]) - Constructor for class freemarker.cache.MultiTemplateLoader
    -
    -
    Creates a new multi template Loader that will use the specified loaders.
    -
    -
    - - - -

    N

    -
    -
    NEW_BUILTIN_CLASS_RESOLVER_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    newInstance(Class, List) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Creates a new instance of the specified class using the method call logic of this object wrapper for calling the - constructor.
    -
    -
    next() - Method in class freemarker.ext.beans.EnumerationModel
    -
    -
    Calls underlying Enumeration.nextElement() and wraps the result.
    -
    -
    next() - Method in class freemarker.ext.beans.IteratorModel
    -
    -
    Calls underlying Iterator.next() and wraps the result.
    -
    -
    next() - Method in interface freemarker.template.TemplateModelIterator
    -
    -
    Returns the next model.
    -
    -
    NO_NS_PREFIX - Static variable in class freemarker.template.Template
    -
     
    -
    NodeListModel - Class in freemarker.ext.jdom
    -
    -
    Deprecated. -
    Use NodeModel instead.
    -
    -
    -
    NodeListModel(Document) - Constructor for class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Creates a node list that holds a single Document node.
    -
    -
    NodeListModel(Element) - Constructor for class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Creates a node list that holds a single Element node.
    -
    -
    NodeListModel(List) - Constructor for class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Creates a node list that holds a list of nodes.
    -
    -
    NodeListModel(List, boolean) - Constructor for class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Creates a node list that holds a list of nodes.
    -
    -
    NodeListModel - Class in freemarker.ext.xml
    -
    -
    Deprecated. -
    Use NodeModel instead.
    -
    -
    -
    NodeListModel(Object) - Constructor for class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Creates a new NodeListModel, wrapping the passed nodes.
    -
    -
    NodeModel - Class in freemarker.ext.dom
    -
    -
    A base class for wrapping a W3C DOM Node as a FreeMarker template model.
    -
    -
    NodeModel(Node) - Constructor for class freemarker.ext.dom.NodeModel
    -
     
    -
    NonBooleanException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateBooleanModel value was expected, but the value had a different type.
    -
    -
    NonBooleanException(Environment) - Constructor for exception freemarker.core.NonBooleanException
    -
     
    -
    NonBooleanException(String, Environment) - Constructor for exception freemarker.core.NonBooleanException
    -
     
    -
    NonDateException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateDateModel value was expected, but the value had a different type.
    -
    -
    NonDateException(Environment) - Constructor for exception freemarker.core.NonDateException
    -
     
    -
    NonDateException(String, Environment) - Constructor for exception freemarker.core.NonDateException
    -
     
    -
    NonExtendedHashException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateHashModelEx value was expected, but the value had a different type.
    -
    -
    NonExtendedHashException(Environment) - Constructor for exception freemarker.core.NonExtendedHashException
    -
     
    -
    NonExtendedHashException(String, Environment) - Constructor for exception freemarker.core.NonExtendedHashException
    -
     
    -
    NonHashException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateHashModel value was expected, but the value had a different type.
    -
    -
    NonHashException(Environment) - Constructor for exception freemarker.core.NonHashException
    -
     
    -
    NonHashException(String, Environment) - Constructor for exception freemarker.core.NonHashException
    -
     
    -
    NonMethodException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateMethodModel value was expected, but the value had a different type.
    -
    -
    NonMethodException(Environment) - Constructor for exception freemarker.core.NonMethodException
    -
     
    -
    NonMethodException(String, Environment) - Constructor for exception freemarker.core.NonMethodException
    -
     
    -
    NonNodeException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateNodeModel value was expected, but the value had a different type.
    -
    -
    NonNodeException(Environment) - Constructor for exception freemarker.core.NonNodeException
    -
     
    -
    NonNodeException(String, Environment) - Constructor for exception freemarker.core.NonNodeException
    -
     
    -
    NonNumericalException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateNumberModel value was expected, but the value had a different type.
    -
    -
    NonNumericalException(Environment) - Constructor for exception freemarker.core.NonNumericalException
    -
     
    -
    NonNumericalException(String, Environment) - Constructor for exception freemarker.core.NonNumericalException
    -
     
    -
    NonSequenceException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateSequenceModel value was expected, but the value had a different type.
    -
    -
    NonSequenceException(Environment) - Constructor for exception freemarker.core.NonSequenceException
    -
     
    -
    NonSequenceException(String, Environment) - Constructor for exception freemarker.core.NonSequenceException
    -
     
    -
    NonSequenceOrCollectionException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateSequenceModel or TemplateCollectionModel value was expected, but the value - had a different type.
    -
    -
    NonSequenceOrCollectionException(Environment) - Constructor for exception freemarker.core.NonSequenceOrCollectionException
    -
     
    -
    NonSequenceOrCollectionException(String, Environment) - Constructor for exception freemarker.core.NonSequenceOrCollectionException
    -
     
    -
    NonStringException - Exception in freemarker.core
    -
    -
    Indicates that a TemplateScalarModel value was expected (or maybe something that can be automatically coerced - to that), but the value had a different type.
    -
    -
    NonStringException(Environment) - Constructor for exception freemarker.core.NonStringException
    -
     
    -
    NonStringException(String, Environment) - Constructor for exception freemarker.core.NonStringException
    -
     
    -
    normalizeIncompatibleImprovementsVersion(Version) - Static method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns the lowest version number that is equivalent with the parameter version.
    -
    -
    NormalizeNewlines - Class in freemarker.template.utility
    -
    -
    Transformer that supports FreeMarker legacy behavior: all newlines appearing - within the transformed area will be transformed into the platform's default - newline.
    -
    -
    NormalizeNewlines() - Constructor for class freemarker.template.utility.NormalizeNewlines
    -
     
    -
    NOTHING - Static variable in interface freemarker.template.TemplateModel
    -
    -
    A general-purpose object to represent nothing.
    -
    -
    NullArgumentException - Exception in freemarker.template.utility
    -
    -
    Indicates that an argument that must be non-null was null.
    -
    -
    NullArgumentException(String) - Constructor for exception freemarker.template.utility.NullArgumentException
    -
     
    -
    NullCacheStorage - Class in freemarker.cache
    -
    -
    A cache storage that doesn't store anything.
    -
    -
    NullCacheStorage() - Constructor for class freemarker.cache.NullCacheStorage
    -
     
    -
    NullWriter - Class in freemarker.template.utility
    -
    -
    A Writer that simply drops what it gets.
    -
    -
    NUMBER_FORMAT_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    NumberModel - Class in freemarker.ext.beans
    -
    -
    Wraps arbitrary subclass of Number into a reflective model.
    -
    -
    NumberModel(Number, BeansWrapper) - Constructor for class freemarker.ext.beans.NumberModel
    -
    -
    Creates a new model that wraps the specified number object.
    -
    -
    NumberUtil - Class in freemarker.template.utility
    -
    -
    Number- and math-related utilities.
    -
    -
    - - - -

    O

    -
    -
    object - Variable in class freemarker.ext.beans.BeanModel
    -
     
    -
    object - Variable in class freemarker.ext.jython.JythonModel
    -
     
    -
    OBJECT_WRAPPER_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    ObjectConstructor - Class in freemarker.template.utility
    -
    -
    An object that you can make available in a template - to instantiate arbitrary beans-wrapped objects in a template.
    -
    -
    ObjectConstructor() - Constructor for class freemarker.template.utility.ObjectConstructor
    -
     
    -
    ObjectWrapper - Interface in freemarker.template
    -
    -
    Maps Java objects to the type-system of FreeMarker Template Language (see the TemplateModel - interfaces).
    -
    -
    ONE - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    onError(Throwable) - Method in interface freemarker.template.TransformControl
    -
    -
    Called if any exception occurs during the transform between the - TemplateTransformModel.getWriter(java.io.Writer, java.util.Map) call - and the Writer.close() call.
    -
    -
    onStart() - Method in interface freemarker.template.TransformControl
    -
    -
    Called before the body is evaluated for the first time.
    -
    -
    optimizeListStorage(List) - Static method in class freemarker.template.utility.OptimizerUtil
    -
     
    -
    optimizeNumberRepresentation(Number) - Static method in class freemarker.template.utility.OptimizerUtil
    -
    -
    This is needed to reverse the extreme conversions in arithmetic - operations so that numbers can be meaningfully used with models that - don't know what to do with a BigDecimal.
    -
    -
    OptimizerUtil - Class in freemarker.template.utility
    -
     
    -
    OptInTemplateClassResolver - Class in freemarker.core
    -
    -
    A TemplateClassResolver that resolves only the classes whose name - was specified in the constructor.
    -
    -
    OptInTemplateClassResolver(Set, List) - Constructor for class freemarker.core.OptInTemplateClassResolver
    -
    -
    Creates a new instance.
    -
    -
    OUTPUT_ENCODING_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    outputInstructionStack(PrintWriter) - Method in class freemarker.core.Environment
    -
    -
    Prints the current FTL stack trace.
    -
    -
    OverloadedMethodsModel - Class in freemarker.ext.beans
    -
    -
    Wraps a set of same-name overloaded methods behind TemplateMethodModel interface, - like if it was a single method, chooses among them behind the scenes on call-time based on the argument values.
    -
    -
    - - - -

    P

    -
    -
    parse(InputSource, boolean, boolean) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Create a NodeModel from a SAX input source.
    -
    -
    parse(InputSource) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Create a NodeModel from an XML input source.
    -
    -
    parse(File, boolean, boolean) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Create a NodeModel from an XML file.
    -
    -
    parse(File) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Create a NodeModel from an XML file.
    -
    -
    parseAsImportList(String) - Method in class freemarker.core.Configurable
    -
     
    -
    parseAsList(String) - Method in class freemarker.core.Configurable
    -
     
    -
    parseAsSegmentedList(String) - Method in class freemarker.core.Configurable
    -
     
    -
    PARSED_DEFAULT_INCOMPATIBLE_ENHANCEMENTS - Static variable in class freemarker.template.Configuration
    -
    - -
    -
    ParseException - Exception in freemarker.core
    -
    -
    Parsing-time exception in a template (as opposed to a runtime exception, a TemplateException).
    -
    -
    ParseException(Token, int[][], String[]) - Constructor for exception freemarker.core.ParseException
    -
    -
    This constructor is used by the method "generateParseException" - in the generated parser.
    -
    -
    ParseException() - Constructor for exception freemarker.core.ParseException
    -
    -
    Deprecated. -
    Use a constructor to which you pass description, template, and positions.
    -
    -
    -
    ParseException(String, int, int) - Constructor for exception freemarker.core.ParseException
    -
    -
    Deprecated. -
    Use a constructor to which you can also pass the template, and the end positions.
    -
    -
    -
    ParseException(String, Template, int, int, int, int) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    ParseException(String, Template, int, int, int, int, Throwable) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    ParseException(String, Template, int, int) - Constructor for exception freemarker.core.ParseException
    -
    -
    Deprecated. -
    Use ParseException.ParseException(String, Template, int, int, int, int) instead, as IDE-s need the end - position of the error too.
    -
    -
    -
    ParseException(String, Template, int, int, Throwable) - Constructor for exception freemarker.core.ParseException
    -
    -
    Deprecated. -
    Use ParseException.ParseException(String, Template, int, int, int, int, Throwable) instead, as IDE-s need - the end position of the error too.
    -
    -
    -
    ParseException(String, Template, Token) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    ParseException(String, Template, Token, Throwable) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    ParseException(String, TemplateObject) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    ParseException(String, TemplateObject, Throwable) - Constructor for exception freemarker.core.ParseException
    -
     
    -
    parseISO8601Date(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    - -
    -
    parseISO8601DateTime(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    - -
    -
    parseISO8601Time(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    - -
    -
    parseNameValuePairList(String, String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Parses a name-value pair list, where the pairs are separated with comma, - and the name and value is separated with colon.
    -
    -
    parseXSDate(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Parses an W3C XML Schema date string (not time or date-time).
    -
    -
    parseXSDateTime(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Parses an W3C XML Schema date-time string (not date or time).
    -
    -
    parseXSTime(String, TimeZone, DateUtil.CalendarFieldsToDateConverter) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Parses an W3C XML Schema time string (not date or date-time).
    -
    -
    parseXSTimeZone(String) - Static method in class freemarker.template.utility.DateUtil
    -
    -
    Parses the time zone part from a W3C XML Schema date/time/dateTime.
    -
    -
    permissiveUnwrap(TemplateModel) - Static method in class freemarker.template.utility.DeepUnwrap
    -
    -
    Same as DeepUnwrap.unwrap(TemplateModel), but it doesn't throw exception - if it doesn't know how to unwrap the model, but rather returns it as-is.
    -
    -
    postTemplateProcess(HttpServletRequest, HttpServletResponse, Template, TemplateModel) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Called after the execution returns from template.process().
    -
    -
    premissiveUnwrap(TemplateModel) - Static method in class freemarker.template.utility.DeepUnwrap
    -
    -
    Deprecated. -
    the name of this method is mistyped. Use - DeepUnwrap.permissiveUnwrap(TemplateModel) instead.
    -
    -
    -
    preprocessRequest(HttpServletRequest, HttpServletResponse) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Called as the first step in request processing, before the templating mechanism - is put to work.
    -
    -
    preTemplateProcess(HttpServletRequest, HttpServletResponse, Template, TemplateModel) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Called before the execution is passed to template.process().
    -
    -
    primitiveClassToBoxingClass(Class) - Static method in class freemarker.template.utility.ClassUtil
    -
    -
    Gets the wrapper class for a primitive class, like Integer for int, also returns Void - for void.
    -
    -
    printStackTrace(PrintWriter) - Method in exception freemarker.core.StopException
    -
     
    -
    printStackTrace(PrintStream) - Method in exception freemarker.core.StopException
    -
     
    -
    printStackTrace(PrintStream) - Method in exception freemarker.template.TemplateException
    -
    -
    Overrides Throwable.printStackTrace(PrintStream) so that it will include the FTL stack trace.
    -
    -
    printStackTrace(PrintWriter) - Method in exception freemarker.template.TemplateException
    -
    -
    Overrides Throwable.printStackTrace(PrintWriter) so that it will include the FTL stack trace.
    -
    -
    printStackTrace(PrintWriter, boolean, boolean, boolean) - Method in exception freemarker.template.TemplateException
    -
     
    -
    printStackTrace(PrintStream, boolean, boolean, boolean) - Method in exception freemarker.template.TemplateException
    -
     
    -
    printStackTrace() - Method in exception freemarker.template.utility.UndeclaredThrowableException
    -
     
    -
    printStackTrace(PrintStream) - Method in exception freemarker.template.utility.UndeclaredThrowableException
    -
     
    -
    printStackTrace(PrintWriter) - Method in exception freemarker.template.utility.UndeclaredThrowableException
    -
     
    -
    printStandardStackTrace(PrintStream) - Method in exception freemarker.template.TemplateException
    -
    -
    Prints the stack trace as if wasn't overridden by TemplateException.
    -
    -
    printStandardStackTrace(PrintWriter) - Method in exception freemarker.template.TemplateException
    -
    -
    Prints the stack trace as if wasn't overridden by TemplateException.
    -
    -
    process() - Method in class freemarker.core.Environment
    -
    -
    Processes the template to which this environment belongs to.
    -
    -
    process(BeansWrapper.MethodAppearanceDecisionInput, BeansWrapper.MethodAppearanceDecision) - Method in interface freemarker.ext.beans.MethodAppearanceFineTuner
    -
    -
    Experimental method; subject to change! - Implement this to tweak certain aspects of how methods appear in the - data-model.
    -
    -
    process(Object, Writer) - Method in class freemarker.template.Template
    -
    -
    Executes template, using the data-model provided, writing the generated output - to the supplied Writer.
    -
    -
    process(Object, Writer, ObjectWrapper, TemplateNodeModel) - Method in class freemarker.template.Template
    -
    -
    Like Template.process(Object, Writer), but also sets a (XML-)node to be recursively processed by the template.
    -
    -
    process(Object, Writer, ObjectWrapper) - Method in class freemarker.template.Template
    -
    - -
    -
    put(Object, Object) - Method in interface freemarker.cache.CacheStorage
    -
     
    -
    put(Object, Object) - Method in class freemarker.cache.MruCacheStorage
    -
     
    -
    put(Object, Object) - Method in class freemarker.cache.NullCacheStorage
    -
     
    -
    put(Object, Object) - Method in class freemarker.cache.SoftCacheStorage
    -
     
    -
    put(Object, Object) - Method in class freemarker.cache.StrongCacheStorage
    -
     
    -
    put(Object, Object) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Associates the specified value with the specified key in this map.
    -
    -
    put(String, Object) - Method in class freemarker.template.SimpleHash
    -
    -
    Adds a key-value entry to the map.
    -
    -
    put(String, boolean) - Method in class freemarker.template.SimpleHash
    -
    -
    Puts a boolean in the map
    -
    -
    putAll(Map) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Copies all of the mappings from the specified map to this one.
    -
    -
    putAll(Map) - Method in class freemarker.template.SimpleHash
    -
    -
    Adds all the key/value entries in the map
    -
    -
    putTemplate(String, String) - Method in class freemarker.cache.StringTemplateLoader
    -
    -
    Puts a template into the loader.
    -
    -
    putTemplate(String, String, long) - Method in class freemarker.cache.StringTemplateLoader
    -
    -
    Puts a template into the loader.
    -
    -
    putUnlistedModel(String, TemplateModel) - Method in class freemarker.ext.servlet.AllHttpScopesHashModel
    -
    -
    Stores a model in the hash so that it doesn't show up in keys() - and values() methods.
    -
    -
    pyInstanceToJava(Object) - Method in class freemarker.ext.jython.JythonVersionAdapter
    -
    -
    Returns - ((PyInstance) py[Java]Instance).__tojava__(java.lang.Object.class).
    -
    -
    - - - -

    R

    -
    -
    registerNamespace(String, String) - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    Registers an XML namespace with this node list.
    -
    -
    registerNamespace(String, String) - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Registers a namespace prefix-URI pair for subsequent use in NodeListModel.get(String) as well as for use in XPath expressions.
    -
    -
    release() - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    remove(Object) - Method in interface freemarker.cache.CacheStorage
    -
     
    -
    remove(Object) - Method in class freemarker.cache.MruCacheStorage
    -
     
    -
    remove(Object) - Method in class freemarker.cache.NullCacheStorage
    -
     
    -
    remove(Object) - Method in class freemarker.cache.SoftCacheStorage
    -
     
    -
    remove(Object) - Method in class freemarker.cache.StrongCacheStorage
    -
     
    -
    remove(Object) - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Removes the mapping for this key from this map if present.
    -
    -
    remove(String) - Method in class freemarker.template.SimpleHash
    -
    -
    Removes the given key from the underlying map.
    -
    -
    removeAutoImport(String) - Method in class freemarker.template.Configuration
    -
    -
    Removes an auto-import; see Configuration.addAutoImport(String, String).
    -
    -
    removeAutoInclude(String) - Method in class freemarker.template.Configuration
    -
    -
    Removes a template from the auto-include list; see Configuration.addAutoInclude(String).
    -
    -
    removeBreakpoint(Breakpoint) - Method in interface freemarker.debug.Debugger
    -
    -
    Removes a single breakpoint
    -
    -
    removeBreakpoints(String) - Method in interface freemarker.debug.Debugger
    -
    -
    Removes all breakpoints for a specific template
    -
    -
    removeBreakpoints() - Method in interface freemarker.debug.Debugger
    -
    -
    Removes all breakpoints
    -
    -
    removeComments(Node) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Recursively removes all comment nodes - from the subtree.
    -
    -
    removeCustomAttribute(String) - Method in class freemarker.core.Configurable
    -
    -
    Removes a named custom attribute for this configurable.
    -
    -
    removeDebuggerListener(Object) - Method in interface freemarker.debug.Debugger
    -
    -
    Removes a previously added debugger listener.
    -
    -
    removeFromClassIntrospectionCache(Class) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Removes the introspection data for a class from the cache.
    -
    -
    removePIs(Node) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Recursively removes all processing instruction nodes - from the subtree.
    -
    -
    removeTemplate(String, Locale, String, boolean) - Method in class freemarker.cache.TemplateCache
    -
    -
    Removes an entry from the cache, hence forcing the re-loading of it when - it's next time requested.
    -
    -
    removeTemplateFromCache(String) - Method in class freemarker.template.Configuration
    -
    -
    Equivalent to removeTemplateFromCache(name, thisCfg.getLocale(), thisCfg.getEncoding(thisCfg.getLocale()), true).
    -
    -
    removeTemplateFromCache(String, Locale) - Method in class freemarker.template.Configuration
    -
    -
    Equivalent to removeTemplateFromCache(name, locale, thisCfg.getEncoding(locale), true).
    -
    -
    removeTemplateFromCache(String, String) - Method in class freemarker.template.Configuration
    -
    -
    Equivalent to removeTemplateFromCache(name, thisCfg.getLocale(), encoding, true).
    -
    -
    removeTemplateFromCache(String, Locale, String) - Method in class freemarker.template.Configuration
    -
    -
    Equivalent to removeTemplateFromCache(name, locale, encoding, true).
    -
    -
    removeTemplateFromCache(String, Locale, String, boolean) - Method in class freemarker.template.Configuration
    -
    -
    Removes a template from the template cache, hence forcing the re-loading - of it when it's next time requested.
    -
    -
    render(Writer) - Method in interface freemarker.template.TemplateDirectiveBody
    -
    -
    Renders the body of the directive body to the specified writer.
    -
    -
    REPEAT_EVALUATION - Static variable in interface freemarker.template.TransformControl
    -
    -
    Constant returned from TransformControl.afterBody() that tells the - template engine to repeat transform body evaluation and feed - it again to the transform.
    -
    -
    replace(String, String, String) - Static method in class freemarker.template.utility.StringUtil
    -
    - -
    -
    replace(String, String, String, boolean, boolean) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Replaces all occurrences of a sub-string in a string.
    -
    -
    requestUrlToTemplatePath(HttpServletRequest) - Method in class freemarker.ext.servlet.FreemarkerServlet
    -
    -
    Maps the request URL to a template path that is passed to - Configuration.getTemplate(String, Locale).
    -
    -
    resetState() - Method in class freemarker.cache.MultiTemplateLoader
    -
     
    -
    resetState() - Method in interface freemarker.cache.StatefulTemplateLoader
    -
    -
    Invoked by Configuration.clearTemplateCache() to instruct this - template loader to throw away its current state and start afresh.
    -
    -
    resolve(String, Environment, Template) - Method in class freemarker.core.OptInTemplateClassResolver
    -
     
    -
    resolve(String, Environment, Template) - Method in interface freemarker.core.TemplateClassResolver
    -
    -
    Gets a Class based on the class name.
    -
    -
    ResourceBundleLocalizedString - Class in freemarker.template
    -
    -
    A concrete implementation of LocalizedString that gets - a localized string from a ResourceBundle
    -
    -
    ResourceBundleLocalizedString(String, String) - Constructor for class freemarker.template.ResourceBundleLocalizedString
    -
     
    -
    ResourceBundleModel - Class in freemarker.ext.beans
    -
    -
    A hash model that wraps a resource bundle.
    -
    -
    ResourceBundleModel(ResourceBundle, BeansWrapper) - Constructor for class freemarker.ext.beans.ResourceBundleModel
    -
     
    -
    resume() - Method in interface freemarker.debug.DebuggedEnvironment
    -
    -
    Resumes the processing of the environment in the remote VM after it was - stopped on a breakpoint.
    -
    -
    RETHROW_HANDLER - Static variable in interface freemarker.template.TemplateExceptionHandler
    -
    -
    TemplateExceptionHandler that simply re-throws the exception; this should be used in most production - systems.
    -
    -
    RhinoFunctionModel - Class in freemarker.ext.rhino
    -
     
    -
    RhinoFunctionModel(Function, Scriptable, BeansWrapper) - Constructor for class freemarker.ext.rhino.RhinoFunctionModel
    -
     
    -
    RhinoScriptableModel - Class in freemarker.ext.rhino
    -
     
    -
    RhinoScriptableModel(Scriptable, BeansWrapper) - Constructor for class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    RhinoWrapper - Class in freemarker.ext.rhino
    -
     
    -
    RhinoWrapper() - Constructor for class freemarker.ext.rhino.RhinoWrapper
    -
     
    -
    rightPad(String, int) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the right with spaces until it reaches the desired - length.
    -
    -
    rightPad(String, int, char) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the right with the specified character until it - reaches the desired length.
    -
    -
    rightPad(String, int, String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Pads the string at the right with a filling pattern until it reaches the - desired length.
    -
    -
    roundingPolicy - Variable in class freemarker.core.ArithmeticEngine
    -
     
    -
    RTFEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Rich Text Format encoding (does not replace line breaks).
    -
    -
    - - - -

    S

    -
    -
    safeGetTemplateName(Template) - Method in class freemarker.core.OptInTemplateClassResolver
    -
    -
    Extract the template name from the template object which will be matched - against the trusted template names and pattern.
    -
    -
    SAFER_RESOLVER - Static variable in interface freemarker.core.TemplateClassResolver
    -
    -
    Same as TemplateClassResolver.UNRESTRICTED_RESOLVER, except that it doesn't allow - resolving ObjectConstructor and Execute and freemarker.template.utility.JythonRuntime.
    -
    -
    SCOPE_CONFIGURATION - Static variable in class freemarker.core.CustomAttribute
    -
    -
    Constant used in the constructor specifying that this attribute is - scoped by the configuration.
    -
    -
    SCOPE_ENVIRONMENT - Static variable in class freemarker.core.CustomAttribute
    -
    -
    Constant used in the constructor specifying that this attribute is - scoped by the environment.
    -
    -
    SCOPE_TEMPLATE - Static variable in class freemarker.core.CustomAttribute
    -
    -
    Constant used in the constructor specifying that this attribute is - scoped by the template.
    -
    -
    SecurityUtilities - Class in freemarker.template.utility
    -
     
    -
    selectLoggerLibrary(int) - Static method in class freemarker.log.Logger
    -
    -
    Selects the logger library to use.
    -
    -
    serialVersionUID - Static variable in class freemarker.ext.servlet.FreemarkerServlet
    -
     
    -
    serialVersionUID - Static variable in class freemarker.ext.util.IdentityHashMap
    -
     
    -
    ServletContextHashModel - Class in freemarker.ext.servlet
    -
    -
    TemplateHashModel wrapper for a ServletContext attributes.
    -
    -
    ServletContextHashModel(GenericServlet, ObjectWrapper) - Constructor for class freemarker.ext.servlet.ServletContextHashModel
    -
     
    -
    ServletContextHashModel(ServletContext, ObjectWrapper) - Constructor for class freemarker.ext.servlet.ServletContextHashModel
    -
    - -
    -
    sessionCreated(HttpSessionEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    sessionDestroyed(HttpSessionEvent) - Method in class freemarker.ext.jsp.EventForwarding
    -
     
    -
    set(Object) - Method in class freemarker.core.CustomAttribute
    -
    -
    Sets the value of the attribute in the context of the current environment.
    -
    -
    set(Object, Template) - Method in class freemarker.core.CustomAttribute
    -
    -
    Sets the value of a template-scope attribute in the context of the given - template.
    -
    -
    setAllSharedVariables(TemplateHashModelEx) - Method in class freemarker.template.Configuration
    -
    -
    Adds all object in the hash as shared variable to the configuration; it's like doing several - Configuration.setSharedVariable(String, Object) calls, one for each hash entry.
    -
    -
    setArithmeticEngine(ArithmeticEngine) - Method in class freemarker.core.Configurable
    -
    -
    Sets the arithmetic engine used to perform arithmetic operations.
    -
    -
    setAttributesShadowItems(boolean) - Method in class freemarker.ext.jython.JythonWrapper
    -
    -
    Sets whether attributes shadow items in wrapped objects.
    -
    -
    setAutoFlush(boolean) - Method in class freemarker.core.Configurable
    -
    -
    Sets whether the output Writer is automatically flushed at - the end of Template.process(Object, Writer) (and its - overloads).
    -
    -
    setAutoImports(Map) - Method in class freemarker.template.Configuration
    -
    -
    Removes all auto-imports, then calls Configuration.addAutoImport(String, String) for each Map-entry (the entry - key is the namespaceVarName).
    -
    -
    setAutoIncludes(List) - Method in class freemarker.template.Configuration
    -
    -
    Removes all auto-includes, then calls Configuration.addAutoInclude(String) for each List items.
    -
    -
    setBasedir(File) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Set the base directory.
    -
    -
    setBodyContent(BodyContent) - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    setBooleanFormat(String) - Method in class freemarker.core.Configurable
    -
    -
    The string value for the boolean true and false values, intended for human audience (not for a - computer language), separated with comma.
    -
    -
    setCacheStorage(CacheStorage) - Method in class freemarker.template.Configuration
    -
    -
    Sets the CacheStorage used for caching Template-s; - the earlier content of the template cache will be dropt.
    -
    -
    setCaching(boolean) - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    setCategoryPrefix(String) - Static method in class freemarker.log.Logger
    -
    -
    Sets a category prefix.
    -
    -
    setClassForTemplateLoading(Class, String) - Method in class freemarker.template.Configuration
    -
    -
    Sets a class relative to which we do the Class.getResource() call to load templates.
    -
    -
    setClassicCompatible(boolean) - Method in class freemarker.core.Configurable
    -
    -
    Toggles the "Classic Compatible" mode.
    -
    -
    setClassicCompatibleAsInt(int) - Method in class freemarker.core.Configurable
    -
    -
    Same as Configurable.setClassicCompatible(boolean), but allows some extra values.
    -
    -
    setConfiguration(Configuration) - Method in class freemarker.cache.TemplateCache
    -
    - -
    -
    setCurrentVisitorNode(TemplateNodeModel) - Method in class freemarker.core.Environment
    -
    -
    sets TemplateNodeModel as the current visitor node.
    -
    -
    setCustomAttribute(String, Object) - Method in class freemarker.core.Configurable
    -
    -
    Sets a named custom attribute for this configurable.
    -
    -
    setDateFormat(String) - Method in class freemarker.core.Configurable
    -
    -
    Sets the format used to convert Date-s to string-s that are date (no time part) values, - also the format that someString?date will use to parse strings.
    -
    -
    setDateFormat(String) - Method in class freemarker.core.Environment
    -
     
    -
    setDateTimeFormat(String) - Method in class freemarker.core.Configurable
    -
    -
    Sets the format used to convert Date-s to string-s that are date-time (timestamp) values, - also the format that someString?datetime will use to parse strings.
    -
    -
    setDateTimeFormat(String) - Method in class freemarker.core.Environment
    -
     
    -
    setDefaultConfiguration(Configuration) - Static method in class freemarker.template.Configuration
    -
    -
    Deprecated. -
    Using the "default" Configuration instance can - easily lead to erroneous, unpredictable behaviour. - See more here....
    -
    -
    -
    setDefaultDateType(int) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Sets the default date type to use for date models that result from - a plain java.util.Date instead of java.sql.Date or - java.sql.Time or java.sql.Timestamp.
    -
    -
    setDefaultDateType(int) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    - -
    -
    setDefaultEncoding(String) - Method in class freemarker.template.Configuration
    -
    -
    Sets the charset used for decoding byte sequences to character sequences when - reading template files in a locale for which no explicit encoding - was specified via Configuration.setEncoding(Locale, String).
    -
    -
    setDefaultObjectWrapper(ObjectWrapper) - Static method in class freemarker.template.WrappingTemplateModel
    -
    -
    Deprecated. -
    This method has VM-wide effect, which makes it unsuitable for application where multiple components - might use FreeMarker internally.
    -
    -
    -
    setDelay(long) - Method in class freemarker.cache.TemplateCache
    -
    -
    Sets the delay in milliseconds between checking for newer versions of a - template sources.
    -
    -
    setDestdir(File) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Set the destination directory into which the generated - files should be copied to
    -
    -
    setDirectoryForTemplateLoading(File) - Method in class freemarker.template.Configuration
    -
    -
    Sets the file system directory from which to load templates.
    -
    -
    setDocumentBuilderFactory(DocumentBuilderFactory) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Sets the DOM Parser implementation to be used when building NodeModel - objects from XML files.
    -
    -
    setEncoding(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Set encoding for generated files.
    -
    -
    setEncoding(Locale, String) - Method in class freemarker.template.Configuration
    -
    -
    Sets the character set encoding to use for templates of - a given locale.
    -
    -
    setEncoding(String) - Method in class freemarker.template.Template
    -
    -
    Sets the character encoding to use for - included files.
    -
    -
    setErrorHandler(ErrorHandler) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    sets the error handler to use when parsing the document.
    -
    -
    setExposeAsProperty(PropertyDescriptor) - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    setExposeFields(boolean) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Controls whether public instance fields of classes are exposed to - templates.
    -
    -
    setExposeFields(boolean) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    - -
    -
    setExposeMethodAs(String) - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    setExposureLevel(int) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Sets the method exposure level.
    -
    -
    setExposureLevel(int) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    - -
    -
    setExtension(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Set the output file extension.
    -
    -
    setFile(File) - Method in class freemarker.ext.ant.JythonAntTask
    -
     
    -
    setGlobalVariable(String, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Sets a variable that is visible globally.
    -
    -
    setIncompatibleEnhancements(String) - Method in class freemarker.template.Configuration
    -
    - -
    -
    setIncompatibleImprovements(Version) - Method in class freemarker.template.Configuration
    -
    -
    Use Configuration.Configuration(Version) instead if possible; see the meaning of the parameter there.
    -
    -
    setIncremental(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Turn on/off incremental processing.
    -
    -
    setLocale(Locale) - Method in class freemarker.core.Configurable
    -
    -
    Sets the default locale used for number and date formatting (among others), also the locale used for searching - localized template variations when no locale was explicitly requested.
    -
    -
    setLocale(Locale) - Method in class freemarker.core.Environment
    -
     
    -
    setLocalizedLookup(boolean) - Method in class freemarker.cache.TemplateCache
    -
    -
    Setis if localized template lookup is enabled or not.
    -
    -
    setLocalizedLookup(boolean) - Method in class freemarker.template.Configuration
    -
    -
    Enables/disables localized template lookup.
    -
    -
    setLocalVariable(String, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Sets a local variable (one effective only during a macro invocation).
    -
    -
    setMaxScale(int) - Method in class freemarker.core.ArithmeticEngine
    -
    -
    Sets the maximal scale to use when multiplying BigDecimal numbers.
    -
    -
    setMethodAppearanceFineTuner(MethodAppearanceFineTuner) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Used to tweak certain aspects of how methods appear in the data-model; - see MethodAppearanceFineTuner for more.
    -
    -
    setMethodAppearanceFineTuner(MethodAppearanceFineTuner) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    -
    See BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner); additionally, - note that currently setting this to non-null will disable class introspection cache sharing, unless - the value implements SingletonCustomizer.
    -
    -
    setMethodShadowsProperty(boolean) - Method in class freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision
    -
     
    -
    setMethodsShadowItems(boolean) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Sets whether methods shadow items in beans.
    -
    -
    setMinScale(int) - Method in class freemarker.core.ArithmeticEngine
    -
    -
    Sets the minimal scale to use when dividing BigDecimal numbers.
    -
    -
    setModels(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    setName(String) - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    setNewBuiltinClassResolver(TemplateClassResolver) - Method in class freemarker.core.Configurable
    -
    -
    Sets the TemplateClassResolver that is used when the - new built-in is called in a template.
    -
    -
    setNullModel(TemplateModel) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Sets the null model.
    -
    -
    setNumberFormat(String) - Method in class freemarker.core.Configurable
    -
    -
    Sets the number format used to convert numbers to strings.
    -
    -
    setNumberFormat(String) - Method in class freemarker.core.Environment
    -
     
    -
    setObjectWrapper(ObjectWrapper) - Method in class freemarker.core.Configurable
    -
    -
    Sets the object wrapper used to wrap objects to TemplateModel-s.
    -
    -
    setObjectWrapper(ObjectWrapper) - Method in class freemarker.template.Configuration
    -
     
    -
    setObjectWrapper(ObjectWrapper) - Method in class freemarker.template.WrappingTemplateModel
    -
     
    -
    setOut(Writer) - Method in class freemarker.core.Environment
    -
     
    -
    setOuterIdentity(ObjectWrapper) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    When wrapping an object, the BeansWrapper commonly needs to wrap - "sub-objects", for example each element in a wrapped collection.
    -
    -
    setOuterIdentity(ObjectWrapper) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    -
    See BeansWrapper.setOuterIdentity(ObjectWrapper), except here the default is null that means - the ObjectWrapper that you will set up with this BeansWrapperBuilder object.
    -
    -
    setOutputEncoding(String) - Method in class freemarker.core.Configurable
    -
    -
    Informs FreeMarker about the charset used for the output.
    -
    -
    setOutputEncoding(String) - Method in class freemarker.core.Environment
    -
     
    -
    setPageContext(PageContext) - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    setParent(Tag) - Method in class freemarker.ext.jsp.FreemarkerTag
    -
     
    -
    setProjectfile(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Set the path to the project XML file
    -
    -
    setRoundingPolicy(int) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    setServletContextForTemplateLoading(Object, String) - Method in class freemarker.template.Configuration
    -
    -
    Sets the servlet context from which to load templates.
    -
    -
    setSetting(String, String) - Method in class freemarker.core.Configurable
    -
    -
    Sets a FreeMarker setting by a name and string value.
    -
    -
    setSetting(String, String) - Method in class freemarker.template.Configuration
    -
     
    -
    setSettings(Properties) - Method in class freemarker.core.Configurable
    -
    -
    Set the settings stored in a Properties object.
    -
    -
    setSettings(InputStream) - Method in class freemarker.core.Configurable
    -
    -
    Reads a setting list (key and element pairs) from the input stream.
    -
    -
    setSharedVariable(String, TemplateModel) - Method in class freemarker.template.Configuration
    -
    -
    Adds a shared variable to the configuration.
    -
    -
    setSharedVariable(String, Object) - Method in class freemarker.template.Configuration
    -
    -
    Adds shared variable to the configuration; It uses Configurable.getObjectWrapper() to wrap the - value, so it's important that the object wrapper is set before this.
    -
    -
    setSharedVaribles(Map) - Method in class freemarker.template.Configuration
    -
    -
    Replaces all shared variables (removes all previously added ones).
    -
    -
    setShowErrorTips(boolean) - Method in class freemarker.core.Configurable
    -
    -
    Sets if tips should be shown in error messages of errors arising during template processing.
    -
    -
    setSimpleMapWrapper(boolean) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    When set to true, the keys in Map-s won't mix with the method names when looking at them - from templates.
    -
    -
    setSimpleMapWrapper(boolean) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    - -
    -
    setSQLDateAndTimeTimeZone(TimeZone) - Method in class freemarker.core.Configurable
    -
    -
    Sets the time zone used when dealing with java.sql.Date and - java.sql.Time values.
    -
    -
    setSQLDateAndTimeTimeZone(TimeZone) - Method in class freemarker.core.Environment
    -
     
    -
    setStrict(boolean) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Specifies if an attempt to read a bean property that doesn't exist in the - wrapped object should throw an InvalidPropertyException.
    -
    -
    setStrict(boolean) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    - -
    -
    setStrictBeanModels(boolean) - Method in class freemarker.core.Configurable
    -
     
    -
    setStrictSyntaxMode(boolean) - Method in class freemarker.template.Configuration
    -
    -
    Deprecated. -
    Only true (the default) value will be supported sometimes in the future.
    -
    -
    -
    setTagSyntax(int) - Method in class freemarker.template.Configuration
    -
    -
    Determines the syntax of the template files (angle bracket VS square bracket) - that has no #ftl in it.
    -
    -
    setTemplate(Template) - Method in class freemarker.core.FreeMarkerTree
    -
    -
    Deprecated.
    -
    setTemplate(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    setTemplateDir(File) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    setTemplateEncoding(String) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    setTemplateExceptionHandler(TemplateExceptionHandler) - Method in class freemarker.core.Configurable
    -
    -
    Sets the exception handler used to handle exceptions occurring inside templates.
    -
    -
    setTemplateExceptionHandler(TemplateExceptionHandler) - Method in class freemarker.core.Environment
    -
     
    -
    setTemplateLoader(TemplateLoader) - Method in class freemarker.template.Configuration
    -
    -
    Sets a TemplateLoader that is used to look up and load templates; - as a side effect the template cache will be emptied.
    -
    -
    setTemplateName(String) - Method in exception freemarker.core.ParseException
    -
    -
    Should be used internally only; sets the name of the template that contains the error.
    -
    -
    setTemplateUpdateDelay(int) - Method in class freemarker.template.Configuration
    -
    -
    Sets the time in seconds that must elapse before checking whether there is a newer version of a template file - than the cached one.
    -
    -
    setTimeFormat(String) - Method in class freemarker.core.Configurable
    -
    -
    Sets the format used to convert Date-s to string-s that are time (no date part) values, - also the format that someString?time will use to parse strings.
    -
    -
    setTimeFormat(String) - Method in class freemarker.core.Environment
    -
     
    -
    setTimeZone(TimeZone) - Method in class freemarker.core.Configurable
    -
    -
    Sets the time zone to use when formatting date/time values.
    -
    -
    setTimeZone(TimeZone) - Method in class freemarker.core.Environment
    -
     
    -
    settingValueAssignmentException(String, String, Throwable) - Method in class freemarker.core.Configurable
    -
     
    -
    setURLConnectionUsesCaches(Boolean) - Method in class freemarker.cache.URLTemplateLoader
    -
    -
    Sets if URLConnection.setUseCaches(boolean) will be called, and with what value.
    -
    -
    setURLConnectionUsesCaches(Boolean) - Method in class freemarker.cache.WebappTemplateLoader
    -
    - -
    -
    setURLEscapingCharset(String) - Method in class freemarker.core.Configurable
    -
    -
    Sets the URL escaping charset.
    -
    -
    setURLEscapingCharset(String) - Method in class freemarker.core.Environment
    -
     
    -
    setUseCache(boolean) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Sets whether this wrapper caches the TemplateModel-s created for the Java objects that has wrapped with - this object wrapper.
    -
    -
    setUseCache(boolean) - Method in class freemarker.ext.jython.JythonWrapper
    -
    -
    Sets whether this wrapper caches model instances.
    -
    -
    setUseCache(boolean) - Method in class freemarker.ext.util.ModelCache
    -
    -
    Sets whether this wrapper caches model instances.
    -
    -
    setUseModelCache(boolean) - Method in class freemarker.ext.beans.BeansWrapperConfiguration
    -
    -
    See BeansWrapper.setUseCache(boolean) (it means the same).
    -
    -
    setValidation(boolean) - Method in class freemarker.ext.ant.FreemarkerXmlTask
    -
    -
    Deprecated.
    -
    Sets whether to validate the XML input.
    -
    -
    setVariable(String, TemplateModel) - Method in class freemarker.core.Environment
    -
    -
    Sets a variable in the current namespace.
    -
    -
    setWhitespaceStripping(boolean) - Method in class freemarker.template.Configuration
    -
    -
    Sets whether the FTL parser will try to remove - superfluous white-space around certain FTL tags.
    -
    -
    setXPathSupportClass(Class) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Set an alternative implementation of freemarker.ext.dom.XPathSupport to use - as the XPath engine.
    -
    -
    SHOW_ERROR_TIPS_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    SIMPLE_WRAPPER - Static variable in interface freemarker.template.ObjectWrapper
    -
    -
    Deprecated. -
    No replacement as it was seldom if ever used by anyone; this instance isn't - read-only and thus can't be trusted.
    -
    -
    -
    SimpleCollection - Class in freemarker.template
    -
    -
    A simple implementation of TemplateCollectionModel.
    -
    -
    SimpleCollection(Iterator) - Constructor for class freemarker.template.SimpleCollection
    -
    - -
    -
    SimpleCollection(Collection) - Constructor for class freemarker.template.SimpleCollection
    -
    - -
    -
    SimpleCollection(Iterator, ObjectWrapper) - Constructor for class freemarker.template.SimpleCollection
    -
     
    -
    SimpleCollection(Collection, ObjectWrapper) - Constructor for class freemarker.template.SimpleCollection
    -
     
    -
    SimpleDate - Class in freemarker.template
    -
    -
    A simple implementation of the TemplateDateModel - interface.
    -
    -
    SimpleDate(Date) - Constructor for class freemarker.template.SimpleDate
    -
    -
    Creates a new date model wrapping the specified date object and - having DATE type.
    -
    -
    SimpleDate(Time) - Constructor for class freemarker.template.SimpleDate
    -
    -
    Creates a new date model wrapping the specified time object and - having TIME type.
    -
    -
    SimpleDate(Timestamp) - Constructor for class freemarker.template.SimpleDate
    -
    -
    Creates a new date model wrapping the specified time object and - having DATETIME type.
    -
    -
    SimpleDate(Date, int) - Constructor for class freemarker.template.SimpleDate
    -
    -
    Creates a new date model wrapping the specified date object and - having the specified type.
    -
    -
    SimpleHash - Class in freemarker.template
    -
    -
    A simple implementation of the TemplateHashModelEx - interface, using an underlying Map or SortedMap.
    -
    -
    SimpleHash() - Constructor for class freemarker.template.SimpleHash
    -
    - -
    -
    SimpleHash(Map) - Constructor for class freemarker.template.SimpleHash
    -
    - -
    -
    SimpleHash(ObjectWrapper) - Constructor for class freemarker.template.SimpleHash
    -
    -
    Creates an empty simple hash using the specified object wrapper.
    -
    -
    SimpleHash(Map, ObjectWrapper) - Constructor for class freemarker.template.SimpleHash
    -
    -
    Creates a new simple hash with the copy of the underlying map and - either the default wrapper set in - WrappingTemplateModel.setDefaultObjectWrapper(ObjectWrapper), or - the JavaBeans wrapper.
    -
    -
    SimpleList - Class in freemarker.template
    -
    -
    Deprecated. -
    Use SimpleSequence instead.
    -
    -
    -
    SimpleList() - Constructor for class freemarker.template.SimpleList
    -
    -
    Deprecated.
    -
    SimpleList(List) - Constructor for class freemarker.template.SimpleList
    -
    -
    Deprecated.
    -
    SimpleMapModel - Class in freemarker.ext.beans
    -
    -
    Model used by BeansWrapper when simpleMapWrapper - mode is enabled.
    -
    -
    SimpleMapModel(Map, BeansWrapper) - Constructor for class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    SimpleMethodModel - Class in freemarker.ext.beans
    -
    -
    A class that will wrap a reflected method call into a - TemplateMethodModel interface.
    -
    -
    SimpleNumber - Class in freemarker.template
    -
    -
    A simple implementation of the TemplateNumberModel - interface.
    -
    -
    SimpleNumber(Number) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(byte) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(short) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(int) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(long) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(float) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleNumber(double) - Constructor for class freemarker.template.SimpleNumber
    -
     
    -
    SimpleObjectWrapper - Class in freemarker.template
    -
    -
    A restricted object wrapper that will not expose arbitrary object, just those that directly correspond to the - TemplateModel sub-interfaces (String, Map and such).
    -
    -
    SimpleObjectWrapper() - Constructor for class freemarker.template.SimpleObjectWrapper
    -
    - -
    -
    SimpleObjectWrapper(Version) - Constructor for class freemarker.template.SimpleObjectWrapper
    -
     
    -
    SimpleScalar - Class in freemarker.template
    -
    -
    A simple implementation of the TemplateScalarModel - interface, using a String.
    -
    -
    SimpleScalar(String) - Constructor for class freemarker.template.SimpleScalar
    -
    -
    Constructs a SimpleScalar containing a string value.
    -
    -
    SimpleSequence - Class in freemarker.template
    -
    -
    A convenient implementation of a list.
    -
    -
    SimpleSequence() - Constructor for class freemarker.template.SimpleSequence
    -
    - -
    -
    SimpleSequence(int) - Constructor for class freemarker.template.SimpleSequence
    -
    - -
    -
    SimpleSequence(Collection) - Constructor for class freemarker.template.SimpleSequence
    -
    - -
    -
    SimpleSequence(TemplateCollectionModel) - Constructor for class freemarker.template.SimpleSequence
    -
    -
    Constructs a simple sequence from the passed collection model using the - default object wrapper set in - WrappingTemplateModel.setDefaultObjectWrapper(ObjectWrapper).
    -
    -
    SimpleSequence(ObjectWrapper) - Constructor for class freemarker.template.SimpleSequence
    -
    -
    Constructs an empty simple sequence using the specified object wrapper.
    -
    -
    SimpleSequence(int, ObjectWrapper) - Constructor for class freemarker.template.SimpleSequence
    -
    -
    Constructs an empty simple sequence with preallocated capacity.
    -
    -
    SimpleSequence(Collection, ObjectWrapper) - Constructor for class freemarker.template.SimpleSequence
    -
    -
    Constructs a simple sequence that will contain the elements - from the specified Collection and will use the specified object - wrapper.
    -
    -
    simplify(Node) - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Removes comments and processing instruction, and then unites adjacent text nodes.
    -
    -
    SingletonCustomizer - Interface in freemarker.ext.beans
    -
    -
    Marker interface useful when used together with MethodAppearanceFineTuner and such customizer objects, to - indicate that it doesn't contain reference to the ObjectWrapper (so beware with non-static inner - classes) and can be and should be used in call introspection cache keys.
    -
    -
    singletonList(Object) - Static method in class freemarker.template.utility.Collections12
    -
    -
    Deprecated.
    -
    singletonMap(Object, Object) - Static method in class freemarker.template.utility.Collections12
    -
    -
    Deprecated.
    -
    size() - Method in interface freemarker.debug.DebugModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.ArrayModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.CollectionModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.MapModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.OverloadedMethodsModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.ResourceBundleModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    size() - Method in class freemarker.ext.beans.SimpleMethodModel
    -
     
    -
    size() - Method in class freemarker.ext.dom.NodeModel
    -
     
    -
    size() - Method in class freemarker.ext.jdom.NodeListModel
    -
    -
    Deprecated.
    -
    size() - Method in class freemarker.ext.jython.JythonHashModel
    -
    -
    Returns PyObject.__len__().
    -
    -
    size() - Method in class freemarker.ext.jython.JythonSequenceModel
    -
    -
    Returns PyObject.__len__().
    -
    -
    size() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    size() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    size() - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    size() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns the number of key-value mappings in this map.
    -
    -
    size() - Method in class freemarker.ext.xml.NodeListModel
    -
    -
    Deprecated.
    -
    Returns the number of nodes in this model's nodelist.
    -
    -
    size() - Method in class freemarker.template.SimpleHash
    -
     
    -
    size() - Method in class freemarker.template.SimpleSequence
    -
     
    -
    size() - Method in interface freemarker.template.TemplateHashModelEx
    -
     
    -
    size() - Method in class freemarker.template.TemplateModelListSequence
    -
     
    -
    size() - Method in interface freemarker.template.TemplateSequenceModel
    -
     
    -
    SKIP_BODY - Static variable in interface freemarker.template.TransformControl
    -
    -
    Constant returned from TransformControl.onStart() that tells the - template engine to skip evaluation of the body.
    -
    -
    SoftCacheStorage - Class in freemarker.cache
    -
    -
    Soft cache storage is a cache storage that uses SoftReference - objects to hold the objects it was passed, therefore allows the garbage - collector to purge the cache when it determines that it wants to free up - memory.
    -
    -
    SoftCacheStorage() - Constructor for class freemarker.cache.SoftCacheStorage
    -
     
    -
    SoftCacheStorage(Map) - Constructor for class freemarker.cache.SoftCacheStorage
    -
     
    -
    specialConstructor - Variable in exception freemarker.core.ParseException
    -
    -
    Deprecated. -
    Will be remove without replacement in 2.4.
    -
    -
    -
    specifiedEncoding - Variable in exception freemarker.template.Template.WrongEncodingException
    -
     
    -
    split(String, char) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Splits a string at the specified character.
    -
    -
    split(String, String, boolean) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Splits a string at the specified string.
    -
    -
    SQL_DATE_AND_TIME_TIME_ZONE_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    SQUARE_BRACKET_TAG_SYNTAX - Static variable in class freemarker.template.Configuration
    -
     
    -
    StandardCompress - Class in freemarker.template.utility
    -
    -
    A filter that compresses each sequence of consecutive whitespace - to a single line break (if the sequence contains a line break) or a - single space.
    -
    -
    StandardCompress() - Constructor for class freemarker.template.utility.StandardCompress
    -
     
    -
    StandardCompress(int) - Constructor for class freemarker.template.utility.StandardCompress
    -
     
    -
    StatefulTemplateLoader - Interface in freemarker.cache
    -
    -
    Interface that can be implemented by template loaders that maintain some - sort of internal state (i.e.
    -
    -
    stop() - Method in interface freemarker.debug.DebuggedEnvironment
    -
    -
    Stops the processing of the environment after it was stopped on - a breakpoint.
    -
    -
    StopException - Exception in freemarker.core
    -
    -
    This exception is thrown when a #stop directive is encountered.
    -
    -
    STRICT_BEAN_MODELS - Static variable in class freemarker.core.Configurable
    -
     
    -
    STRICT_SYNTAX_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    StringModel - Class in freemarker.ext.beans
    -
    -
    Subclass of BeanModel that exposes the return value of the Object.toString() method through the TemplateScalarModel - interface.
    -
    -
    StringModel(Object, BeansWrapper) - Constructor for class freemarker.ext.beans.StringModel
    -
    -
    Creates a new model that wraps the specified object with BeanModel + scalar - functionality.
    -
    -
    StringTemplateLoader - Class in freemarker.cache
    -
    -
    A TemplateLoader that uses a Map with Strings as its source of - templates.
    -
    -
    StringTemplateLoader() - Constructor for class freemarker.cache.StringTemplateLoader
    -
     
    -
    StringUtil - Class in freemarker.template.utility
    -
    -
    Some text related utilities.
    -
    -
    StringUtil() - Constructor for class freemarker.template.utility.StringUtil
    -
     
    -
    StrongCacheStorage - Class in freemarker.cache
    -
    -
    Strong cache storage is a cache storage that simply wraps a Map.
    -
    -
    StrongCacheStorage() - Constructor for class freemarker.cache.StrongCacheStorage
    -
     
    -
    subtract(Number, Number) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    subtract(Number, Number) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    subtract(Number, Number) - Method in class freemarker.core.ArithmeticEngine
    -
     
    -
    synchronizedWrapper() - Method in class freemarker.template.SimpleHash
    -
     
    -
    synchronizedWrapper() - Method in class freemarker.template.SimpleSequence
    -
     
    -
    - - - -

    T

    -
    -
    TAG_SYNTAX_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    TaglibFactory - Class in freemarker.ext.jsp
    -
    -
    A hash model associated with a servlet context that can load JSP tag - libraries associated with that servlet context.
    -
    -
    TaglibFactory(ServletContext) - Constructor for class freemarker.ext.jsp.TaglibFactory
    -
    -
    Creates a new JSP taglib factory that will be used to load JSP taglibs - for the web application represented by the passed servlet context.
    -
    -
    Template - Class in freemarker.template
    -
    -
    Stores an already parsed template, ready to be processed (rendered) for unlimited times, possibly from - multiple threads.
    -
    -
    Template(String, Reader, Configuration) - Constructor for class freemarker.template.Template
    -
    -
    Constructs a template from a character stream.
    -
    -
    Template(String, String, Configuration) - Constructor for class freemarker.template.Template
    -
    - -
    -
    Template(String, Reader, Configuration, String) - Constructor for class freemarker.template.Template
    -
    - -
    -
    Template(String, Reader) - Constructor for class freemarker.template.Template
    -
    -
    Deprecated. -
    This constructor uses the "default" Configuration - instance, which can easily lead to erroneous, unpredictable behavior. - See more here....
    -
    -
    -
    Template.WrongEncodingException - Exception in freemarker.template
    -
     
    -
    TEMPLATE_EXCEPTION_HANDLER_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    TEMPLATE_LOADER_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    TEMPLATE_UPDATE_DELAY_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    TemplateBooleanModel - Interface in freemarker.template
    -
    -
    "boolean" template language data type; same as in Java; either true or false.
    -
    -
    TemplateCache - Class in freemarker.cache
    -
    -
    Performs caching and on-demand loading of the templates.
    -
    -
    TemplateCache() - Constructor for class freemarker.cache.TemplateCache
    -
    -
    Deprecated. -
    Use TemplateCache.TemplateCache(TemplateLoader) instead. The default loader is useless in most - applications, also it can mean a security risk.
    -
    -
    -
    TemplateCache(TemplateLoader) - Constructor for class freemarker.cache.TemplateCache
    -
    - -
    -
    TemplateCache(TemplateLoader, CacheStorage) - Constructor for class freemarker.cache.TemplateCache
    -
    - -
    -
    TemplateCache(TemplateLoader, Configuration) - Constructor for class freemarker.cache.TemplateCache
    -
    -
    Creates an instance with the default CacheStorage.
    -
    -
    TemplateCache(TemplateLoader, CacheStorage, Configuration) - Constructor for class freemarker.cache.TemplateCache
    -
     
    -
    TemplateClassResolver - Interface in freemarker.core
    -
    -
    Used by built-ins and other template language features that get a class - based on a string.
    -
    -
    TemplateCollectionModel - Interface in freemarker.template
    -
    -
    "collection" template language data type: a collection of values that can be enumerated, repeatedly (not just once).
    -
    -
    TemplateDateModel - Interface in freemarker.template
    -
    -
    "date", "time" and "date-time" template language data types: corresponds to Date.
    -
    -
    TemplateDirectiveBody - Interface in freemarker.template
    -
    -
    Represents the nested content of a directive (TemplateDirectiveModel) invocation.
    -
    -
    TemplateDirectiveModel - Interface in freemarker.template
    -
    -
    "directive" template language data type: used as user-defined directives - (much like macros) in templates.
    -
    -
    TemplateException - Exception in freemarker.template
    -
    -
    Runtime exception in a template (as opposed to a parsing-time exception: ParseException).
    -
    -
    TemplateException(Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    Constructs a TemplateException with no specified detail message - or underlying cause.
    -
    -
    TemplateException(String, Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    Constructs a TemplateException with the given detail message, - but no underlying cause exception.
    -
    -
    TemplateException(Exception, Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    The same as TemplateException.TemplateException(Throwable, Environment); it's exists only for binary - backward-compatibility.
    -
    -
    TemplateException(Throwable, Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    Constructs a TemplateException with the given underlying Exception, - but no detail message.
    -
    -
    TemplateException(String, Exception, Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    The same as TemplateException.TemplateException(String, Throwable, Environment); it's exists only for binary - backward-compatibility.
    -
    -
    TemplateException(String, Throwable, Environment) - Constructor for exception freemarker.template.TemplateException
    -
    -
    Constructs a TemplateException with both a description of the error - that occurred and the underlying Exception that caused this exception - to be raised.
    -
    -
    TemplateException(Throwable, Environment, Expression, _ErrorDescriptionBuilder) - Constructor for exception freemarker.template.TemplateException
    -
    -
    Don't use this; this is to be used internally by FreeMarker.
    -
    -
    TemplateExceptionHandler - Interface in freemarker.template
    -
    -
    Used for the template_exception_handler configuration setting; - see Configurable.setTemplateExceptionHandler(TemplateExceptionHandler) for more.
    -
    -
    TemplateHashModel - Interface in freemarker.template
    -
    -
    "hash" template language data type: an object that contains other objects accessible through string keys - (sub-variable names).
    -
    -
    TemplateHashModelEx - Interface in freemarker.template
    -
    -
    "extended hash" template language data type; extends TemplateHashModel by allowing - iterating through its keys and values.
    -
    -
    TemplateLoader - Interface in freemarker.cache
    -
    -
    FreeMarker loads template "files" through objects that implement this interface, - thus the templates need not be real files, and can come from any kind of data source - (like classpath, servlet context, database, etc).
    -
    -
    TemplateMethodModel - Interface in freemarker.template
    -
    -
    Deprecated. -
    Use TemplateMethodModelEx instead. This interface is from the old times when the only kind of - value you could pass in was string.
    -
    -
    -
    TemplateMethodModelEx - Interface in freemarker.template
    -
    -
    "extended method" template language data type: Objects that act like functions.
    -
    -
    TemplateModel - Interface in freemarker.template
    -
    -
    The common super-interface of the interfaces that stand for the FreeMarker Template Language data types.
    -
    -
    TemplateModelAdapter - Interface in freemarker.template
    -
    -
    Implemented by classes that serve as adapters for template model objects in - some other object model.
    -
    -
    TemplateModelException - Exception in freemarker.template
    -
    -
    TemplateModel methods throw this exception if the requested data can't be retrieved.
    -
    -
    TemplateModelException() - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Constructs a TemplateModelException with no - specified detail message.
    -
    -
    TemplateModelException(String) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Constructs a TemplateModelException with the - specified detail message.
    -
    -
    TemplateModelException(Exception) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    The same as TemplateModelException.TemplateModelException(Throwable); it's exists only for binary - backward-compatibility.
    -
    -
    TemplateModelException(Throwable) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Constructs a TemplateModelException with the given underlying - Exception, but no detail message.
    -
    -
    TemplateModelException(String, Exception) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    The same as TemplateModelException.TemplateModelException(String, Throwable); it's exists only for binary - backward-compatibility.
    -
    -
    TemplateModelException(String, Throwable) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Constructs a TemplateModelException with both a description of the error - that occurred and the underlying Exception that caused this exception - to be raised.
    -
    -
    TemplateModelException(Throwable, Environment, String, boolean) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Don't use this; this is to be used internally by FreeMarker.
    -
    -
    TemplateModelException(Throwable, Environment, _ErrorDescriptionBuilder, boolean) - Constructor for exception freemarker.template.TemplateModelException
    -
    -
    Don't use this; this is to be used internally by FreeMarker.
    -
    -
    TemplateModelIterator - Interface in freemarker.template
    -
    -
    Used to iterate over a set of template models once; usually returned from - TemplateCollectionModel.iterator().
    -
    -
    TemplateModelListSequence - Class in freemarker.template
    -
    -
    A sequence that wraps a List of TemplateModel-s.
    -
    -
    TemplateModelListSequence(List) - Constructor for class freemarker.template.TemplateModelListSequence
    -
     
    -
    TemplateNodeModel - Interface in freemarker.template
    -
    -
    "node" template language data type: an object that is a node in a tree.
    -
    -
    TemplateNumberModel - Interface in freemarker.template
    -
    -
    "number" template language data type; an object that stores a number.
    -
    -
    TemplateScalarModel - Interface in freemarker.template
    -
    -
    "string" template language data-type; like in Java, an unmodifiable UNICODE character sequence.
    -
    -
    TemplateSequenceModel - Interface in freemarker.template
    -
    -
    "sequence" template language data type; an object that contains other objects accessible through - an integer 0-based index.
    -
    -
    TemplateTransformModel - Interface in freemarker.template
    -
    -
    "transform" template language data type: user-defined directives - (much like macros) specialized on filtering output; you should rather use the newer TemplateDirectiveModel - instead.
    -
    -
    TIME - Static variable in interface freemarker.template.TemplateDateModel
    -
    -
    The date model represents a time value (no date part).
    -
    -
    TIME_FORMAT_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    TIME_ZONE_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    ToCanonical - Class in freemarker.template.utility
    -
    -
    Read in a template and convert it to a canonical format.
    -
    -
    ToCanonical() - Constructor for class freemarker.template.utility.ToCanonical
    -
     
    -
    tokenImage - Variable in exception freemarker.core.ParseException
    -
    -
    This is a reference to the "tokenImage" array of the generated - parser within which the parse error occurred.
    -
    -
    toList() - Method in class freemarker.template.SimpleSequence
    -
    -
    Note that this method creates and returns a deep-copy of the underlying list used - internally.
    -
    -
    toMap() - Method in class freemarker.template.SimpleHash
    -
    -
    Note that this method creates and returns a deep-copy of the underlying hash used - internally.
    -
    -
    toNumber(String) - Method in class freemarker.core.ArithmeticEngine.BigDecimalEngine
    -
     
    -
    toNumber(String) - Method in class freemarker.core.ArithmeticEngine.ConservativeEngine
    -
     
    -
    toNumber(String) - Method in class freemarker.core.ArithmeticEngine
    -
    -
    Should be able to parse all FTL numerical literals, Java Double toString results, and XML Schema numbers.
    -
    -
    toString() - Method in class freemarker.cache.ClassTemplateLoader
    -
    -
    Show class name and some details that are useful in template-not-found errors.
    -
    -
    toString() - Method in class freemarker.cache.FileTemplateLoader
    -
    -
    Show class name and some details that are useful in template-not-found errors.
    -
    -
    toString() - Method in class freemarker.cache.MultiTemplateLoader
    -
    -
    Show class name and some details that are useful in template-not-found errors.
    -
    -
    toString() - Method in class freemarker.cache.StringTemplateLoader
    -
    -
    Show class name and some details that are useful in template-not-found errors.
    -
    -
    toString() - Method in class freemarker.cache.WebappTemplateLoader
    -
    -
    Show class name and some details that are useful in template-not-found errors.
    -
    -
    toString() - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    toString() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Returns the exact class name and the identity hash, also the values of the most often used BeansWrapper - configuration properties, also if which (if any) shared class introspection cache it uses.
    -
    -
    toString() - Method in class freemarker.ext.beans.SimpleMethodModel
    -
     
    -
    toString() - Method in class freemarker.template.SimpleDate
    -
     
    -
    toString() - Method in class freemarker.template.SimpleHash
    -
    -
    Convenience method for returning the String value of the - underlying map.
    -
    -
    toString() - Method in class freemarker.template.SimpleNumber
    -
     
    -
    toString() - Method in class freemarker.template.SimpleScalar
    -
     
    -
    toString() - Method in class freemarker.template.SimpleSequence
    -
     
    -
    toString() - Method in class freemarker.template.Template
    -
    -
    Returns a string representing the raw template - text in canonical form.
    -
    -
    toString() - Method in class freemarker.template.Version
    -
    -
    Contains the major.minor.micor numbers and the extraInfo part, not the other information.
    -
    -
    transcode(String) - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    Transform - Class in freemarker.ext.dom
    -
    -
    A class that contains a main() method for command-line invocation - of a FreeMarker XML transformation.
    -
    -
    transform(Reader, Writer) - Method in class freemarker.template.utility.NormalizeNewlines
    -
    -
    Performs newline normalization on FreeMarker output.
    -
    -
    TransformControl - Interface in freemarker.template
    -
    -
    An interface that can be implemented by writers returned from - TemplateTransformModel.getWriter(java.io.Writer, java.util.Map).
    -
    -
    TrivialCalendarFieldsToDateConverter() - Constructor for class freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter
    -
     
    -
    TrivialDateToISO8601CalendarFactory() - Constructor for class freemarker.template.utility.DateUtil.TrivialDateToISO8601CalendarFactory
    -
     
    -
    TRUE - Static variable in interface freemarker.template.TemplateBooleanModel
    -
    -
    A singleton object to represent boolean true
    -
    -
    TRUE - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    tryToString(Object) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Tries to run toString(), but if that fails, returns a "[toString failed: " + e + "]" instead.
    -
    -
    TYPE_BOOLEAN - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_COLLECTION - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_CONFIGURATION - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_DATE - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_ENVIRONMENT - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_HASH - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_HASH_EX - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_METHOD - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_METHOD_EX - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_NAMES - Static variable in interface freemarker.template.TemplateDateModel
    -
     
    -
    TYPE_NUMBER - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_SCALAR - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_SEQUENCE - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_TEMPLATE - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    TYPE_TRANSFORM - Static variable in interface freemarker.debug.DebugModel
    -
     
    -
    - - - -

    U

    -
    -
    UndeclaredThrowableException - Exception in freemarker.template.utility
    -
    -
    The equivalent of JDK 1.3 UndeclaredThrowableException.
    -
    -
    UndeclaredThrowableException(Throwable) - Constructor for exception freemarker.template.utility.UndeclaredThrowableException
    -
     
    -
    UnexpectedTypeException - Exception in freemarker.core
    -
    -
    The type of a value differs from what was expected.
    -
    -
    UnexpectedTypeException(Environment, String) - Constructor for exception freemarker.core.UnexpectedTypeException
    -
     
    -
    UNKNOWN - Static variable in interface freemarker.template.TemplateDateModel
    -
    -
    It is not known whether the date represents a date, a time, or a date-time value.
    -
    -
    unknownSettingException(String) - Method in class freemarker.core.Configurable
    -
     
    -
    UnlinkedJythonOperationsImpl - Class in freemarker.ext.ant
    -
    -
    Used internally, public for technical reasons only.
    -
    -
    UnlinkedJythonOperationsImpl() - Constructor for class freemarker.ext.ant.UnlinkedJythonOperationsImpl
    -
     
    -
    UnrecognizedTimeZoneException - Exception in freemarker.template.utility
    -
    -
    Indicates that the time zone name is not recognized.
    -
    -
    UnrecognizedTimeZoneException(String) - Constructor for exception freemarker.template.utility.UnrecognizedTimeZoneException
    -
     
    -
    UNRESTRICTED_RESOLVER - Static variable in interface freemarker.core.TemplateClassResolver
    -
    - -
    -
    UnsupportedNumberClassException - Exception in freemarker.template.utility
    -
    -
    Thrown when FreeMarker runs into a Number subclass that it doesn't yet support.
    -
    -
    UnsupportedNumberClassException(Class) - Constructor for exception freemarker.template.utility.UnsupportedNumberClassException
    -
     
    -
    unwrap(TemplateModel) - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    unwrap(TemplateModel) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Attempts to unwrap a model into underlying object.
    -
    -
    unwrap(TemplateModel, Class) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Attempts to unwrap a model into an object of the desired class.
    -
    -
    unwrap(TemplateModel) - Method in class freemarker.ext.jython.JythonWrapper
    -
    -
    Coerces a template model into a PyObject.
    -
    -
    unwrap(TemplateModel) - Static method in class freemarker.template.utility.DeepUnwrap
    -
    -
    Unwraps TemplateModel-s recursively.
    -
    -
    URL_ESCAPING_CHARSET_KEY - Static variable in class freemarker.core.Configurable
    -
     
    -
    URLEnc(String, String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    URL encoding (like%20this) for query parameter values, path segments, fragments; this encodes all - characters that are reserved anywhere.
    -
    -
    URLPathEnc(String, String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Like StringUtil.URLEnc(String, String) but doesn't escape the slash character (/).
    -
    -
    URLTemplateLoader - Class in freemarker.cache
    -
    -
    This is an abstract template loader that can load templates whose - location can be described by an URL.
    -
    -
    URLTemplateLoader() - Constructor for class freemarker.cache.URLTemplateLoader
    -
     
    -
    useDefaultXPathSupport() - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Tells the system to use (restore) the default (initial) XPath system used by - this FreeMarker version on this system.
    -
    -
    useJaxenXPathSupport() - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Convenience method.
    -
    -
    useSunInternalXPathSupport() - Static method in class freemarker.ext.dom.NodeModel
    -
     
    -
    useXalanXPathSupport() - Static method in class freemarker.ext.dom.NodeModel
    -
    -
    Convenience method.
    -
    -
    UTC - Static variable in class freemarker.template.utility.DateUtil
    -
     
    -
    - - - -

    V

    -
    -
    values() - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    values() - Method in class freemarker.ext.beans.SimpleMapModel
    -
     
    -
    values() - Method in class freemarker.ext.jython.JythonHashModel
    -
    -
    Returns object.__findattr__("values").__call__().
    -
    -
    values() - Method in class freemarker.ext.rhino.RhinoScriptableModel
    -
     
    -
    values() - Method in class freemarker.ext.servlet.HttpRequestHashModel
    -
     
    -
    values() - Method in class freemarker.ext.servlet.HttpRequestParametersHashModel
    -
     
    -
    values() - Method in class freemarker.ext.util.IdentityHashMap
    -
    -
    Returns a collection view of the values contained in this map.
    -
    -
    values() - Method in class freemarker.template.SimpleHash
    -
     
    -
    values() - Method in interface freemarker.template.TemplateHashModelEx
    -
     
    -
    Version - Class in freemarker.template
    -
    -
    Represents a version number plus the further qualifiers and build into.
    -
    -
    Version(String) - Constructor for class freemarker.template.Version
    -
     
    -
    Version(String, Boolean, Date) - Constructor for class freemarker.template.Version
    -
     
    -
    Version(int, int, int) - Constructor for class freemarker.template.Version
    -
     
    -
    Version(int, int, int, String, Boolean, Date) - Constructor for class freemarker.template.Version
    -
     
    -
    VERSION_2_3_0 - Static variable in class freemarker.template.Configuration
    -
    -
    FreeMarker version 2.3.0 (an incompatible improvements break-point)
    -
    -
    VERSION_2_3_19 - Static variable in class freemarker.template.Configuration
    -
    -
    FreeMarker version 2.3.19 (an incompatible improvements break-point)
    -
    -
    VERSION_2_3_20 - Static variable in class freemarker.template.Configuration
    -
    -
    FreeMarker version 2.3.20 (an incompatible improvements break-point)
    -
    -
    VERSION_2_3_21 - Static variable in class freemarker.template.Configuration
    -
    -
    FreeMarker version 2.3.21 (an incompatible improvements break-point)
    -
    -
    versionStringToInt(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    Converts a version number string to an integer for easy comparison.
    -
    -
    visit(TemplateElement, TemplateDirectiveModel, Map, List) - Method in class freemarker.core.Environment
    -
     
    -
    - - - -

    W

    -
    -
    warn(String) - Method in class freemarker.log.Logger
    -
    -
    Logs a warning message.
    -
    -
    warn(String, Throwable) - Method in class freemarker.log.Logger
    -
    -
    Logs a warning message with accompanying throwable.
    -
    -
    WebappTemplateLoader - Class in freemarker.cache
    -
    -
    A TemplateLoader that uses streams reachable through - ServletContext.getResource(String) as its source of templates.
    -
    -
    WebappTemplateLoader(ServletContext) - Constructor for class freemarker.cache.WebappTemplateLoader
    -
    -
    Creates a resource template cache that will use the specified servlet - context to load the resources.
    -
    -
    WebappTemplateLoader(ServletContext, String) - Constructor for class freemarker.cache.WebappTemplateLoader
    -
    -
    Creates a template loader that will use the specified servlet - context to load the resources.
    -
    -
    WHITESPACE_STRIPPING_KEY - Static variable in class freemarker.template.Configuration
    -
     
    -
    wrap(Object) - Method in class freemarker.ext.beans.BeanModel
    -
     
    -
    wrap(Object) - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Wraps the object with a template model that is most specific for the object's - class.
    -
    -
    wrap(Node) - Static method in class freemarker.ext.dom.NodeModel
    -
     
    -
    wrap(Object) - Method in class freemarker.ext.jython.JythonWrapper
    -
    -
    Wraps the passed Jython object into a FreeMarker template model.
    -
    -
    wrap(Object) - Method in class freemarker.ext.rhino.RhinoWrapper
    -
     
    -
    wrap(Object) - Method in class freemarker.template.DefaultObjectWrapper
    -
     
    -
    wrap(Object) - Method in interface freemarker.template.ObjectWrapper
    -
    -
    Makes a TemplateModel out of a non-TemplateModel object, usually by "wrapping" it into a - TemplateModel implementation that delegates to the original object.
    -
    -
    wrap(Object) - Method in class freemarker.template.WrappingTemplateModel
    -
    -
    Wraps the passed object into a template model using this object's object - wrapper.
    -
    -
    wrapDomNode(Object) - Method in class freemarker.template.DefaultObjectWrapper
    -
     
    -
    wrapper - Variable in class freemarker.ext.beans.BeanModel
    -
     
    -
    wrapper - Variable in class freemarker.ext.jython.JythonModel
    -
     
    -
    WrapperTemplateModel - Interface in freemarker.ext.util
    -
    -
    A generic interface for template models that wrap some underlying - object, and wish to provide access to that wrapped object.
    -
    -
    WrappingTemplateModel - Class in freemarker.template
    -
    -
    Convenience base-class for containers that wrap arbitrary Java objects into - TemplateModel instances.
    -
    -
    WrappingTemplateModel() - Constructor for class freemarker.template.WrappingTemplateModel
    -
    -
    Deprecated. -
    Use WrappingTemplateModel.WrappingTemplateModel(ObjectWrapper) instead; this method uses the deprecated.
    -
    -
    -
    WrappingTemplateModel(ObjectWrapper) - Constructor for class freemarker.template.WrappingTemplateModel
    -
    -
    Protected constructor that creates a new wrapping template model using the specified object wrapper.
    -
    -
    write(char[], int, int) - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    write(int) - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    write(char[]) - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    write(String) - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    write(String, int, int) - Method in class freemarker.template.utility.NullWriter
    -
     
    -
    writeProtect() - Method in class freemarker.ext.beans.BeansWrapper
    -
    -
    Makes the configuration properties (settings) of this BeansWrapper object read-only.
    -
    -
    writeProtect() - Method in interface freemarker.template.utility.WriteProtectable
    -
    -
    Makes this object permanently read-only.
    -
    -
    WriteProtectable - Interface in freemarker.template.utility
    -
    -
    Implemented by objects that can be made permanently read-only.
    -
    -
    WrongEncodingException(String) - Constructor for exception freemarker.template.Template.WrongEncodingException
    -
     
    -
    - - - -

    X

    -
    -
    XHTMLEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    XHTML Encoding.
    -
    -
    XMLEnc(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    XML Encoding.
    -
    -
    XMLEncNA(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    XML encoding without replacing apostrophes.
    -
    -
    XMLEncNQG(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    XML encoding without replacing apostrophes and quotation marks and - greater-thans (except in ]]>).
    -
    -
    XMLEncQAttr(String) - Static method in class freemarker.template.utility.StringUtil
    -
    -
    XML encoding for attributes values quoted with " (not with '!).
    -
    -
    XmlEscape - Class in freemarker.template.utility
    -
    -
    Performs an XML escaping of a given template fragment.
    -
    -
    XmlEscape() - Constructor for class freemarker.template.utility.XmlEscape
    -
     
    -
    XPathSupport - Interface in freemarker.ext.dom
    -
     
    -
    - - - -

    Z

    -
    -
    ZERO - Static variable in class freemarker.template.utility.Constants
    -
     
    -
    - - - -

    _

    -
    -
    __getitem__(String) - Method in class freemarker.core.Environment
    -
    -
    A hook that Jython uses.
    -
    -
    __setitem__(String, Object) - Method in class freemarker.core.Environment
    -
    -
    A hook that Jython uses.
    -
    -
    -A B C D E F G H I J K L M N O P R S T U V W X Z _ 
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/index.html b/fmpp/docs/freemarker/api/index.html deleted file mode 100644 index b210f45..0000000 --- a/fmpp/docs/freemarker/api/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - -FreeMarker 2.3.21 API - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/fmpp/docs/freemarker/api/overview-frame.html b/fmpp/docs/freemarker/api/overview-frame.html deleted file mode 100644 index d60dc87..0000000 --- a/fmpp/docs/freemarker/api/overview-frame.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - -Overview List (FreeMarker 2.3.21 API) - - - - - - - -

     

    - - diff --git a/fmpp/docs/freemarker/api/overview-summary.html b/fmpp/docs/freemarker/api/overview-summary.html deleted file mode 100644 index f2c1f7a..0000000 --- a/fmpp/docs/freemarker/api/overview-summary.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - -Overview (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - -
    -

    FreeMarker 2.3.21

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Packages 
    PackageDescription
    freemarker.cache -
    Template loading and caching.
    -
    freemarker.core -
    The seldom used or advanced parts of the fundamental FreeMarker API, compared to freemarker.template.
    -
    freemarker.debug -
    Debugging API; experimental status, might change! -This is to support debugging in IDE-s.
    -
    freemarker.ext.ant -
    -Ant task to transform XML files -with a template; a more powerful alternative is FMPP.
    -
    freemarker.ext.beans -
    The default object wrapper of FreeMarker uses -this to expose Java Beans and POJO-s to templates, but it can also be used in itself as a -better alternative ObjectWrapper.
    -
    freemarker.ext.dom -
    Exposes DOM XML nodes to templates as easily traversable trees; -see in the Manual.
    -
    freemarker.ext.jdom -
    Deprecated, use W3C DOM (freemarker.ext.dom) instead; -Exposes JDOM XML nodes to templates.
    -
    freemarker.ext.jsp -
    -Classes for two-way FreeMarker-JSP integration.
    -
    freemarker.ext.jython -
    Exposes Jython objects to templates.
    -
    freemarker.ext.rhino -
    Exposes Rhino (ECMAScript) objects to templates.
    -
    freemarker.ext.servlet -
    Servlet for legacy "Model 2" frameworks that allows using FreeMarker -templates instead of JSP as the MVC View -(see in the Manual).
    -
    freemarker.ext.util -
    Various classes used by freemarker.ext but might be useful outside it too.
    -
    freemarker.ext.xml -
    Deprecated, use W3C DOM with freemarker.ext.dom instead; -Exposes XML from DOM, dom4j or JDOM nodes, uniformly.
    -
    freemarker.log -
    -Logging facility; dispatches FreeMarker log messages to the chosen logger library.
    -
    freemarker.template -
    The fundamental, most commonly used API-s of FreeMarker; -start with Configuration (also see -Getting Stared in the Manual.)
    -
    freemarker.template.utility -
    Various classes used by core FreeMarker code but might be useful outside of it too.
    -
    -
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/overview-tree.html b/fmpp/docs/freemarker/api/overview-tree.html deleted file mode 100644 index 4827632..0000000 --- a/fmpp/docs/freemarker/api/overview-tree.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - -Class Hierarchy (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - - -
    -

    Class Hierarchy

    - -

    Interface Hierarchy

    - -
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/package-list b/fmpp/docs/freemarker/api/package-list deleted file mode 100644 index 878055f..0000000 --- a/fmpp/docs/freemarker/api/package-list +++ /dev/null @@ -1,16 +0,0 @@ -freemarker.cache -freemarker.core -freemarker.debug -freemarker.ext.ant -freemarker.ext.beans -freemarker.ext.dom -freemarker.ext.jdom -freemarker.ext.jsp -freemarker.ext.jython -freemarker.ext.rhino -freemarker.ext.servlet -freemarker.ext.util -freemarker.ext.xml -freemarker.log -freemarker.template -freemarker.template.utility diff --git a/fmpp/docs/freemarker/api/script.js b/fmpp/docs/freemarker/api/script.js deleted file mode 100644 index c3a1cae..0000000 --- a/fmpp/docs/freemarker/api/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/fmpp/docs/freemarker/api/serialized-form.html b/fmpp/docs/freemarker/api/serialized-form.html deleted file mode 100644 index efb2f84..0000000 --- a/fmpp/docs/freemarker/api/serialized-form.html +++ /dev/null @@ -1,928 +0,0 @@ - - - - - - -Serialized Form (FreeMarker 2.3.21 API) - - - - - - - - -
    - - - - - - - -
    - - -
    -

    Serialized Form

    -
    -
    - -
    - -
    - - - - - - - -
    - - - - diff --git a/fmpp/docs/freemarker/api/stylesheet.css b/fmpp/docs/freemarker/api/stylesheet.css deleted file mode 100644 index ad00323..0000000 --- a/fmpp/docs/freemarker/api/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet - JDK 8 usability fix regexp substitutions applied */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'Courier New', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'Courier New', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'Courier New', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'Courier New', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin: 5px 0 10px 20px; - font-size:14px; - -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; - width:100%; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:Arial, sans-serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/fmpp/docs/freemarker/app.html b/fmpp/docs/freemarker/app.html deleted file mode 100644 index a304b76..0000000 --- a/fmpp/docs/freemarker/app.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - - FreeMarker Manual - Appendixes - - - - - - - - -
    - - - - - -

    -Part V   Appendixes

    - -
    -

    - - Part Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_eccn.html b/fmpp/docs/freemarker/app_eccn.html deleted file mode 100644 index ac1cd7c..0000000 --- a/fmpp/docs/freemarker/app_eccn.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - FreeMarker Manual - Export Control - - - - - - - - -
    - - - - - -

    -Export Control

    - - -

    The FreeMarker source code doesn't include cryptography. - Furthermore it's binary (downloadable) forms don't include any - cryptography software. Hence, FreeMarker has no Export Control - Classification Number (ECCN). Where an ECCN should be filled, the - label "not subject to EAR" could be used.

    FreeMarker itself doesn't add any exporting limitations.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_faq.html b/fmpp/docs/freemarker/app_faq.html deleted file mode 100644 index 0250174..0000000 --- a/fmpp/docs/freemarker/app_faq.html +++ /dev/null @@ -1,1899 +0,0 @@ - - - - - - - - FreeMarker Manual - FAQ - - - - - - - - -
    - - - - - -

    -Appendix A   FAQ

    - - -

    Translations: Chinese in the Chinese - translation of the Manual (PDF), Serbo-Croatian - (based on FreeMarker 2.3.19)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1.   - - - - JSP versus FreeMarker? - - -
    -
    2.   - - - - Why is FreeMarker so picky about null-s - and missing variables, and what to do with it? -
    -
    3.   - - - - The documentation writes about feature - X, but it seems that FreeMarker doesn't - know that, or it behaves in a different way as documented, or a - bug that was supposedly fixed is still present. -
    -
    4.   - - - - Why does FreeMarker print the numbers with strange - formatting (as 1,000,000 or 1 000 000 instead of 1000000)? -
    -
    5.   - - - - Why does FreeMarker print bad decimal and/or grouping - separator symbol (as 3.14 instead of 3,14)? -
    -
    6.   - - - - Why does FreeMarker give an error when I try to print a - boolean like ${aBoolean}, and how to fix - it? -
    -
    7.   - - - - The < and > of - FreeMarker tags confuses my editor or the XML parser. What to - do? -
    -
    8.   - - - - What are the legal variable names? - - -
    -
    9.   - - - - How can I use variable (macro) names that contain space, - dash or other special characters? -
    -
    10.   - - - - Why do I get "java.lang.IllegalArgumentException: argument - type mismatch" when I try to use X JSP - custom tag? -
    -
    11.   - - - - How to include other resources in a way as - jsp:include does it? -
    -
    12.   - - - - How can I get the parameters to my - plain-Java-method/TemplateMethodModelEx/TemplateTransformModel/TemplateDirectiveModel - implementation as plain - java.lang.*/java.util.* - objects? -
    -
    13.   - - - - Why I can't use non-string key in the - myMap[myKey] expression? And what to do - now? - - -
    -
    14.   - - - - When I list the contents of a map (a hash) with - ?keys/?values, I get the - java.util.Map methods mixed with the real map - entries. Of course, I only want to get the map entries. -
    -
    15.   - - - - How can I modify sequences (lists) and hashes (maps) in - FreeMarker templates? - - - - - - - - -
    -
    16.   - - - - What about null and the FreeMarker - template language? -
    -
    17.   - - - - How can I use the output of a directive (macro) in - expressions (as a parameter to another directive)? -
    -
    18.   - - - - Why do I have ``?''-s in the output instead of character - X? -
    -
    19.   - - - - How to retrieve values calculated in templates after - template execution done? -
    -
    20.   - - - - - - Can I allow users to upload templates and what are the - security implications? -
    -
    21.   - - - - How to implement a function or macro in Java Language - instead of in the template language? -
    -
    22.   - - - - Why is FreeMarker logging suppressed for my - application? -
    -
    23.   - - - - In my Servlet - based application, how do I show a nice error page instead of a - stack trace when error occurs during template processing? -
    -
    24.   - - - - I'm using a visual HTML editor that mangles template tags. - Will you change the template language syntax to accommodate my - editor? -
    -
    25.   - - - - How fast is FreeMarker? Is it true that 2.x is slower than - 1.x (FreeMarker classic)? -
    -
    26.   - - - - How can my Java classes ask a template for information about - its structure (e.g. a list of all the variables)? -
    -
    27.   - - - - Will you ever provide backward compatibility? -
    -
    28.   - - - - If we distribute FreeMarker with our product, do we have to - release the source code for our product? -
    -
    - - -
    - - 1.  - JSP versus FreeMarker? - - - -
    - - -
    - -

    Note: JSP 1.x was really bad as an MVC template engine - because it was not made for that, so I don't deal with that here. - We compare FreeMarker with the JSP 2.0 + JSTL combo.

    - -

    FreeMarker Pros:

    - -
    -
      -
    • -

      FreeMarker is not tied to Servlets, networking or the - Web; it is just a class library to generate text output by - merging a template with Java objects (the data-model). You can - execute templates anywhere and anytime; no HTTP request - forwarding or similar tricks needed, no Servlet environment - needed at all. Because of this you can easily integrate it - into any system.

      -
    • - -
    • -

      No servlet specific scopes and other highly technical - things in templates. It was made for MVC from the beginning, - it focuses only on the presentation.

      -
    • - -
    • -

      You can load the templates from anywhere; from the class - path, from a data-base, etc.

      -
    • - -
    • -

      Locale-sensitive number and date formatting by default. - Since we mostly output for a human audience all you need to do - is just write ${x} rather than - <fmt:formatNumber value="${x}" />. - You can easily switch this behavior and output non-localized - numbers by default.

      -
    • - -
    • -

      Much easier to define ad-hoc macros and - functions.

      -
    • - -
    • -

      No sweeping errors under the carpet. Missing variables - will cause an error by default, and not silently default to - arbitrary values. Also, null-s are not - treated silently as 0/false/empty string. See more about this - here...

      -
    • - -
    • -

      ``Object wrapping''. This lets you show the objects to - templates in a customized, presentation oriented way (e.g. - see here how a - W3C DOM nodes can be seen by templates using this - technology.)

      -
    • - -
    • -

      Macros and functions are just variables (compare it to - how JSP custom tags work), so they can be easily passed around - as parameter values, put into the data-model, ...etc, just - like any other value.

      -
    • - -
    • -

      Easier to read, more terse syntax. For example: - <#if x>...</#if> instead of - <c:if - test="${x}">...</c:if>

      -
    • - -
    • -

      Virtually unnoticeable delay when visiting a page for - the first time (or after it was changed), because no expensive - compilation happens.

      -
    • -
    - - -

    FreeMarker Cons:

    - -
    -
      -
    • -

      Not a ``standard''. There are fewer tools and IDE - integrations, fewer developers knows it and there's much less - industry support in general. (However, JSP tag libraries can - work in FreeMarker templates with the proper setup, unless - they are using .tag files.)

      -
    • - -
    • -

      Since macros and function are just variables, incorrect - directive and parameter names and missing required parameters - can be detected only on runtime.

      -
    • - -
    • -

      Its syntax doesn't follow the HTML/XML rules apart from - some visual similarity, which is confusing for new users. - (It's the price of the terseness...)

      -
    • - -
    • -

      Doesn't work with JSF. (It could work technically, but - nobody has implemented that yet.)

      -
    • -
    - - -

    You may read this if you are considering replacing JSP with - FreeMarker: Programmer's Guide/Miscellaneous/Using FreeMarker with servlets/Using FreeMarker for ``Model 2''

    -
    - - - - -
    - - 2.  - Why is FreeMarker so picky about null-s - and missing variables, and what to do with it? - -
    - - -
    - -

    To recapitulate what's this entry is about: FreeMarker by - default treats an attempt to access a non-existent variable or a - null value (this two - is the same for FreeMarker) as error, which aborts the - template execution.

    - -

    First of all, you should understand the reason of being - picky. Most scripting languages and template languages are rather - forgiving with missing variables (and with - null-s), and they usually treat them as empty - string and/or 0 and/or logical false. This behavior has several - problems:

    - -
    -
      -
    • -

      It potentially hides accidental mistakes, like a typo in - a variable name, or when the template author refers to a - variable that the programmer doesn't put into the data-model - for that template, or for which the programmer uses a - different name. Humans are prone to do such mistakes, while - computers are not, so missing this opportunity that the - template engine can show these errors is a bad business. Even - if you very carefully check the output of the templates during - development, it is easy to look over mistakes like - <#if hasWarnigs>print warnings - here...</#if>, which would then - silently never print the warnings, since you have mistyped the - variable name. Also think about maintenance, when you later - modify your application; probably you will not re-check - templates (many applications has hundreds of them) that - carefully each time, for all possible scenarios. Unit tests - typically doesn't cover web page content very good either (if - you have them at all...); they mostly only checks certain - manually set patterns in the web page, so they will often - gloss though changes that are actually bugs. But if the page - fails with exception, that's something human testers will - notice and unit sets will notice, and in production the - maintainers will notice (assuming somebody check error - logs).

      -
    • - -
    • -

      Makes dangerous assumptions. The script language or - template engine knows nothing about the application domain, so - when it decides the value of something that it doesn't know to - be 0/false, it is a quite irresponsible and arbitrary thing. - Just because it's not know what's your current balance at your - bank, can we just say it's $0? Just because it is not known if - a patient has penicillin allergy, we can just say he/she - doesn't have it? Just consider the implications of such - mistakes. Showing an error page is often better than showing - incorrect information that formally looks good.

      -
    • -
    - - -

    Being not picky is mostly sweeping under the carpet in this - case (not facing with the problems), which of course most people - feels more convenient, but still, we believe that in most cases - being strict will save your time and increase your software - quality on the long run.

    - -

    On the other hand, we recognize that there are cases where - you don't want FreeMarker to be that picky with good reason, and - there is solution for them:

    - -
    -
      -
    • -

      It's often normal that your data-model contains - null-s or have optional variables. In such - cases use these - operators. If you use them too often, try to rethink - your data-model, because depending on them too much won't just - make the templates too verbose, but increases the probability - of hiding errors and printing arbitrary incorrect output (for - the reasons described earlier).

      -
    • - -
    • -

      In some application you may rather want to show an - incomplete/damaged page than an error page. In this case you - can use another - error handler than the default one. A custom error - handler can skip the problematic part instead of aborting the - whole page rendering. Note, however, that although the error - handlers don't give arbitrary default values to variables, for - pages that show critical information it's maybe still better - to show an error page.

      -
    • - -
    • -

      If the pages contain parts that aren't critically - important (like side bars), another feature you may interested - in is the - attempt/recover - directives.

      -
    • -
    - -
    - - - - -
    - - 3.  - The documentation writes about feature - X, but it seems that FreeMarker doesn't - know that, or it behaves in a different way as documented, or a - bug that was supposedly fixed is still present. - -
    - - -
    - -

    Are you sure that you are using the documentation written - for the same version of FreeMarker that you actually use? - Especially, note that our online documentation is for the latest - usable FreeMarker release. You may use an older release.

    - -

    Are you sure that the Java class loader finds the same - freemarker.jar that you expect to use? Maybe - there is an older version of freemarker.jar - around, which has higher priority. To check this, try to print the - version number in a template with ${.version}. - If it dies with ``Unknown built-in variable: version'' error - message, then you use a release before 2.3-final or 2.2.8, but you - can still try to get the version number in the Java code of your - application with - Configuration.getVersionNumber(). If this - method is not present either, then you are using an early - 2.3-preview, or a version before 2.2.6.

    - -

    If you suspect that the problem is that you have multiple - freemarker.jar-s, the typical culprit is that - some module has a Maven dependency with group ID - freemarker, as opposed to - org.freemarker, while you have declared a - dependency on org.freemarker. In this case you - will have to exclude the freemarker - dependency.

    - -

    If you think that the documentation or FreeMarker is wrong, - please report it using the bug tracker, or the mailing list. Thank - you!

    -
    - - - - -
    - - 4.  - Why does FreeMarker print the numbers with strange - formatting (as 1,000,000 or 1 000 000 instead of 1000000)? - -
    - - -
    - -

    FreeMarker uses the locale-sensitive number formatting - capability of the Java platform. The default number format for - your locale may uses grouping or other unwanted formatting. To - prevent this, you have to override the number format suggested by - the Java platform with the number_format FreeMarker setting. For - example:

    - -
    -
    -cfg.setNumberFormat("0.######");  // now it will print 1000000
    -// where cfg is a freemarker.template.Configuration object  
    - - -

    Note however than humans often find it hard to read big - numbers without grouping separator. So in general it is - recommended to keep them, and in cases where the numbers are for - ''computer audience'' (which is confused on the grouping - separators), use the c built-in. For - example:

    - -
    -
    -<a href="/shop/productdetails?id=${product.id?c}">Details...</a>  
    - -
    - - - - -
    - - 5.  - Why does FreeMarker print bad decimal and/or grouping - separator symbol (as 3.14 instead of 3,14)? - -
    - - -
    - -

    Different countries use different decimal/grouping separator - symbols. If you see incorrect symbols, then probably your locale - is not set properly. Set the default locale of the JVM or override - the default locale with the locale FreeMarker setting. For - example:

    - -
    -
    -cfg.setLocale(java.util.Locale.ITALY);
    -// where cfg is a freemarker.template.Configuration object  
    - - -

    However, sometimes you want to output a number not for human - audience, but for ``computer audience'' (like you want to print a - size in CSS), in which case you must use dot as decimal separator, - regardless of the locale (language) of the page. For that use the - c - built-in, for example:

    - -
    -
    -font-size: ${fontSize?c}pt;  
    - -
    - - - - -
    - - 6.  - Why does FreeMarker give an error when I try to print a - boolean like ${aBoolean}, and how to fix - it? - -
    - - -
    - -

    Unlike numbers, booleans has no commonly accepted format, - not even a common format within the same page. Like when you show - on a HTML page if a product is washable, you will hardly want to - show for the visitor "Washable: true", but rather "Washable: yes". - So we force the template author (by ${washable} - causing error) to find out with his human knowledge how the - boolean value should be shown at the given place. The common way - of formatting a boolean is like ${washable?string("yes", - "no")}, ${caching?string("Enabled", - "Disabled")}, ${heating?string("on", - "off")}, etc.

    - -

    However, there are two cases where this gets - impractical:

    - -
    -
      -
    • -

      When printing boolean to generate computer language - output, and hence you want - true/false, use - ${someBoolean?c}. - (This requires at least FreeMarker 2.3.20. Before that, the - common practice was writing - ${someBoolean?string}, - however that's dangerous because its output depends on the - boolean format settings, whose default is - "true"/"false".)

      -
    • - -
    • -

      When you have format most of the booleans on the same - way. In this case you can set the - boolean_format setting - (Configuration.setBooleanFormat) to reflect - that, and then since FreeMarker 2.3.20 you can just write - ${someBoolean}.

      -
    • -
    - -
    - - - - -
    - - 7.  - The < and > of - FreeMarker tags confuses my editor or the XML parser. What to - do? - -
    - - -
    - -

    Starting from FreeMarker 2.3.4 you can use - [ and ] instead of - < and >. For more - details read - this...

    -
    - - - - -
    - - 8.  - What are the legal variable names? - - - -
    - - -
    - -

    FreeMarker has no limitations regarding the characters used - in variable names, nor regarding the length of the variable names, - but for your convenience try to chose variable names that can be - used with the simple variable reference expressions (see it here). If you have - to choose a more extreme variable name, that's not a bid problem - either: see - here.

    -
    - - - - -
    - - 9.  - How can I use variable (macro) names that contain space, - dash or other special characters? - -
    - - -
    - -

    If you have a variable with strange name, such as - foo-bar, FreeMarker will misinterpret what do - you want when you write thing as ${foo-bar}. In - this concrete case, it will believe that you want subtract the - value of bar from foo. This - FAQ entry explains how to handle situations like this.

    - -

    First of all it should be clean that these are just - syntactical problems. FreeMarker has no limitations regarding the - characters used in variable names, nor regarding the length of the - variable names, but sometimes you need to use syntactical - tricks.

    - -

    If you want to read the variable: Use the square bracket - syntax. An example of square bracket syntax is - baaz["foo"], which is equivalent with - baaz.foo. As the subvariable name with the - square bracket syntax is a string literal (in fact, arbitrary - expression), it let you write baaz["foo-bar"]. - Now you may say that it can be used for hash subvariables only. - Yes, but top-level variables are accessible through special hash - variable .vars. For example, - foo is equivalent with - .vars["foo"]. So you can also write - .vars["foo-bar"]. Naturally, this trick works - with macro invocations too: - <@.vars["foo-bar"]/>

    - -

    If you want to create or modify the variable: All directives - that let you create or modify a variable (such as - assign, local, - global, macro, - function, etc.) allows the quotation of the - destination variable name. For example, <#assign foo = - 1> is the same as <#assign "foo" = - 1>. So you can write things like <#assign - "foo-bar" = 1> and <#macro - "foo-bar">.

    -
    - - - - -
    - - 10.  - Why do I get "java.lang.IllegalArgumentException: argument - type mismatch" when I try to use X JSP - custom tag? - -
    - - -
    - -

    On JSP pages you quote all parameter (attribute) values, it - does not mater if the type of the parameter is string or boolean - or number. But since custom tags are accessible in FTL templates - as plain user-defined FTL directives, you have to use the FTL - syntax rules inside the custom tags, not the JSP rules. Thus, - according to FTL rules, you must not quote boolean and numerical - parameter values, or they are interpreted as string values, and - this will cause a type mismatch error when FreeMarker tries to - pass the value to the custom tag that expects non-string - value.

    - -

    For example, the flush parameter to - Struts Tiles insert tag is boolean. In JSP the - correct syntax was:

    - -
    -
    -<tiles:insert page="/layout.jsp" flush="true"/>
    -...  
    - - -

    but in FTL you should write:

    - -
    -
    -<@tiles.insert page="/layout.ftl" flush=true/>
    -...  
    - - -

    Also, for similar reasons, this is wrong:

    - -
    -
    -<tiles:insert page="/layout.jsp" flush="${needFlushing}"/>
    -...  
    - - -

    and you should write:

    - -
    -
    -<tiles:insert page="/layout.jsp" flush=needFlushing/>
    -...  
    - - -

    (Not flush=${needFlushing}!)

    -
    - - - - -
    - - 11.  - How to include other resources in a way as - jsp:include does it? - -
    - - -
    - -

    Not with <#include ...>, as that - just includes another FreeMarker template without involving the - Servlet container.

    - -

    Since the inclusion method you look for is Servlet-related, - and pure FreeMarker is unaware of Servlets or even HTTP, it's the - Web Application Framework that decides if you can do this and if - so how. For example, in Struts 2 you can do this like this:

    - -
    -
    -<@s.include value="/WEB-INF/just-an-example.jspf" />  
    - - -

    If the FreeMarker support of the Web Application Framework - is based on - freemarker.ext.servlet.FreemarkerServlet, then - you can also do this (since FreeMarker 2.3.15):

    - -
    -
    -<@include_page path="/WEB-INF/just-an-example.jspf" />  
    - - -

    but if the Web Application Framework provides its own - solution, then you may prefer that, after all it may does - something special.

    - -

    For more information about include_page - read - this...

    -
    - - - - -
    - - 12.  - How can I get the parameters to my - plain-Java-method/TemplateMethodModelEx/TemplateTransformModel/TemplateDirectiveModel - implementation as plain - java.lang.*/java.util.* - objects? - -
    - - -
    - -

    Unfortunately, there is no simple general-purpose solution - for this problem. The problem is that FreeMarker object wrapping - is very flexible, which is good when you access variables from - templates, but makes unwrapping on the Java side a tricky - question. For example, it is possible to wrap a - non-java.util.Map object as - TemplateHashModel (FTL hash variable). But - then, it can't be unwrapped to java.util.Map, - since there is no wrapped java.util.Map around - at all.

    - -

    So what to do then? Basically there are two cases:

    - -
    -
      -
    • -

      Directives and methods that are written for presentation - purposes (like kind of ``tools'' for helping FreeMarker - templates) should declare their arguments as - TemplateModel-s and the more specific sub - interfaces of that. After all, the object wrapping is about - apparently transforming the data-model to something that - serves the purpose of the presentation layer, and these - methods are part of the presentation layer.

      -
    • - -
    • -

      Methods that are not for presentation related tasks (but - for business logic and like) should be implemented as plain - Java methods, and should not use any FreeMarker specific - classes at all, since according the MVC paradigm they must be - independent of the presentation technology (FreeMarker). If - such a method is called from a template, then it is the - responsibility of the object wrapper - to ensure the conversion of the arguments to the proper type. - If you use the DefaultObjectWrapper or the - BeansWrapper - then this will happen automatically (but be sure you are using - at least FreeMarker 2.3.3). Furthermore if you use - BeansWrapper, then the method will surely - get exactly the same instance that was earlier wrapped (as far - as it was wrapped by the - BeansWrapper).

      -
    • -
    - -
    - - - - -
    - - 13.  - Why I can't use non-string key in the - myMap[myKey] expression? And what to do - now? - - - -
    - - -
    - -

    The ``hash'' type of the FreeMarker Template Language (FTL) - is not the same as Java's Map. FTL's hash is an - associative array too, but it uses string keys exclusively. This - is because it was introduced for subvariables (as - password in user.password, - which is the same as user["password"]), and - variable names are strings.

    - -

    So FTL's hashes are not general purpose associate arrays - that could be used for looking up values with keys of arbitrary - type. FTL is presentation oriented language, and it has no feature - dedicated for that purpose. It has, however, methods. Methods are - part of the data-model, and they can do all kind of fancy - data-model related calculations, so of course you can add some - methods to the data-model for Map lookup. The - bad news is that the building of the data-model, as it's an - application specific issue, is the task of the programmers who use - FreeMarker, so it's their task to ensure that such methods are - present there to serve the template authors. (However, when - template authors need to call methods that are not about - presentation, then consider if the data-model is simple enough. - Maybe you should push some calculations back to the data-model - building phase. Ideally the data-model contains what should be - displayed, and not something that serves as the base of further - calculations.)

    - -

    If you read the programmer's guide, then you know that - technically, the data-model is a tree of - freemarker.template.TemplateModel objects. The - building of the data-model usually (but not necessary) happens by - automatically wrapping (enclosing) plain Java objects into - TemplateModel objects. The object that does - this wrapping is the object wrapper, and it's specified when you - configure FreeMarker. FreeMarker comes with a few object wrapper - implementations out-of-the-box, and probably the most widely used - of them is freemarker.ext.beans.BeansWrapper. - If you use an instance of this as the object wrapper, then - java.util.Map-s you put into the data-model - will also act as a method, so you can write - myMap(myKey) in the template, that will - internally call Map.get(myKey). There will be - no restriction regarding the type of myKey, as - Map.get(Object key) has no such restriction. If - the value of myKey was wrapped with - BeansWrapper or other object wrapper whose - wrapped objects support unwrapping, or it is given as literal in - the template, then the value will be automatically unwrapped to - plain Java object before the actual invocation of the - Map.get(Object key) method, so it will not be - invoked with TemplateModel-s.

    - -

    But there still will be a problem. Java's - Map is particular about the exact class of the - key, so for numerical keys calculated inside the templates you - will have to cast them to the proper Java type, otherwise the item - will not be found. For example if you use - Integer keys in a Map, then you have to write - ${myMap.get(123?int)}. This is an ugly effect - caused by that FTL's deliberately simplified type system just has - a single numerical type, while Java distinguishes a lot of - numerical types. (Ideally, in the above case, the programmers - ensure that the get method automatically - converts the key to Integer, so it's not the - problem of the template author. This can be done with wrapper - customization, but the wrapper has to know that the particular - Map object uses Integer - keys, which assumes application specific knowledge.) Note that the - casting is not needed when the key value comes directly from the - data-model (i.e. you didn't modified its value with arithmetical - caluclations in the template), including the case when it's the - return value of a method, and it was of the proper class before - wrapping, because then the result of the unwrapping will be of the - original type.

    -
    - - - - -
    - - 14.  - When I list the contents of a map (a hash) with - ?keys/?values, I get the - java.util.Map methods mixed with the real map - entries. Of course, I only want to get the map entries. - -
    - - -
    - -

    Certainly you are using BeansWrapper as - your object wrapper, or a custom subclass of it, and the - simpleMapWrapper property of that is left to - false. Unfortunatelly, it's the default (for - backward compatibility), so you have to explicitly set it to - true where you create the object - wrapper.

    -
    - - - - -
    - - 15.  - How can I modify sequences (lists) and hashes (maps) in - FreeMarker templates? - - - - - - - - - -
    - - -
    - -

    First of all, you may don't want to modify the - sequence/hash, just concatenate (add) two or more of them, which - results in a new sequence/hash, rather than modifying an existing - one. In this case use the sequence - concatenation and hash concatenation - operators. Also, you may use the subsequence - operator instead of removing sequence items. However, be - aware of the performance implications: these operations are fast, - but the hashes/sequences that are the result of many subseqent - applications of these operations (i.e. when you use the result of - the operation as the input of yet another operation, and so on) - will be slow to read.

    - -

    Now if you still want to modify sequences/hashes, then read - on...

    - -

    The FreeMarkes Template Language doesn't support the - modification of sequences/hashes. It's for displaying already - calculated things, not for calculating data. Keep templates - simple. But don't give it up, you will see some advices and tricks - bellow.

    - -

    The best is if you can divide the work between the - data-model builder program and the template so that the template - doesn't need to modify sequences/hashes. Maybe if you rethink your - data-model, you will realize this is possible. But, seldom there - are cases where you need to modify sequences/hashes for some - complex but purely presentation related algorithms. It seldom - happens, so think twice whether that calculation (or parts of it) - rather belongs to the data-model domain than to the presentation - domain. Let's assume you are sure it belongs to the presentation - domain. For example, you want to display a keyword index on some - very smart way, whose algorithm need you to create and write some - sequence variables. Then you should do something like this (ugly - situations has ugly solutions...):

    - -
    -
    -<#assign caculatedResults =
    -    'com.example.foo.SmartKeywordIndexHelper'?new().calculate(keywords)>
    -<#-- some simple algorithms comes here, like: -->
    -<ul>
    -  <#list caculatedResults as kw>
    -    <li><a href="${kw.link}">${kw.word}</a>
    -  </#list>
    -</ul>  
    - - -

    That is, you move out the complex part of the presentation - task from the template into Java code. Note that it doesn't affect - the data-model, so the presentation is still kept separated from - other the other application logic. Of course the drawback is that - for this the template author will need the help of a Java - programmer, but for complex algorithms that's probably needed - anyway.

    - -

    Now, if you still say you need to modify sequences/hashes - directly with the FreeMarker template, here are two solutions, but - please read the warning after them:

    - -
    -
      -
    • -

      You can write a TemplateMethodModelEx - and TemplateDirectiveModel implementation - that can modify certain types of sequences/hashes. Just - certain types, because - TemplateSequenceModel and - TemplateHashModel doesn't have methods for - modification, so you will need the sequence or hash to - implement some additional methods. An example of this solution - can be seen in FMPP. It allows you to do things like this - (pp stores the services provided by FMPP - for templates):

      - -
      -
      -<#assign a = pp.newWritableSequence()>
      -<@pp.add seq=a value="red" />  
      - - -

      The pp.add directive works only with - sequences that were created with - pp.newWritableSequence(). So for example - the template author can't modify a sequence that comes from - the data-model with this.

      -
    • - -
    • -

      A sequence can have some methods/directives if you use a - customized wrapper (so you can <@myList.append foo - />). (Also, if you use - BeansWrapper and configure it so it exposes - the public methods, you can use the Java API for variables - that are for java.util.Map-s and - java.util.List-s. Just like with Apache - Velocity.)

      -
    • -
    - - -

    But beware, these solutions have a problem: The sequence - concatenation, sequence slice - operator (like seq[5..10]) and - ?reverse do not copy the original sequence, - just wraps it (for efficiency), so the resulting sequence will - change if the original sequence is changed later (an abnormal - aliasing effect). The same problem exists with the result of hash concatenation; - it just wraps the two hashes, so the resulting hash will magically - change if you modify the hashes you have added earlier. As a - work-around, after you did the above problematic operations, - either be sure you will not modify the objects that were used as - input, or create a copy of the result with a method provided by - the solution described in above two points (e.g. in FMPP you could - do <#assign b = - pp.newWritableSequence(a[5..10])> and - <#assign c = pp.newWritableHash(hashA + - hashB)>). Of course this is easy to miss... so again, - rather try to build the data-model so you will not need to modify - collections, or use a presentation task helper class as was shown - earlier.

    -
    - - - - -
    - - 16.  - What about null and the FreeMarker - template language? - -
    - - -
    - -

    The FreeMarker template language doesn't know the Java - language null at all. It doesn't have - null keyword, and it can't test if something is - null or not. When it technically faces with a - null, it treats it exactly as a missing - variable. For example, both if x is - null in the data-model and if it's not present - at all, ${x!'missing'} will print ``missing'', - you can't tell the difference. Also, if for example you want to - test if a Java method has returned null, just - write something like <#if - foo.bar()??>.

    - -

    You may interested in the rationale behind this. From the - viewpoint of the presentation layer a null and - non-existent thing is almost always the same. The difference - between this two is usually just a technical detail, which is - rather the result of implementation details than of the - application logic. That you can't compare something to - null (unlike in Java); it doesn't make sense to - compare something with null in a template, - since the template language doesn't do identity comparison (like - the Java == operator when you compare two - objects) but the more common sense value comparison (like Java's - Object.equals(Object); that doesn't work with - null either). And how could FreeMarker tell if - something concrete equals with something that is missing and thus - unknown? Or if two missing (unknown) things are equal? Of course - these questions can't be answered.

    - -

    There is at least one problem with this - null-unaware approach. When you call a Java - method from a template, you may want to pass a - null value as argument (since the method was - designed to be used in Java language, where the concept of - null is known). In this case you can exploit a - bug of FreeMarker (that we will not fix until we provide a correct - solution for passing null values to a method): - if you specify a missing variable as the argument, then it will - not cause an error, but a null will be passed - to the method instead. Like foo.bar(nullArg) - will call the bar method with - null as argument, assuming that there is no - varaible exists with ``nullArg'' name.

    -
    - - - - -
    - - 17.  - How can I use the output of a directive (macro) in - expressions (as a parameter to another directive)? - -
    - - -
    - -

    Capture the output into a variable with the - assign or local directive. - For example:

    - -
    -
    -<#assign capturedOutput><@outputSomething /></#assign>
    -<@otherDirective someParam=capturedOutput />  
    - -
    - - - - -
    - - 18.  - Why do I have ``?''-s in the output instead of character - X? - -
    - - -
    - -

    This is because the character that you want to print can't - be represented with the charset (encoding) used for the - output stream, so the Java platform (not FreeMarker) substitutes - the problematic character with question mark. In general you - should use the same charset for the output as for the template - (use the getEncoding() method of the template - object), or which is even safer, you should always use UTF-8 - charset for the output. The charset used for the output stream is - not decided by FreeMarker, but by you, when you create the - Writer that you pass to the - process method of the template.

    - -

    Example: Here I use UTF-8 charset in a servlet:

    - -
    -
    -...        
    -resp.setContentType("text/html; charset=utf-8");
    -Writer out = resp.getWriter();
    -...
    -t.process(root, out);
    -...  
    - - -

    Note that the question marks (or other substitution - characters) may be produced outside FreeMarker, in which case the - above obviously will not help. For example a bad/missconfigured - database connection or JDBC driver may bring the text already with - substitution characters in it. HTML forms are another potential - source of encoding problems. It's a good idea to print the - numerical code of the characters of the string on various places, - to see where the problem occurs first.

    - -

    You can read more about charsets and FreeMarker here...

    -
    - - - - -
    - - 19.  - How to retrieve values calculated in templates after - template execution done? - -
    - - -
    - -

    First of all, be sure your application is designed well: - templates should display data, and almost never calculate data. If - you are still sure you want to do it, read on...

    - -

    When you use <#assign x = "foo">, - then you do not actually modify the data-model (since that is - read-only, see: Programmer's Guide/Miscellaneous/Multithreading), but - create the x variable in the runtime environment of the processing - (see Programmer's Guide/Miscellaneous/Variables, scopes). The problem is that this - runtime environment will be discarded when - Template.process returns, as it was created for - a single Template.process call:

    - -
    -
    -// internally an Environment will be created, and then discarded
    -myTemplate.process(root, out);  
    - - -

    To prevent this, you can do the below, which is equivalent - with the above, except that you have chance to return the - variables created in the template:

    - -
    -
    -Environment env = myTemplate.createProcessingEnvironment(root, out);
    -env.process();  // process the template
    -TemplateModel x = env.getVariable("x");  // get variable x  
    - -
    - - - - -
    - - 20.  - - - Can I allow users to upload templates and what are the - security implications? - -
    - - -
    - -

    In general you shouldn't allow that, unless those users are - system administrators or other trusted personnel. Consider - templates as part of the source code just like - *.java files are. If you still want to allow - users to upload templates, here are what to consider:

    - -
    -
      -
    • -

      Denial-of-Service (DoS) attacks: It's trivial to create - templates that run practically forever (with a loop), or - exhaust memory (by concatenating to a string in a loop). - FreeMarker can't enforce CPU or memory usage limits, so this - is something that has no solution on the - FreeMarker-level.

      -
    • - -
    • -

      Data-model and wrapping - (Configuration.setObjectWrapper): By - default the data-model gives access to the full public API of - the Java objects that you have put into the data-model (with - some exceptions). To avoid that, you have to construct the - data-model so that it only exposes the things that are - necessary for the template. For that, use - SimpleObjectWrapper and create the - data-model purely from Map-s, - List-s, Array-s, - String-s, Number-s, - Boolean-s and Date-s. - Or, you can implement your own extremely restrictive - ObjectWrapper, which for example could - expose your POJO-s safely.

      -
    • - -
    • -

      Template-loader - (Configuration.setTemplateLoader): - Templates may load other templates by name (by path), like - <#include "../secret.txt">. To avoid - loading sensitive data, you have to use a - TemplateLoader that double-checks that the - file to load is something that should be exposed. FreeMarker - tries to prevent the loading of files outside the template - root directory regardless of template loader, but depending on - the underlying storage mechanism, exploits may exist that - FreeMarker can't consider (like, just as an example, - ~ jumps to the current user's home - directory). Note that - freemarker.cache.FileTemplateLoader checks - the canonical paths, so that's maybe a good candidate for this - task, yet, adding a file extension check (file must be - *.ftl) is maybe a good idea.

      -
    • - -
    • -

      The new built-in - (Configuration.setNewBuiltinClassResolver, - Environment.setNewBuiltinClassResolver): - It's used in templates like - "com.example.SomeClass"?new(), and is - important for FTL libraries that are partially implemented in - Java, but shouldn't be needed in normal templates. While - new will not instantiate classes that are - not TemplateModel-s, FreeMarker contains a - TemplateModel class that can be used to - create arbitrary Java objects. Other "dangerous" - TemplateModel-s can exist in you - class-path. Plus, even if a class doesn't implement - TemplateModel, its static initialization - will be run. To avoid these, you should use a - TemplateClassResolver that restricts the - accessible classes (possibly based on which template asks for - them).

      -
    • -
    - -
    - - - - -
    - - 21.  - How to implement a function or macro in Java Language - instead of in the template language? - -
    - - -
    - -

    It's not possible (yet), but something very similar is - possible if you write a class that implements - freemarker.template.TemplateMethodModelEx or - freemarker.template.TemplateDirectiveModel - respectively, and then where you were write <#function - my - ...>...</#function> - or <#macro my - ...>...</#macro> - you write <#assign my = "your.package.YourClass - "?new()> - instead. Note that using the assign directive - for this works because functions (and methods) and macros are just - plain variables in FreeMarker. (For the same reason you could also - put TemplateMethodModelEx or - TemplateDirectiveModel instances into the - data-model before calling the template, or into the shared - variable map (see: - freemarker.template.Configuration.setSharedVariable(String, - TemplateModel)) when you initialize the - application.)

    -
    - - - - -
    - - 22.  - Why is FreeMarker logging suppressed for my - application? - -
    - - -
    - -

    It's because FreeMarker does not find any logging system. To - fix this, you must make available one of the following logging - systems for your application: SLF4J (recommended), Apache Commons - Logging, Log4J (org.apache.log4j), Avalon - (org.apache.log), or use J2SE 1.4 or later - (that contains java.util.logging). That is, the - class-loader used with your application must find one of the - mentioned classes. Until 2.4, if you want to use SLF4J or Commons - Logging you need to do some extra steps; see here...

    -
    - - - - -
    - - 23.  - In my Servlet - based application, how do I show a nice error page instead of a - stack trace when error occurs during template processing? - -
    - - -
    - -

    First of all, use RETHROW_HANDLER instead - of the default DEBUG_HANDLER (for more - information about template exception handlers read this...). Now - FreeMarker will not print anything to the output when an error - occurs, so the control is in your hands. After you have caught the - exception of - Template.process(...) - basically you can follow two strategies:

    - -
    -
      -
    • -

      Call httpResp.isCommitted(), and if - that returns false, then you call - httpResp.reset() and print a ``nice error - page'' for the visitor. If the return value was - true, then try to finish the page be - printing something that makes clear for the visitor that the - page generation was abruptly interrupted because of an error - on the Web server. You may have to print a lot of redundant - HTML end-tags and set colors and font size to ensure that the - error message will be actually readable in the browser window - (check the source code of the - HTML_DEBUG_HANDLER in - src\freemarker\template\TemplateException.java - to see an example).

      -
    • - -
    • -

      Use full page buffering. This means that the - Writer doesn't send the output to the - client progressively, but buffers the whole page in the - memory. Since you provide the Writer - instance for the - Template.process(...) - method, this is your responsibility, FreeMarker has nothing to - do with it. For example, you may use a - StringWriter, and if - Template.process(...) - returns by throwing an exception, then ignore the content - accumulated by the StringWriter, and send - an error page instead, otherwise you print the content of - StringWriter to the output. With this - method you surely don't have to deal with partially sent - pages, but it can have negative performance implications - depending on the characteristic of the pages (for example, the - user will experience more response delay for a long page that - is generated slowly, also the server will consume more RAM). - Note that using a StringWriter is surely - not the most efficient solution, as it often reallocates its - buffer as the accumulated content grows.

      -
    • -
    - -
    - - - - -
    - - 24.  - I'm using a visual HTML editor that mangles template tags. - Will you change the template language syntax to accommodate my - editor? - -
    - - -
    - -

    We won't change the standard version, because a lot of - templates depend on it.

    - -

    Our view is that the editors that break template code are - themselves broken. A good editor should ignore, not mangle, what - it doesn't understand.

    - -

    You maybe interested in that starting from FreeMarker 2.3.4 - you can use [ and ] instead - of < and >. For more - details read - this...

    -
    - - - - -
    - - 25.  - How fast is FreeMarker? Is it true that 2.x is slower than - 1.x (FreeMarker classic)? - -
    - - -
    - -

    First of all, don't forget that FreeMarker is only the view - rendering component in an MVC - system. Furthermore MVC templates tend to be simple: many static - text with a few interpolations and loops and conditional block. So - it is not like PHP or Model 1 JSP; your application performance is - not affected that much by the execution time of templates.

    - -

    FreeMarker is certainly fast enough that it will only very - rarely be a bottleneck in your application. Rather, other factors - such as the speed of the data-base operations or network bandwidth - will likely dominate. The impact of FreeMarker performance could - be noticeable only for really busy sites (say, over 30 hits per - second per server), where almost all database data is cached. If - you are finding FreeMarker slow, do make sure that the cache of - parsed templates works well - (Configuration.getTemplate be default uses - caching). Parsing a template file is a relatively costly step; in - most long-running server-side applications, you will want to parse - a template once and have it be used many times. (Note that - FreeMarker 2.1.4 and earlier versions have bugs that sometimes can - ruin caching.)

    - -

    FreeMarker 2.1 is slower than 1.7.1. This surely depends on - your templates, but it could be slower by a factor of 2 or 3. But - again, it does not means that response time will be 2 or 3 times - slower; most FreeMarker user simply should not be able to perceive - the change in the final response time.

    -
    - - - - -
    - - 26.  - How can my Java classes ask a template for information about - its structure (e.g. a list of all the variables)? - -
    - - -
    - -

    In FreeMarker 2.2, Template has an - undocumented method for examining the parsed template: - getRootTreeNode.

    - -

    But listing all accessed variables is not possible, because - variable names can be dynamically generated from data. However, - there's a more important reason why FreeMarker doesn't support - this. The design of FreeMarker is based on the idea of a - separation between business objects and presentation objects. This - separation takes two forms:

    - -
      -
    1. -

      The templates know what data to expect, but they don't - know how it's generated.

      -
    2. - -
    3. -

      The business objects know what data to produce, but they - don't know how it's going to be displayed. Therefore, they - don't know anything about templates.

      -
    4. -
    - -

    Since the business objects don't rely on the templates, if - you need to use them with some other presentation system, you - won't have to rewrite your application.

    -
    - - - - -
    - - 27.  - Will you ever provide backward compatibility? - -
    - - -
    - -

    FreeMarker 2.0 was a complete rewrite of FreeMarker 1.x, by - a new author. The 1.x series continues as separated project: - FreeMarker Classic. Since 2.x follows different philosophy than - 1.x, 2.0x releases were immature despite the high major version - number. This caused further radical changes between 2.01 and 2.1. - As of 2.1 things were much more matured, and 2.2 is almost - backward compatible with 2.1. We hope that this tendency - continues.

    - -

    Currently, the rule is that releases with different second - version number (as 2.1.x and 2.2.x) are not (fully) compatible. - Releases where only the third version number differs (as 2.2.1 and - 2.2.6) are compatible.

    - -

    We always provide backward compatible bugfix releases for - the released versions. So basically, you don't - have to switch to a new, non-backward - compatible release in an already written product. It's a something - for something situation... FreeMarker recovers faster from design - mistakes than many other projects, but the price of this is that - major releases are not backward compatible. This is admittedly not - optimal, it would be better if there are fewer design mistakes... - but, well, it is the reality.

    -
    - - - - -
    - - 28.  - If we distribute FreeMarker with our product, do we have to - release the source code for our product? - -
    - - -
    - -

    No. As of 2.0, FreeMarker is released under a BSD-style - license. This means that source or binary distributions may be - made freely, and can be included in other products, whether - commercial or open source.

    - -

    The only restrictions apply to the copyright of FreeMarker - itself, and the use of FreeMarker or its contributors as - endorsements of your own product. See the LICENSE for further details.

    - -

    If you use FreeMarker, we hope you'll send us a link to some - information about your product, but that's optional as - well.

    -
    - - - -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_install.html b/fmpp/docs/freemarker/app_install.html deleted file mode 100644 index 354365b..0000000 --- a/fmpp/docs/freemarker/app_install.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - FreeMarker Manual - Installing FreeMarker - - - - - - - - -
    - - - - - -

    -Appendix C   Installing FreeMarker

    - - -

    No real installation is needed. Simply ensure that - freemarker.jar is somewhere where your Java - application's class-loader will find it. In web application this usually - means putting freemarker.jar into the - WEB-INF/lib directory of your web application. (If - you want to use FreeMarker with JSP Model-2 style (which also means that - you can use custom JSP taglibs in the templates), some extra steps - needed. For more information please see the chapter about servlets.)

    FreeMarker has no required dependencies. But to use certain - optional FreeMarker features, the related party - libraries have to be available for the class-loader:

    -
      -
    • -

      Jaxen (recommended, download here) or Apache Xalan - is needed for XML XPath support. Please use at least Jaxen - 1.1-beta-8, not older versions! Apache Xalan classes are included in - a package-relocated form in Sun/Oracle J2SE 1.4-1.8 (maybe later - too), and FreeMarker will use those if it doesn't find Jaxen or - Xalan elsewhere. But as Oracle can change these internal packages - anytime, it's still recommended to use an external Jaxen or - Xalan.

      -
    • - -
    • -

      Obviously, javax.servlet classes are needed - for FreemarkerServlet. Servlet version 2.2 or - later is needed.

      -
    • - -
    • -

      For the custom JSP taglib support, you will need JSP 1.2 API - or later avilable. No JSP implementation is needed, just the API. - This is already present in pretty much every servlet container. For - more information please see the - chapter about servlets.

      -
    • - -
    • -

      Jython classes are needed for the Jython wrapper.

      -
    • - -
    • -

      Pre-1.0 JDOM is needed for the long deprecated - freemarker.ext.jdom package. (When it was - created, there was no JDOM 1.0 yet.)

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_legal.html b/fmpp/docs/freemarker/app_legal.html deleted file mode 100644 index d99dadf..0000000 --- a/fmpp/docs/freemarker/app_legal.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - FreeMarker Manual - Legal - - - - - - - - -
    - - - - - -

    -Appendix D   Legal

    - -
    -

    - - Appendix Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_license.html b/fmpp/docs/freemarker/app_license.html deleted file mode 100644 index 09e66c1..0000000 --- a/fmpp/docs/freemarker/app_license.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - FreeMarker Manual - License - - - - - - - - -
    - - - - - -

    -License

    - - -
    -
    -Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -==============================================================================
    -END LICENSE
    -
    -
    -FreeMarker subcomponents with different copyright owners
    ---------------------------------------------------------
    -
    -FreeMarker, both in its source code and binary form (freemarker.jar)
    -includes a number of files that are licensed by the Apache Software
    -Foundation under the Apache License, Version 2.0. This is the same
    -license as the license of FreeMaker, but the copyright owner is the
    -Apache Software Foundation. These files are:
    -  
    -    freemarker/ext/jsp/web-app_2_2.dtd
    -    freemarker/ext/jsp/web-app_2_3.dtd
    -    freemarker/ext/jsp/web-app_2_4.xsd
    -    freemarker/ext/jsp/web-app_2_5.xsd
    -    freemarker/ext/jsp/web-jsptaglibrary_1_1.dtd
    -    freemarker/ext/jsp/web-jsptaglibrary_1_2.dtd
    -    freemarker/ext/jsp/web-jsptaglibrary_2_0.xsd
    -    freemarker/ext/jsp/web-jsptaglibrary_2_1.xsd
    -
    -
    -Historical notes
    -----------------
    -
    -FreeMarker 1.x was released under the LGPL license. Later, by
    -community consensus, we have switched over to a BSD-style license. As
    -of FreeMarker 2.2pre1, the original author, Benjamin Geer, has
    -relinquished the copyright in behalf of Visigoth Software Society.
    -
    -With FreeMarker 2.3.21 the license has changed to Apache License,
    -Version 2.0, and the owner has changed from Visigoth Software Society
    -to three of the FreeMarker 2.X developers, Attila Szegedi, Daniel
    -Dekany, and Jonathan Revusky.  
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/app_versions.html b/fmpp/docs/freemarker/app_versions.html deleted file mode 100644 index ba45bcc..0000000 --- a/fmpp/docs/freemarker/app_versions.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - FreeMarker Manual - Version history - - - - - - - - -
    - - - - - -

    -Appendix B   Version history

    - -
    -

    - - Appendix Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/detailed-toc.html b/fmpp/docs/freemarker/detailed-toc.html deleted file mode 100644 index a079c74..0000000 --- a/fmpp/docs/freemarker/detailed-toc.html +++ /dev/null @@ -1,1989 +0,0 @@ - - - - - - - - FreeMarker Manual - - - - - - - - -
    - -
    -

    - - Detailed Table of Contents - -  [Show simplified...]

    - - -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui.html b/fmpp/docs/freemarker/dgui.html deleted file mode 100644 index 01d620a..0000000 --- a/fmpp/docs/freemarker/dgui.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - FreeMarker Manual - Template Author's Guide - - - - - - - - -
    - - - - - -

    -Part I   Template Author's Guide

    - -
    -

    - - Part Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_datamodel.html b/fmpp/docs/freemarker/dgui_datamodel.html deleted file mode 100644 index 5d8801e..0000000 --- a/fmpp/docs/freemarker/dgui_datamodel.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - FreeMarker Manual - Values, Types - - - - - - - - -
    - - - - - -

    -Chapter 2   Values, Types

    - -
    -

    - - Chapter Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_datamodel_basics.html b/fmpp/docs/freemarker/dgui_datamodel_basics.html deleted file mode 100644 index c3d7b2e..0000000 --- a/fmpp/docs/freemarker/dgui_datamodel_basics.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - FreeMarker Manual - Basics - - - - - - - - -
    - - - - - -

    -Basics

    - -
    -

    - - Page Contents - -

    - - -
    - - -
    -

    Note

    - -

    It is assumed that you have already read the Getting Started chapter.

    -
    -

    Understanding the concept of values and types is crucial for the - understanding of data-models. However, the concept of values and types - is not confined to data-models, as you will see.

    - - - - -

    -What is a value?

    - - - - -

    Real programmers can safely skip - this section.

    - -

    Examples of values as you know the term - from the everyday math are 16, 0.5, and so on, i.e. numbers. In the - case of computer languages the value term has a wider meaning, as a - value needn't be a number. For example, take this data-model:

    - -
    -
    -(root)
    - |
    - +- user = "Big Joe"
    - |
    - +- today = Jul 6, 2007
    - |
    - +- todayHoliday = false
    - |
    - +- lotteryNumbers
    - |   |
    - |   +- (1st) = 20
    - |   |
    - |   +- (2st) = 14
    - |   |
    - |   +- (3rd) = 42
    - |   |
    - |   +- (4th) = 8
    - |   |
    - |   +- (5th) = 15
    - |
    - +- cargo
    -     |
    -     +- name = "coal"
    -     |
    -     +- weight = 40  
    - - -

    We say that the value of the the - user variable is "Big Joe" (a string), the - value of today is Jul 6, - 2007 (a date), the value of - todayHoliday is false (a boolean, ie. a yes/no - thing). The value of - lotteryNumbers is the sequence that contains 20, - 14, 42, 8, 15. Surely lotteryNumbers is multiple - values in the sense that it contains multiple - values (for example, the 2nd item in it is a the - value 14), but still, - lotteryNumbers itself is a single value. It's - like a box that contains many other items; the whole box can be seen - as a single item. Last not least we also have the - value of cargo, which is a - hash (a box-like thing again).So, a value is something that can be - stored in a variable (e.g., in user or - cargo or cargo.name). But a - value need not be stored in a variable to be called a value, for - example we have the value 100 here:

    - -
    -
    -<#if cargo.weight < 100>Light cargo</#if>  
    - - -

    The temporaly result of a calculations are also called values, - like 20 and 120 when this template is executed (it will print - 120):

    - -
    -
    -${cargo.weight / 2 + 100}  
    - - -

    Explanation for this last: As the result of dividing the two - values, 40 (the weight of the cargo) and 2, a new value 20 is - created. Then 100 is added to it, so the value 120 is created. Then - 120 is printed - (${...}), and the - template execution goes on and all these values gone.

    - -

    Certainly now you feel what the value term means.

    - - - - - -

    -What is type?

    - - -

    Values have an important aspect, their type. For example the - type of the value of the user variable is string, - and the type of the value of the lotteryNumbers - variable is sequence. The type of a value is important because it - determines to a large extent how and where you can use the value. - Like ${user / 2} is an error, but - ${cargo.weight / 2} works and prints 20, since - division only does make sense for a number, but not for a string. - Or, using dot like in cargo.name does make sense - only if cargo is a hash. Or, you can list with - <#list ...> - sequences only. Or, the condition of <#if - ...> must be a boolean. And so on.

    - -
    -

    Note

    - -

    A little terminology... Saying "a boolean" or "a boolean - value" or "a value of type boolean" are all the same.

    -
    - - -

    A value can have multiple types at the same time, - although it's rarely utilized. For example in the data-model below - mouse is both a string and a hash:

    - -
    -
    -(root)
    - |
    - +- mouse = "Yerri"
    -     |
    -     +- age = 12
    -     |
    -     +- color = "brown"  
    - - -

    If you merge this template with the above data-model:

    - -
    -
    -${mouse}       <#-- uses mouse as a string -->
    -${mouse.age}   <#-- uses mouse as a hash -->
    -${mouse.color} <#-- uses mouse as a hash -->  
    - - -

    the output will be:

    - -
    -
    -Yerri
    -12
    -brown  
    - - - - - - -

    -The data-model is a hash

    - - -

    Looking at the various data-model examples you may already - realized: the thing marked as "(root)" is just a value of type hash. - When you write something like user, that means - that you want the "user" variable stored in the root hash. Like if - you were writing root.user, except that there is - no variable called "root" so that wouldn't work.

    - -

    Some may get confused by the fact that our example data-model, - that is, the root hash, contains further hashes and sequences - (lotteryNumbers and cargo). - There is nothing special in that. A hash contains other variables, - and those variables have a value, which can be a string, a number, - etc., and of course it can be a hash or sequence as well. Because, - as it was explained earlier, a sequence or a hash is just a value, - like a string or a number is.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_datamodel_types.html b/fmpp/docs/freemarker/dgui_datamodel_types.html deleted file mode 100644 index 251ccff..0000000 --- a/fmpp/docs/freemarker/dgui_datamodel_types.html +++ /dev/null @@ -1,579 +0,0 @@ - - - - - - - - FreeMarker Manual - The types - - - - - - - - -
    - - - - - -

    -The types

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    The suppored types are:

    -
    - - - - - -

    -Scalars

    - - - - -

    These are the basic, simple kind of values. They can - be:

    - -
    -
      -
    • -

      String: It is simple text, e.g., the name of a - product.

      - -

      If you want to give a string value directly in the - template, rather than use a variable that comes from the data - model, you write the text between quotation marks, e.g., - "green mouse" or 'green - mouse'. (More details regarding the syntax can be - found later.)

      -
    • - -
    • -

      Number: For example the price of a product. - Whole numbers and non-whole - numbers are not distinguished; there is only a single number - type. So for example 3/2 will be always 1.5, and never 1. Just - like if you are using a calculator.

      - -

      If you want to give a numerical value directly in the - template, then you write for example: 150 or - -90.05 or 0.001. (More - details regarding the syntax can be found later.)

      -
    • - -
    • -

      Boolean: A boolean value represents a logical true - or false (yes or no). For example, if a the visitor has been - logged in or not. Typically you use booleans as the condition of - the if directive, like <#if - loggedIn - >...</#if> or - <#if price == - 0>...</#if>; in - the last case the result of the price == 0 - part is a boolean value.

      - -

      In the templates you can directly specify a boolean with - the reserved words true and - false.

      -
    • - -
    • -

      Date: A date-like value stores date/time related - data. It has three variations:

      - -
      -
        -
      • -

        Date: Like April 4, 2003. Day precision, no time of - day part.

        -
      • - -
      • -

        Time: Like 10:19:18 PM. Millisecond precision, no date - part.

        -
      • - -
      • -

        Date-time (sometimes called "time stamp") as April 4, - 2003 10:19:18 PM. Both date and time, with millisecond - precision.

        -
      • -
      - - -

      Unfortunately, because of the limitations of the Java - platform, FreeMarker sometimes can't decide which parts of the - date are in use (i.e., if it is date-time, a date or a time). - The solution for this problem is an advanced topic that will be - discussed later.

      - -

      It is possible to define date-like values directly in - templates, but this is an advanced topic that will be explained - later.

      -
    • -
    - - -

    Bear in mind that FreeMarker distinguishes strings from - numbers, booleans and date-like values. For example, while the - string "150" looks like the number - 150, a string is still just arbitrary sequence of - characters, and you can't do arithmetic with it, can't compare it - with another number, etc.

    - - - - - -

    -Containers

    - - - - -

    These are the values whose purpose is to contain other - variables; they are just containers. The contained variables are - often referred as subvariables. The container - types are:

    - -
    -
      -
    • -

      Hash: Associates a unique lookup name with each of - its subvariables. The name is an unrestricted string. A hash - doesn't define an ordering for the - subvariables in it. That is, there is no such thing as the first - subvariable, and the second subvariable, etc.; the variables are - just accessed by name.

      -
    • - -
    • -

      Sequence: Associates an integer number with each - of its subvariables. The first subvariable is associated with 0, - the second with 1, the third to 2, and so on; the subvariables - are ordered. These numbers are often called the - indexes of the subvariables. Sequences are - usually dense, i.e., all indexes up to the index of the last - subvariable have an associated subvariable, but it's not - strictly necessary. The type of the subvariable values need not - be the same.

      -
    • - -
    • -

      Collection: A collection, from the viewpoint of - the template author, is a restricted sequence. You cannot access - its size or retrieve its subvariables by index, but they can be - still listed with the list - directive.

      -
    • -
    - - -

    Note that since a value can - have multiple types, it is possible for a value to be both a - hash and a sequence, in which case it would support index-based - access as well as access by lookup name. However, typically a - container will be either a hash or a sequence, not both.

    - -

    As the value of the variables stored in hashes and sequences - (and collections) can be anything, it can be a hash or sequence (or - collection) as well. This way you can build arbitrarily deep - structures.

    - -

    The data-model itself (or better said the root of it) is a - hash.

    - - - - - -

    -Subroutines

    - - - - - - - -

    -Methods and functions

    - - - - - - -

    A value that is a method or a function is used to calculate - another value, influenced by the parameters you give to it.

    - -

    For programmer types: - Methods/functions are first-class values, just like in functional - programming languages. This means that functions/methods can be - the parameters or return values of other functions/methods, you - can assign them to variables, and so on.

    - -

    Suppose that programmers have put the method variable - avg in the data-model that can be used to - calculate the average of numbers. If you give the 3 and 5 as - parameters when you access avg, then you get - the value 4.

    - -

    The usage of methods will be explained later, but perhaps - this example helps to understand what methods are:

    - -
    -
    -The average of 3 and 5 is: ${avg(3, 5)}
    -The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
    -The average of the price of a python and an elephant is:
    -${avg(animals.python.price, animals.elephant.price)}  
    - - -

    this will output:

    - -
    -
    -The average of 3 and 5 is: 4
    -The average of 6 and 10 and 20 is: 12
    -The average of the price of a python and an elephant is:
    -4999.5  
    - - -

    What is the difference between a method and a function? As - far as the template author is concerned, nothing. Well not really - nothing, as methods typically come from the data-model (as they reflect the methods of Java - objects), and functions are defined in templates (with - the function - directive -- an advanced topic), but both can be used on - the same way.

    - - - - - - - -

    -User-defined directives

    - - - - - - - - -

    A value of this type can be used as user-defined directive - (with other words, as FreeMarker tag). An user-defined directive - is a subroutine, something like a little reusable template - fragment. But this is an advanced topic that will be explained - later in its own - chapter.

    - -

    For programmer types: - user-defined directives (such as macros), are first-class values - too, just like functions/methods are.

    - -

    Just to get an idea about user-defined directives (so just - ignore this if you won't understand), assume we have a variable, - box, whose value is a user-defined directive - that prints some kind of fancy HTML message box with a title bar - and a message in it. The box variable could be - used in the template like this (for example):

    - -
    -
    -<@box title="Attention!">
    -  Too much copy-pasting may leads to
    -  maintenance headaches.
    -</@box 
    - - - - - - - - -

    -Function/method versus user-defined directive

    - - -

    This is for advanced users again (so ignore it if you don't - understand). It's a frequent dilemma if you should use a - function/method or an user-defined directive to implement - something. The rule of thumb is: Implement the facility as - user-defined directive instead of as function/method if:

    - -
    -
      -
    • -

      ... the output (the return value) is markup (HTML, XML, - etc.). The main reason is that the result of functions are - subject to automatic XML-escaping (due to the nature of - ${...}), while - the output of user-defined directives are not (due to the - nature of - <@...>; - its output is assumed to be markup, and hence already - escaped).

      -
    • - -
    • -

      ... it's the side-effect that is important and not the - return value. For example, a directive whose purpose is to add - an entry to the server log is like that. (In fact you can't - have a return value for a user-defined directive, but some - kind of feedback is still possible by setting non-local - variables.)

      -
    • - -
    • -

      ... it will do flow control (like for example - list or if directives - do). You just can't do that with a function/method - anyway.

      -
    • -
    - - -

    The Java methods of FreeMarker-unaware Java objects are - normally visible as methods in templates, regardless of the nature - of the Java method. That said, you have no choice there.

    - - - - - - -

    -Miscellaneous

    - - - - - - - -

    -Nodes

    - - - - -

    Node variables represent a node in a tree structure, and are - used mostly with XML processing, which - is an advanced, and specialized topic.

    - -

    Still, a quick overview for advanced - users: A node is similar to a sequence that stores - other nodes, which are often referred as the children nodes. A - node stores a reference to its container node, which is often - referred as the parent node. The main point of being a node is the - topological information; other data must be stored by utilizing - that a value can have multiple types. Like, a value may be both a - node and a number, in which case it can store a number as the - "pay-load". Apart from the topological information, a node can - store some metainformation as well: a node name, a node type - (string), and a node namespace (string). For example, if the node - symbolizes a h1 element in an XHTML document, - then its name could be "h1", it's node type - could be "element", and it's namespace could be - "http://www.w3.org/1999/xhtml". But it's up to - the designer of the data-model if what meaning these - metainformations have, and if they are used at all. The way of - retrieving the topological and metainformations is described in a later chapter (that you - don't have to understand at this point).

    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc.html b/fmpp/docs/freemarker/dgui_misc.html deleted file mode 100644 index 927a719..0000000 --- a/fmpp/docs/freemarker/dgui_misc.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - FreeMarker Manual - Miscellaneous - - - - - - - - -
    - - - - - -

    -Chapter 4   Miscellaneous

    - - - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc_alternativesyntax.html b/fmpp/docs/freemarker/dgui_misc_alternativesyntax.html deleted file mode 100644 index 4cc41e8..0000000 --- a/fmpp/docs/freemarker/dgui_misc_alternativesyntax.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - FreeMarker Manual - Alternative (square bracket) syntax - - - - - - - - -
    - - - - - -

    -Alternative (square bracket) syntax

    - - -
    -

    Note

    - -

    This feature exists since FreeMarker 2.3.4.

    -
    -

    FreeMarker supports an alternative syntax, where - [ and ] is used instead of - < and > in FreeMarker - directives and comments, for example:

    -
      -
    • - Calling predefined directive: [#list animals as - animal]...[/#list] -
    • - -
    • - Calling user-defined directive: [@myMacro - /] -
    • - -
    • - Comment: [#-- the comment --] -
    • -
    -

    To use the alternative syntax instead of the default one, start - the template with the ftl directive - using the alternative syntax. If you don't know what is the - ftl directive, just start the template with - [#ftl], and remember that it should be the very - first thing in the file (except that white-space can precede it). For - example, this is how the last example of the Getting Started looks with - the alternative syntax (assuming it's a complete template, not just a - fragment):

    -
    -[#ftl]
    -<p>We have these animals:
    -<table border=1>
    -  <tr><th>Name<th>Price
    -  [#list animals as animal]
    -  <tr>
    -    <td>
    -      [#if animal.size = "large"]<b>[/#if]
    -      ${animal.name}
    -      [#if animal.size = "large"]</b>[/#if]
    -    <td>${animal.price} Euros
    -  [/#list]
    -</table>  
    -

    The alternative (square bracket) and the default (angle bracket) - syntax are mutually exclusive within a template. That is, either the - whole template uses alternative syntax, or the whole template uses the - default syntax. If the template uses alternative syntax, things like - <#if ...> are - count as static text, not as FTL tags. Similarly, if the template uses - the default syntax, things like [#if - ...] count as static text, not as - FTL tags.

    If you start the file with [#ftl - ...] (where the - ... stands for the - optional parameters; of course [#ftl] works too) - the file will surely use the alternative (square bracket) syntax. If - you start the file with <#ftl - ...> the file will surely use - the normal (angle bracket) syntax. If there is no - ftl directive in the file, then the programmer - decides what the syntax will be by configuring FreeMarker (programmers see - Configuration.setTagSyntax(int) in the API - javadocs). Most probably the programmers use the factory - default however. The factory default in 2.3.x is using the normal - syntax. The factory default in 2.4.x will be auto-detection, which - means that the first FreeMarker tag determines the syntax (it can be - anything, not just ftl).

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc_namespace.html b/fmpp/docs/freemarker/dgui_misc_namespace.html deleted file mode 100644 index 2137894..0000000 --- a/fmpp/docs/freemarker/dgui_misc_namespace.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - - FreeMarker Manual - Namespaces - - - - - - - - -
    - - - - - -

    -Namespaces

    - - - - -

    When you run FTL templates, you have a (possibly empty) set of - variables that you have created with assign and - macro directives, as can be seen from the previous chapter. A set of variables - like this is called a namespace. In - simple cases you use only one namespace, the so-called main namespace. You don't realize this, since - normally you use only this namespace.

    But if you want to build reusable collection of macros, - functions and other variables -- usually referred as library by lingo -- the usage of multiple - namespaces becomes inevitable. Just consider if you have a big - collection of macros, that you use in several projects, or even you - want to share it with other people. It becomes impossible to be sure - that the library does not have a macro (or other variable) with the - same name as the name of a variable in the data-model, or with the - same name as a the name of a variable in another library used in the - template. In general, variables can clobber each other because of the - name clashes. So you should use a separate namespace for the variables - of each library.

    - - - - -

    -Creating a library

    - - -

    Let's create a simple library. Assume you commonly need the - variables copyright and mail - (before you ask, macros are variables):

    - -
    -
    -<#macro copyright date>
    -  <p>Copyright (C) ${date} Julia Smith. All rights reserved.</p>
    -</#macro>
    -
    -<#assign mail = "jsmith@acme.com">  
    - - -

    Store the above in the file lib/my_test.ftl - (in the directory where you store the templates). Assume you want to - use this in aWebPage.ftl. If you use - <#include "/lib/my_test.ftl"> in the - aWebPage.ftl, then it will create the two - variables in the main namespace, and it is not good now, since you - want them to be in a namespace that is used exclusively by the ``My - Test Library''. Instead of include you have to - use import - directive. This directive is, at the first glance, similar to - include, but it will create an empty namespace - for lib/my_test.ftl and will execute that there. - lib/my_test.ftl will find itself in an clean new - world, where only the variables of data-model are present (since - they are visible from everywhere), and will create the two variables - in this new world. That's fine for now, but you want to access the - two variables from aWebPage.ftl, and that uses - the main namespace, so it can't see the variables of the other - namespace. The solution is that the import - directive not only creates the new namespace, but a new hash - variable in the namespace used by the caller of - import (the main namespace in this case), that - will act as a gate into the newly created namespace. So this is how - aWebPage.ftl will look like:

    - -
    -
    -<#import "/lib/my_test.ftl" as my> <#-- the hash called "my" will be the "gate" -->
    -<@my.copyright date="1999-2002"/>
    -${my.mail}  
    - - -

    Note how it accesses the variables in the namespace created - for /lib/my_test.ftl using the newly created - namespace accessing hash, my. This will - print:

    - -
    -
    -  <p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.</p>
    -jsmith@acme.com  
    - - -

    If you would have a variable called mail or - copyright in the main namespace, that would not - cause any confusion, since the two templates use separated - namespaces. For example, modify the copyright - macro in lib/my_test.ftl to this:

    - -
    -
    -<#macro copyright date>
    -  <p>Copyright (C) ${date} Julia Smith. All rights reserved.
    -  <br>Email: ${mail}</p>
    -</#macro>  
    - - -

    and then replace aWebPage.ftl with - this:

    - -
    -
    -<#import "/lib/my_test.ftl" as my>
    -<#assign mail="fred@acme.com">
    -<@my.copyright date="1999-2002"/>
    -${my.mail}
    -${mail}  
    - - -

    and the output will be this:

    - -
    -
    -  <p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
    -  <br>Email: jsmith@acme.com</p>
    -jsmith@acme.com
    -fred@acme.com  
    - - -

    This is like that because when you have called the - copyright macro, FreeMarker has temporarily - switch to the namespace that was created by the - import directive for - /lib/my_test.ftl. Thus, the - copyright macro always sees the - mail variable that exists there, and not the - other mail that exists in the main - namespace.

    - - - - - -

    -Writing the variables of imported namespaces

    - - -

    Occasionally you may want to create or replace a variable in - an imported namespace. You can do this with the - assign directive, if you use its - namespace parameter. For example, this:

    - -
    -
    -<#import "/lib/my_test.ftl" as my>
    -${my.mail}
    -<#assign mail="jsmith@other.com" in my>
    -${my.mail}  
    - - -

    will output this:

    - -
    -
    -jsmith@acme.com
    -jsmith@other.com  
    - - - - - - -

    -Namespaces and data-model

    - - -

    The variables of the data-model are visible from everywhere. - For example, if you have a variable called user - in the data-model, lib/my_test.ftl will access - that, exactly as aWebPage.ftl does:

    - -
    -
    -<#macro copyright date>
    -  <p>Copyright (C) ${date} ${user}. All rights reserved.</p>
    -</#macro>
    -
    -<#assign mail = "${user}@acme.com">  
    - - -

    If user is ``Fred'', then the usual - example:

    - -
    -
    -<#import "/lib/my_test.ftl" as my>
    -<@my.copyright date="1999-2002"/>
    -${my.mail}  
    - - -

    will print this:

    - -
    -
    -  <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>
    -Fred@acme.com  
    - - -

    Don't forget that the variables in the namespace (the - variables you create with assign or - macro directives) have precedence over the - variables of the data-model when you are in that namespace. Thus, - the contents of data-model does not interfere with the variables - created by the library.

    - -
    -

    Note

    - -

    In some unusual applications you want to create variables in - the template those are visible from all namespaces, exactly like - the variables of the data-model. But you can't change the - data-model with templates. Still, it is possible to achieve - similar result with the global directive; read - the reference for more - details.

    -
    - - - - - - -

    -The life-cycle of namespaces

    - - -

    A namespace is identified by the path that was used with the - import directive. If you try to - import with the same path for multiple times, it - will create the namespace and run the template specified by the path - for the very first invocation of import only. The - later imports with the same path will just create - a ``gate'' hash to the same namespace. For example, let this be the - aWebPage.ftl:

    - -
    -
    -<#import "/lib/my_test.ftl" as my>
    -<#import "/lib/my_test.ftl" as foo>
    -<#import "/lib/my_test.ftl" as bar>
    -${my.mail}, ${foo.mail}, ${bar.mail}
    -<#assign mail="jsmith@other.com" in my>
    -${my.mail}, ${foo.mail}, ${bar.mail}  
    - - -

    The output will be:

    - -
    -
    -jsmith@acme.com, jsmith@acme.com, jsmith@acme.com
    -jsmith@other.com, jsmith@other.com, jsmith@other.com  
    - - -

    since you see the same namespace through - my, foo and - bar.

    - -

    Note that namespaces are not hierarchical, they exist - independently of each other. That is, if you - import namespace N2 while you are in name space - N1, N2 will not be inside N1. N1 just gets a hash by which it can - access N2. This is the same N2 namespace that you would access if, - say, you import N2 when you are in the main - namespace.

    - -

    Each template - processing job has its own private set of namespaces. Each - template-processing job is a separated cosmos that exists only for - the short period of time while the given page is rendered, and then - it vanishes with all its populated namespaces. Thus, whenever we say - that ``import is called for the first time'' and - such, we are always talking in the context of a single template - processing job.

    - - - - - -

    -Writing libraries for other people

    - - - - -

    If you have written a good quality library that can be useful - for other people, you may want to make it available on the Internet - (like on http://freemarker.org/libraries.html). - To prevent clashes with the names of libraries used by other - authors, and to make it easy to write libraries that import other - published libraries, there is a de-facto standard that specifies the - format of library paths. The standard is that the library must be - available (importable) for templates and other libraries with a path - like this:

    - -

    /lib/yourcompany.com/your_library.ftl

    - -

    For example if you work for Example Inc. that owns the - www.example.com homepage, and you develop a widget library, then the - path of the FTL file to import should be:

    - -

    /lib/example.com/widget.ftl

    - -

    Note that the www is omitted. The part after the 3rd slash can - contain subdirectories such as:

    - -

    /lib/example.com/commons/string.ftl

    - -

    An important rule is that the path should not contain - upper-case letters. To separate words, use _, as - in wml_form (not - wmlForm).

    - -

    Note that if you do not develop the library for a company or - organization, you should use the URL of the project homepage, such - as /lib/example.sourceforge.net/example.ftl, or - /lib/geocities.com/jsmith/example.ftl.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc_userdefdir.html b/fmpp/docs/freemarker/dgui_misc_userdefdir.html deleted file mode 100644 index e73eaf7..0000000 --- a/fmpp/docs/freemarker/dgui_misc_userdefdir.html +++ /dev/null @@ -1,641 +0,0 @@ - - - - - - - - FreeMarker Manual - Defining your own directives - - - - - - - - -
    - - - - - -

    -Defining your own directives

    - - - - -

    As far as template authors are concerned, user-defined - directives can be defined using the macro - directive. Java programmers who want to - implement directives in Java Language, rather than in a template, - should use - freemarker.template.TemplateDirectiveModel (see - more - here...).

    - - - - -

    -Basics

    - - - - -

    A macro is a template fragment associated with a variable. You - can use that variable in your template as a user-defined directive, - so it helps in repetitive tasks. For example, this creates a macro - variable that prints a big ``Hello Joe!'':

    - -
    -
    -<#macro greet>
    -  <font size="+2">Hello Joe!</font>
    -</#macro>  
    - - -

    The macro directive itself does not print - anything; it just creates the macro variable, so there will be a - variable called greet. Things between the - <#macro greet> and - </#macro> (called macro definition body) will be executed only - when you use the variable as directive. You use user-defined - directives by writing @ instead of - # in the FTL tag. Use the variable name as the - directive name. Also, the end-tag for user-defined directives is - mandatory. So you use greet like this:

    - -
    -
    -<@greet></@greet>  
    - - -

    But since - <anything></anything> - is equivalent with - <anything/> you - should use this shorter form (that is familiar for you if you know - XML):

    - -
    -
    -<@greet/>  
    - - -

    This will print:

    - -
    -
    -  <font size="+2">Hello Joe!</font>
    -    
    - - -

    But macros can do much more, since the thing between - <#macro ...> and - </#macro> is a template fragment, thus it - can contain interpolations - (${...}) and FTL tags - (e.g. <#if - ...>...</#if>).

    - -
    -

    Note

    - -

    Programmers will say on - <@...> that - you call the macro.

    -
    - - - - - - -

    -Parameters

    - - -

    Let's improve the greet macro so it can use - arbitrary name, not only ``Joe''. For this purpose you can use - parameters. You define the - parameters after the name of the macro in the - macro directive. Here we define one parameter for - the greet macro, - person:

    - -
    -
    -<#macro greet person>
    -  <font size="+2">Hello ${person}!</font>
    -</#macro>  
    - - -

    and then you can use this macro as:

    - -
    -
    -<@greet person="Fred"/> and <@greet person="Batman"/>  
    - - -

    which is similar to HTML syntax. This will print:

    - -
    -
    -  <font size="+2">Hello Fred!</font>
    - and   <font size="+2">Hello Batman!</font>
    -   
    - - -

    As you can see, the actual value of the macro parameter is - accessible in the macro definition body as a variable - (person). As with predefined directives, - the value of a parameter (the right side of =) is - an FTL expression. Thus, - unlike with HTML, the quotation marks around - "Fred" and "Batman" are not - optional. <@greet person=Fred/> would mean - that you use the value of variable Fred for the - person parameter, rather than the string - "Fred". Of course parameter value need not be a - string, it can be number, boolean, hash, sequence, etc., also you - can use complex expression on the right side of = - (e.g. someParam=(price + 50)*1.25).

    - -

    User-defined directives can have multiple parameters. For - example, add a new parameter color:

    - -
    -
    -<#macro greet person color>
    -  <font size="+2" color="${color}">Hello ${person}!</font>
    -</#macro>  
    - - -

    and then you can use this macro like:

    - -
    -
    -<@greet person="Fred" color="black"/>  
    - - -

    The order of parameters is not important, so this is - equivalent with the previous:

    - -
    -
    -<@greet color="black" person="Fred"/>  
    - - -

    When you call the macro, you can use only parameters that you - have defined in the macro directive (in this - case: person and color). So if - you try <@greet person="Fred" color="black" - background="green"/> then you will get an error, since - you haven't mentioned parameter background in the - <#macro - ...>.

    - -

    Also, you must give value for all parameters that you have - defined for the macro. So if you try <@greet - person="Fred"/> then you will get an error, since you - forgot to specify the value of color. However, it - often happens that you would specify the same value for a parameter - in most cases, so you want to specify the value only when you want a - different value for it than the usual. This can be achieved if you - specify the parameter in the macro directive as - param_name=usual_value. - For example, you want to use "black" for - color if you don't specify value for that - parameter when you use the greet - directive:

    - -
    -
    -<#macro greet person color="black">
    -  <font size="+2" color="${color}">Hello ${person}!</font>
    -</#macro>  
    - - -

    Now <@greet person="Fred"/> is OK, - since it is equivalent with <@greet person="Fred" - color="black"/>, thus the value of - color parameter is known. If you want - "red" for color, then you - write <@greet person="Fred" color="red"/>, - and this value will override the usual value specified with the - macro directive, so the value of - color parameter will be - "red".

    - -

    Also, it is important to realize that -- according to the - already explained FTL expression - rules -- someParam=foo and - someParam="${foo}" are very different. In the - fist case, you use the value of variable foo as - the value of the parameter. In the second case, you use a string literal - with interpolation, so the value of the parameter will be a - string -- in this case, the value of foo rendered - to text -- regardless of the type (as number, date, etc.) of - foo. Or, another example: - someParam=3/4 and - someParam="${3/4}" are different. If the - directive wants a numerical value for someParam, - it will not like the second variation. Do not exchange these.

    - -

    A very important aspect of macro parameters is that they are - local variables. For more information about local variables please - read: Defining variables in the template

    - - - - - -

    -Nested content

    - - -

    Custom directive can have nested content, similarly as - predefined directives like <#if - ...>nested - content</#if> can have. For example, - this creates a macro that draws borders around its nested - content:

    - -
    -
    -<#macro border>
    -  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    -    <#nested>
    -  </tr></td></table>
    -</#macro>  
    - - -

    The <#nested> directive executes the - template fragment between the start-tag and end-tags of the - directive. So if you do this:

    - -
    -
    -<@border>The bordered text</@border>  
    - - -

    the output will be:

    - -
    -
    -  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    -    The bordered text
    -  </td></tr></table>
    -   
    - - -

    The nested directive can be called for - multiple times, for example:

    - -
    -
    -<#macro do_thrice>
    -  <#nested>
    -  <#nested>
    -  <#nested>
    -</#macro>
    -<@do_thrice>
    -  Anything.
    -</@do_thrice>  
    - - -

    will print:

    - -
    -
    -  Anything.
    -  Anything.
    -  Anything.  
    - - -

    If you don't use the nested directive, then - the nested content will not be executed. Thus, if you accidentally - use the greet directive like this:

    - -
    -
    -<@greet person="Joe">
    -  Anything.
    -</@greet>  
    - - -

    then FreeMarker will not see this as an error, and simply - prints:

    - -
    -
    -<font size="+2">Hello Joe!</font>  
    - - -

    and the nested content will be ignored, since the - greet macro never uses nested - directive.

    - -

    The nested content can be anything that is valid FTL, - including other user-defined directives. Thus this is OK:

    - -
    -
    -<@border>
    -  <ul>
    -  <@do_thrice>
    -    <li><@greet person="Joe"/>
    -  </@do_thrice>
    -  </ul>
    -</@border>  
    - - -

    and will print:

    - -
    -
    -  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    -      <ul>
    -    <li><font size="+2">Hello Joe!</font>
    -
    -    <li><font size="+2">Hello Joe!</font>
    -
    -    <li><font size="+2">Hello Joe!</font>
    -
    -  </ul>
    -
    -  </tr></td></table>  
    - - -

    The local variables of a - macro are not visible in the nested content. Say, this:

    - -
    -
    -<#macro repeat count>
    -  <#local y = "test">
    -  <#list 1..count as x>
    -    ${y} ${count}/${x}: <#nested>
    -  </#list>
    -</#macro>
    -<@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}</@repeat>  
    - - -

    will print this:

    - -
    -
    -    test 3/1: ? ? ?
    -    test 3/2: ? ? ?
    -    test 3/3: ? ? ?  
    - - -

    because the y, x and - count are the local (private) variables of the - macro, and are not visible from outside the macro definition. - Furthermore, a different set of local variables is used for each - macro call, so this will not cause confusion:

    - -
    -
    -<#macro test foo>${foo} (<#nested>) ${foo}</#macro>
    -<@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>  
    - - -

    and will print this:

    - -
    -
    -A (B (C () C) B) A  
    - - - - - - -

    -Macros with loop variables

    - - - - -

    Predefined directives like list can use - so-called loop variables; you should read Defining variables in the template to understand loop variables.

    - -

    User-defined directives can also have loop variables. For - example, let's extend the do_thrice directive of - the earlier examples so it exposes the current repetition number as - a loop variable. As with the predefined directives (as - list) the name of loop - variables is given when you call the directive (as - foo in <#list foos as - foo>...</#list>), - while the value of the variables is set by the - directive itself.

    - -
    -
    -<#macro do_thrice>
    -  <#nested 1>
    -  <#nested 2>
    -  <#nested 3>
    -</#macro>
    -<@do_thrice ; x> <#-- user-defined directive uses ";" instead of "as" -->
    -  ${x} Anything.
    -</@do_thrice>  
    - - -

    This will print:

    - -
    -
    -  1 Anything.
    -  2 Anything.
    -  3 Anything.
    -   
    - - -

    The syntactical rule is that you pass the actual value of the - loop variable for a certain "loop" (i.e. repetition of the nested - content) as the parameter of nested directive (of - course the parameter can by arbitrary expression). The name of the - loop variable is specified in the user-defined directive open tag - (<@...>) after the parameters and a - semicolon.

    - -

    A macro can use more the one loop variable (the order of - variables is significant):

    - -
    -
    -<#macro repeat count>
    -  <#list 1..count as x>
    -    <#nested x, x/2, x==count>
    -  </#list>
    -</#macro>
    -<@repeat count=4 ; c, halfc, last>
    -  ${c}. ${halfc}<#if last> Last!</#if>
    -</@repeat>  
    - - -

    The output will be:

    - -
    -
    -  1. 0.5
    -  2. 1
    -  3. 1.5
    -  4. 2 Last!
    -   
    - - -

    It is not a problem if you specify different number of loop - variables in the user-defined directive start-tag (that is, after - the semicolon) than with the nested directive. If - you specify less loop variables after the semicolon, then simply you - will not see the last few values that the nested - directive provides, since there is no loop variable to hold those - values. So these are all OK:

    - -
    -
    -<@repeat count=4 ; c, halfc, last>
    -  ${c}. ${halfc}<#if last> Last!</#if>
    -</@repeat>
    -<@repeat count=4 ; c, halfc>
    -  ${c}. ${halfc}
    -</@repeat>
    -<@repeat count=4>
    -  Just repeat it...
    -</@repeat>  
    - - -

    If you specify more variables after the semicolon than with - the nested directive, then the last few loop - variables will not be created (i.e. will be undefined in the nested - content).

    - - - - - -

    -More about user-defined directives and macros

    - - -

    Now you may read the relevant parts of the FreeMarker - Reference:

    - - - - -

    You can define methods in FTL as well, see the function - directive.

    - -

    Also, you may interested in namespaces: Namespaces. Namespaces help you to organize and - reuse your commonly used macros.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc_var.html b/fmpp/docs/freemarker/dgui_misc_var.html deleted file mode 100644 index 47c1712..0000000 --- a/fmpp/docs/freemarker/dgui_misc_var.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - FreeMarker Manual - Defining variables in the template - - - - - - - - -
    - - - - - -

    -Defining variables in the template

    - - -

    As we have described, a template can use the variables defined - in the data-model. A template can also define variables outside the - data-model for its own use. These temporary variables can be created - and replaced using FTL directives. Note that each template processing job - has its own private set of these variables that exists while the given - page is rendered. This variable set is initially empty, and will be - thrown away when the template processing job has been finished.

    You access a variable that you have defined in the template - exactly as if it were a variable in the data-model root. The variable - has precedence over any variable of the same name defined in the - data-model. That is, if you define a variable called ``foo'' and - coincidentally, there is a ``foo'' in the data-model as well, then the - variable created in the template will hide (not overwrite!) the - variable in the data-model root. For example, - ${foo} will print the value of the variable created - in the template.

    There are 3 kind of variables that are defined in a - template:

    -
      -
    • -

      ``plain'' variables: They - are accessible from everywhere in the template, or from the - templates inserted with include directive. You - can create and replace these variables with the assign. - Also, because macros and functions are just variable, the macro - directives and function - directives also set variables like - assign does.

      -
    • - -
    • -

      Local variables: They can - only be set inside a macro definition body, - and are only visible from there. A local variable only exists for - the duration of a macro call. You can create and replace local - variables inside macro definition bodies with the local - directive.

      -
    • - -
    • -

      Loop variables: Loop - variables are created automatically by directives like list, and - they only exist between the start-tag and end-tag of the - directive. Macro - parameters are local variables, not loop variables.

      -
    • - -
    • -

      Global variables: This is - an advanced topic, and this kind of variables should be seldom - used. Global variables are shared by all templates, even if they - belong to different name spaces because they were import-ed - as opposed to include-d. Thus, their visibility - is like that of data-model variables.They are set via the global - directive.

      -
    • -
    -

    Example: Create and replace variables with - assign:

    -
    -<#assign x = 1>  <#-- create variable x -->
    -${x}
    -<#assign x = x + 3> <#-- replace variable x -->
    -${x}  
    -

    Output:

    -
    -1
    -4  
    -

    Local variables hide (not overwrite) ``plain'' variables of the - same name. Loop variables hide (not overwrite) local and ``plain'' - variables of the same name. For example:

    -
    -<#assign x = "plain">
    -1. ${x}  <#-- we see the plain var. here -->
    -<@test/>
    -6. ${x}  <#-- the value of plain var. was not changed -->
    -<#list ["loop"] as x>
    -    7. ${x}  <#-- now the loop var. hides the plain var. -->
    -    <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->
    -    8. ${x}  <#-- it still hides the plain var. -->
    -</#list>
    -9. ${x}  <#-- the new value of plain var. -->
    -
    -<#macro test>
    -  2. ${x}  <#-- we still see the plain var. here -->
    -  <#local x = "local">
    -  3. ${x}  <#-- now the local var. hides it -->
    -  <#list ["loop"] as x>
    -    4. ${x}  <#-- now the loop var. hides the local var. -->
    -  </#list>
    -  5. ${x}  <#-- now we see the local var. again -->
    -</#macro>  
    -

    the output:

    -
    -1. plain
    -  2. plain
    -  3. local
    -    4. loop
    -  5. local
    -6. plain
    -    7. loop
    -    8. loop
    -9. plain2
    -   
    -

    An inner loop variable can hide an outer loop variable:

    -
    -<#list ["loop 1"] as x>
    -  ${x}
    -  <#list ["loop 2"] as x>
    -    ${x}
    -    <#list ["loop 3"] as x>
    -      ${x}
    -    </#list>
    -    ${x}
    -  </#list>
    -  ${x}
    -</#list>  
    -

    the output:

    -
    -  loop 1
    -    loop 2
    -      loop 3
    -    loop 2
    -  loop 1  
    -

    Note that the value of a loop variable is set by the directive - invocation that has created it (the <list - ...> tags in this case). There - is no other way to change the value of a loop variable (say, you can't - change its value with some kind of assignment directive). You can hide - temporarily a loop variable with another loop variable though, as you - have seen above.

    Sometimes it happens that a variable hides the variable in the - data-model with the same name, but you want to read the variable of - the data-model. In this case you can use the special variable - globals. For example, assume we have a variable - called user in the data-model with value ``Big - Joe'':

    -
    -<#assign user = "Joe Hider">
    -${user}          <#-- prints: Joe Hider -->
    -${.globals.user} <#-- prints: Big Joe -->  
    -

    Variables set via the global - directive hide data-model variables with the same name. Often, - global variables are set exactly for this purpose. But when not, you - can still access the data-model variable like - .data_model.user.

    For information about syntax of variables please read: The Template/Expressions

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_misc_whitespace.html b/fmpp/docs/freemarker/dgui_misc_whitespace.html deleted file mode 100644 index 0071d47..0000000 --- a/fmpp/docs/freemarker/dgui_misc_whitespace.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - - - FreeMarker Manual - White-space handling - - - - - - - - -
    - - - - - -

    -White-space handling

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    The control of the white-space in a template is a - problem that to some extent haunts every template engine in the - business.

    Let see this template. I have marked the components of template - with colors: text, interpolation, FTL tag. With the [BR]-s I visualize the line breaks.

    -
    -<p>List of users:[BR]
    -<#assign users = [{"name":"Joe",        "hidden":false},[BR]
    -                  {"name":"James Bond", "hidden":true},[BR]
    -                  {"name":"Julia",      "hidden":false}]>[BR]
    -<ul>[BR]
    -<#list users as user>[BR]
    -  <#if !user.hidden>[BR]
    -  <li>${user.name}[BR]
    -  </#if>[BR]
    -</#list>[BR]
    -</ul>[BR]
    -<p>That's all.  
    -

    If FreeMarker were to output all text as is, the output would be:

    -
    -<p>List of users:[BR]
    -[BR]
    -<ul>[BR]
    -[BR]
    -  [BR]
    -  <li>Joe[BR]
    -  [BR]
    -[BR]
    -  [BR]
    -[BR]
    -  [BR]  
    -  <li>Julia[BR]
    -  [BR]
    -[BR]
    -</ul>[BR]
    -<p>That's all.  
    -

    You have a lot of unwanted spaces and line breaks here. - Fortunately neither HTML nor XML is typically white-space sensitive, - but this amount of superfluous white-space can be annoying, and - needlessly increases the size of produced HTML. Of course, it is even - bigger problem when outputting white-space-sensitive formats.

    FreeMarker provides the following tools to cope with this - problem:

    -
      -
    • -

      Tools to ignore certain white-space of the template files - (parse time white-space - removal):

      - -
      -
        -
      • -

        White-space stripping: This feature automatically - ignores typical superfluous white-space around FTL tags. It - can be enabled or disabled on per template manner.

        -
      • - -
      • -

        Trimmer directives: t, - rt, lt. With these - directives you can explicitly tell FreeMarker to ignore - certain white-space. Read the - reference for more information.

        -
      • - -
      • -

        ftl - parameter strip_text: This removes all - top-level text from the template. It is useful for templates - that contain macro definitions only (and some other - non-outputting directives), because it removes the line-breaks - that you use between the macro definitions and between the - other top-level directives to improve the readability of the - template.

        -
      • -
      - -
    • - -
    • -

      Tools that remove white-space from the output (on-the-fly white-space - removal):

      - -
      -
        -
      • -

        compress directive.

        -
      • -
      - -
    • -
    - - - - - -

    -White-space stripping

    - - - - -

    If this feature is enabled for a template, then it - automatically ignores (i.e. does not print to the output) two kind - of typical superfluous white-space:

    - -
    -
      -
    • -

      Indentation white-space, and trailing white-space at the - end of the line (includes the line break) will be ignored in - lines that contains only FTL tags (e.g. - <@myMacro/>, <#if - ...>) and/or FTL - comments (e.g. <#-- blah -->), apart - from the the ignored white-space itself. For example, if a line - contains only an <#if - ...>, then the - indentation before the tag and the line break after the tag will - be ignored. However, if the line contains <#if - ...>x, then the - white-space in that line will not be ignored, because of the - x, as that is not FTL tag. Note that - according these rules, a line that contains <#if - ...><#list - ...> is subject to - white-space ignoring, while a line that contains - <#if ...> <#list - ...> is not, because the - white-space between the two FTL tags is embedded white-space, - not indentation or trailing white-space.

      -
    • - -
    • -

      White-space sandwiched between the following directives is - ignored: macro, function, - assign, global, - local, ftl, - import, but only if there is - only white-space and/or FTL comments - between the directives. In practice it means that you can put - empty lines between macro definitions and assignments as spacing - for better readability, without printing needless empty lines - (line breaks) to the output.

      -
    • -
    - - -

    The output of the last example with white-space stripping - enabled will be:

    - -
    -
    -<p>List of users:[BR]
    -<ul>[BR]
    -  <li>Joe[BR]
    -  <li>Julia[BR]
    -</ul>[BR]
    -<p>That's all.  
    - - -

    This is because after stripping the template becomes the - following; the ignored text is not colored:

    - -
    -
    -<p>List of users:[BR]
    -<#assign users = [{"name":"Joe",        "hidden":false},[BR]
    -                  {"name":"James Bond", "hidden":true},[BR]
    -                  {"name":"Julia",      "hidden":false}]>[BR]
    -<ul>[BR]
    -<#list users as user>[BR]
    -  <#if !user.hidden>[BR]
    -  <li>${user.name}[BR]
    -  </#if>[BR]
    -</#list>[BR]
    -</ul>[BR]
    -<p>That's all.  
    - - -

    White-space stripping can be enabled/disabled in per template - manner with the ftl directive. - If you don't specify this with the ftl directive, - then white-space stripping will be enabled or disabled depending on - how the programmer has configured FreeMarker. The factory default is - white-space stripping enabled, and the programmers probably left it - so (recommended). Note that enabling white-space stripping does - not degrade the performance of template - execution; white-space stripping is done during template - loading.

    - -

    White-space stripping can be disabled for a single line with - the nt - directive (for No Trim).

    - - - - - -

    -Using compress directive

    - - - - -

    Another solution is to use the compress - directive. As opposed to white-space stripping, this works - directly on the generated output, not on the template. That is, it - will investigate the printed output on the fly, and does not - investigate the FTL program that creates the output. It aggressively - removes indentations, empty lines and repeated spaces/tabs (for more - information read the reference). So the output - of:

    - -
    -
    -<#compress>
    -<#assign users = [{"name":"Joe",        "hidden":false},
    -                  {"name":"James Bond", "hidden":true},
    -                  {"name":"Julia",      "hidden":false}]>
    -List of users:
    -<#list users as user>
    -  <#if !user.hidden>
    -  - ${user.name}
    -  </#if>
    -</#list>
    -That's all.
    -</#compress>  
    - - -

    will be:

    - -
    -
    -List of users:
    -- Joe
    -- Julia
    -That's all.  
    - - -

    Note that compress is totally independent - of white-space stripping. So it is possible that the white-space of - template is stripped, and later the produced output is - compress-ed.

    - -

    Also, by default a user-defined directve called - compress is available in the data-model (due to - backward compatibility). This is the same as the directive, except - that you may optionally set the single_line - parameter, which will remove all intervening line breaks. If you - replace - <#compress>...</#compress> - on the last example with <@compress - single_line=true>...</@compress>, - then you get this output:

    - -
    -
    -List of users: - Joe - Julia That's all.  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_quickstart.html b/fmpp/docs/freemarker/dgui_quickstart.html deleted file mode 100644 index e562ae3..0000000 --- a/fmpp/docs/freemarker/dgui_quickstart.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - FreeMarker Manual - Getting Started - - - - - - - - -
    - - - - - -

    -Chapter 1   Getting Started

    - -
    -

    - - Chapter Contents - -

    - - -
    - - -

    This chapter is a very rough introduction to FreeMarker. The - chapters after this will go over things in much greater detail. - Nonetheless, once you have read this chapter, you will be able to write - simple but useful FreeMarker templates.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_quickstart_basics.html b/fmpp/docs/freemarker/dgui_quickstart_basics.html deleted file mode 100644 index 0a14161..0000000 --- a/fmpp/docs/freemarker/dgui_quickstart_basics.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - FreeMarker Manual - Template + data-model = output - - - - - - - - -
    - - - - - -

    -Template + data-model = output

    - - -

    Assume you need a HTML page in an e-shop application, similar to - this:

    -
    -<html>
    -<head>
    -  <title>Welcome!</title>
    -</head>
    -<body>
    -  <h1>Welcome Big Joe!</h1>
    -  <p>Our latest product:
    -  <a href="products/greenmouse.html">green mouse</a>!
    -</body>
    -</html>  
    -

    Let's say that the user name ("Big Joe" above) should depend on - who the logged in Web page visitor is, and the latest product should - come from a database and thus it potentially changes at any moment. In - this situation you can't just enter the user name nor the URL and name - of the latest product into the HTML, you can't use static HTML.

    FreeMarker's solution for this problem is using a template instead of the static HTML. The - template is the same as the static HTML, except that it contains some - instructions to FreeMarker that makes it dynamic:

    -
    -<html>
    -<head>
    -  <title>Welcome!</title>
    -</head>
    -<body>
    -  <h1>Welcome ${user}!</h1>
    -  <p>Our latest product:
    -  <a href="${latestProduct.url}">${latestProduct.name}</a>!
    -</body>
    -</html>  
    -

    The template is stored on the Web server, usually just like the - static HTML page would be. But whenever someone visits this page, - FreeMarker will step in and transform the template on-the-fly to plain - HTML by replacing the - ${...}-s with up-to-date - content (e.g., replacing ${user} with Big Joe or - whoever the visitor is) and send the result to the visitor's Web - browser. So the visitor's Web browser will receive something like the - first example HTML (i.e., plain HTML without FreeMarker instructions), - and it will not perceive that FreeMarker is used on the server. The - template file itself (which is, again, stored on the Web server) is - not changed during this, so the transformation will happen again and - again for each visiting. This ensures that the displayed information - is always up-to-date.

    As you see above, the template contains no instructions - regarding how to find out who the current visitor is, or how to query - the database to find out what the latest product is. It seems it just - already know these values. And indeed that's the case. An important - idea behind FreeMarker (actually, behind Web MVC) is that presentation - logic and "business logic" should be separated. In the template you - only deal with presentation issues, that is, visual design issues, - formatting issues. The data that will be displayed (such as the user - name and so on) is prepared outside FreeMarker, usually by routines - written in Java language or other general purpose language. So the - template author doesn't have to know how these values are calculated. - In fact, the way these values are calculated can be completely changed - while the templates can remain the same, and also, the look of the - page can be completely changed without touching anything but the - template. This separation can be especially useful when the template - authors (designers) and the programmers are different individuals, but - also helps managing application complexity even if the template author - and the programmer is the same person.

    While for FreeMarker (and for the template author) it's - not interesting how the data was calculated, - FreeMarker still have to know what the actual - data is. All the data that the template can use is packed into the so - called data-model. It's created by - the already mentioned routines that calculate the data. As far as the - template author is concerned, the data-model is a tree-like structure - (like folders and files on your hard disk), that in this case could be - visualized as:

    -
    -(root)
    -  |
    -  +- user = "Big Joe"
    -  |
    -  +- latestProduct
    -      |
    -      +- url = "products/greenmouse.html"
    -      |
    -      +- name = "green mouse"  
    -

    (To prevent misunderstandings: The data-model is not a text - file, the above is just a visualization of a data-model for you. It's - from Java objects, such as JavaBeans, Map-s, - List-s, etc., but let that be the problem of the - Java programmers.)

    Compare this with what you saw in the template earlier: - ${user} and - ${latestProduct.name}. As an analogy, the data - model is something like the file system of computers: the root and - latestProduct correspond to directories (folders) - and the user, url and - name correspond to files. url - and name are in the - latestProduct directory. So - latestProduct.name is like saying - name in the latestProduct - directory. But as I said, it's just an analogy; there are no files or - directories here.

    To recapitulate, a template and a data-model is needed for - FreeMarker to generate the output (like the HTML shown first):

    Template + data-model = output

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_quickstart_datamodel.html b/fmpp/docs/freemarker/dgui_quickstart_datamodel.html deleted file mode 100644 index 1a911e4..0000000 --- a/fmpp/docs/freemarker/dgui_quickstart_datamodel.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - FreeMarker Manual - The data-model at a glance - - - - - - - - -
    - - - - - -

    -The data-model at a glance

    - - -

    As you have seen, the data-model is basically a tree. This tree - can be arbitrarily complicated and deep, for example:

    -
    -(root)
    -  |
    -  +- animals
    -  |   |
    -  |   +- mouse
    -  |   |   |   
    -  |   |   +- size = "small"
    -  |   |   |   
    -  |   |   +- price = 50
    -  |   |
    -  |   +- elephant
    -  |   |   |   
    -  |   |   +- size = "large"
    -  |   |   |   
    -  |   |   +- price = 5000
    -  |   |
    -  |   +- python
    -  |       |   
    -  |       +- size = "medium"
    -  |       |   
    -  |       +- price = 4999
    -  |
    -  +- test = "It is a test"
    -  |
    -  +- whatnot
    -      |
    -      +- because = "don't know"  
    -

    The variables that act as directories (the root, - animals, mouse, - elephant, python, - whatnot) are called hashes. Hashes store other variables (the so - called subvariables) by - a lookup name (e.g., "animals", "mouse" or "price").

    The variables that store a single value - (size, price, - test and because) are called - scalars.

    When you want to - use a subvariable in a template, you specify its path from the root, - and separate the steps with dots. To access the - price of a mouse, you start from - the root and go into animals, and then go into - mouse then go into price. So you - write animals.mouse.price. When you put the special - ${...} codes around an - expression like this, you are telling FreeMarker to output the - corresponding text at that point.

    There is one more important kind of variable: sequences. They are similar to hashes, but they - don't store names for the variables they contain. Instead, they store - the subvariables sequentially, and you can access them with a - numerical index. For example, in this data-model, - animals and whatnot.fruits are - sequences:

    -
    -(root)
    -  |
    -  +- animals
    -  |   |
    -  |   +- (1st)
    -  |   |   |
    -  |   |   +- name = "mouse"
    -  |   |   |
    -  |   |   +- size = "small"
    -  |   |   |
    -  |   |   +- price = 50
    -  |   |
    -  |   +- (2nd)
    -  |   |   |
    -  |   |   +- name = "elephant"
    -  |   |   |
    -  |   |   +- size = "large"
    -  |   |   |
    -  |   |   +- price = 5000
    -  |   |
    -  |   +- (3rd)
    -  |       |
    -  |       +- name = "python"
    -  |       |
    -  |       +- size = "medium"
    -  |       |
    -  |       +- price = 4999
    -  |
    -  +- whatnot
    -      |
    -      +- fruits
    -          |
    -          +- (1st) = "orange"
    -          |
    -          +- (2nd) = "banana"  
    -

    To access a subvariable of a sequence you use a numerical index - in square brackets. Indexes start from 0 (it's a programmer tradition - to start with 0), thus the index of the first item is 0, the index of - the second item is 1, and so on. So to get the name of the first - animal you write animals[0].name. To get the second - item in whatnot.fruits (which is the string - "banana") you write - whatnot.fruits[1].

    Scalars can be further divided into these categories:

    -
      -
    • -

      String: Text, that is, an arbitrary sequence of characters - such as ''m'', ''o'', ''u'', ''s'', ''e'' above. For example the - name-s and size-s are - strings above.

      -
    • - -
    • -

      Number: It's a numerical value, like the - price-s above. The string - "50" and the number 50 are - two totally different things in FreeMarker. The former is just a - sequence of two characters (which happens to be readable as a - number for humans), while the latter is a numerical value that you - can use, say, in arithmetical calculations.

      -
    • - -
    • -

      Date-like: Either a date-time (stores a date with time of - the day), or a date (no time of day), or a time (time of day, no - date).

      -
    • - -
    • -

      Boolean: A true/false (yes/no, on/off, etc.) thing. Like - animals could have a protected subvariable, - which store if the animal is protected or not.

      -
    • -
    -

    Summary:

    -
      -
    • -

      The data-model can be visualized as a tree.

      -
    • - -
    • -

      Scalars store a single value. The value can be a string or a - number or a date-time/date/time or a boolean.

      -
    • - -
    • -

      Hashes are containers that store other variables and - associate them with a unique lookup name.

      -
    • - -
    • -

      Sequences are containers that store other variables in an - ordered sequence. The stored variables can be retrieved via their - numerical index, starting from 0.

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_quickstart_template.html b/fmpp/docs/freemarker/dgui_quickstart_template.html deleted file mode 100644 index fb88677..0000000 --- a/fmpp/docs/freemarker/dgui_quickstart_template.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - FreeMarker Manual - The template at a glance - - - - - - - - -
    - - - - - -

    -The template at a glance

    - - - - -

    The simplest template is a plain HTML file (or whatever text - file -- FreeMarker is not confined to HTML). When the client visits - that page, FreeMarker will send that HTML to the client as is. However - if you want that page to be more dynamic then you begin to put special - parts into the HTML which will be understood by FreeMarker:

    -
      -
    • -

      ${...}: - FreeMarker will replace it in the output with the actual value of - the thing inside the curly brackets. They are called interpolations. As an example see the very first example.

      -
    • - -
    • -

      FTL tags (for FreeMarker - Template Language tags): FTL tags are a bit similar to HTML tags, - but they are instructions to FreeMarker and will not be printed to - the output. The name of these tags start with - #. (User-defined FTL tags use - @ instead of #, but they are - an advanced topic.)

      -
    • - -
    • -

      Comments: Comments are - similar to HTML comments, but they are delimited by - <#-- and -->. Anything - between these delimiters and the delimiter itself will be ignored - by FreeMarker, and will not be written to the output.

      -
    • -
    -

    Anything not an FTL tag or an interpolation or comment is - considered as static text, and will not be interpreted by FreeMarker; - it is just printed to the output as is.

    With FTL tags you refer to so-called directives. This is the same kind of - relationship as between HTML tags (e.g.: - <table> and - </table>) and HTML elements (e.g., the - table element) to which you refer to with the HTML - tags. (If you don't feel this difference then just take "FTL tag" and - "directive" as synonyms.)

    - - - - -

    -Examples of directives

    - - -

    Though FreeMarker has far more directives, in this quick - overview we will only look at three of the most commonly used - ones.

    - - - - - - -

    -The if directive

    - - -

    With the if directive you can - conditionally skip a section of the template. For example, assume - that in the very first - example you want to greet your boss, Big Joe, differently - from other users:

    - -
    -
    -<html>
    -<head>
    -  <title>Welcome!</title>
    -</head>
    -<body>
    -  <h1>
    -    Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
    -  </h1>
    -  <p>Our latest product:
    -  <a href="${latestProduct.url}">${latestProduct.name}</a>!
    -</body>
    -</html>  
    - - -

    Here you have told FreeMarker that the '', our beloved - leader'' should be there only if the value of the variable - user is equal to the string "Big - Joe". In general, things between <#if - condition> and - </#if> tags are skipped if - condition is false - (the boolean value).

    - -

    Let's detail the - condition used here: - The == is an operator that tests if the values - at its left and right side are equivalent, and the results is a - boolean value, true or false accordingly. On the left side of - == I have referenced a - variable with the syntax that should be already familiar; - this will be replaced with the value of the variable. In general, - unquoted words inside directives or interpolations are treated as - references to variables. On the right side I have specified a - literal string. Literal strings in templates must - always be put inside quotation marks.

    - -

    This will print "Pythons are free today!" if their price is - 0:

    - -
    -
    -<#if animals.python.price == 0>
    -  Pythons are free today!
    -</#if>  
    - - -

    Similarly as earlier when a string was specified directly, - here a number is specified directly (0). Note - that the number is not quoted. If you quoted - it ("0"), FreeMarker were misinterpret it as a - string literal.

    - -

    This will print "Pythons are not free today!" if their price - is not 0:

    - -
    -
    -<#if animals.python.price != 0>
    -  Pythons are not free today!
    -</#if>  
    - - -

    As you may have guessed, != means not - equivalent.

    - -

    You can write things like this too (using the data-model used - to demonstrate hashes):

    - -
    -
    -<#if animals.python.price < animals.elephant.price>
    -  Pythons are cheaper than elephants today.
    -</#if>  
    - - -

    With the <#else> tag you can - specify what to do if the condition is false. For example:

    - -
    -
    -<#if animals.python.price < animals.elephant.price>
    -  Pythons are cheaper than elephants today.
    -<#else>
    -  Pythons are not cheaper than elephants today.
    -</#if>  
    - - -

    This prints ''Pythons are cheaper than elephants today.'' if - the price of python is less than the price of elephant, or else it - prints ''Pythons are not cheaper than elephants today.''

    - -

    If you have a variable with boolean value (a true/false - thing) then you can use it directly as the - condition of - if:

    - -
    -
    -<#if animals.python.protected>
    -  Warning! Pythons are protected animals!
    -</#if>  
    - - - - - - - - -

    -The list directive

    - - -

    This is useful when you want to list something. For example - if you merge this template with the data-model I used - earlier to demonstrate sequences:

    - -
    -
    -<p>We have these animals:
    -<table border=1>
    -  <tr><th>Name<th>Price
    -  <#list animals as animal>
    -  <tr><td>${animal.name}<td>${animal.price} Euros
    -  </#list>
    -</table>  
    - - -

    then the output will be:

    - -
    -
    -<p>We have these animals:
    -<table border=1>
    -  <tr><th>Name<th>Price
    -  <tr><td>mouse<td>50 Euros
    -  <tr><td>elephant<td>5000 Euros
    -  <tr><td>python<td>4999 Euros
    -</table>  
    - - -

    The generic format of the list directive - is:

    - -

    <#list sequence as - loopVariable>repeatThis</#list>

    - -

    The repeatThis - part will be repeated for each item in the sequence that you have - given with sequence, - one after the other, starting from the first item. In all - repetitions - loopVariable will - hold the value of the current item. This variable exists only - between the <#list ...> and - </#list> tags.

    - -

    As another example, we list the fruits of that example data - model:

    - -
    -
    -<p>And BTW we have these fruits:
    -<ul>
    -<#list whatnot.fruits as fruit>
    - <li>${fruit}
    -</#list>
    -<ul>  
    - - -

    The whatnot.fruits expression should be - familiar to you; it references a variable in - the data-model.

    - - - - - - - -

    -The include directive

    - - -

    With the include directive you can insert - the content of another file into the template.

    - -

    Suppose you have to show the same copyright notice on - several pages. You can create a file that contains the copyright - notice only, and insert that file everywhere where you need that - copyright notice. Say, you store this copyright notice in - copyright_footer.html:

    - -
    -
    -<hr>
    -<i>
    -Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
    -<br>
    -All Rights Reserved.
    -</i>  
    - - -

    Whenever you need that file you simply insert it with the - include directive:

    - -
    -
    -<html>
    -<head>
    -  <title>Test page</title>
    -</head>
    -<body>
    -  <h1>Test page</h1>
    -  <p>Blah blah...
    -<#include "/copyright_footer.html">
    -</body>
    -</html>  
    - - -

    and the output will be:

    - -
    -
    -<html>
    -<head>
    -  <title>Test page</title>
    -</head>
    -<body>
    -  <h1>Test page</h1>
    -  <p>Blah blah...
    -<hr>
    -<i>
    -Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
    -<br>
    -All Rights Reserved.
    -</i>
    -</body>
    -</html>  
    - - -

    If you change the copyright_footer.html, - then the visitor will see the new copyright notice on all - pages.

    - - - - - - -

    -Using directives together

    - - -

    You can use directives as many times on a page as you want, - and you can nest directives into each other similarly as you can - nest HTML elements into each other. For example this will list the - animals and print the name of large animals with bigger font:

    - -
    -
    -<p>We have these animals:
    -<table border=1>
    -  <tr><th>Name<th>Price
    -  <#list animals as animal>
    -  <tr>
    -    <td>
    -      <#if animal.size == "large"><font size="+1"></#if>
    -      ${animal.name}
    -      <#if animal.size == "large"></font></#if>
    -    <td>${animal.price} Euros
    -  </#list>
    -</table>  
    - - -

    Note that since FreeMarker does not interpret text outside FTL - tags, interpolations and comments, it doesn't see the above - font tags as badly nested ones.

    - - - - - -

    -Dealing with missing variables

    - - -

    In practice the data-model often has variables that are - optional (i.e., sometimes missing). To spot some typical human - mistakes, FreeMarker doesn't tolerate the referring to missing - variables unless you tell them explicitly what to do if the variable - is missing. Here we will show the two most typical ways of doing - that.

    - -

    Note for programmers: A - non-existent variable and a variable with null - value is the same for FreeMarker, so the "missing" term used here - covers both cases.

    - -

    Wherever you refer to a variable, you can specify a default - value for the case the variable is missing, by following the - variable name with a ! and the default value. - Like in the following example, when user is - missing from data model, the template will behave like if - user's value were the string - "Anonymous". (When user isn't - missing, this template behaves exactly like if - !"Anonymous" were not there):

    - -
    -
    -<h1>Welcome ${user!"Anonymous"}!</h1>  
    - - -

    You can ask whether a variable isn't missing by putting - ?? after its name. Combining this with the - already introduced if directive you can skip the - whole greeting if the user variable is - missing:

    - -
    -
    -<#if user??><h1>Welcome ${user}!</h1></#if>  
    - - -

    Regarding variable accessing with multiple steps, like - animals.python.price, writing - animals.python.price!0 is correct only if - animals.python is never missing and only the last - subvariable, price, is possibly missing (in which - case here we assume it's 0). If - animals or python is missing, - the template processing will stop with an "undefined variable" - error. To prevent that, you have to write - (animals.python.price)!0. In that case the - expression will be 0 even if - animals or python is missing. - Same logic goes for ??; - animals.python.price?? versus - (animals.python.price)??.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_template.html b/fmpp/docs/freemarker/dgui_template.html deleted file mode 100644 index dc7c65d..0000000 --- a/fmpp/docs/freemarker/dgui_template.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - FreeMarker Manual - The Template - - - - - - - - -
    - - - - - -

    -Chapter 3   The Template

    - -
    -

    - - Chapter Contents - -

    - - -
    - - -
    -

    Note

    - -

    It is assumed that you have already read the Getting Started and the Values, Types - chapter.

    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_template_directives.html b/fmpp/docs/freemarker/dgui_template_directives.html deleted file mode 100644 index 67bd430..0000000 --- a/fmpp/docs/freemarker/dgui_template_directives.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - FreeMarker Manual - Directives - - - - - - - - -
    - - - - - -

    -Directives

    - - -

    You use FTL tags to call directives. In the example you have called the - list directive. Syntactically you have done it with - two tags: <#list animals as animal> and - </#list>.

    There are two kind of FTL tags:

    -
      -
    • -

      Start-tag: - <#directivename - parameters>

      -
    • - -
    • -

      End-tag: - </#directivename>

      -
    • -
    -

    This is similar to HTML or XML syntax, except that the tag name - starts with #. If the directive doesn't have nested - content (content between the start-tag and the end-tag), you must use - the start-tag with no end-tag. For example you write <#if - something>...</#if>, - but just <#include - something> as FreeMarker knows - that the include directive can't have nested - content.

    The format of the - parameters depends on - the - directivename.

    In fact there are two types of directives: predefined directives and - user-defined - directives. For user-defined directives you use - @ instead of #, for example - <@mydirective - parameters>...</@mydirective>. - Further difference is that if the directive has no nested content, you - must use a tag like <@mydirective - parameters />, similarly as in - XML (e.g. <img ... - />). But user-defined directives is an advanced topic - that will be discussed later.

    FTL tags, like HTML tags, must be properly nested. So the code - below is wrong, as the if directive is both inside - and outside of the nested content of the list - directive:

    -
    -<ul>
    -<#list animals as animal>
    -  <li>${animal.name} for ${animal.price} Euros
    -  <#if user == "Big Joe">
    -     (except for you)
    -</#list> <#-- WRONG! The "if" has to be closed first. -->
    -</#if>
    -</ul>  
    -

    Note that FreeMarker doesn't care about the nesting of HTML - tags, only about the nesting of FTL tags. It just sees HTML as flat - text, it doesn't interpret it in any way.

    If you try to use a non-existing directive (e.g., you mistype - the directive name), FreeMarker will decline to use the template and - produce an error message.

    FreeMarker ignores superfluous white-space inside FTL tags. So you - can write this:

    -
    -<#list[BR]
    -  animals       as[BR]
    -     animal[BR]
    ->[BR]
    -${animal.name} for ${animal.price} Euros[BR]
    -</#list    >  
    -

    You may not, however, insert white-space between the - < or </ and the directive - name.

    The complete list and description of all directives can be found - in the Template Language Reference/Directive Reference (but I recommend that you look - at the chapter about expressions first).

    -

    Note

    - -

    FreeMarker can be configured to use [ and - ] instead of < and - > in the FTL tags and FTL comments, like - [#if user == "Big - Joe"]...[/#if]. For more - information read: Miscellaneous/Alternative (square bracket) syntax.

    -
    -
    -

    Note

    - -

    FreeMarker can be configured so that it understands predefined - directives without # (like <if user - == "Big - Joe">...</if>). - However we don't recommend the usage of this mode. For more - information read: Template Language Reference/Deprecated FTL constructs/Old FTL syntax

    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_template_exp.html b/fmpp/docs/freemarker/dgui_template_exp.html deleted file mode 100644 index b0c9e45..0000000 --- a/fmpp/docs/freemarker/dgui_template_exp.html +++ /dev/null @@ -1,2596 +0,0 @@ - - - - - - - - FreeMarker Manual - Expressions - - - - - - - - -
    - - - - - -

    -Expressions

    - - - - -

    When you supply values for interpolations or directive - parameters you can use variables or more complex expressions. For - example, if x is the number 8 and y is 5, the value of (x + - y)/2 resolves to the numerical value 6.5.

    Before we go into details, let's see some concrete - examples:

    -
      -
    • -

      When you supply value for interpolations: The usage of - interpolations is - ${expression} where - expression gives the value you want to insert into the output as - text. So ${(5 + 8)/2} prints ``6.5'' to the - output (or possibly ``6,5'' if the language of your output is not - US English).

      -
    • - -
    • -

      When you supply a value for the directive parameter: You - have already seen the if directive in the - Getting Started section. The syntax of this directive is: - <#if - expression>...</#if>. - The expression here must evaluate to a boolean value. For example - in <#if 2 < 3> the 2 < - 3 (2 is less than 3) is an expression which evaluates to - true.

      -
    • -
    - - - - - -

    -Quick overview (cheat sheet)

    - - -

    This is a reminder for those of you who already know - FreeMarker or are just experienced programmers:

    - -
    -
    - - -

    See also: Operator - precedence

    - - - - - -

    -Specify values directly

    - - - - - - -

    Often you want to specify a value directly and not as a result - of some calculations.

    - - - - - - -

    -Strings

    - - - - -

    To specify a string value directly you give the text in - quotation marks, e.g.: "some text" or in - apostrophe-quote, e.g. 'some text'. The two - forms are equivalent. If the text itself contains the character - used for the quoting (either " or - ') or backslashes, you have to precede them - with a backslash; this is called escaping. You can type any other - character, including line - breaks, in the text directly. Example:

    - -
    -
    -${"It's \"quoted\" and
    -this is a backslash: \\"}
    -
    -${'It\'s "quoted" and
    -this is a backslash: \\'}  
    - - -

    will print:

    - -
    -
    -It's "quoted" and
    -this is a backslash: \
    -
    -It's "quoted" and
    -this is a backslash: \  
    - - -
    -

    Note

    - -

    Of course, you could simply type the above text into the - template, without using - ${...}. But we do - it here just for the sake of example, to demonstrate - expressions.

    -
    - - - - - - -

    This is the list of all supported escape sequences. All - other usage of backlash in string literals is an error and any - attempt to use the template will fail.

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Escape sequenceMeaning
    \"Quotation mark (u0022)
    \'Apostrophe (a.k.a. apostrophe-quote) (u0027)
    \{Opening curly brace: {
    \\Back slash (u005C)
    \nLine feed (u000A)
    \rCarriage return (u000D)
    \tHorizontal tabulation (a.k.a. tab) (u0009)
    \bBackspace (u0008)
    \fForm feed (u000C)
    \lLess-than sign: <
    \gGreater-than sign: >
    \aAmpersand: &
    \xCodeCharacter given with its hexadecimal Unicode code (UCS code)
    -
    - - -

    The Code after - the \x is 1 to 4 hexadecimal digits. For - example this all put a copyright sign into the string: - "\xA9 1999-2001", - "\x0A9 1999-2001", - "\x00A9 1999-2001". When the character directly - after the last hexadecimal digit can be interpreted as hexadecimal - digit, you must use all 4 digits or else FreeMarker will - misunderstand you.

    - -

    Note that the character sequence ${ (and - #{) has special meaning. It's used to insert - the value of expressions (typically: the value of variables, as in - "Hello ${user}!"). This will be explained later. - If you want to print ${ or - #{, you should either use raw string literals - as explained below, or escape the { like in - "foo $\{bar}".

    - - - -

    A special kind of string literals is the raw string - literals. In raw string literals, backslash and - ${ have no special meaning, they are considered - as plain characters. To indicate that a string literal is a raw - string literal, you have to put an r directly - before the opening quotation mark or apostrophe-quote. - Example:

    - -
    -
    -${r"${foo}"}
    -${r"C:\foo\bar"}  
    - - -

    will print:

    - -
    -
    -${foo}
    -C:\foo\bar  
    - - - - - - - - -

    -Numbers

    - - - - -

    To specify a numerical value directly you type the number - without quotation marks. You have to use the dot as your decimal - separator and must not use any grouping separator symbols. You can - use - or + to indicate the - sign (+ is redundant). Scientific notation is - not yet supported (so 1E3 is wrong). Also, you - cannot omit the 0 before the decimal separator (so - .5 is wrong).

    - -

    Examples of valid number literals: 0.08, - -5.013, 8, - 008, 11, - +11

    - -

    Note that numerical literals like 08, - +8, 8.00 and - 8 are totally equivalent as they all symbolize - the number eight. Thus, ${08}, - ${+8}, ${8.00} and - ${8} will all print exactly same.

    - - - - - - - -

    -Booleans

    - - - - - - -

    To specify a boolean value you write true - or false. Don't use quotation marks.

    - - - - - - - -

    -Sequences

    - - - - - - - - - - -

    To specify a literal sequence, you list the subvariables separated by - commas, and put the whole list into square brackets. For - example:

    - -
    -
    -<#list ["winter", "spring", "summer", "autumn"] as x>
    -${x}
    -</#list>  
    - - -

    will print:

    - -
    -
    -winter
    -spring
    -summer
    -autumn
    -   
    - - -

    The items in the list are expressions, so you can do this - for example: [2 + 2, [1, 2, 3, 4], "whatnot"]. - Here the first subvariable will be the number 4, the second will - be another sequence, and the third subvariable will be the string - "whatnot".

    - - - - - - - -

    -Ranges

    - - -

    Ranges are just sequences, but they are created by - specifying what range of whole numbers they contain, instead of - specifying their items one by one. For example, - 0..<m, assuming the m - variable stores 5, will give a sequence that contains [0, - 1, 2, 3, 4]. Ranges are primarily used for iterating - over a range of numbers with <#list - ...> and for slicing - sequences and slicing - strings.

    - -

    The generic forms of range expressions are (where - start and - end can be any - expression that evaluates to a number):

    - -
    -
      -
    • -

      start..end: - Range with inclusive end. For example, 1..4 - gives [1, 2, 3, 4], and - 4..1 gives [4, 3, 2, 1]. - Beware, ranges with inclusive end never give an empty - sequence, so 0..length-1 is - WRONG, because when length is - 0 it gives [0, - -1].

      -
    • - -
    • -

      start..<end - or - start..!end: - Range with exclusive end. For example, - 1..<4 gives [1, 2, - 3], 4..<1 gives [4, - 3, 2], and 1..<1 gives - []. Note the last example; the result can - be an empty sequence. There's no difference between - ..< and ..!; the last - form is used in applications where using the - < character causes problems (for HTML - editors and such).

      -
    • - -
    • -

      start..*length: - Length limited range. For example, 10..*4 - gives [10, 11, 12, 13], - 10..*-4 gives [10, 9, 8, - 7], and 10..*0 gives - []. When these kind of ranges are used for - slicing, the slice will end without error if the end of the - sliced sequence or string is reached before the specified - range length was reached; see slicing - sequences for more.

      - -
      -

      Note

      - -

      Length limited ranges were introduced in FreeMarker - 2.3.21.

      -
      - -
    • - -
    • -

      start..: - Right-unbounded range. This are like length limited ranges - with infinite length. For example 1.. gives - [1, 2, 3, 4, 5, 6, ... ], up to infinity. - Be careful when processing (like listing) such ranges, as - processing all items of it it would take forever or until the - application runs out of memory and crashes. Just like with - length limited ranges, when these kind of ranges are used for - slicing, the slice will end when the end of the sliced - sequence or string is reached.

      - -
      -

      Warning!

      - -

      Right-unbounded ranges before FreeMarker 2.3.21 were - only used for slicing, and behaved like an empty sequence - for other purposes. To activate the new behavior, it's not - enough to use FreeMarker 2.3.21, the programmer also have to - set the incompatible_improvements - configuration setting to at least 2.3.21.

      -
      - -
    • -
    - - -

    Further notes on ranges:

    - -
    -
      -
    • -

      Range expressions themselves don't have square brackets, - for example, you write <#assign myRange = - 0..<x>, NOT <#assign myRange = - [0..<x]>. The last would create a sequence - that contains an item that's a range. The square brackets are - part of the slicing syntax, like - seq[myRange].

      -
    • - -
    • -

      You can write arithmetical expression on the sides of - the .. without parenthesis, like n - + 1 ..< m / 2 - 1.

      -
    • - -
    • -

      .., ..<, - ..! and ..* are - operators, so you can't have space inside them. Like - n .. <m is WRONG, but n ..< - m is good.

      -
    • - -
    • -

      The reported size of right-unbounded ranges is - 2147483647 (or 0 if - incompatible_improvements is less than - 2.3.21) due to a technical limitation (32 bits). However, when - listing them, their actual size is infinite.

      -
    • - -
    • -

      Ranges don't really store the numbers they consist of, - thus for example 0..1 and - 0..100000000 is equally fast to create and - takes the same amount of memory.

      -
    • -
    - - - - - - - - -

    -Hashes

    - - - - - - -

    To specify a hash in a template, you list the key/value - pairs separated by commas, and put the list into curly brackets. - The key and value within a key/value pair are separated with a - colon. Here is an example: { "name": "green mouse", - "price": 150 }. Note that both the names and the values - are expressions. The keys must be strings. The values can be if - any type.

    - - - - - - -

    -Retrieving variables

    - - - - - - - -

    -Top-level variables

    - - - - -

    To access a top-level variable, you simply use the variable - name. For example, the expression user will - evaluate to the value of variable stored with name - "user" in the root. So this will print what you store - there:

    - -
    -
    -${user}  
    - - -

    If there is no such top-level variable, then an error will - result when FreeMarker tries to evaluate the expression, and it - aborts template processing (unless programmers has configured - FreeMarker differently).

    - -

    In this expression the variable name can contain only - letters (including non-Latin letters), digits (including non-Latin - digits), underline (_), dollar ($), at sign (@) and hash (#). - Furthermore, the name must not start with a digit.

    - - - - - - - -

    -Retrieving data from a hash

    - - - - - - -

    If we already have a hash as a result of an expression, then - we can get its subvariable with a dot and the name of the - subvariable. Assume that we have this data-model:

    - -
    -
    -(root)
    - |
    - +- book
    - |   |
    - |   +- title = "Breeding green mouses"
    - |   |
    - |   +- author
    - |       |
    - |       +- name = "Julia Smith"
    - |       |
    - |       +- info = "Biologist, 1923-1985, Canada"
    - |
    - +- test = "title"  
    - - -

    Now we can read the title with - book.title, since the book expression will - return a hash (as explained in the last chapter). Applying this - logic further, we can read the name of the author with this - expression: book.author.name.

    - -

    There is an alternative syntax if we want to specify the - subvariable name with an expression: - book["title"]. In the square brackets you can - give any expression as long as it evaluates to a string. So with - this data-model you can also read the title with - book[test]. More examples; these are all - equivalent: book.author.name, - book["author"].name, - book.author.["name"], - book["author"]["name"].

    - -

    When you use the dot syntax, the same restrictions apply - regarding the variable name as with top-level variables (name can - contain only letters, digits, _, $, @, etc.). There are no such - restrictions when you use the square bracket syntax, since the - name is the result of an arbitrary expression. (Note, that to help - the FreeMarker XML support, if the subvariable name is - * (asterisk) or **, then you - do not have to use square bracket syntax.)

    - -

    As with the top-level variables, trying to access a - non-existent subvariable causes an error and aborts the processing - of the template (unless programmers has configured FreeMarker - differently).

    - - - - - - - -

    -Retrieving data from a sequence

    - - - - - - -

    This is the same as for hashes, but you can use the square - bracket syntax only, and the expression in the brackets must - evaluate to a number, not a string. For example to get the name of - the first animal of the example data-model (remember - that the number of the first item is 0, not 1): - animals[0].name

    - - - - - - - -

    -Special variables

    - - - - -

    Special variables are variables defined by the FreeMarker - engine itself. To access them, you use the - .variable_name - syntax.

    - -

    Normally you don't need to use special variables. They are - for expert users. The complete list of special variables can be - found in the reference.

    - - - - - - -

    -String operations

    - - - - - - - - - -

    -Interpolation (or concatenation)

    - - - - - - - - - - - - - - -

    If you want to insert the value of an expression into a - string, you can use - ${...} (and the - deprecated #{...}) - in string literals. - ${...} in string - literals behaves as - in text sections (so it - goes through the same locale sensitive number - and date/time formatting), except that it never go through automatic escaping.

    - -

    Example (assume that user is ``Big Joe''):

    - -
    -
    -<#assign s = "Hello ${user}!">
    -${s} <#-- Just to see what the value of s is -->  
    - - -

    This will print:

    - -
    -
    -Hello Big Joe!  
    - - -
    -

    Warning!

    - -

    A frequent mistake of users is the usage of interpolations - in places where they needn't/shouldn't/can't be used. - Interpolations work only in text sections (e.g. - <h1>Hello ${name}!</h1>) and in - string literals (e.g. <#include - "/footer/${company}.html">). A typical - WRONG usage is <#if - ${big}>...</#if>, which will cause a - syntactical error. You should simply write <#if - big>...</#if>. Also, <#if - "${big}">...</#if> is - WRONG, since it converts the parameter - value to string and the if directive wants a - boolean value, so it will cause a runtime error.

    -
    - - -

    Alternatively, you can use the + operator - to achieve similar result:

    - -
    -
    -<#assign s = "Hello " + user + "!">  
    - - -

    This gives the same result as the example with the - ${...}.

    - -
    -

    Warning!

    - -

    Because + follows the same rules as - ${...}, the - appended string is influenced by the locale, - number_format, - date_format, time_format, - datetime_format and - boolean_format, etc. settings, and thus the - result targets humans and isn't in generally machine parsable. - This mostly leads to problems with numbers, as many locales use - grouping (thousands separators) by default, and so - "someUrl?id=" + id becomes to something like - "someUrl?id=1 234". To prevent this, use the - ?c (for Computer audience) built-in, like in - "someUrl?id=" + id?c or - "someUrl?id=${id?c}", which will evaluate to - something like "someUrl?id=1234", regardless - of locale and format settings.

    -
    - - - - - - - - -

    -Getting a character

    - - - - - - -

    You can get a single character of a string at a given index - similarly as you can read the subvariable of a - sequence, e.g. user[0]. The result will - be a string whose length is 1; FTL doesn't have a separate - character type. As with sequence subvariables, the index must be a - number that is at least 0 and less than the length of the string, - or else an error will abort the template processing.

    - -

    Since the sequence subvariable syntax and the character - getter syntax clashes, you can use the character getter syntax - only if the variable is not a sequence as well (which is possible - because FTL supports multi-typed values), since in that case the - sequence behavior prevails. (To work this around, you can use - the - string built-in, e.g. - user?string[0]. Don't worry if you don't - understand this yet; built-ins will be discussed later.)

    - -

    Example (assume that user is "Big Joe"):

    - -
    -
    -${user[0]}
    -${user[4]}  
    - - -

    will print (note that the index of the first character is - 0):

    - -
    -
    -B
    -J  
    - - - - - - - - -

    -String slicing (substrings)

    - - - - - - - - - - -

    You can a slice a string in the same way as you slice a - sequence (see there), only here instead of sequence items - you work with characters.

    - -
    -
      -
    • -

      Decreasing ranges aren't allowed for string slicing. - (That's because unlike sequences, you seldom if ever want to - show a string reversed, so if that happens, that's almost - always the result of an oversight.)

      -
    • - -
    • -

      If a value is both a string and a sequence (a - multi-typed value), then slicing will slice the sequence - instead of the string. When you are processing XML, such - values are common. In such cases you can use - someXMLnode?string[range].

      -
    • - -
    • -

      There's a legacy bug where a range with - inclusive end that's one less than the - starting index and is non-negative (like in - "abc"[1..0]) will give an empty string - instead of an error. (It should be an error as it's a - decreasing range.) Currently this bug is emulated for backward - compatibility, but you shouldn't utilize it, as in the future - it will be certainly an error.

      -
    • -
    - - -

    Example:

    - -
    -
    -<#assign s = "ABCDEF">
    -${s[2..3]}
    -${s[2..<4]}
    -${s[2..*3]}
    -${s[2..*100]}
    -${s[2..]}  
    - - -

    will print:

    - -
    -
    -CD
    -CD
    -CDE
    -CDEF
    -CDEF  
    - - -
    -

    Note

    - -

    Some of the typical use-cases of string slicing is covered - by convenient built-ins: remove_beginning, - remove_ending, - keep_before, - keep_after

    -
    - - - - - - - -

    -Sequence operations

    - - - - - - - - - -

    -Concatenation

    - - - - - - - - - - -

    You can concatenate sequences in the same way as strings, - with +. Example:

    - -
    -
    -<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
    -- ${user}
    -</#list>  
    - - -

    will print:

    - -
    -
    -- Joe
    -- Fred
    -- Julia
    -- Kate
    -   
    - - -

    Note that sequence concatenation is not to be used for many - repeated concatenations, like for appending items to a sequence - inside a loop. It's just for things like <#list users - + admins as person>. Although concatenating sequences - is fast and its speed is independently of the size of the - concatenated sequences, the resulting sequence will be always a - little bit slower to read than the original two sequences were. - This way the result of many repeated concatenations is a sequence - that is slow to read.

    - - - - - - - -

    -Sequence slicing

    - - - - - - - - -

    With - seq[range], - were range is a - range value as - described here, you can take a slice of the sequence. The - resulting sequence will contain the items from the original - sequence (seq) whose - indexes are in the range. For example:

    - -
    -
    -<#assert seq = ["A", "B", "C", "D", "E"]>
    -<#list seq[1..3] as i>${i}</#list>  
    - - -

    will print

    - -
    -
    -BCD   
    - - -

    Furthermore, the items in the slice will be in the same - order as in the range. Thus for example the above example with the - 3..1 range would print - DCB.

    - -

    The numbers in the range must be valid indexes in the - sequence, or else the processing of the template will be aborted - with error. Like in the last example, - seq[-1..0] would be an error as - seq[-1] is invalid, also - seq[1..5] would be because - seq[5] is invalid. (Note that - seq[100..<100] or - seq[100..*0] would be valid despite that 100 is - out of bounds, because those ranges are empty.)

    - -

    Length limited ranges - (start..*length) - and right-unbounded ranges - (start..) adapt to - the length of the sliced sequence. They will slice out at most as - many items as there is available:

    - -
    -
    -<#assign seq = ["A", "B", "C"]>
    -
    -Slicing with length limited ranges:
    -- <#list seq[0..*2] as i>${i}</#list>
    -- <#list seq[1..*2] as i>${i}</#list>
    -- <#list seq[2..*2] as i>${i}</#list> <#-- Not an error -->
    -- <#list seq[3..*2] as i>${i}</#list> <#-- Not an error -->
    -
    -Slicing with right-unlimited ranges:
    -- <#list seq[0..] as i>${i}</#list>
    -- <#list seq[1..] as i>${i}</#list>
    -- <#list seq[2..] as i>${i}</#list>
    -- <#list seq[3..] as i>${i}</#list>  
    - - -

    This will print:

    - -
    -
    -Slicing with length limited ranges:
    -- AB
    -- BC
    -- C
    --
    -
    -Slicing with right-unlimited ranges:
    -- ABC
    -- BC
    -- C
    --  
    - - -

    Note above that slicing with length limited and right - unbounded ranges allow the starting index to be past the last item - by one (but no more).

    - -
    -

    Note

    - -

    To split a sequence to slices of a given size, you should - use the chunk - built-in.

    -
    - - - - - - - -

    -Hash operations

    - - - - - - - - - -

    -Concatenation

    - - - - - - - - - - -

    You can concatenate hashes in the same way as strings, with - +. If both hashes contain the same key, the - hash on the right-hand side of the + takes - precedence. Example:

    - -
    -
    -<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
    -- Joe is ${ages.Joe}
    -- Fred is ${ages.Fred}
    -- Julia is ${ages.Julia}  
    - - -

    will print:

    - -
    -
    -- Joe is 30
    -- Fred is 25
    -- Julia is 18  
    - - -

    Note that hash concatenation is not to be used for many - repeated concatenations, like for adding items to a hash inside a - loop. It's the same as with the sequence - concatenation.

    - - - - - - -

    -Arithmetical calculations

    - - - - - - - - - - - - - - -

    This is the basic 4-function calculator arithmetic plus the - modulus operator. So the operators are:

    - -
    -
      -
    • - Addition: + -
    • - -
    • - Subtraction: - -
    • - -
    • - Multiplication: * -
    • - -
    • - Division: / -
    • - -
    • - Modulus (remainder): % -
    • -
    - - - - -

    Example:

    - -
    -
    -${100 - x * x}
    -${x / 2}
    -${12 % 10}  
    - - -

    Assuming that x is 5, it will print:

    - -
    -
    -75
    -2.5
    -2  
    - - -

    Both operands must be expressions which evaluate to a - numerical value. So the example below will cause an error when - FreeMarker tries to evaluate it, since "5" is a - string and not the number 5:

    - -
    -
    -${3 * "5"} <#-- WRONG! -->  
    - - -

    There is an exception to the above rule. The - + operator, is used to concatenate - strings as well. If on one side of + is a - string and on the other side of + is a numerical - value, then it will convert the numerical value to string (using the - format appropriate for language of the page) and then use the - + as string concatenation operator. - Example:

    - -
    -
    -${3 + "5"}  
    - - -

    will output this:

    - -
    -
    -35  
    - - -

    Generally, FreeMarker never converts a string to a number - automatically, but it may convert a number to a string - automatically.

    - -

    People often want only the integer part of the result - of a division (or of other calculations). This is possible with the - int built-in. (Built-ins are explained later):

    - -
    -
    -${(x/2)?int}
    -${1.1?int}
    -${1.999?int}
    -${-1.1?int}
    -${-1.999?int}  
    - - -

    Assuming that x is 5, it will print:

    - -
    -
    -2
    -1
    -1
    --1
    --1  
    - - - - - - -

    -Comparison

    - - - - -

    Sometimes you want to know if two values are equal or not, or - which value is the greater.

    - -

    To show concrete examples I will use the if - directive here. The usage of if directive is: - <#if - expression>...</#if>, - where expression must evaluate to a boolean value or else an error - will abort the processing of the template. If the value of - expression is true then the things between the - begin and end-tag will be processed, otherwise they will be - skipped.

    - -

    To test two values for equality you use = - (or == as in Java or C; the two are absolutely - equivalent.) To test two values for inequality you use - !=. For example, assume that - user is ``Big Joe'':

    - -
    -
    -<#if user = "Big Joe">
    -  It is Big Joe
    -</#if>
    -<#if user != "Big Joe">
    -  It is not Big Joe
    -</#if>  
    - - -

    The user = "Big Joe" expression in the - <#if ...> will evaluate to the boolean - true, so the above will say ``It is Big - Joe''.

    - -

    The expressions on both sides of the = or - != must evaluate to a scalar. Furthermore, the - two scalars must have the same type (i.e. strings can only be - compared to strings and numbers can only be compared to numbers, - etc.) or else an error will abort template processing. For example - <#if 1 = "1"> will cause an error. Note - that FreeMarker does exact comparison, so string comparisons are - case and white-space sensitive: "x" and - "x " and "X" are not equal - values.

    - -

    For numerical and date, time and date-time values you can also - use <, <=, - >= and >. You can't use - them for strings! Example:

    - -
    -
    -<#if x <= 12>
    -  x is less or equivalent with 12
    -</#if>  
    - - -

    There's a problem with >= and - >. FreeMarker interprets the - > character as the closing character of the - FTL tag. To prevent this, you can use lt instead - of <, lte instead of - <=, gt instead of - > and gte instead of - >=, like in <#if x gt - y>. Another trick it to put the expression into parentheses like in - <#if (x > y)>, although it's considered - to be less elegant.

    - -
    -

    Note

    - -

    FreeMarker supports some other alternatives too, but these - are deprecated:

    - -
    -
      -
    • -

      Writing &gt; and - &lt; on the place of the problematic - relation marks, like in: <#if x &gt; - y> or <#if x &gt;= - y> . Note that in general FTL does not support - entity references (the - &...; - things) in FTL tags; it's just an exception with the - arithmetical comparisons.

      -
    • - -
    • -

      \lt, \lte, - \gt and \gte which are - the same as the ones without the backslash

      -
    • -
    - -
    - - - - - - -

    -Logical operations

    - - - - - - - - - - - - -

    Just the usual logical operators:

    - -
    -
      -
    • - Logical or: || -
    • - -
    • - Logical and: && -
    • - -
    • - Logical not: ! -
    • -
    - - -

    The operators will work with boolean values only. Otherwise an - error will abort the template processing.

    - -

    Example:

    - -
    -
    -<#if x < 12 && color = "green">
    -  We have less than 12 things, and they are green.
    -</#if>
    -<#if !hot> <#-- here hot must be a boolean -->
    -  It's not hot.
    -</#if>  
    - - - - - - -

    -Built-ins

    - - - - -

    Built-ins provide, as the name suggest, certain built-in - functionality that is always available. Typically, a built-in - provides a different version of a variable, or some information - about the variable in question. The syntax for accessing a built-in - is like that of accessing a subvariable in a hash, except that you - use the question mark instead of a dot. For example, to get the - upper case version of a string: - user?upper_case.

    - -

    You can find the complete list of - built-ins in the Reference. For now, just a few of the more - important ones:

    - -
    -
      -
    • -

      Built-ins to use with strings:

      - -
      -
        -
      • -

        html: The string with all special - HTML characters replaced with entity references (E.g. - < with - &lt;).

        -
      • - -
      • -

        cap_first: The string with the - first letter converted to upper case

        -
      • - -
      • -

        lower_case: The lowercase version - of the string

        -
      • - -
      • -

        upper_case: The uppercase version - of the string

        -
      • - -
      • -

        trim: The string without leading - and trailing white-spaces

        -
      • -
      - -
    • - -
    • -

      Built-ins to use with sequences:

      - -
      -
        -
      • -

        size: The number of elements in the - sequence

        -
      • -
      - -
    • - -
    • -

      Built-ins to use with numbers:

      - -
      -
        -
      • -

        int: The integer part of a number - (e.g. -1.9?int is - -1)

        -
      • -
      - -
    • -
    - - -

    Example:

    - -
    -
    -${test?html}
    -${test?upper_case?html}  
    - - -

    Assuming that test stores the string ``Tom - & Jerry'', the output will be:

    - -
    -
    -Tom &amp; Jerry
    -TOM &amp; JERRY  
    - - -

    Note the test?upper_case?html. Since the - result of test?upper_case is a string, you can - use the html built-in with it.

    - -

    Another example:

    - -
    -
    -${seasons?size}
    -${seasons[1]?cap_first} <#-- left side can by any expression -->
    -${"horse"?cap_first}  
    - - -

    Assuming that seasons stores the sequence - "winter", "spring", - "summer", "autumn", the output - will be:

    - -
    -
    -4
    -Spring
    -Horse  
    - - - - - - -

    -Method call

    - - - - - - -

    If you have a method then you can use the method call - operation on it. The method call operation is a comma-separated list - of expressions in parentheses. These values are called parameters. - The method call operation passes these values to the method which - will in turn return a result. This result will be the value of the - whole method call expression.

    - -

    For example, assume the programmers have made available a - method variable called repeat. You give a string - as the first parameter, and a number as the second parameter, and it - returns a string which repeats the first parameter the number of - times specified by the second parameter.

    - -
    -
    -${repeat("What", 3)}  
    - - -

    will print:

    - -
    -
    -WhatWhatWhat  
    - - -

    Here repeat was evaluated to the method - variable (according to how you access top-level - variables) and then ("What", 3) invoked - that method.

    - -

    I would like to emphasize that method calls are just plain - expressions, like everything else. So this:

    - -
    -
    -${repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case}  
    - - -

    will print this:

    - -
    -
    -xxxxxxWHATWHATWHATWHAT  
    - - - - - - -

    -Handling missing values

    - - -
    -

    Note

    - -

    These operators exist since FreeMarker 2.3.7 (replacing the - default, exists and - if_exists built-ins).

    -
    - - - - - - - - - - - - -

    As we explained earlier, an error will occur and abort the - template processing if you try to access a missing variable. However - two special operators can suppress this error, and handle the - problematic situation. The handled variable can be top-level - variable, hash subvariable, or sequence subvariable as well. - Furthermore these operators handle the situation when a method call - doesn't return a value (from the - viewpoint of Java programmers: it returns null or - it's return type is void), so it's more - correct to say that these operators handle missing values in - general, rather than just missing variables.

    - -

    For those who know what's Java - null, FreeMarker 2.3.x - treats them as missing values. Simply, the template language doesn't - know the concept of null. For example, if you - have a bean that has a maidenName property, and - the value of that property is null, then that's - the same as if there were no such property at all, as far as the - template is concerned (assuming you didn't configured FreeMarker to - use some extreme object wrapper, that is). The result of a method - call that returns null is also treated as a - missing variable (again, assuming that you use some usual object - wrapper). See more in the - FAQ.

    - -
    -

    Note

    - -

    If you wonder why is FreeMarker so picky about missing - variables, read this - FAQ entry.

    -
    - - - - - - - -

    -Default value operator

    - - - - -

    Synopsis: - unsafe_expr!default_expr - or unsafe_expr! or - (unsafe_expr)!default_expr - or - (unsafe_expr)!

    - -

    This operator allows you to specify a default value for the - case when the value is missing.

    - -

    Example. Assume no variable called mouse - is present:

    - -
    -
    -${mouse!"No mouse."}
    -<#assign mouse="Jerry">
    -${mouse!"No mouse."}  
    - - -

    The output will be:

    - -
    -
    -No mouse.
    -Jerry  
    - - -

    The default value can be any kind of expression, so it - doesn't have to be a string. For example you can write - hits!0 or colors!["red", "green", - "blue"]. There is no restriction regarding the - complexity of the expression that specifies the default value, for - example you can write: cargo.weight!(item.weight * - itemCount + 10).

    - -
    -

    Warning!

    - -

    If you have a composite expression after the - !, like 1 + x, - always use parenthesses, like - ${x!(1 + y)} or ${(x!1) + - y)}, depending on which interpretation you meant. - That's needed because due to a programming mistake in FreeMarker - 2.3.x, the precedence of ! (when it's used as - default value operator) is very low at its right side. This - means that, for example, ${x!1 + y} is - misinterpreted by FreeMarker as ${x!(1 + y)} - while it should mean ${(x!1) + y}. This - programming error will be fixed in FreeMarker 2.4, so you should - not utilize this wrong behavior, or else your templates will - break with FreeMarker 2.4!

    -
    - - -

    If the default value is omitted, then it will be empty - string and empty sequence and empty hash at the same time. (This - is possible because FreeMarker allows multi-type values.) Note the - consequence that you can't omit the default value if you want it - to be 0 or false. - Example:

    - -
    -
    -(${mouse!})
    -<#assign mouse = "Jerry">
    -(${mouse!})  
    - - -

    The output will be:

    - -
    -
    -()
    -(Jerry)  
    - - -
    -

    Warning!

    - -

    Due to syntactical ambiguities <@something - a=x! b=y /> will be interpreted as - <@something a=x!(b=y) />, that is, the - b=y will be interpreted as a comparison that - gives the default value for x, rather than - the specification of the b parameter. To - prevent this, write: <@something a=(x!) b=y - />

    -
    - - -

    You can use this operator in two ways with non-top-level - variables:

    - -
    -
    -product.color!"red"  
    - - -

    This will handle if color is missing - inside product (and returns - "red" if so), but will not handle if - product is missing. That is, the - product variable itself must exist, otherwise - the template processing will die with error.

    - -
    -
    -(product.color)!"red"  
    - - -

    This will handle if product.color is - missing. That is, if product is missing, or - product exists but it does not contain - color, the result will be - "red", and no error will occur. The important - difference between this and the previous example is that when - surrounded with parentheses, it is allowed for any component of - the expression to be undefined, while without parentheses only the - last component of the expression is allowed to be - undefined.

    - -

    Of course, the default value operator can be used with - sequence subvariables as well:

    - -
    -
    -<#assign seq = ['a', 'b']>
    -${seq[0]!'-'}
    -${seq[1]!'-'}
    -${seq[2]!'-'}
    -${seq[3]!'-'}  
    - - -

    the outpur will be:

    - -
    -
    -a
    -b
    --
    --  
    - - -

    A negative sequence index (as - seq[-1]!'-') will always cause an error, you - can't suppress that with this or any other operator.

    - - - - - - - -

    -Missing value test operator

    - - - - - - - - - - - - - - -

    Synopsis: - unsafe_expr?? or - (unsafe_expr)??

    - -

    This operator tells if a value is missing or not. Depending - on that, the result is either true or - false.

    - -

    Example. Assume no variable called mouse - is present:

    - -
    -
    -<#if mouse??>
    -  Mouse found
    -<#else>
    -  No mouse found
    -</#if>
    -Creating mouse...
    -<#assign mouse = "Jerry">
    -<#if mouse??>
    -  Mouse found
    -<#else>
    -  No mouse found
    -</#if>  
    - - -

    The output will be:

    - -
    -
    -  No mouse found
    -Creating mouse...
    -  Mouse found  
    - - -

    With non-top-level variables the rules are the same as with - the default value operator, that is, you can write - product.color?? and - (product.color)??.

    - - - - - - -

    -Parentheses

    - - - - -

    Parentheses can be used to group any expressions. Some - examples:

    - -
    -
    -                                   <#-- Output will be: -->
    -${3 * 2 + 2}                       <#-- 8 -->
    -${3 * (2 + 2)}                     <#-- 12 -->
    -${3 * ((2 + 2) * (1 / 2))}         <#-- 6 -->
    -${"green " + "mouse"?upper_case}   <#-- green MOUSE -->
    -${("green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
    -<#if !( color = "red" || color = "green")>
    -  The color is nor red nor green
    -</#if>  
    - - -

    Note that the parentheses of a method call - expressions have nothing to do with the parentheses used for - grouping.

    - - - - - -

    -White-space in expressions

    - - -

    FTL ignores superfluous white-space in expressions. So - these are totally equivalent:

    - -
    -
    -${x + ":" + book.title?upper_case}  
    - - -

    and

    - -
    -
    -${x+":"+book.title?upper_case}  
    - - -

    and

    - -
    -
    -${
    -   x
    - + ":"   +  book   .   title
    -   ?   upper_case
    -      }  
    - - - - - - -

    -Operator precedence

    - - - - - - -

    The following table shows the precedence assigned to the - operators. The operators in this table are listed in precedence - order: the higher in the table an operator appears, the higher its - precedence. Operators with higher precedence are evaluated before - operators with a relatively lower precedence. Operators on the same - line have equal precedence. When binary operators (operators with - two ``parameters'', as + and - -) of equal precedence appear next to each other, - they are evaluated in left-to-right order.

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Operator groupOperators
    highest precedence operators[subvarName] - [subStringRange] . ? - (methodParams) - expr! - expr??
    unary prefix operators+expr - -expr !expr
    multiplicative operators* / %
    additive operators+ -
    numerical ranges.. ..< - ..! ..*
    relational operators< > <= >= (and equivalents: - gt, lt, etc.)
    equality operators== != (and equivalents: - =)
    logical "and" operator&&
    logical "or" operator||
    -
    - - -

    For those of you who know C, Java language or JavaScript, note - that the precedence rules are the same as in those languages, except - that FTL has some operators that do not exist in those - languages.

    - -

    The default value operator - (exp!exp) - is not yet in the table because of a programming mistake, which will - be only fixed in FreeMarker 2.4 due to backward compatibility - constraints. It meant to be a "highest precedence operator", but in - FreeMarker 2.3.x the precedence on its right side is very low by - accident. So if you have a composite expression on the right side, - always use paranthesses, etiher like x!(y + 1) or - like (x!y) + 1. Never write just x!y + - 1.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_template_overallstructure.html b/fmpp/docs/freemarker/dgui_template_overallstructure.html deleted file mode 100644 index 2c386f5..0000000 --- a/fmpp/docs/freemarker/dgui_template_overallstructure.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - FreeMarker Manual - Overall structure - - - - - - - - -
    - - - - - -

    -Overall structure

    - - -

    Templates are in fact programs you write in a language called - FTL (for FreeMarker - Template Language). This is a quite simple programming language - designed for writing templates and nothing else.

    A template (= FTL program) is a mix of the following - sections:

    -
      -
    • -

      Text: Text that will be printed to the output as - is.

      -
    • - -
    • -

      Interpolation: These sections will be replaced with a calculated - value in the output. Interpolations are delimited by - ${ and } (or with - #{ and }, but that shouldn't - be used anymore; see more - here).

      -
    • - -
    • -

      FTL tags: FTL tags are a bit similar to HTML tags, but they - are instructions to FreeMarker and will not be printed to the - output.

      -
    • - -
    • -

      Comments: Comments are similar to HTML comments, but they - are delimited by <#-- and - -->. Comments will be ignored by FreeMarker, - and will not be written to the output.

      -
    • -
    -

    Let's see a concrete template. I have marked the template's - components with colors: text, - interpolation, FTL tag, comment. With the [BR]-s I intend to visualize the - line breaks.

    -
    -<html>[BR]
    -<head>[BR]
    -  <title>Welcome!</title>[BR]
    -</head>[BR]
    -<body>[BR]
    -  <#-- Greet the user with his/her name -->[BR]
    -  <h1>Welcome ${user}!</h1>[BR]
    -  <p>We have these animals:[BR]
    -  <ul>[BR]
    -  <#list animals as animal>[BR]
    -    <li>${animal.name} for ${animal.price} Euros[BR]
    -  </#list>[BR]
    -  </ul>[BR]
    -</body>[BR]
    -</html>  
    -

    FTL distinguishes upper case and lower case letters. So - list is good directive name, while - List is not. Similarly ${name} - is not the same as ${Name} or - ${NAME}

    It is important to realize that interpolations can be used in - text (and in string literal - expressions; see later) - only.

    An FTL tag can't be inside - another FTL tag nor inside an - interpolation. For example - this is WRONG: <#if <#include - 'foo'>='bar'>...</#if>

    Comments can be placed - inside FTL tags and interpolations. For - example:

    -
    -<h1>Welcome ${user <#-- The name of user -->}!</h1>[BR]
    -<p>We have these animals:[BR]
    -<ul>[BR]
    -<#list <#-- some comment... --> animals as <#-- again... --> animal>[BR]
    -...  
    -
    -

    Note

    - -

    For those of you who have tried the above examples: You may - notice that some of spaces, tabs and line breaks are missing from - the template output, even though we said that text is printed as is. Don't bother with - it now. This is because the feature called ''white-space stripping'' - is turned on, and that automatically removes some superfluous - spaces, tabs and line breaks. This will be explained later.

    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/dgui_template_valueinsertion.html b/fmpp/docs/freemarker/dgui_template_valueinsertion.html deleted file mode 100644 index 4dd914f..0000000 --- a/fmpp/docs/freemarker/dgui_template_valueinsertion.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - FreeMarker Manual - Interpolations - - - - - - - - -
    - - - - - -

    -Interpolations

    - - -

    The format of interpolations is - ${expression}, where - expression can be all - kind of expression (e.g. ${100 + x}).

    The interpolation is used to insert the value of the - expression converted to - text (to string). Interpolations can be used only on two places: in - text sections (e.g., - <h1>Hello ${name}!</h1>) and in string literal - expressions (e.g., <#include - "/footer/${company}.html">).

    -

    Warning!

    - -

    A frequent mistake of users is the usage of interpolations in - places where they needn't/shouldn't/can't be used. Interpolations - work only in text sections (e.g. - <h1>Hello ${name}!</h1>) and in string literals - (e.g. <#include - "/footer/${company}.html">). A typical - WRONG usage is <#if - ${big}>...</#if>, which will give syntactical - error. You should simply write <#if - big>...</#if>. Also, <#if - "${big}">...</#if> is WRONG, - since it converts the parameter value to string and the - if directive wants a boolean value, so it will - cause a runtime error.

    -
    -

    The result of the expression must be a string, number or - date/time/date-time value. This is because only numbers and - date/time/date-time values are converted to string by interpolation - automatically, values of other types (such as booleans, sequences) - must be converted to string "manually" somehow (see some advices - later), or an error will stop the template processing.

    - - - - -

    -Guide for inserting strings; don't forget escaping!

    - - -

    If the interpolation is in a text section (i.e., not in a string literal - expression), the string that it will insert will be - automatically escaped if an escape - directive is in effect. If you are generating HTML it's - strongly recommended to utilize this to prevent cross-site-scripting - attacks and not-well-formed HTML pages. Here's a quick - example:

    - -
    -
    -<#escape x as x?html>
    -  ...
    -  <p>Title: ${book.title}</p>
    -  <p>Description: <#noescape>${book.description}</#noescape></p>
    -  <h2>Comments:</h2>
    -  <#list comments as comment>
    -    <div class="comment">
    -      ${comment}
    -    </div>
    -  </#list>
    -  ...
    -</#escape>  
    - - -

    This example shows that when generating HTML you better put - the whole template inside the escape directive. - Thus, if the book.title contains - &, it will be replaced with - &amp; in the output so the page remains - well-formed HTML. If a user comment contains tags like - <iframe> (or any other element), they will - become to &lt;iframe&gt; and like, - rendering them harmless. But sometimes you really have HTML in the - data-model, like let's assume book.description - above is stored as HTML in the database, in which case you have to - neutralize the enclosing escape with a - noescape. Without the enclosing - escape, the template would look like:

    - -
    -
    -  ...
    -  <p>Title: ${book.title?html}</p>
    -  <p>Description: ${book.description}</p>
    -  <h2>Comments:</h2>
    -  <#list comments as comment>
    -    <div class="comment">
    -      ${comment?html}
    -    </div>
    -  </#list>
    -  ...  
    - - -

    This does the same as the earlier example, but here you may - forget some ?html-s, which is a security risk. In - the earlier example you may forget some - noescape-s, which gives bad output too, but it's - at least no a security risk.

    - - - - - -

    -Guide for inserting numerical values

    - - -

    If the expression evaluates to a number then the numerical - value will be converted to string according the default number - format. This may includes the maximum number of decimals, grouping, - and like. Usually the programmer should set the default number - format; the template author don't have to deal with it (but he can - with the number_format setting; see in the documentation of - setting directive). Also, you can override - the default number format for a single interpolation with the string - built-in.

    - -

    The decimal separator used (and other such symbols, like the - group separator) depends on the current locale (language, country), - that also should be set by the programmer. For example, this - template:

    - -
    -
    -${1.5}  
    - - -

    will print something like this if the current locale is - English:

    - -
    -
    -1.5  
    - - -

    but if the current locale is German then it will print - something like:

    - -
    -
    -1,5  
    - - -

    since German people use comma as decimal separator.

    - -
    -

    Warning!

    - -

    As you can see, interpolations print for human audience (by - default at least), as opposed to ''computer audience''. In some - cases this is not good, like when you print a database record ID - as the part of an URL or as an invisible field value in a HTML - form, or when you print CSS/JavaScript numerical literals, because - these printed values will be read by computer programs and not by - humans. Most computer programs are very particular about the - format of the numbers, and understand only a kind of simple US - number formatting. For that, use the c (stands for - ''computer audience'') built-in, for example:

    - -
    -
    -<a href="/shop/productdetails?id=${product.id?c}">Details...</a>  
    - -
    - - - - - - -

    -Guide for inserting date/time/date-time values

    - - -

    If the expression evaluates to a date-like value then that - will be transformed to a text according to a default format. Usually - the programmer should set the default format; you don't have to deal - with it (but if you care, see the - date_format, time_format and - datetime_format settings in the - documentation of the setting - directive). Also, you can override the default formatting for - a single interpolation with the string - built-in.

    - -
    -

    Warning!

    - -

    To display a date-like value as text, FreeMarker must know - which parts of it are in use, that is, if only the date part - (year, month, day), or only the time part (hour, minute, second, - millisecond), or both. Unfortunately, because of the technical - limitations of Java platform, for some variables it is not - possible to detect this automatically; ask the programmer if the - data-model contains such problematic variables. When it's not - possible to find out which parts of the date are in use, then you - must help FreeMarker with the date, - time and datetime - built-ins (like ${lastUpdated?datetime}), or it - will stop with error.

    -
    - - - - - - -

    -Guide for inserting boolean values

    - - -

    By default an attempt to print boolean values with - interpolation causes an error and aborts template processing. For - example this will cause an error: ${a == 2} and - will not print ''true'' or something like that. That's because - there's no universally useful way of representing booleans - (sometimes you want to print yes/no, sometimes enabled/disabled, - on/off, etc.).

    - -

    However, you can convert booleans to strings with the ?string - built-in. For example, to print the value of the "married" - variable (assuming it's a boolean), you could write - ${married?string("yes", "no")}.

    - -

    FreeMarker can be configured with a default boolean format - with the boolean_format setting, then - ${married} and such will work. However, in most - applications it's not recommended, as boolean should be rendered - differently on different places, and leaving the formatting on the - default is possibly just an oversight and thus should generate - error.

    - -

    When you want to generate JavaScript or other computer - language parts, then ${someBoolean?c} - ("c" stands for computer audience) should be used to - print true/false. (Remember that ?c was also used - to print numbers for computer audience.)

    - - - - - -

    -The exact conversion rules

    - - -

    For those who are interested, the exact rules of conversion - from the expression value to string (which is then still subject to - escaping) are these, in this order:

    - -
      -
    1. -

      If the value is a number, then it is converted to string - in the format specified with the - number_format setting. So this usually - formats for human audience, as opposed to computer - audience.

      -
    2. - -
    3. -

      Else if the value is date, time or date-time, then it is - converted to string in the format specified with the - date_format, time_format - or datetime_format setting, respectively. If - it can't be detected what kind of date-like value it is (date vs - time vs date-time), an error will occur.

      -
    4. - -
    5. -

      Else if the value is a string, then there is no - conversion.

      -
    6. - -
    7. -

      Else if the engine is in classic compatibility - mode:

      - -
        -
      1. -

        If the value is a boolean, true values are converted - to "true", false values are converted to an empty - string.

        -
      2. - -
      3. -

        If the expression is undefined - (null or a variable is undefined), it is - converted to an empty string.

        -
      4. - -
      5. -

        Else an error will abort the template - processing.

        -
      6. -
      -
    8. - -
    9. -

      Else an error will abort the template processing.

      -
    10. -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/docgen-resources/docgen.css b/fmpp/docs/freemarker/docgen-resources/docgen.css deleted file mode 100644 index 5daaeaa..0000000 --- a/fmpp/docs/freemarker/docgen-resources/docgen.css +++ /dev/null @@ -1,147 +0,0 @@ -body { - background-color: #FFFFFF; color: #000000; - font-family: Arial, sans-serif; - padding: 0.5em; margin: 0 -} - -#mainContent {width: 43em; margin: 0; padding: 0 0 1.5em 2em} - -/* Overwiriting the browser defaults: */ - -p {margin-top: 1em; margin-bottom: 1em} -ul, ol {margin-top: 1em; margin-bottom: 1em} -ul ul, ul ol, ol ul, ol ol {margin-top: 0; margin-bottom: 0} -img {border: 0} -a {color: #0000CC; text-decoration:none} -a:hover {text-decoration: underline} -a:visited {color: #800080} - -/* pre and tt font issues: */ - -pre {font-size: 90%; font-family: "Courier New", monospace} -pre.metaTemplate {font-size: 100%} -/* Some browsers chose smaller font than for normal text otherwise: */ -tt {font-size: 100%; font-family: "Courier New", monospace} - -/* Table-based DocBook elements: */ - -div.programlisting, div.informaltable, div.table { - margin: 1em 0 1em 0 -} - -/* ToC: */ - -div.toc { - border: 1px #000000 solid; - padding: 0.5em; - background-color: #F0F0F0; - width: 90%; - margin: 1em 0 1em 0 -} -.toc ul.noMargin {margin-left: 0} -.toc ul {list-style-type: none; margin-left: 2.5em; padding-left: 0; margin-bottom: 0} -.toc li {list-style-type: none; margin-left: 0; padding-left: 0; margin-bottom: 0} -.toc p {margin: 0} - -/* FAQ: */ - -.question {color:#0050B2; margin-top: 2em; margin-bottom: 1em} - -/* Footnote: */ - -#footnotes { - font-size: 75%; - margin-top: 3em; - padding-top: 0.5em; - border-top: 1px solid #E0E0E0; -} - -/* Title-s: */ - -.rank_book, -.rank_part, -.rank_chapter, -.rank_section1, -.rank_section2, -.rank_section3, -.rank_simplesect, -.rank_note, -.indexLabel { - font-family: Arial, sans-serif; font-weight: bold; color:#0050B2 -} -.rank_book {font-size: 230%; padding: 0; margin: 2em 0 1.5em 0;} -.rank_part {font-size: 220%; padding: 0; margin: 2em 0 1.5em 0} -.rank_chapter {font-size: 200%; padding: 0; margin: 2em 0 1.5em 0} -.rank_section1 { font-size: 150%; padding: 0; margin: 1.5em 0 1.0em 0;} -.rank_section2 { font-size: 112%; padding: 0; margin: 1.5em 0 1.0em 0;} -.rank_section3 { font-size: 95%; padding: 0; margin: 1.5em 0 1.0em 0;} -.rank_simplesect {font-size: 100%; padding: 0; margin: 1.5em 0 1.0em 0; - font-weight: normal; font-style: italic -} -.indexLabel {font-size: 108%; padding: 0; margin: 1.0em 0 1.0em 0;} - -.rank_note {font-size: 100%; color: black; padding: 0; margin: 1em 0 0.5em 0;} - -#pageTopTitle {margin-top: 1em; margin-bottom: 1em; border: none;} - -/* Footer: */ - -.footer {font-size: 83%; color: #A0A0A0; font-style: italic} -.smallFooter {font-size: 63%; color: #A0A0A0; font-style: italic} - -/* Nav. bar: */ - -div.navigation { - background-image: url(img/navigation-gradient.gif); - background-repeat: repeat-y; - background-position: left; - background-color: #F0F0F0; - border-top: solid black 1px; - border-bottom: solid black 1px; - width: 100%; /* IE6 Peekaboo bug workaround */ -} - -div.missingNavigationFooterLine { - height: 1px; - border-bottom: solid black 1px; -} - -div.bookmarks { - padding: 0.2em 0.3em 0.2em 0.3em; -} -span.bookmarks { -} -.disabledBookmark {color: #808080} - -/* -Because the buttons are floating div-s, this panel uses -two div.pagersVerticalSpacer-s inserad padding. -*/ -div.pagers { - padding: 0 0.3em; -} -div.pagersVerticalSpacer { - clear: both; - height: 0.2em; -} -.disabledPager {color: #808080} - -div.pagerButton { - float: left; - margin-right: 0.5em; - padding: 0.1em 0.3em; - border-width: 0.15em; - border-style: solid; - border-color: #FFFFFF #A0A0A0 #A0A0A0 #F0F0F0; - background: #E0E0E0; -} - -.hideA {color: #000000;} - -div.breadcrumb { - padding: 0.2em 0.3em 0.2em 0.3em; -} - -span.breadcrumb { - font-size: 80%; /* Don't use 0.8em due to MSIE6 bug */ -} diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/1.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/1.gif deleted file mode 100644 index 0d6697719334d29355401674962f1345787e0736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmZ?wbhEHb>L~%oSd9oTwL7T+&nxy zyu7@8e0==;`~m_3f`WoVLPEmA!XhFfqN1W=Vq)Ur;t~=Pl9G~AQc}{=(lRnKva+&r za&q$W@(KzHii(O#N=nMg$|@=KYmvnwpwgT3XuL+B!Nqy1Kf0dV2c$ z`UVCDhK7blMn=ZQ#wI2vrlzK5W@hH*<`xzfmX?-QR#w*5);2aawzjr*c6Rpm_6`mX zj*gB_PEO9w&Mq!4uCA_bZf@@G?j9ZO-;?s%`Gi0t*xzX zZEfxC?HwH*ot>RsU0vPX-90@$y}iACeSQ7?{Szikm^g9bq)C$|Po6ww%9N>7r%szT zZTj@-GiJ<~IdkT$S+i!(o;_#IoVj!7&YL%H{`~n17A#n}aN(jwixw|lykyCerAwDC zTefWZ^5rX5tXR2n<*HSyRoH%*%du|NsArKUo+Uftf%D zloLRCf`MZx!~eg#-8I=+I4mvh{{H^{{!R%71_cjB28W*F|L=~16e_0!iH^d4K?Vk| zb9al`Kw>>fAksk-B*h@W3^J6Vpa?9*ApqhqsDq^%6u@FoDMJacLWtCX7jZxbFc_?2 mWngHK`2KIMH&~K^;fMv$8T+eyk`x>!G+)|V|DTD8!5RQaJghJP diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/10.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/10.gif deleted file mode 100644 index fb50b06d150685fbc333906361e32afbf7684993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_$0-K}2ss$t`}gnPyBrWO06>re zLJV*J{^dYWt5yncz0OHVaj#T}cmHbDss&(<}jYB?hWAjdxpF-idd;H(xSYY-?o1HkBC4gkG4 qLFjeQT8tF;{=Lfq000002mqw;_V3@nf0S|{K#+pcy?_4#0suRd diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/11.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/11.gif deleted file mode 100644 index 9f5dba4f8df99fff77747affe9c6c03492ec896b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmZ?wbhEHb*_Mn*=~*4EC>&cVUKsi~=%nVHqq z)opEU{r&yZr%#_dckZG^i`K1Mw|VpC9Xoa$IdbIe*|V1}UAley_T$Ho-@JMA;lqc2 z|Neo@1p~#OEDVf5mJWyqvXgP}^2;9)OfJm7I)A)~{gLS`_d;ZPy>0S|_X32m08OKLyy@67BNn1 zV`M$b;Hb*j&z8jCVAzz(*|0d1*}-svnJ2^2O#T7^_7xgl3o~c6fy_O;6lj#|@c@$< P%QAt6&q75}91PX~p`BKN diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/13.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/13.gif deleted file mode 100644 index b00b1637bdb7b63936af105780c8749786bb8a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmZ?wbhEHb3x|moMMCb?eciM{nM|`S|hUzkmNgCL#gF zpDYZFK)w!03}hz*YvF=rnZlC|CNImJwM-Kz+OQ~d)-w*#q=p-*7PHz|r?uJeim=Ww zV{C0@=>Ntrnaz(OL9u;eM8lFu#sozHRo??kGr1dh7*7~9Ey|P%1DVSLG^)+=Sc1ij PWtl+3XQ84f4hCxgsBBm& diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/14.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/14.gif deleted file mode 100644 index 6d6642ee96d73aa5b2efe17277f15c63e15ff643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmZ?wbhEHbgv_2w{G2f{P^+Pw{Jgw{P^$RKag>#K=CIF z10zsK2P6!#lYzA`VOnY=t7jyToEFN;z;JkSYGfEE2V(<6l11b+S?_5KEX!CT+8F(( zvRqlp;LjGuAfVc->c}`bkwHN5baLRK$*JrYWEePfJPT4IRYB%D08MZc1e)(ZEfr|E OB-C)A`C!DsU=08}Mo-uP diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/2.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/2.gif deleted file mode 100644 index 100ff79f01bc5ce43936666fda12e7bc467814d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2FM=1vc2st?2`}gnPxflQdqzC~3 zK#X($?!^EQ!rHla#vlNQagPxI0Hv$}2yu@Q004|)006*f4*&q(Y5@Qc0|5X40001p zac>R)001^@s67~R_g00000F&F^=u;$*F7%?ya0Kn*83;>+Y qojZ4K4}ci={+){f00000006`|_wV1odyHZrK#+sdy?_4#0suS0gSs35 diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/3.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/3.gif deleted file mode 100644 index 5008ca7dbca75e8f5b01ec053301f2c0a90d2439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2FM=1vc2st?2`}gnPxflQtl zK#X($?!^EA!J9R2&L9AYagPxI0CUbEfbee(004|)0000X1po;D)&Kwy0|5X4006W) zXAJ=W001^@tB7y$s_tQG(OF&F^=!026!9PbDL0Kn*83;+;X q-MiNc0e~3y{+&w!00062006`|_wV1odyHZrfDnVyy?_4#0suROfV)2c diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/4.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/4.gif deleted file mode 100644 index 0e5617d2f2921864c307d1c21efd2a45e869e657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_*Gfu?6iQ0{`}gnPJtY7D07wA= zK#p_&{wVRjGG#0000G0|Nj6TFybZ zHwOR!00=Mu2=Q)CihGPO004kM34k&G{{8#+uM_|PF-idd0001hdvgE)0Kn*84gdfE q0Pwa30Du(t{=Lfq00000005-$_V3@ndz@lGKoEn`y?_4#0suSSP`y|H diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/5.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/5.gif deleted file mode 100644 index 9bc75ada64a150676e1009eafd0ae38eac678455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_$0-K}2ss$t`}gnPyBr8oqzI7$ zK@4yI{^bCW<{Pv;Y7==^Ow6F-idd5aXYc5Z)*O0Kn*94gdfM qy}MTm0)Q0v{=Lfq00066005-$_V3@nf0S|{KoEn`y?_4#0suQhF}%G1 diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/6.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/6.gif deleted file mode 100644 index d39640707444f5f67b2cd324143c2d6b40d27a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_*Gfu?6iQ0{`}gnPJtY7DU`PP~ zK#p_&{wV<}SN&x`ij1T|-F-iddu;yKe5ciY-0Kn*84gdfs q-MdE!0Du(t{=Lfq00066005-$_V3@ndz^A0KoEn`y?_4#0suR2o4}_4 diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/7.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/7.gif deleted file mode 100644 index c90b2f3df0c02186378d3521fe3c83f79646f04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_S4&EY6iQm%`}gnPJt+_{K)?V2 zLXLC){%HZw>fgVA|EvLsajzEu00000z;I3r005M<000000DxM(0001xBL)Bf002n2 z7XttQ00?3L0001hwORlG004kM3jhEBa{QA500000F=_z-0D#dw1ONa40Kn*<5&!^d q)dBzj0Du(t{=E|d00000005*o_wV1of1Gk4K#+pby?_4#0suR4=(v0U diff --git a/fmpp/docs/freemarker/docgen-resources/img/callouts/8.gif b/fmpp/docs/freemarker/docgen-resources/img/callouts/8.gif deleted file mode 100644 index 6fe3287d2538bacb0063bab02cca46bcb1febc53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmV;(12_CfNk%w1VGIBa0QUd@000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_*Gfu?5K>D0`}gnPJ0$=BKnMW< zK#p_&{s{p9pp-Xjy&wRHajz5r07~vb0B~*&005Mf001E59s~sM)&Kwy0|Nj60BW7{ zW(@%V00=Mu0HEcb6eaK0004kM2><}4dI12?suutNF-iddFy~#05a$R106^)V5C8}$ qoqI6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV0RR91EC2ui01N;O000Q30RR2_*Gfu?5K>y*`}gnPJs|)9K!5-M zK#q6+{wV=~pp~_Ar2qiPajz8s0CT({z;I6s005Mf002;`6#xL%N&x_n0|Nj6d%PjQ zaIY5t00=Mu005!ayL0Di0RVtN2mk;85FkKcjS>I=F-iddAmm;MCI4~&0Kn*84gdgJ q{d>0t0Du(t{=JI<00062006}B_V3@nf0SZCKoEn`y?_4#0suSwcfTJ1 diff --git a/fmpp/docs/freemarker/docgen-resources/img/linktargetmarker.gif b/fmpp/docs/freemarker/docgen-resources/img/linktargetmarker.gif deleted file mode 100644 index 29d19c5631f21a1308e9a540d650ac3f35b0794b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmZ?wbhEHbRA5kG00PDT+V? z=jy!`Y*VZG-40hSNwesSn559PO8eTb_Y%RzvG*qzy)wDMqWFPB!eOp}f5E~vWH2P99yBdq4 z8ZWL`eZ}gW^!XCr=@sifv&}!R7R1tecrJ_L4Gswp#gB~&8iwaHCV3SwSViit6?|dE zHE+X>@*gX%^Rd0q&1-oP=v>U#s_s(Z6tBeW9+jaOTEN|zmR*!rTfou+_EDQuY5S2oi5fGVjD1+imTcDO} zDCcw(Y712g%B98Wj3X0hktTa&H`yGU?7f@pk!&_rsE7=>_&508%$qmwz2EQqec$(c z)wNZnbJyjLG#dUg7^2arEXy=ai=wC~N-C9N7$zQ%ClU!sk_16;yWO!^jOTfRAOHaH zcsxFzkD@3ThJ(Q%1VJ3fAqWx*g;-FL|?)Uq{;jqi?k`>wI za`7CeXHTlCmP~3|62maJONWT2G%cQp^BkW@#Kl-l;00Ap>V;4wr6yEOODXZVmP#qI zBFQqxv9c^t6v@yG$FgcN>Gh&+;OQhuLJ;_*mPApn4uGPFAHzTpfEfws z0`p-sMTbH`f*@7Bff6c;Ad)01vW$m95D5A(OqL{?rZ}DphJs-{oK%y#7(TDpgXlK- z0RRl@@d5oZs5?fHr0$pwtm>`sv|BU~1P%Y|$ot#$U%nYn*QbBNV0mI#G_RoeT%9$4 zM#tgCx6hfzWKZpwu}Vsxe8`+roVj}02IH|gIpteFuN0bGqc0siGw))}TLnvcEvKe- zUp@nUGw1B91>)rcC$=vw6w<=o&1gf_^aq9eK6Z4ajc;D^prlJNmF>LbKt`;KU%XOx z{YF!xnA!1O{mh)8XT1bA?Q^X02jfA`NfUf=W6erEi+otAgEIR^e{5bgQnuH7GaY(6w;f26ON z=xFJhWUh}CSzg%cesk9Ro{IdnH#Z(TQ+-)z?HsPz_i6l#;lZ>!UBB+KZ$#RjY_I5e zG;QdvQra_Xu&HObio4*gSld76;p{Cxu0EfK9(^>whWXZH%I>?9Q(tp!zX`SEIt!0y z@yx!grR@id6`>4E`Y6+S=U1OKJm@mE6bJ21RnSRn4 zS~zvny}DaRKe*S{Vm|U{W0N%-%sXOz(P`Lg{iVIAdgO|-+UTk3Wt+@7b;SBR8P)ln zPFwxy+V9)n&u8vTTx;lbPB8TCHc$MpAyYiNYh}|%*=Kv(%m&+vTZWM@WtH{V_P)|+ zp0L7J)@WNbnBLNT+g2xk*M53i!Q}H!qjg&I$?JLHV;V8Tpm8SF;IPdcNbk2=&M;elE6(lI#y(WyEv5af?C&?{l S+;mt<=fxtsj|$szSNtg z!^X_q{r>*Q)#3d7{brD)+vDr0zR$D7)Mk*Ra+|NT#ng_fzL2WD(A(v_&fTB3$#I&l zxX9Pg+U4cz@TI!UtiRB$z|dxpqGphzexk>euEBqx#sm!s%)5g!+$pS_sP}ay2;qT&D^@l*POJ+_W1hX=I(NuucElhfTOp8ptHEi*z4`{ zleEs4vcu}{^t8v*uDj69*yQ^9{FJ!RwZ_$rtIV9c+41xD+TQ7rw9=ou(AMGS?ezKm z{r#i6&Uu}}f0w-N^7NOn#Fn(froPP8-{#fz)D!^qpNwa<>R%&E7{upR|ISz;&IztHIRX=j+Va<7SVew!PG5m#wwI z)baE7horY^m8puO$9bQ?exkLl!O(c1x7Xn5i>tb?!O@7Px~00zgrUd4&fKK9$?NU& z%Fy3#p1o?4sM6cy#M0m7>hQ3^()#@Uu(;68(&3b!zyJULW@ct)W@ct)W@ct)W@ct) zW@ct)W@ct)A^8LV00000EC2ui09XJN00#*F0PhJLNU&hRYReSeie<2&!-o(fN}Oo$ zOQ;7UVAP>_uO2;)0_oKQIndq!k_}O8SoAD5ZjzV z!{T9zLrMw>!zB$`OnU(u`VdqV~kbu1c1Qi_cXnnn0-$Kmd3I$!1dm3g8CU0#ua;T|+0>!9fG1B;iL3y}Xk_7cR^KQD-yR zR2>5TRY#X$1R$mWf`N^6Kyx@1W=~-fKI8!ieGCDC6vo65#2z`cvJFZ|CW)jeYcw#9 zAu}YS1teT3Y2}p>y-)!bqjUg4JdS|k07U~VK$AW6;6;#`G}Ti;J&4g1V1fX=#aDG_ z<~b8v1eGy|C`*)c2_Dv9pvMkdfV5(XfZam?J#7|bfC4l@DA0^E(R0#3cxn}q3{3cP zK_y~PaUn+VKFP^X(llu9>)@X`Y(S==xQ z5OU}cLIhL{gHo<%Di)ER0~XY&o_i4#2QYl-a*7GZ{2?au!%9Jncu|Z6<~)+gL)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.makeArray(E))},selector:"",jquery:"1.3.1",size:function(){return this.length},get:function(E){return E===g?o.makeArray(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,find:function(E){if(this.length===1&&!/,/.test(E)){var G=this.pushStack([],"find",E);G.length=0;o.find(E,this[0],G);return G}else{var F=o.map(this,function(H){return o.find(E,H)});return this.pushStack(/[^+>] [^+>]/.test(E)?o.unique(F):F,"find",E)}},clone:function(F){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.cloneNode(true),H=document.createElement("div");H.appendChild(I);return o.clean([H.innerHTML])[0]}else{return this.cloneNode(true)}});var G=E.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(F===true){this.find("*").andSelf().each(function(I){if(this.nodeType==3){return}var H=o.data(this,"events");for(var K in H){for(var J in H[K]){o.event.add(G[I],K,H[K][J],H[K][J].data)}}})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var F=o.expr.match.POS.test(E)?o(E):null;return this.map(function(){var G=this;while(G&&G.ownerDocument){if(F?F.index(G)>-1:o(G).is(E)){return G}G=G.parentNode}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML:null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(K,N,M){if(this[0]){var J=(this[0].ownerDocument||this[0]).createDocumentFragment(),G=o.clean(K,(this[0].ownerDocument||this[0]),J),I=J.firstChild,E=this.length>1?J.cloneNode(true):J;if(I){for(var H=0,F=this.length;H0?E.cloneNode(true):J)}}if(G){o.each(G,z)}}return this;function L(O,P){return N&&o.nodeName(O,"table")&&o.nodeName(P,"tr")?(O.getElementsByTagName("tbody")[0]||O.appendChild(O.ownerDocument.createElement("tbody"))):O}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(G,E,I){if(E=="width"||E=="height"){var K,F={position:"absolute",visibility:"hidden",display:"block"},J=E=="width"?["Left","Right"]:["Top","Bottom"];function H(){K=E=="width"?G.offsetWidth:G.offsetHeight;var M=0,L=0;o.each(J,function(){M+=parseFloat(o.curCSS(G,"padding"+this,true))||0;L+=parseFloat(o.curCSS(G,"border"+this+"Width",true))||0});K-=Math.round(M+L)}if(o(G).is(":visible")){H()}else{o.swap(G,F,H)}return Math.max(0,K)}return o.curCSS(G,E,I)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,R){if(typeof R==="number"){R+=""}if(!R){return}if(typeof R==="string"){R=R.replace(/(<(\w+)[^>]*?)\/>/g,function(T,U,S){return S.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?T:U+">"});var O=o.trim(R).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+R+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var N=!O.indexOf(""&&O.indexOf("=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(R)){L.insertBefore(K.createTextNode(R.match(/^\s*/)[0]),L.firstChild)}R=o.makeArray(L.childNodes)}if(R.nodeType){G.push(R)}else{G=o.merge(G,R)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E*",this).remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var Q=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,K=0,G=Object.prototype.toString;var F=function(X,T,aa,ab){aa=aa||[];T=T||document;if(T.nodeType!==1&&T.nodeType!==9){return[]}if(!X||typeof X!=="string"){return aa}var Y=[],V,ae,ah,S,ac,U,W=true;Q.lastIndex=0;while((V=Q.exec(X))!==null){Y.push(V[1]);if(V[2]){U=RegExp.rightContext;break}}if(Y.length>1&&L.exec(X)){if(Y.length===2&&H.relative[Y[0]]){ae=I(Y[0]+Y[1],T)}else{ae=H.relative[Y[0]]?[T]:F(Y.shift(),T);while(Y.length){X=Y.shift();if(H.relative[X]){X+=Y.shift()}ae=I(X,ae)}}}else{var ad=ab?{expr:Y.pop(),set:E(ab)}:F.find(Y.pop(),Y.length===1&&T.parentNode?T.parentNode:T,P(T));ae=F.filter(ad.expr,ad.set);if(Y.length>0){ah=E(ae)}else{W=false}while(Y.length){var ag=Y.pop(),af=ag;if(!H.relative[ag]){ag=""}else{af=Y.pop()}if(af==null){af=T}H.relative[ag](ah,af,P(T))}}if(!ah){ah=ae}if(!ah){throw"Syntax error, unrecognized expression: "+(ag||X)}if(G.call(ah)==="[object Array]"){if(!W){aa.push.apply(aa,ah)}else{if(T.nodeType===1){for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&(ah[Z]===true||ah[Z].nodeType===1&&J(T,ah[Z]))){aa.push(ae[Z])}}}else{for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&ah[Z].nodeType===1){aa.push(ae[Z])}}}}}else{E(ah,aa)}if(U){F(U,T,aa,ab)}return aa};F.matches=function(S,T){return F(S,null,null,T)};F.find=function(Z,S,aa){var Y,W;if(!Z){return[]}for(var V=0,U=H.order.length;V":function(X,T,Y){if(typeof T==="string"&&!/\W/.test(T)){T=Y?T:T.toUpperCase();for(var U=0,S=X.length;U=0){if(!U){S.push(X)}}else{if(U){T[W]=false}}}}return false},ID:function(S){return S[1].replace(/\\/g,"")},TAG:function(T,S){for(var U=0;S[U]===false;U++){}return S[U]&&P(S[U])?T[1]:T[1].toUpperCase()},CHILD:function(S){if(S[1]=="nth"){var T=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(S[2]=="even"&&"2n"||S[2]=="odd"&&"2n+1"||!/\D/.test(S[2])&&"0n+"+S[2]||S[2]);S[2]=(T[1]+(T[2]||1))-0;S[3]=T[3]-0}S[0]="done"+(K++);return S},ATTR:function(T){var S=T[1].replace(/\\/g,"");if(H.attrMap[S]){T[1]=H.attrMap[S]}if(T[2]==="~="){T[4]=" "+T[4]+" "}return T},PSEUDO:function(W,T,U,S,X){if(W[1]==="not"){if(W[3].match(Q).length>1){W[3]=F(W[3],null,null,T)}else{var V=F.filter(W[3],T,U,true^X);if(!U){S.push.apply(S,V)}return false}}else{if(H.match.POS.test(W[0])){return true}}return W},POS:function(S){S.unshift(true);return S}},filters:{enabled:function(S){return S.disabled===false&&S.type!=="hidden"},disabled:function(S){return S.disabled===true},checked:function(S){return S.checked===true},selected:function(S){S.parentNode.selectedIndex;return S.selected===true},parent:function(S){return !!S.firstChild},empty:function(S){return !S.firstChild},has:function(U,T,S){return !!F(S[3],U).length},header:function(S){return/h\d/i.test(S.nodeName)},text:function(S){return"text"===S.type},radio:function(S){return"radio"===S.type},checkbox:function(S){return"checkbox"===S.type},file:function(S){return"file"===S.type},password:function(S){return"password"===S.type},submit:function(S){return"submit"===S.type},image:function(S){return"image"===S.type},reset:function(S){return"reset"===S.type},button:function(S){return"button"===S.type||S.nodeName.toUpperCase()==="BUTTON"},input:function(S){return/input|select|textarea|button/i.test(S.nodeName)}},setFilters:{first:function(T,S){return S===0},last:function(U,T,S,V){return T===V.length-1},even:function(T,S){return S%2===0},odd:function(T,S){return S%2===1},lt:function(U,T,S){return TS[3]-0},nth:function(U,T,S){return S[3]-0==T},eq:function(U,T,S){return S[3]-0==T}},filter:{CHILD:function(S,V){var Y=V[1],Z=S.parentNode;var X=V[0];if(Z&&(!Z[X]||!S.nodeIndex)){var W=1;for(var T=Z.firstChild;T;T=T.nextSibling){if(T.nodeType==1){T.nodeIndex=W++}}Z[X]=W-1}if(Y=="first"){return S.nodeIndex==1}else{if(Y=="last"){return S.nodeIndex==Z[X]}else{if(Y=="only"){return Z[X]==1}else{if(Y=="nth"){var ab=false,U=V[2],aa=V[3];if(U==1&&aa==0){return true}if(U==0){if(S.nodeIndex==aa){ab=true}}else{if((S.nodeIndex-aa)%U==0&&(S.nodeIndex-aa)/U>=0){ab=true}}return ab}}}}},PSEUDO:function(Y,U,V,Z){var T=U[1],W=H.filters[T];if(W){return W(Y,V,U,Z)}else{if(T==="contains"){return(Y.textContent||Y.innerText||"").indexOf(U[3])>=0}else{if(T==="not"){var X=U[3];for(var V=0,S=X.length;V=0:V==="~="?(" "+X+" ").indexOf(T)>=0:!U[4]?S:V==="!="?X!=T:V==="^="?X.indexOf(T)===0:V==="$="?X.substr(X.length-T.length)===T:V==="|="?X===T||X.substr(0,T.length+1)===T+"-":false},POS:function(W,T,U,X){var S=T[2],V=H.setFilters[S];if(V){return V(W,U,T,X)}}}};var L=H.match.POS;for(var N in H.match){H.match[N]=RegExp(H.match[N].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(T,S){T=Array.prototype.slice.call(T);if(S){S.push.apply(S,T);return S}return T};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(M){E=function(W,V){var T=V||[];if(G.call(W)==="[object Array]"){Array.prototype.push.apply(T,W)}else{if(typeof W.length==="number"){for(var U=0,S=W.length;U";var S=document.documentElement;S.insertBefore(T,S.firstChild);if(!!document.getElementById(U)){H.find.ID=function(W,X,Y){if(typeof X.getElementById!=="undefined"&&!Y){var V=X.getElementById(W[1]);return V?V.id===W[1]||typeof V.getAttributeNode!=="undefined"&&V.getAttributeNode("id").nodeValue===W[1]?[V]:g:[]}};H.filter.ID=function(X,V){var W=typeof X.getAttributeNode!=="undefined"&&X.getAttributeNode("id");return X.nodeType===1&&W&&W.nodeValue===V}}S.removeChild(T)})();(function(){var S=document.createElement("div");S.appendChild(document.createComment(""));if(S.getElementsByTagName("*").length>0){H.find.TAG=function(T,X){var W=X.getElementsByTagName(T[1]);if(T[1]==="*"){var V=[];for(var U=0;W[U];U++){if(W[U].nodeType===1){V.push(W[U])}}W=V}return W}}S.innerHTML="";if(S.firstChild&&S.firstChild.getAttribute("href")!=="#"){H.attrHandle.href=function(T){return T.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var S=F,T=document.createElement("div");T.innerHTML="

    ";if(T.querySelectorAll&&T.querySelectorAll(".TEST").length===0){return}F=function(X,W,U,V){W=W||document;if(!V&&W.nodeType===9&&!P(W)){try{return E(W.querySelectorAll(X),U)}catch(Y){}}return S(X,W,U,V)};F.find=S.find;F.filter=S.filter;F.selectors=S.selectors;F.matches=S.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){H.order.splice(1,0,"CLASS");H.find.CLASS=function(S,T){return T.getElementsByClassName(S[1])}}function O(T,Z,Y,ac,aa,ab){for(var W=0,U=ac.length;W0){W=S;break}}}S=S[T]}ab[V]=W}}}var J=document.compareDocumentPosition?function(T,S){return T.compareDocumentPosition(S)&16}:function(T,S){return T!==S&&(T.contains?T.contains(S):true)};var P=function(S){return S.nodeType===9&&S.documentElement.nodeName!=="HTML"||!!S.ownerDocument&&P(S.ownerDocument)};var I=function(S,Z){var V=[],W="",X,U=Z.nodeType?[Z]:Z;while((X=H.match.PSEUDO.exec(S))){W+=X[0];S=S.replace(H.match.PSEUDO,"")}S=H.relative[S]?S+"*":S;for(var Y=0,T=U.length;Y=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}this[H].style.display=o.data(this[H],"olddisplay",K)}}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)==1){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(H,F){var E=H?"Left":"Top",G=H?"Right":"Bottom";o.fn["inner"+F]=function(){return this[F.toLowerCase()]()+j(this,"padding"+E)+j(this,"padding"+G)};o.fn["outer"+F]=function(J){return this["inner"+F]()+j(this,"border"+E+"Width")+j(this,"border"+G+"Width")+(J?j(this,"margin"+E)+j(this,"margin"+G):0)};var I=F.toLowerCase();o.fn[I]=function(J){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+F]||document.body["client"+F]:this[0]==document?Math.max(document.documentElement["client"+F],document.body["scroll"+F],document.documentElement["scroll"+F],document.body["offset"+F],document.documentElement["offset"+F]):J===g?(this.length?o.css(this[0],I):null):this.css(I,typeof J==="string"?J:J+"px")}})})(); \ No newline at end of file diff --git a/fmpp/docs/freemarker/docgen-resources/linktargetmarker.js b/fmpp/docs/freemarker/docgen-resources/linktargetmarker.js deleted file mode 100644 index a0f5253..0000000 --- a/fmpp/docs/freemarker/docgen-resources/linktargetmarker.js +++ /dev/null @@ -1,43 +0,0 @@ -var markerTimerId; - -function escId(myid) { - return '#' + myid.replace(/\./g, "\\."); -} - -function showMarker(name) { - if (markerTimerId) { - clearTimeout(markerTimerId); - showMarker_endAnimation(); - markerTimerId = null; - } - var target = $("a[name='" + name + "']"); - target.before( - "" - + "" - + ""); - markerTimerId = setTimeout('showMarker_endAnimation()', 1000); -} - -function showMarker_endAnimation() { - $('#docgen_marker').remove(); -} - -function extractTargetName(href) { - anchorIdx = href.indexOf('#'); - if (anchorIdx == -1) return null; - queryIdx = href.indexOf('?'); - return href.substring( - anchorIdx + 1, - queryIdx != -1 ? queryIdx : href.length); -} - -$(document).ready(function() { - $("a[href^='#']").click(function(event) { - showMarker(extractTargetName($(this).attr('href'))); - }); - - if (location.href.indexOf('#') != -1) { - showMarker(extractTargetName(location.href)); - } -}); diff --git a/fmpp/docs/freemarker/eclipse-toc.xml b/fmpp/docs/freemarker/eclipse-toc.xml deleted file mode 100644 index 133e9f6..0000000 --- a/fmpp/docs/freemarker/eclipse-toc.xml +++ /dev/null @@ -1,643 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/docs/freemarker/figures/model2sketch.png b/fmpp/docs/freemarker/figures/model2sketch.png deleted file mode 100644 index 93f9a6bce23285592a08794cfac8a953e8361876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21425 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%0D~I?a8i{IZ~K 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 OEENUK_m%Px*#7}c3Uv7Z diff --git a/fmpp/docs/freemarker/figures/overview.png b/fmpp/docs/freemarker/figures/overview.png deleted file mode 100644 index be8e504a4ad6a140309f94f36255e48123c2f84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4996 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 J6>6_S{tt)SUG4w? diff --git a/fmpp/docs/freemarker/figures/tree.png b/fmpp/docs/freemarker/figures/tree.png deleted file mode 100644 index dcd9bf341486a845bf91643e575e17d482b952b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4699 zcmV-h5~S^kP)WdKVcGch1!Wn(TNGB7YQATTgGGc-ChG9W83F)%Q1QoyhP000McNliru z(hMFKIVvhbE3g0n010qNS#tmY3labT3lag+-G2N4000DMK}|sb0I`n?{9y$E00R0@ zOjJew{{H;@{QCO(`1ttt_V)Dj^ziWT?(XjF?Ck35>g43);Nalg+}z&Y-sa}!+S=OE z($dV#%*n~g$H>Uf&(PJ?)xp8RxVX5rwY9OavDnzy;^N}0t*&`}flyXmRa#(tfPaawzs&7i;OWbF^GtWR#sL$Jw2J3nXI5j#yVr6PHMOIy7X&oaeF+fjVew}um#9DZk z5)~I&TVBJ(#xy)bG(%Ezn!uIE`D28o8X+hyJxYG4(k3uDZgF&uk(7O=&}D|GL|Skt zF+3L>AwpMdKtxB4yz5+gnJ6nT9wH`noWoswnL9v6LRfA$NLYS@hnb(G6&oRcs?@Ty zwm?&6H9A0LYHt!28n?N;K~-r&N>E#Qlc1ucqNJvaj*&%5PR-HPK1EF>F+5gsjvO2u z78Vw(vAAq+a&B&J85tQ-QBfo$Bq}N@WMpI@ARt0RM16gIcYAgkz2W_o(=neKs@o#`Y%$RvRfg5ewlq8tGeH4>FcmK>YSPBxpJnB_=z zmmr5mL5xvQ2_UF|a)=jRK?M<5bvNNs6j2mWJn`1g$Eu#IdybtxrhB&e?E5Dlws&8> zZ&h_wb-iB|haEO;(>86>Hf__^&;Wqg0O)ieZ3BV?B}pEVbP@1%0R^D=ziX~IWBHYj zFrKvQ^}qy(-PiAVa^F#l7hd+?Fy|o&=QF`aU%Tt1MaVAv&z=P#k#as02+Y3d!bL^< z*WQ0eSc-Ib-vi`7=N!MNZ1=s8j4*DO!;$!#Zmke4I{vnQ1pKtan+XPA`)n2IZ*%@0 zMa|^sw+X<%98e%F+WFU5fb}@K=K>}cRf)Z@gDr+`r)X6#yrO|0Wvj^>sj{daiM=Haa6jz26qIM474uQ2nerUgA>t8BRK=A2o#eV0^uHs zkVF;I6o+a7)C6e?L$w5IiZn%`GyqM4GzFmmpjAMm3pV-`ngnTzK>>>dwMMuBR*8PGkb zq4IP=;V-Jq9}t&cP*y4|{mriajVVTwi~^~>Eqp6)ME9VA>RqPaAH4khYToYHdxirM zA0yGltyBHOsM_1?WQ6g!^rvbSP%r&jw?9Chb96Pkdfc3Iqs7g6WAj3tx1gUkl&UR4 zxhdu`{r(`k?9GZC_>pgkhXjU7H{Mie-AJ|GQoK>!1BN2q5d;2UVD?#xKRW8{WLDq| zCyeX7B?3OmK+h{eA*PT4e^5N*O^QD{`r7$XflC_|l+=1VGhs&e0HDjK-yeYK8K<6B zRsGEUl^LZ%oww5yS-%M>2U>?1@CVb$lTWGq(c)ufn$nZB*Bh=P1O6cCJMoQ6OMi3H z3G=#4seWp`U2RfBWGFh|@`M&FJoY%;u8U7tl1Z4-X35@uS@L%GlD_#-!y}&Y=m3$H zqO)etIr6BZ=N>aJGd~sZno!UoZ`|O4pUd7}_{DHnKIAtgAu2}q;uFZJyh!c))r!@;hJOg@%6_-x208J^?Hb>v=qRX7`s zrVc(A;G~cAE)qJrt5Sj;68` zDg4z%7smP|kFJfP2DKEYB`ifsN4vwc+vd{&An?pEs!{a)n4O5C_tN8`x9`AVn3Z-fczyx+6Qbio*v7WuS0sbRB~lNmdnB zksy)wp~=Z;-NKm%X}U~-R->1!Gv4C*3*Yoi7LN_MKt+BD^%i&B@Z<#Cn=>?Bt`Fpk z?+@5EKmh*Gh}`W+xz|^b@S@o8m#3t@~1}7&#t?!~}MP)#O$rbDwAb^-d%T=!W z9xHRTsOuS=oIt9$7^-wM<*WXAvj;K);9iK~=Vg9HsuPIwWn?02%OY&UOi(WtTP z=$O1*Ew@8WMjZ{lh9)Pp2+ynf9d0I%Eo)ccK6p?pPD$n0SS=DTI61-OdXZLF1ZpN* z)~@B{YNeoBBtw%E8vfUeP?Gu;1jV(hwTHaWWGd_^EmzBB*XbV0lauyP&<82u?~Y2f zV*w!28+#CE`RITJIFKO7@mz#sB!$YMPWMoroM@a|)DR0m%ejDmxK|YAwpTqtYga*x zWPK&QOnZT3IfC1rAIorza%-u9?x8d}F`N)$TgL+EAI*4t@3NEc6ud0kmk$Derel#>?U_|U9}{k1!#&{dc{ zSFdP5V-uC-4SNn`BKTZSWdLuedqB18x$eL_wZsA+UiqDSaZ+jj>Jz>j@~Sr@0nD%b zo?g*_Mx?5|;hPKMVJ}ziAI)?RsCHLgpd}VSe`{wo{qpUwPqk&-4iQ2VB9-S^*-Gxd zX_1iC77Ku1d+6(xB-t%1zoEWf0iM?m5ke!YkvHs?>$1UvN|8WoEWrJxFIQ8U`@iy4 zRr;lEB82*KYdx3qyG@JK91Dy*@I^(!`N1<)vVb;<5NgY<^BfjE*mKh&p-*EhaA@zn zieJ3%{z8DIDm|~QA_R50%{=RWP}}}Q;GWfrU;O+RRI-5fiV##tO*{kL59*Pm1$R~7 zrKNYDTTsXX+ATs*l-tBJ(EXqRQu;HORWJ7V+)A}9pv@u#Wh*uD40J!JcTGkX++H3V zKYhoYYFR*gB@OCwn|Rj$pw6|6`ot$cb<2L->u$ZRRu<4+NrS3;AkR14*uZnsA~nZ? z*1TNwBYQu(?_(dIbJNY4q*}DlUP*(x+%$LH`#*p^@A=@ozGSTIxoMHwV?m2SmcRHz z%dfxT!`E#{#Aw&j+&EY=HOH=FrYN%Z;seqV!pa~mZMYQO2;O^ny?7lg?0Xjm0s(;~IUg1_tC zvaTC_*w_7D`y>r&x1sI`Co&wzG2vW-RfpcJNbRuz`Hl#(i3qw~l7^ZhN7hghmR_R} z>*NSci_{Uz#odZ)@C_^1xUWK7(q^nd2@Lilfu>*oY^Z?lfrV&$KhAB0vy41aO zR+A_niioOwxOJ&}%d9RRu0DuqUFzOCYmu9`E_H7q(&YJY>r(d?B2AtTw=Q*WnYGA= zTbH`G&|2iftxMfoh%|XV+`81gb=D#uZe8l$LZr#_;flwXUN*09NZWb;4qJ~S>ES>HD0THc=>TCJD5xHerc+|N#&p?%ZC>q`}{&+ zTc6;FkBh@v=ELR36wNVP2T&tApx?p zHo5^49v~vGx2cKV+$UdP(dkIqW_BG>win6v>vb$=vi*7;>yd1~UdMW~`+6N43^kLj z*X!7W#CK|x3hE*t&oWLDoxi0 zILF`$$LSzim=kpnEzE&Bh!*BV9YhOrq7I@Jk^^-Rt&p6jgJ@xn)Iqc`C+Z+tAvsV7 z(ZZalgJ^|h*%bzzGwZG}=$Kh|g+T|Ith&OWvrLv;VbD<~YpyWpERz*i7 - - - - - - - FreeMarker Manual - Glossary - - - - - - - - -
    - - - - - -

    -Glossary

    - -

    -A | B | C | D | E | F | H | L | M | O | P | R | S | T | U | W | X

    - -
    - -
    Attribute
    - - -
    -

    In connection with XML or HTML - (or SGML in general), attributes are - the named values associated with elements. For example, in - <body bgcolor=black - text=green>...</body>, - the attributes are bgcolor=black and - text=green. On the left side of - = is the name of the attribute, while on the right - side is the value of the attribute. Note that in XML, the values must - be quoted (for example: <body bgcolor="black" - text='green'>), while in HTML it is optional for certain - values.

    - - - -

    See Also - Start-tag -

    -
    - - -
    Boolean
    - - -
    -

    This is a variable type. A boolean variable represents a logical - true or false (yes or no). For example, if the visitor has been logged - in or not. There are only two possible boolean values: - true and false. Typically, you - will use booleans with an <#if - ...> directive when you want - to display text based on some condition, say, you show a certain part - of the page only for visitors who has logged in.

    - -
    - - -
    Character
    - - -
    -

    A symbol that people use in writing. Examples of characters: - Latin capital letter A (``A''), Latin small letter A (``a''), digit - four (``4''), number sign (``#''), colon (``:'')

    - -
    - - -
    Charset
    - - -
    -

    A charset is a rule (algorithm) for transforming a sequence of - characters (text) to a sequence - of bits (or in practice, to a sequence of bytes). Whenever a character - sequence is stored on a digital media, or sent through a digital - channel (network), a charset must be applied. Examples of charsets are - ISO-8859-1, ISO-8859-6, Shift_JIS , UTF-8.

    - -

    The capabilities of different charsers are different, that is, - not all charsets can be used for all languages. For example ISO-8859-1 - can't represent Arabic letters, but ISO-8859-6 can, however it can't - represent the accented letters that that ISO-8859-1 can. Most charsets - are highly restrictive regarding the allowed characters. UTF-8 allows - virtually all possible characters, but most text editors can't handle - it yet (2004).

    - -

    When different software components exchange text (as the HTTP - server and the browser, or the text editor you use for saving - templates and FreeMarker who loads them), it's very important that - they agree in the charset used for the binary encoding of the text. If - they don't, then the binary data will be misinterpreted by the - receiver (loader) component, which usually results in the distortion - of the non-English letters.

    - -
    - - -
    Collection
    - - -
    -

    A variable that (in conjunction with the list - directive) can spit out a series of variables.

    - -
    - - -
    Data-model
    - - -
    -

    Something that holds the information the template has to show - (or use in some other ways) when the template processor assembles the - output (e.g. a Web page). In FreeMarker this is best visualized as a - tree.

    - -
    - - -
    Directive
    - - -
    -

    Instructions to FreeMarker used in FTL templates. They are invoked by FTL tags.

    - - - - - -

    See Also - Predefined directive, - User-defined directive -

    -
    - - -
    Element
    - - -
    -

    Elements are the most fundamental building pieces of SGML documents; an SGML document is - basically a tree of elements. Example of elements used in HTML: body, - head, title, p, h1, h2.

    - -
    - - -
    End-tag
    - - -
    -

    Tag, which indicates that the - following content is not under the element. Example: - </body>.

    - - - -

    See Also - Start-tag -

    -
    - - -
    Environment
    - - -
    -

    An Environment object stores the runtime - state of a single template template processing job. - That is, for each - Template.process(...) - call, an Environment instance will be created, and - then discarded when process returns. This object - stores the set of temporary variables created by the template, the - value of settings set by the template, the reference to the data-model - root, etc. Everything that is needed to fulfill the template - processing job.

    - -
    - - -
    Extensible Markup Language
    - - -
    -

    A subset (restricted version) of SGML. This is less powerful than SGML, but - it easier to learn and much easier to process with programs. If you - are an HTML author: XML documents are similar to HTML documents, but - the XML standard doesn't specify the usable elements. XML is a much - more general-purpose thing than HTML. For example you can use XML to - describe Web pages (like HTML) or to describe non-visual information - like a phone book database.

    - - - -

    See Also - Standard Generalized Markup Language -

    -
    - - -
    FreeMarker Template Language
    - - -
    -

    Simple programming language designed to write text file - templates, especially HTML templates.

    - -
    - - -
    FTL
    - - -

    See - FreeMarker Template Language -

    - - -
    FTL tag
    - - -
    -

    Tag-like text fragment used to - invoke FreeMarker directives in - FTL templates. These are similar to HTML - or XML tags at the first glance. The most prominent difference is that - the tag name is started with # or - @. Another important difference is that FTL tags do - not use attributes, but a - substantially different syntax to specify parameters. Examples of FTL - tags: <#if newUser>, - </#if>, <@menuitem - title="Projects" link="projects.html"/>

    - -
    - - -
    Full-qualified name
    - - -
    -

    ... of nodes (XML node or other FTL node variable): The - full-qualified name of a node specifies not only the node name - (node?node_name), but - also the node namespace - (node?node_namespace), - this way it unambiguously identify a certain kind of node. The format - of the full-qualified name is - nodeName or - prefix:nodeName. - The prefix is shorthand to identify the node namespace (the a node - namespace is usually specified with a long ugly URI). In FTL, prefixes - are associated with the node namespaces with the - ns_prefixes parameter of the ftl - directive. In XML files, prefixes are associated with the node - namespaces with the - xmlns:prefix attributes. - The lack of the prefix means that the node uses the default node - namespace, if a default node namespace is defined; otherwise it means - that the node does not belong to any node namespace. The default node - namespace is defined in FTL by registering reserved prefix - D with the ns_prefixes parameter - of the ftl directive. In XML files it is defined - with attribute xmlns.

    - -

    ... of Java classes: The full-qualified name of a Java class - contains both the class name and the name of the package the class - belongs to. This way it unambiguously specifies the class, regardless - of the context. An example of full-qualifed class name: - java.util.Map (as opposed to - Map).

    - -
    - - -
    Hash
    - - -
    -

    A variable that acts as a container that stores subvariables - that can be retrieved via a string that is a lookup name.

    - - - -

    See Also - Sequence -

    -
    - - -
    Line break
    - - -
    -

    Line break is a special character (or a sequence of special - characters) that causes a line breaking when you see the text as plain - text (say, when you read the text with Windows notepad). Typically you - type this character by hitting ENTER or RETURN key. The line break is - represented with different characters on different platforms (to cause - incompatibility and confusion...): ``line feed'' character on UNIX-es, - ``carriage return'' character on Macintosh, ``carriage return''+``line - feed'' (two characters!) on Windows and DOS. Note that line breaks in - HTML do not have a visual effect when viewed in a browser; you must - use markup such as <BR> for that. This manual - never means <BR> when it says - ``line-break''.

    - -
    - - -
    Macro definition body
    - - -
    -

    The template fragment between the <#macro - ...> and - </#macro>. This template fragment will be - executed when you call the macro (for example as - <@myMacro/>).

    - -
    - - -
    Method
    - - -
    -

    A variable that calculates something based on parameters you - give, and returns the result.

    - -
    - - -
    MVC pattern
    - - -
    -

    MVC stands for Model View Controller. It's a design pattern - started his life in the 70's as a framework developer by Trygve - Reenskaug for Smalltalk, and was used primary for for UI-s (user - interfaces). MVC considers three roles:

    - -
    -
      -
    • - Model: Model represents application (domain) specific - information in a non-visual way. For example, an array of product - objects in the memory of your computer is the part of the - model. -
    • - -
    • - View: View displays the model and provides UI. For example, - it's the task of the view component to render the array of product - objects to a HTML page. -
    • - -
    • - Controller: The controller handles user input, modifies the - model, and ensures that the view is updated when needed. For - example it is the task of controller to take the incoming HTTP - requests, parse the received parameters (forms), dispatch the - requests to the proper business logic object, and chose the right - template for the HTTP response. -
    • -
    - - -

    The most important thing for us when applying MVC for Web - applications is the separation of View from the other two roles. This - allows the separation of designers (HTML authors) from programmers. - Designers deal with the visual aspects, programmers deal with the - application logic and other technical issues; everybody works on what - he is good at. Designers and programmers are less dependent on each - other. Designers can change the appearance without programmers having - to change or recompile the program.

    - -

    For more information I recommend reading chapter - 4.4 of Designing Enterprise Applications with the J2EE Platform - blueprint.

    - -
    - - -
    Output encoding
    - - -
    -

    Means output charset. In - the Java world the term ``encoding'' is commonly (mis)used as a - synonym to ``charset''.

    - -
    - - -
    Predefined directive
    - - -
    -

    Directive what is defined by FreeMarker, thus always available. - Example of predefined directives: if, - list, include

    - - - -

    See Also - User-defined directive -

    -
    - - -
    Regular expression
    - - -
    -

    A regular expression is a string that specifies a set of strings - that matches it. For example, the regular expression - "fo*" matches "f", - "fo", "foo", etc. Regular - expressions are used in several languages and other tools. In - FreeMarker, the usage of them is a ``power user'' option. So if you - have never used them before, there is no need to worry about not being - familiar with them. But if you are interested in regular expressions, - you can find several Web pages and books about them. FreeMarker uses - the variation of regular expressions described at: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

    - -
    - - -
    Scalar
    - - -
    -

    A scalar variable stores a single value. A scalar is either a - string or a number or a date/time or a boolean.

    - -
    - - -
    Sequence
    - - -
    -

    A sequence is a variable that contains a sequence of - subvariables. The sequence's subvariables are accessible via numerical - index, where the index of the very first object is 0, the index of the - second objects is 1, the index of the third object is 2, etc.

    - - - -

    See Also - Hash -

    -
    - - -
    SGML
    - - -

    See - Standard Generalized Markup Language -

    - - -
    Standard Generalized Markup Language
    - - -
    -

    This is an international standard (ISO 8879) that specifies the - rules for the creation of platform-independent markup languages. HTML - is a markup language created with SGML. XML is a subset (restricted version) of - SGML.

    - - - -

    See Also - Extensible Markup Language -

    -
    - - -
    Start-tag
    - - -
    -

    Tag, which indicates that the - following content is under the element, up to the end-tag. The start-tag may also - specifies attributes for the - element. An example of a start-tag: <body - bgcolor=black>

    - -
    - - -
    String
    - - -
    -

    A sequence of characters - such as ``m'', ``o'', ``u'', ``s'', ``e''.

    - -
    - - -
    Tag
    - - -
    -

    Text fragment indicating the usage of an element in SGML. - Examples of tags: <body bgcolor=black>, - </body>

    - - - - - -

    See Also - Start-tag, - End-tag -

    -
    - - -
    Template
    - - -
    -

    A template is a text file with some special character sequences - embedded into it. A template processor (e.g. FreeMarker) will - interpret special character sequences and it outputs a more or less - different text from the original text file, where the differences are - often based on a data-model. - Thus, the original text acts as a template of the possible - outputs.

    - -
    - - -
    Template encoding
    - - -
    -

    Means template charset. In - the Java world the term ``encoding'' is commonly (mis)used as a - synonym to ``charset''.

    - -
    - - -
    Template processing job
    - - -
    -

    A template processing job is the act when FreeMarker merges a - template with a data-model to produce the output for a visitor. Note - that this may includes the execution of multiple template files - because the template file used for the Web page may invokes other - templates with include and - import directives. Each template-processing job is - a separated cosmos that exists only for the short period of time while - the given page is being rendered for the visitor, and then it vanishes - with all the variables created in the templates (for example, - variables created with assign, - macro or global - directives).

    - -
    - - -
    Thread-safe
    - - -
    -

    An object is thread-safe if it is safe to call its methods from - multiple threads, even in parallel (i.e. multiple threads execute the - methods of the object at the same time). Non-thread-safe objects may - behave unpredictably in this situation, and generate wrong results, - corrupt internal data structures, etc. Thread-safety is typically - achieved in two ways with Java: with the usage - synchronized statement (or - synchronized methods), and with the immutability of - encapsulated data (i.e. you can't modify the field after you have - created the object).

    - -
    - - -
    Transform
    - - -
    -

    This term refers to user-defined directives that are implemetned - with the now obsolete TemplateTransformModel Java - interface. The feature was originally made for implementing output - filters, hence the name.

    - -
    - - -
    UCS
    - - -
    -

    This is international standard (ISO-10646) that defines a huge - set of characters and assigns a - unique number for each character (``!'' is 33, ..., ``A'' is 61, ``B'' - is 62, ..., Arabic letter hamza is 1569... etc.). This character set - (not charset) contains almost all characters used today (Latin - alphabet, Cyrillic alphabet, Chinese letters, etc.). The idea behind - UCS is that we can specify any character with a unique number, not - mater what the platform or the language is.

    - - - -

    See Also - Unicode -

    -
    - - -
    Unicode
    - - -
    -

    De-facto standard developed by Unicode organization. It deals - with the classification of the characters in UCS (which is letter, which is digit, which - is uppercase, which is lowercase, etc.), and with other problems of - processing text made from the characters of UCS (e.g. - normalization).

    - -
    - - -
    User-defined directive
    - - -
    -

    Directive that is not defined by the FreeMarker core, but by the - user. These are typically application domain specific directives, like - pull-down menu generation directives, HTML form handling - directives.

    - - - -

    See Also - Predefined directive -

    -
    - - -
    White-space
    - - -
    -

    Characters that are totally transparent but have impact on the - visual appearance of the text. Examples of white-space characters: - space, tab (horizontal and vertical), line breaks (CR and LF), form - feed.

    - - - -

    See Also - Line break -

    -
    - - -
    XML
    - - -

    See - Extensible Markup Language -

    - -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/index.html b/fmpp/docs/freemarker/index.html deleted file mode 100644 index cff1866..0000000 --- a/fmpp/docs/freemarker/index.html +++ /dev/null @@ -1,599 +0,0 @@ - - - - - - - - FreeMarker Manual - - - - - - - - -
    - - - - - -

    -FreeMarker Manual
    For FreeMarker 2.3.21
    -

    - -
    -

    - - Table of Contents - -  [Show detailed...]

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui.html b/fmpp/docs/freemarker/pgui.html deleted file mode 100644 index 2417003..0000000 --- a/fmpp/docs/freemarker/pgui.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - FreeMarker Manual - Programmer's Guide - - - - - - - - -
    - - - - - -

    -Part II   Programmer's Guide

    - - - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config.html b/fmpp/docs/freemarker/pgui_config.html deleted file mode 100644 index ffeb7a8..0000000 --- a/fmpp/docs/freemarker/pgui_config.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - FreeMarker Manual - The Configuration - - - - - - - - -
    - - - - - -

    -Chapter 3   The Configuration

    - -
    -

    - - Chapter Contents - -

    - - -
    - - -

    This is just an overview. See the FreeMarker Java API documentation for the - details.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config_basics.html b/fmpp/docs/freemarker/pgui_config_basics.html deleted file mode 100644 index 74db8b0..0000000 --- a/fmpp/docs/freemarker/pgui_config_basics.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - FreeMarker Manual - Basics - - - - - - - - -
    - - - - - -

    -Basics

    - - -

    First of all, be sure you have read the Getting Started - chapter.

    A configuration is a - freemarker.template.Configuration object that - stores your common (global, application level) settings and defines - variables that you want to be available in all templates (so called - shared variables). Also, it deals with the creation and caching of - Template instances.

    An application typically should use only a single shared - Configuration instance. More precisely, typically - you should have one Configuration instance per - independently developed components (like projects, modules, etc.) that - internally use FreeMarker, as each should create its own - instance.

    As running templates are influenced by the configuration - settings, each Template instance has a - Configuration instance associated with it, via the - corresponding Template constructor parameter. - Usually you obtain Template instances with - Configuration.getTemplate (not by directly calling - the Template constructor), in which case the - associated Configuration instance will be the one - whose getTemplate method has been called.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config_errorhandling.html b/fmpp/docs/freemarker/pgui_config_errorhandling.html deleted file mode 100644 index 1d55408..0000000 --- a/fmpp/docs/freemarker/pgui_config_errorhandling.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - FreeMarker Manual - Error handling - - - - - - - - -
    - - - - - -

    -Error handling

    - - - - - - - - - -

    -The possible exceptions

    - - -

    The exceptions that can occur regarding FreeMarker could be - classified like this:

    - -
    -
      -
    • -

      Exceptions occurring when you configure FreeMarker: - Typically you configure FreeMarker only once in your - application, when your application initializes itself. Of - course, during this, exceptions can occur, as it is obvious from - the FreeMarker API...

      -
    • - -
    • -

      Exceptions occurring when loading and parsing templates: - When you call - Configuration.getTemplate(...), - FreeMarker has to load the template file into the memory and - parse it (unless the template is already cached in - that Configuration object). During this, two - kind of exceptions can occur:

      - -
      -
        -
      • -

        IOException because the template - file was not found, or other I/O problem occurred while - trying to read it, for example you have no right to read the - file, or there are disk errors. The emitter of these errors - is the TemplateLoader - object, which is plugged into the - Configuration object. (For the sake of - correctness: When I say ``file'' here, that's a - simplification. For example, templates can be stored in a - table of a relational database as well. This is the business - of the TemplateLoader.)

        -
      • - -
      • -

        freemarker.core.ParseException - because the template file is syntactically incorrect - according the rules of the FTL language. The point is that - this error occurs when you obtain the - Template object - (Configuration.getTemplate(...)), - and not when you execute - (Template.process(...)) - the template. This exception is an - IOException subclass.

        -
      • -
      - -
    • - -
    • -

      Exceptions occurring when executing (processing) - templates, that is, when you call - Template.process(...). - Two kind of exceptions can occur:

      - -
      -
        -
      • -

        IOException because there was an - error when trying to write into the output writer.

        -
      • - -
      • -

        freemarker.template.TemplatException - because other problem occurred while executing the template. - For example, a frequent error is when a template refers to a - variable which is not existing. Be default, when a - TemplatException occurs, FreeMarker - prints the FTL error message and the stack trace to the - output writer with plain text format, and then aborts the - template execution by re-throwing the - TemplatException, which then you can - catch as - Template.process(...) - throws it. But this behavior can be customized. FreeMarker - always logs - TemplatException-s.

        -
      • -
      - -
    • -
    - - - - - - -

    -Customizing the behavior regarding TemplatException-s

    - - -

    TemplateException-s thrown during the - template processing are handled by the - freemarker.template.TemplateExceptionHandler - object, which is plugged into the Configuration - object with its - setTemplateExceptionHandler(...) - mehod. The TemplateExceptionHandler contains 1 - method:

    - -
    -
    -void handleTemplateException(TemplateException te, Environment env, Writer out) 
    -        throws TemplateException;  
    - - -

    Whenever a TemplateException occurs, this - method will be called. The exception to handle is passed with the - te argument, the runtime environment of the - template processing is accessible with the env - argument, and the handler can print to the output using the - out argument. If the method throws exception - (usually it re-throws te), then the template - processing will be aborted, and - Template.process(...) - will throw the same exception. If - handleTemplateException doesn't throw exception, - then template processing continues as if nothing had happen, but the - statement that caused the exception will be skipped (see more - later). Of course, the handler can still print an error indicator to - the output.

    - -

    In any case, before the - TemplateExceptionHandler is invoked, FreeMarker - will log the - exception.

    - -

    Let's see how FreeMarker skips ``statements'' when the error - handler doesn't throw exception, through examples. Assume we are - using this template exception handler:

    - -
    -
    -class MyTemplateExceptionHandler implements TemplateExceptionHandler {
    -    public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)
    -            throws TemplateException {
    -        try {
    -            out.write("[ERROR: " + te.getMessage() + "]");
    -        } catch (IOException e) {
    -            throw new TemplateException("Failed to print error message. Cause: " + e, env);
    -        }
    -    }
    -}
    -
    -...
    -
    -cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());  
    - - -

    If an error occurs in an interpolation which is not inside an - FTL tag (that is, not enclosed into - <#...> or - <@...>), then - the whole interpolation will be skipped. So this template (assuming - that badVar is missing from the - data-model):

    - -
    -
    -a${badVar}b  
    - - -

    will print this if we use the - MyTemplateExceptionHandler:

    - -
    -
    -a[ERROR: Expression badVar is undefined on line 1, column 4 in test.ftl.]b  
    - - -

    This template will print the same (except that the column - number will differ...):

    - -
    -
    -a${"moo" + badVar}b  
    - - -

    since, as it was written, the whole interpolation is skipped - if any error occurs inside it.

    - -

    If an error occurs when evaluating the value of a parameter - for a directive call, or if there are other problems with the - parameter list, or if an error occurs when evaluating - exp in - <@exp - ...>, or if the value of - exp is not an - user-defined directive, then the whole directive call is skipped. - For example this:

    - -
    -
    -a<#if badVar>Foo</#if>b  
    - - -

    will print this:

    - -
    -
    -a[ERROR: Expression badVar is undefined on line 1, column 7 in test.ftl.]b  
    - - -

    Note that the error occurred in the if - start-tag (<#if badVar>), but the whole - directive call was skipped. Logically, the nested content - (Foo) was skipped with this, since the nested - content is handled (printed) by the enclosing directive - (if).

    - -

    The output will be the same with this (except that the column - number will differ...):

    - -
    -
    -a<#if "foo${badVar}" == "foobar">Foo</#if>b  
    - - -

    since, as it was written, the whole directive calling will be - skipped if any error occurs during the parameter evaluation.

    - -

    The directive call will not be skipped if the error occurs - after the execution of the directive was already started. That is, - if an error occurs in the nested content:

    - -
    -
    -a
    -<#if true>
    -  Foo
    -  ${badVar}
    -  Bar
    -</#if>
    -c  
    - - -

    or in the macro definition body:

    - -
    -
    -a
    -<@test />
    -b
    -<#macro test>
    -  Foo
    -  ${badVar}
    -  Bar
    -</#macro>  
    - - -

    the output will be something like:

    - -
    -
    -a
    -  Foo
    -  [ERROR: Expression badVar is undefined on line 4, column 5 in test.ftl.]
    -  Bar
    -c  
    - - -

    FreeMarker comes with these prewritten error handlers:

    - -
    -
      -
    • -

      TemplateExceptionHandler.DEBUG_HANDLER: - Prints stack trace (includes FTL error message and FTL stack - trace) and re-throws the exception. This is the default handler - (that is, it is initially prugged into all new - Configuration objects).

      -
    • - -
    • -

      TemplateExceptionHandler.HTML_DEBUG_HANDLER: - Same as DEBUG_HANDLER, but it formats the - stack trace so that it will be readable with Web browsers. - Recommended over DEBUG_HANDLER when you - generate HTML pages.

      -
    • - -
    • -

      TemplateExceptionHandler.IGNORE_HANDLER: - Simply suppresses all exceptions (but remember, FreeMarker will - still log them). It does nothing to handle the event. It does - not re-throw the exception.

      -
    • - -
    • -

      TemplateExceptionHandler.RETHROW_HANDLER: - Simply re-throws all exceptions, it doesn't do anything else. - This handler can be good for Web applications (assuming you - don't want to continue template processing after exception), - because it gives the most control to the Web application over - page generation on error conditions (since FreeMarker doesn't - print anything to the output about the error). For more - information about handling errors in Web applications see the FAQ.

      -
    • -
    - - - - - - -

    -Explicit error handling in templates

    - - -

    Although it has nothing to do with the FreeMarker - configuration (the topic of this chapter), for the sake of - completeness it is mentioned here that you can handle errors - directly in templates as well. This is usually a bad practice (try - keep templates simple and non-technical), but nonetheless necessary - sometimes:

    - -
    -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config_settings.html b/fmpp/docs/freemarker/pgui_config_settings.html deleted file mode 100644 index d955bab..0000000 --- a/fmpp/docs/freemarker/pgui_config_settings.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - - FreeMarker Manual - Settings - - - - - - - - -
    - - - - - -

    -Settings

    - - -

    Settings are named values that - influence the behavior of FreeMarker. Examples of settings are: - locale, number_format

    Settings stored in Configuration instance can - be overridden in a Template instance. For example - you set "en_US" for the locale - setting in the configuration, then the locale in - all templates that use this configuration will be - "en_US", except in templates where the locale was - explicitly specified differently (see localization). Thus, - values in a Configuration serve as defaults that - can be overridden in a per template manner. The value comes from - Configuration instance or - Template instance can be further overridden for a - single Template.process call. For each such call a - freemarker.core.Environment object is created - internally that holds the runtime environment of the template - processing, including the setting values that were overridden on that - level. The values stored there can even be changed during the template - processing, so a template can set settings itself, like switching - locale at the middle of the output.

    This can be imagined as 3 layers - (Configuration, Template, - Environment) of settings, where the topmost layer - that contains the value for a certain setting provides the effective - value of that setting. For example (settings A to F are just imaginary - settings for this example):

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Setting ASetting BSetting CSetting DSetting ESetting F
    Layer 3: Environment1--1--
    Layer 2: Template22--2-
    Layer 1: Configuration3333--
    -
    -

    The effective value of settings will be: A = 1, B = 2, C = 3, D - = 1, E = 2. The F setting is probably null, or it - throws exception when you try to get it.

    Let's see exactly how to set settings:

    -
      -
    • -

      Configuration layer: In principle you set - the settings with the setter methods of the - Configuration object, fore example:

      - -
      -
      -Configuration myCfg = new Configuration(Configuration.VERSION_2_3_21);
      -myCfg.setLocale(java.util.Locale.ITALY);
      -myCfg.setNumberFormat("0.####");  
      - - -

      You do it before you start to actually use the - Configuration object (typically, when you - initialize the application); you should treat the object as - read-only after that.

      - -

      In practice, in most Web application frameworks you have to - specify the setting in a framework-specific configuration file - that require specifying setting as String - name-value pairs (like in a .properties file). - In that case the authors of the frameworks most probably use the - setSetting(String name, String value) method of - Configuration; see available setting names and - the format of the values in the API doc of - setSetting. Example for Spring - Framework:

      - -
      -
      -<bean id="freemarkerConfig"
      -    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
      -  <property name="freemarkerSettings">
      -    <props>
      -      <prop key="incompatible_improvements">2.3.21</prop>
      -      <prop key="locale">it_IT</prop>
      -      <prop key="number_format">0.####</prop>
      -    </props>
      -  </property>
      -</bean>  
      - - -

      Note that this kind of configuring - (String key-value pairs) is unfortunately - limited compared to directly using the API of - Configuration.

      -
    • - -
    • -

      Template layer: The - locale setting of the template is set by - Configuration.getTemplate(...) to the requested - locale. Otherwise you shouldn't set settings here, unless you - manage the Template objects instead of a - freemarker.cache.TemplateCache, in which case - you should set the setting before the Template - object is first used, and then treat the - Template object as read-only.

      -
    • - -
    • -

      Environment layer: There are two ways - doing it:

      - -
      -
        -
      • -

        With Java API: Use the setter methods of the - Environment object. Certainly you want to - do that just before the processing of the template is started, - and then you run into the problem that when you call - myTemplate.process(...) it creates the - Environment object internally and the - immediately processes the template, so you had no chance. The - solution is that this two steps can be separated like - this:

        - -
        -
        -Environment env = myTemplate.createProcessingEnvironment(root, out);
        -env.setLocale(java.util.Locale.ITALY);
        -env.setNumberFormat("0.####");
        -env.process();  // process the template  
        - -
      • - -
      • -

        Directly in the Template (considered as bad style, - usually): Use the setting - directive, for example:

        - -
        -
        -<#setting locale="it_IT">
        -<#setting number_format="0.####">  
        - -
      • -
      - - -

      There are no restriction regarding when can you change the - settings in this layer.

      -
    • -
    -

    To see the list of supported settings and their meaning, please - read the following parts of the FreeMarker Java API - documentation:

    -
      -
    • -

      Setter methods of - freemarker.core.Configurable for the settings - that are in all three layers

      -
    • - -
    • -

      Setter methods of - freemarker.template.Configuration for the - settings that are available only in the - Configuration layer

      -
    • - -
    • -

      freemarker.core.Configurable.setSetting(String, - String) for settings that are available in all three - layers and are writable with String key-value - pairs.

      -
    • - -
    • -

      freemarker.template.Configuration.setSetting(String, - String) for settings that are available only in the - Configuration layer and are writable with - String key-value pairs.

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config_sharedvariables.html b/fmpp/docs/freemarker/pgui_config_sharedvariables.html deleted file mode 100644 index af200b4..0000000 --- a/fmpp/docs/freemarker/pgui_config_sharedvariables.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - FreeMarker Manual - Shared variables - - - - - - - - -
    - - - - - -

    -Shared variables

    - - -

    Shared variables are variables - that are defined for all templates. You can add shared variables to - the configuration with the setSharedVariable - methods:

    -
    -Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
    -...
    -cfg.setSharedVariable("warp", new WarpDirective());
    -cfg.setSharedVariable("company", "Foo Inc.");  
    -

    In all templates that use this configuration, an user-defined - directive with name wrap and a string with name - company will be visible in the data-model root, so - you don't have to add them to the root hash again and again. A - variable in the root object that you pass to the - Template.process will hide the shared variable with - the same name.

    -

    Warning!

    - -

    Never use TemplateModel implementation that - is not thread-safe for - shared variables, if the configuration is used by multiple threads! - This is the typical situation for Servlet based Web sites.

    -
    -

    Due to backward compatibility heritage, the set of shared - variables is initially (i.e., for a new - Configuration instance) not empty. It contains the - following user-defined directives (they are "user-defined" in the - sense that you use @ to call them instead of - #):

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    nameclass
    capture_outputfreemarker.template.utility.CaptureOutput
    compressfreemarker.template.utility.StandardCompress
    html_escapefreemarker.template.utility.HtmlEscape
    normalize_newlinesfreemarker.template.utility.NormalizeNewlines
    xml_escapefreemarker.template.utility.XmlEscape
    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_config_templateloading.html b/fmpp/docs/freemarker/pgui_config_templateloading.html deleted file mode 100644 index 9455b32..0000000 --- a/fmpp/docs/freemarker/pgui_config_templateloading.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - - FreeMarker Manual - Template loading - - - - - - - - -
    - - - - - -

    -Template loading

    - - - - - - - - - -

    -Template loaders

    - - - - -

    Template loaders are objects that load raw textual data based - on abstract template paths like "index.ftl" or - "products/catalog.ftl". It is up to the concrete - template loader object what source does it use to fetch the - requested data (files in a directory, data base, etc.). When you - call cfg.getTemplate (where - cfg is a Configuration - instance), FreeMarker ask the template loader you have set up for - the cfg to return the text for the given template - path, and then FreeMarker parses that text as template.

    - - - - - - -

    -Built-in template loaders

    - - -

    You can set up three template loading methods in the - Configuration using the following convenience - methods. (Each method will create a template loader object - internally and set up the Configuration - instance to use that.)

    - -
    -
    -void setDirectoryForTemplateLoading(File dir);  
    - - -

    or

    - -
    -
    -void setClassForTemplateLoading(Class cl, String prefix);  
    - - -

    or

    - -
    -
    -void setServletContextForTemplateLoading(Object servletContext, String path);  
    - - -

    The first method above sets an explicit directory on the - file system from which to load templates. Needless to say perhaps, - the File parameter must be an existing - directory. Otherwise, an exception will be thrown.

    - -

    The second call takes a Class as a - parameter and a prefix. This is for when you want to load - templates via the same mechanism that a java - ClassLoader uses to load classes. This means - that the class you pass in will be used to call - Class.getResource() to find the templates. The - prefix parameter is prepended to the name of - the template. The classloading mechanism will very likely be the - preferred means of loading templates for production code, since - loading from the classpath mechanism is usually more foolproof - than specifying an explicit directory location on the file system. - It is also nicer in a final application to keep everything in a - .jar file that the user can simply execute - directly and have all the icons and text and everything else - inside the .jar file.

    - -

    The third call takes the context of your web application, - and a base path, which is interpreted relative to the web - application root directory (that's the parent of the - WEB-INF directory). This loader will load the - templates from the web application directory. Note that we refer - to "directory" here although this loading method works even for - unpacked .war files since it uses - ServletContext.getResource() to access the - templates. If you omit the second parameter (or use - ""), you can simply store the static files - (.html, .jpg, etc.) mixed - with the .ftl files, just - .ftl files will be sent to the client - processed. Of course, you must set up a Servlet for the - *.ftl uri-pattern in - WEB-INF/web.xml for this, otherwise the client - will get the templates as is, and thus may see confidential - content! You should not use empty path if this is a problem for - your site, rather you should store the templates somewhere inside - the WEB-INF directory, so the raw templates are - never served accidentally. This mechanism will very likely be the - preferred means of loading templates for servlet applications, - since the templates can be updated without restarting the web - application, while this often doesn't work with the class-loader - mechanism.

    - - - - - - - -

    -Loading templates from multiple locations

    - - -

    If you need to load templates from multiple locations, you - have to instantiate the template loader objects for every - location, wrap them into a special template loader named - MultiTemplateLoader and finally pass that - loader to the setTemplateLoader(TemplateLoader - loader) method of Configuration. - Here's an example for loading templates from two distinct - directories and with the class-loader:

    - -
    -
    -import freemarker.cache.*; // template loaders live in this package
    -
    -...
    -
    -FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));
    -FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));
    -ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "");
    -TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
    -MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
    -
    -cfg.setTemplateLoader(mtl);  
    - - -

    Now FreeMarker will try to load templates from - /tmp/templates directory, and if it does not - find the requested template there, it will try to load that from - /usr/data/templates, and if it still does not - find the requested template, then it tries to load that with the - class-loader.

    - - - - - - - -

    -Loading templates from other sources

    - - -

    If none of the built-in class loaders are good for you, you - will have to write your own class that implements the - freemarker.cache.TemplateLoader interface and - pass it to the setTemplateLoader(TemplateLoader - loader) method of Configuration. - Please read the API JavaDoc for more information.

    - -

    If your template source accesses the templates through an - URL, you needn't implement a TemplateLoader - from scratch; you can choose to subclass - freemarker.cache.URLTemplateLoader instead and - just implement the URL getURL(String - templateName) method.

    - - - - - - - -

    -The template path (template name)

    - - - - - - - - -

    It is up to the template loader how it interprets template - paths (also known as template names). But to work together with - other components there are restrictions regarding the format of - the path. In general, it is strongly recommended that template - loaders use URL-style paths. The path must not use - /, ./ and - ../ and :// with other - meaning than they have in URL paths (or in UN*X paths). The - characters * and ? are also - reserved. FreeMarker always normalizes the paths before passing - them to the template loader, so the paths don't contain - /../ or such, and are relative to the imaginary - template root directory (that is, they don't start with - /).

    - -

    Note that FreeMarker template path should always uses slash - (not backslash) regardless of the host OS.

    - - - - - - -

    -Template caching

    - - - - - - -

    FreeMarker caches templates (assuming you use the - Configuration methods to create - Template objects). This means that when you call - getTemplate, FreeMarker not only returns the - resulting Template object, but stores it in a - cache, so when next time you call getTemplate - with the same (or equivalent) path, it just returns the cached - Template instance, and will not load and parse - the template file again.

    - -

    If you change the template file, then FreeMarker will re-load - and re-parse the template automatically when you get the template - next time. However, since checking if the file has been changed can - be time consuming, there is a Configuration level - setting called ``update delay''. This is the time that must elapse - since the last checking for a newer version of a certain template - before FreeMarker will check that again. This is set to 5 seconds by - default. If you want to see the changes of templates immediately, - set it to 0. Note that some template loaders may have problems with - template updating. For example, class-loader based template loaders - typically do not notice that you have changed the template - file.

    - -

    A template will be removed from the cache if you call - getTemplate and FreeMarker realizes that the - template file has been removed meanwhile. Also, if the JVM thinks - that it begins to run out of memory, by default it can arbitrarily - drop templates from the cache. Furthermore, you can empty the cache - manually with the clearTemplateCache method of - Configuration.

    - -

    The actual strategy of when a cached template should be thrown - away is pluggable with the cache_storage setting, - by which you can plug any CacheStorage - implementation. For most users - freemarker.cache.MruCacheStorage will be - sufficient. This cache storage implements a two-level Most Recently - Used cache. In the first level, items are strongly referenced up to - the specified maximum (strongly referenced items can't be dropped by - the JVM, as opposed to softly referenced items). When the maximum is - exceeded, the least recently used item is moved into the second - level cache, where they are softly referenced, up to another - specified maximum. The size of the strong and soft parts can be - specified with the constructor. For example, set the size of the - strong part to 20, and the size of soft part to 250:

    - -
    -
    -cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))  
    - - -

    Or, since MruCacheStorage is the default - cache storage implementation:

    - -
    -
    -cfg.setSetting(Configuration.CACHE_STORAGE_KEY, "strong:20, soft:250");  
    - - -

    When you create a new Configuration object, - initially it uses an MruCacheStorage where - strongSizeLimit is 0, and - softSizeLimit is - Integer.MAX_VALUE (that is, in practice, - infinite). But using non-0 strongSizeLimit is - maybe a better strategy for high load servers, since it seems that, - with only softly referenced items, JVM tends to cause just higher - resource consumption if the resource consumption was already high, - because it constantly throws frequently used templates from the - cache, which then have to be re-loaded and re-parsed.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel.html b/fmpp/docs/freemarker/pgui_datamodel.html deleted file mode 100644 index 4c7132f..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - FreeMarker Manual - The Data Model - - - - - - - - -
    - - - - - -

    -Chapter 2   The Data Model

    - -
    -

    - - Chapter Contents - -

    - - -
    - - -

    This is just an introductory explanation. See the FreeMarker Java API documentation for more - detailed information.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_basics.html b/fmpp/docs/freemarker/pgui_datamodel_basics.html deleted file mode 100644 index 3ff9cd1..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_basics.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - FreeMarker Manual - Basics - - - - - - - - -
    - - - - - -

    -Basics

    - - -

    You have seen how to build a data-model in the Getting Started using the standard - Java classes (Map, String, - etc.). Internally, the variables available in the template are java - objects that implement the - freemarker.template.TemplateModel interface. But - you could use standard java collections as variables in your - data-model, because these were replaced with the appropriate - TemplateModel instances behind the scenes. This - facility is called object wrapping. - The object wrapping facility can convert any kind - of object transparently to the instances of classes that implement - TemplateModel interface. This makes it possible, - for example, to access java.sql.ResultSet as - sequence variable in templates, or to access - javax.servlet.ServletRequest objects as a hash - variable that contains the request attributes, or even to traverse XML - documents as FTL variables (see here). To - wrap (convert) these objects, however, you need to plug the proper, so - called, object wrapper implementation (possibly your custom - implementation); this will be discussed later. The meat for now - is that any object that you want to access from the templates, sooner - or later must be converted to an object that implements - TemplateModel interface. So first you should - familiarize yourself with writing of TemplateModel - implementations.

    There is roughly one - freemarker.template.TemplateModel descendant - interface corresponding to each basic type of variable - (TemplateHashModel for hashes, - TemplateSequenceModel sequences, - TemplateNumberModel for numbers, etc.). For - example, if you want to expose a java.sql.ResultSet - as a sequence for the templates, then you have to write a - TemplateSequenceModel implementation that can read - java.sql.ResultSet-s. We used to say on this, that - you wrap the - java.sql.ResultSet with your - TemplateModel implementation, as basically you just - encapsulate the java.sql.ResultSet to provide - access to it with the common TemplateSequenceModel - interface. Note that a class can implement multiple - TemplateModel interfaces; this is why FTL variables - can have multiple types (see: Template Author's Guide/Values, Types/Basics)

    Note that a trivial implementation of these interfaces is - provided with the freemarker.template package. For - example, to convert a String to FTL string - variable, you can use SimpleScalar, to convert a - java.util.Map to FTL hash variable, you can use - SimpleHash, etc.

    An easy way to try your own TemplateModel - implementation, is to create an instance of that, and drop it directly - into the data-model (as put it into the root hash). - The object wrapper will expose it untouched for the template, as it - already implements TemplateModel, so no conversion - (wrapping) needed. (This trick is also useful in cases when you do not - want the object wrapper to try to wrap (convert) a certain - object.)

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_directive.html b/fmpp/docs/freemarker/pgui_datamodel_directive.html deleted file mode 100644 index 5a8ffe5..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_directive.html +++ /dev/null @@ -1,480 +0,0 @@ - - - - - - - - FreeMarker Manual - Directives - - - - - - - - -
    - - - - - -

    -Directives

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Java programmers can implement user-defined directives in Java - using the TemplateDirectiveModel interface. See in - the API documentation.

    -

    Note

    - -

    TemplateDirectiveModel was introduced in - FreeMarker 2.3.11, replacing the soon to be depreciated - TemplateTransformModel.

    -
    - - - - - -

    -Example 1

    - - -

    We will implement a directive which converts all output - between its start-tag and end-tag to upper case. Like, this - template:

    - -
    -
    -foo
    -<@upper>
    -  bar
    -  <#-- All kind of FTL is allowed here -->
    -  <#list ["red", "green", "blue"] as color>
    -    ${color}
    -  </#list>
    -  baaz
    -</@upper>
    -wombat  
    - - -

    will output this:

    - -
    -
    -foo
    -  BAR
    -    RED
    -    GREEN
    -    BLUE
    -  BAAZ
    -wombat  
    - - -

    This is the source code of the directive class:

    - -
    -
    -package com.example;
    -import java.io.IOException;
    -import java.io.Writer;
    -import java.util.Map;
    -
    -import freemarker.core.Environment;
    -import freemarker.template.TemplateDirectiveBody;
    -import freemarker.template.TemplateDirectiveModel;
    -import freemarker.template.TemplateException;
    -import freemarker.template.TemplateModel;
    -import freemarker.template.TemplateModelException;
    -
    -/**
    - *  FreeMarker user-defined directive that progressively transforms
    - *  the output of its nested content to upper-case.
    - *  
    - *  
    - *  <p><b>Directive info</b></p>
    - * 
    - *  <p>Directive parameters: None
    - *  <p>Loop variables: None
    - *  <p>Directive nested content: Yes
    - */
    -public class UpperDirective implements TemplateDirectiveModel {
    -    
    -    public void execute(Environment env,
    -            Map params, TemplateModel[] loopVars,
    -            TemplateDirectiveBody body)
    -            throws TemplateException, IOException {
    -        // Check if no parameters were given:
    -        if (!params.isEmpty()) {
    -            throw new TemplateModelException(
    -                    "This directive doesn't allow parameters.");
    -        }
    -        if (loopVars.length != 0) {
    -                throw new TemplateModelException(
    -                    "This directive doesn't allow loop variables.");
    -        }
    -        
    -        // If there is non-empty nested content:
    -        if (body != null) {
    -            // Executes the nested body. Same as <#nested> in FTL, except
    -            // that we use our own writer instead of the current output writer.
    -            body.render(new UpperCaseFilterWriter(env.getOut()));
    -        } else {
    -            throw new RuntimeException("missing body");
    -        }
    -    }
    -    
    -    /**
    -     * A {@link Writer} that transforms the character stream to upper case
    -     * and forwards it to another {@link Writer}.
    -     */ 
    -    private static class UpperCaseFilterWriter extends Writer {
    -       
    -        private final Writer out;
    -           
    -        UpperCaseFilterWriter (Writer out) {
    -            this.out = out;
    -        }
    -
    -        public void write(char[] cbuf, int off, int len)
    -                throws IOException {
    -            char[] transformedCbuf = new char[len];
    -            for (int i = 0; i < len; i++) {
    -                transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
    -            }
    -            out.write(transformedCbuf);
    -        }
    -
    -        public void flush() throws IOException {
    -            out.flush();
    -        }
    -
    -        public void close() throws IOException {
    -            out.close();
    -        }
    -    }
    -
    -}  
    - - -

    Now we still need to create an instance of this class, and - make this directive available to the template with the name "upper" - (or with whatever name we want) somehow. A possible solution is to - put the directive in the data-model:

    - -
    -
    -root.put("upper", new com.example.UpperDirective());  
    - - -

    But typically it is better practice to put commonly used - directives into the Configuration as shared - variables.

    - -

    It is also possible to put the directive into an FTL library - (collection of macros and like in a template, that you - include or import in other - templates) using the new - built-in:

    - -
    -
    -<#-- Maybe you have directives that you have implemented in FTL -->
    -<#macro something>
    -  ...
    -</#macro>
    -
    -<#-- Now you can't use <#macro upper>, but instead you can: -->
    -<#assign upper = "com.example.UpperDirective"?new()>  
    - - - - - - -

    -Example 2

    - - -

    We will create a directive that executes its nested content - again and again for the specified number of times (similarly to - list directive), optionally separating the the - output of the repetations with a <hr>-s. - Let's call this directive "repeat". Example template:

    - -
    -
    -<#assign x = 1>
    -
    -<@repeat count=4>
    -  Test ${x}
    -  <#assign x = x + 1>
    -</@repeat>
    -
    -<@repeat count=3 hr=true>
    -  Test
    -</@repeat>
    -
    -<@repeat count=3; cnt>
    -  ${cnt}. Test
    -</@repeat>  
    - - -

    Output:

    - -
    -
    -  Test 1
    -  Test 2
    -  Test 3
    -  Test 4
    -
    -  Test
    -<hr>  Test
    -<hr>  Test
    -
    -  1. Test
    -  2. Test
    -  3. Test
    -   
    - - -

    The class:

    - -
    -
    -package com.example;
    -import java.io.IOException;
    -import java.io.Writer;
    -import java.util.Iterator;
    -import java.util.Map;
    -
    -import freemarker.core.Environment;
    -import freemarker.template.SimpleNumber;
    -import freemarker.template.TemplateBooleanModel;
    -import freemarker.template.TemplateDirectiveBody;
    -import freemarker.template.TemplateDirectiveModel;
    -import freemarker.template.TemplateException;
    -import freemarker.template.TemplateModel;
    -import freemarker.template.TemplateModelException;
    -import freemarker.template.TemplateNumberModel;
    -
    -/**
    - * FreeMarker user-defined directive for repeating a section of a template,
    - * optionally with separating the output of the repetations with
    - * <tt>&lt;hr></tt>-s.
    - *
    - * 
    - * <p><b>Directive info</b></p>
    - * 
    - * <p>Parameters:
    - * <ul>
    - *   <li><code>count</code>: The number of repetations. Required!
    - *       Must be a non-negative number. If it is not a whole number then it will
    - *       be rounded <em>down</em>.
    - *   <li><code>hr</code>: Tells if a HTML "hr" element could be printed between
    - *       repetations. Boolean. Optional, defaults to <code>false</code>. 
    - * </ul>
    - *
    - * <p>Loop variables: One, optional. It gives the number of the current
    - *    repetation, starting from 1.
    - * 
    - * <p>Nested content: Yes
    - */
    -public class RepeatDirective implements TemplateDirectiveModel {
    -    
    -    private static final String PARAM_NAME_COUNT = "count";
    -    private static final String PARAM_NAME_HR = "hr";
    -    
    -    public void execute(Environment env,
    -            Map params, TemplateModel[] loopVars,
    -            TemplateDirectiveBody body)
    -            throws TemplateException, IOException {
    -        
    -        // ---------------------------------------------------------------------
    -        // Processing the parameters:
    -        
    -        int countParam = 0;
    -        boolean countParamSet = false;
    -        boolean hrParam = false;
    -        
    -        Iterator paramIter = params.entrySet().iterator();
    -        while (paramIter.hasNext()) {
    -            Map.Entry ent = (Map.Entry) paramIter.next();
    -            
    -            String paramName = (String) ent.getKey();
    -            TemplateModel paramValue = (TemplateModel) ent.getValue();
    -            
    -            if (paramName.equals(PARAM_NAME_COUNT)) {
    -                if (!(paramValue instanceof TemplateNumberModel)) {
    -                    throw new TemplateModelException(
    -                            "The \"" + PARAM_NAME_HR + "\" parameter "
    -                            + "must be a number.");
    -                }
    -                countParam = ((TemplateNumberModel) paramValue)
    -                        .getAsNumber().intValue();
    -                countParamSet = true;
    -                if (countParam < 0) {
    -                    throw new TemplateModelException(
    -                            "The \"" + PARAM_NAME_HR + "\" parameter "
    -                            + "can't be negative.");
    -                }
    -            } else if (paramName.equals(PARAM_NAME_HR)) {
    -                if (!(paramValue instanceof TemplateBooleanModel)) {
    -                    throw new TemplateModelException(
    -                            "The \"" + PARAM_NAME_HR + "\" parameter "
    -                            + "must be a boolean.");
    -                }
    -                hrParam = ((TemplateBooleanModel) paramValue)
    -                        .getAsBoolean();
    -            } else {
    -                throw new TemplateModelException(
    -                        "Unsupported parameter: " + paramName);
    -            }
    -        }
    -        if (!countParamSet) {
    -                throw new TemplateModelException(
    -                        "The required \"" + PARAM_NAME_COUNT + "\" paramter"
    -                        + "is missing.");
    -        }
    -        
    -        if (loopVars.length > 1) {
    -                throw new TemplateModelException(
    -                        "At most one loop variable is allowed.");
    -        }
    -        
    -        // Yeah, it was long and boring...
    -        
    -        // ---------------------------------------------------------------------
    -        // Do the actual directive execution:
    -        
    -        Writer out = env.getOut();
    -        if (body != null) {
    -            for (int i = 0; i < countParam; i++) {
    -                // Prints a <hr> between all repetations if the "hr" parameter
    -                // was true:
    -                if (hrParam && i != 0) {
    -                    out.write("<hr>");
    -                }
    -                
    -                // Set the loop variable, if there is one:
    -                if (loopVars.length > 0) {
    -                    loopVars[0] = new SimpleNumber(i + 1);
    -                }
    -                
    -                // Executes the nested body (same as <#nested> in FTL). In this
    -                // case we don't provide a special writer as the parameter:
    -                body.render(env.getOut());
    -            }
    -        }
    -    }
    -
    -}  
    - - - - - - -

    -Notices

    - - -

    It's important that a - TemplateDirectiveModel object usually should not - be stateful. The typical mistake is the storing of the state of the - directive call execution in the fields of the object. Think of - nested calls of the same directive, or directive objects used as - shared variables accessed by multiple threads concurrently.

    - -

    Unfortunatelly, TemplateDirectiveModel-s - don't support passing parameters by position (rather than by name). - This is fixed starting from FreeMarker 2.4.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_method.html b/fmpp/docs/freemarker/pgui_datamodel_method.html deleted file mode 100644 index 66d4b1a..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_method.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - FreeMarker Manual - Methods - - - - - - - - -
    - - - - - -

    -Methods

    - - -

    Method variables exposed to a template implement the - TemplateMethodModel interface. This contains one - method: TemplateModel exec(java.util.List - arguments). When you call a method with a method call expression, - then the exec method will be called. The arguments - parameter will contain the values of the FTL method call arguments. - The return value of exec gives the value of the FTL - method call expression.

    The TemplateMethodModelEx interface extends - TemplateMethodModel. It does not add any new - methods. The fact that the object implements this - marker interface indicates to the FTL engine that - the arguments should be put to the java.util.List - directly as TemplateModel-s. Otherwise they will be - put to the list as String-s.

    For obvious reasons there is no default implementation for these - interfaces.

    Example: This is a method, which returns the index within the - second string of the first occurrence of the first string, or -1 if - the second string doesn't contains the first.

    -
    -public class IndexOfMethod implements TemplateMethodModel {
    -    
    -    public TemplateModel exec(List args) throws TemplateModelException {
    -        if (args.size() != 2) {
    -            throw new TemplateModelException("Wrong arguments");
    -        }
    -        return new SimpleNumber(
    -            ((String) args.get(1)).indexOf((String) args.get(0)));
    -    }
    -}  
    -

    If you put an instance of this, say, into the root:

    -
    -root.put("indexOf", new IndexOfMethod());  
    -

    then you can call it in the template:

    -
    -<#assign x = "something">
    -${indexOf("met", x)}
    -${indexOf("foo", x)}  
    -

    and then the output will be:

    -
    -2
    --1  
    -

    If you need to access the runtime FTL environment (read/write - variables, get the current locale, etc.), you can get it with - Environment.getCurrentEnvironment().

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_node.html b/fmpp/docs/freemarker/pgui_datamodel_node.html deleted file mode 100644 index 6a076c8..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_node.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - FreeMarker Manual - Node variables - - - - - - - - -
    - - - - - -

    -Node variables

    - - -

    A node variable embodies a node in a tree structure. Node - variables were introduced to help the handling of - XML documents in the data-model, but they can be used for the - modeling of other tree structures as well. For more information about - nodes from the point of view of the template language read this earlier section.

    A node variable has the following properties, provided by the - methods of TemplateNodeModel interface:

    -
      -
    • -

      Basic properties:

      - -
      -
        -
      • -

        TemplateSequenceModel - getChildNodes(): A node has sequence of children - (except if the node is a leaf node, in which case the method - return an empty sequence or null). The child nodes should be - node variables as well.

        -
      • - -
      • -

        TemplateNodeModel getParentNode(): A - node has exactly 1 parent node, except if the node is root - node of the tree, in which case the method returns - null.

        -
      • -
      - -
    • - -
    • -

      Optional properties. If a property does not make sense in - the concrete use case, the corresponding method should return - null:

      - -
      -
        -
      • -

        String getNodeName(): The node name - is the name of the macro, that handles the node when you use - recurse - and visit - directives. Thus, if you want to use these directives with the - node, the node name is required.

        -
      • - -
      • -

        String getNodeType(): In the case of - XML: "element", "text", - "comment", ...etc. This information, if - available, is used by the recurse and - visit directives to find the default - handler macro for a node. Also it can be useful for other - application specific purposes.

        -
      • - -
      • -

        String getNamespaceURI(): The node - namespace (has nothing to do with FTL namespaces used for - libraries) this node belongs to. For example, in the case of - XML, this is the URI of the XML namespace the element or - attribute belongs to. This information, if available, is used - by the recurse and visit - directives to find the FTL namespaces that store the handler - macros.

        -
      • -
      - -
    • -
    -

    On the FTL side, the direct utilization of node properties is - done with node built-ins, and - with the visit and recurse - macros.

    In most use cases, variables that implement - TemplateNodeModel, implement other interfaces as - well, since node variable properties just provide the basic - infrastructure for navigating between nodes. For a concrete example, - see how FreeMarker deals with XML.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_objectWrapper.html b/fmpp/docs/freemarker/pgui_datamodel_objectWrapper.html deleted file mode 100644 index 28b2272..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_objectWrapper.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - FreeMarker Manual - Object wrappers - - - - - - - - -
    - - - - - -

    -Object wrappers

    - - -

    When you add something to a container, it may receive any Java - object as a parameter, not necessarily a - TemplateModel, as you could see in the FreeMarker - API. This is because the container implementation can silently replace - that object with the appropriate TemplateModel - object. For example if you add a String to the - container, perhaps it will be replaced with a - SimpleScalar instance which stores the same - text.

    As for when the replacement occurs, it's the business of the - container in question (i.e. the business of the class that implements - the container interface), but it must happen at the latest when you - get the subvariable, as the getter methods (according to the - interfaces) return TemplateModel, not - Object. For example, SimpleHash, - SimpleSequence and - SimpleCollection use the laziest strategy; they - replace a non-TemplateModel subvariable with an - appropriate TemplateModel object when you get the - subvariable for the first time.

    As for what java objects can be replaced, and with what - TemplateModel implementations, it is either handled - by the container implementation itself, or it delegates this to an - ObjectWrapper instance. - ObjectWrapper is an interface that specifies one - method: TemplateModel wrap(java.lang.Object obj). - You pass in an Object, and it returns the - corresponding TemplateModel object, or throws a - TemplateModelException if this is not possible. The - replacement rules are coded into the ObjectWrapper - implementation.

    The most important ObjectWrapper - implementations that the FreeMarker core provides are:

    -
      -
    • -

      freemarker.template.DefaultObjectWrapper: - It replaces String with - SimpleScalar, Number with - SimpleNumber, List and array - with SimpleSequence, Map - with SimpleHash, Boolean - with TemplateBooleanModel.TRUE or - TemplateBooleanModel.FALSE, W3C DOM nodes with - freemarker.ext.dom.NodeModel. For Jython - objects, this wrapper will invoke - freemarker.ext.jython.JythonWrapper. For all - other objects, it will invoke BeansWrapper.

      -
    • - -
    • -

      freemarker.ext.beans.BeansWrapper: It can - expose JavaBean properties and other members of arbitrary objects - using Java reflection; there is a separated chapter about it. - DefaultObjectWrapper extends this - wrapper.

      -
    • -
    -

    For a concrete example, let's see how the - SimpleXxx classes - work:

    -
    -Map map = new HashMap();
    -map.put("anotherString", "blah");
    -map.put("anotherNumber", new Double(3.14));
    -List list = new ArrayList();
    -list.add("red");
    -list.add("green");
    -list.add("blue");
    -
    -// Get the object wrapper we will use. The details of the
    -// construction aren't important now (see JavaDocs for that):
    -ObjectWrapper wrapper
    -        = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_21)
    -          .build();
    -
    -// Normaly, you would create a plain java.util.HashMap here, and
    -// later let the ObjectWrapper wrap it in Template.process(...).
    -// But for demonstration purposes we will bypass the object wrapper
    -// and create a SimpleHash directly that's like the wrapper would
    -// create:
    -SimpleHash root = new SimpleHash(wrapper);
    -root.put("theString", "wombat");
    -root.put("theNumber", new Integer(8));
    -root.put("theMap", map);
    -root.put("theList", list);  
    -

    Assuming that root is the data-model root, - the resulting data-model is:

    -
    -(root)
    - |
    - +- theString = "wombat"
    - |
    - +- theNumber = 8
    - |
    - +- theMap
    - |   |
    - |   +- anotherString = "blah"
    - |   |
    - |   +- anotherNumber = 3.14
    - |
    - +- theList
    -     |
    -     +- (1st) = "red"
    -     |
    -     +- (2nd) = "green"
    -     |
    -     +- (3rd) = "blue"  
    -

    Note that the Object-s inside - theMap and theList are - accessible as subvariables too. This is because when you, say, try to - access theMap.anotherString, then the - SimpleHash (which is used as root hash here) will - silently replace the Map - (theMap) with a SimpleHash - instance that uses the same wrapper as the root hash, so when you try - to access the anotherString subvariable of it, it - will replace that with a SimpleScalar.

    If you drop an ``arbitrary'' object into the data-model, - DefaultObjectWrapper will fall back to - BeansWrapper to wrap the it:

    -
    -SimpleHash root = new SimpleHash(wrapper);
    -// expose a "simple" java objects:
    -root.put("theString", "wombat");
    -// expose an "arbitrary" java objects:
    -root.put("theObject", new TestObject("green mouse", 1200));  
    -

    Assuming this is TestObject:

    -
    -public class TestObject {
    -    private String name;
    -    private int price;
    -
    -    public TestObject(String name, int price) {
    -        this.name = name;
    -        this.price = price;
    -    }
    -
    -    // JavaBean properties
    -    // Note that public fields are not visible directly;
    -    // you must write a getter method for them.
    -    public String getName() {return name;}
    -    public int getPrice() {return price;}
    -    
    -    // A method
    -    public double sin(double x) {
    -        return Math.sin(x);
    -    }
    -}  
    -

    The data-model will be:

    -
    -(root)
    - |
    - +- theString = "wombat"
    - |
    - +- theObject
    -     |
    -     +- name = "green mouse"
    -     |
    -     +- price = 1200
    -     |
    -     +- number sin(number)  
    -

    So we can merge it with this template:

    -
    -${theObject.name}
    -${theObject.price}
    -${theObject.sin(123)}  
    -

    Which will output:

    -
    -green mouse
    -1200
    --0,45990349068959124  
    -

    You have seen in earlier examples of this manual that we have - used java.util.HashMap as root hash, and not - SimpleHash or other FreeMarker specific class. It - works because - Template.process(...) - automatically wraps the object you give as its data-model argument. It - uses the object wrapper dictated by the - Configuration level setting, - object_wrapper (unless you explicitly specify an - ObjectWrapper as its parameter). Thus, in simple - FreeMarker application you need not know about - TemplateModel-s at all. Note that the root need not - be a java.util.Map. It can be anything that is - wrapped so that it implements the TemplateHashModel - interface.

    You can configure what ObjectWrapper - FreeMarker uses with - cfg.setObjectWrapper(ObjectWrapper), where - cfg is the Configuration - instance. Note that you can plug in your custom - ObjectWrapper implementation here, hence you have - full control over how templates see the data-model.

    For TemplateModel implementations that wrap - basic Java container types, as java.util.Map-s and - java.util.List-s, the convention is that they use - the same object wrapper to wrap their subvariables as their parent - container does (that's why the SimpleHash - constructor has an ObjectWrapper parameter). - Technically correctly said, they are instantiated by their parent - container (so it has full control over the creation of them), and the - parent container create them so they will use the same object wrapper - as the parent itself. Thus, if wrapper is used for - the wrapping of the root hash (see it in the examples above), it will - be used for the wrapping of the subvariables (and the subvariables of - the subvariables, etc.) as well. This is exactly the same phenomenon - as you have seen with theMap.anotherString - earlier.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_parent.html b/fmpp/docs/freemarker/pgui_datamodel_parent.html deleted file mode 100644 index f633c28..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_parent.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - FreeMarker Manual - Containers - - - - - - - - -
    - - - - - -

    -Containers

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    These are hashes, sequences, and collections.

    - - - - -

    -Hashes

    - - - - -

    Hashes are java objects that implement - TemplateHashModel interface. - TemplateHashModel contains two methods: - TemplateModel get(String key), which returns the - subvariable of the given name, and boolean - isEmpty(), which indicates if the hash has zero - subvariable or not. The get method returns null - if no subvariable with the given name exists.

    - -

    The TemplateHashModelEx interface extends - TemplateHashModel. It adds methods by which values and keys built-ins can enumerate the - subvariables of the hash.

    - -

    The commonly used implementation is - SimpleHash, which implements - TemplateHashModelEx. Internally it uses a - java.util.Hash to store the subvariables. - SimpleHash has methods by which you can add and - remove subvariable. These methods should be used to initialize the - variable directly after its creation.

    - -

    Containers are immutable within FTL. That is, you can't add, - replace or remove the subvariables they contain.

    - - - - - -

    -Sequences

    - - - - -

    Sequences are java objects that implement - TemplateSequenceModel. It contains two methods: - TemplateModel get(int index) and int - size().

    - -

    The commonly used implementation is - SimpleSequence. It uses internally a - java.util.List to store its subvariables. - SimpleSequence has methods by which you can add - subvariables. These methods should be used to populate the sequence - directly after its creation.

    - - - - - -

    -Collections

    - - - - -

    Collections are java objects that implement the - TemplateCollectionModel interface. That interface - has one method: TemplateModelIterator iterator(). - The TemplateModelIterator interface is similar to - java.util.Iterator, but it returns - TemplateModels instead of - Object-s, and it can throw - TemplateModelExceptions.

    - -

    The commonly used implementation is - SimpleCollection.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_datamodel_scalar.html b/fmpp/docs/freemarker/pgui_datamodel_scalar.html deleted file mode 100644 index 8bd2c75..0000000 --- a/fmpp/docs/freemarker/pgui_datamodel_scalar.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - FreeMarker Manual - Scalars - - - - - - - - -
    - - - - - -

    -Scalars

    - - -

    There are 4 scalar types:

    -
      -
    • - Boolean -
    • - -
    • - Number -
    • - -
    • - String -
    • - -
    • - Date-like (subtypes: date (no time part), time or - date-time) -
    • -
    -

    For each scalar type is a - TemplateTypeModel - interface, where Type is - the name of the type. These interfaces define only one method: - type - getAsType();. This returns the - value of the variable with the Java type (boolean, - Number, String and - Date respectively).

    -

    Note

    - -

    For historical reasons the interface for string scalars is - called TemplateScalarModel, not - TemplateStringModel.

    -
    -

    A trivial implementation of these interfaces are available in - freemarker.template package with - SimpleType class name. - However, there is no SimpleBooleanModel; to - represent the boolean values you can use the - TemplateBooleanModel.TRUE and - TemplateBooleanModel.FALSE singletons.

    -

    Note

    - -

    For historical reasons the class for string scalars is called - SimpleScalar, not - SimpleString.

    -
    -

    Scalars are immutable within FTL. When you set the value of a - variable in a template, then you replace the - TemplateTypeModel - instance with another instance, and don't change the value stored in - the original instance.

    - - - - -

    -Difficulties with the "date-like" type

    - - - - - - -

    There is a complication around date-like types, because Java - API usually does not differentiate - java.util.Date-s that store only the date part - (April 4, 2003), only the time part (10:19:18 PM), or both (April 4, - 2003 10:19:18 PM). To display the value as text correctly (or to do - certain other operations), FreeMarker must know what parts of the - java.util.Date stores meaningful information, and - what parts are unused (usually 0-ed out). Unfortunately, this - information is usually only available when the value comes from a - database, because most databases have separate date, time and - date-time (aka. timestap) types, and java.sql has - 3 corresponding java.util.Date subclasses for - them.

    - -

    TemplateDateModel interface has two - methods: java.util.Date getAsDate() and - int getDateType(). A typical implementation of - this interface, stores a java.util.Date object, - plus an integer that tells the subtype. The value of this integer - must be a constant from the TemplateDateModel - interface: DATE, TIME, - DATETIME and UNKNOWN.

    - -

    About UNKNOWN: java.lang - and java.util classes are usually converted - automatically into TemplateModel implementations - be the ObjectWrapper (see object wrapping - earlier). If the object wrapper has to wrap a - java.util.Date, that is not an instance of a - java.sql date class, it can't decide what the - subtype is, so it uses UNKNOWN. Later, if the - template has to use this variable, and the subtype is needed for the - operation, it will stop with error. To prevent this, for the - problematic variables the template author must specify the subtype - explicitly using the date, - time or datetime - built-ins (like lastUpdated?datetime). - Note that if you use string built-in with format - parameter, as foo?string["MM/dd/yyyy"], then - FreeMarker doesn't need to know the subtype.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc.html b/fmpp/docs/freemarker/pgui_misc.html deleted file mode 100644 index 6b67053..0000000 --- a/fmpp/docs/freemarker/pgui_misc.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - FreeMarker Manual - Miscellaneous - - - - - - - - -
    - - - - - -

    -Chapter 4   Miscellaneous

    - - - - -

    This is just an introductory guide. See the FreeMarker Java API documentation for the - details.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_ant.html b/fmpp/docs/freemarker/pgui_misc_ant.html deleted file mode 100644 index c4a3e25..0000000 --- a/fmpp/docs/freemarker/pgui_misc_ant.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - FreeMarker Manual - Using FreeMarker with Ant - - - - - - - - -
    - - - - - -

    -Using FreeMarker with Ant

    - - -

    There are two ``FreeMarker Ant tasks'' that we know - about:

    -
      -
    • -

      FreemarkerXmlTask: It comes with the - FreeMarker distribution, packed into the - freemarker.jar. This is a lightweight, - easy-to-use Ant task for transforming XML documents with - FreeMarker templates. Its approach is that the source files (input - files) are XML files, which are rendered to corresponding output - files, by a single template. That is, for each XML file, the - template will be executed (with the XML document in the - data-model), and the template output will be written into a file - of similar name than the name of the XML file. Thus, the template - file plays a similar role as an XSLT style sheet, but it is FTL, - not XSLT.

      -
    • - -
    • -

      FMPP: It's a more heavyweight, less XML centric, - third party Ant task (and standalone command-line tool). Its - primary approach is that the source files (input files) are - template files that generate the corresponding output files - themselves, but it also supports the approach of - FreemarkerXmlTask for the source files that are - XML-s. Also, it has extra features over the - FreemarkerXmlTask. What's its drawback then? As - it is more complex and more generalized, it's harder to learn and - use it.

      -
    • -
    -

    This section introduces the - FreemarkerXmlTask. For more information about FMPP - visit its homepage: http://fmpp.sourceforge.net/.

    In order to use the FreemarkerXmlTask, you - must first define the - freemarker.ext.ant.FreemarkerXmlTask inside your - Ant buildfile, then call the task. Suppose you want to transform - several XML documents to HTML using the hypothetical "xml2html.ftl" - template, with XML documents located in the directory "xml" and HTML - documents generated into directory "html". You would write something - like:

    -
    -<taskdef name="freemarker" classname="freemarker.ext.ant.FreemarkerXmlTask">
    -  <classpath>
    -    <pathelement location="freemarker.jar" />
    -  </classpath>
    -</taskdef>
    -<mkdir dir="html" />
    -<freemarker basedir="xml" destdir="html" includes="**/*.xml" template="xml2html.ftl" />  
    -

    The task would invoke the template for every XML document. Every - document would be parsed into a DOM tree, then wrapped as a FreeMarker - node variable. When template processing begins, the special variable, - .node, is set to the root node of the XML - document.

    Note that if you are using the legacy (FreeMarker 2.2.x and - earlier) XML adapter implementation, that still works, and the root of - the XML tree is placed in the data-model as the variable - document. That contains an instance of the legacy - freemarker.ext.xml.NodeListModel class.

    Note that all properties defined by the build file would be made - available as a hash model named "properties". Several other models are - made available; for detailed description of what variables are made - available to templates as well as what other attributes can the task - accept, see the JavaDoc for - freemarker.ext.ant.FreemarkerXmlTask.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_beanwrapper.html b/fmpp/docs/freemarker/pgui_misc_beanwrapper.html deleted file mode 100644 index b03a07f..0000000 --- a/fmpp/docs/freemarker/pgui_misc_beanwrapper.html +++ /dev/null @@ -1,761 +0,0 @@ - - - - - - - - FreeMarker Manual - Bean wrapper - - - - - - - - -
    - - - - - -

    -Bean wrapper

    - - - - -

    The freemarker.ext.beans.BeansWrapper is an - object wrapper - that was originally added to FreeMarker so arbitrary POJO-s (Plain Old - Java Objects) can be wrapped into TemplateModel - interfaces. Since then it has becomed the normal way of doing things, - and in fact the DefaultObjectWrapper itself is a - BeansWrapper extension. So everything described - here goes for the DefaultObjectWrapper too, except - that the DefaultObjectWrapper will wrap - String, Number, - Date, array, - Collection (like List), - Map, Boolean and - Iterator objects with the - freemarker.template.SimpleXxx - classes, and W3C DOM nodes with - freemarker.ext.dom.NodeModel (more about wrapped W3C DOM...), so for those the - above described rules doesn't apply.

    You will want to use BeansWrapper instead of - DefaultObjectWrapper when any of these - stands:

    -
      -
    • -

      The Collection-s and - Map-s of the model should be allowed to be - modified during template execution. - (DefaultObjectWrapper prevents that, since it - creates a copy of the collections when they are wrapped, and the - copies will be read-only.)

      -
    • - -
    • -

      If the identity of the array, - Collection and Map objects - must be kept when they are passed to a wrapped object's method in - the template. That is, if those methods must get exactly the same - object that was earlier wrapped.

      -
    • - -
    • -

      If the Java API of the earlier listed classes - (String, Map, - List ...etc) should be visible for the - templates. Even with BeansWrapper, they are not - visible by default, but it can be achieved by setting the exposure - level (see later). Note that this is usually a bad practice; try - to use the built-ins (like - foo?size, foo?upper, - foo?replace('_', '-') ...etc) instead of the - Java API.

      -
    • -
    -

    Below is a summary of the TemplateModel-s - that the BeansWrapper creates. Let's assume that - the object is called obj before wrapping, and - model after wrapping for the sake of the following - discussion.

    - - - - -

    -TemplateHashModel functionality

    - - -

    Every object will be wrapped into a - TemplateHashModel that will expose JavaBeans - properties and methods of the object. This way, you can use - model.foo in the template to invoke - obj.getFoo() or obj.isFoo() - methods. (Note that public fields are not visible directly; you must - write a getter method for them.) Public methods are also retrievable - through the hash model as template method models, therefore you can - use the model.doBar() to invoke - object.doBar(). More on this on discussion of - method model functionality.

    - -

    If the requested key can not be mapped to a bean property or - method, the framework will attempt to locate the so-called "generic - get method", that is a method with signature public - any-return-type - get(String) or public - any-return-type - get(Object) and invoke that method with the requested key. - Note that this allows convenient access to mappings in a - java.util.Map and similar classes - as long as - the keys of the map are Strings and some property - or method name does not shadow the mapping. (There is a solution to - avoid shadowing, read on.) Also note that the models for - java.util.ResourceBundle objects use the - getObject(String) as the generic get - method.

    - -

    If you call setExposeFields(true) on a - BeansWrapper instance, it will also expose - public, non-static fields of classes as hash keys and values. I.e. - if foo is a public, non-static field of the class - Bar, and bar is a template - variable wrapping an instance of Bar, then - bar.foo expression will evaluate as the value of - the field foo of the bar - object. The public fields in all superclasses of the class are also - exposed.

    - - - - - -

    -A word on security

    - - -

    By default, you will not be able to access several methods - that are considered not safe for templating. For instance, you can't - use synchronization methods (wait, - notify, notifyAll), thread and - thread group management methods (stop, - suspend, resume, - setDaemon, setPriority), - reflection (Field - setXxx methods, - Method.invoke, - Constructor.newInstance, - Class.newInstance, - Class.getClassLoader etc.) and various dangerous - methods in System and Runtime - classes (exec, exit, - halt, load, etc.). The - BeansWrapper has several security levels (called - "levels of method exposure"), and the default called - EXPOSE_SAFE is probably suited for most - applications. There is a no-safeguard level called - EXPOSE_ALL that allows you to call even the above - unsafe methods, and a strict level - EXPOSE_PROPERTIES_ONLY that will expose only bean - property getters. Finally, there is a level named - EXPOSE_NOTHING that will expose no properties and - no methods. The only data you will be able to access through hash - model interface in this case are items in maps and resource bundles, - as well as objects returned from a call to generic - get(Object) or get(String) - methods - provided the affected objects have such method.

    - - - - - -

    -TemplateScalarModel functionality

    - - -

    Models for java.lang.String objects will - implement TemplateScalarModel whose - getAsString() method simply delegates to - toString(). Note that wrapping - String objects into Bean wrappers provides much - more functionality than just them being scalars: because of the hash - interface described above, the models that wrap - Strings also provide access to all - String methods (indexOf, - substring, etc.), though most of them has native - FreeMarker equivalent which are better to use - (s?index_of(n), - s[start..<end], etc).

    - - - - - -

    -TemplateNumberModel functionality

    - - -

    Model wrappers for objects that are instances of - java.lang.Number implement - TemplateNumberModel whose - getAsNumber() method returns the wrapped number - object. Note that wrapping Number objects into - Bean wrappers provides much more functionality than just them being - number models: because of the hash interface described above, the - models that wrap Numbers also provide access to - all their methods.

    - - - - - -

    -TemplateCollectionModel functionality

    - - -

    Model wrappers for native Java arrays and all classes that - implement java.util.Collection will implement - TemplateCollectionModel and thus gain the - additional capability of being usable through - list directive.

    - - - - - -

    -TemplateSequenceModel functionality

    - - -

    Model wrappers for native Java arrays and all classes that - implement java.util.List will implement - TemplateSequenceModel and thus their elements - will be accessible by index using the model[i] - syntax. You can also query the length of the array or the size of - the list using the model?size built-in.

    - -

    Also, every method that takes a single parameter that is - assignable through reflective method invocation from a - java.lang.Integer (these are - int, long, - float, double, - java.lang.Object, - java.lang.Number, and - java.lang.Integer) also implements this - interface. What this means is that you have a convenient way for - accessing the so-called indexed bean properties: - model.foo[i] will translate into - obj.getFoo(i).

    - - - - - -

    -TemplateMethodModel functionality

    - - -

    All methods of an object are represented as - TemplateMethodModelEx objects accessible using a - hash key with method name on their object's model. When you call a - method using - model.method(arg1, - arg2, - ...) the arguments are passed - to the method as template models. The method will first try to - unwrap them - see below for details about unwrapping. These - unwrapped arguments are then used for the actual method call. In - case the method is overloaded, the most specific method will be - selected using the same rules that are used by the Java compiler to - select a method from several overloaded methods. In case that no - method signature matches the passed parameters, or that no method - can be chosen without ambiguity, a - TemplateModelException is thrown.

    - -

    Methods of return type void return - TemplateModel.NOTHING, so they can be safely - called with the ${obj.method(args)} - syntax.

    - -

    Models for instances of java.util.Map also - implement TemplateMethodModelEx as a means for - invoking their get() method. As it was discussed - previously, you can use the hash functionality to access the "get" - method as well, but it has several drawbacks: it's slower because - first property and method names are checked for the key; keys that - conflict with property and method names will be shadowed by them; - finally you can use String keys only with that - approach. In contrast, invoking model(key) - translates to model.get(key) directly: it's - faster because there's no property and method name lookup; it is - subject to no shadowing; and finally it works for non-String keys - since the argument is unwrapped just as with ordinary method calls. - In effect, model(key) on a Map - is equal to model.get(key), only shorter to - write.

    - -

    Models for java.util.ResourceBundle also - implement TemplateMethodModelEx as a convenient - way of resource access and message formatting. A single-argument - call to a bundle will retrieve the resource with the name that - corresponds to the toString() value of the - unwrapped argument. A multiple-argument call to a bundle will also - retrieve the resource with the name that corresponds to the - toString() value of the unwrapped argument, but - it will use it as a format pattern and pass it to - java.text.MessageFormat using the unwrapped - values of second and later arguments as formatting parameters. - MessageFormat objects will be initialized with - the locale of the bundle that originated them.

    - - - - - -

    -Unwrapping rules

    - - -

    When invoking a Java method from a template, its arguments - need to be converted from template models back to Java objects. - Assuming that the target type (the declared type of the method's - formal parameter) is denoted as T, the following - rules are tried in the following order:

    - -
    -
      -
    • -

      If the model is the null model for this wrapper, Java - null is returned.

      -
    • - -
    • -

      If the model implements - AdapterTemplateModel, the result of - model.getAdaptedObject(T) is returned if it - is instance of T or it is a number and can be - converted to T using numeric coercion as - described three bullets lower. All - models created by the BeansWrapper are themselves - AdapterTemplateModel implementations, so unwrapping a model that - was created by BeansWrapper for an underlying Java object always - yields the original Java object.

      -
    • - -
    • -

      If the model implements the deprecated - WrapperTemplateModel, the result of - model.getWrappedObject() is returned if it is - instance of T or it is a number and can be - converted to T using numeric coercion as - described two bullets lower.

      -
    • - -
    • -

      If T is - java.lang.String, then if model implements - TemplateScalarModel its string value is - returned. Note that if the model - doesn't implement TemplateScalarModel we don't attempt to - automatically convert the model to string using - String.valueOf(model). You'll have to use the ?string built-in - explicitly to pass non-scalars as strings.

      -
    • - -
    • -

      If T is a primitive numeric type or - java.lang.Number is assignable from - T, and model implements - TemplateNumberModel, then its numeric value - is returned if it is instance of T or its - boxing type (if T is primitive type). - Otherwise, if T is a built-in Java numeric - type (primitive type or a standard subclass of - java.lang.Number, including - BigInteger and BigDecimal) - a new object of class T or its boxing type is - created with the number model's appropriately coerced - value.

      -
    • - -
    • -

      If T is boolean or - java.lang.Boolean, and model implements - TemplateBooleanModel, then its boolean value - is returned.

      -
    • - -
    • -

      If T is - java.util.Map and the model implements - TemplateHashModel, then a special Map - representation of the hash model is returned.

      -
    • - -
    • -

      If T is - java.util.List and the model implements - TemplateSequenceModel, then a special List - representation of the sequence model is returned.

      -
    • - -
    • -

      If T is - java.util.Set and the model implements - TemplateCollectionModel, then a special Set - representation of the collection model is returned.

      -
    • - -
    • -

      If T is - java.util.Collection or - java.lang.Iterable and the model implements - either TemplateCollectionModel or - TemplateSequenceModel, then a special Set or - List representation of the collection or sequence model - (respectively) is returned.

      -
    • - -
    • -

      If T is a Java array type and the model - implements TemplateSequenceModel, then a new - array of the specified type is created and its elements - unwrapped into the array recursively using the array's component - type as T.

      -
    • - -
    • -

      If T is char or - java.lang.Character, and model implements - TemplateScalarModel, and its string - representation contains exactly one character, then a - java.lang.Character with that value is - retured.

      -
    • - -
    • -

      If java.util.Date is assignable from - T, and model implements - TemplateDateModel, and its date value is - instance of T, then its date value is - returned.

      -
    • - -
    • -

      If model is a number model, and its numeric value is - instance of T, the numeric value is returned. - You can have a custom subclass of - java.lang.Number that implements a custom interface, and T might - be that interface. (*)

      -
    • - -
    • -

      If model is a date model, and its date value is instance - of T, the date value is returned. Similar consideration as for - (*)

      -
    • - -
    • -

      If model is a scalar model, and T is - assignable from java.lang.String, the string - value is returned. This covers - cases when T is java.lang.Object, java.lang.Comparable, and - java.io.Serializable (**)

      -
    • - -
    • -

      If model is a boolean model, and T is - assignable from java.lang.Boolean, the - boolean value is returned. Same as - (**)

      -
    • - -
    • -

      If model is a hash model, and T is - assignable from - freemarker.ext.beans.HashAdapter, a hash - adapter is returned. Same as - (**)

      -
    • - -
    • -

      If model is a sequence model, and T is - assignable from - freemarker.ext.beans.SequenceAdapter, a - sequence adapter is returned. Same - as (**)

      -
    • - -
    • -

      If model is a collection model, and T - is assignable from - freemarker.ext.beans.SetAdapter, a set - adapter for the collection is returned. Same as (**)

      -
    • - -
    • -

      If the model is instance of T, the - model itself is returned. This - covers the case where the method explicitly declared a - FreeMarker-specific model interface, as well as allows returning - directive, method and transform models when java.lang.Object is - requested.

      -
    • - -
    • -

      An exception signifying no conversion is possible is - thrown.

      -
    • -
    - - - - - - -

    -Accessing static methods

    - - - - -

    The TemplateHashModel returned from - BeansWrapper.getStaticModels() can be used to - create hash models for accessing static methods and fields of an - arbitrary class.

    - -
    -
    -BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
    -TemplateHashModel staticModels = wrapper.getStaticModels();
    -TemplateHashModel fileStatics =
    -    (TemplateHashModel) staticModels.get("java.io.File");  
    - - -

    And you will get a template hash model that exposes all static - methods and static fields (both final and non-final) of the - java.lang.System class as hash keys. Suppose that - you put the previous model in your root model:

    - -
    -
    -root.put("File", fileStatics);  
    - - -

    From now on, you can use ${File.SEPARATOR} - to insert the file separator character into your template, or you - can even list all roots of your file system by:

    - -
    -
    -<#list File.listRoots() as fileSystemRoot>...</#list>  
    - - -

    Of course, you must be aware of the potential security issues - this model brings.

    - -

    You can even give the template authors complete freedom over - which classes' static methods they use by placing the static models - hash into your template root model with

    - -
    -
    -root.put("statics", BeansWrapper.getDefaultInstance().getStaticModels());  
    - - -

    This object exposes just about any class' static methods if - it's used as a hash with class name as the key. You can then use - expression like - ${statics["java.lang.System"].currentTimeMillis()} - in your template. Note, however that this has even more security - implications, as someone could even invoke - System.exit() using this model if the method - exposure level is weakened to EXPOSE_ALL.

    - -

    Note that in above examples, we always use the default - BeansWrapper instance. This is a convenient - static wrapper instance that you can use in most cases. You are also - free to create your own BeansWrapper instances - and use them instead especially when you want to modify some of its - characteristics (like model caching, security level, or the null - model representation).

    - - - - - -

    -Accessing enums

    - - - - -

    The TemplateHashModel returned from - BeansWrapper.getEnumModels() can be used to - create hash models for accessing values of enums on JRE 1.5 or - later. (An attempt to invoke this method on an earlier JRE will - result in an - UnsupportedOperationException.)

    - -
    -
    -BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
    -TemplateHashModel enumModels = wrapper.getEnumModels();
    -TemplateHashModel roundingModeEnums =
    -    (TemplateHashModel) enumModels.get("java.math.RoundingMode");  
    - - -

    And you will get a template hash model that exposes all enum - values of the java.math.RoundingMode class as - hash keys. Suppose that you put the previous model in your root - model:

    - -
    -
    -root.put("RoundingMode", roundingModeEnums);  
    - - -

    From now on, you can use RoundingMode.UP as - an expression to reference the UP enum value in - your template.

    - -

    You can even give the template authors complete freedom over - which enum classes they use by placing the enum models hash into - your template root model with

    - -
    -
    -root.put("enums", BeansWrapper.getDefaultInstance().getEnumModels());  
    - - -

    This object exposes any enum class if it's used as a hash with - class name as the key. You can then use expression like - ${enums["java.math.RoundingMode"].UP} in your - template.

    - -

    The exposed enum values can be used as scalars (they'll - delegate to their toString() method), and can be - used in equality and inequality comparisons as well.

    - -

    Note that in above examples, we always use the default - BeansWrapper instance. This is a convenient - static wrapper instance that you can use in most cases. You are also - free to create your own BeansWrapper instances - and use them instead especially when you want to modify some of its - characteristics (like model caching, security level, or the null - model representation).

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_charset.html b/fmpp/docs/freemarker/pgui_misc_charset.html deleted file mode 100644 index fd3a06b..0000000 --- a/fmpp/docs/freemarker/pgui_misc_charset.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - FreeMarker Manual - Charset issues - - - - - - - - -
    - - - - - -

    -Charset issues

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    FreeMarker, as most Java applications, works with "UNICODE text" (UTF-16). Nonetheless, - there are situations when it must deal with charsets, because it has to exchange - data with the outer world that may uses various other charsets.

    - - - - -

    -The charset of the input

    - - -

    When FreeMarker has to load a template file (or an unparsed - text file), then it must know the charset of the file, since files - are just raw byte sequences. You can use the - encoding setting to specify the - charset. This setting takes effect only when FreeMarker loads a - template (parsed or unparsed) with the - getTemplate method of - Configuration. Note that the include - directive uses this method internally, so the value of the - encoding setting is significant for an already - loaded template if the template contains include - directive call.

    - -

    The getter and setter method of the - encoding setting is special in the first - (configuration) layer. The getter method guesses the return value - based on a Locale passed as parameter; it looks - up the encoding in a table that maps locales to encodings (called - encoding map), and if the locale was not found there, it returns the - default encoding. You can fill the encoding map with the - setEncoding(Locale locale, String encoding) - method of the configuration; the encoding map is initially empty. - The default encoding is initially the value of the - file.encoding system property, but you always - should set a default default with the - setDefaultEncoding method, rather than relying on - that. For new projects, a popular default encoding is - utf-8.

    - -

    You can give the charset directly by overriding the - encoding setting in the template layer or runtime - environment layer (When you specify an encoding as the parameter of - getTemplate method, you override the - encoding setting in the template layer.). If you - don't override it, the effective value will be what the - configuration.getEncoding(Locale) method returns - for the effective value of the locale - setting.

    - -

    Also, instead of relying on this charset guessing mechanism, - you can specify the charset of the template in the template file - itself, with the ftl - directive, like <#ftl - encoding="utf-8">.

    - -

    Note that the charset of the template is independent from the - charset of the output that the tempalte generates (unless the - enclosing software deliberately sets the output charset to the same - as the template charset).

    - - - - - -

    -The charset of the output

    - - -
    -

    Note

    - -

    The output_encoding setting/variable and - the url - built-in is available since FreeMarker 2.3.1. It doesn't - exist in 2.3.

    -
    - - -

    In principle FreeMarker does not deal with the charset - of the output, since it writes the output to a - java.io.Writer. Since the - Writer is made by the software that encapsulates - FreeMarker (such as a Web application framework), the output charset - is controlled by the encapsulating software. Still, FreeMarker has a - setting called output_encoding (starting from - FreeMarker version 2.3.1). The enclosing software should set this - setting (to the charset that the Writer uses), to - inform FreeMarker what charset is used for the output (otherwise - FreeMarker can't find it out). Some features, such as the url built-in, - and the output_encoding special - variable utilize this information. Thus, if the enclosing - software doesn't set this setting then FreeMarker features that need - to know the output charset can't be used.

    - -

    If you write software that will use FreeMarker, you may wonder - what output charset should you choose. Of course it depends on the - consumer of the FreeMarker output, but if the consumer is flexible - regarding this question, then the common practice is either using - the charset of the template file for the output, or using UTF-8. - Using UTF-8 is usually a better practice, because arbitrary text may - comes from the data-model, which then possibly contains characters - that couldn't be encoded with the charset of the template.

    - -

    FreeMarker settings can be set for each individual template - processing if you use - Template.createProcessingEnvironment(...) - plus - Environment.process(...) - instead of - Template.process(...). - Thus, you can set the output_encoding setting for - each template execution independently:

    - -
    -
    -Writer w = new OutputStreamWriter(out, outputCharset);
    -Environment env = template.createProcessingEnvironment(dataModel, w);
    -env.setOutputEncoding(outputCharset);
    -env.process();  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_jythonwrapper.html b/fmpp/docs/freemarker/pgui_misc_jythonwrapper.html deleted file mode 100644 index cffaad9..0000000 --- a/fmpp/docs/freemarker/pgui_misc_jythonwrapper.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - FreeMarker Manual - Jython wrapper - - - - - - - - -
    - - - - - -

    -Jython wrapper

    - - - - -

    The freemarker.ext.jython package consists of - models that enable any Jython object to be used as a - TemplateModel. In the very basic case, you only - need to call the

    -
    -public TemplateModel wrap(Object obj);  
    -

    method of the - freemarker.ext.jython.JythonWrapper class. This - method will wrap the passed object into an appropriate - TemplateModel. Below is a summary of the properties - of returned model wrappers. Let's assume that the model that resulted - from the JythonWrapper call on object - obj is named model in the - template model root for the sake of the following discussion.

    - - - - -

    -TemplateHashModel functionality

    - - -

    PyDictionary and - PyStringMap will be wrapped into a hash model. - Key lookups are mapped to the __finditem__ - method; if an item is not found, a model for None - is returned.

    - - - - - -

    -TemplateScalarModel functionality

    - - -

    Every python object will implement - TemplateScalarModel whose - getAsString() method simply delegates to - toString().

    - - - - - -

    -TemplateBooleanModel functionality

    - - -

    Every python object will implement - TemplateBooleanModel whose - getAsBoolean() method simply delegates to - __nonzero__() in accordance with Python semantics - of true/false.

    - - - - - -

    -TemplateNumberModel functionality

    - - -

    Model wrappers for PyInteger, - PyLong, and PyFloat objects - implement TemplateNumberModel whose - getAsNumber() method returns - __tojava__(java.lang.Number.class).

    - - - - - -

    -TemplateSequenceModel functionality

    - - -

    Model wrappers for all classes that extend - PySequence will implement - TemplateSequenceModel and thus their elements - will be accessible by index using the model[i] - syntax, which will delegate to __finditem__(i). - You can also query the length of the array or the size of the list - using the model?size built-in, which will - delegate to __len__().

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_logging.html b/fmpp/docs/freemarker/pgui_misc_logging.html deleted file mode 100644 index e4a1da6..0000000 --- a/fmpp/docs/freemarker/pgui_misc_logging.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - FreeMarker Manual - Logging - - - - - - - - -
    - - - - - -

    -Logging

    - - -

    FreeMarker integrates with the following logging packages: SLF4J, Apache Commons - Logging, Log4J, Avalon - LogKit, and java.util.logging. - By default, FreeMarker will look for the following logging packages in - this order, and will automatically use the first package it finds: - Log4J, Avalon, java.util.logging. However, - if you call the static selectLoggerLibrary method - on the freemarker.log.Logger class with appropriate - parameter and before using any FreeMarker classes that log - messages, you can explicitly select a logger package, or - even disable the logging. See the API documentation for more - details.

    -

    Note

    - -

    Prior to FreeMarker 2.4, SLF4J and Apache Commons Logging - aren't searched automatically due to backward compatibility - constraints, so to use one of them you must do this:

    - -
    -
    -import freemarker.log.Logger;
    -...
    -    // IMPORTANT: This should be executed before using other FreeMarker classes!
    -    Logger.selectLoggerLibrary(Logger.LIBRARY_SLF4J);  // or Logger.LIBRARY_COMMONS
    -...  
    - - -

    Doing this is recommended, because starting from 2.4 SLF4J - will be used by default if present, otherwise Apache Commons Logging - if present, otherwise Log4J if present, etc.

    -
    -

    All log messages produced by FreeMarker are logged into the - logger hierarchy whose top-level logger is named - freemarker. Currently used loggers are:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Logger namePurpose
    freemarker.beansLogs messages of the Beans wrapper module.
    freemarker.cacheLogs messages related to template loading and caching.
    freemarker.runtimeLogs template exceptions thrown during template - processing.
    freemarker.runtime.attemptLogs template exceptions thrown during template processing - and caught by - attempt/recover - directives, with DEBUG severity. Note that such exceptions will - be still also logged with their normal logger (like - freemarker.runtime).
    freemarker.servletLogs messages of the FreemarkerServlet - class.
    freemarker.jspLogs messages of the FreeMarker JSP support.
    -
    -

    You can call the static selectLoggerLibrary - method on the freemarker.log.Logger class and pass - it a string that will be used to prefix the above mentioned logger - names. This is useful if you want to have separate loggers on a - per-web-application basis (assuming the application uses its own local - freemarker.jar). Also, you can disable logging with - Logger.selectLoggerLibrary(Logger.LIBRARY_NONE). In - any case, selectLoggerLibrary must be called early, - before FreeMarker could log anything, or else it will not have - (consistent) effect.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_multithreading.html b/fmpp/docs/freemarker/pgui_misc_multithreading.html deleted file mode 100644 index 183841d..0000000 --- a/fmpp/docs/freemarker/pgui_misc_multithreading.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - FreeMarker Manual - Multithreading - - - - - - - - -
    - - - - - -

    -Multithreading

    - - -

    In a multithreaded environment Configuration - instances, Template instances and data-models - should be handled as immutable (read-only) objects. That is, you - create and initialize them (for example with - set... methods), and - then you don't modify them later (e.g. you don't call - set...). This allows us - to avoid expensive synchronized blocks in a multithreaded environment. - Beware with Template instances; when you get a - Template instance with - Configuration.getTemplate, you may get an instance - from the template cache that is already used by other threads, so do - not call its set... - methods (calling process is of course fine).

    The above restrictions do not apply if you access all objects - from the same single thread only.

    It is impossible to modify the data-model object or a shared variable with FTL, - unless you put methods (or other objects) into the data-model that do - that. We discourage you from writing methods that modify the - data-model object or the shared variables. Try to use variables that - are stored in the environment object instead (this object is created - for a single Template.process call to store the - runtime state of processing), so you don't modify data that are - possibly used by multiple threads. For more information read: Variables, scopes

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_secureenv.html b/fmpp/docs/freemarker/pgui_misc_secureenv.html deleted file mode 100644 index 35991dc..0000000 --- a/fmpp/docs/freemarker/pgui_misc_secureenv.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - FreeMarker Manual - Configuring security policy for FreeMarker - - - - - - - - -
    - - - - - -

    -Configuring security policy for FreeMarker

    - - -

    When FreeMarker is used in a Java virtual machine with a - security manager installed, you have to grant it few permissions to - ensure it operates properly. Most notably, you need these entries to - your security policy file for - freemarker.jar:

    -
    -grant codeBase "file:/path/to/freemarker.jar" 
    -{
    -  permission java.util.PropertyPermission "file.encoding", "read";
    -  permission java.util.PropertyPermission "freemarker.*", "read";
    -}  
    -

    Additionally, if you are loading templates from a directory, you - need to give FreeMarker permissions to read files from that directory - using the following permission:

    -
    -grant codeBase "file:/path/to/freemarker.jar" 
    -{
    -  ...
    -  permission java.io.FilePermission "/path/to/templates/-", "read";
    -}  
    -

    Finally, if you're just using the default template loading - mechanism which loads templates from the current directory, then - specify these permissions additionally: (note that the expression - ${user.dir} will be evaluated at run time by the - policy interpreter, pretty much as if it were a FreeMarker - template)

    -
    -
    -grant codeBase "file:/path/to/freemarker.jar" 
    -{
    -  ...
    -  permission java.util.PropertyPermission "user.dir", "read";
    -  permission java.io.FilePermission "${user.dir}/-", "read";
    -}  
    -

    Naturally, if you're running under Windows, use double backslash - instead of a single slash for separating directory components in - paths.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_servlet.html b/fmpp/docs/freemarker/pgui_misc_servlet.html deleted file mode 100644 index 2fce7c3..0000000 --- a/fmpp/docs/freemarker/pgui_misc_servlet.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - - FreeMarker Manual - Using FreeMarker with servlets - - - - - - - - -
    - - - - - -

    -Using FreeMarker with servlets

    - - - - -

    In a fundamental sense, using FreeMarker in the web application - space is no different from anywhere else; FreeMarker writes its output - to a Writer that you pass to the - Template.process method, and it does not care if - that Writer prints to the console or to a file or - to the output stream of HttpServletResponse. - FreeMarker knows nothing about servlets and Web; it just merges Java - object with template files and generates text output from them. From - here, it is up to you how to build a Web application around - this.

    But, probably you want to use FreeMarker with some already - existing Web application framework. Many frameworks rely on the - ``Model 2'' architecture, where JSP pages handle presentation. If you - use such a framework (for example, Apache Struts), - then read on. For other frameworks please refer to the documentation - of the framework.

    - - - - -

    -Using FreeMarker for ``Model 2''

    - - -

    Many frameworks follow the strategy that the HTTP request is - dispatched to user-defined ``action'' classes that put data into - ServletContext, HttpSession - and HttpServletRequest objects as attributes, and - then the request is forwarded by the framework to a JSP page (the - view) that will generate the HTML page using the data sent with the - attributes. This is often referred as Model 2.

    - -

    figure

    - - -

    With these frameworks you can simply use FTL files instead of - JSP files. But, since your servlet container (Web application - server), unlike with JSP files, does not know out-of-the-box what to - do with FTL files, a little extra configuring is needed for your Web - application:

    - -
      -
    1. -

      Copy freemarker.jar (from the - lib directory of the FreeMarker distribution) - into the WEB-INF/lib directory of your Web - application.

      -
    2. - -
    3. -

      Insert the following section to the - WEB-INF/web.xml file of your Web application - (and adjust it if required):

      -
    4. -
    - -
    -
    -<servlet>
    -  <servlet-name>freemarker</servlet-name>
    -  <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    -    
    -  <!-- FreemarkerServlet settings: -->
    -  <init-param>
    -    <param-name>TemplatePath</param-name>
    -    <param-value>/</param-value>
    -  </init-param>
    -  <init-param>
    -    <param-name>NoCache</param-name>
    -    <param-value>true</param-value>
    -  </init-param>
    -  <init-param>
    -    <param-name>ContentType</param-name>
    -    <param-value>text/html; charset=UTF-8</param-value> <!-- Forces UTF-8 output encoding! -->
    -  </init-param>
    -    
    -  <!-- FreeMarker settings: -->
    -  <init-param>
    -    <param-name>incompatible_improvements</param-name>
    -    <param-value>2.3.21</param-value>
    -  </init-param>
    -  <init-param>
    -    <param-name>template_exception_handler</param-name>
    -    <!-- Some may prefer "html_debug" for development. -->
    -    <param-value>rethrow</param-value>
    -  </init-param>
    -  <init-param>
    -    <param-name>template_update_delay</param-name>
    -    <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
    -  </init-param>
    -  <init-param>
    -    <param-name>default_encoding</param-name>
    -    <param-value>UTF-8</param-value> <!-- The encoding of the template files. -->
    -  </init-param>
    -  <init-param>
    -    <param-name>number_format</param-name>
    -    <param-value>0.##########</param-value>
    -  </init-param>
    -
    -  <load-on-startup>1</load-on-startup>
    -</servlet>
    -
    -<servlet-mapping>
    -  <servlet-name>freemarker</servlet-name>
    -  <url-pattern>*.ftl</url-pattern>
    -</servlet-mapping>
    -
    -...
    -
    -<!--
    -  Prevent the visiting of MVC Views from outside the servlet container.
    -  RequestDispatcher.forward/include should and will still work.
    -  Removing this may open security holes!
    --->
    -<security-constraint>
    -  <web-resource-collection>
    -    <web-resource-name>FreeMarker MVC Views</web-resource-name>
    -    <url-pattern>*.ftl</url-pattern>
    -  </web-resource-collection>
    -  <auth-constraint>
    -    <!-- Nobody is allowed to visit these -->
    -  </auth-constraint>
    -</security-constraint>  
    - - -

    After this, you can use FTL files (*.ftl) - in the same manner as JSP (*.jsp) files. (Of - course you can choose another extension besides - ftl; it is just the convention)

    - -
    -

    Note

    - -

    How does it work? Let's examine how JSP-s work. Many servlet - container handles JSP-s with a servlet that is mapped to the - *.jsp request URL pattern. That servlet will - receive all requests where the request URL ends with - .jsp, find the JSP file based on the request - URL, and internally compiles it to a Servlet, - and then call the generated servlet to generate the page. The - FreemarkerServlet mapped here to the - *.ftl URL pattern does the same, except that - FTL files are not compiled to Servlet-s, but to - Template objects, and then the - process method of Template - will be called to generate the page.

    -
    - - -

    For example, instead - of this JSP file (note that it heavily uses Struts tag-libs to save - designers from embedded Java monsters):

    - -
    -
    -<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    -<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    -
    -<html>
    -<head><title>Acmee Products International</title>
    -<body>
    -  <h1>Hello <bean:write name="user"/>!</h1>
    -  <p>These are our latest offers:
    -  <ul>
    -    <logic:iterate name="latestProducts" id="prod">
    -      <li><bean:write name="prod" property="name"/>
    -        for <bean:write name="prod" property="price"/> Credits.
    -    </logic:iterate>
    -  </ul>
    -</body>
    -</html>  
    - - -

    you can use this FTL file (use ftl file - extension instead of jsp):

    - -
    -
    -<html>
    -<head><title>Acmee Products International</title>
    -<body>
    -  <h1>Hello ${user}!</h1>
    -  <p>These are our latest offers:
    -  <ul>
    -    <#list latestProducts as prod>
    -      <li>${prod.name} for ${prod.price} Credits.
    -    </#list>
    -  </ul>
    -</body>
    -</html>  
    - - -
    -

    Warning!

    - -

    In FreeMarker <html:form - action="/query">...</html:form> - is just static text, so it is printed to the output as is, like - any other XML or HTML markup. JSP tags are just FreeMarker - directives, nothing special, so you use FreeMarker - syntax for calling them, not JSP syntax: - <@html.form - action="/query">...</@html.form>. - Note that in the FreeMarker syntax you don't use - ${...} in - parameters as in JSP, and you don't quote the - parameter values. So this is - WRONG:

    - -
    -
    -<#-- WRONG: -->
    -<@my.jspTag color="${aVariable}" name="aStringLiteral"
    -            width="100" height=${a+b} />  
    - - -

    and this is good:

    - -
    -
    -<#-- Good: -->
    -<@my.jspTag color=aVariable name="aStringLiteral"
    -            width=100 height=a+b />  
    - -
    - - -

    In both templates, when you refer to user - and latestProduct, it will first try to find a - variable with that name that was created in the template (like - prod; if you master JSP: a page scope attribute). - If that fails, it will try to look up an attribute with that name in - the HttpServletRequest, and if it is not there - then in the HttpSession, and if it still doesn't - find it then in the ServletContext. In the case - of FTL this works because FreemarkerServlet - builds the data-model from the attributes of the mentioned 3 - objects. That is, in this case the root hash is not a - java.util.Map (as it was in some example codes in - this manual), but - ServletContext+HttpSession+HttpServletRequest; - FreeMarker is pretty flexible about what the data-model is. So if - you want to put variable "name" into the - data-model, then you call - servletRequest.setAttribute("name", "Fred"); this - is the logic of Model 2, and FreeMarker adapts itself to it.

    - -

    FreemarkerServlet also puts 3 hashes into - the data-model, by which you can access the attributes of the 3 - objects directly. The hash variables are: - Request, Session, - Application (corresponds to - ServletContext). It also exposes another hash - named RequestParameters that provides access to - the parameters of the HTTP request.

    - -

    FreemarkerServlet has various init-params. - It can be set up to load templates from an arbitrary directory, from - the classpath, or relative to the Web application directory. You can - set the charset used for templates. You can set up what object - wrapper do you want to use. Etc.

    - -

    FreemarkerServlet is easily tailored to - special needs through subclassing. Say, if you need to have - additional variables available in your data-model for all templates, - subclass the servlet and override the - preTemplateProcess() method to shove any - additional data you need into the model before the template gets - processed. Or subclass the servlet, and set these globally available - variables as shared - variables in the Configuration.

    - -

    For more information please read the Java API documentation of - the class.

    - - - - - -

    -Including content from other web application - resources

    - - - - - - - - - - -

    You can use the <@include_page - path="..."/> custom directive provided by the - FreemarkerServlet (since 2.3.15) to include the - contents of another web application resource into the output; this - is often useful to integrate output of JSP pages (living alongside - the FreeMarker templates in the same web server) into the FreeMarker - template output. Using:

    - -
    -
    -<@include_page path="path/to/some.jsp"/>  
    - - -

    is identical to using this tag in JSP:

    - -
    -
    -<jsp:include page="path/to/some.jsp">  
    - - -
    -

    Note

    - -

    <@include_page ...> is not to be - confused with <#include ...>, as the last - is for including FreeMarker templates without involving the - Servlet container. An <#include ...>-ed - template shares the template processing state with the including - template, such as the data-model and the template-language - variables, while <@include_page ...> - starts an independent HTTP request processing.

    -
    - - -
    -

    Note

    - -

    Some Web Application Frameworks provide their own solution - for this, in which case you possibly should use that instead. Also - some Web Application Frameworks don't use - FreemarkerServlet, so - include_page is not available.

    -
    - - -

    The path can be relative or absolute. Relative paths are - interpreted relative to the URL of the current HTTP request (one - that triggered the template processing), while absolute paths are - absolute in the current servlet context (current web application). - You can not include pages from outside the current web application. - Note that you can include any page, not just a JSP page; we just - used page with path ending in .jsp as an - illustration.

    - -

    In addition to the path parameter, you can - also specify an optional parameter named - inherit_params with a boolean value (defaults to - true when not specified) that specifies whether the included page - will see the HTTP request parameters of the current request or - not.

    - -

    Finally, you can specify an optional parameter named - params that specifies new request parameters that - the included page will see. In case inherited parameters are passed - too, the values of specified parameters will get prepended to the - values of inherited parameters of the same name. The value of - params must be a hash, with each value in it - being either a string, or a sequence of strings (if you need - multivalued parameters). Here's a full example:

    - -
    -
    -<@include_page path="path/to/some.jsp" inherit_params=true params={"foo": "99", "bar": ["a", "b"]}/>  
    - - -

    This will include the page - path/to/some.jsp, pass it all request parameters - of the current request, except for "foo" and "bar", which will be - set to "99" and multi-value of "a", "b", respectively. In case the - original request already had values for these parameters, the new - values will be prepended to the existing values. I.e. if "foo" had - values "111" and "123", then it will now have values "99", "111", - "123".

    - -

    It is in fact possible to pass - non-string values for parameter values within - params. Such a value will be converted to a - suitable Java object first (i.e. a Number, a Boolean, a Date, etc.), - and then its Java toString() method will be used - to obtain the string value. It is better to not rely on this - mechanism, though, and instead explicitly ensure that parameter - values that aren't strings are converted to strings on the template - level where you have control over formatting using the - ?string and ?c built-ins. -

    - - - - - -

    -Using JSP custom tags in FTL

    - - - - - - - - -

    FreemarkerServlet puts a hash - JspTaglibs into the data-model, what you can use - to access JSP taglibs. The JSP custom tags will be accessible as - plain user-defined directives. For example, this is a JSP file that - uses some Struts tags:

    - -
    -
    -<%@page contentType="text/html;charset=ISO-8859-2" language="java"%>
    -<%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
    -<%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
    -
    -<html>
    -  <body>
    -    <h1><bean:message key="welcome.title"/></h1>
    -    <html:errors/>
    -    <html:form action="/query">
    -      Keyword: <html:text property="keyword"/><br>
    -      Exclude: <html:text property="exclude"/><br>
    -      <html:submit value="Send"/>
    -    </html:form>
    -  </body>
    -</html>  
    - - -

    And this is the (near) equivalent FTL:

    - -
    -
    -<#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]>
    -<#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]>
    -
    -<html>
    -  <body>
    -    <h1><@bean.message key="welcome.title"/></h1>
    -    <@html.errors/>
    -    <@html.form action="/query">
    -      Keyword: <@html.text property="keyword"/><br>
    -      Exclude: <@html.text property="exclude"/><br>
    -      <@html.submit value="Send"/>
    -    </@html.form>
    -  </body>
    -</html>  
    - - -

    Since JSP custom tags are written to operate in JSP - environment, they assume that variables (often referred as ``beans'' - in JSP world) are stored in 4 scopes: page scope, request scope, - session scope and application scope. FTL has no such notation (the 4 - scopes), but FreemarkerServlet provides emulated - JSP environment for the custom JSP tags, which maintains - correspondence between the ``beans'' of JSP scopes and FTL - variables. For the custom JSP tags, the request, session and - application scopes are exactly the same as with real JSP: the - attributes of the javax.servlet.ServletContext, - HttpSession and ServletRequest - objects. From the FTL side you see these 3 scopes together as the - data-model, as it was explained earlier. The page scope corresponds - to the FTL global variables (see the global - directive). That is, if you create a variable with the - global directive, it will be visible for the - custom tags as page scope variable through the emulated JSP - environment. Also, if a JSP-tag creates a new page scope variable, - the result will be the same as if you create a variable with the - global directive. Note that the variables in the - data-model are not visible as page-scope attributes for the JSP - tags, despite that they are globally visible, since the data-model - corresponds to the request, session and application scopes, not the - page-scope.

    - -

    On JSP pages you quote all attribute values, it does not mater - if the type of the parameter is string or boolean or number. But - since custom tags are accessible in FTL templates as user-defined - FTL directives, you have to use the FTL syntax rules inside the - custom tags, not the JSP rules. So when you specify the value of an - ``attribute'', then on the right side of the = - there is an FTL expression. - Thus, you must not quote boolean and numerical parameter - values (e.g. <@tiles.insert - page="/layout.ftl" flush=true/>), or they are - interpreted as string values, and this will cause a type mismatch - error when FreeMarker tries to pass the value to the custom tag that - expects non-string value. Also note, that naturally, you can use any - FTL expression as attribute value, such as variables, calculated - values, etc. (e.g. <@tiles.insert page=layoutName - flush=foo && bar/>).

    - -

    FreeMarker does not rely on the JSP support of the servlet - container in which it is run when it uses JSP taglibs since it - implements its own lightweight JSP runtime environment. There is - only one small detail to pay attention to: to enable the FreeMarker - JSP runtime environment to dispatch events to JSP taglibs that - register event listeners in their TLD files, you should add this to - the WEB-INF/web.xml of your Web - application:

    - -
    -
    -<listener>
    -  <listener-class>freemarker.ext.jsp.EventForwarding</listener-class>
    -</listener>  
    - - -

    Note that you can use JSP taglibs with FreeMarker even if the - servlet container has no native JSP support, just make sure that the - javax.servlet.jsp.* packages for JSP 1.2 (or - later) are available to your Web application. If your servlet - container comes with JSP 1.1, then you have to obtain the following - six classes (for example you can extract them from the jar-s of - Tomcat 5.x or Tomcat 4.x), and copy them into your webapp's - WEB-INF/classes/... - directory: javax.servlet.jsp.tagext.IterationTag, - javax.servlet.jsp.tagext.TryCatchFinally, - javax.servlet.ServletContextListener, - javax.servlet.ServletContextAttributeListener, - javax.servlet.http.HttpSessionAttributeListener, - javax.servlet.http.HttpSessionListener. But - beware, since containers that come with JSP 1.1 usually use earlier - Serlvet versions than 2.3, event listeners will not be supported, - and thus JSP 1.2 taglibs that register event listeners will not work - properly.

    - -

    As of this writing, JSP features up to JSP 2.1 are - implemented, except the "tag files" feature of JSP 2 (i.e., custom - JSP tags implemented in JSP language). The tag - files had to be compiled to Java classes to be usable under - FreeMarker.

    - - - - - -

    -Embed FTL into JSP pages

    - - - - -

    There is a taglib that allows you to put FTL fragments into - JSP pages. The embedded FTL fragment can access the attributes - (Beans) of the 4 JSP scopes. You can find a working example and the - taglib in the FreeMarker distribution.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_var.html b/fmpp/docs/freemarker/pgui_misc_var.html deleted file mode 100644 index 64897bb..0000000 --- a/fmpp/docs/freemarker/pgui_misc_var.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - FreeMarker Manual - Variables, scopes - - - - - - - - -
    - - - - - -

    -Variables, scopes

    - - -

    This chapter explains what happens when a template tries to - access a variable, and how the variables are stored.

    When you call Template.process it will - internally create an Environment object that will - be in use until process returns. This object stores - the runtime state of template processing. Among other things, it - stores the variables created by the template with directives like - assign, macro, - local or global. It never tries - to modify the data-model object that you pass to the - process call, nor does it create or replace shared - variables stored in the configuration.

    When you try to read a variable, FreeMarker will seek the - variable in this order, and stops when it finds a variable with the - right name:

      -
    1. -

      In the Environment:

      - -
        -
      1. -

        If you are in a loop, in the set of loop variables. Loop - variables are the variables created by directives like - list.

        -
      2. - -
      3. -

        If you are inside a macro, in the local variable set of - the macro. Local variables can be created with the - local directive. Also, the parameters of - macros are local variables.

        -
      4. - -
      5. -

        In the current namespace. You can put - variables into a namespace with the assign - directive.

        -
      6. - -
      7. -

        In the set of variables created with - global directive. FTL handles these - variables as if they were normal members of the data-model. - That is, they are visible in all namespaces, and you can - access them as if they would be in the data-model.

        -
      8. -
      -
    2. - -
    3. -

      In the data-model object you have passed to the - process method

      -
    4. - -
    5. -

      In the set of shared variables stored in the - Configuration

      -
    6. -

    In practice, from the viewpoint of template authors these 6 - layers are only 4 layers, since from that viewpoint the last 3 layers - (variables created with global, the actual - data-model object, shared variables) together constitute the set of - global variables.

    Note that it is possible to get variables from a specific layer - in FTL with special - variables.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_misc_xml_legacy.html b/fmpp/docs/freemarker/pgui_misc_xml_legacy.html deleted file mode 100644 index 2cf9c98..0000000 --- a/fmpp/docs/freemarker/pgui_misc_xml_legacy.html +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - - FreeMarker Manual - Legacy XML wrapper implementation - - - - - - - - -
    - - - - - -

    -Legacy XML wrapper implementation

    - - - - -
    -

    Note

    - -

    The legacy XML wrapper is deprecated. - FreeMarker 2.3 has introduced support for a new XML processing - model. To support this, a new XML wrapper package was introduced, - freemarker.ext.dom. For new usage, we encourage - you to use that. It is documented in the part XML Processing Guide.

    -
    -

    The class freemarker.ext.xml.NodeListModel - provides a template model for wrapping XML documents represented as - node trees. Every node list can contain zero or more XML nodes - (documents, elements, texts, processing instructions, comments, entity - references, CDATA sections, etc.). The node list implements the - following template model interfaces with the following - semantics:

    - - - - -

    -TemplateScalarModel

    - - -

    When used as a scalar, the node list will render the XML - fragment that represents its contained nodes. This makes it handy - for use in XML-to-XML transforming templates.

    - - - - - -

    -TemplateCollectionModel

    - - -

    When used as a collection with list - directive, it will simply enumerate its nodes. Every node will be - returned as a new node list consisting of a single node.

    - - - - - -

    -TemplateSequenceModel

    - - -

    When used as a sequence, it will return the i-th node as a new - node list consisting of the single requested node. I.e. to return - the 3rd <chapter> element of the - <book> element, you'd use the following - (note indexes are zero-based):

    - -
    -
    -<#assign 3rdChapter = xmldoc.book.chapter[2]>  
    - - - - - - -

    -TemplateHashModel

    - - -

    When used as a hash, it is basically used to traverse - children. That is, if you have a node list named - book that wraps an element node with several - chapters, then the book.chapter will yield a node - list with all chapter elements of that book element. The at sign is - used to refer to attributes: book.@title yields a - node list with a single attribute node, that is the title attribute - of the book element.

    - -

    It is important to realize the consequence that, for example, - if book has no chapter-s then - book.chapter is an empty sequence, so - xmldoc.book.chapter?? will - not be false, it will be - always true! Similarly, - xmldoc.book.somethingTotallyNonsense?? will not - be false either. To check if there was no - children found, use xmldoc.book.chapter?size == - 0.

    - -

    The hash defines several "magic keys" as well. All these keys - start with an underscore. The most notable is the - _text key which retrieves the text of the node: - ${book.@title._text} will render the value of the - attribute into the template. Similarly, _name - will retrieve the name of the element or attribute. - * or _allChildren returns all - direct children elements of all elements in the node list, while - @* or _allAttributes returns - all attributes of the elements in the node list. There are many more - such keys; here's a detailed summary of all the hash keys:

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Key nameEvaluates to
    * or _childrenall direct element children of current nodes - (non-recursive). Applicable to element and document - nodes.
    @* or - _attributesall attributes of current nodes. Applicable to elements - only.
    @attributeNamenamed attributes of current nodes. Applicable to elements, - doctypes and processing instructions. On doctypes it supports - attributes publicId, - systemId and - elementName. On processing instructions, it - supports attributes target and - data, as well as any other attribute name - specified in data as name="value" pair. The - attribute nodes for doctype and processing instruction are - synthetic, and as such have no parent. Note, however that - @* does NOT operate on doctypes or - processing instructions.
    _ancestorall ancestors up to root element (recursive) of current - nodes. Applicable to same node types as - _parent.
    _ancestorOrSelfall ancestors of current nodes plus current nodes. - Applicable to same node types as - _parent.
    _cnamethe canonical names of current nodes (namespace URI + - local name), one string per node (non-recursive). Applicable - to elements and attributes
    _contentthe complete content of current nodes, including children - elements, text, entity references, and processing instructions - (non-recursive). Applicable to elements and documents.
    _descendantall recursive descendant element children of current - nodes. Applicable to document and element nodes.
    _descendantOrSelfall recursive descendant element children of current nodes - plus current nodes. Applicable to document and element - nodes.
    _documentall documents the current nodes belong to. Applicable to - all nodes except text.
    _doctypedoctypes of the current nodes. Applicable to document - nodes only.
    _filterTypeis a filter-by-type template method model. When called, it - will yield a node list that contains only those current nodes - whose type matches one of types passed as argument. You should - pass arbitrary number of strings to this method containing the - names of types to keep. Valid type names are: "attribute", - "cdata", "comment", "document", "documentType", "element", - "entity", "entityReference", "processingInstruction", - "text".
    _namethe names of current nodes, one string per node - (non-recursive). Applicable to elements and attributes - (returns their local names), entities, processing instructions - (returns its target), doctypes (returns its public ID)
    _nsprefixthe namespace prefixes of current nodes, one string per - node (non-recursive). Applicable to elements and - attributes
    _nsurithe namespace URIs of current nodes, one string per node - (non-recursive). Applicable to elements and attributes
    _parentparent elements of current nodes. Applicable to element, - attribute, comment, entity, processing instruction.
    _qnamethe qualified names of current nodes in - [namespacePrefix:]localName form, one - string per node (non-recursive). Applicable to elements and - attributes
    _registerNamespace(prefix, uri)register a XML namespace with the specified prefix and URI - for the current node list and all node lists that are derived - from the current node list. After registering, you can use the - nodelist["prefix:localname"] or - nodelist["@prefix:localname"] syntaxes to - reach elements and attributes whose names are - namespace-scoped. Note that the namespace prefix need not - match the actual prefix used by the XML document itself since - namespaces are compared solely by their URI.
    _textthe text of current nodes, one string per node - (non-recursive). Applicable to elements, attributes, comments, - processing instructions (returns its data) and CDATA sections. - The reserved XML characters ('<' and '&') are not - escaped.
    _typeReturns a node list containing one string per node - describing the type of the node. Possible node type names are: - "attribute", "cdata", "comment", "document", "documentType", - "element", "entity", "entityReference", - "processingInstruction", "text". If the type of the node is - unknown, returns "unknown".
    _uniquea copy of the current nodes that keeps only the first - occurrence of every node, eliminating duplicates. Duplicates - can occur in the node list by applying uptree-traversals - _parent, _ancestor, - _ancestorOrSelf, and - _document. I.e. - foo._children._parent will return a node - list that has duplicates of nodes in foo - each node will have - the number of occurrences equal to the number of its children. - In these cases, use - foo._children._parent._unique to eliminate - duplicates. Applicable to all node types.
    any other keyelement children of current nodes with name matching the - key. This allows for convenience child traversal in - book.chapter.title style syntax. Note that - nodeset.childname is technically equivalent - to nodeset("childname"), but is both - shorter to write and evaluates faster. Applicable to document - and element nodes.
    -
    - - - - - - -

    -TemplateMethodModel

    - - -

    When used as a method model, it returns a node list that is - the result of evaluating an XPath expression on the current contents - of the node list. For this feature to work, you must have the - Jaxen library in your classpath. For - example:

    - -
    -
    -<#assign firstChapter=xmldoc("//chapter[first()]")>  
    - - - - - - -

    -Namespace handling

    - - -

    For purposes of traversal of children elements that have - namespace-scoped names, you can register namespace prefixes with the - node list. You can do it either in Java, calling the

    - -
    -
    -public void registerNamespace(String prefix, String uri);  
    - - -

    method, or inside a template using the

    - -
    -
    -${nodelist._registerNamespace(prefix, uri)}  
    - - -

    syntax. From there on, you can refer to children elements in - the namespace denoted by the particular URI through the - syntax

    - -
    nodelist["prefix:localName"]
    - - -

    and

    - -
    nodelist["@prefix:localName"]
    - - -

    as well as use these namespace prefixes in XPath expressions. - Namespaces registered with a node list are propagated to all node - lists that are derived from the original node list. Note also that - namespaces are matched by their URI only, so you can safely use a - prefix for a namespace inside your template that differs from the - prefix in the actual XML document - a prefix is just a local alias - for the URI both in the template and in the XML document.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart.html b/fmpp/docs/freemarker/pgui_quickstart.html deleted file mode 100644 index f42144e..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - FreeMarker Manual - Getting Started - - - - - - - - -
    - - - - - -

    -Chapter 1   Getting Started

    - - - - -

    If you are new to FreeMarker, you should read at least the Template Author's Guide/Getting Started/Template + data-model = output before this chapter.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart_all.html b/fmpp/docs/freemarker/pgui_quickstart_all.html deleted file mode 100644 index a426d64..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart_all.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - FreeMarker Manual - Putting all together - - - - - - - - -
    - - - - - -

    -Putting all together

    - - -

    This is a working source file assembled from the previous - fragments. Don't forget to put freemarker.jar into - the CLASSPATH.

    -
    -import freemarker.template.*;
    -import java.util.*;
    -import java.io.*;
    -
    -public class Test {
    -
    -    public static void main(String[] args) throws Exception {
    -        
    -        /* ------------------------------------------------------------------------ */    
    -        /* You should do this ONLY ONCE in the whole application life-cycle:        */    
    -    
    -        /* Create and adjust the configuration singleton */
    -        Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
    -        cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates"));
    -        cfg.setDefaultEncoding("UTF-8");
    -        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
    -
    -        /* ------------------------------------------------------------------------ */    
    -        /* You usually do these for MULTIPLE TIMES in the application life-cycle:   */    
    -
    -        /* Create a data-model */
    -        Map root = new HashMap();
    -        root.put("user", "Big Joe");
    -        Map latest = new HashMap();
    -        root.put("latestProduct", latest);
    -        latest.put("url", "products/greenmouse.html");
    -        latest.put("name", "green mouse");
    -
    -        /* Get the template (uses cache internally) */
    -        Template temp = cfg.getTemplate("test.ftl");
    -
    -        /* Merge data-model with template */
    -        Writer out = new OutputStreamWriter(System.out);
    -        temp.process(root, out);
    -        // Note: Depending on what `out` is, you may need to call `out.close()`.
    -        // This is usually the case for file output, but not for servlet output.
    -    }
    -}  
    -
    -

    Note

    - -

    I have suppressed the exceptions for the sake of simplicity. - Don't do it in real products.

    -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart_createconfiguration.html b/fmpp/docs/freemarker/pgui_quickstart_createconfiguration.html deleted file mode 100644 index 4a927ce..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart_createconfiguration.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - FreeMarker Manual - Create a configuration instance - - - - - - - - -
    - - - - - -

    -Create a configuration instance

    - - -

    First you have to create a - freemarker.template.Configuration instance and - adjust its settings. A Configuration instance is a - central place to store the application level settings of FreeMarker. - Also, it deals with the creation and caching of - pre-parsed templates (i.e., Template - objects).

    Normally you will do this only once at the - beginning of the application (possibly servlet) life-cycle:

    -
    -// Create your Configuration instance, and specify if up to what FreeMarker
    -// version (here 2.3.21) do you want to apply the fixes that are not 100%
    -// backward-compatible. See the Configuration JavaDoc for details.
    -Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
    -
    -// Specify the source where the template files come from. Here I set a
    -// plain directory for it, but non-file-system sources are possible too:
    -cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates"));
    -
    -// Set the preferred charset template files are stored in. UTF-8 is
    -// a good choice in most applications:
    -cfg.setDefaultEncoding("UTF-8");
    -
    -// Sets how errors will appear.
    -// During development TemplateExceptionHandler.HTML_DEBUG_HANDLER is better.
    -cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);  
    -

    From now you should use this single - configuration instance (i.e., its a singleton). Note however that if a - system has multiple independent components that use FreeMarker, then - of course they will use their own private - Configuration instances.

    -

    Warning!

    - -

    Do not needlessly re-create Configuration - instances; it's expensive, among others because you lose the caches. - Configuration instances meant to - application-level singletons.

    -
    -

    When using in multi-threaded applications (like for Web sites), - the settings in the Configuration instance must not - be modified anymore after this point. Then it can be treated as - "effectively immutable" object, so you can continue with - safe publishing techniques (see JSR 133 and - related literature) to make the instance available for the other - threads. Like, publish the instance through a final or volatile filed, - or through a thread-safe IoC container, but not through a plain field. - (Configuration methods that don't deal with - modifying settings are thread-safe.)

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart_createdatamodel.html b/fmpp/docs/freemarker/pgui_quickstart_createdatamodel.html deleted file mode 100644 index 2b120d4..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart_createdatamodel.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - FreeMarker Manual - Create a data-model - - - - - - - - -
    - - - - - -

    -Create a data-model

    - - -

    In simple cases you can build data-models using - java.lang and java.util classes - and custom Java Beans:

    -
      -
    • -

      Use java.lang.String for strings.

      -
    • - -
    • -

      Use java.lang.Number descents for - numbers.

      -
    • - -
    • -

      Use java.lang.Boolean for boolean - values.

      -
    • - -
    • -

      Use java.util.List or Java arrays for - sequences.

      -
    • - -
    • -

      Use java.util.Map for hashes.

      -
    • - -
    • -

      Use your custom bean class for hashes where the items - correspond to the bean properties. For example the - price property - (getProperty()) of product - can be get as product.price. (The actions of - the beans can be exposed as well; see much later here)

      -
    • -
    -

    For example, let's build the data-model of the first example of the Template Author's - Guide. For convenience, here it is again:

    -
    -(root)
    -  |
    -  +- user = "Big Joe"
    -  |
    -  +- latestProduct
    -      |
    -      +- url = "products/greenmouse.html"
    -      |
    -      +- name = "green mouse"  
    -

    This is the Java code fragment that builds this - data-model:

    -
    -// Create the root hash
    -Map root = new HashMap();
    -// Put string ``user'' into the root
    -root.put("user", "Big Joe");
    -// Create the hash for ``latestProduct''
    -Map latest = new HashMap();
    -// and put it into the root
    -root.put("latestProduct", latest);
    -// put ``url'' and ``name'' into latest
    -latest.put("url", "products/greenmouse.html");
    -latest.put("name", "green mouse");  
    -

    For the latestProduct you might as well use a - Java Bean that has url and name - properties (that is, an object that has public String - getURL() and String getName() methods); - it's the same from viewpoint of the template. Similarly, the root - could be a Java Bean with user and - lastestProduct properties.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart_gettemplate.html b/fmpp/docs/freemarker/pgui_quickstart_gettemplate.html deleted file mode 100644 index 1ee81cf..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart_gettemplate.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - FreeMarker Manual - Get the template - - - - - - - - -
    - - - - - -

    -Get the template

    - - -

    Templates are represented by - freemarker.template.Template instances. Typically - you obtain a Template instance from the - Configuration instance. Whenever you need a - template instance you can get it with its - getTemplate method. Store the example template in the - test.ftl file of the earlier set - directory, then you can do this:

    -
    -Template temp = cfg.getTemplate("test.ftl");  
    -

    When you call this, it will create a Template - instance corresponds to test.ftl, by reading - /where/you/store/templates/test.ftl - and parsing (compile) it. The Template instance - stores the template in the parsed form, and not as text.

    Configuration caches - Template instances, so when you get - test.ftl again, it probably won't read and parse - the template file again, just returns the same - Template instance as for the first time.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/pgui_quickstart_merge.html b/fmpp/docs/freemarker/pgui_quickstart_merge.html deleted file mode 100644 index 6226ca4..0000000 --- a/fmpp/docs/freemarker/pgui_quickstart_merge.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - FreeMarker Manual - Merging the template with the data-model - - - - - - - - -
    - - - - - -

    -Merging the template with the data-model

    - - -

    As we know, data-model + template = output, and we have a - data-model (root) and a template - (temp), so to get the output we have to merge them. - This is done by the process method of the template. - It takes the data-model root and a Writer as - parameters. It writes the produced output to the - Writer. For the sake of simplicity here I write to - the standard output:

    -
    -Writer out = new OutputStreamWriter(System.out);
    -temp.process(root, out);  
    -

    This will print to your terminal the output what you have seen - in the first example of the - Template Author's Guide.

    Java I/O related notes: Depending on what out - is, you may need to ensure that out.close() is - called. This is typically needed when out writes - into a file that was opened to store the output of the template. In - other times, like in typical Web applications, you must - not close out. FreeMarker - calls out.flush() after a successful template - execution (can be disabled in Configuration), so - you don't need to worry about that.

    Note that once you have obtained a Template - instance, you can merge it with different data-models for unlimited - times (Template instances are stateless). Also, the - test.ftl file is accessed only while the - Template instance is created, not when you call the - process method.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/preface.html b/fmpp/docs/freemarker/preface.html deleted file mode 100644 index 9bebc77..0000000 --- a/fmpp/docs/freemarker/preface.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - - FreeMarker Manual - Preface - - - - - - - - -
    - - - - - -

    -Preface

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -What is FreeMarker?

    - - -

    FreeMarker is a template engine: a generic - tool to generate text output (anything from HTML to autogenerated source - code) based on templates. It's a Java package, a class library for Java - programmers. It's not an application for end-users in itself, but - something that programmers can embed into their products.

    - -

    FreeMarker is designed to be practical for the generation of - HTML Web pages, particularly by servlet-based - applications following the MVC (Model View - Controller) pattern. The idea behind using the MVC pattern for - dynamic Web pages is that you separate the designers (HTML authors) from - the programmers. Everybody works on what they are good at. Designers can - change the appearance of a page without programmers having to change or - recompile code, because the application logic (Java programs) and page - design (FreeMarker templates) are separated. Templates do not become - polluted with complex program fragments. This separation is useful even - for projects where the programmer and the HTML page author is the same - person, since it helps to keep the application clear and easily - maintainable.

    - -

    Although FreeMarker has some programming capabilities, it is - not a full-blown programming language like PHP. - Instead, Java programs prepare the data to be displayed (like issue SQL - queries), and FreeMarker just generates textual pages that display the - prepared data using templates.

    - -

    figure

    - - -

    FreeMarker is not a Web application - framework. It is suitable as a component in a Web application framework, - but the FreeMarker engine itself knows nothing about HTTP or servlets. - It simply generates text. As such, it is perfectly usable in non-web - application environments as well. Note, however, that we provide - out-of-the-box solutions for using FreeMarker as the view component of - Model 2 frameworks such as Struts.

    - -

    FreeMarker is Free, - released under the Apache License, Version 2.0. It is OSI Certified Open Source - Software. OSI Certified is a certification mark of the Open - Source Initiative.

    - - - - - -

    -What should I read?

    - - -

    If you are a ...

    - -
    -
    - - - - - - -

    -Document conventions

    - - -

    Variable names, template fragments, Java class names, etc. are - written like this: foo.

    - -

    If something should be replaced with a concrete value then it is - written in italics, as follows: Hello - yourName!.

    - -

    Template examples are written like this:

    - -
    -
    -something  
    - - -

    Data-model examples are written like this:

    - -
    -
    -something  
    - - -

    Output examples are written like this:

    - -
    -
    -something  
    - - -

    Program examples are written like this:

    - -
    -
    -something  
    - - - - -

    In chapters written for both designers and programmers fragments - addressed to programmers are written like this: This is for programmers only.

    - -

    New terms are emphasized like this: some new - term

    - - - - - -

    -Contact

    - - - - - - - - - - -

    For the latest version of FreeMarker and to subscribe to the - mailing lists visit the FreeMarker homepage: http://freemarker.org

    - -

    If you need help or you have - suggestions, use the mailing lists (mail archives - can be searched without subscription) or the Web based forums. If you - want to report a bug, use the Web based bug - tracker, or the mailing lists. To find all of these visit http://freemarker.org. Also, note that - we have a FAQ and index; use them.

    - - - - - -

    -About this document

    - - -

    If you find any mistakes (including - grammatical mistakes, typos, - typographical mistakes) or you find something misleading or - confusing in the documentation, or you have other - suggestions, please let me know! Email: ddekany at - users.sourceforge.net

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref.html b/fmpp/docs/freemarker/ref.html deleted file mode 100644 index 7e23455..0000000 --- a/fmpp/docs/freemarker/ref.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - FreeMarker Manual - Template Language Reference - - - - - - - - - - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins.html b/fmpp/docs/freemarker/ref_builtins.html deleted file mode 100644 index b4da8b4..0000000 --- a/fmpp/docs/freemarker/ref_builtins.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-in Reference - - - - - - - - -
    - - - - - -

    -Chapter 1   Built-in Reference

    - - - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_alphaidx.html b/fmpp/docs/freemarker/ref_builtins_alphaidx.html deleted file mode 100644 index b4e458a..0000000 --- a/fmpp/docs/freemarker/ref_builtins_alphaidx.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - - FreeMarker Manual - Alphabetical index - - - - - - - - -
    - - - - - -

    -Alphabetical index

    - - -
    -
    -

    See the built-ins filtered by left-hand-value type here.

    If you don't find a built-in here that you have seen in a - working template, probably you will find it here: Deprecated FTL constructs

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_boolean.html b/fmpp/docs/freemarker/ref_builtins_boolean.html deleted file mode 100644 index 05999ca..0000000 --- a/fmpp/docs/freemarker/ref_builtins_boolean.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for booleans - - - - - - - - -
    - - - - - -

    -Built-ins for booleans

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -c (when used with boolean)

    - - - - - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.20.

    -
    - - -

    This built-in converts a boolean to string for a - "computer language" as opposed to for human audience. - The result will be "true" or - "false", regardless of the - boolean_format setting. When generating - JavaScript and such, this should be used, as otherwise changing the - boolean_format can break the generated - computer-language output.

    - -

    Note that this built-in also - works on strings.

    - - - - - -

    -string (when used with a boolean value)

    - - - - - - - - - - - - -

    Converts a boolean to a string. You can use it in two - ways:

    - -
    -
      -
    • -

      As foo?string("yes", "no"): This will - return the first parameter (here: "yes") if - the boolean is true, otherwise the second parameter (here: - "no"). Note that the return value is always a - string; if the parameters were numbers, they would be converted - to strings first.

      -
    • - -
    • -

      foo?string: Deprecated - starting from FreeMarker 2.3.20: use ?c - instead, or set the boolean_format setting to something like - "yes,no" and then the conversion can happen - automatically. If you still need to know about this, - this will convert the boolean to string using the default - strings for representing true and false values. By default, true - is rendered as "true" and false is rendered - as "false". This is mostly useful if you - generate source code with FreeMarker (but use - ?c for that starting from 2.3.20), - since the values are not locale (language, country) sensitive. - To change these default strings, you can use the - boolean_format setting.

      - -

      Note, that in the very rare case - when a value is multi-typed and is both a boolean and a string, - then the string value of the variable will be returned, and so - the boolean_format setting will have no - effect.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_date.html b/fmpp/docs/freemarker/ref_builtins_date.html deleted file mode 100644 index 5c4de34..0000000 --- a/fmpp/docs/freemarker/ref_builtins_date.html +++ /dev/null @@ -1,607 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for date/time/date-time values - - - - - - - - -
    - - - - - -

    -Built-ins for date/time/date-time values

    - - - - - - - - - -

    -date, time, datetime (when used with a date/time/date-time - value)

    - - - - - - - - - - - - -

    These built-ins can be used to specify which parts of the - date-like variable are in use:

    - -
    -
      -
    • -

      date: Date only, no time of the - day.

      -
    • - -
    • -

      time: Only the time of the day, no date - part

      -
    • - -
    • -

      datetime: Both date and time

      -
    • -
    - - -

    Ideally, you do not need to use these built-ins. - Unfortunately, because of the technical limitations of the Java - platform, FreeMarker sometimes can't find out which parts of a - date-like value is a date, a time or a date-time; ask the - programmers which variables has this problem. If FreeMarker has to - execute an operation where this information is needed -- such as - displaying the value as text -- but it does not know which parts are - in use, it will stop with error. This is when you have to use these - built-ins. For example, assume openingTime is a - such problematic variable:

    - -
    -
    -<#assign x = openingTime> <#-- no problem can occur here -->
    -${openingTime?time} <#-- without ?time it would fail -->
    -<#-- For the sake of better understanding, consider this: -->
    -<#assign openingTime = openingTime?time>
    -${openingTime} <#-- this will work now -->  
    - - -

    These built-ins can also be used to convert date-time values - to date or time. For example:

    - -
    -
    -Last updated: ${lastUpdated} <#-- assume that lastUpdated is a date-time value -->
    -Last updated date: ${lastUpdated?date}
    -Last updated time: ${lastUpdated?time}  
    - - -

    will output something like:

    - -
    -
    -Last updated: 04/25/2003 08:00:54 PM
    -Last updated date: 04/25/2003
    -Last updated time: 08:00:54 PM  
    - - -

    If the left side of the ? is string, then - these built-ins convert - strings to date/time/date-time.

    - - - - - -

    -date_if_unknown, time_if_unknown, datetime_if_unknown

    - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.21.

    -
    - - -

    The date_if_unknown, - time_if_unknown, - datetime_if_unknown built-ins mark a date-like - value with some of the sub-types: date without time, time, or - date-time, respectively. However, if the value already holds this - information, the built-in has no effect. That is, it will never - convert the sub-type of a value, it only adds the sub-type if it was - unknown.

    - - - - - -

    -iso_...

    - - - - - - -
    -

    Note

    - -

    These built-ins are deprecated since - FreeMarker 2.3.21, where the date_format, - time_format and - datetime_format settings understand - "iso" (for ISO 8601:2004 format) and - "xs" (for XML Schema format) in additionally to - the Java SimpleDateFormat patterns. Thus the - default format can be set to ISO 8601, or for one time ISO - formatting you can use myDate?string.iso. See more - here...

    -
    - - -

    These built-ins convert a date, time or date-time value to - string that follows ISO 8601:2004 "extended" format.

    - -

    This built-in has several variations: - iso_utc, iso_local, - iso_utc_nz, iso_local_nz, - iso_utc_m, iso_utc_m_nz, etc. - The name is constructed from the following words in this order, each - separated with a _ from the next:

    - -
      -
    1. -

      iso (required)

      -
    2. - -
    3. -

      Either utc or local - (required (except when it's given with a parameter, but see that - later)): Specifies whether you want to print the - date/time/date-time according to UTC or according the current - time zone. The current time zone is decided by the - time_zone FreeMarker setting and is normally - configured by the programmers outside the templates (but it can - also be set in a template, like <#setting - time_zone="America/New_York"> for example). Note - that if the sql_date_and_time_time_zone - FreeMarker setting is set and non-null, then - for java.sql.Date and - java.sql.Time values (i.e., for date-only and - time-only values that are coming from database via SQL) - local will mean that time zone instead of the - value of the time_zone setting.

      -
    4. - -
    5. -

      Either h or m or - ms (optional): The accuracy of the time part. - When omitted, it defaults to seconds accuracy (like - 12:30:18). h means hours - accuracy (like 12), m - means minutes accuracy (12:30), and - ms means milliseconds accuracy - (12:30:18.25, where we have 250 ms). Note - that when using ms, the milliseconds are - displayed as fraction seconds (following the standard) and will - not have trailing 0-s. Thus, if the the - millisecond part happens to be 0, the whole - fraction second part will be omitted. Also note that the - fraction seconds are always separated with a dot , not with - comma (to follow the Web conventions and XML Schema - time/dateTime canonical format).

      -
    6. - -
    7. -

      nz (optional): nz - (like in ${foo?utc_local_nz}) stands for - "no zone", which means that the time zone offset - (like +02:00 or or -04:30 - or Z) will not be displayed. If this part is - omitted (like in ${foo?utc_local}) the zone - will be displayed, except in two cases:

      - -
      -
        -
      • -

        If the value is a date (no time part) value (again, - ISO 8901 doesn't allow it then)

        -
      • - -
      • -

        If the value is a java.sql.Time and - the incompatible_improvements (often set - via the Java Configuration constructor - parameter) FreeMarker configuration setting is at least - 2.3.21. This is because most databases store time values - that aren't in any time zone, but just store hour, minute, - second, and decimal second field values, so showing the time - zone doesn't make sense.

        -
      • -
      - - -

      Note that since FreeMarker 2.3.19, the offset always - contains the minutes for XML Schema date/time/dateTime format - compliance. (However, if you primarily generate for the XML - Schema format, use the xs format.)

      -
    8. -
    - -

    Example:

    - -
    -
    -<#assign aDateTime = .now>
    -<#assign aDate = aDateTime?date>
    -<#assign aTime = aDateTime?time>
    -
    -Basic formats:
    -${aDate?iso_utc}
    -${aTime?iso_utc}
    -${aDateTime?iso_utc}
    -
    -Different accuracies:
    -${aTime?iso_utc_ms}
    -${aDateTime?iso_utc_m}
    -
    -Local time zone:
    -${aDateTime?iso_local}  
    - - -

    A possible output (depends on current time and time - zone):

    - -
    -
    -Basic formats:
    -2011-05-16
    -21:32:13Z
    -2011-05-16T21:32:13Z
    -
    -Different accuracies:
    -21:32:13.868Z
    -2011-05-16T21:32Z
    -
    -Local time zone:
    -2011-05-16T23:32:13+02:00  
    - - -

    There is yet another group of iso_... - built-in variants, where you omit the local or - utc word from the name and instead specify the - time zone as a parameter to the built-in. Example:

    - -
    -
    -<#assign aDateTime = .now>
    -${aDateTime?iso("UTC")}
    -${aDateTime?iso("GMT-02:30")}
    -${aDateTime?iso("Europe/Rome")}
    -
    -The usual variations are supported:
    -${aDateTime?iso_m("GMT+02")}
    -${aDateTime?iso_m_nz("GMT+02")}
    -${aDateTime?iso_nz("GMT+02")}  
    - - -

    A possible output (depends on current time and time - zone):

    - -
    -
    -2011-05-16T21:43:58Z
    -2011-05-16T19:13:58-02:30
    -2011-05-16T23:43:58+02:00
    -
    -The usual variations are supported:
    -2011-05-16T23:43+02:00
    -2011-05-16T23:43
    -2011-05-16T23:43:58  
    - - -

    If the time zone parameter can't be interpreted, the template - processing will be terminated with error.

    - -

    The parameter can be a - java.util.TimeZone object too (which is possibly - the return value of a Java method, or it's in the data-model), not - just a string.

    - - - - - -

    -string (when used with a date/time/date-time value)

    - - - - - - - - - - - - - - - - - - - - - - - - -

    This built-in converts a date to a string, with the specified - formatting.

    - -
    -

    Note

    - -

    You should need this built-in rarely, as the default format - of date/time/date-time values can be specified globally with the - date_format, time_format and - datetime_format settings of FreeMarker. - Use this built-in only at the places where the desired format - differs from the one normally used. For the other places the - default format should be set properly by the programmers, outside - the templates.

    -
    - - -

    The desired format can be specified like - ?string.format or - ?string["format"](or - the historical equivalent, - ?string("format")). - These are equivalent, except that with the quoted formats you can - include any characters in the - format, like spaces. - The syntax of format - is exactly the same as of the date_format, - time_format and - datetime_format configuration settings; see the documentation of the - possible values there.

    - -

    Example: If the locale of the output is U.S. English, and the - time zone is the U.S. Pacific Time zone, and - openingTime is a - java.sql.Time, nextDiscountDay - is java.sql.Date and - lastUpdated is - java.sql.Timestamp or - java.util.Date then this:

    - -
    -
    -${openingTime?string.short}
    -${openingTime?string.medium}
    -${openingTime?string.long}
    -${openingTime?string.full}
    -${openingTime?string.xs}
    -${openingTime?string.iso}
    -
    -${nextDiscountDay?string.short}
    -${nextDiscountDay?string.medium}
    -${nextDiscountDay?string.long}
    -${nextDiscountDay?string.full}
    -${nextDiscountDay?string.xs}
    -${nextDiscountDay?string.iso}
    -
    -${lastUpdated?string.short}
    -${lastUpdated?string.medium}
    -${lastUpdated?string.long}
    -${lastUpdated?string.full}
    -${lastUpdated?string.medium_short} <#-- medium date, short time -->
    -${lastUpdated?string.xs}
    -${lastUpdated?string.iso}
    -
    -<#-- SimpleDateFormat patterns: -->
    -${lastUpdated?string["dd.MM.yyyy, HH:mm"]}
    -${lastUpdated?string["EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'"]}
    -${lastUpdated?string["EEE, MMM d, ''yy"]}
    -${lastUpdated?string.yyyy} <#-- Same as ${lastUpdated?string["yyyy"]} -->
    -
    -<#-- Advanced ISO 8601-related formats: -->
    -${lastUpdated?string.iso_m_u}
    -${lastUpdated?string.xs_ms_nz}  
    - - -

    will print something like this:

    - -
    -
    -01:45 PM
    -01:45:09 PM
    -01:45:09 PM PST
    -01:45:09 PM PST
    -13:45:09-08:00
    -13:45:09-08:00
    -
    -2/20/07
    -Apr 20, 2007
    -April 20, 2007
    -Friday, April 20, 2007
    -2007-02-20-08:00
    -2007-02-20
    -
    -2/20/07 01:45 PM
    -Feb 20, 2007 01:45:09 PM
    -February 20, 2007 01:45:09 PM PST
    -Friday, February 20, 2007 01:45:09 PM PST
    -Feb 8, 2003 9:24 PM
    -2007-02-20T13:45:09-08:00
    -2007-02-20T13:45:09-08:00
    -
    -08.04.2003 21:24
    -Tuesday, April 08, 2003, 09:24 PM (PDT)
    -Tue, Apr 8, '03
    -2003
    -
    -2007-02-20T21:45Z
    -2007-02-20T13:45:09.000  
    - - -
    -

    Warning!

    - -

    Unfortunately, because of the limitations of the Java - platform, it can happen that you have date-like variables in the - data-model, where FreeMarker can't decide if the variable is a - date (year, month, day), or a time (hour, minute, second, - millisecond) or a date-time. In this case, FreeMarker doesn't know - how to display the value when you write something like - ${lastUpdated?string.short} or - ${lastUpdated?string.xs}, i.e., a format that - doesn't specify the exact fields to display, or if you simply use - ${lastUpdated}. Then it will have to stop with - error. To prevent this, you can help FreeMarker with the ?date, - ?time and ?datetime - built-ins. For example: - ${lastUpdated?datetime?string.short}. Ask the - programmers if certain variables of the data-model have this - problem, or always use ?date, - ?time and ?datetime - built-ins to be on the safe side.

    -
    - - -
    -

    Note

    - -

    You never need to use ?date, - ?time or ?datetime with - format patterns like "yyyy.MM.dd HH:mm", since - with the pattern you tell FreeMarker what parts of the date to - show. However, FreeMarker will trust you blindly, so you can show - "noise" if you display parts that are actually not stored in the - variable. For example, ${openingTime?string["yyyy-MM-dd - hh:mm:ss a"]}, where openingTime - stores only time, will display 1970-01-01 09:24:44 - PM.

    -
    - - -

    To prevent misunderstandings, the format need not be a string - literal, it can be a variable or any other expression, like in - "..."?string[myFormat].

    - -

    See also: the - interpolation of dates

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_expert.html b/fmpp/docs/freemarker/ref_builtins_expert.html deleted file mode 100644 index d9ba8cd..0000000 --- a/fmpp/docs/freemarker/ref_builtins_expert.html +++ /dev/null @@ -1,622 +0,0 @@ - - - - - - - - FreeMarker Manual - Seldom used and expert built-ins - - - - - - - - -
    - - - - - -

    -Seldom used and expert built-ins

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    These are the built-ins that normally you should not use, but in - exceptional situations (debugging, advanced macros) they can be - useful. If you need to use these in your normal page templates, you - may revisit the data-model so you don't need to use these.

    - - - - -

    -byte, double, float, int, long, short

    - - - - - - - - - - - - - - - - - - - - - - -

    Returns a SimpleNumber which contains the - same value as the original variable, but uses - java.lang.Type for the - internal representation of the value. This is useful if a method is - overloaded, or if a TemplateModel unwrapper has - problem with automatically choosing the suitable - java.lang.* type. Note that since version 2.3.9 - the unwrapper has been improved substantially, so you will hardly - ever need to use these built-ins to convert between numerical types, - except for resolving ambiguity in overloaded method - invocation.

    - -

    The long built-in can also be used with - date, time and date-time values to get the value as - java.util.Date.getTime() would return. This is - useful if you have to call a Java methods that expect a timestamp as - a long. This conversion is not automatic.

    - - - - - -

    -eval

    - - - - - - -

    This built-in evaluates a string as an FTL expression. For - example "1+2"?eval returns number 3.

    - - - - - -

    -has_content

    - - - - -

    It is true if the variable exists (and - isn't Java null) and is not ``empty'', otherwise - it is false. The meaning of ``empty'' depends on - the concrete case. This follows intuitive common-sense ideas. The - following are empty: a string with 0 length, sequence or hash with - no subvariables, a collection which has passed the last element. If - the value is not a string or sequence or hash or collection, then it - counts as non-empty if it's a number or a date or a boolean (e.g. - 0 and false are not empty), - otherwise it counts as empty. Note that when your data-model - implements multiple template model interfaces you may get unexpected - results. However, when in doubt you can use always use - expr!?size > 0 or expr!?length > - 0 instead of expr?has_content.

    - -

    This buit-in is exceptional in that you can use the - parentheses trick like with the default value - operator. That is, you can write both - product.color?has_content and - (product.color)?has_content. The first doesn't - handle the case when product is missing, the last - does.

    - - - - - -

    -interpret

    - - - - -

    This built-in interprets a string as a FTL template, and - returns an user-defined directive that - when applied to any block - - executes the template just as if it was included at that point. - Example:

    - -
    -
    -<#assign x=["a", "b", "c"]>
    -<#assign templateSource = r"<#list x as y>${y}</#list>">
    -<#-- Note: That r was needed so that the ${y} is not interpreted above -->
    -<#assign inlineTemplate = templateSource?interpret>
    -<@inlineTemplate />  
    - - -

    The output:

    - -
    -
    -abc  
    - - -

    As you can see, inlineTemplate is a - user-defined directive that, when executed, runs the template that - was generated on-the-fly using the - interpret.

    - -

    You can also apply this built-in to a two-element sequence. In - this case the first element of the sequence is the template source, - and the second element is a name for the inline template. It can be - useful to give an explicit name to the inline template for debugging - purposes. So, you could have written:

    - -
    -
    -<#assign inlineTemplate = [templateSource, "myInlineTemplate"]?interpret>  
    - - -

    as well in the above template. Note that giving the inline - template a name has no immediate effect - it is only useful as an - extra bit of information if you get an error report.

    - - - - - -

    -is_...

    - - - - - - -

    These built-ins check the type of a variable, and returns - true or false depending on the - type. The list of - is_... - built-ins:

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Built-inReturns true if the value is a ...
    is_stringstring
    is_numbernumber
    is_booleanboolean
    is_dateDon't use it! Same as is_date_like, use - that instead. Later may changes meaning to - date_only.
    is_date_likedate-like, means either date, time or date-time, or - date-like with unknown precise type (since FreeMarker - 2.3.21)
    is_date_onlydate (no time of the day part) (since FreeMarker - 2.3.21)
    is_timetime (no year-month-day part) (since FreeMarker - 2.3.21)
    is_datetimedate-time (contains both year-month-day and time of the - day)
    is_unknown_date_likedate-like where we don't know if it's a date or a time or - a date-time
    is_methodmethod
    is_transformtransform
    is_macromacro or function (yes, also for function; a historical - glitch)
    is_hashhash
    is_hash_exextended hash (i.e. supports ?keys and - ?values)
    is_sequencesequence
    is_collectioncollection
    is_enumerablesequence or collection
    is_indexablesequence
    is_directiveWhatever kind of directive (for example a macro, or - TemplateDirectiveModel, - TemplateTransformModel, etc.), or - function (a historical glitch)
    is_nodenode
    -
    - - - - - - -

    -namespace

    - - - - -

    This built-in returns the namespace (i.e. the ``gate'' hash to - the namespace) associated with a macro or function variable. You can - use it with macros and functions only.

    - - - - - -

    -new

    - - - - - - -

    This is to create a variable of a certain - TemplateModel implementation.

    - -

    On the left side of ? you specify a string, - the full-qualified class name of a TemplateModel - implementation. The result is a method variable that calls the - constructor, and returns the new variable.

    - -

    Example:

    - -
    -
    -<#-- Creates an user-defined directive be calling the parameterless constructor of the class -->
    -<#assign word_wrapp = "com.acmee.freemarker.WordWrapperDirective"?new()>
    -<#-- Creates an user-defined directive be calling the constructor with one numerical argument -->
    -<#assign word_wrapp_narrow = "com.acmee.freemarker.WordWrapperDirective"?new(40)>  
    - - -

    For more information about how the constructor parameters are - unwrapped and how overloaded constructor is chosen, read: Programmer's Guide/Miscellaneous/Bean wrapper

    - -

    This built-in can be a security concern because the template - author can create arbitrary Java objects and then use them, as far - as they implement TemplateModel. Also the - template author can trigger static initialization for classes that - don't even implement TemplateModel. You can - (since 2.3.17) restrict the classes accessible with this built-in - using - Configuration.setNewBuiltinClassResolver(TemplateClassResolver) - or the new_builtin_class_resolver setting. See - the Java API docs for more information. If you are allowing - not-so-much-trusted users to upload templates then you should - definitely look into this topic.

    - - - - - -

    -number_to_date, number_to_time, number_to_datetime

    - - - - - - - - - - - - - - - - -

    These are used to convert a number (usually a Java - long) to a date, time or date-time, respectively. - This does them same as new java.util.Date(long) - in Java, that is, the number is interpreted as the milliseconds - passed since the epoch. The number can be anything and of any type - as far as its value fits into a long. If the - number isn't a whole number, it will be rounded to whole with - half-up rule. This conversion is not automatic.

    - -

    Example:

    - -
    -
    -${1305575275540?number_to_datetime}
    -${1305575275540?number_to_date}
    -${1305575275540?number_to_time}  
    - - -

    The output will be something like this (depending on the - current locale and time zone):

    - -
    -
    -May 16, 2011 3:47:55 PM
    -May 16, 2011
    -3:47:55 PM  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_hash.html b/fmpp/docs/freemarker/ref_builtins_hash.html deleted file mode 100644 index cfa630d..0000000 --- a/fmpp/docs/freemarker/ref_builtins_hash.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for hashes - - - - - - - - -
    - - - - - -

    -Built-ins for hashes

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -keys

    - - - - -

    A sequence that contains all the lookup keys in the hash. Note - that not all hashes support this (ask the programmer if a certain - hash allows this or not).

    - -
    -
    -<#assign h = {"name":"mouse", "price":50}>
    -<#assign keys = h?keys>
    -<#list keys as key>${key} = ${h[key]}; </#list>  
    - - -

    Output:

    - -
    -
    -name = mouse; price = 50;  
    - - -

    Since hashes do not define an order for their subvariables in - general, the order in which key names are returned can be arbitrary. - However, some hashes maintain a meaningful order (ask the programmer - if a certain hash does that or not). For example, hashes created - with the above {...} - syntax preserve the same order as you have specified the - subvariables.

    - - - - - -

    -values

    - - - - -

    A sequence that contains all the variables in the hash. Note - that not all hashes support this (ask the programmer if a certain - hash allows this or not).

    - -

    As of the order in which the values are returned, the same - applies as with the keys built-in; see - there.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_node.html b/fmpp/docs/freemarker/ref_builtins_node.html deleted file mode 100644 index aee323a..0000000 --- a/fmpp/docs/freemarker/ref_builtins_node.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for nodes (for XML) - - - - - - - - -
    - - - - - -

    -Built-ins for nodes (for XML)

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Note that the variables returned by these built-ins are - generated by the node variable implementation it is used with. This - means that the returned variables can have extra features in - additional to what it stated here, for example, with the XML DOM nodes the sequence retuned by - the children built-in also can be used as hash and - maybe as string, as it is described in the part - about XML processing.

    - - - - -

    -ancestors

    - - - - -

    A sequence that contains all the node's ancestors, starting - with the immediate parent and ending with the root node. The result - of this built-in is also a method, by which you can filter the - result with the full-qualified name of the - node. For example as node?ancestors("section") to - get the sequence of all ancestors with name - section.

    - - - - - -

    -children

    - - - - -

    A sequence that contains all of this node's child nodes (i.e. - immediate descendant nodes).

    - -

    XML: This is almost the same as special hash key - *, except that it returns all nodes, not only - elements. So the possible children are element nodes, text nodes, - comment nodes, processing instruction nodes, etc. but - not attribute nodes. Attribute nodes are - excluded from the sequence.

    - - - - - -

    -node_name

    - - - - -

    Returns the string that is used to determine what user-defined - directive to invoke to handle this node when it is ``visited''. See: - the visit and recurse directives.

    - -

    XML: If the node is an element or attribute, then the string - will be the local (prefix free) name of the element or attribute. - Otherwise the name usually starts with @ followed - by the node type. See this - table. Note that this node name is not the same as the node - name returned in the DOM API; the goal of FreeMarker node names is - to give the name of the used-defined directive that will process the - node.

    - - - - - -

    -node_namespace

    - - - - -

    Returns the namespace string of the node. FreeMarker does not - define the exact meaning of node namespace; it depends on what your - node variables are modeling. It's possible that a node doesn't have - any node namespace defined. In this case, the built-in should - evaluate to undefined variable (i.e. - node?node_namespace?? - is false), so you can't use the returned - value.

    - -

    XML: In the case of XML, it's the XML namespace URI (such as - "http://www.w3.org/1999/xhtml"). If an element or - attribute node does not use XML namespace, then this built-in - evaluates to an empty string. For other XML nodes this built-in - always return undefined variable.

    - - - - - -

    -node_type

    - - - - -

    A string that describes the type of node this is. FreeMarker - does not define the exact meaning of node type; it depends on what - your variables are modeling. It's possible that a node doesn't - support node type at all. In this case, the built-in evaluates to an - undefined value, so you can't use the returned value. (You can still - check if a node supports the type property with - node?node_type??.)

    - -

    XML: The possible values are: "attribute", - "text", "comment", - "document_fragment", - "document", "document_type", - "element", "entity", - "entity_reference", - "notation", "pi". Note that a - there is no "cdata" type, because CDATA is - considered as plain text node.

    - - - - - -

    -parent

    - - - - -

    The node that is this node's immediate parent in the node - tree. The root node has no parent node, so for the root node, the - expression - node?parent?? - evaluates to false.

    - -

    XML: Note that the value returned by this built-in is also a - sequence (same as the result of XPath expression - .., when you write - someNode[".."]). Also note that for attribute - nodes, it returns the element the attribute belongs to, despite that - attribute nodes are not counted as children of the element.

    - - - - - -

    -root

    - - - - -

    The node that is the root of the tree of nodes to which this - node belongs.

    - -

    XML: According to W3C, the root of an XML document is not the - topmost element node, but the document itself, which is the parent - of the topmost element. For example, if you want to get the topmost - element of the XML (the so called ``document - element''; do not mix it with the ``document''), which is called - foo, then you have to write - someNode?root.foo. If you write just - someNode?root, then you get the document itself, - and not the document element.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_number.html b/fmpp/docs/freemarker/ref_builtins_number.html deleted file mode 100644 index 7478d13..0000000 --- a/fmpp/docs/freemarker/ref_builtins_number.html +++ /dev/null @@ -1,531 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for numbers - - - - - - - - -
    - - - - - -

    -Built-ins for numbers

    - - - - -

    Related FAQs: Do you have things like 1,000,000 or 1 000 000 - instead of 1000000, or something like 3.14 instead of 3,14 or vice - versa? See this and this FAQ entry, also note - the c built-in above.

    - - - - -

    -abs

    - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.20.

    -
    - - -

    Gives the absolute value of a number. For example - x?abs , if x is -5, will - evaluate to 5.

    - - - - - -

    -c (when used with numerical value)

    - - - - - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.3.

    -
    - - -

    This built-in converts a number to string for a - "computer language" as opposed to for human audience. - That is, it formats with the rules that programming languages used - to use, which is independent of all the locale and number format - settings of FreeMarker. It always uses dot as decimal separator, and - it never uses grouping separators (like 3,000,000), nor exponential - form (like 5E20), nor superfluous leading or trailing 0-s (like 03 - or 1.0), nor + sign (like +1). It will print at most 16 digits after - the decimal dot, and thus numbers whose absolute value is less than - 1E-16 will be shown as 0. This built-in is crucial because be - default (like with ${x}) numbers are converted to - strings with the locale (language, country) specific number - formatting, which is for human readers (like 3000000 is possibly - printed as 3,000,000). When the number is printed not for human - audience (e.g., for a database record ID used as the part of an URL, - or as invisible field value in a HTML form, or for printing - CSS/JavaScript numerical literals) this built-in must be used to - print the number (i.e., use ${x?c} instead of - ${x}), or else the output will be possibly broken - depending on the current number formatting settings and locale (like - the decimal point is not dot, but comma in many countries) and the - value of the number (like big numbers are possibly ``damaged'' by - grouping separators).

    - -

    If the incompatible_imporvements FreeMarker - configuration setting is set to 2.3.21 (or higher), this built-in - will return "INF", "-INF" and - "NaN" for positive/negative infinity and IEEE - floating point Not-a-Number, respectively. These are the XML Schema - compatible representations of these special values. (Earlier it has - returned what java.text.DecimalFormat did with US - locale, none of which is understood by any (common) computer - language.)

    - -

    Note that this built-in also works on - booleans.

    - - - - - -

    -is_infinite

    - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.20.

    -
    - - -

    Tells if a number is floating point infinite (according to - IEEE 754). For example, someNumber?is_infinite - evaluates to true or false - depending on if the value of someNumber is - infinite or not. Of course, if the underlying number is not of - floating point type, this will always return - false.

    - - - - - -

    -is_nan

    - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.20.

    -
    - - -

    Tells if a number is floating point NaN (according to IEEE - 754). For example, someNumber?is_nan evaluates to - true or false depending on if - the value of someNumber is NaN or not. Of course, - if the underlying number is not of floating point type, this will - always return false.

    - - - - - -

    -round, floor, ceiling

    - - - - - - - - - - -
    -

    Note

    - -

    The rounding built-ins exist since FreeMarker 2.3.13.

    -
    - - -

    Converts a number to a whole number using the specified - rounding rule:

    - -
    -
      -
    • -

      round: Rounds to the nearest whole - number. If the number ends with .5, then it rounds upwards - (i.e., towards positive infinity)

      -
    • - -
    • -

      floor: Rounds the number downwards - (i.e., towards neagative infinity)

      -
    • - -
    • -

      ceiling: Rounds the number upwards - (i.e., towards positive infinity)

      -
    • -
    - - -

    Example:

    - -
    -
    -<#assign testlist=[
    -  0, 1, -1, 0.5, 1.5, -0.5,
    -  -1.5, 0.25, -0.25, 1.75, -1.75]>
    -<#list testlist as result>
    -    ${result} ?floor=${result?floor} ?ceiling=${result?ceiling} ?round=${result?round}
    -</#list>  
    - - -

    Prints:

    - -
    -
    -    0 ?floor=0 ?ceiling=0 ?round=0            
    -    1 ?floor=1 ?ceiling=1 ?round=1        
    -    -1 ?floor=-1 ?ceiling=-1 ?round=-1      
    -    0.5 ?floor=0 ?ceiling=1 ?round=1      
    -    1.5 ?floor=1 ?ceiling=2 ?round=2      
    -    -0.5 ?floor=-1 ?ceiling=0 ?round=0     
    -    -1.5 ?floor=-2 ?ceiling=-1 ?round=-1    
    -    0.25 ?floor=0 ?ceiling=1 ?round=0     
    -    -0.25 ?floor=-1 ?ceiling=0 ?round=0    
    -    1.75 ?floor=1 ?ceiling=2 ?round=2     
    -    -1.75 ?floor=-2 ?ceiling=-1 ?round=-2  
    - - -

    These built-ins may be useful in pagination operations and - like. If you just want to display numbers in - rounded form, then you should rather use the string - built-in or the number_format - setting.

    - - - - - -

    -string (when used with a numerical value)

    - - - - - - - - - - -

    Converts a number to a string. It uses the default format that - the programmer has specified via the - number_format and the locale - settings. You can also specify a number format explicitly with this - built-in, as it will be shown later.

    - -

    There are four predefined number formats: - computer, currency, - number, and percent. The exact - meaning of these is locale (nationality) specific, and is controlled - by the Java platform installation, rather than by FreeMarker, except - for computer, which uses the same formatting as - the c - built-in. You can use these predefined formats like - this:

    - -
    -
    -<#assign x=42>
    -${x}
    -${x?string}  <#-- the same as ${x} -->
    -${x?string.number}
    -${x?string.currency}
    -${x?string.percent}
    -${x?string.computer}  
    - - -

    If your locale is US English, this will print:

    - -
    -
    -42
    -42
    -42
    -$42.00
    -4,200%
    -42  
    - - -

    The output of first three expressions is identical because the - first two expressions use the default format, which is "number" - here. You can change this default using a setting:

    - -
    -
    -<#setting number_format="currency">
    -<#assign x=42>
    -${x}
    -${x?string}  <#-- the same as ${x} -->
    -${x?string.number}
    -${x?string.currency}
    -${x?string.percent}  
    - - -

    Will now output:

    - -
    -
    -$42.00
    -$42.00
    -42
    -$42.00
    -4,200%  
    - - -

    since the default number format was set to "currency".

    - -

    Beside the three predefined formats, you can use arbitrary - number format patterns written in Java - decimal number format syntax:

    - -
    -
    -<#assign x = 1.234>
    -${x?string["0"]}
    -${x?string["0.#"]}
    -${x?string["0.##"]}
    -${x?string["0.###"]}
    -${x?string["0.####"]}
    -
    -${1?string["000.00"]}
    -${12.1?string["000.00"]}
    -${123.456?string["000.00"]}
    -
    -${1.2?string["0"]}
    -${1.8?string["0"]}
    -${1.5?string["0"]} <-- 1.5, rounded towards even neighbor
    -${2.5?string["0"]} <-- 2.5, rounded towards even neighbor
    -
    -${12345?string["0.##E0"]}  
    - - -

    outputs this:

    - -
    -
    -1
    -1.2
    -1.23
    -1.234
    -1.234
    -
    -001.00
    -012.10
    -123.46
    -
    -1
    -2
    -2 <-- 1.5, rounded towards even neighbor
    -2 <-- 2.5, rounded towards even neighbor
    -
    -1.23E4  
    - - -

    Note that as in FreeMarker foo.bar is - equivalent with foo["bar"], you could also write - x?string.currency as - x?string["currency"], but of course that wouldn't - be practical. But in the above examples we have to use the square - bracket syntax, because the characters involved (numbers, dot, - #) aren't allowed syntactically after the dot - operator.

    - -

    For historical reasons, you could also write things like - x?string("0.#"), which does exactly the same as - x?string["0.#"].

    - -

    Following the financial and statistics practice, the rounding - goes according the so called half-even rule, which means rounding - towards the nearest ``neighbor'', unless both neighbors are - equidistant, in which case, it rounds towards the even neighbor. - This was visible in the above example if you look at the rounding of - 1.5 and of 2.5, as both were rounded to 2, since 2 is even, but 1 - and 3 are odds.

    - -

    As it was shown for the predefined formats earlier, the - default formatting of the numbers can be set in the template:

    - -
    -
    -<#setting number_format="0.##">
    -${1.234}  
    - - -

    outputs this:

    - -
    -
    -1.23  
    - - -

    Note that as number formatting is locale sensitive, the locale - setting also plays role in the formatting:

    - -
    -
    -<#setting number_format=",##0.00">
    -<#setting locale="en_US">
    -US people write:     ${12345678}
    -<#setting locale="hu">
    -German people write: ${12345678}  
    - - -

    outputs this:

    - -
    -
    -US people write:     12,345,678.00
    -German people write: 12.345.678,00  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_sequence.html b/fmpp/docs/freemarker/ref_builtins_sequence.html deleted file mode 100644 index 8e643bd..0000000 --- a/fmpp/docs/freemarker/ref_builtins_sequence.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for sequences - - - - - - - - -
    - - - - - -

    -Built-ins for sequences

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -chunk

    - - - - - - - - -
    -

    Note

    - -

    This built-in exists since FreeMarker 2.3.3.

    -
    - - -

    This built-in splits a sequence into multiple sequences of the - size given with the 1st parameter to the built-in (like - mySeq?chunk(3)). The result is the sequence of - these sequences. The last sequence is possibly shorter than the - given size, unless the 2nd parameter is given (like - mySeq?chunk(3, '-')), that is the item used to - make up the size of the last sequence to the given size. - Example:

    - -
    -
    -<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
    -
    -<#list seq?chunk(4) as row>
    -  <#list row as cell>${cell} </#list>
    -</#list>
    -
    -<#list seq?chunk(4, '-') as row>
    -  <#list row as cell>${cell} </#list>
    -</#list>  
    - - -

    The output will be:

    - -
    -
    -
    -  a b c d 
    -  e f g h 
    -  i j 
    -
    -  a b c d 
    -  e f g h 
    -  i j - - 
    -   
    - - -

    This built in is mostly for outputting sequnces in - tabular/columnar format. When used with HTML tables, the 2nd - parameter is often "\xA0" (that is the code of - the no-break space character, also known as ``nbsp''), so the border - of the empty TD-s will not be missing.

    - -

    The 1st parameter must be a number that is at least 1. If the - number is not integer, it will be silently rounded down to integer - (i.e. both 3.1 and 3.9 will be rounded to 3). The 2nd parameter can - be of any type and value.

    - - - - - -

    -first

    - - - - -

    The first subvariable of the sequence. Template processing - will die with error if the sequence is empty.

    - - - - - -

    -join

    - - - - -

    Concatenates the items of a sequence to a single string, with - the given separator. For example:

    - -
    -
    -<#assign colors = ["red", "green", "blue"]>
    -${colors?join(", ")}  
    - - -

    will output:

    - -
    -
    -red, green, blue  
    - - -

    Sequence items that are not strings will be converted to - string with the same conversion rules as of - ${...} (except, of - course, no automatic escaping is applied at this stage).

    - -

    ?join(...) can - have up to 3 parameters:

    - -
      -
    1. -

      Separator, required: The string that is inserted between - items

      -
    2. - -
    3. -

      Empty value, defaults to "" (empty - string): The value used if the sequence contains 0 value.

      -
    4. - -
    5. -

      List ending, defaults to "" (empty - string): The value printed after the last value, if the list - sequence wasn't empty.

      -
    6. -
    - -

    So this (where [] means an empty - sequence):

    - -
    -
    -${colors?join(", ", "-")}
    -${[]?join(", ", "-")}
    -
    -${colors?join(", ", "-", ".")}
    -${[]?join(", ", "-", ".")}  
    - - -

    will output:

    - -
    -
    -red, green, blue
    --
    -
    -red, green, blue.
    --  
    - - -

    Sequences coming from Java might contain - null values. Those values will be ignored by this - built-in, exactly like if they were removed from the list.

    - - - - - -

    -last

    - - - - -

    The last subvariable of the sequence. Template processing will - die with error if the sequence is empty.

    - - - - - -

    -reverse

    - - - - -

    The sequence with reversed order.

    - - - - - -

    -seq_contains

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -
    -

    Note

    - -

    The seq_ prefix is required in the - built-in name to differentiate it from the contains - built-in that searches a substring in a string (since a - variable can be both string and sequence on the same time).

    -
    - - -

    Tells if the sequence contains the specified value. It has 1 - parameter, the value to find. Example:

    - -
    -
    -<#assign x = ["red", 16, "blue", "cyan"]>
    -"blue": ${x?seq_contains("blue")?string("yes", "no")}
    -"yellow": ${x?seq_contains("yellow")?string("yes", "no")}
    -16: ${x?seq_contains(16)?string("yes", "no")}
    -"16": ${x?seq_contains("16")?string("yes", "no")}  
    - - -

    The output will be:

    - -
    -
    -"blue": yes
    -"yellow": no
    -16: yes
    -"16": no  
    - - -

    To find the value the built-in uses FreeMarker's comparison - rules (as if you was using == - operator), except that comparing two values of different - types or of types for which FreeMarker doesn't support comparison - will not cause error, just will be evaluated as the two values are - not equal. Thus, you can use it only to find scalar values (i.e. - string, number, boolean or date/time values). For other types the - result will be always false.

    - -

    For fault tolerance, this built-in also works with - collections.

    - - - - - -

    -seq_index_of

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -
    -

    Note

    - -

    The seq_ prefix is required in the - built-in name to differentiate it from the index_of - built-in that searches a substring in a string (since a - variable can be both string and sequence on the same time).

    -
    - - -

    Returns the index of the first occurrence of a value in the - sequence, or -1 if the sequence doesn't contain - the specified value. The value to find is specified as the first - parameter. For example this template:

    - -
    -
    -<#assign colors = ["red", "green", "blue"]>
    -${colors?seq_index_of("blue")}
    -${colors?seq_index_of("red")}
    -${colors?seq_index_of("purple")}  
    - - -

    will output this:

    - -
    -
    -2
    -0
    --1  
    - - -

    To find the value the built-in uses FreeMarker's comparison - rules (as if you was using == - operator), except that comparing two values of different - types or of types for which FreeMarker doesn't support comparison - will not cause error, just will be evaluated as the two values are - not equal. Thus, you can use it only to find scalar values (i.e. - string, number, boolean or date/time values). For other types the - result will be always -1.

    - -

    The index where the searching is started can be optionally - given as the 2nd parameter. This may be useful if the same item can - occur for multiple times in the same sequence. There is no - restriction on the numerical value of the second parameter: if it is - negative, it has the same effect as if it were zero, and if it is - greater than the length of the sequence, it has the same effect as - if it were equal to the length of the sequence. Decimal values will - be truncated to integers. For example:

    - -
    -
    -<#assign names = ["Joe", "Fred", "Joe", "Susan"]>
    -No 2nd param: ${names?seq_index_of("Joe")}
    --2: ${names?seq_index_of("Joe", -2)}
    --1: ${names?seq_index_of("Joe", -1)}
    - 0: ${names?seq_index_of("Joe", 0)}
    - 1: ${names?seq_index_of("Joe", 1)}
    - 2: ${names?seq_index_of("Joe", 2)}
    - 3: ${names?seq_index_of("Joe", 3)}
    - 4: ${names?seq_index_of("Joe", 4)}  
    - - -

    will output this:

    - -
    -
    -No 2nd param: 0
    --2: 0
    --1: 0
    - 0: 0
    - 1: 2
    - 2: 2
    - 3: -1
    - 4: -1  
    - - - - - - -

    -seq_last_index_of

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -
    -

    Note

    - -

    The seq_ prefix is required in the - built-in name to differentiate it from the last_index_of - built-in that searches a substring in a string (since a - variable can be both string and sequence on the same time).

    -
    - - -

    Returns the index of the last occurrence of a value in the - sequence, or -1 if the sequence doesn't contain - the specified value. That is, it is the same as seq_index_of, - just it searches backward starting from the last item of the - sequence. It also supports the optional 2nd parameter that specifies - the index where the searching is started. For example:

    - -
    -
    -<#assign names = ["Joe", "Fred", "Joe", "Susan"]>
    -No 2nd param: ${names?seq_last_index_of("Joe")}
    --2: ${names?seq_last_index_of("Joe", -2)}
    --1: ${names?seq_last_index_of("Joe", -1)}
    - 0: ${names?seq_last_index_of("Joe", 0)}
    - 1: ${names?seq_last_index_of("Joe", 1)}
    - 2: ${names?seq_last_index_of("Joe", 2)}
    - 3: ${names?seq_last_index_of("Joe", 3)}
    - 4: ${names?seq_last_index_of("Joe", 4)}  
    - - -

    will output this:

    - -
    -
    -No 2nd param: 2
    --2: -1
    --1: -1
    - 0: 0
    - 1: 0
    - 2: 2
    - 3: 2
    - 4: 2  
    - - - - - - -

    -size

    - - - - -

    The number of subvariables in sequence (as a numerical value). - The highest possible index in sequence s is - s?size - 1 (since the index of the first - subvariable is 0) assuming that the sequence has at least one - subvariable.

    - - - - - -

    -sort

    - - - - - - -

    Returns the sequence sorted in ascending order. (For - descending order use this and then the reverse built - in.) This will work only if all subvariables are strings, or - if all subvariables are numbers, or if all subvariables are date - values (date, time, or date+time), or if all subvariables are - booleans (since 2.3.17). If the subvariables are strings, it uses - locale (language) specific lexical sorting (which is usually not - case sensitive). For example:

    - -
    -
    -<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
    -<#list ls as i>${i} </#list>  
    - - -

    will print (with US locale at least):

    - -
    -
    -aardvark Barbara beetroot whale zeppelin  
    - - - - - - -

    -sort_by

    - - - - - - -

    Returns the sequence of hashes sorted by the given hash - subvariable in ascending order. (For descending order use this and - then the reverse built - in.) The rules are the same as with the sort built-in, - except that the subvariables of the sequence must be hashes, and you - have to give the name of a hash subvariable that will decide the - order. For example:

    - -
    -
    -<#assign ls = [
    -  {"name":"whale", "weight":2000},
    -  {"name":"Barbara", "weight":53},
    -  {"name":"zeppelin", "weight":-200},
    -  {"name":"aardvark", "weight":30},
    -  {"name":"beetroot", "weight":0.3}
    -]>
    -Order by name:
    -<#list ls?sort_by("name") as i>
    -- ${i.name}: ${i.weight}
    -</#list>
    -
    -Order by weight:
    -<#list ls?sort_by("weight") as i>
    -- ${i.name}: ${i.weight}
    -</#list>  
    - - -

    will print (with US locale at least):

    - -
    -
    -Order by name:
    -- aardvark: 30
    -- Barbara: 53
    -- beetroot: 0.3
    -- whale: 2000
    -- zeppelin: -200
    -
    -Order by weight:
    -- zeppelin: -200
    -- beetroot: 0.3
    -- aardvark: 30
    -- Barbara: 53
    -- whale: 2000  
    - - -

    If the subvariable that you want to use for the sorting is on - a deeper level (that is, if it is a subvariable of a subvariable and - so on), then you can use a sequence as parameter, that specifies the - names of the subvariables that lead down to the desired subvariable. - For example:

    - -
    -
    -<#assign members = [
    -    {"name": {"first": "Joe", "last": "Smith"}, "age": 40},
    -    {"name": {"first": "Fred", "last": "Crooger"}, "age": 35},
    -    {"name": {"first": "Amanda", "last": "Fox"}, "age": 25}]>
    -Sorted by name.last: 
    -<#list members?sort_by(['name', 'last']) as m>
    -- ${m.name.last}, ${m.name.first}: ${m.age} years old
    -</#list>  
    - - -

    will print (with US locale at least):

    - -
    -
    -Sorted by name.last: 
    -- Crooger, Fred: 35 years old
    -- Fox, Amanda: 25 years old
    -- Smith, Joe: 40 years old  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_builtins_string.html b/fmpp/docs/freemarker/ref_builtins_string.html deleted file mode 100644 index 73dacd9..0000000 --- a/fmpp/docs/freemarker/ref_builtins_string.html +++ /dev/null @@ -1,2177 +0,0 @@ - - - - - - - - FreeMarker Manual - Built-ins for strings - - - - - - - - -
    - - - - - -

    -Built-ins for strings

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    These built-ins act on a string left-value. However, if the - left-value is number or date/time/date-time or boolean (since 2.3.20), - it will automatically converted to string according the current - number-, date/time/date-time- and boolean-format settings (which are - the same formatters that are applied when inserting such values with - ${...}).

    - - - - -

    -boolean

    - - - - - - - - - - - - - - -

    The string converted to boolean value. The string must be - true or false (case - sensitive!), or must be in the format specified by the - boolean_format setting.

    - -

    If the string is not in the appropriate format, an error will - abort template processing when you try to access this - built-in.

    - - - - - -

    -cap_first

    - - - - -

    The string with the very first word of the string capitalized. - For the precise meaning of ``word'' see the word_list built-in. - Example:

    - -
    -
    -${"  green mouse"?cap_first}
    -${"GreEN mouse"?cap_first}
    -${"- green mouse"?cap_first}  
    - - -

    The output:

    - -
    -
    -  Green mouse
    -GreEN mouse
    -- green mouse  
    - - -

    In the case of "- green mouse", the first - word is the -.

    - - - - - -

    -capitalize

    - - - - -

    The string with all words capitalized. For the precise meaning - of ``word'' see the word_list - built-in. Example:

    - -
    -
    -${"  green  mouse"?capitalize}
    -${"GreEN mouse"?capitalize}  
    - - -

    The output:

    - -
    -
    -  Green Mouse
    -Green Mouse  
    - - - - - - -

    -chop_linebreak

    - - - - -

    The string without the line-break at its very end if there - was a line-break, otherwise the unchanged string.

    - - - - - -

    -contains

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -

    Returns if the substring specified as the parameter to this - built-in occurrs in the string. For example:

    - -
    -
    -<#if "piceous"?contains("ice")>It contains "ice"</#if>  
    - - -

    This will output:

    - -
    -
    -It contains "ice"  
    - - - - - - -

    -date, time, datetime

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The string value converted to a date, time, or date-time - value. It will expect the format specified by the date_format, - time_format and - datetime_format settings. If the string is - not in the appropriate format, an error will abort template - processing when you try to access this built-in.

    - -
    -
    -<#-- The date_format, time_format and datetime_format settings must match this format! -->
    -<#assign someDate = "Oct 25, 1995"?date>
    -<#assign someTime = "3:05:30 PM"?time>
    -<#assign someDatetime = "Oct 25, 1995 03:05:00 PM"?datetime>
    -
    -<#-- Changing the setting value changes the expected format: -->
    -<#setting datetime_format="iso">
    -<#assign someDatetime = "1995-10-25T15:05"?datetime>  
    - - -

    You can also specify the format explicitly like - ?datetime.format or - ?datetime["format"] - (or - ?datetime("format") - for historical reasons), and the same with ?date - and ?time. For the syntax and meaning of format - values see the possible values of the date_format, - time_format and - datetime_format settings. Example:

    - -
    -
    -<#-- Parsing XML Schema xs:date, xs:time and xs:dateTime values: -->
    -<#assign someDate = "1995-10-25"?date.xs>
    -<#assign someTime = "15:05:30"?time.xs>
    -<#assign someDatetime = "1995-10-25T15:05:00"?datetime.xs>
    -
    -<#-- Parsing ISO 8601 (both extended and basic formats): -->
    -<#assign someDatetime = "1995-10-25T15:05"?datetime.iso>
    -<#assign someDatetime = "19951025T1505"?datetime.iso>
    -
    -<#-- Parsing with SimpleDateFormat patterns: -->
    -<#assign someDate = "10/25/1995"?date("MM/dd/yyyy")>
    -<#assign someTime = "15:05:30"?time("HH:mm:ss")>
    -<#assign someDatetime = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>  
    - - -

    To prevent misunderstandings, the left-hand value need not be - a string literal. For example, when you read data from XML DOM (from - where all values come as unparsed strings), you may do things like - order.confirmDate?date.xs to convert the string - value to a real date.

    - -

    Of course, the format also can be a variable, like in - "..."?datetime[myFormat].

    - - - - - -

    -ends_with

    - - - - -

    Returns whether this string ends with the substring specified - in the parameter. For example - "ahead"?ends_with("head") returns boolean - true. Also, - "head"?ends_with("head") will return - true.

    - - - - - -

    -ensure_ends_with

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    If the string doesn't end with the substring specified as the - 1st parameter, it adds it after the string, otherwise it returns the - original string. For example, both - "foo"?ensure_ends_with("/") and - "foo/"?ensure_ends_with("/") returns - "foo/".

    - - - - - -

    -ensure_starts_with

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    If the string doesn't start with the substring specified as - the 1st parameter, it adds it before the string, otherwise it - returns the original string. For example, both - "foo"?ensure_starts_with("/") and - "/foo"?ensure_starts_with("/") returns - "/foo".

    - -

    If you specify two parameters, then the 1st parameter is - interpreted as a Java regular expression, and if it doesn't match - the beginning of the string, then the string specified as the 2nd - parameter is added before the string. For example - someURL?ensure_starts_with("[a-zA-Z]+://", - "http://") will check if the string starts with something - that matches "[a-zA-Z]+://" (note that no - ^ is needed), and if it doesn't, it prepends - "http://".

    - -

    This method also accepts a 3rd flags parameter. As - calling with 2 parameters implies "r" there - (i.e., regular expression mode), you rarely need this. One notable - case is when you don't want the 1st parameter to be interpreted as a - regular expression, only as plain text, but you want the comparison - to be case-insensitive, in which case you would use - "i" as the 3rd parameter.

    - - - - - -

    -groups

    - - - - -

    This is used only with the result of the - matches built-in. See there...

    - - - - - -

    -html

    - - - - - - -

    The string as HTML markup. That is, the string with - all:

    - -
    -
      -
    • - < replaced with - &lt; -
    • - -
    • - > replaced with - &gt; -
    • - -
    • - & replaced with - &amp; -
    • - -
    • - " replaced with - &quot; -
    • - -
    • - if FreeMarker was configured by the programmers so (by - setting the incompatible_improvements setting - to 2.3.20 or higher; more here), - ' is replaced with - &#39; -
    • -
    - - -

    Note that if you want to insert an attribute value securely, - you must quote the attribute value in the HTML template with - quotation mark (with ", not with - '):

    - -
    -
    -<input type=text name=user value="${user?html}" 
    - - -

    Note that in HTML pages usually you want to use this built-in - for all interpolations. So you can spare a lot of typing and lessen - the chances of accidental mistakes by using the escape - directive.

    - - - - - -

    -index_of

    - - - - -

    Returns the index within this string of the first occurrence - of the specified substring. For example, - "abcabc"?index_of("bc") will return 1 (don't - forget that the index of the first character is 0). Also, you can - specify the index to start the search from: - "abcabc"?index_of("bc", 2) will return 4. There - is no restriction on the numerical value of the second parameter: if - it is negative, it has the same effect as if it were zero, and if it - is greater than the length of this string, it has the same effect as - if it were equal to the length of this string. Decimal values will - be truncated to integers.

    - -

    If the 1st parameter does not occur as a substring in this - string (starting from the given index, if you use the second - parameter), then it returns -1.

    - - - - - -

    -j_string

    - - - - -

    Escapes the string with the escaping rules of Java language - string literals, so it's safe to insert the value into a string - literal. Note that it will not add quotation - marks around the inserted value; you meant to use this - inside the string literal.

    - -

    All characters under UCS code - point 0x20 will be escaped. When they have no dedicated escape - sequence in the Java language (like \n, - \t, etc.), they will be replaced with a UNICODE - escape - (\uXXXX).

    - -

    Example:

    - -
    -
    -<#assign beanName = 'The "foo" bean.'>
    -String BEAN_NAME = "${beanName?j_string}";  
    - - -

    will output:

    - -
    -
    -String BEAN_NAME = "The \"foo\" bean.";  
    - - - - - - -

    -js_string

    - - - - -

    Escapes the string with the escaping rules of JavaScript - language string literals, so it's safe to insert the value into a - string literal. Note that it will not add - quotation marks around the inserted value; you meant to use this - inside the string literal.

    - -

    Both quotation mark (") and - apostrophe-quoate (') are escaped. Starting from - FreeMarker 2.3.1, it also escapes > as - \> (to avoid - </script>).

    - -

    All characters under UCS code - point 0x20 will be escaped. When they have no dedicated escape - sequence in JavaScript (like \n, - \t, etc.), they will be replaced with a UNICODE - escape - (\uXXXX).

    - -

    Example:

    - -
    -
    -<#assign user = "Big Joe's \"right hand\"">
    -<script>
    -  alert("Welcome ${user?js_string}!");
    -</script>  
    - - -

    will output:

    - -
    -
    -<script>
    -  alert("Welcome Big Joe\'s \"right hand\"!");
    -</script>  
    - - - - - - -

    -json_string

    - - - - -

    Escapes the string with the escaping rules of JSON language - string literals, so it's safe to insert the value into a string - literal. Note that it will not add quotation - marks around the inserted value; you meant to use this - inside the string literal.

    - -

    This will not escape ' characters, since - JSON strings must be quoted with ". It will, - however escape the / (slash) characters as - \/ where they occur directly after a - <, to avoid </script> - and such. It will also escape the > characters - as \u003E where they occur directly after - ]], to avoid exiting an XML - CDATA section.

    - -

    All characters under UCS code - point 0x20 will be escaped. When they have no dedicated escape - sequence in JSON (like \n, \t, - etc.), they will be replaced with a UNICODE escape - (\uXXXX).

    - - - - - -

    -keep_after

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    Removes the part of the string that is not after the first - occurrence of the given substring. For example:

    - -
    -
    -${"abcdefgh"?keep_after("de")}  
    - - -

    will print

    - -
    -
    -fgh  
    - - -

    If the parameter string is not found, it will return an empty - string. If the parameter string is a 0-length string, it will return - the original string unchanged.

    - -

    This method accepts an optional flags parameter, as its - 2nd parameter:

    - -
    -
    -${"foo : bar"?keep_after(r"\s*:\s*", "r")}  
    - - -

    will print

    - -
    -
    -bar  
    - - - - - - -

    -keep_before

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    Removes the part of the string that starts with the given - substring. For example:

    - -
    -
    -${"abcdef"?keep_before("de")}  
    - - -

    will print

    - -
    -
    -abc  
    - - -

    If the parameter string is not found, it will return the - original string unchanged. If the parameter string is a 0-length - string, it will return an empty string.

    - -

    This method accepts an optional flags parameter, as its - 2nd parameter:

    - -
    -
    -${"foo : bar"?keep_before(r"\s*:\s*", "r")}  
    - - -

    will print

    - -
    -
    -foo  
    - - - - - - -

    -last_index_of

    - - - - -

    Returns the index within this string of the last (rightmost) - occurrence of the specified substring. It returns the index of the - first (leftmost) character of the substring. For example: - "abcabc"?last_index_of("ab") will return 3. Also, - you can specify the index to start the search from. For example, - "abcabc"?last_index_of("ab", 2) will return 0. - Note that the second parameter indicates the maximum index of the - start of the substring. There is no restriction on the numerical - value of the second parameter: if it is negative, it has the same - effect as if it were zero, and if it is greater than the length of - this string, it has the same effect as if it were equal to the - length of this string. Decimal values will be truncated to - inegers.

    - -

    If the 1st parameter does not occur as a substring in this - string (before the given index, if you use the second parameter), - then it returns -1.

    - - - - - -

    -left_pad

    - - - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1.

    -
    - - -

    If it's used with 1 parameter, then it inserts spaces on the - beginning of the string until it reaches the length that is - specified as the parameter. If the string is already as long or - longer than the specified length, then it does nothing. For example, - this:

    - -
    -
    -[${""?left_pad(5)}]
    -[${"a"?left_pad(5)}]
    -[${"ab"?left_pad(5)}]
    -[${"abc"?left_pad(5)}]
    -[${"abcd"?left_pad(5)}]
    -[${"abcde"?left_pad(5)}]
    -[${"abcdef"?left_pad(5)}]
    -[${"abcdefg"?left_pad(5)}]
    -[${"abcdefgh"?left_pad(5)}]  
    - - -

    will output this:

    - -
    -
    -[     ]
    -[    a]
    -[   ab]
    -[  abc]
    -[ abcd]
    -[abcde]
    -[abcdef]
    -[abcdefg]
    -[abcdefgh]  
    - - -

    If it's used with 2 parameters, then the 1st parameter means - the same as if you were using the built-in with only 1 parameter, - and the second parameter specifies what to insert instead of space - characters. For example:

    - -
    -
    -[${""?left_pad(5, "-")}]
    -[${"a"?left_pad(5, "-")}]
    -[${"ab"?left_pad(5, "-")}]
    -[${"abc"?left_pad(5, "-")}]
    -[${"abcd"?left_pad(5, "-")}]
    -[${"abcde"?left_pad(5, "-")}]  
    - - -

    will output this:

    - -
    -
    -[-----]
    -[----a]
    -[---ab]
    -[--abc]
    -[-abcd]
    -[abcde]  
    - - -

    The 2nd parameter can be a string whose length is greater than - 1. Then the string will be inserted periodically, for - example:

    - -
    -
    -[${""?left_pad(8, ".oO")}]
    -[${"a"?left_pad(8, ".oO")}]
    -[${"ab"?left_pad(8, ".oO")}]
    -[${"abc"?left_pad(8, ".oO")}]
    -[${"abcd"?left_pad(8, ".oO")}]  
    - - -

    will output this:

    - -
    -
    -[.oO.oO.o]
    -[.oO.oO.a]
    -[.oO.oOab]
    -[.oO.oabc]
    -[.oO.abcd]  
    - - -

    The 2nd parameter must be a string value, and it must be at - least 1 character long.

    - - - - - -

    -length

    - - - - -

    The number of characters in the string.

    - - - - - -

    -lower_case

    - - - - -

    The lower case version of the string. For example - "GrEeN MoUsE"?lower_case will be "green - mouse".

    - - - - - -

    -matches

    - - - - -

    This is a ``power user'' built-in. Ignore it if you don't know - regular - expressions.

    - -

    This built-in determines if the string exactly matches the - pattern. Also, it returns the list of matching sub-strings. The - return value is a multi-type value:

    - -
    -
      -
    • -

      Boolean: true, if it the entire string - matches the pattern, otherwise false. For - example, "fooo"?matches('fo*') is - true, but - "fooo bar"?matches('fo*') is - false.

      -
    • - -
    • -

      Sequence: the list of matched substrings of the string. - Possibly a 0 length sequence.

      -
    • -
    - - -

    For example:

    - -
    -
    -<#if "fxo"?matches("f.?o")>Matches.<#else>Does not match.</#if>
    -
    -<#assign res = "foo bar fyo"?matches("f.?o")>
    -<#if res>Matches.<#else>Does not match.</#if>
    -Matching sub-strings:
    -<#list res as m>
    -- ${m}
    -</#list>  
    - - -

    will print:

    - -
    -
    -Matches.
    -
    -Does not match.
    -Matching sub-strings:
    -- foo
    -- fyo  
    - - -

    If the regular expression contains groups (parentheses), then - you can access them with the groups - built-in:

    - -
    -
    -<#-- Entire input match -->
    -<#assign res = "John Doe"?matches(r"(\w+) (\w+)")>
    -<#if res> <#-- Must not try to access groups if there was no match! -->
    -  First name: ${res?groups[1]}
    -  Second name: ${res?groups[2]}
    -</#if>
    -
    -<#-- Subtring matches -->
    -<#assign res = "aa/rx; ab/r;"?matches("(.+?)/*(.+?);")>
    -<#list res as m>
    -  - "${m}" is "${m?groups[1]}" per "${m?groups[2]}"
    -</#list>  
    - - -

    This will print:

    - -
    -
    -  First name: John
    -  Second name: Doe
    -
    -  - "aa/rx;" is "a" per "a/rx"
    -  - " ab/r;" is " " per "ab/r"  
    - - -

    Note above that groups has worked both with - substring matches and with the result of entire string - matching.

    - -

    matches accepts an optional 2nd parameter, - the flags. Note that - it doesn't support flag f, and ignores the - r flag.

    - - - - - -

    -number

    - - - - - - - - - - - - - - -

    The string converted to numerical value. The number must be in - "computer language" format. That is, it must be in the - locale independent form, where the decimal separator is dot, and - there's no grouping.

    - -

    This built-in recognizes numbers in the format that the - FreeMarker template language uses. In additionally, it recognizes - scientific notation (e.g. "1.23E6", - "1.5e-8"). Since FreeMarker 2.3.21, it also - recognizes all XML Schema number formats, like - NaN, INF, - -INF, plus the Java-native formats - Infinity and -Infinity.

    - -

    If the string is not in the appropriate format, an error will - abort template processing when you try to access this - built-in.

    - -

    In fact, the string is parsed by - the toNumber method of the current - arithmetic_engine, which is configuration - setting. However, that method should behave similarly as described - above.

    - - - - - -

    -replace

    - - - - -

    It is used to replace all occurrences of a string in the - original string with another string. It does not deal with word - boundaries. For example:

    - -
    -
    -${"this is a car acarus"?replace("car", "bulldozer")}  
    - - -

    will print:

    - -
    -
    -this is a bulldozer abulldozerus  
    - - -

    The replacing occurs in left-to-right order. This means that - this:

    - -
    -
    -${"aaaaa"?replace("aaa", "X")}  
    - - -

    will print:

    - -
    -
    -Xaa  
    - - -

    If the 1st parameter is an empty string, then all occurrences - of the empty string will be replaced, like - "foo"?replace("","|") will evaluate to - "|f|o|o|".

    - -

    replace accepts an optional flags parameter, as its - 3rd parameter.

    - - - - - -

    -right_pad

    - - - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -

    This is the same as left_pad, - but it inserts the characters at the end of the string instead of - the beginning of the string.

    - -

    Example:

    - -
    -
    -[${""?right_pad(5)}]
    -[${"a"?right_pad(5)}]
    -[${"ab"?right_pad(5)}]
    -[${"abc"?right_pad(5)}]
    -[${"abcd"?right_pad(5)}]
    -[${"abcde"?right_pad(5)}]
    -[${"abcdef"?right_pad(5)}]
    -[${"abcdefg"?right_pad(5)}]
    -[${"abcdefgh"?right_pad(5)}]
    -
    -[${""?right_pad(8, ".oO")}]
    -[${"a"?right_pad(8, ".oO")}]
    -[${"ab"?right_pad(8, ".oO")}]
    -[${"abc"?right_pad(8, ".oO")}]
    -[${"abcd"?right_pad(8, ".oO")}]  
    - - -

    This will output this:

    - -
    -
    -[     ]
    -[a    ]
    -[ab   ]
    -[abc  ]
    -[abcd ]
    -[abcde]
    -[abcdef]
    -[abcdefg]
    -[abcdefgh]
    -
    -[.oO.oO.o]
    -[aoO.oO.o]
    -[abO.oO.o]
    -[abc.oO.o]
    -[abcdoO.o]  
    - - - - - - -

    -remove_beginning

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    Removes the parameter substring from the beginning of the - string, or returns the original string if it doesn't start with the - parameter substring. For example:

    - -
    -
    -${"abcdef"?remove_beginning("abc")}
    -${"foobar"?remove_beginning("abc")}  
    - - -

    will print:

    - -
    -
    -def
    -foobar  
    - - - - - - -

    -remove_ending

    - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    Removes the parameter substring from the beginning of the - string, or returns the original string if it doesn't start with the - parameter substring. For example:

    - -
    -
    -${"abcdef"?remove_ending("def")}
    -${"foobar"?remove_ending("def")}  
    - - -

    will print:

    - -
    -
    -abc
    -foobar  
    - - - - - - -

    -rtf

    - - - - - - -

    The string as Rich text (RTF text). That is, the string with - all:

    - -
    -
      -
    • -

      \ replaced with - \\

      -
    • - -
    • -

      { replaced with - \{

      -
    • - -
    • -

      } replaced with - \}

      -
    • -
    - - - - - - -

    -split

    - - - - -

    It is used to split a string into a sequence of strings along - the occurrences of another string. For example:

    - -
    -
    -<#list "someMOOtestMOOtext"?split("MOO") as x>
    -- ${x}
    -</#list>  
    - - -

    will print:

    - -
    -
    -- some
    -- test
    -- text  
    - - -

    Note that it is assumed that all occurrences of the separator - is before a new item (except with "r" flag - see - later), thus:

    - -
    -
    -<#list "some,,test,text,"?split(",") as x>
    -- "${x}"
    -</#list>  
    - - -

    will print:

    - -
    -
    -- "some"
    -- ""
    -- "test"
    -- "text"
    -- ""  
    - - -

    split accepts an optional flags parameter, as its - 2nd parameter. There's a historical glitch with the - r (regular expression) flag; it removes the empty - elements from the end of the resulting list, so with - ?split(",", "r") in the last example the last - "" would be missing from the output.

    - -
    -

    Note

    - -

    To check if a strings ends with something and append it - otherwise, use the - ensure_ends_with built-in.

    -
    - - - - - - -

    -starts_with

    - - - - -

    Returns if this string starts with the specified substring. - For example "redirect"?starts_with("red") returns - boolean true. Also, - "red"?starts_with("red") will return - true.

    - -
    -

    Note

    - -

    To check if a strings starts with something and prepend it - otherwise, use the - ensure_starts_with built-in.

    -
    - - - - - - -

    -string (when used with a string value)

    - - -

    Does nothing, just returns the string as-is. The exception is - that if the value is a multi-type value (e.g. it is both string and - sequence at the same time), then the resulting value will be only a - simple string, not a multi-type value. This can be utilized to - prevent the artifacts of multi-typing.

    - - - - - -

    -substring

    - - - - - - -
    -

    Note

    - -

    This built-in is deprecated since FreeMarker 2.3.21 by - slicing expressions: - exp[from..<toExclusive] - and - exp[from..].

    - -

    A warning if you are processing XML: Since slicing - expressions work both for sequences and strings, and since XML - nodes are typically both sequences and strings at the same time, - there the equivalent expression is - someXmlNode?string[from..<toExclusive] - and - exp?string[from..], - as without ?string it would slice the node - sequence instead of the text value of the node.

    -
    - - -

    Synopsis: - exp?substring(from, - toExclusive), also callable as - exp?substring(from)

    - -

    A substring of the string. - from is the index of - the first character. It must be a number that is at least 0 and less - than or equal with - toExclusive, or else - an error will abort the template processing. The - toExclusive is the - index of the character position after the last character of the - substring, or with other words, it is one greater than the index of - the last character. It must be a number that is at least 0 and less - than or equal to the length of the string, or else an error will - abort the template processing. If the - toExclusive is - omitted, then it defaults to the length of the string. If a - parameter is a number that is not an integer, only the integer part - of the number will be used.

    - -

    Example:

    - -
    -
    -- ${'abc'?substring(0)}
    -- ${'abc'?substring(1)}
    -- ${'abc'?substring(2)}
    -- ${'abc'?substring(3)}
    -
    -- ${'abc'?substring(0, 0)}
    -- ${'abc'?substring(0, 1)}
    -- ${'abc'?substring(0, 2)}
    -- ${'abc'?substring(0, 3)}
    -
    -- ${'abc'?substring(0, 1)}
    -- ${'abc'?substring(1, 2)}
    -- ${'abc'?substring(2, 3)}  
    - - -

    The output:

    - -
    -
    -- abc
    -- bc
    -- c
    --
    -
    --
    -- a
    -- ab
    -- abc
    -
    -- a
    -- b
    -- c  
    - - - - - - -

    -trim

    - - - - -

    The string without leading and trailing white-space. - Example:

    - -
    -
    -(${"  green mouse  "?trim})  
    - - -

    The output:

    - -
    -
    -(green mouse)  
    - - - - - - -

    -uncap_first

    - - - - -

    The opposite of cap_first. - The string with the very first word of the string - un-capitalized.

    - - - - - -

    -upper_case

    - - - - -

    The upper case version of the string. For example - "GrEeN MoUsE" will be "GREEN - MOUSE".

    - - - - - -

    -url

    - - - - - - - - - - - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.1. It - doesn't exist in 2.3.

    -
    - - -

    The string after URL escaping. This means that all - non-US-ASCII and reserved URL characters will be escaped with - %XX. For - example:

    - -
    -
    -<#assign x = 'a/b c'>
    -${x?url}  
    - - -

    The output will be (assuming that the charset used for the - escaping is an US-ASCII compatible charset):

    - -
    -
    -a%2Fb%20c  
    - - -

    Note that it escapes all reserved URL - characters (/, =, - &, ...etc), so this encoding can be used for - encoding query parameter values, for example:

    - -
    -
    -<a href="foo.cgi?x=${x?url}&y=${y?url}">Click here...</a>  
    - - -
    -

    Note

    - -

    Above no HTML encoding (?html) was - needed, because URL escaping escapes all reserved HTML characters - anyway. But watch: always quote the attribute value, and always - with normal quotation mark ("), never with - apostrophe quotation mark ('), because - apostrophe quotation mark is not escaped by the URL - escaping.

    -
    - - -

    To do URL escaping a charset must be chosen that will be - used for calculating the escaped parts - (%XX). If you are HTML - page author and you don't really understand this, don't worry: the - programmers should configure FreeMarker so that it uses the proper - charset by default (programmers: see - more below...). If you are a more technical minded user, - then you may want to know that the charset used is specified by the - url_escaping_charset setting, that can be set in - template execution time (or, preferably, earlier by the - programmers). For example:

    - -
    -
    -<#--
    -  This will use the charset specified by the programmers
    -  before the template execution has started.
    --->
    -<a href="foo.cgi?x=${x?url}">foo</a>
    -
    -<#-- Use UTF-8 charset for URL escaping from now: -->
    -<#setting url_escaping_charset="UTF-8">
    -
    -<#-- This will surely use UTF-8 charset -->
    -<a href="bar.cgi?x=${x?url}">bar</a>  
    - - -

    Furthermore, you can explicitly specify a charset for a single - URL escaping as the parameter to the built-in:

    - -
    -
    -<a href="foo.cgi?x=${x?url('ISO-8895-2')}">foo</a>  
    - - -

    If the url built-in has no - parameter, then it will use the charset specified as the value of - the url_escaping_charset setting. This setting - should be set by the software that encloses FreeMarker (e.g. a Web - application framework), because it is not set - (null) by default. If it is not set, then - FreeMarker falls back using the value of the - output_encoding setting, which is also not set by - default, so it is again the task of the enclosing software. If the - output_encoding setting is not set either, then - the parameterless url built-in can't be executed, - and it will cause execution time error. Of course, the - url built-in with parameter always - works.

    - -

    It's possible to set - url_escaping_charset in the template with the - setting directive, but it is bad practice, at - least in true MVC applications. The - output_encoding setting can't be set with the - setting directive, so that's surely the task of - the enclosing software. You may find more information regarding this - here...

    - - - - - -

    -url_path

    - - - - - - - - - - - - -
    -

    Note

    - -

    This built-in is available since FreeMarker 2.3.21.

    -
    - - -

    This is the same as the - url built-in, except that it doesn't - escape slash (/) characters. This meant to be - used for converting paths (like paths coming from the OS or some - content repository) that use slash (not backslash!) to a path the - can be inserted into an URL. The most common reason why this - conversion is needed is that folder names or file names might - contain non-US-ASCII letters ("national" - characters).

    - -
    -

    Note

    - -

    Just like with the - url built-in, the desired URL escaping - charset (or as a fall back, the output encoding) must be set in - the FreeMarker configuration settings, or else the built-in will - give error. Or, you you have to specify the charset like - somePath?url_path('utf-8').

    -
    - - - - - - -

    -word_list

    - - - - -

    A sequence that contains all words of the string in the order - as they appear in the string. Words are continual character - sequences that contain any character but white-space. Example:

    - -
    -
    -<#assign words = "   a bcd, .   1-2-3"?word_list>
    -<#list words as word>[${word}]</#list>  
    - - -

    will output:

    - -
    -
    -[a][bcd,][.][1-2-3]  
    - - - - - - -

    -xhtml

    - - - - - - -

    The string as XHTML text. That is, the string with all:

    - -
    -
      -
    • - < replaced with - &lt; -
    • - -
    • - > replaced with - &gt; -
    • - -
    • - & replaced with - &amp; -
    • - -
    • - " replaced with - &quot; -
    • - -
    • - ' replaced with - &#39; -
    • -
    - - -

    The only difference between this built-in and the - xml built-in is that the xhtml - built-in escapes ' as - &#39; instead of as - &apos;, because some older browsers don't - interpret &apos; correctly.

    - - - - - -

    -xml

    - - - - - - -

    The string as XML text. That is, the string with all:

    - -
    -
      -
    • - < replaced with - &lt; -
    • - -
    • - > replaced with - &gt; -
    • - -
    • - & replaced with - &amp; -
    • - -
    • - " replaced with - &quot; -
    • - -
    • - ' replaced with - &apos; -
    • -
    - - - - - - -

    -Common flags

    - - -

    Many string built-ins accept an optional string parameter, the - so called ``flags''. In this string, each letter influences a - certain aspect of the behavior of the built-in. For example, letter - i means that the built-in should not - differentiate the lower and upper-case variation of the same letter. - The order of the letters in the flags string is not - significant.

    - -

    This is the complete list of letters (flags):

    - -
    -
      -
    • -

      i: Case insensitive: do not - differentiate the lower and upper-case variation of the same - letter.

      -
    • - -
    • -

      f: First only. That is, - replace/find/etc. only the first occurrence of something.

      -
    • - -
    • -

      r: The substring to find is a - regular - expression. FreeMarker uses the variation of regular - expressions described at http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html - (note that the presence of some pattern features depends on the - Java version used).

      -
    • - -
    • -

      m: Multi-line mode for regular - expressions. In multi-line mode the expressions - ^ and $ match just after - or just before, respectively, a line terminator or the end of - the string. By default these expressions only match at the - beginning and the end of the entire string. Note that - ^ and $ doesn't match the - line-break character itself.

      -
    • - -
    • -

      s: Enables dot-all mode for regular - expressions (same as Perl singe-line mode). In dot-all mode, the - expression . matches any character, including - a line terminator. By default this expression does not match - line terminators.

      -
    • - -
    • -

      c: Permits whitespace and comments in - regular expressions.

      -
    • -
    - - -

    Example:

    - -
    -
    -<#assign s = 'foo bAr baar'>
    -${s?replace('ba', 'XY')}
    -i: ${s?replace('ba', 'XY', 'i')}
    -if: ${s?replace('ba', 'XY', 'if')}
    -r: ${s?replace('ba*', 'XY', 'r')}
    -ri: ${s?replace('ba*', 'XY', 'ri')}
    -rif: ${s?replace('ba*', 'XY', 'rif')}  
    - - -

    This outputs this:

    - -
    -
    -foo bAr XYar
    -i: foo XYr XYar
    -if: foo XYr baar
    -r: foo XYAr XYr
    -ri: foo XYr XYr
    -rif: foo XYr baar  
    - - -

    This is the table of built-ins that use these common flags, - and which supports which flags:

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Built-ini (ignore case)r (reg. exp.)m (multi-line mode)s (dot-all mode)c (whitesp. and comments)f (first only)
    replaceYesYesOnly with rOnly with rOnly with rYes
    splitYesYesOnly with rOnly with rOnly with rNo
    matchesYesIgnoredYesYesYesNo
    -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_builtin.html b/fmpp/docs/freemarker/ref_depr_builtin.html deleted file mode 100644 index 4cc234c..0000000 --- a/fmpp/docs/freemarker/ref_depr_builtin.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - FreeMarker Manual - List of deprecated built-ins - - - - - - - - -
    - - - - - -

    -List of deprecated built-ins

    - - -

    The following built-ins are deprecated, but still - working:

    -
      -
    • -

      default: This was deprecated - with the introduction of the default value - operator. - exp1?default(exp2) - is near equivalent with - exp1!exp2, - and - (exp1)?default(exp2) - is near equivalent with with - (exp1)!exp2. - The only difference is that prior to FreeMarker 2.4, the - default built-in has always evaluated - exp2, while the - default value operator only evaluates it when the default value is - really needed. Starting from FreeMarker 2.4, however, the - default built-in was improved, and behaves - exactly like the default value operator.

      -
    • - -
    • -

      exists: This was deprecated with - the introduction of the missing value test - operator. - exp1?exists is - equivalent with - exp1??, also - (exp1)?exists is - equivalent with with - (exp1)??.

      -
    • - -
    • -

      if_exists: This was deprecated - with the introduction of the default value - operator. - exp1?if_exists is - similar to exp1!, - and (exp1)?if_exists - is similar to - (exp1)!. The - difference is that the default value with - if_exists is not only empty string, empty - sequence and empty hashs at the same time, but also boolean - false and a transform that does nothing and - ignores all parameters.

      -
    • - -
    • -

      web_safe: the same as html

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_directive.html b/fmpp/docs/freemarker/ref_depr_directive.html deleted file mode 100644 index 1c4acbb..0000000 --- a/fmpp/docs/freemarker/ref_depr_directive.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - FreeMarker Manual - List of deprecated directives - - - - - - - - -
    - - - - - -

    -List of deprecated directives

    - - -

    The following directives are deprecated, but still - working:

    -
      -
    • -

      call: use - user-defined directive - call instead

      -
    • - -
    • -

      comment: This is the old format of - <#--...-->. - Anything between the <#comment> and - </#comment> will be ignored.

      -
    • - -
    • -

      foreach: it is a synonym of the - list directive with slightly different - parameter syntax. The syntax is <#foreach - item in - sequence> that is - equivalent with <#list - sequence as - item>.

      -
    • - -
    • -

      transform: - use user-defined - directive call instead

      -
    • -
    -

    The following directives are not working anymore:

    -
      -
    • -

      Legacy function: Originally - function was used to define macros, and was - deprecated in favor of the macro directive. As - of FreeMarker 2.3, this directive is reintroduced with different - meaning: it is used to define methods.

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_numerical_interpolation.html b/fmpp/docs/freemarker/ref_depr_numerical_interpolation.html deleted file mode 100644 index 5304bb1..0000000 --- a/fmpp/docs/freemarker/ref_depr_numerical_interpolation.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - FreeMarker Manual - #{...}: Numerical interpolation - - - - - - - - -
    - - - - - -

    -#{...}: Numerical interpolation

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Deprecated: Use the number_format - setting and the - string built-in instead. For formatting for - computer audience (i.e., no localized formatting) use the c built-in (like - number?c).

    - - - - -

    -Synopsis

    - - -
    #{expression}
    -or
    -#{expression; format}
    - - -

    Where:

    - -
    -
      -
    • - expression: - expression that can be evaluated as a number. -
    • - -
    • - format: - optional format specifier. -
    • -
    - - - - - - -

    -Description

    - - -

    The numerical interpolation is used to output a number value. - If the expression doesn't evaluate to a number, the evaluation ends - with an error.

    - -

    The optional format specifier specifies the minimum and the - maximum number of displayed fractional digits using syntax - mminMmax. - For example, m2M5 means "at least two, at most - five fractional digits". The minimum or the maximum specifier part - can be omitted. If only the minimum is specified, the maximum is - equal to the minimum. If only maximum is specified, the minimum is - 0.

    - -

    The decimal separator character of the output is - internationalized (according the current locale setting), which - means that it is not necessarily a dot.

    - -

    Unlike ${...}, #{...} - ignores the number_format - setting. This is actually a backward compatibility quirk, but - it can be useful when you print numbers in situations like - <a href="quertyDatabase?id=#{id}">, where - you surely don't want grouping separators or something fancy like - that. However, starting from FreeMarker 2.3.3 rather use the ?c built-in for - this purpose, like <a - href="quertyDatabase?id=${id?c}">.

    - -

    Examples. Assume that x is - 2.582 and y is - 4:

    - -
    -
    -           <#-- If the language is US English the output is: -->
    -#{x}       <#-- 2.582 -->
    -#{y}       <#-- 4 -->
    -#{x; M2}   <#-- 2.58 -->
    -#{y; M2}   <#-- 4    -->
    -#{x; m1}   <#-- 2.6 -->
    -#{y; m1}   <#-- 4.0 -->
    -#{x; m1M2} <#-- 2.58 -->
    -#{y; m1M2} <#-- 4.0  -->  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_oldmacro.html b/fmpp/docs/freemarker/ref_depr_oldmacro.html deleted file mode 100644 index 3ef67b4..0000000 --- a/fmpp/docs/freemarker/ref_depr_oldmacro.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - FreeMarker Manual - Old-style macro and call directives - - - - - - - - -
    - - - - - -

    -Old-style macro and call directives

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    <#macro name(argName1, argName2, ... argNameN)>
    -  ...
    -</#macro>
    - 
    -<#call name(argValue1, argValue2, ... argValueN)>
    - - -

    Where:

    - -
    -
      -
    • - name: name - of the macro (not expression) -
    • - -
    • - argName1, - argName2, ...etc.: - the name of the local - variables store the parameter values (not - expression) -
    • - -
    • - argValue1, - argValue2, - ...etc.: expressions, the value of the parameters -
    • -
    - - - - - - -

    -Description

    - - -
    -

    Note

    - -

    This is the documentation of FreeMarker 2.1 macro and macro - related directives. These are still working, but deprecated. You - may want to read the FreeMarker 2.2+ references: macro, return, user-defined directive - call

    -
    - - -

    A macro is a template fragment with an associated name. You - can use that named fragment on multiple places in your template, so - it helps in repetitive tasks. A macro can have parameters that - influence the output generated when you use the macro.

    - -

    You define a macro with the macro - directive, and then you can use the defined macro in the whole - template. The macro directive itself does not - write anything to the output, it just defines the macro. For example - this will define a macro called warning:

    - -
    -
    -<#macro warning(message)>
    -  <div align=center>
    -  <table border=1 bgcolor=yellow width="80%"><tr><td align=center>
    -    <b>Warning!</b>
    -    <p>${message}
    -  </td></tr></table>
    -  </div>
    -</#macro>  
    - - -

    The macro definition body (the section between the macro - start-tag and end-tag) will be processed whenever you use the - call directive with the name of the macro. For - example this calls the macro called - warning:

    - -
    -
    -<#call warning("Unplug the machine before opening the cover!")>  
    - - -

    and will write this to the output:

    - -
    -
    -  <div align=center>
    -  <table border=1 bgcolor=yellow width="80%"><tr><td align=center>
    -    <b>Warning!</b>
    -    <p>Unplug the machine before opening the cover!
    -  </td></tr></table>
    -  </div>
    -    
    - - -

    The parameters passed in as parameters to the - call directive will be accessible in the macro - definition body as local - variables.

    - -

    When you call a macro, you must specify the same number of - parameters as were specified in the macro definition. For example if - this is the macro definition:

    - -
    -
    -<#macro test(a, b, c)>Nothing...</#macro>  
    - - -

    then these are valid macro calls:

    - -
    -
    -<#call test(1, 2, 3)>
    -<#call test("one", 2 + x, [1234, 2341, 3412, 4123])>  
    - - -

    If a macro has no parameters, then you can omit the - parentheses:

    - -
    -
    -<#macro test>mooo</#macro>
    -<#call test>  
    - - -

    When you define a macro it will be available in the template, - where you have defined it only. But probably you want to use the - same macros in more templates. In this case you can store your macro - definitions in a common file, and then include that file in all - templates where you need those macros.

    - -

    It's fine to call a macro that's defined further down in the - template (since macros are defined at - parse time, not in process time). However, if the macro - definitions are inserted with include directive, - they will not be available until FreeMarker has executed the - include directive.

    - -

    You can leave a macro definition body before the - </#macro> tag with the - return directive.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_oldsyntax.html b/fmpp/docs/freemarker/ref_depr_oldsyntax.html deleted file mode 100644 index 2b83a38..0000000 --- a/fmpp/docs/freemarker/ref_depr_oldsyntax.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - FreeMarker Manual - Old FTL syntax - - - - - - - - -
    - - - - - -

    -Old FTL syntax

    - - -

    With the old FTL syntax the # was not - required (prior 2.1 not even allowed) in the FTL tags. For example, - you could write this:

    -
    -<html>
    -<head>
    -  <title>Welcome!</title>
    -</head>
    -<body>
    -  <h1>Welcome ${user}!</h1>
    -  <p>We have there animals:
    -  <ul>
    -  <list animals as animal>
    -    <li>${animal.name} for ${animal.price} Euros
    -  </list>
    -  </ul>
    -  <include "common_footer.html">
    -</body>
    -</html>  
    -

    While the #-less syntax was more natural for - HTML authors, it had too many drawbacks, so finally we have decided to - deprecate it. With the newer syntax (a.k.a ``strict syntax''), the - # is strictly required. That is, things like - <include "common_footer.html"> will go to the - output as is, since they are not considered as FTL tags. Note that - user-defined directives use @ instead - of #.

    However, to give users time to prepare for this change, in - FreeMarker 2.1 and 2.2 the usage of # is optional, - unless the programmer enables strict syntax mode in the FreeMarker - configuration by calling setStrictSyntaxMode(true) - on Configuration. In fact, we strongly recommend - this to programmers. Starting from some later release this setting - will be initially set to true. Also, you can - specify if you want to use strict syntax or old syntax in the template - files with the ftl - directive.

    The advantages of ``strict syntax'' over the legacy FTL syntax - are:

    -
      -
    • -

      Since all - <#...> and - </#...> are - reserved for FTL:

      - -
      -
        -
      • -

        We can introduce new directives without breaking - backward compatibility.

        -
      • - -
      • -

        We can detect if you made a typo, i.e. - <#inculde - ...> is treated as - parse-time error, rather than silently treated as simple - text.

        -
      • - -
      • -

        It is easier for third-party tools to handle templates - (e.g. do syntax highlighting), especially since they don't - have to know about the new directives introduced with new - releases.

        -
      • - -
      • -

        Templates are more readable, since it is easier to spot - <#...> tags embedded into HTML or - other markup.

        -
      • -
      - -
    • - -
    • -

      <# and </# is - illegal XML (except in CDATA sections), and illegal in almost all - other SGML applications, so they can't interfere with the tags - used in the static text parts (e.g. if you have - include element in the generated XML).

      -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_depr_transform.html b/fmpp/docs/freemarker/ref_depr_transform.html deleted file mode 100644 index fead475..0000000 --- a/fmpp/docs/freemarker/ref_depr_transform.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - FreeMarker Manual - Transform directive - - - - - - - - -
    - - - - - -

    -Transform directive

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<transform transVar>
    -  ...
    -</transform>
    -or
    -<transform transVar name1=value1 name2=value2 ... nameN=valueN>
    -  ...
    -</transform>
    -
    - - -

    Where:

    - -
    -
      -
    • - transVar: - Expression evaluates to a transform -
    • - -
    • - name1, - name2, ... - nameN: Name of - parameters. Literal value, not expression. -
    • - -
    • - value1, - value2, ... - valueN: - Expressions evaluate to the values of parameters -
    • -
    - - - - - - -

    -Description

    - - -
    -

    Note

    - -

    This directive is still working, but deprecated. You may - want to read about user-defined directive - calls to see the replacement.

    -
    - - -

    Captures the output generated inside its body (i.e. between - its start-tag and end-tag), and let the given transform modify it - before it is written to the final output.

    - -

    Example:

    - -
    -
    -<p>A very simple HTML file:
    -<pre>
    -<transform html_escape>
    -<html>
    -  <body>
    -    <p>Hello word!
    -  </body>
    -</html>
    -</transform>
    -</pre>  
    - - -

    the output will be:

    - -
    -
    -<p>A very simple HTML file:
    -<pre>
    -&lt;html&gt;
    -  &lt;body&gt;
    -    &lt;p&gt;Hello word!
    -  &lt;/body&gt;
    -&lt;/html&gt;
    -</pre>  
    - - -

    Some transforms may take parameters. The name and meaning of - parameters depends on the transform in question. For example here we - give a parameter called ``var'':

    - -
    -
    -<#-- This transform stores the output in the variable x,
    -     rather than sending it to the output -->
    -<transform capture_output var="x">
    -some test
    -</transform>  
    - - -

    It is the task of the programmers to put the necessary - transforms into the data-model. For the name and usage of accessible - transforms ask the programmers. Initially there is a shared variable for - most transforms in the - freemarker.template.utility package. For more - information see: Programmer's Guide/The Configuration/Shared variables

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_deprecated.html b/fmpp/docs/freemarker/ref_deprecated.html deleted file mode 100644 index 3fa51b7..0000000 --- a/fmpp/docs/freemarker/ref_deprecated.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - FreeMarker Manual - Deprecated FTL constructs - - - - - - - - -
    - - - - - -

    -Chapter 5   Deprecated FTL constructs

    - - - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_alphaidx.html b/fmpp/docs/freemarker/ref_directive_alphaidx.html deleted file mode 100644 index ed1c596..0000000 --- a/fmpp/docs/freemarker/ref_directive_alphaidx.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - FreeMarker Manual - Alphabetical index - - - - - - - - -
    - - - - - -

    -Alphabetical index

    - - -
    -
    -

    If you don't find a directive here that you have seen in a - working template, probably you will find it in: Deprecated FTL constructs

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_assign.html b/fmpp/docs/freemarker/ref_directive_assign.html deleted file mode 100644 index a26c288..0000000 --- a/fmpp/docs/freemarker/ref_directive_assign.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - FreeMarker Manual - assign - - - - - - - - -
    - - - - - -

    -assign

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#assign name=value>
    -or
    -<#assign name1=value1 name2=value2 ... nameN=valueN>
    -or
    -<#assign same as above... in namespacehash>
    -or
    -<#assign name>
    -  capture this
    -</#assign>
    -or
    -<#assign name in namespacehash>
    -  capture this
    -</#assign>
    -
    - - -

    Where:

    - -
    -
      -
    • - name: name - of the variable. It is not expression. However, it can be - written as a string literal, which is useful if the variable - name contains reserved characters, for example - <#assign "foo-bar" = 1>. Note that this - string literal does not expand interpolations (as - "${foo}"). -
    • - -
    • - value: the - value to store. Expression. -
    • - -
    • - namespacehash: - a hash that was created for a namespace (by import). - Expression. -
    • -
    - - - - - - -

    -Description

    - - -

    With this you can create a new variable, or replace an - existing variable. Note that only top-level variables can be - created/replaced (i.e. you can't create/replace - some_hash.subvar, but - some_hash).

    - -

    For more information about variables, read this: Template Author's Guide/Miscellaneous/Defining variables in the template

    - -

    Example: variable seasons will store a - sequence:

    - -
    -
    -<#assign seasons = ["winter", "spring", "summer", "autumn"]>  
    - - -

    Example: Increments the numerical value stored in variable - test:

    - -
    -
    -<#assign test = test + 1>  
    - - -

    As a convenience feature, you can do more assignments with one - assign tag. For example this will do the same as - the two previous examples:

    - -
    -
    -<#assign
    -  seasons = ["winter", "spring", "summer", "autumn"]
    -  test = test + 1
    ->  
    - - -

    If you know what namespaces are: assign - directive creates variables in namespaces. Normally it creates the - variable in the current namespace (i.e. in the namespace associated - with the template where the tag is). However, if you use in - namespacehash then you can - create/replace a variable of another namespace than the current - namespace. For example, here you create/replace variable - bgColor of the namespace used for - /mylib.ftl:

    - -
    -
    -<#import "/mylib.ftl" as my>
    -<#assign bgColor="red" in my>  
    - - -

    An extreme usage of assign is when it - captures the output generated between its start-tag and end-tag. - That is, things that are printed between the tags will not be shown - on the page, but will be stored in the variable. For example:

    - -
    -
    -<#macro myMacro>foo</#macro>
    -<#assign x>
    -  <#list 1..3 as n>
    -    ${n} <@myMacro />
    -  </#list>
    -</#assign>
    -Number of words: ${x?word_list?size}
    -${x}  
    - - -

    will print:

    - -
    -
    -Number of words: 6
    -    1 foo
    -    2 foo
    -    3 foo
    -   
    - - -

    Please note that you should not to use this to insert - variables into strings:

    - -
    -
    -<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->  
    - - -

    You should simply write:

    - -
    -
    -<#assign x="Hello ${user}!">  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_attempt.html b/fmpp/docs/freemarker/ref_directive_attempt.html deleted file mode 100644 index fa726fb..0000000 --- a/fmpp/docs/freemarker/ref_directive_attempt.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - FreeMarker Manual - attempt, recover - - - - - - - - -
    - - - - - -

    -attempt, recover

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#attempt>
    -  attempt block
    -<#recover>
    -  recover block
    -</#attempt>
    -
    -
    - - -

    Where:

    - -
    -
      -
    • - attempt - block: Template block with any content. - This will be always executed, but if an error occurs during - that, all output from this block is rolled back, and the - recover block will - be executed. -
    • - -
    • - recover - block: Template block with any content. - This will be executed only if there was an error during the - execution of the attempt - block. You may print an error messages - here and such. -
    • -
    - - -

    The recover is - mandatory. attempt/recover can - be nested freely into other attempt - blocks or recover - blocks.

    - -
    -

    Note

    - -

    The format shown here is supported starting from 2.3.3; - earlier it was - <#attempt>...<#recover>...</#recover>, - which is still supported for backward compatibility. Furthermore, - these directives were introduced with FreeMarker 2.3.1, so they - aren't exist in 2.3.

    -
    - - - - - - -

    -Description

    - - -

    These directives are used if you want the page successfully - outputted even if the outputting of a certain part of the page - fails. If an error occurs during the execution of the - attempt block, then - the template execution is not aborted, but the - recover block is - executed instead of the attempt - block. If no error occurs during the - execution of the attempt - block, then the - recover block is - ignored. A simple example:

    - -
    -
    -Primary content
    -<#attempt>
    -  Optional content: ${thisMayFails}
    -<#recover>
    -  Ops! The optional content is not available.
    -</#attempt>
    -Primary content continued  
    - - -

    If the thisMayFails variable doesn't exist, - then the output is:

    - -
    -
    -Primary content
    -  Ops! The optional content is not available.
    -Primary content continued  
    - - -

    If the thisMayFails variable exists and - it's value is 123, then the output is:

    - -
    -
    -Primary content
    -  Optional content: 123
    -Primary content continued  
    - - -

    The attempt - block has an all-or-none semantic: either - the entire content of the attempt - block is output (when there was no error), - or no output at all results from the execution of the - attempt block (when - there was an error). For example, above, the failure happens after - ``Optional content: '' was printed, still it is not there in the - output before the ``Ops!''. (This is - implemented with the aggressive buffering of the output inside the - attempt block. Not - even the flush directive will send the output to - the client.)

    - -

    To prevent misunderstandings coming from the above example: - attempt/recover is not (only) - for handling undefined variables (for that use missing value handler - operators). It can handle all kind of errors that occurs when - the block is executed (i.e. not syntactical errors, which are - detected earlier). And it's meant to enclose bigger template - fragments, where error can occur at various points. For example, you - have a part in your template that deals with printing - advertisements, but that's not the primary content of the page, so - you don't want your whole page be down just because some error - occurs with the printing of the advertisements (say, because of a - temporal database server faliure). So you put the whole - advertisement printing into an attempt - block.

    - -

    In some environments programmers configure FreeMarker so that - it doesn't abort template execution for certain errors, but - continues execution, possibly after printing some error indicator to - the output (see more here...). The - attempt directive doesn't consider such - suppressed errors as errors.

    - -

    Inside a recover - block the error message of the error is - available with the error special variable. Don't forget that - references to special variable are started with dot (for example: - ${.error}).

    - -

    Errors occurring during template - execution are always logged, even if they occur inside - an attempt - block.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_compress.html b/fmpp/docs/freemarker/ref_directive_compress.html deleted file mode 100644 index aa5ab9c..0000000 --- a/fmpp/docs/freemarker/ref_directive_compress.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - FreeMarker Manual - compress - - - - - - - - -
    - - - - - -

    -compress

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#compress>
    -  ...
    -</#compress>
    -
    - - - - - - -

    -Description

    - - -

    The compress directive is useful for removing superfluous - white-space when you use a - white-space insensitive format (e.g. HTML or XML). It captures the - output generated inside its body (i.e. between its start-tag and - end-tag), and reduces all unbroken white-space sequences to a single - white-space character. The inserted character will be a line break if the replaced sequence - contains line breaks, or a space otherwise. The very first and very - last unbroken white-space sequences will be completely - removed.

    - -
    -
    -<#assign x = "    moo  \n\n   ">
    -(<#compress>
    -  1 2  3   4    5
    -  ${moo}
    -  test only
    -
    -  I said, test only
    -
    -</#compress>)  
    - - -

    will output:

    - -
    -
    -(1 2 3 4 5
    -moo
    -test only
    -I said, test only)  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_escape.html b/fmpp/docs/freemarker/ref_directive_escape.html deleted file mode 100644 index ffa703d..0000000 --- a/fmpp/docs/freemarker/ref_directive_escape.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - FreeMarker Manual - escape, noescape - - - - - - - - -
    - - - - - -

    -escape, noescape

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#escape identifier as expression>
    -  ...
    -  <#noescape>...</#noescape>
    -  ...
    -</#escape>
    -
    - - - - - - -

    -Description

    - - -

    When you surround a part of the template with an escape - directive, interpolations - (${...}) that occur - inside the block are combined with the escaping expression - automatically. This is a convenience method for avoiding writing - similar expressions all over. It does not affect interpolations in - string literals (as in <#assign x = - "Hello ${user}!">). Also, it does not affect numerical - interpolations - (#{...}).

    - -

    Example:

    - -
    -
    -<#escape x as x?html>
    -  First name: ${firstName}
    -  Last name: ${lastName}
    -  Maiden name: ${maidenName}
    -</#escape>  
    - - -

    is actually equivalent to:

    - -
    -
    -  First name: ${firstName?html}
    -  Last name: ${lastName?html}
    -  Maiden name: ${maidenName?html 
    - - -

    Note that it is irrelevant what identifier you use in the - directive - it just serves as a formal parameter to the escaping - expression.

    - -

    When you are calling macros or the include - directive, it is important to understand that escape has effect only - on interpolations that occur between the <#escape - ...> and - </#escape> in the template - text. That is, it will not escape anything that is before - <#escape ...> in - the text, or after the </#escape> in the - text, not even if that part is called from inside the - escape-d section.

    - -
    -
    -<#assign x = "<test>">
    -<#macro m1>
    -  m1: ${x}
    -</#macro>
    -<#escape x as x?html>
    -  <#macro m2>m2: ${x}</#macro>
    -  ${x}
    -  <@m1/>
    -</#escape>
    -${x}
    -<@m2/>  
    - - -

    the output will be:

    - -
    -
    -  &lt;test&gt;
    -  m1: <test>
    -<test>
    -m2: &lt;test&gt;  
    - - -

    More technically, the effects of - escape directive are applied at template parsing - time rather than at template processing time. This means that if you - call a macro or include another template from within an escape - block, it won't affect the interpolations in the macro/included - template, since macro calls and template includes are evaluated at - template processing time. On the other hand, if you surround one or - more macro declarations (which are evaluated at template parsing - time, as opposed to macro calls) with an escape block, the - interpolations in those macros will be combined with the escaping - expression.

    - -

    Sometimes there is a need to temporarily turn off escaping for - one or two interpolations in an escape block. You can achieve this - by closing and later reopening the escape block, but then you have - to write the escaping expression twice. You can instead use the - noescape directive:

    - -
    -
    -<#escape x as x?html>
    -  From: ${mailMessage.From}
    -  Subject: ${mailMessage.Subject}
    -  <#noescape>Message: ${mailMessage.htmlFormattedBody}</#noescape>
    -  ...
    -</#escape>  
    - - -

    is equivalent to:

    - -
    -
    -  From: ${mailMessage.From?html}
    -  Subject: ${mailMessage.Subject?html}
    -  Message: ${mailMessage.htmlFormattedBody}
    -  ...  
    - - -

    Escapes can be nested (although you will do it only in rare - circumstances). Therefore, you can write something like the below - code (the example is admittedly a bit stretched, as you'd probably - place item codes in a sequence and use list to - iterate over them, but we're now doing it this way just to - illustrate the point):

    - -
    -
    -<#escape x as x?html>
    -  Customer Name: ${customerName}
    -  Items to ship:
    -  <#escape x as itemCodeToNameMap[x]>
    -    ${itemCode1}
    -    ${itemCode2}
    -    ${itemCode3}
    -    ${itemCode4}
    -  </#escape>
    -</#escape>  
    - - -

    is actually equivalent to:

    - -
    -
    -  Customer Name: ${customerName?html}
    -  Items to ship:
    -    ${itemCodeToNameMap[itemCode1]?html}
    -    ${itemCodeToNameMap[itemCode2]?html}
    -    ${itemCodeToNameMap[itemCode3]?html}
    -    ${itemCodeToNameMap[itemCode4]?html}  
    - - -

    When you use the noescape directive in a nested escape block, - it undoes only a single level of escaping. Therefore, to completely - turn off escaping in a two-level deep escaped block, you need to use - two nested noescape directives as well.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_flush.html b/fmpp/docs/freemarker/ref_directive_flush.html deleted file mode 100644 index 36b77f6..0000000 --- a/fmpp/docs/freemarker/ref_directive_flush.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - FreeMarker Manual - flush - - - - - - - - -
    - - - - - -

    -flush

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#flush>
    -
    - - - - - - -

    -Description

    - - -

    When FreeMarker generates the output it typically stockpiles - the generated output and send it to the client in one or in a few - big pieces. This act of sending is called flushing (as flushing the - toilet). Although flushing happens automatically, sometimes you want - to force it on certain points of the template processing, and this - is what flush directive does. If it is needed, - then the programmer could tell it to you; typically you should not - use this directive. The mechanism of automatic flushing and the - precise effect of flush directive are under the - control of the programmer.

    - -

    Flush simply calls the flush - method of the currently used java.io.Writer instance. The whole - buffering and flushing mechanism is implemented in the writer (what - you have passed as the parameter of the - Template.process method); FreeMarker does not - deal with it.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_ftl.html b/fmpp/docs/freemarker/ref_directive_ftl.html deleted file mode 100644 index 74f6b30..0000000 --- a/fmpp/docs/freemarker/ref_directive_ftl.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - FreeMarker Manual - ftl - - - - - - - - -
    - - - - - -

    -ftl

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#ftl param1=value1 param2=value2 ... paramN=valueN>
    -
    - - -

    Where:

    - -
    -
      -
    • - param1, - param2, ...etc.: - Name of the parameter. Not an expression. Allowed parameters - are: encoding, - strip_whitespace, - strip_text, ...etc. See below. -
    • - -
    • - value1, - value2, ...etc.: - The value of parameter. This must be a constant expression (as - true, or "ISO-8859-5", or - {x:1, y:2}). It can't use variables. -
    • -
    - - - - - - -

    -Description

    - - -

    Tells information about the template for FreeMarker and for - other tools, also helps programs to automatically detect if a text - file is an FTL file. This directive, if present, must be the very - first thing in the template. Any white-space before this directive - will be ignored. The old-syntax (#-less) format - of this directive is not supported.

    - -

    The settings (encoding, white-space stripping, etc.) given - here has the highest precedence, that is, they will be used for the - template regardless of any FreeMarker configuration settings.

    - -

    Parameters:

    - -
    -
      -
    • -

      encoding: With this you can specify the - encoding (charset) of the template in the template file itself. - (That is, this will be the - encoding setting of the newly created - Template, and not even the - encoding parameter to - Configuration.getTemplate can override - it). Note however, that FreeMarker will try to find and - interpret the ftl directive first with the - automatically guessed encoding (which depends on the FreeMarker - configuration set by the programmers), and only then realizes if - the ftl directive dictates something - different, and re-read the template with the new encoding. Thus, - the template must be valid FTL until the end of - ftl tag with the encoding tried first. The - valid values of this parameter are MIME-preferred charset names - from the IANA Charset Registry, like ISO-8859-5, UTF-8 or - Shift_JIS.

      -
    • - -
    • -

      strip_whitespace: This enables/disables - white-space - stripping. Valid values are the boolean constants - true and false. (And for - backward compatibility, strings "yes", - "no", "true", - "false"). The default value (i.e. when you - don't use this parameter) depends on the FreeMarker - configuration set by the programmers, but it should be - true for new projects.

      -
    • - -
    • -

      strip_text: When enabled, all top-level - text in a template is removed when the template is parsed. This - does not affect text within macros, directives, or - interpolations. Valid values are the boolean constants - true and false. (And for - backward compatibility, strings "yes", - "no", "true", - "false"). The default value (i.e. when you - don't use this parameter) is false.

      -
    • - -
    • -

      strict_syntax: This turns on/off - ``strict syntax''. Valid values are the boolean constants - true and false. (And for - backward compatibility, strings "yes", - "no", "true", - "false"). The default value (i.e. when you - don't use this parameter) depends on the FreeMarker - configuration set by the programmers, but it should be - true for new projects. (Programmers: you must set explicitly this - setting to true for this: - config.setStrictSyntaxMode(true);) - For more information read: Deprecated FTL constructs/Old FTL syntax

      -
    • - -
    • -

      ns_prefixes: This is a hash that - associates prefixes with node namespaces. For example: - {"e":"http://example.com/ebook", - "vg":"http://example.com/vektorGraphics"}. This is - mostly used with XML processing where the prefixes can be used - in XML queries, but it also influences the working of directives - visit and recurse. - Only one prefix can be registered for the same node namespace - (otherwise an error will occur), so there is one-to-one relation - between prefixes and node namespaces. Prefixes - D and N are reserved. If - you register prefix D, then other than you - associate the node namespace with prefix D, - you also set the default node namespace. Prefix - N can't be registered; it is used to denote - nodes with no node namespace in certain places, when (and only - when) prefix D is registered. (To see the - usage of default node namespace, N, and - prefixes in general, see the part about XML - processing and visit and - recurse in the reference.) The effect - of ns_prefixes is limited to a single FTL namespace, namely, to - the FTL namespace that was created for the template. This also - means that ns_prefixes has effect only when - an FTL namespace is created for the template that contains it, - otherwise the ns_prefixes parameter has no - effect. An FTL namespace is made for a template when: (a) the - template is the ``main'' template, that is, it is not invoked as - a result of an <#include ...>, but it - is directly invoked (with the - process Java method of class - Template or - Environment); (b) the template is - invoked directly with <#import - ...>.

      -
    • - -
    • -

      attributes: This is a hash that - associates arbitrary attributes (name-value pairs) to the - template. The values of the attributes can be of any type - (string, number, sequence... etc.). FreeMarker doesn't try to - understand the meaning of the attributes. It's up to the - application that encapsulates FreeMarker (as a Web application - framework). Thus, the set of allowed attributes and their - semantic is application (Web application framework) dependent. - Programmers: you can get the - attributes associated with a Template object - with its getCustomAttributeNames and - getCustomAttribute methods (inherited from - freemarker.core.Configurable). As the - template attributes are associated with the - Template object when the template is parsed, - the attributes can be read anytime, the template need not be - executed. The methods mentioned return the attribute values - unwrapped, that is, with FreeMarker independent type as - java.util.List.

      -
    • -
    - - -

    This directive also determines if the template uses angle - bracket syntax (e.g. <#include 'foo.ftl'>) - or square bracket - syntax (e.g. [#include 'foo.ftl']). - Simply, the syntax used for this directive will be the syntax used - for the whole template, regardless of the FreeMarker configuration - settings.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_function.html b/fmpp/docs/freemarker/ref_directive_function.html deleted file mode 100644 index 94c9543..0000000 --- a/fmpp/docs/freemarker/ref_directive_function.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - FreeMarker Manual - function, return - - - - - - - - -
    - - - - - -

    -function, return

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#function name param1 param2 ... paramN>
    -  ...
    -  <#return returnValue>
    -  ...
    -</#function>
    -
    - - -

    Where:

    - -
    -
      -
    • - name: name - of method variable (not expression) -
    • - -
    • - param1, - param2, ...etc.: - the name of the local - variables store the parameter values (not expression), - optionally followed by = and the default - value (that's an expression). -
    • - -
    • - paramN, the - last parameter, may optionally include a trailing ellipsis - (...), which indicates the macro takes a - variable number of parameters. Local variable - paramN will be a - sequence of the extra parameters. -
    • - -
    • - returnValue: - the expression that calculates the value of the method - call. -
    • -
    - - -

    The return directive can be used anywhere - and for any times between the <#function - ...> and - </#function>.

    - -

    Parameters without default value must precede parameters with - default value - (paramName=defaultValue).

    - - - - - -

    -Description

    - - -

    Creates a method variable (in the current namespace, if you - know namespace feature). This directive works in the same way as the - macro - directive, except that return directive - must have a parameter that specifies the return - value of the method, and that attempts to write to the output will - be ignored. If the </#function> is reached - (i.e. there was no return - returnValue), then the return - value of the method is an undefined variable.

    - -

    Example 1: Creating a method that calculates the average of - two numbers:

    - -
    -
    -<#function avg x y>
    -  <#return (x + y) / 2>
    -</#function>
    -${avg(10, 20)}  
    - - -

    will print:

    - -
    -
    -15  
    - - -

    Example 2: Creating a method that calculates the average of - multiple numbers:

    - -
    -
    -<#function avg nums...>
    -  <#local sum = 0>
    -  <#list nums as num>
    -    <#local sum = sum + num>
    -  </#list>
    -  <#if nums?size != 0>
    -    <#return sum / nums?size>
    -  </#if>
    -</#function>
    -${avg(10, 20)}
    -${avg(10, 20, 30, 40)}
    -${avg()!"N/A"}  
    - - -

    will print:

    - -
    -
    -15
    -25
    -N/A  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_global.html b/fmpp/docs/freemarker/ref_directive_global.html deleted file mode 100644 index 654bb5b..0000000 --- a/fmpp/docs/freemarker/ref_directive_global.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - FreeMarker Manual - global - - - - - - - - -
    - - - - - -

    -global

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#global name=value>
    -or
    -<#global name1=value1 name2=value2 ... nameN=valueN>
    -or
    -<#global name>
    -  capture this
    -</#global>
    -
    - - -

    Where:

    - -
    -
      -
    • - name: name - of the variable. It is not expression. However, it can be - written as a string literal, which is useful if the variable - name contains reserved characters, for example - <#global "foo-bar" = 1>. Note that this - string literal does not expand interpolations (as - "${foo}"). -
    • - -
    • - value: the - value to store. Expression. -
    • -
    - - - - - - -

    -Description

    - - -

    This directive is similar to assign, but - the variable created will be visible in all namespaces, and will not be - inside any namespace. Exactly as if you would create (or replace) a - variable of the data-model. Hence, the variable is global. If a - variable with the same name already exists in the data-model, it - will be hidden by the variable created with this directive. If a - variable with the same name already exists in the current namespace, - that will hide the variable created with global - directive.

    - -

    For example, with <#global x = 1> you - create a variable that is visible as x in all - namespaces, unless another variable called x - hides it (for example a variable what you have created as - <#assign x = 2>). In this case, you can use - special - variable globals, like - ${.globals.x}. Note that with - globals you see all globally accessible - variables; not only the variables that were created with - global directive, but also the variables of the - data-model.

    - -

    Note for custom JSP tag users: The set of variables created - with this directive corresponds to the JSP page-scope. This means, - that if a custom JSP tag wants to get a page-scope attribute - (page-scope bean), a variable with the same name in the current - namespace will not hide it from the viewpoint of the JSP tag.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_if.html b/fmpp/docs/freemarker/ref_directive_if.html deleted file mode 100644 index 1063616..0000000 --- a/fmpp/docs/freemarker/ref_directive_if.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - FreeMarker Manual - if, else, elseif - - - - - - - - -
    - - - - - -

    -if, else, elseif

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#if condition>
    -  ...
    -<#elseif condition2>
    -  ...
    -<#elseif condition3>
    -  ...
    -...
    -<#else>
    -  ...
    -</#if>
    -
    - - -

    Where:

    - -
    -
      -
    • - condition, - condition2, - ...etc.: Expression evaluates to a boolean value. -
    • -
    - - - - - - -

    -Description

    - - -

    You can use if, elseif - and else directives to conditionally skip a - section of the template. The - condition-s must - evaluate to a boolean value, or else an error will abort template - processing. The elseif-s and - else-s must occur inside if - (that is, between the if start-tag and end-tag). - The if can contain any number of - elseif-s (including 0) and at the end optionally - one else. Examples:

    - -

    if with 0 elseif and no - else:

    - -
    -
    -<#if x == 1>
    -  x is 1
    -</#if>  
    - - -

    if with 0 elseif and - else:

    - -
    -
    -<#if x == 1>
    -  x is 1
    -<#else>
    -  x is not 1
    -</#if>  
    - - -

    if with 2 elseif and no - else:

    - -
    -
    -<#if x == 1>
    -  x is 1
    -<#elseif x == 2>
    -  x is 2
    -<#elseif x == 3>
    -  x is 3
    -</#if>  
    - - -

    if with 3 elseif and - else:

    - -
    -
    -<#if x == 1>
    -  x is 1
    -<#elseif x == 2>
    -  x is 2
    -<#elseif x == 3>
    -  x is 3
    -<#elseif x == 4>
    -  x is 4
    -<#else>
    -  x is not 1 nor 2 nor 3 nor 4
    -</#if>  
    - - -

    To see more about boolean expressions, see: Template Author's Guide/The Template/Expressions.

    - -

    You can nest if directives (of - course):

    - -
    -
    -<#if x == 1>
    -  x is 1
    -  <#if y == 1>
    -    and y is 1 too
    -  <#else>
    -    but y is not
    -  </#if>
    -<#else>
    -  x is not 1
    -  <#if y < 0>
    -    and y is less than 0
    -  </#if>
    -</#if>  
    - - -
    -

    Note

    - -

    When you want to test if x > 0 or - x >= 0, writing <#if x > - 0> and <#if x >= 0> is - WRONG, as the first > will close the - #if tag. To work that around, write - <#if x gt 0> or <#if gte - 0>. Also note that if the comparison occurs inside - parentheses, you will have no such problem, like <#if - foo.bar(x > 0)> works as expected.

    -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_import.html b/fmpp/docs/freemarker/ref_directive_import.html deleted file mode 100644 index d1ca6f2..0000000 --- a/fmpp/docs/freemarker/ref_directive_import.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - FreeMarker Manual - import - - - - - - - - -
    - - - - - -

    -import

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#import path as hash>
    -
    - - -

    Where:

    - -
    -
      -
    • - path: The - path of a template. This is an expression that evaluates to a - string. (With other words, it doesn't have to be a fixed string, - it can also be something like, for example, - profile.baseDir + "/menu.ftl".) -
    • - -
    • - hash: The - unquoted name of hash variable by which you can access the - namespace. Not an expression. -
    • -
    - - - - - - -

    -Description

    - - -

    Imports a library. That is, it creates a new empty namespace, - and then executes the template given with - path parameter in that - namespace so the template populates the namespace with variables - (macros, functions, ...etc.). Then it makes the newly created - namespace available to the caller with a hash variable. The hash - variable will be created as a plain variable in the namespace used - by the caller of import (as if you would create - it with assign directive), with the name given - with the hash - parameter.

    - -

    If you call import with the same - path for multiple - times, it will create the namespace and run the template for the - very first call of import only. The later calls - will just create a hash by which you can access the - same namespace.

    - -

    The output printed by the imported template will be ignored - (will not be inserted at the place of importing). The template is - executed to populate the namespace with variables, and not to write - to the output.

    - -

    Example:

    - -
    -
    -<#import "/libs/mylib.ftl" as my>
    -
    -<@my.copyright date="1999-2002"/>  
    - - -

    The path - parameter can be a relative path like "foo.ftl" - and "../foo.ftl", or an absolute like - "/foo.ftl". Relative paths are relative to the - directory of the template that uses the import - directive. Absolute paths are relative to a base (often referred as - the ''root directory of the templates'') that the programmer defines - when he configures FreeMarker.

    - -

    Always use / (slash) to separate path - components, never \ (backslash). If you are - loading templates from your local file system and it uses - backslashes (like under. Windows), FreeMarker will convert them - automatically.

    - -

    Like with the include directive, acquisition and - localized - lookup may be used for resolving the path.

    - -

    Note, that it is possible to - automatically do the commonly used imports for all templates, with - the "auto imports" setting of - Configuration.

    - -

    If you are new to namespaces, you should read: Template Author's Guide/Miscellaneous/Namespaces

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_include.html b/fmpp/docs/freemarker/ref_directive_include.html deleted file mode 100644 index b4c3f6a..0000000 --- a/fmpp/docs/freemarker/ref_directive_include.html +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - - - FreeMarker Manual - include - - - - - - - - -
    - - - - - -

    -include

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#include path>
    -or
    -<#include path options>
    -
    - - -

    Where:

    - -
    -
      -
    • - path: The - path of the file to include; an expression that evaluates to a - string. (With other words, it doesn't have to be a fixed string, - it can also be something like, for example, - profile.baseDir + "/menu.ftl".) -
    • - -
    • - options: One - or more of these: - encoding=encoding, - parse=parse - -
      -
        -
      • - encoding: - Expression evaluates to string -
      • - -
      • - parse: - Expression evaluates to boolean (also accepts a few string - values for backward compatibility) -
      • - -
      • - ignore_missing: - Expression evaluates to boolean -
      • -
      - -
    • -
    - - - - - - -

    -Description

    - - -

    You can use it to insert another FreeMarker template file - (specified by the path - parameter) into your template. The output from the included template - is inserted at the point where the include tag - occurs. The included file shares the variables with the including - template, similarly like if it was copy-pasted into it. The - include directive is not really replaced by the - content of the included file, instead it processes the included file - each time when FreeMarker reaches the include - directive in the course of template processing. So for example if - the include is inside a list - loop, you can specify different file names in each cycle.

    - -
    -

    Note

    - -

    This directive is not be confused with the JSP (Servlet) - include, as it doesn't involve the Servlet container at all, just - processes another FreeMarker template, without "leaving" - FreeMarker. Regarding how to do a "JSP include" read this...

    -
    - - -

    The path - parameter can be a relative path like "foo.ftl" - and "../foo.ftl", or an absolute like - "/foo.ftl". Relative paths are relative to the - directory of the template that contains the - import directive. Absolute paths are relative to - a base (often referred as the 'root directory of the templates') - that the programmer defines when he configures FreeMarker.

    - -
    -

    Note

    - -

    This is different than the way it worked prior FreeMarker - 2.1, where the path was always absolute. To preserve the old - behavior, enable the classic compatible mode in the - Configuration object.

    -
    - - -

    Always use / (slash) to separate path - components, never \ (backslash). Even if you are - loading templates from your local file system and it uses - backslashes (like under. Windows), use /.

    - -

    Example:

    - -

    Assume /common/copyright.ftl contains:

    - -
    -
    -Copyright 2001-2002 ${me}<br>
    -All rights reserved.  
    - - -

    Then this:

    - -
    -
    -<#assign me = "Juila Smith">
    -<h1>Some test</h1>
    -<p>Yeah.
    -<hr>
    -<#include "/common/copyright.ftl">  
    - - -

    will output this:

    - -
    -
    -<h1>Some test</h1>
    -<p>Yeah.
    -<hr>
    -Copyright 2001-2002 Juila Smith
    -All rights reserved.  
    - - -

    The supported - options are:

    - -
    -
      -
    • -

      parse: If it is - true, then the included file will be parsed - as FTL, otherwise the whole file will be considered as simple - text (i.e, no FreeMarker constructs will be searched in it). If - you omit this option, then it defaults to - true.

      -
    • - -
    • -

      encoding: The included file inherits - the encoding (the charset) of the top-level template, unless you - specify an encoding with this option. Examples of valid names: - UTF-8, ISO-8859-1, ISO-8859-2, Shift_JIS, Big5, EUC-KR, GB2312. - Encoding names are the same as the - ones supported be java.io.InputStreamReader (as of Java API 1.3: - MIME-preferred charset names from the IANA Charset - Registry)

      -
    • - -
    • -

      ignore_missing: When - true, suppresses the error when the template - to include is missing, instead <#include - ...> will print nothing. When - false, the template processing will stop with - error if the template is missing. If you omit this option, then - it defaults to false.

      -
    • -
    - - -

    Example:

    - -
    -
    -<#include "/common/navbar.html" parse=false encoding="Shift_JIS">  
    - - -

    Note, that it is possible to - automatically do the commonly used inclusions for all templates, - with the "auto includes" setting of - Configuration.

    - - - - - - -

    -Using acquisition

    - - - - -

    There's a special path component represented by an asterisk - (*). It is interpreted as "this directory or - any of its parents". Therefore, if the template located in - /foo/bar/template.ftl has the following - line:

    - -
    -
    -<#include "*/footer.ftl">  
    - - -

    then the engine will look for the template in following - locations, in this order:

    - -
    -
      -
    • - /foo/bar/footer.ftl -
    • - -
    • - /foo/footer.ftl -
    • - -
    • - /footer.ftl -
    • -
    - - -

    This mechanism is called acquisition and allows the designers to - place commonly included files in a parent directory, and redefine - them on a per-subdirectory basis as needed. We say that the - including template acquires the template to include from the first - parent directory that has it. Note that you can specify not only a - template name to the right of the asterisk, but a subpath as well. - I.e. if the previous template instead read:

    - -
    -
    -<#include "*/commons/footer.ftl">  
    - - -

    then the engine would look for the template in following - locations, in this order:

    - -
    -
      -
    • - /foo/bar/commons/footer.ftl -
    • - -
    • - /foo/commons/footer.ftl -
    • - -
    • - /commons/footer.ftl -
    • -
    - - -

    Finally, the asterisk needn't be the first element of the - path:

    - -
    -
    -<#include "commons/*/footer.ftl">  
    - - -

    would cause the engine to look for the template in following - locations, in this order:

    - -
    -
      -
    • - /foo/bar/commons/footer.ftl -
    • - -
    • - /foo/bar/footer.ftl -
    • - -
    • - /foo/footer.ftl -
    • - -
    • - /footer.ftl -
    • -
    - - -

    However, there can be at most one asterisk in the path. If - you specifying more asterisks, the template won't be found.

    - - - - - - - -

    -Localized lookup

    - - - - -

    Whenever a template is loaded, it is assigned a locale. A - locale is a language and an optional country or dialect - identifier. A template is typically loaded by some code that the - programmer wrote and he chooses a locale for the template based on - some aspect. For example, when the - FreemarkerServlet loads templates, it always - requests the template with locale matching the language preference - of the browser that requested the web page.

    - -

    When a template includes another template, it attempts to - load a template with the same locale. Suppose your template was - loaded with locale en_US, which means U.S. - English. When you include another template:

    - -
    -
    -<include "footer.ftl">  
    - - -

    the engine will in fact look for several templates, in this - order:

    - -
    -
      -
    • - footer_en_US.ftl, -
    • - -
    • - footer_en.ftl, and finally -
    • - -
    • - footer.ftl -
    • -
    - - -

    Note that you can disable - localized lookup feature with the - setLocalizedLookup method of - Configuration.

    - -

    When you use both acquisition and localized template lookup, - the template with more specific locale in a parent directory takes - precedence over template with less specific locale in a child - directory. Suppose you use the following include from - /foo/bar/template.ftl:

    - -
    -
    -<#include "*/footer.ftl">  
    - - -

    the engine will look for these templates, in this - order:

    - -
    -
      -
    • - /foo/bar/footer_en_US.ftl -
    • - -
    • - /foo/footer_en_US.ftl -
    • - -
    • - /footer_en_US.ftl -
    • - -
    • - /foo/bar/footer_en.ftl -
    • - -
    • - /foo/footer_en.ftl -
    • - -
    • - /footer_en.ftl -
    • - -
    • - /foo/bar/footer.ftl -
    • - -
    • - /foo/footer.ftl -
    • - -
    • - /footer.ftl -
    • -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_list.html b/fmpp/docs/freemarker/ref_directive_list.html deleted file mode 100644 index 6c7b59d..0000000 --- a/fmpp/docs/freemarker/ref_directive_list.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - FreeMarker Manual - list, break - - - - - - - - -
    - - - - - -

    -list, break

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#list sequence as item>
    -    ...
    -</#list>
    -
    - - -

    Where:

    - -
    -
      -
    • - sequence: - Expressions evaluates to a sequence or collection -
    • - -
    • - item: Name - of the loop variable (not - an expression) -
    • -
    - - - - - - -

    -Description

    - - -

    You can use the list directive to process a - section of template for each variable contained within a sequence. - The code between the start-tag and end-tag will be processed for the - 1st subvariable, then for the 2nd subvariable, then for the 3rd - subvariable, etc until it passes the last one. For each such - iteration the loop variable will contain the current - subvariable.

    - -

    There are two special loop variables available inside the list - loop:

    - -
    -
      -
    • -

      item_index: - The index (0-based number) of the current item in the - loop.

      -
    • - -
    • -

      item_has_next: - Boolean value that tells if the current item is the last in the - sequence or not.

      -
    • -
    - - -

    Example 1:

    - -
    -
    -<#assign seq = ["winter", "spring", "summer", "autumn"]>
    -<#list seq as x>
    -  ${x_index + 1}. ${x}<#if x_has_next>,</#if>
    -</#list>  
    - - -

    will output:

    - -
    -
    -  1. winter,
    -  2. spring,
    -  3. summer,
    -  4. autumn  
    - - -

    Example 2: You can use list to count - between two numbers, using a numerical range sequence - expression:

    - -
    -
    -<#assign x=3>
    -<#list 1..x as i>
    -  ${i}
    -</#list>  
    - - -

    The output will be:

    - -
    -
    -  1
    -  2
    -  3
    -   
    - - -

    Note that the above example will not work as you may expected - if x is 0, as then it will print 0 and -1.

    - - - -

    You can leave the list loop before it - passes the last subvariable of the sequence with the - break directive. For example this will print - ``winter'' and ``spring'' only:

    - -
    -
    -<#list seq as x>
    -  ${x}
    -  <#if x = "spring"><#break></#if>
    -</#list>  
    - - -

    Note that if you turn on the - classic compatible mode, then the list accepts a - scalar as well and treats it as a single-element - sequence.

    - -

    In general, it is best to avoid - using collection that wraps an Iterator as - parameters to list and use collection that wraps - java.util.Collection or sequence whenever - possible. There are situations however, when you only have an - Iterator at your disposal. Note that if you pass - an collection that wraps an Iterator to the - list, you can iterate over its elements only once - since Iterators are by their nature one-off - objects. When you try to list a such collection variable for the - second time, an error will abort template - processing.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_local.html b/fmpp/docs/freemarker/ref_directive_local.html deleted file mode 100644 index 3cc6b7f..0000000 --- a/fmpp/docs/freemarker/ref_directive_local.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - FreeMarker Manual - local - - - - - - - - -
    - - - - - -

    -local

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#local name=value>
    -or
    -<#local name1=value1 name2=value2 ... nameN=valueN>
    -or
    -<#local name>
    -  capture this
    -</#local>
    -
    -
    - - -

    Where:

    - -
    -
      -
    • - name: the - name of the local object in the root. It is not an expression. - However, it can be written as a string literal, which is useful - if the variable name contains reserved characters, for example - <#local "foo-bar" = 1>. Note that this - string literal does not expand interpolations (as - "${foo}"). -
    • - -
    • - value: the - value to store. Expression. -
    • -
    - - - - - - -

    -Description

    - - -

    It is similar to assign - directive, but it creates or replaces local variables. This - only works inside macro definitions and function definitons.

    - -

    For more information about variables, read this: Template Author's Guide/Miscellaneous/Defining variables in the template

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_macro.html b/fmpp/docs/freemarker/ref_directive_macro.html deleted file mode 100644 index 737fb5e..0000000 --- a/fmpp/docs/freemarker/ref_directive_macro.html +++ /dev/null @@ -1,480 +0,0 @@ - - - - - - - - FreeMarker Manual - macro, nested, return - - - - - - - - -
    - - - - - -

    -macro, nested, return

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#macro name param1 param2 ... paramN>
    -  ...
    -  <#nested loopvar1, loopvar2, ..., loopvarN>
    -  ...
    -  <#return>
    -  ...
    -</#macro>
    -
    - - -

    Where:

    - -
    -
      -
    • - name: name - of macro variable. It's not an expression. However, it can be - written as a string literal, which is useful if the macro name - contains reserved characters, for example <#macro - "foo-bar">.... Note that - this string literal does not expand interpolations (as - "${foo}"). -
    • - -
    • - param1, - param2, ...etc.: - the name of the local - variables store the parameter values (not expression), - optionally followed by = and the default - value (that's an expression). The default value can even be - another parameter, for example <#macro section title - label=title>. -
    • - -
    • - paramN, the - last parameter, may optionally include a trailing ellipsis - (...), which indicates the macro takes a - variable number of parameters. If called using named parameters, - paramN will be a - hash containing all of the undeclared key/value pairs passed to - the macro. If called using positional parameters, - paramN will be a - sequence of the extra parameters. -
    • - -
    • - loopvar1, - loopvar2, ...etc.: - Optional. The values of loop - variables that the nested directive - wants to create for the nested content. These are - expressions. -
    • -
    - - -

    The return and nested - directives are optional and can be used anywhere and for any times - between the <#macro - ...> and - </#macro>.

    - -

    Parameters without default value must precede parameters with - default value - (paramName=defaultValue).

    - - - - - -

    -Description

    - - -

    Creates a macro variable (in the current namespace, if you - know namespace feature). If you are new to macros and user-defined - directives you should read the the tutorial about user-defined - directives.

    - -

    Macro variable stores a template fragment (called macro - definition body) that can be used as user-defined directive. - The variable also stores the name of allowed parameters to the - user-defined directive. You must give value for all of those - parameters when you use the variable as directive, except for - parameters that has a default value. The default value will be used - if and only if you don't give value for the parameter when you call - the macro.

    - -

    The variable will be created at the beginning of the template; - it does not mater where the macro directive is - placed in the template. Thus, this will work:

    - -
    -
    -<#-- call the macro; the macro variable is already created: -->
    -<@test/>
    -...
    -
    -<#-- create the macro variable: -->
    -<#macro test>
    -  Test text
    -</#macro>  
    - - -

    However, if the macro definitions are inserted with - include directive, they will not be available - until FreeMarker has executed the include - directive.

    - -

    Example: Macro without parameters:

    - -
    -
    -<#macro test>
    -  Test text
    -</#macro>
    -<#-- call the macro: -->
    -<@test/>  
    - - -

    Output:

    - -
    -
    -  Test text
    -   
    - - -

    Example: Macro with parameters:

    - -
    -
    -<#macro test foo bar baaz>
    -  Test text, and the params: ${foo}, ${bar}, ${baaz}
    -</#macro>
    -<#-- call the macro: -->
    -<@test foo="a" bar="b" baaz=5*5-2/>  
    - - -

    Output:

    - -
    -
    -  Test text, and the params: a, b, 23
    -     
    - - -

    Example: Macro with parameters and default parameter - values:

    - -
    -
    -<#macro test foo bar="Bar" baaz=-1>
    -  Test text, and the params: ${foo}, ${bar}, ${baaz}
    -</#macro>
    -<@test foo="a" bar="b" baaz=5*5-2/>
    -<@test foo="a" bar="b"/>
    -<@test foo="a" baaz=5*5-2/>
    -<@test foo="a"/>  
    - - -

    Output:

    - -
    -
    -  Test text, and the params: a, b, 23
    -  Test text, and the params: a, b, -1
    -  Test text, and the params: a, Bar, 23
    -  Test text, and the params: a, Bar, -1
    -   
    - - -

    Example: A more complex macro.

    - -
    -
    -<#macro list title items>
    -  <p>${title?cap_first}:
    -  <ul>
    -    <#list items as x>
    -      <li>${x?cap_first}
    -    </#list>
    -  </ul>
    -</#macro>
    -<@list items=["mouse", "elephant", "python"] title="Animals"/>  
    - - -

    Output:

    - -
    -
    -  <p>Animals:
    -  <ul>
    -      <li>Mouse
    -      <li>Elephant
    -      <li>Python
    -  </ul>
    -   
    - - -

    Example: A macro with support for a variable number of named - parameters:

    - -
    -
    -<#macro img src extra...>
    -  <img src="/context${src?html}" 
    -  <#list extra?keys as attr>
    -    ${attr}="${extra[attr]?html}"
    -  </#list>
    -  >
    -</#macro>
    -<@img src="/images/test.png" width=100 height=50 alt="Test"/>  
    - - -

    Output:

    - -
    -
    -  <img src="/context/images/test.png"
    -    alt="Test"
    -    height="50"
    -    width="100"
    -  >  
    - - - - - - - -

    -nested

    - - - - -

    The nested directive executes the - template fragment between the start-tag and end-tags of the - user-defined directive. The nested part can contain anything what - is valid in templates; interpolations, directives, ...etc. It is - executed in the context where the macro was called from, rather - than in the context of the macro definition body. Thus, for - example, you don't see the local variables of the macro in the - nested part. If you don't call the nested - directive, the part between the start-tag and end-tags of the - user-defined directive will be ignored.

    - -

    Example:

    - -
    -
    -<#macro do_twice>
    -  1. <#nested>
    -  2. <#nested>
    -</#macro>
    -<@do_twice>something</@do_twice>  
    - - -

    Output:

    - -
    -
    -  1. something
    -  2. something
    -   
    - - -

    The nested directive can create loop variables for the - nested content. For example:

    - -
    -
    -<#macro do_thrice>
    -  <#nested 1>
    -  <#nested 2>
    -  <#nested 3>
    -</#macro>
    -<@do_thrice ; x>
    -  ${x} Anything.
    -</@do_thrice>  
    - - -

    This will print:

    - -
    -
    -  1 Anything.
    -  2 Anything.
    -  3 Anything.
    -   
    - - -

    A more complex example:

    - -
    -
    -<#macro repeat count>
    -  <#list 1..count as x>
    -    <#nested x, x/2, x==count>
    -  </#list>
    -</#macro>
    -<@repeat count=4 ; c, halfc, last>
    -  ${c}. ${halfc}<#if last> Last!</#if>
    -</@repeat>  
    - - -

    The output will be:

    - -
    -
    -  1. 0.5
    -  2. 1
    -  3. 1.5
    -  4. 2 Last!
    -   
    - - - - - - - - -

    -return

    - - - - -

    With the return directive, you can leave - a macro or function definition body anywhere. Example:

    - -
    -
    -<#macro test>
    -  Test text
    -  <#return>
    -  Will not be printed.
    -</#macro>
    -<@test/>  
    - - -

    Output:

    - -
    -
    -  Test text
    -    
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_noparse.html b/fmpp/docs/freemarker/ref_directive_noparse.html deleted file mode 100644 index 6c665e3..0000000 --- a/fmpp/docs/freemarker/ref_directive_noparse.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - FreeMarker Manual - noparse - - - - - - - - -
    - - - - - -

    -noparse

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#noparse>
    -  ...
    -</#noparse>
    -
    - - - - - - -

    -Description

    - - -

    FreeMarker will not search FTL tags and interpolations and - other special character sequences in the body of this directive, - except the noparse end-tag.

    - -

    Example:

    - -
    -
    -Example:
    ---------
    -
    -<#noparse>
    -  <#list animals as animal>
    -  <tr><td>${animal.name}<td>${animal.price} Euros
    -  </#list>
    -</#noparse>  
    - - -

    will output:

    - -
    -
    -Example:
    ---------
    -
    -  <#list animals as animal>
    -  <tr><td>${animal.name}<td>${animal.price} Euros
    -  </#list>
    -   
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_nt.html b/fmpp/docs/freemarker/ref_directive_nt.html deleted file mode 100644 index c48342c..0000000 --- a/fmpp/docs/freemarker/ref_directive_nt.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - FreeMarker Manual - nt - - - - - - - - -
    - - - - - -

    -nt

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#nt>
    -
    - - - - - - -

    -Description

    - - -

    ``No Trim''. This directive disables white-space - stripping in the line where it occurs. It also disables the - effect of other trim directives occuring in the same line (the - effect of t, rt, - lt).

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_setting.html b/fmpp/docs/freemarker/ref_directive_setting.html deleted file mode 100644 index 2ea29fa..0000000 --- a/fmpp/docs/freemarker/ref_directive_setting.html +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - - FreeMarker Manual - setting - - - - - - - - -
    - - - - - -

    -setting

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#setting name=value>
    -
    - - -

    Where:

    - -
    -
      -
    • - name: name - of the setting. It is not expression! -
    • - -
    • - value: New - value of the setting. Expression -
    • -
    - - - - - - -

    -Description

    - - -

    Sets a setting for the further part of processing. Settings - are values that influence the behavior of FreeMarker. The new value - will be present only in the template processing where it was set, - and does not touch the template itself. The initial value of - settings is set by the programmer (see: Programmer's Guide/The Configuration/Settings).

    - -

    The supported settings are:

    - -
    -
      -
    • -

      locale: The locale (language) - of the output. It can influence the presentation format of - numbers, dates, etc. The value is a string which consist of a - language code (lowercase two-letter ISO-639 code) plus optional - county code (uppercase two-letter ISO-3166 code) separated from - the language code with underscore, and if we have specified the - country then an optional variant code (not standardized) - separated from the country with underscore. Examples of valid - values: en, en_US, - en_US_MAC. FreeMarker will try to use the - most specific available locale, so if you specify - en_US_MAC but that is not known, then it will - try en_US, and then en, - and then the default locale of the computer (which is may set by - the programmer).

      -
    • - -
    • -

      number_format: The number - format that is used to convert numbers to strings when no - explicit format is specified. Can be one of predefined values - number (the default), - computer, currency, or - percent. Additionally, arbitrary format - pattern written in Java - decimal number format syntax can also be specified. More - information about format patterns:string - built-in.

      -
    • - -
    • -

      boolean_format: The - comma-separated pair of strings for representing true and false - values respectively that is used to convert booleans to strings - when no explicit format is specified. Default value is - "true,false". See also:string - built-in.

      -
    • - -
    • -

      date_format, - time_format, - datetime_format: The format used to convert - date/time/date-time values (Java - java.util.Date-s and its subclasses) to - strings when no explicit format is specified via the string - built-in (or otherwise), as in the case of - ${someDate}. The - date_format setting only effects the - formatting of date values that store no time part, - time_format only effects the formatting of - times that store no date part, and - datetime_format only effects formatting of - date-time values. These settings also effects what format do - ?time, - ?date, and - ?datetime expect when it's applied on - a string value.

      - -

      The possible setting values are (the quotation marks - aren't part of the value itself):

      - -
      -
        -
      • -

        Patterns accepted - by Java's SimpleDateFormat, for - example "dd.MM.yyyy HH:mm:ss" (where - "HH" means 0-23 hours) or - "MM/dd/yyyy hh:mm:ss a" (where - "a" prints AM or PM, if the current - language is English).

        -
      • - -
      • -

        "xs" for XML Schema format, or - "iso" for ISO 8601:2004 format. These - formats allow various additional options, separated with - space, like in "iso m nz" (or with - _, like in "iso_m_nz"; - this is useful in a case like - lastModified?string.iso_m_nz). The - options and their meanings are:

        - -
        -
          -
        • -

          Accuracy options:

          - -
          -
            -
          • - ms: Milliseconds, always - shown with all 3 digits, even if it's all 0-s. - Example: 13:45:05.800 -
          • - -
          • - s: Seconds (fraction - seconds are dropped even if non-0), like - 13:45:05 -
          • - -
          • - m: Minutes, like - 13:45. This isn't allowed for - "xs". -
          • - -
          • - h: Hours, like - 13. This isn't allowed for - "xs". -
          • - -
          • - Neither: Up to millisecond accuracy, but - trailing millisecond 0-s are removed, also the whole - milliseconds part if it would be 0 otherwise. - Example: 13:45:05.8 -
          • -
          - -
        • - -
        • -

          Time zone offset visibility options:

          - -
          -
            -
          • - fz: "Force - Zone", always show time zone offset (even for - for java.sql.Date and - java.sql.Time values). But, - because ISO 8601 doesn't allow for dates (means date - without time of the day) to show the zone offset, - this option will have no effect in the case of - "iso" with dates. -
          • - -
          • - nz: "No Zone", - never show time zone offset -
          • - -
          • - Neither: Always show time zone offset, except - for java.sql.Date and - java.sql.Time, and for - "iso" date values. -
          • -
          - -
        • - -
        • -

          Time zone options:

          - -
          -
            -
          • - u: Use UTC instead of what - the time_zone setting suggests. - However, java.sql.Date and - java.sql.Time aren't affected by - this (see - sql_date_and_time_time_zone to - understand why) -
          • - -
          • - fu: "Force - UTC", that is, use UTC instead of what the - time_zone or the - sql_date_and_time_time_zone - setting suggests. This also effects - java.sql.Date and - java.sql.Time values -
          • - -
          • - Neither: Use the time zone suggested by the - time_zone or the - sql_date_and_time_time_zone - configuration setting -
          • -
          - -
        • -
        - - -

        Options from the same category are mutually exclusive, - like using m and s - together is an error.

        - -

        The options can be specified in any order.

        - -

        The accuracy and time zone offset visibility options - don't influence parsing, only formatting. For example, even - if you use "iso m nz", - "2012-01-01T15:30:05.125+01" will be - parsed successfully and with milliseconds accuracy. The time - zone options (like "u") influence what - time zone is chosen only when parsing a string that doesn't - contain time zone offset.

        - -

        Parsing with "iso" understands both - "extend format" and "basic - format", like 20141225T235018. It - doesn't, however, support the parsing of all kind of ISO - 8601 strings: if there's a date part, it must use year, - month and day of the month values (not week of the year), - and the day can't be omitted.

        - -

        The output of "iso" is deliberately - so that it's also a good representation of the value with - XML Schema format, except for 0 and negative years, where - it's impossible. Also note that the time zone offset is - omitted for date values in the "iso" - format, while it's preserved for the "xs" - format.

        -
      • - -
      • -

        "short", - "medium", "long", or - "full", which has locale-dependent - meaning defined by the Java platform (see in the documentation - of java.text.DateFormat). For - date-time values, you can specify the length of the date and - time part independently, be separating them with - _, like - "short_medium". - ("medium" means - "medium_medium" for date-time - values.)

        -
      • -
      - -
    • - -
    • -

      time_zone: The name of the time - zone used to format times for display. By default, the default - time zone of the JVM is used. Can be any value that is accepted - by Java - TimeZone API, or "JVM default" (since - FreeMarker 2.3.21) to use the JVM default time zone. Examples: - "GMT", "GMT+2", - "GMT-1:30", "CET", - "PST", - "America/Los_Angeles".

      - -
      -

      Warning!

      - -

      If you change this setting from its default value, you - should certainly also set - sql_date_and_time_time_zone to "JVM - default". See more in the Java - API documentation of - Configurable.setSQLDateAndTimeTimeZone(TimeZone).

      -
      - -
    • - -
    • -

      sql_date_and_time_time_zone - (since FreeMarker 2.3.21): This handles a highly technical - issue, so it should usually be set from the Java code by the - programmers. For programmers: If - this is set to non-null, for date-only and - time-only values coming from SQL database (more precisely, for - java.sql.Date and - java.sql.Time objects) FreeMarker will use - this time zone instead of the time zone specified by the - time_zone FreeMarker setting. See more in the - Java API documentation of - Configurable.setSQLDateAndTimeTimeZone(TimeZone).

      -
    • - -
    • -

      url_escaping_charset: The - charset used for URL escaping (e.g. for - ${foo?url}) to calculate the escaped - (%XX) parts. - Usually the framework that encloses FreeMarker should set it, so - you hardly ever should set this setting in templates. (Programmers can read more about this - here...)

      -
    • - -
    • -

      output_encoding: Tells - FreeMarker what the charset of the output is. As FreeMarker - outputs a stream of UNICODE characters (it writes into a - java.io.Writer), it's not affected - by the output encoding, but some macros/functions and built-ins - may want to used this information.

      -
    • - -
    • -

      classic_compatible: This is for - experts. Its value should be a boolean. See the documentation of - freemarker.template.Configurable for more - information.

      -
    • -
    - - -

    Example: Assume that the initial locale of template is de_DE - (German). Then this:

    - -
    -
    -${1.2}
    -<#setting locale="en_US">
    -${1.2}  
    - - -

    will output this:

    - -
    -
    -1,2
    -1.2  
    - - -

    because German people use the comma as their decimal - separator, while US people use the dot.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_stop.html b/fmpp/docs/freemarker/ref_directive_stop.html deleted file mode 100644 index 805541b..0000000 --- a/fmpp/docs/freemarker/ref_directive_stop.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - FreeMarker Manual - stop - - - - - - - - -
    - - - - - -

    -stop

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#stop>
    -or
    -<#stop reason>
    -
    - - -

    Where:

    - -
    -
      -
    • - reason: - Informative message about the reason of termination. Expression - evaluates to string. -
    • -
    - - - - - - -

    -Description

    - - -

    Aborts the processing of template. This is something like an - emergency brake: don't use it in normal situations. Aborting happens by throwing a - StopException, and the - StopException will hold the value of reason - parameter.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_switch.html b/fmpp/docs/freemarker/ref_directive_switch.html deleted file mode 100644 index f4b82fa..0000000 --- a/fmpp/docs/freemarker/ref_directive_switch.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - FreeMarker Manual - switch, case, default, break - - - - - - - - -
    - - - - - -

    -switch, case, default, break

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#switch value>
    -  <#case refValue1>
    -    ...
    -    <#break>
    -  <#case refValue2>
    -    ...
    -    <#break>
    -  ...
    -  <#case refValueN>
    -    ...
    -    <#break>
    -  <#default>
    -    ...
    -</#switch>
    -
    -
    - - -

    Where:

    - -
    -
      -
    • - value, - refValue1, etc.: - Expressions evaluates to scalars of the same type. -
    • -
    - - - - - - -

    -Description

    - - -

    The usage of this directive is not recommended, as it is - error-prone because of the fall-through behavior. Use elseif-s - instead unless you want to exploit the fall-through behavior.

    - -

    Switch is used to choose a fragment of template depending on - the value of an expression:

    - -
    -
    -<#switch animal.size>
    -  <#case "small">
    -     This will be processed if it is small
    -     <#break>
    -  <#case "medium">
    -     This will be processed if it is medium
    -     <#break>
    -  <#case "large">
    -     This will be processed if it is large
    -     <#break>
    -  <#default>
    -     This will be processed if it is neither
    -</#switch>  
    - - -

    Inside the switch must be one or more - <#case value>, - and after all such case tags optionally one - <#default>. When FM reaches the - switch directive, it chooses a - case directive where - refValue equals with - value and continues - the processing of the template there. If there is no - case directive with appropriate value then it - continues processing at the default directive if - that exists, otherwise it continues the processing after the end-tag - of switch. And now comes the confusing thing: - when it has chosen a case directive, it will - continue the processing there, and will go ahead until it reaches a - break directive. That is, it will not - automatically leave the switch directive when it - reaches another case directive or the - <#default> tag. Example:

    - -
    -
    -<#switch x>
    -  <#case 1>
    -    1
    -  <#case 2>
    -    2
    -  <#default>
    -    d
    -</#switch>  
    - - -

    If x is 1, then it will print 1 2 d; if - x is 2 then it will print 2 d; if - x is 3 then it will print d. This is the - mentioned fall-through behavior. The break tag - instructs FM to immediately skip past the switch - end-tag.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_t.html b/fmpp/docs/freemarker/ref_directive_t.html deleted file mode 100644 index 9d4bf04..0000000 --- a/fmpp/docs/freemarker/ref_directive_t.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - FreeMarker Manual - t, lt, rt - - - - - - - - -
    - - - - - -

    -t, lt, rt

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<#t>
    -
    -<#lt>
    -
    -<#rt>
    - - - - - - -

    -Description

    - - -

    These directives, instruct FreeMarker to ignore certain - white-space in the line of the tag:

    - -
    -
      -
    • -

      t (for trim): Ignore all leading and - trailing white-space in this line.

      -
    • - -
    • -

      lt (for left trim): Ignore all leading - white-space in this line.

      -
    • - -
    • -

      rt (for right trim): Ignore all - trailing white-space in this line.

      -
    • -
    - - -

    where:

    - -
    -
      -
    • -

      ``leading white-space'' means all space and tab (and other - character that are white-space according to UNICODE, except line breaks) before the first - non-white-space character of the line.

      -
    • - -
    • -

      ``trailing white-space'' means all space and tab (and - other character that are white-space according to UNICODE, except line breaks) - after the last non-white-space character of the line, - and the line break at the end of the - line.

      -
    • -
    - - -

    It is important to understand that these directives examine - the template itself, and not the output what - the template generates when you merge it with the data-model. - (That is, the white-space removal - happens on parse time.)

    - -

    For example this:

    - -
    -
    ---
    -  1 <#t>
    -  2<#t>
    -  3<#lt>
    -  4
    -  5<#rt>
    -  6
    ---  
    - - -

    will output this:

    - -
    -
    ---
    -1 23
    -  4
    -  5  6
    ---  
    - - -

    The placement of these directives inside the line has no - importance. That is, the effect will be the same regardless if you - put the directive at the beginning of the line, or at the end of the - line, or in the middle of the line.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_userDefined.html b/fmpp/docs/freemarker/ref_directive_userDefined.html deleted file mode 100644 index e2b23ee..0000000 --- a/fmpp/docs/freemarker/ref_directive_userDefined.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - FreeMarker Manual - User-defined directive (<@...>) - - - - - - - - -
    - - - - - -

    -User-defined directive (<@...>)

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    -<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/>
    -(Note the XML-style / before the >)  
    -or if you need loop variables (more details...)
    -<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN ; lv1, lv2, ..., lvN/>
    -
    -Or the same as the above two but with end-tag (more details...):
    -
    -<@user_def_dir_exp ...>
    -  ...
    -</@user_def_dir_exp>
    -or
    -<@user_def_dir_exp ...>
    -  ...
    -</@>
    -
    -Or all above but with positional parameter passing (more details...):
    -
    -<@user val1, val2, ..., valN/>
    -...etc.
    -
    - - -

    Where:

    - -
    -
      -
    • - user_def_dir_exp: - Expression evaluates to an user-defined directive (for example a - macro), that will be called. -
    • - -
    • - param1, - param2, ...etc.: - The name of parameters. They are not - expressions. -
    • - -
    • - val1, - val2, ...etc.: The - value of parameters. They are - expressions. -
    • - -
    • - lv1, - lv2, ...etc.: The - name of loop variables. - They are not expressions. -
    • -
    - - -

    The number of parameters can be 0 (i.e. no parameters).

    - -

    The order of parameters is not significant (unless you use - positional parameter passing). The name of parameters must be - unique. Lower- and uppercase letters are considered as different - letters in parameter names (i.e. Color and - color is not the same).

    - - - - - -

    -Description

    - - -

    This will call an user-defined directive, for example a macro. - The meaning of parameters, and the set of supported and required - parameters depend on the concrete user-defined directive.

    - -

    You may read the tutorial - about user-defined directives.

    - -

    Example 1: Calls the directive that is stored in the variable - html_escape:

    - -
    -
    -<@html_escape>
    -  a < b
    -  Romeo & Juliet
    -</@html_escape>  
    - - -

    Output:

    - -
    -
    -  a &lt; b
    -  Romeo &amp; Juliet  
    - - -

    Example 2: Calls a macro with parameters:

    - -
    -
    -<@list items=["mouse", "elephant", "python"] title="Animals"/>
    -...
    -<#macro list title items>
    -  <p>${title?cap_first}:
    -  <ul>
    -    <#list items as x>
    -      <li>${x?cap_first}
    -    </#list>
    -  </ul>
    -</#macro>  
    - - -

    Output:

    - -
    -
    -  <p>Animals:
    -  <ul>
    -      <li>Mouse
    -      <li>Elephant
    -      <li>Python
    -  </ul>
    -  
    -...  
    - - - - - - - -

    -End-tag

    - - -

    You can omit the - user_def_dir_exp in - the end-tag. That is, you can - always write </@> instead of - </@anything>. - This rule is mostly useful when the - user_def_dir_exp - expression is too complex, because you don't have to repeat the - expression in the end-tag. Furthermore, if the expression contains - other than simple variable names and dots, you are not allowed to - repeat the expression. For example, - <@a_hash[a_method()]>...</@a_hash[a_method()]> - is an error; you must write - <@a_hash[a_method()]>...</@>. - But - <@a_hash.foo>...</@a_hash.foo> - is OK.

    - - - - - - - -

    -Loop variables

    - - -

    Some user-defined directives create loop variables - (similarly to list directive). As with the - predefined directives (as list) the - name of loop variables is given when you call - the directive (as foo in <#list - foos as - foo>...</#list>), - while the value of the variable is set by the - directive itself. In the case of user-defined directives the - syntax is that the name of loop variables is given after a - semicolon. For example:

    - -
    -
    -<@myRepeatMacro count=4 ; x, last>
    -  ${x}. Something... <#if last> This was the last!</#if>
    -</@myRepeatMacro>  
    - - -

    Note that the number of loop variable created by the - user-defined directive and the number of loop variables specified - after the semicolon need not match. Say, if you are not interested - if the repetition is the last, you can simply write:

    - -
    -
    -<@myRepeatMacro count=4 ; x>
    -  ${x}. Something...
    -</@myRepeatMacro>  
    - - -

    or you can even:

    - -
    -
    -<@myRepeatMacro count=4>
    -  Something...
    -</@myRepeatMacro>  
    - - -

    Furthermore, it does not cause error if you specify more - loop variables after the semicolon than the user-defined directive - creates, just the last few loop variables will not be created - (i.e. those will be undefined in the nested content). Trying to - use the undefined loop variables, however, will cause error - (unless you use built-ins like ?default), since - you try to access a non-existing variable.

    - -

    See the the tutorial - about user-defined directives for more explanation.

    - - - - - - - -

    -Positional parameter passing

    - - - - -

    Positional parameter passing (as <@heading - "Preface", 1/>) is a shorthand form of normal named - parameter passing (as <@heading title="Preface" - level=1/>), where you omit the parameter name. This - shorthand form should be used if a user-defined directive has only - one parameter, or if it is easy to remember the order of - parameters for a frequently used user-defined directive. To use - this form, you have to know the order in which the named - parameters are declared (trivial if the directive has only one - parameter). Say, if heading was created as - <#macro heading title - level>..., then - <@heading "Preface", 1/> is equivalent - with <@heading title="Preface" level=1/> - (or <@heading level=1 title="Preface"/>; - if you use parameter names, the order is not important). Note that - positional parameter passing is currently only supported for - macros.

    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directive_visit.html b/fmpp/docs/freemarker/ref_directive_visit.html deleted file mode 100644 index 04caa7a..0000000 --- a/fmpp/docs/freemarker/ref_directive_visit.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - - - - - FreeMarker Manual - visit, recurse, fallback - - - - - - - - -
    - - - - - -

    -visit, recurse, fallback

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Synopsis

    - - -
    <#visit node using namespace>
    -or
    -<#visit node>
    - - -
    <#recurse node using namespace>
    -or
    -<#recurse node>
    -or
    -<#recurse using namespace>
    -or
    -<#recurse>
    - - -
    <#fallback>
    - - -

    Where:

    - -
    -
      -
    • - node: - Expression evaluates to a node - variable. -
    • - -
    • - namespace: A - namespace, or a - sequence of namespaces. A namespace can be given with the - namespace hash (a.k.a. gate hash), or with a string literal that - store the path of template that could be imported. Instead of - namespace hashes, you can use plain hashes as well. -
    • -
    - - - - - - -

    -Description

    - - -

    The visit and recurse - directives are used for the recursive processing of trees. In - practice, this will mostly be used for processing XML.

    - - - - - - -

    -Visit

    - - -

    When you call <#visit - node>, it looks for a - user-defined directive (like a macro) to invoke that has the name - deducted from the node's name - (node?node_name) and - namespace - (node?node_namesoace). - The rules of name deduction:

    - -
    -
      -
    • -

      If the node doesn't support node namespaces (as text - nodes in XML), then the directive name is simply the name of - the node - (node?node_name). - A node does not support node - namespaces if the getNodeNamespace method - returns null.

      -
    • - -
    • -

      If the node does support node namespaces (as element - nodes in XML), then a prefix deduced from the node namespace - maybe appended before the node name with a colon used as - separator (e.g. e:book). The prefix, and if - there is a prefix used at all, depends on what prefixes has - been registered with the ns_prefixes - parameter of the ftl directive in the FTL namespace where - visit looks for the handler directive - (which is not necessary the same as the FTL namespace where - visit was called from, as you will see - later). Concretely, if there was no default namespace - registered with ns_prefixes then for nodes - that does not belong to any namespace (when getNodeNamespace - returns "") no prefix is used. If - there was a default namespace registered with - ns_prefixes then for nodes that does not - belong to any namespace prefix N is used, - and for nodes that belong to the default node namespace no - prefix is used. Otherwise, in both case, the prefix associated - to the node namespace with the ns_prefixes - is used. If there is not prefix associated to the node - namespace of the node, then visit simply - behave as if there was no directive found with the proper - name.

      -
    • -
    - - -

    The node for which the user-defined directive was invoked is - available for it as special variable .node. - Example:

    - -
    -
    -<#-- Assume that nodeWithNameX?node_name is "x" -->
    -<#visit nodeWithNameX>
    -Done.
    -<#macro x>
    -   Now I'm handling a node that has the name "x".
    -   Just to show how to access this node: this node has ${.node?children?size} children.
    -</#macro>  
    - - -

    The output will be something like:

    - -
    -
    -   Now I'm handling a node that has the name "x".
    -   Just to show how to access this node: this node has 3 children.
    -Done.  
    - - -

    If one or more namespaces is specified using the optional - using clause, then visit - will look for the directives in those namespaces only, with the - earlier specified namespaces in the list getting priority. If no - using clause is specified, the namespace or - sequence of namespaces specified with the using - clause of the last uncompleted visit call is - reused. If there is no such pending visit call, - then the current namespace is used. For example, if you execute - this template:

    - -
    -
    -<#import "n1.ftl" as n1>
    -<#import "n2.ftl" as n2>
    -
    -<#-- This will call n2.x (because there is no n1.x): -->
    -<#visit nodeWithNameX using [n1, n2]>
    -
    -<#-- This will call the x of the current namespace: -->
    -<#visit nodeWithNameX>
    -
    -<#macro x>
    -  Simply x
    -</#macro>  
    - - -

    and this is n1.ftl:

    - -
    -
    -<#macro y>
    -  n1.y
    -</#macro>  
    - - -

    and this is n2.ftl:

    - -
    -
    -<#macro x>
    -  n2.x
    -  <#-- This callc n1.y as it inherits the "using [n1, n2]" from the pending visit call: -->
    -  <#visit nodeWithNameY>
    -  <#-- This will call n2.y: -->
    -  <#visit nodeWithNameY using .namespace>
    -</#macro>
    -
    -<#macro y>
    -  n2.y
    -</#macro>  
    - - -

    then this will print:

    - -
    -
    -
    -  n2.x
    -  n1.y
    -  n2.y
    -
    -  Simply x
    -   
    - - -

    If visit doesn't find a user-defined - directive in either FTL namespaces with the name identical to the - name deduced with the rules described earlier, then it tries to - find an user-defined directive with name - @node_type, or if - the node does not support node type property (i.e. - node?node_type - returns undefined variable), then with name - @default. For the lookup, it uses the same - mechanism as was explained earlier. If it still doesn't find an - user-defined directive to handle the node, then - visit stops template processing with error. - Some XML specific node types have special handling in this regard; - see: XML Processing Guide/Declarative XML processing/Details. Example:

    - -
    -
    -<#-- Assume that nodeWithNameX?node_name is "x" -->
    -<#visit nodeWithNameX>
    -
    -<#-- Assume that nodeWithNameY?node_type is "foo" -->
    -<#visit nodeWithNameY>
    -
    -<#macro x>
    -Handling node x
    -</#macro>
    -
    -<#macro @foo>
    -There was no specific handler for node ${node?node_name}
    -</#macro>  
    - - -

    This would print:

    - -
    -
    -Handling node x
    -  
    -There was no specific handler for node y
    -
    -   
    - - - - - - - - -

    -Recurse

    - - - - -

    The <#recurse> directive is really - syntactic sugar. It visits all children nodes of the node (and not - the node itself). So, to write:

    - -
    -
    -<#recurse someNode using someLib 
    - - -

    is equivalent to writing:

    - -
    -
    -<#list someNode?children as child><#visit child using someLib></#list>  
    - - -

    However, target node is optional in the - recurse directive. If the target node is - unspecified, it simply uses the .node. Thus, - the terse instruction <#recurse> is - equivalent to:

    - -
    -
    -<#list .node?children as child><#visit child></#list>  
    - - -

    As a side comment for those who are familiar with XSLT, - <#recurse> is pretty much exactly - analogous to the <xsl:apply-templates/> - instruction in XSLT.

    - - - - - - - -

    -Fallback

    - - - - -

    As you could learn earlier, in the documentation of the - visit directive, the user-defined directive - that handles the node is maybe searched in multiple FTL - name-spaces. The fallback directive can be used - in a user-defined directive that was invoked to handle a node. It - directs FreeMarker to continue the searching for the user-defined - directive in the further name-spaces (that is, in the name-spaces - that are after the name-space of the currently invoked - user-defined directive in the list of name-spaces). If a handler - for the node is found then it is invoked, otherwise - fallback does nothing.

    - -

    A typical usage of this to write customization layer over a - handler library, that sometimes passes the handling to the - customized library:

    - -
    -
    -<#import "/lib/docbook.ftl" as docbook>
    -
    -<#--
    -  We use the docbook library, but we override some handlers
    -  in this namespace.
    --->
    -<#visit document using [.namespace, docbook]>
    -
    -<#--
    -  Override the "programlisting" handler, but only in the case if
    -  its "role" attribute is "java"
    --->
    -<#macro programlisting>
    -  <#if .node.@role[0]!"" == "java">
    -    <#-- Do something special here... -->
    -    ...
    -  <#else>
    -    <#-- Just use the original (overidden) handler -->
    -    <#fallback>
    -  </#if>
    -</#macro>  
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_directives.html b/fmpp/docs/freemarker/ref_directives.html deleted file mode 100644 index ff23665..0000000 --- a/fmpp/docs/freemarker/ref_directives.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - FreeMarker Manual - Directive Reference - - - - - - - - -
    - - - - - -

    -Chapter 2   Directive Reference

    - -
    -

    - - Chapter Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_reservednames.html b/fmpp/docs/freemarker/ref_reservednames.html deleted file mode 100644 index e2b7633..0000000 --- a/fmpp/docs/freemarker/ref_reservednames.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - FreeMarker Manual - Reserved names in FTL - - - - - - - - -
    - - - - - -

    -Chapter 4   Reserved names in FTL

    - - -

    The following names cannot be used for top-level variables without - square-bracket syntax (as .vars["in"]), since they - are keywords in FTL:

    -
      -
    • - true: boolean value ``true'' -
    • - -
    • - false: boolean value ``false'' -
    • - -
    • - gt: comparison operator ``greater - than'' -
    • - -
    • - gte: comparison operator ``greater than or - equivalent'' -
    • - -
    • - lt: comparison operator ``less - than'' -
    • - -
    • - lte: comparison operator ``less than or - equivalent'' -
    • - -
    • - as: used by a few directives -
    • - -
    • - in: used by a few directives -
    • - -
    • - using: used by a few directives -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/ref_specvar.html b/fmpp/docs/freemarker/ref_specvar.html deleted file mode 100644 index f6aa831..0000000 --- a/fmpp/docs/freemarker/ref_specvar.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - FreeMarker Manual - Special Variable Reference - - - - - - - - -
    - - - - - -

    -Chapter 3   Special Variable Reference

    - - -

    Special variables are variables defined by the FreeMarker engine - itself. To access them, you use the - .variable_name syntax. For - example, you can't write simply version; you have to - write .version.

    The supported special variables are:

    -
      -
    • - data_model: A hash that you can use to - access the data-model directly. That is, variables you did with - global directive are not visible here. -
    • - -
    • - error (available since FreeMarker - 2.3.1): This variable accessible in the body of the recover - directive, where it stores the error message of the error we - recover from. -
    • - -
    • - globals: A hash that you can use to access - the globally accessible variables: the data-model and the variables - created with global directive. Note that - variables created with assign or - macro are not globals, thus they never hide the - variables when you use globals. -
    • - -
    • - lang: Returns the language part of - the current value of the locale setting. For example if - .locale is en_US, then - .lang is en. -
    • - -
    • - locale: Returns the current value - of the locale setting. This is a string, for example - en_US. For more information about locale strings - see the - setting directive. -
    • - -
    • - locale_object (available since - FreeMarker 2.3.21): Returns the current value of the locale setting - as a java.util.Locale object, rather than as a - string. This meant to be used instead of .locale - when you want to pass it as a java.util.Locale - object to a Java method. (The Locale object will - be wrapped according the object_wrapper setting - value. Whether you can actually pass this value to a Java methods as - a Locale object depends on the object wrapper, - but an object wrapper that let you call Java methods directly is - very unlikely to not support that.) -
    • - -
    • - locals: A hash that you can use to access - the local variables (the variables created with the - local directive, and the parameters of - macro). -
    • - -
    • - main: A hash that you can use to access the - main namespace. Note that - global variables like the variables of data-model are - not visible through this hash. -
    • - -
    • - namespace: A hash that you can use to - access the current namespace. Note that global - variables like the variables of data-model are - not visible through this hash. -
    • - -
    • - node (alias current_node - for historical reasons): The node you are currently processing with - the visitor pattern (i.e. with the visit, - recurse, ...etc. directives). Also, it - initially stores the root node when you use the FreeMarker XML Ant task. -
    • - -
    • - now: Returns the current date-time. - Usage examples: "Page generated: ${.now}", - "Today is ${.now?date}", "The current - time is ${.now?time}". -
    • - -
    • - output_encoding (available since - FreeMarker 2.3.1): Returns the name of the current output charset. - This special variable is not existent if the framework that - encapsulates FreeMarker doesn't specify the output charset for - FreeMarker. (Programmers can read more - about charset issues here...) -
    • - -
    • - template_name: The name of the current - template (available since FreeMarker 2.3.14). -
    • - -
    • - url_escaping_charset (available - since FreeMarker 2.3.1): If exists, it stores the name of the - charset that should be used for URL escaping. If this variable - doesn't exist that means that nobody has specified what charset - should be used for URL encoding yet. In this case the url built-in - uses the charset specified by the output_encoding - special variable for URL encoding; custom mechanism may follow the - same logic. (Programmers can read more - about charset issues here...) -
    • - -
    • - vars: Expression - .vars.foo returns the same variable as expression - foo. It's useful if for some reasons you have to - use square bracket syntax, since that works only for hash - subvariables, so you need an artificial parent hash. For example, to - read a top-level variable that has a strange name that would confuse - FreeMarker, you can write - .vars["A strange name!"]. Or, to access a - top-level variable with dynamic name given with variable - varName you can write - .vars[varName]. Note that the hash returned by - .vars does not support ?keys - and ?values. -
    • - -
    • - version: Returns the FreeMarker - version number as string, for example 2.2.8. This - can be used to check which FreeMarker version does your application - use, but note that this special variable does not exist prior to the - 2.3.0 or 2.2.8 versions. The version number of non-final releases - contains dash and further info after the numbers, like in - 2.3.21-nightly_20140726T151800Z. -
    • -
    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_0.html b/fmpp/docs/freemarker/versions_2_0.html deleted file mode 100644 index 716956c..0000000 --- a/fmpp/docs/freemarker/versions_2_0.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.0 - - - - - - - - -
    - - - - - -

    -2.0

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    FreeMarker 2.0 final was released on 18 April 2002. The changes - with respect to the previous release, 2.0 RC3 are fairly minor.

    - - - - -

    -Bugfixes

    - - -
    -
      -
    • -

      There were a couple of bugs in handling null values, where - Lazarus did not do the same thing as FreeMarker Classic. - Traditionally, in FreeMarker, nulls were treated as being - equivalent to an empty string in the appropriate context. At - this point, to the best of our knowledge, there is backward - compatibility with FreeMarker Classic in this respect.

      -
    • - -
    • -

      Literal strings can now include line breaks. This was a - backward compatibility issue with FreeMarker Classic that has - been fixed.

      -
    • -
    - - - - - - -

    -Changes to the Template language

    - - -
    -
      -
    • -

      You can use the extra built-in of - myString?web_safe to convert a string to its - "web-safe" equivalent, where problematic characters such as - '<' are converted to &lt;.

      -
    • - -
    • -

      In displaying numbers with a fractional part, the - rendering apparatus now respects the decimal separator of the - template's locale, so that, for example, in continental Europe, - you would see 1,1 and in the U.S. locale, 1.1.

      -
    • -
    - - - - - - -

    -Changes to the API

    - - -
    -
      -
    • -

      The getAsString() method in the - TemplateScalarModel interface now takes a - java.util.Locale as a parameter. For the most - part, this is a hook for later use. In the default - implementation, SimpleScalar, this parameter - is unused. If you are implementing this interface yourself, your - implementation may ignore the parameter. However, it will be - appealing for certain implementations.

      -
    • - -
    • -

      The constructors of FileTemplateCache - have changed. If you are using an absolute directory on the file - system as the location of your templates, you need to pass in an - instance of java.io.File to indicate the - location. If you use the constructors that take a string, this - is taken to mean relative to the classloader classpath.

      -
    • -
    - - - - - - -

    -Miscellany

    - - -

    The ant build script build.xml now contains a target that - builds a .war file containing the Hello, World and Guestbook - examples. It builds a fmexamples.war. For example, if you are using - Tomcat in its out-of-the-box configuration, you would place this - under <TOMCAT_HOME>/webapps and then you would use - http://localhost:8080/fmexamples/servlet/hello and - http://localhost:8080/fmexamples/servlet/guestbook for the Hello, - World and Guestbook examples respectively.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_01.html b/fmpp/docs/freemarker/versions_2_01.html deleted file mode 100644 index 79425f0..0000000 --- a/fmpp/docs/freemarker/versions_2_01.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.01 - - - - - - - - -
    - - - - - -

    -2.01

    - - -

    The main improvement is in error reporting. Now exceptions are - much more informative since they come with complete line number and - column information.

    The only API change between 2.0 and 2.01 was the elimination of - the CacheListener/CacheEvent API. Now, if the updating of a template - file fails, the exception is thrown back to the caller to handle. If - you want logging to occur when a template file is updated - successfully, you can override the logFileUpdate() method in - FileTemplateCache.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_0RC1.html b/fmpp/docs/freemarker/versions_2_0RC1.html deleted file mode 100644 index f52d69e..0000000 --- a/fmpp/docs/freemarker/versions_2_0RC1.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.0 RC1 - - - - - - - - -
    - - - - - -

    -2.0 RC1

    - - - - -

    The first public release of FreeMarker 2.0 was on 18 March 2002. - Here is a summary of the changes in the Lazarus release, with respect - to the last stable release of FreeMarker Classic.

    NOTA BENE:

    Despite the changes delineated above, the Lazarus release is - almost entirely backward-compatible with FreeMarker Classic. We - believe that most existing code and templates - that work under FreeMarker Classic will continue working under - Lazarus, with at most minimal changes. In practice, the most common - cases where legacy template code is broken will be where assumptions - were made about numbers and strings being equivalent. Note that in - FreeMarker 2, 2 + 2 does not result in "22". The String "1" and the - number 1 are entirely different animals and thus, any code will be - broken if it relies on the boolean expression ("1"==1) being true. - There is a "classic compatibility mode" that can be set via: - Template.setClassCompatibility() that can be set so - that Lazarus emulates some of the quirky behavior of FreeMarker - Classic. However, any code that relied on the above "features" of - FreeMarker classic really should be reworked. You are less likely to - run into the other incompatibilities that are listed above. If you - come across any other anomalies, please do tell us about them.

    - - - - -

    -Support for Numerical operations, both arithmetic and - boolean, as well as numerical ranges.

    - - -
    -
      -
    • -

      Scalars can now be either strings or numbers. (In - FreeMarker Classic all scalars were strings.) The basic - operations allowed are addition, subtraction, multiplication, - division, and modulus using the +, - -, *, - /, and % operators - respectively. Arbitrary-precision arithmetic with integers and - floating point numbers are provided. Though our goal is - definitely to follow the principle of least surprise, for - backward compatibility, the + operator still - is used for string concatenation. If either the left hand side - or the right hand side of lhs + rhs is - non-numerical, we revert to interpreting this as string - concatenation. Thus, in FreeMarker 2, 2+2 evaluates to the - number 4, while any of "2"+2 or 2+"2" or "2"+"2" evaluate to the - string "22". In FreeMarker Classic, rather embarrassingly, all - of the above, including 2+2, evaluated to the string "22". An - attempt to use any other arithmetic operator besides the - + with non-numerical operands will cause an - exception to be thrown.

      -
    • - -
    • -

      Output of a numerical expression can be made explicit via - the alternative #{....} syntax. If the - expression within the curly parentheses does not evaluate to a - numerical value, an exception is thrown. The older ${....} - syntax can evaluate to either a number or a string. In general, - if, for logical reasons, the output must be - numerical, it is preferable to use the #{...} syntax, since it - adds an extra sanity check. Note that if, by some miracle, the - character sequence "#{" occurs in your template, you will have - to use a workaround to prevent problems. (The <noparse> - directive is one possibility.)

      -
    • - -
    • -

      In this release, there is a facility for specifying the - number of digits to show after the decimal point. The following - code specifies to show at least 3 digits after the decimal point - but not more than 6. This is optional. This option is only - available if you use the #{...} syntax.

      - -
      -
      -#{foo + bar ; m3M6}    
      - - -

      (Note that the above is something of a stopgap measure. - Future releases will move toward supporting fully - internationalization and localization of number and currency - formatting.

      -
    • - -
    • -

      Numerical expressions can be used in boolean expressions - via the comparison operators: lt, - gt, lte, and - gte. In the web space, where FreeMarker is - most used in practice, using the more natural operators such as - < and > would tend to confuse HTML-oriented editors. An - attempt to compare non-numerical expressions using these - operators leads to a TemplateException being - thrown. If, by some coincidence, you have variables named "lt", - "gt", "lte", or "gte", you will have to change their names, - since they are now keywords in the language.

      -
    • - -
    • -

      Numerical ranges are supported.

      - -
      -
      -<#list 1990..2001 as year>
      -  blah blah in the year ${year} blah
      -</#list>   
      - - -

      The left hand and right hand sides of the - .. operator must be numerical, or an - exception is thrown. They also need not be literal numbers, but - can be more complex expressions that evaluate to a numerical - scalar value. Note that it is also possible to write a range - that descends in value:

      - -
      -
      -<#list 2001..1990 as year>
      -  blah blah in the year ${year} blah blah
      -</#list>    
      - -
    • -
    - - - - - - -

    -API Changes

    - - -
    -
      -
    • -

      The TemplateNumberModel interface and - the SimpleNumber implementation were added to - support exposing numerical values.

      -
    • - -
    • -

      The TemplateListModel API in FreeMarker - Classic had some design problems -- particularly in terms of - supporting thread-safe code. It has been deprecated in favor of - the following API's: TemplateCollectionModel - and TemplateSequenceModel. The - SimpleList class was refactored to implement - the above interfaces (and paradoxically, does not implement the - TemplateListModel interface.) Code that uses the deprecated - TemplateListModel should be - refactored.

      -
    • - -
    • -

      The Expose Package by Attila Szegedi has been made an - integral part of the FreeMarker distribution and is now under - the freemarker.ext.* hierarchy. This package provides advanced - models for representing arbitrary Java objects as template - models, for representing XML documents as template models, as - well as classes to facilitate the integration of FreeMarker with - servlets and Ant.

      -
    • - -
    • -

      In FreeMarker Classic, there were some utility classes - such as freemarker.template.utility.Addition - etcetera that existed as workarounds for the lack of numerical - operations in FreeMarker. Those have been removed and will - probably not be missed.

      -
    • - -
    • -

      In FreeMarker Classic, the SimpleScalar - object was mutable, it had a setValue method. - This was fairly obviously a design mistake. Any code that relied - on this must be refactored. Note that in this release, both - SimpleScalar and the newly introduced - SimpleNumber are both immutable and - final.

      -
    • -
    - - - - - - -

    -Syntactical Miscellany

    - - -
    -
      -
    • -

      The if-elseif-else syntax was introduced. FreeMarker - classic only had if-else. This construct should probably (in the - opinion of the author of this document -- Revusky) be used in - preference to switch-case since the switch-case with - fall-through is a notoriously error-prone construct for most - mortal men.

      -
    • - -
    • -

      You can now do a multiple assignment in one - <assign...> directive. For example: <assign x - = 1, y = price*items, message="foo">

      -
    • - -
    • -

      A scalar will no longer be interpreted as a one-item list - in a <list...> or <#foreach...> block. If you have - code that relied on this feature, there is an easy workaround, - since you can simply define a list literal with exactly one - item.

      - -
      -
      - <assign y=[x]>
      - and then...
      - <list y as item>...</list>   
      - -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_0RC2.html b/fmpp/docs/freemarker/versions_2_0RC2.html deleted file mode 100644 index caca49d..0000000 --- a/fmpp/docs/freemarker/versions_2_0RC2.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.0 RC2 - - - - - - - - -
    - - - - - -

    -2.0 RC2

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    FreeMarker 2.0 RC 2 was released on 4 April 2002. Here is a - summary of changes wrt to the first release.

    - - - - -

    -Changes to Template Language

    - - -
    -
      -
    • -

      Certain built-in functionality is provided via a new - operator, '?'. Thus, myList?size provides the - number of elements in a list. Similarly, - myString?length provides the length of a - string, myString?upper_case puts the string - all in capital letters, and myHash?keys - provides a sequence containing the keys in the hash. See Template Language Reference/Built-in Reference for list of all available - built-ins.

      -
    • - -
    • -

      Numerical comparisons can now be made using the "natural" - operators < and > but there are also "web-safe" - alternatives, such as \lt and - \gt, since the use of these characters may - confuse HTML editors and parsers. Note that these changed - between rc1 and rc2, they now start with a backslash. A little - asymmetry is the fact that if you use the natural greater-than - or greater-than-or-equals operators (i.e. > or >=) the - expression must be in parentheses. With any other operator, the - parentheses are optional.

      -
    • - -
    • -

      Within an iteration loop -- i.e. a - foreach or a list block -- - the current count in the loop is available as the special - variable - index_count. where - index is the name of the variable in - the iteration. A boolean variable called - index_has_next is - also defined that indicates whether there are any more items in - the iteration after this one. Note that the index starts at - zero, so you will often be adding one to it in practice.

      -
    • - -
    • -

      The <#break> directive can now be - used to break out of a <#foreach...> or - a <list...> loop. (Prior to this - version, it only worked within a switch-case block.) There is a - new directive called <#stop> that, when - encountered, simply halts processing of the template. This can - be useful for debugging purposes.

      -
    • - -
    • -

      When invoking java methods that have been exposed to the - page, using the code in freemarker.ext.*, there are built-ins - that allow you to indicate the numerical type that you wish to - pass as the value. For instance, if you had two methods, one - that takes an int and another that takes a long, and you wanted - to pass in a value, you would have to specify which method. - myMethod(1?int) or - myMethod(1?long). This is unnecessary if - there is only one method of the given name.

      -
    • - -
    • -

      Ranges can be used to get the sublist from a list or the - substring of a string. For example: - myList[0..3] will return items 0 through 3 of - the list in question. Or, for example, you could get all the - elements of the list except for the first and last ones via: - myList[1..(myList?size-2)]

      -
    • - -
    • -

      Or we could get the first 6 characters of a string via - myString[0..5]

      -
    • - -
    • -

      Lists can be concatenated using the '+' operator. - Previously, this overloading of '+' only applied to - strings.

      -
    • - -
    • -

      An attempt to compare a number to a string now throws an - exception, since it is indicative of a coding error. Note that - there is a backward compatibility mode that can be set (see - below) that loosens this up in order to be able to process - legacy templates.

      -
    • -
    - - - - - - -

    -API Changes

    - - -
    -
      -
    • -

      The TemplateSequenceModel interface now - has a size() method for getting the number of - elements in the sequence in question.

      -
    • - -
    • -

      The TemplateModelIterator interface now - has a hasNext() method.

      -
    • - -
    • -

      The default sequence and hash implementations, - freemarker.template.SimpleSequence and - freemarker.template.SimpleHash are now - unsynchronized. If you need the methods to be synchronized, you - can get a synchronized wrapper via the - synchronizedWrapper() in either class.

      -
    • - -
    • -

      The freemarker.utility.ExtendedList and - freemarker.utility.ExtendedHash classes were - removed, since all of the extra keys that it defined are now - available using the appropriate '?' built-in operation, i.e. - myHash?keys or myList?size - or myList?last.

      -
    • - -
    • -

      There is a method in - java.freemarker.Configuration named - setDebugMode() which allows you to decide - whether stack traces are simply output to the web client (the - best situation in development) or thrown back to the caller to - be handled more gracefully (the best situation in - production).

      -
    • - -
    • -

      There is a flag that can be set to turn on a processing - mode that is more backward-compatible with FreeMarker Classic. - This is off by default, but you can set it via - Template.setClassicCompatibility(true). What - this does is that it allows scalars to be treated as a - single-item list in a list directive. Also, it allows somewhat - more looseness about types. In FreeMarker 1.x, <#if - x=="1"> and <#if x==1> - were in fact equivalent. This meant that legacy templates might - tend to be slack about this. If classic compatibility is not - set, an attempt to compare the string "1" with the number 1 will - result in an exception being thrown. (Note that it is preferable - to get your templates working without the backward compatibility - flag, since it usually will require only minor changes. However, - for people with a lot of templates and no time to check over - them, this flag may be of use.)

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_0RC3.html b/fmpp/docs/freemarker/versions_2_0RC3.html deleted file mode 100644 index 633649e..0000000 --- a/fmpp/docs/freemarker/versions_2_0RC3.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.0 RC3 - - - - - - - - -
    - - - - - -

    -2.0 RC3

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    FreeMarker 2.0 RC3 was released on 11 April 2002. This release - was primarily devoted to fixing bugs that were reported in RC2.

    - - - - -

    -Bug Fixes

    - - -
    -
      -
    • -

      Variables defined in an <include...> were not - available in the enclosing page. This has been fixed.

      -
    • - -
    • -

      The JavaCC parser was not configured to handle Unicode - input correctly. Now, Unicode support is working.

      -
    • - -
    • -

      There was a bug when comparing a number with null. It - should have returned false, but threw an exception instead. This - has been fixed.

      -
    • -
    - - - - - - -

    -Changes to the Template Language

    - - -
    -
      -
    • -

      The syntax of the include directive has changed. To - indicate an unparsed include file, you do as follows:

      - -
      -
      -<include "included.html" ; parsed="n" >  
      - - -

      You can also indicate the encoding of the included file - this way:

      - -
      -
      - <include "included.html" ; encoding="ISO-8859-5">  
      - -
    • - -
    • -

      The built-in myString?trim was added for trimming the - leading and trailing white-space from strings.

      -
    • -
    - - - - - - -

    -API changes

    - - -
    -
      -
    • -

      The TemplateEventAdapter machinery was taken out. This was - never set up in a very useful manner and we anticipate that - version 2.1 will have more complete support for logging - events.

      -
    • - -
    • -

      The template caching mechanism was streamlined and - simplified.

      -
    • - -
    • -

      The FileTemplateCache can now be configured to load files - relative to a class loader, using the Class.getResource() call. - This allows templates to be bundled up in .jar files or in a - .war file for easy deployment of web-based apps.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1.html b/fmpp/docs/freemarker/versions_2_1.html deleted file mode 100644 index 3ecf732..0000000 --- a/fmpp/docs/freemarker/versions_2_1.html +++ /dev/null @@ -1,618 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1 - - - - - - - - -
    - - - - - -

    -2.1

    - - - - -

    Date of release: 2002-10-17

    Templates and the Java API are not fully - compatible with 2.0 releases. You will need to revisit existing code - and templates, or use 2.1 for new projects only. Sorry for this - inconvenience; FreeMarker has undergone some revolutionary changes - since the 1.x series. We hope things will soon be sufficiently mature - for us to offer (almost) backward-compatible releases. Note that there - is a backward-compatibility flag that can be set via - Configuration.setClassicCompatible(true) that - causes the new FreeMarker to emulate most of FreeMarker 1.x's - quirks.

    - - - - -

    -Changes in FTL (FreeMarker Template Language)

    - - -
    -
      -
    • -

      More strict, reveals accidental mistakes in the templates, - prevents showing incorrect information when something went - wrong:

      - -
      -
        -
      • -

        An attempt to access an undefined variable causes an - error and aborts template processing (by default at least; - see later). In earlier versions undefined variables were - silently treated as empty (zero-length) strings. However, - you can handle undefined variables in the template with some - new built-ins. For example, - ${foo?if_exists} is equivalent with the - ${foo} of earlier versions. Another way - of looking at this is that null values no longer exist from - the viewpoint of a template designer. Anything referenced - must be a defined variable.

        - -

        Note however that the programmer can configure - FreeMarker so that it ignores certain errors (say, undefined - variables), and continues template processing by skipping - the problematic part. This ``loose'' policy should be used - only for sites that don't show critical information.

        -
      • - -
      • -

        New variable type: boolean. Conditions in - if/elseif and operands - of logical operators (&&, - ||, !) must be - booleans. Empty strings are no longer treated as a logical - false.

        -
      • -
      - -
    • - -
    • -

      Local and global variables. More info: Template Author's Guide/Miscellaneous/Defining variables in the template

      - -
      -
        -
      • -

        Local variables for macros. You can create/replace - local variables in macro definition bodies with the local - directive

        -
      • - -
      • -

        You can create/replace global (non-local) variables - with the global - directive

        -
      • -
      - -
    • - -
    • -

      The include - directive now by default treats the passed filename as being - relative to the including template's path. To specify absolute - template paths, you now have to prepend them with a - slash.

      -
    • - -
    • -

      The include - directive can now use the acquisition - algorithm (familiar from the Zope system) to look up - the template to include. Basically, if a template is not found - where it is looked up first, it is looked up in parent - directories. This is however not a default behavior, rather it - is triggered by a new syntactic element.

      -
    • - -
    • -

      Strict syntax mode: Allows you to generate arbitrary SGML - (XML) without worrying about clashes with FreeMarker directives. - For more information read: Template Language Reference/Deprecated FTL constructs/Old FTL syntax

      -
    • - -
    • -

      Terse comments: you can use <#-- - ... --> instead of - <comment>...</comment>

      -
    • - -
    • -

      Directive that you can use to change the locale (and other - settings) inside the template: setting

      -
    • - -
    • -

      Directive to explicitly flush the output buffer: flush

      -
    • - -
    • -

      The top-level (root) hash is available via the variable - root, which is now a reserved name.

      -
    • - -
    • -

      The misnamed function directive has - been renamed to macro.

      -
    • - -
    • -

      String literals support various new escape sequences, - including UNICODE escapes - (\xCODE)

      -
    • - -
    • -

      The compress - directive is now more conservative in removing line - breaks.

      -
    • - -
    • -

      Built-in to capitalize the first word: cap_first

      -
    • - -
    • -

      Built-in to generate on-the-fly templates: interpret

      -
    • - -
    • -

      stop - directive has an optional parameter to describe the reason of - termination

      -
    • - -
    • -

      Better error messages.

      -
    • - -
    • -

      New variable type: date. Date support is - experimental. It can change substantially in the future. Keep - this in mind if you use it.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      ObjectWrapper: You can put - non-TemplateModel objects directly into - hashes, sequences and collections, and they will be - automatically wrapped with the appropriate - TemplateModel implementation. The API of - objects that are exposed to templates - (SimpleXXX) has - been changed according to this, for example in - SimpleHash the old put(String key, - TemplateModel value) is now put(String key, - Object object). Also, you can pass any kind of object - as data-model to Template.process. The - alternative reflection based ObjectWrapper - can expose the members of any Java object automatically for the - designer. More information: Object wrapping, - Bean wrapper, Jython wrapper.

      -
    • - -
    • -

      The Configuration object was introduced - as a central point to hold all your FreeMarker-related global - settings, as well as commonly used variables that you want to - have available from any template. Also it encapsulates the - template cache and can be used to load templates. For more - information read Programmer's Guide/The Configuration.

      -
    • - -
    • -

      TemplateLoader: pluggable template - loader, separates caching from template loading

      -
    • - -
    • -

      TemplateNumberModel-s do not control - their formatting anymore. They just store the data (i.e. a - number). Number formatting is done by the FreeMarker core based - on the locale and - number_format settings. This logic applies to - the new experimental date type as well.

      -
    • - -
    • -

      TemplateBooleanModel introduced: Only - objects that implements this interface can be used as a boolean - in true/false conditions. More info: Programmer's Guide/The Data Model/Scalars

      -
    • - -
    • -

      TemplateDateModel introduced: objects - that implements this interface are recognized as dates and can - be locale-sensitively formatted. Date support is - experimental in FreeMarker 2.1. It can change substantially in - the future. Keep this in mind if you use it.

      -
    • - -
    • -

      The TemplateModelRoot interface was - deprecated. As of FreeMarker 2.1, you can simply use any - instance of TemplateHashModel instead. This - actually is due to a significant architectural change. Variables - set or defined in a template are stored in a separate - Environment object that only exists while the - template is being rendered. Thus, the template doesn't modify - the root hash.

      -
    • - -
    • -

      Changes to transformations

      - -
      -
        -
      • -

        Completely rewritten - TemplateTransformModel interface. More - flexible, and does not impose output holding. More - information: Programmer's Guide/The Data Model/Directives

        -
      • - -
      • -

        The transform directive now takes - an optional set of key/value pairs. <transform - myTransform; - key1=value1, - key2=value2 - ...>. More - information: transform - directive

        -
      • - -
      • -

        The transforms that ship with the FreeMarker core are - now available by default to all templates - i.e. - <transform html_escape> will invoke - the - freemarker.template.utility.HtmlEscape - transform. More information: Programmer's Guide/The Configuration/Shared variables

        -
      • -
      - -
    • - -
    • -

      User-defined TemplateModel objects now - can access the runtime environment (read and set variables, get - the current locale, etc.) using an - Environment instance, which can be obtained - by the static - Environment.getCurrentEnvironment() method. - As a result, TemplateScalarModel.getAsString - has been changed: it has no locale parameter.

      -
    • - -
    • -

      TemplateExceptionHandler-s make it - possible to define your own rules on what to do when a runtime - error occurs (e.g. accessing a non existing variable) during - template processing. For example, you can abort template - processing (recommended for most sites), or skip the problematic - statement and continue template processing (similar to old - behavior). DebugMode has been removed, use - TemplateExceptionHandler.DEBUG_HANDLER or - HTML_DEBUG_HANDLER instead.

      -
    • - -
    • -

      Logging: FreeMarker logs certain events (runtime errors - for example). For more information read Programmer's Guide/Miscellaneous/Logging.

      -
    • - -
    • -

      SimpleIterator was removed, but we - provide a TemplateCollectionModel - implementation: SimpleCollection.

      -
    • - -
    • -

      Arithmetic engine is pluggable - (Configuration.setArithmeticEngine). The core - distribution comes with two engines: - ArithmeticEngine.BIGDECIMAL_ENGINE (the - default) that converts all numbers to - BigDecimal and then operates on them, and - ArithmeticEngine.CONSERVATIVE_ENGINE that - uses (more-or-less) the widening conversions of Java language, - instead of converting everything to - BigDecimal.

      -
    • - -
    • -

      Changes to freemarker.ext.beans - package: The JavaBeans adapter layer has suffered several major - changes. First, BeansWrapper is no longer a - static utility class - you can now create instances of it, and - every instance can have its own instance caching policy and - security settings. These security settings are also new - you - can now create JavaBeans wrappers that hide methods that are - considered unsafe or inappropriate in a templating environment. - By default, you can no longer call methods like - System.exit() from the template (although you - can manually turn off these safeguards). The - StaticModel and - StaticModels classes are gone; their - functionality is now replaced with the - BeansWrapper.getStaticModels() method.

      -
    • - -
    • -

      freemarker.ext.jython package: - FreeMarker can now directly use Jython objects as data-models - using the Jython - wrapper.

      -
    • - -
    • -

      Changes to freemarker.ext.jdom package: - The package now uses the Jaxen package - instead of its predecessor, the - werken.xpath package to evaluate XPath - expressions. Since Jaxen is a successor to - werken.xpath, this can be considered to be - an upgrade. As a consequence, namespace prefixes are now - recognized in XPath expressions and the overall XPath - conformance is better.

      -
    • - -
    • -

      Better error reporting: If the processing of a template is - aborted by a TemplateException being thrown, - or using a <#stop> directive, - FreeMarker will now output an execution trace with line and - column numbers relative to the template source.

      -
    • - -
    • -

      The output is written to a simple - Writer; no more - PrintWriter. This redesign causes FreeMarker - to no longer swallow IOExceptions during - template processing.

      -
    • - -
    • -

      Various API cleanups, primarily the removing of - superfluous constructor and method overloads.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Documentation has been rewritten from scratch

      -
    • -
    - - - - - - -

    -Differences between the RC1 and final release

    - - -
    -
      -
    • -

      Added the support for date models and locale-sensitive - date formatting. Date support is experimental in - FreeMarker 2.1. It can change substantially in the future. Keep - this in mind if you use it.

      -
    • - -
    • -

      Added the default built-in which makes - it possible to specify default values for undefined - expressions.

      -
    • - -
    • -

      SimpleIterator has been removed, - SimpleCollection has been introduced

      -
    • - -
    • -

      Arithmetic engine is pluggable. The core now contains two - arithmetic engines: - ArithmeticEngine.BIGDECIMAL_ENGINE and - ArithmeticEngine.CONSERVATIVE_ENGINE.

      -
    • - -
    • -

      BeansWrapper supports a new exposure - level: EXPOSE_NOTHING

      -
    • - -
    • -

      Constants interface was removed. - ..._WRAPPER - constants have been moved from Constants to - ObjectWrapper, - EMPTY_STRING constant was moved to - TemplateScalarModel, - NOTHING constant was moved to - TemplateModel, TRUE and - FALSE constants were moved to - TemplateBooleanModel.

      -
    • - -
    • -

      JAVABEANS_WRAPPER was renamed to - BEANS_WRAPPER

      -
    • - -
    • -

      Configuration.get and - put, putAll were renamed - to getSharedVariable and - setSharedVariable, - setAllSharedVariables

      -
    • - -
    • -

      Configuration.getClassicCompatibility, - setClassicCompatibility were renamed to - isClassicCompatible, - setClassicCompatible

      -
    • - -
    • -

      Template.process method overloads with - useReflection parameter was removed. But now - we have setObjectWrapper method in the - Configuration, so you can set the preferred - root-object wrapper there.

      -
    • - -
    • -

      Some superfluous method overloads were removed; these - changes are backward compatible with RC1

      -
    • - -
    • -

      Various minor JavaDoc and Manual improvements

      -
    • - -
    • -

      Bugfix: include directive has - calculated the base path of relative paths wrongly

      -
    • - -
    • -

      Bugfix: We have accidentally used a J2SE 1.3 class, but - FreeMarker 2.1 must able to run on J2SE 1.2

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1_1.html b/fmpp/docs/freemarker/versions_2_1_1.html deleted file mode 100644 index 284ad04..0000000 --- a/fmpp/docs/freemarker/versions_2_1_1.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1.1 - - - - - - - - -
    - - - - - -

    -2.1.1

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2002-11-04

    - - - - -

    -Changes in FTL (FreeMarker Template Language)

    - - -
    -
      -
    • -

      Multi-type variables that are both string and number or - string and date are now output using their number or date value - instead of the string value when used in the - ${...} interpolation. This practically makes - the string part of a string/number or a string/date variables - useless.

      -
    • - -
    • -

      Bugfix: operator ``or'' (||) worked - wrongly when its left operand was a composite expression (e.g. - the second || in false || true || - false; this was evaluated to false, - but it should be true)

      -
    • - -
    • -

      Bugfix: Less-than sign inside comments confused the FTL - parser (e.g. <#-- blah < blah -->); - it commented out everything after the problematic - comment.

      -
    • - -
    • -

      Bugfix: Comparing two numerical constants (e.g. 3 - == 3) caused internal error in the FTL parser, and - aborted template processing with error.

      -
    • - -
    • -

      Experimental date/time type support was removed, since it - seems that this initial implementation was misguided. FreeMarker - 2.2 will certainly support data/time.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: Numbers wrapped with - BEANS_WRAPPER was displayed with the - toString() method of wrapped object. Now they - are rendered according to the number_format - setting, because multi-type variables that are both string and - number are now output using their number value instead of the - string value.

      -
    • - -
    • -

      Experimental date/time type support was removed, since it - seems that this initial implementation was misguided. FreeMarker - 2.2 will certainly support data/time.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1_2.html b/fmpp/docs/freemarker/versions_2_1_2.html deleted file mode 100644 index eaf21b8..0000000 --- a/fmpp/docs/freemarker/versions_2_1_2.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1.2 - - - - - - - - -
    - - - - - -

    -2.1.2

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2002-11-28

    - - - - -

    -Changes in FTL (FreeMarker Template Language)

    - - -
    -
      -
    • -

      FreeMarkerServlet now has a setting for - the Content-Type header of the response, - defaulting to text/html. Previously it set no - content type, which made it not play nicely when integrated with - software that expected it (i.e. OpenSymphony SiteMesh).

      -
    • - -
    • -

      FreeMarkerServlet now works correctly - when mapped to an URL extension instead of URL path - prefix.

      -
    • - -
    • -

      You can emulate include directive call - within Java code by calling - Environment.include(templateName, - charset, - parse).

      -
    • -
    - - -
    -
      -
    • -

      Bugfix: When Template.process() was - called from another template processing, it set - currentEnvironment to null when it returned, - thus crashed the parent template processing.

      -
    • - -
    • -

      Bugfix: the _descendant key in JDOM - support incorrectly left the document root element out of the - result when applied to a Document node.

      -
    • - -
    • -

      Bugfix: because we incorrectly assumed certain behavior of - JDK 1.4 Beans introspector, calls to public interface methods on - non-public classes that implement the interface were causing - exceptions on JDK 1.4

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Various minor supplements to the manual.

      -
    • - -
    • -

      Documentation HTML pages don't try to load the SourceForge - logo from the Internet anymore.

      -
    • - -
    • -

      The default ant target is jar, not - dist.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1_3.html b/fmpp/docs/freemarker/versions_2_1_3.html deleted file mode 100644 index 4679edf..0000000 --- a/fmpp/docs/freemarker/versions_2_1_3.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1.3 - - - - - - - - -
    - - - - - -

    -2.1.3

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2002-12-09

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Bugfix: cap_first built-in did what - double built-in does.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      The official extension of FreeMarker template files is - ftl from now, not fm. - (This is the name of the template language; FTL, for FreeMarker - Template Language.) Of course you can use any extensions, since - FreeMarker does not deal with the file extension. But we - recommend ftl extension as default.

      -
    • - -
    • -

      Web application examples got tweaked again, as under JDK - 1.4 a class in an explicit (named) package can no longer import - classes from the default (unnamed) package. Our webapp example - was using classes in the default package, they are now moved - into named packages.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1_4.html b/fmpp/docs/freemarker/versions_2_1_4.html deleted file mode 100644 index 8743fdc..0000000 --- a/fmpp/docs/freemarker/versions_2_1_4.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1.4 - - - - - - - - -
    - - - - - -

    -2.1.4

    - - -

    Date of release: 2002-12-26

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: Log4J is now found when automatically discovering - the logging library to use.

      -
    • - -
    • -

      Bugfix: An exception is no longer thrown in the static - initializer of the Configuration if the - directory specified in the "user.dir" system - property is not readable.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_1_5.html b/fmpp/docs/freemarker/versions_2_1_5.html deleted file mode 100644 index 09aaf98..0000000 --- a/fmpp/docs/freemarker/versions_2_1_5.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.1.5 - - - - - - - - -
    - - - - - -

    -2.1.5

    - - -

    Date of release: 2003-02-08

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: Fixed a bug that forced the cache to frequently - reload templates accessed through URL and multi template - loaders: Templates loaded with - URLTemplateLoader subclasses and - MultiTemplateLoader was removed from the - template cache after the template update delay has elapsed (5 - seconds by default) even if the template file was unchanged. - This can cause lot of extra load for a high-traffic server if - you have many templates or if the template update delay was set - to 0 second.)

      -
    • - -
    • -

      Bugfix: Many anomalies in the - JythonWrapper were resolved, making the - integration with Jython much smoother: Jython wrapper can now - wrap arbitrary Java objects, not only - PyObject-s. If an object is passed to the - wrapper that is neither a TemplateModel, nor - a PyObject, it is first coerced into a - PyObject using Jython's own wrapping - machinery, and then wrapped into a - TemplateModel as any other - PyObject.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2.html b/fmpp/docs/freemarker/versions_2_2.html deleted file mode 100644 index f07289e..0000000 --- a/fmpp/docs/freemarker/versions_2_2.html +++ /dev/null @@ -1,1221 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2 - - - - - - - - -
    - - - - - -

    -2.2

    - - - - -

    Date of release: 2003-03-27

    This release introduces some really important new features. - Unfortunately, evolution was painful again; we have a few non-backward - compatible changes (see below). Also, for those of you awaiting - desired native date/time type, sorry, it is still not here (because of - some internal chaos in the team... stand by, it's coming).

    - - - - -

    -Non backward-compatible changes!

    - - -
    -
      -
    • -

      Macros are now plain variables. This means that if you are - unlucky and you have both a macro and another variable with the - same name, now the variable will overwrite the macro, so your - old template will malfunction. If you have a collection of - common macros, you should use the new namespace feature to - prevent accidental clashes with the variables used in the - templates.

      -
    • - -
    • -

      With the introduction of the new namespace support, - global and assign - directives are no longer synonyms. assign - creates a variable in the current namespace, - while global creates variable that is visible - from all namespaces (as if the variable would be in the - data-model). Thus, the variable created with - assign is more specific, and hides the - variable of the same name created with - global. As a result, if you use both - global and assign mixed - for the same variable in your templates, now they will - malfunction. The solution is to search-and-replace all - globals in your old templates with - assign.

      -
    • - -
    • -

      The reserved hash root no longer exists - as a predefined variable (we no longer have reserved variables). - Use special - variable expressions to achieve similar effects. However, - we have no equivalent replacement for root - because of the changes in the variable scopes caused by the - introduction of namespaces. You may should use - .globals or - .namespace.

      -
    • - -
    • -

      The BeansWrapper no longer exposes - native Java arrays, booleans, numbers, enumerations, iterators, - and resource bundles as TemplateScalarModel. - This way, number objects wrapped through - BeansWrapper are subject to FreeMarker's - number formatting machinery. Also, booleans can be formatted - using the ?string built-in.

      -
    • - -
    • -

      The signature of - Configuration.setServletContextForTemplateLoading - has been changed: the first parameter is now - Object instead of - javax.servlet.ServletContext. Thus, you have - to recompile your classes that call this method. The change was - required to prevent class-loading failure when - javax.servlet classes are not available and - you would not call this method.

      -
    • - -
    • -

      This release introduces a parse-time white-space - remover that strips some of the typical superfluous - white-space around FreeMarker tags and comments. This - feature is on by default! Most probably this will not - cause problems if you generate white-space neutral output like - HTML. But if it does cause undesirable reformatting in output - you generate, you can disable it with - config.setWhitespaceStripping(false). Also, - you can enable/disable it on a per-template basis with the new - ftl - directive.

      -
    • - -
    • -

      Some new directives were introduced: - nested, import, - escape, noescape, - t, rt, - lt. This means that if you are unlucky and - the text of your template contains something like - <nested>, then that will be - misinterpreted as a directive. To prevent this kind of problem - in the future, we recommend everybody to switch from the old - syntax to the new syntax (``strict syntax''). The strict syntax - will be the the default syntax starting from some of the later - releases anyway. We plan to release a conversion tool for - converting old templates. For more information please read: - Template Language Reference/Deprecated FTL constructs/Old FTL syntax

      -
    • - -
    • -

      The data-model created by the - FreemarkerServlet now uses automatic scope - discovery, so writing - Application.attrName, - Session.attrName, - Request.attrName - is no longer mandatory; it's enough to write - attrName (for more - information read - this). This may break an old template if that rely on the - non-existence of certain top-level variables.

      -
    • - -
    • -

      FreemarkerServlet now uses the encoding - of the template file for the output, unless you specify the - encoding in the ContentType init-param, such - as text/html; charset=UTF-8.

      -
    • - -
    • -

      The format of template paths is now more restricted than - before. The path must not use /, - ./ and ../ and - :// with other meaning as they have in URL - paths (or in UN*X paths). The characters * - and ? are reserved. Also, the template loader - must not want paths starting with /. For more - information please read: Programmer's Guide/The Configuration/Template loading

      -
    • - -
    • -

      Till now - TemplateTransformModel.getWriter has received - null as parameter map if the transform was called without - parameters. From now, it will receive an empty Map instead. Note - that the previous API documentation didn't state that it always - receives null if there are no parameters, so hopelessly only - very few classes exploit this design mistake.

      -
    • -
    - - - - - - -

    -Changes in FTL (FreeMarker Template Language)

    - - -
    -
      -
    • -

      User-defined directives: Transform and macro call syntax - has been unified; they can be called in the same way, as - user-defined directives. This also means that macros support - named parameters and nested content (like the -- now deprecated - -- transform directive did). For example, if - you have a macro called sect, you may call it - via <@sect title="Blah" style="modern">Blah - blah...</@sect>. For more information read: - Template Author's Guide/Miscellaneous/Defining your own directives

      -
    • - -
    • -

      Macros are now plain variables. This significantly - simplifies FreeMarker semantics, while providing more - flexibility; for example you can pass macros as parameters to - other macros and transforms. As for the problem of clashing - commonly-used-macro and variable names, we provide a more - powerful solution: namespaces.

      -
    • - -
    • -

      Namespaces: Names-spaces are invaluable if you want to - assemble collections (``libraries'') of macros and transforms - (and other variables), and then use them in any template without - worrying about accidental name clashes with the application - specific and temporary variables, or with the variables of other - collections you want to use in the same template. This is - extremely important if FreeMarker users want to share their - macro/transform collections. For more information read: Template Author's Guide/Miscellaneous/Namespaces

      -
    • - -
    • -

      With the introduction of namespaces our variable related - terminology changed. As a result, assign is - no longer synonymous with global. The - assign directive has been undeprecated, and - should be used instead of global almost - everywhere. In the new approach assign - creates variables in the current namespace, while - global creates a variable that is visible - from all namespaces (as if the variable were in the root of the - data-model). A variable created with assign - in the current namespace hides the variable of the same name - that was created with global.

      -
    • - -
    • -

      ftl directive: With this directive you - can give information about the template for FreeMarker, like the - encoding (charset) of the template, the used FTL syntax variant, - etc. Also, this directive helps you to write templates that are - less dependent on FreeMarker configuration settings, also it - helps third-party tools to identify and correctly parse - FreeMarker templates. For more information see: ftl - directive

      -
    • - -
    • -

      White-space stripping: FreeMarker now automatically - removes some of the typical superfluous white-spaces around - FreeMarker tags and comments, like the indentation spaces - before- and line-break after <#if ...> - tags. For more information read: Template Author's Guide/Miscellaneous/White-space handling/White-space stripping

      -
    • - -
    • -

      New directive to apply a common ("escaping") expression to - all interpolations in a block: escape. - The name comes from the common usage of this directive for - automatic HTML-escaping of interpolations.

      -
    • - -
    • -

      The new and preferred way of number formatting with - string built-in is - foo?string(format), instead of the less - natural foo?string[format].

      -
    • - -
    • -

      The string built-in works for boolean - values. For example: ${spamFilter?string("enabled", - "disabled")}. For more information read the - reference.

      -
    • - -
    • -

      The default strings for outputting boolean value using the - string built-in can be set using the - boolean_format setting.

      -
    • - -
    • -

      Comments can be placed inside FTL tags and interpolations. - For example: <#assign <#-- a comment --> x = - 3>

      -
    • - -
    • -

      All letters and numbers are enabled in variable names, - also $ is allowed (as in Java programming - language). Thus you can use accents, Arabic letters, Chinese - letters, etc.

      -
    • - -
    • -

      String literals can be quoted with apostrophe-quote. - "foo" and 'foo' are - equivalent.

      -
    • - -
    • -

      New string - built-ins: index_of, - last_index_of, - starts_with, ends_with, - replace, split, - chop_linebreak, - uncap_first.

      -
    • - -
    • -

      New sequence - built-ins: sort, - sort_by.

      -
    • - -
    • -

      New built-ins for experts to check the type of a variable. - See: is_... - built-ins

      -
    • - -
    • -

      New built-in for experts to create a variable of certain - Java TemplateModel implementation. See: new - built-in

      -
    • - -
    • -

      New built-in, namespace, - to get the namespace of a macro.

      -
    • - -
    • -

      New expression type: special variable expression. To - prevent backward compatibility problems when we introduce new - predefined variables, from now special variable - expressions are used to access them.

      -
    • - -
    • -

      New directives: t, - rt and lt directives allow - you to do explicit white-space removal in extreme FTL - applications. For more information read the reference.

      -
    • - -
    • -

      assign, local and - global now can capture the output generated - be the nested template fragment into the variable. This - deprecates capture_output transform. More - information: assign - directive reference

      -
    • - -
    • -

      Bulk assignments (as <#assign x=1, y=2, - z=3>) no longer need colon to separate the - assignments (as <#assign x=1 y=2 z=3>), - although it is still allowed to preserve backward - compatibility.

      -
    • - -
    • -

      Path that contains //: is considered as - absolute path.

      -
    • - -
    • -

      include and - transform directives no longer need a - semicolon to separate the template or transform name from the - parameter list, although it is still allowed to preserve - backward compatibility.

      -
    • - -
    • -

      #-less tag syntax is deprecated (but - still working). That is, you should write - <#directive - ...> instead of - <directive - ...>, and - </#directive - ...> instead of - </directive - ...>. For more info read: Template Language Reference/Deprecated FTL constructs/Old FTL syntax

      -
    • - -
    • -

      foreach is depreciated (but still - working). Use list - instead.

      -
    • - -
    • -

      Bugfix: Undefined variables in hash and sequence - constructors (as [a, b, c]) didn't caused - errors.

      -
    • - -
    • -

      Bugfix: String concatenation had performance problem if - there was multiple concatenations chained, as: - "a"+x+"a"+x+"a"+x+"a"+x+"a"+x.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Arbitrary JSP custom tags can be used as FreeMarker - transforms in FreemarkerServlet-driven - templates. More information: Programmer's Guide/Miscellaneous/Using FreeMarker with servlets

      -
    • - -
    • -

      Various improvements for - BeansWrapper:

      - -
      -
        -
      • -

        The BeansWrapper no longer exposes - arbitrary objects as - TemplateScalarModels, only - java.lang.String and - Character objects. This way, number - objects wrapped through BeansWrapper are - subject to FreeMarker's number formatting machinery. As a - side effect, non-string and non-number objects that were - previously accepted in equality and inequality operations - (because they had a string representation) will now cause - the engine to throw exception on comparison attempt.

        -
      • - -
      • -

        java.lang.Character objects are - exposed as scalars through - BeansWrapper.

        -
      • - -
      • -

        Experimental feature: With the - setSimpleMapWrapper method of - BeansWrapper you can configure it to wrap - java.util.Map-s as - TemplateHashModelEx-s, and do not expose - the methods of the object.

        -
      • -
      - -
    • - -
    • -

      TransformControl interface (was - experimental earlier): If the Writer returned - by TemplateTransformModel.getWriter - implements this interface, it can instruct the engine to skip or - to repeat evaluation of the nested content, and gets notified - about exceptions that are thrown during the nested content - evaluation. Note that the onStart and - afterBody methods now are allowed to throw - IOException. For more information please read - the API documentation.

      -
    • - -
    • -

      Localized lookup can be disabled with the new - Configuration methods: - set/getLocalizedLookup, - clearTemplateCache

      -
    • - -
    • -

      The new interface - freemarker.cache.CacheStorage allows users to - plug custom template caching strategies with the - cache_storage setting. The core package now - ships with two implementations: - SoftCacheStorage and - StrongCacheStorage. For more information - read: Programmer's Guide/The Configuration/Template loading

      -
    • - -
    • -

      You can set settings with string name and string value - with the new setSetting(String key, String - value) method of Configurable - super-classes (as Configuration). Also you - can load settings from .properties file with - the setSettings method.

      -
    • - -
    • -

      Other new Configuration methods: - clearTemplateCache, - clearSharedVariables, - getTemplateLoader, and - clone.

      -
    • - -
    • -

      Changes to TemplateTransformModel - interface: getWriter can throw - IOException, and can return - null if the transform does not support body - content.

      -
    • - -
    • -

      Till now - TemplateTransformModel.getWriter has received - null as parameter map if the transform was called without - parameters. From now, it will receive an empty Map instead. Note - that the previous API documentation didn't state that it always - receives null if there are no parameters, so hopelessly only - very few classes exploit this design mistake.

      -
    • - -
    • -

      Various improvements for - FreemarkerServlet:

      - -
      -
        -
      • -

        The data-model now uses automatic scope discovery, so - writing - Application.attrName, - Session.attrName, - Request.attrName - is no longer mandatory; it's enough to write - attrName. For - more information read this.

        -
      • - -
      • -

        FreemarkerServlet now uses the - encoding of the template file for the output, unless you - specify the encoding in the ContentType - init-param, such as text/html; - charset=UTF-8.

        -
      • - -
      • -

        All Configuration level settings - can by set with Servlet init-params - (template_exception_handler, - locale, number_format, - etc.).

        -
      • - -
      • -

        The object wrapper the servlet internally uses is now - set as the default object wrapper for its - Configuration instance.

        -
      • - -
      • -

        It no longer forces session creation for requests that - don't belong to an existing session, improving - scalability.

        -
      • -
      - -
    • - -
    • -

      JDOM independent XML-wrapping: - freemarker.ext.xml.NodeListModel is a - re-implementation of - freemarker.ext.jdom.NodeListModel that does - not rely on JDOM; you don't need JDOM .jar anymore. The new - NodeListModel automatically uses W3C DOM, - dom4j, or JDOM, depending on which library is available (that - is, depending on what object do you pass to its - constructor).

      -
    • - -
    • -

      Bugfix: WebappTemplateLoader: Template - updating didn't worked correctly with Tomcat due the caching of - resources. Now WebappTemplateLoader tries to - access the resources directly as File, if it - is possible, thus bypasses the caching.

      -
    • - -
    • -

      Various bug-fixes for - FreemarkerServlet:

      - -
      -
        -
      • -

        The servlet now loads the correct template if it was - called through - RequestDispatcher.include.

        -
      • - -
      • -

        The caching of HttpServletRequest - objects is now compliant with the servlet - specification.

        -
      • - -
      • -

        TemplateExceptions was suppressed - in certain situations resulting in half-rendered pages - without error message.

        -
      • -
      - -
    • - -
    • -

      Bugfix: FreeMarker didn't work if the - javax.servlet classes was not available, - because Configuration explicitly referred to - javax.servlet.ServletContext.

      -
    • - -
    • -

      Bugfix: classes may were not found if they was available - only in the WEB-INF, and FreeMarker tried to - load the class dynamically.

      -
    • - -
    • -

      Bugfix: the Template constructor (and - thus Configuration.getTemplate) sometimes - threw TokenMgrError (a non-checked exception) - instead of ParseException.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      The Web application related examples has been - replaced.

      -
    • -
    - - - - - - -

    -The history of the releases before the final version

    - - - - - - - -

    -Differences between the final and RC2 releases

    - - -
    -
      -
    • -

      You can load settings from - .properties file with the - setSettings method of - Configuration and other - Configurable subclasses.

      -
    • - -
    • -

      New string built-in: - uncap_first

      -
    • - -
    • -

      Bugfix: When exposing an XML document to a template and - accessing it with XPath using Jaxen a - ClassCastException has occurred.

      -
    • - -
    • -

      Bugfix: The template cache has loaded templates with bad - Configuration instance in certain - situations if you use not the static default - Configuration instance.

      -
    • -
    - - - - - - - - -

    -Differences between the RC2 and RC1 releases

    - - -
    -
      -
    • -

      Non backward compatible change!: - FreemarkerServlet now uses the encoding of - the template file for the output, unless you specify the - encoding in the ContentType init-param, - such as text/html; charset=UTF-8.

      -
    • - -
    • -

      Non backward compatible change compared to RC1!: The - capture_output transform creates variable - in the current namespace (as assign - directive) with the var parameter, not a - global variable.

      -
    • - -
    • -

      The new and preferred way of number formatting with - string built-in is - foo?string(format), instead of the less - natural foo?string[format].

      -
    • - -
    • -

      The string built-in works for boolean - values. For example: ${spamFilter?string("enabled", - "disabled")}. For more information read the - reference.

      -
    • - -
    • -

      The default strings for outputting boolean value using - the string built-in can be set using the - boolean_format setting.

      -
    • - -
    • -

      String literals can be quoted with apostrophe-quote. - "foo" and 'foo' are - equivalent.

      -
    • - -
    • -

      The new interface - freemarker.cache.CacheStorage allows users - to plug custom template caching strategies with the - cache_storage setting. The core package now - ships with two implementations: - SoftCacheStorage and - StrongCacheStorage. For more information - read: Programmer's Guide/The Configuration/Template loading

      -
    • - -
    • -

      You can set settings with string name and string value - with the new setSetting(String key, String - value) method of Configurable - super-classes (as Configuration).

      -
    • - -
    • -

      Other new Configuration methods: - getTemplateLoader, - clone.

      -
    • - -
    • -

      assign, local and - global now can capture the output generated - be the nested template fragment into the variable. This - deprecates capture_output transform. More - information: assign - directive reference

      -
    • - -
    • -

      Other new Configuration methods: - getTemplateLoader, - clone.

      -
    • - -
    • -

      Changes to TemplateTransformModel - interface: getWriter can throw - IOException, and can return - null if the transform does not support body - content.

      -
    • - -
    • -

      Till now - TemplateTransformModel.getWriter has - received null as parameter map if the transform was called - without parameters. From now, it will receive an empty Map - instead. Note that the previous API documentation didn't state - that it always receives null if there are no parameters, so - hopelessly only very few classes exploit this design - mistake.

      -
    • - -
    • -

      Changes to TemplateControl interface: - onStart and afterBody - methods are now allowed to throw - IOException.

      -
    • - -
    • -

      Path that contains //: is considered - as absolute path.

      -
    • - -
    • -

      New string - built-ins: index_of, - last_index_of, - starts_with, ends_with, - replace, split, - chop_linebreak.

      -
    • - -
    • -

      New sequence - built-ins: sort, - sort_by.

      -
    • - -
    • -

      All Configuration level settings can - by set with Servlet init-params - (template_exception_handler, - locale, number_format, - etc.).

      -
    • - -
    • -

      Bugfix: classes may were not found if they was available - only in the WEB-INF, and FreeMarker tried - to load the class dynamically.

      -
    • - -
    • -

      Bugfix: setLocalizedLookup(false) of - Configuration was overridden when you have - called setTemplateLoader.

      -
    • - -
    • -

      Bugfix: String concatenation had performance problem if - there was multiple concatenations chained, as: - "a"+x+"a"+x+"a"+x+"a"+x+"a"+x.

      -
    • - -
    • -

      Bugfix: white-space stripping was not worked with tags - spanning over multiple lines.

      -
    • - -
    • -

      Bugfix: Removing several dependencies on JDK 1.3, so - FreeMarker can be build for JDK 1.2.2.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 2 and RC1 releases

    - - -
    -
      -
    • -

      ftl is now stricter, and does not - allow custom parameters. To associate custom attributes to - templates, we may add a new directive later, if there is a - demand for it.

      -
    • - -
    • -

      escape directive does not affect - numerical interpolations - (#{...}) - anymore, as it has caused errors with string escapes as - ?html.

      -
    • - -
    • -

      The normalizeName method of - freemarker.cache.TemplateLoader has been - removed, because it has caused too many complications. - Instead, normalization happens on a single point in the - TempateCache. In consequence, FreeMarker is - now stricter about the format of template paths, as things - like /../ are interpreted by the - core.

      -
    • - -
    • -

      Experimental feature: With the - setSimpleMapWrapper method of - BeansWrapper you can configure it to wrap - java.util.Map-s as - TemplateHashModelEx-s, and do not expose - the methods of the object.

      -
    • - -
    • -

      New Configuration methods: - set/getLocalizedLookup, - clearTemplateCache, - clearSharedVariables.

      -
    • - -
    • -

      More cleanups in the Environment - API.

      -
    • - -
    • -

      Better JSP standard compliance: JSP page-scope variables - are the global variables that were created in the template - (not the variables of the data-model).

      -
    • - -
    • -

      JDOM independent XML-wrapping: - freemarker.ext.xml.NodeListModel is a - re-implementation of - freemarker.ext.jdom.NodeListModel that does - not rely on JDOM; you don't need JDOM .jar anymore. The new - NodeListModel automatically uses W3C DOM, - dom4j, or JDOM, depending on which library is available (that - is, depending on what object do you pass to its - constructor).

      -
    • - -
    • -

      Bugfix: WebappTemplateLoader: - Template updating didn't worked correctly with Tomcat due the - caching of resources. Now - WebappTemplateLoader tries to access the - resources directly as File, if it is - possible, thus bypasses the caching.

      -
    • - -
    • -

      Bugfix: Templates loaded with - MultiTemplateLoader subclasses was removed - from the template cache after the template update delay has - elapsed (5 seconds by default) even if the template file was - unchanged. This can cause lot of extra load for a high-traffic - server if you have many templates or if the template update - delay was set to 0 second.

      -
    • - -
    • -

      Bugfix: Undefined variables in hash and sequence - constructors (as [a, b, c]) didn't caused - errors.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 1 and Preview 2 - releases

    - - -
    -
      -
    • -

      All 16-bit Unicode letters and numbers are allowed in - identifiers, as well as the $ character (as - in Java programming language). Thus you can use accented - letters, Arabic letters, Chinese letters, etc. as identifiers - in templates

      -
    • - -
    • -

      Macros now can create loop variables for the nested - content. For more information read - this.

      -
    • - -
    • -

      New directives: t, - rt and lt directives - allow you to do explicit white-space removal in extreme FTL - applications. For more information read the reference.

      -
    • - -
    • -

      The syntax of assignment-with-namespace has changed from - <#assign foo=123 namespace=myLib>) to - <#assign foo=123 in myLib>, since the - previous syntax was confusing because its similarity to a - bulk-assignment.

      -
    • - -
    • -

      Bulk assignments (as <#assign x=1, y=2, - z=3>) no longer need colon to separate the - assignments (as <#assign x=1 y=2 - z=3>), although it is still allowed to preserve - backward compatibility.

      -
    • - -
    • -

      Positional parameter passing is supported for macro - calls as shorthand form of normal named parameter passing. For - more details read read the - reference.

      -
    • - -
    • -

      New built-in, namespace, to get the - namespace of the currently executing macro.

      -
    • - -
    • -

      TransformControl interface (was - experimental earlier): If the Writer - returned by - TemplateTransformModel.getWriter implements - this interface, it can instruct the engine to skip or to - repeat evaluation of the nested content, and gets notified - about exceptions that are thrown during the nested content - evaluation. For more information please read the API - documentation.

      -
    • - -
    • -

      Jython wrapper can now wrap arbitrary Java objects, not - only PyObject-s. If an object is passed to - the wrapper that is neither a - TemplateModel, nor a - PyObject, it is first coerced into a - PyObject using Jython's own wrapping - machinery, and then wrapped into a - TemplateModel as any other - PyObject.

      -
    • - -
    • -

      Some cleanups in the Environment - API.

      -
    • - -
    • -

      The Web application related examples has been - replaced.

      -
    • - -
    • -

      Bugfix: Templates loaded with - URLTemplateLoader subclasses was removed - from the template cache after the template update delay has - elapsed (5 seconds by default) even if the template file was - unchanged. This can cause lot of extra load for a high-traffic - server if you have many templates or if the template update - delay was set to 0 second.

      -
    • - -
    • -

      Bugfix: FreeMarkerServlet has thrown - ServletException even if a debug - TemplateException handler was in use (so - you may got Error 500 page instead of debug - information).

      -
    • -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_1.html b/fmpp/docs/freemarker/versions_2_2_1.html deleted file mode 100644 index d2a5758..0000000 --- a/fmpp/docs/freemarker/versions_2_2_1.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.1 - - - - - - - - -
    - - - - - -

    -2.2.1

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2003-04-11

    This version introduces important new features, such as the - native FTL date/time type, and the auto-include and auto-import - settings.

    The date/time support is experimental, but we hope it will not - substantially change. We would like to label it as final ASAP, so we - urge everybody to send feedback on this topic to the mailing - lists.

    - - - - -

    -Changes on the FTL side

    - - - - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      New TemplateModel subinterface: - TemplateDateModel. For more information read - Programmer's Guide/The Data Model/Scalars

      -
    • - -
    • -

      auto-include and auto-import: With these new configuration - level settings, you can include and import commonly used - templates (usually collection of macro definitions) at the top - of all templates, without actually typing <#include - ...> or - <#import - ...> into the templates - again and again. For more information please read the Java API - documentation of Configuration

      -
    • - -
    • -

      New template method: - createProcessingEnvironment. This method - makes it possible for you to do some special initialization on - the Environment - before template processing, or to read the environment after - template processing. For more information please read the Java - API documentation.

      -
    • - -
    • -

      Changes to freemarker.ext.beans - package: BeanModel, - MapModel, and - ResourceModel now implement - TemplateHashModelEx.

      -
    • - -
    • -

      Bugfix: - Configurable.setSettings(Properties) didn't - removed redundant spaces/tabs at the end of property - values.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_2.html b/fmpp/docs/freemarker/versions_2_2_2.html deleted file mode 100644 index c2f8f5e..0000000 --- a/fmpp/docs/freemarker/versions_2_2_2.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.2 - - - - - - - - -
    - - - - - -

    -2.2.2

    - - -

    Date of release: 2003-05-02

    Bugfix release.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: The _text key of the - freemarker.ext.xml.NodeListModel was not - returning the text of the element when used with W3C DOM - trees.

      -
    • - -
    • -

      The classes are now built against JDK 1.2.2 classes, - ensuring the binary compatibility of FreeMarker distribution - with JDK 1.2.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_3.html b/fmpp/docs/freemarker/versions_2_2_3.html deleted file mode 100644 index df7756b..0000000 --- a/fmpp/docs/freemarker/versions_2_2_3.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.3 - - - - - - - - -
    - - - - - -

    -2.2.3

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2003-07-19

    Bugfix release.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Added the is_date built-in.

      -
    • - -
    • -

      Bugfix: Various is_xxx built-ins were - returning false when applied to undefined - expressions. Now they correctly fail on them.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: The JSP taglib support can now read JSP 1.2 - compliant TLD XML files.

      -
    • - -
    • -

      Bugfix: The JSP taglib support now emits more helpful - exception messages when the specified TLD XML file is not found - (previously it threw a - NullPointerException).

      -
    • - -
    • -

      Bugfix: The JSP taglib support now initializes a custom - tag after its parent and page context is set as some tags expect - them to be set when attribute setters are called.

      -
    • - -
    • -

      Bugfix: The BeansWrapper could fail to - analyze classes under very rare circumstances due to a premature - storage optimization.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_4.html b/fmpp/docs/freemarker/versions_2_2_4.html deleted file mode 100644 index e2f3737..0000000 --- a/fmpp/docs/freemarker/versions_2_2_4.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.4 - - - - - - - - -
    - - - - - -

    -2.2.4

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2003-09-03

    Maintenance and bugfix release.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Improvements to JSP taglib support. If some third party - taglib didn't work for you with FreeMarker, maybe now it - will.

      - -
      -
        -
      • -

        The JSP PageContext now implements - forward and include - methods.

        -
      • - -
      • -

        Accepting EVAL_PAGE as an alias to - SKIP_BODY in return values from - doStartTag. It's a common bug in some - widespread tag libraries, and now FreeMarker is less strict - and accepts it.

        -
      • -
      - -
    • - -
    • -

      Fixes for some rare problems regarding namespaces of - macros.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Minor improvements to the documentation.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_5.html b/fmpp/docs/freemarker/versions_2_2_5.html deleted file mode 100644 index 3027b02..0000000 --- a/fmpp/docs/freemarker/versions_2_2_5.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.5 - - - - - - - - -
    - - - - - -

    -2.2.5

    - - -

    Date of release: 2003-09-19

    Maintenance and bugfix release.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Creating a Configuration instance using - the default constructor no longer fails if the current directory - is unreadable due to I/O problems, lack of security permissions, - or any other exception.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_6.html b/fmpp/docs/freemarker/versions_2_2_6.html deleted file mode 100644 index 8087a43..0000000 --- a/fmpp/docs/freemarker/versions_2_2_6.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.6 - - - - - - - - -
    - - - - - -

    -2.2.6

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2004-March-13

    Maintenance and bugfix release. Some of improvements are - back-portings from FreeMarker 2.3rc1.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      New special variable: - .vars. This is useful to read top-level - variables with square bracket syntax, for example - .vars["name-with-hyphens"] and - .vars[dynamicName].

      -
    • - -
    • -

      New built-ins for Java and JavaScript string escaping: - j_string and js_string

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: The template cache didn't reload the template when - it was replaced with an older version.

      -
    • - -
    • -

      Bugfix: - freemarker.template.utility.DeepUnwrap - unwrapped sequences to empty - ArrayList-s.

      -
    • - -
    • -

      Bugfix: In error messages, when the quoted FTL directive - had nested content, that was quoted as well, so the quotation - could be very long and expose nested lines needlessly.

      -
    • - -
    • -

      freemarker.template.TemplateExceptionHandler.HTML_DEBUG_HANDLER - now prints more HTML-context-proof messages.

      -
    • - -
    • -

      You can query the FreeMarker version number with static - method Configuration.getVersionNumber(). - Also, the Manifest.mf included in - freemarker.jar now contains the FreeMarker - version number, furthermore, executing it with java - -jar freemarker.jar will print the version number to - the stdout.

      -
    • - -
    • -

      Date support is now labeled as final. (It was experimental - earlier.) There was no change since FreeMarker 2.2.1.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Fixes and improvements in the Manual and in the API - JavaDoc. The documentation now works with the Eclipse help - plugin (accessible in the ``Editor/IDE plugins'' section of the - FreeMarker Web page).

      -
    • - -
    • -

      Minor site improvements.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_7.html b/fmpp/docs/freemarker/versions_2_2_7.html deleted file mode 100644 index e55f9e3..0000000 --- a/fmpp/docs/freemarker/versions_2_2_7.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.7 - - - - - - - - -
    - - - - - -

    -2.2.7

    - - -

    Date of release: 2004-March-17

    Important bugfix release.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: Fixing a fatal bug in the template cache that was - introduced with the latest cache ``bugfix''. The template cache - has always reloaded the unchanged template when the update delay - has been elapsed, until the template has been actually changed, - in which case it has never reloaded the template anymore.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_2_8.html b/fmpp/docs/freemarker/versions_2_2_8.html deleted file mode 100644 index a3b4edf..0000000 --- a/fmpp/docs/freemarker/versions_2_2_8.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.2.8 - - - - - - - - -
    - - - - - -

    -2.2.8

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2004-June-15

    Bugfix and maintenance release.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Added a new special variable to print the FreeMarker - version number: version. See more in the reference...

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      The BeansWrapper has been improved to - prevent some security exceptions when introspecting.

      -
    • - -
    • -

      Bugfix: The FileTemplateLoader is now - more robust when it receives paths that are malformed according - the native file system. In the earlier version such paths - sometimes caused unexpected IOException that - aborted the searching for the template in further - FileTemplateLoader-s when you use the - MultiTemplateLoader.

      -
    • - -
    • -

      Some parts of the FreeMarker code has been marked as - privileged code section, so you can grant extra privileges to - FreeMarker when you use a security manager (this is a - backporting from 2.3). See more here...

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Minor documentation fixes and improvements.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3.html b/fmpp/docs/freemarker/versions_2_3.html deleted file mode 100644 index cf1813c..0000000 --- a/fmpp/docs/freemarker/versions_2_3.html +++ /dev/null @@ -1,1856 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3 - - - - - - - - -
    - - - - - -

    -2.3

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2004-June-15

    FreeMarker 2.3 introduces numerous little new features and - quality improvements compared to the 2.2.x series. The most notable - improvements are the ability to define functions (methods) in - templates, the ability to interpolate variables in string literals, - the support for a variable number of macro parameters, and the more - intelligent default object wrapper. Although none of the improvements - is a drastic change, the 2.3.x series is not backward compatible with - the 2.2.x series (see the list below), so you may choose to use it for - new projects only.

    Probably the most ``loudly promoted'' new feature is the totally - redesigned XML wrapper. With the new XML wrapper FreeMarker targets a - new application domain, which is similar to the application domain of - XSLT: transforming complex XML to whatever textual output. Although - this subproject is young, it is definitely usable in practice. See the - XML Processing Guide for more - details.

    - - - - -

    -Non backward-compatible changes!

    - - -
    -
      -
    • -

      Since interpolations (${...} and - #{...}) now work inside string literals, the - character sequence ${ and - #{ in string literals are reserved for that. - So if you have something like <#set x = - "${foo}">, then you have to replace it with - <#set x = r"${foo}"> -- beware, escapes - such as \n will not work in raw - (r) strings.

      -
    • - -
    • -

      The default (initial) value of the - strict_syntax setting has been changed from - false to true. When - strict_syntax is true, - tags with old syntax as <include - "foo.ftl"> will be considered as static text (so - they go to the output as-is, like HTML tags do), and not as FTL - tags. Such tags have to be rewritten to <#include - "foo.ftl">, since only parts that starts with - <#, </#, - <@, or </@ count as - FTL tags. Or, to recover the old transitional behavior, where - both legacy and new tag syntax was recognized, you have to - explicitly set strict_syntax to - false: - cfg.setStrictSyntaxMode(false). Also, for - individual templates you can force the old behavior by starting - the template with <#ftl - strict_syntax=false>. (For more information about - why strict syntax is better than old syntax read this...)

      -
    • - -
    • -

      Several classes were moved from the - freemarker.template package, to the new - freemarker.core package:

      - -
      -
        -
      • - "Normal" classes: ArithmeticEngine, - Configurable, - Environment -
      • - -
      • - Exceptions: - InvalidReferenceException, - NonBooleanException, - NonNumericalException, - NonStringException, - ParseException, - StopException -
      • - -
      • - Errors: TokenMgrError -
      • -
      - - -

      The main reason of the splitting of - freemarker.template package was that the - amount of "expert" public classes and interfaces grows too much, - as we introduce API-s for third-party tools, such as debugging - API.

      -
    • - -
    • -

      freemarker.template.TemplateMethodModel.exec - now returns Object instead of - TemplateModel.

      -
    • - -
    • -

      White-space stripping is now more aggressive as before: it - always removes leading and trailing white-space if the line only - contains FTL tags. (Earlier the white-space was not removed if - the tag was <#include - ...> or user-defined - directive tag with empty directive syntax as - <@myMacro/> (or its equivalents: - <@myMacro></@myMacro> and - <@myMacro></@>). Now white-space - is removed in these cases as well.) Also, white-space sandwiched - between two non-outputting elements, such as macro definitions, - assignments, imports, or property settings, is now ignored. More - information: Template Author's Guide/Miscellaneous/White-space handling/White-space stripping

      -
    • - -
    • -

      The function directive is now used for - defining methods. You should replace function - with macro in your old templates. Note, - however, that old function-s will still work - if you don't use the return directive in - them, and you invoke them with the deprecated the - call directive.

      -
    • - -
    • -

      The expressions as, - in, and using are now - keywords in the template language and cannot be used as - top-level variable names without square-bracket syntax. If, by - some chance, you have top-level variables that use one of these - names, you will have to rename them, or use the square-bracket - syntax with the .vars special variable: - .vars["in"].

      -
    • - -
    • -

      The ?new built-in, as it was - implemented, was a security hole. Now, it only allows you to - instantiate a java object that implements the - freemarker.template.TemplateModel interface. - If you want the functionality of the ?new - built-in as it existed in prior versions, make available an - instance of the - freemarker.template.utility.ObjectConstructor - class to your template. (For example: - myDataModel.put("objConstructor", new - ObjectConstructor());, and then in the template you - can do this: <#assign aList = - objConstructor("java.util.ArrayList", 100)>)

      -
    • - -
    • -

      Changes to the - FreemarkerServlet:

      - -
      -
        -
      • -

        The FreemarkerServlet uses - ObjectWrapper.DEFAULT_WRAPPER by default - instead of ObjectWrapper.BEANS_WRAPPER. - What this means is that, by default, objects of type - java.lang.String, - java.lang.Number, - java.util.List, and - java.util.Map will be wrapped as - TemplateModels via the classes - SimpleScalar, - SimpleNumber, - SimpleSequence, and - SimpleHash respectively. Thus, the java - methods on those objects will not be available. The default - wrapper implementation in FreeMarker 2.3 automatically knows - how to wrap Jython objects, and also wraps - org.w3c.dom.Node objects into instances - of freemarker.ext.dom.NodeModel.

        -
      • - -
      • -

        The FreemarkerServlet base - implementation no longer deduces the locale used for - templates with HttpRequest.getLocale(). - Rather, it simply delegates to the new protected method, - deduceLocale. The default implementation - of this method simply returns the value of configuration the - locale setting.

        -
      • -
      - -
    • -
    - - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Interpolation in string literals. For convenience, - interpolations are now supported in string literals. For - example: <@message "Hello ${user}!" /> - is the same as <@message "Hello " + user + "!" - />

      -
    • - -
    • -

      Raw string literals: In string literals prefixed with - r, interpolations and escape sequences will - not be interpreted as special tokens. For example: - r"\n${x}" will be simply interpreted as the - character sequence '\', - 'n', '$', - '{', 'x', - '}', and not as line-feed and the value of - the x variable.

      -
    • - -
    • -

      Method variables can be defined in FTL, with the function - directive.

      -
    • - -
    • -

      Support for a variable number of macro parameters. If the - last parameter in a macro declaration ends with - ..., all extra parameters passed to the macro - will be available via that parameter. For macros called with - positional parameters, the parameter will be a sequence. For - named parameters, the parameter will be a hash. Note that it all - works with the new function directive as - well.

      -
    • - -
    • -

      A new header parameter, strip_text, - that removes all top-level text from a template. This is useful - for ``include files'' to suppress newlines that separate the - macro definitions. See ftl - directive

      -
    • - -
    • -

      New special variable: - .vars. This is useful to read top-level - variables with square bracket syntax, for example - .vars["name-with-hyphens"] and - .vars[dynamicName].

      -
    • - -
    • -

      macro and assignment directives now - accept arbitrary destination variable name with quoted syntax. - For example: <#macro - "name-with-hyphens">... - or <#assign "foo bar" = 123>.

      -
    • - -
    • -

      The ?keys and - ?values hash built-ins now return sequences. - In practical terms this means you can access their sizes or - retrieve their subvariables by index, and use all of the sequence built-ins. (Note - for the programmers: The TemplateHashModelEx - interface has not been changed. Your old code will work. See the - API documentation to see why.)

      -
    • - -
    • -

      Existence built-ins (?default, - ?exists, etc.) are now working with sequence - subvariables as well. Read the documentation of the - default built-in for more information.

      -
    • - -
    • -

      White-space stripping is now more aggressive as before: it - always removes leading and trailing white-space if the line only - contains FTL tags. (Earlier the white-space was not removed if - the tag was <#include - ...> or user-defined - directive tag with empty directive syntax as - <@myMacro/> (or its equivalents: - <@myMacro></@myMacro> and - <@myMacro></@>). Now white-space - is removed in these cases as well.) Also, top-level white-space - that separates macro definitions and/or assignments is now - ignored. More information: Template Author's Guide/Miscellaneous/White-space handling/White-space stripping

      -
    • - -
    • -

      White-space stripping can be disabled for a single line - with the nt - directive (for No Trim).

      -
    • - -
    • -

      Hashes can be concatenated using the + - operator. The keys in the hash on the right-hand side take - precedence.

      -
    • - -
    • -

      New built-ins for Java and JavaScript string escaping: - j_string and js_string

      -
    • - -
    • -

      The replace and - split built-ins now support case-insensitive - comparsion and regular expressions (J2SE 1.4+ only), and some - other new options. More information can be found here.

      -
    • - -
    • -

      New built-in for regular expression matching (J2SE 1.4+ - only): matches

      -
    • - -
    • -

      New built-in, eval, to evaluate a - string as FTL expression. For example - "1+2"?eval returns the number 3.

      -
    • - -
    • -

      New built-ins for Java and JavaScript string escaping: - j_string and js_string

      -
    • - -
    • -

      New special variables to read the value of the locale - setting: locale, lang. See - more in the - reference...

      -
    • - -
    • -

      New special variable to read the FreeMarker version - number: version. See more in the reference...

      -
    • - -
    • -

      Tree new directives, recurse, - visit and fallback, were - introduced to support declarative node-tree processing. These - are meant to be used typically (though not exclusively) for - processing XML input. Together with this, a new variable type - has been introduced, the node type. See the chapter on declarative XML - processing for more details.

      -
    • - -
    • -

      The ?new built-in, as it was - implemented, was a security hole. Now, it only allows you to - instantiate a java object that implements the - freemarker.template.TemplateModel interface. - If you want the functionality of - the ?new built-in as it existed in prior - versions, make available an instance of the - freemarker.template.utility.ObjectConstructor - class to your template. (For example: - myDataModel.put("objConstructor", new - ObjectConstructor());, and then in the template you - can do this: <#assign aList = - objConstructor("java.util.ArrayList", - 100)>)

      -
    • - -
    • -

      Variable names can contain @ anywhere - (without using quote-bracket syntax). For example: - <#assign x@@@ = 123> is valid.

      -
    • - -
    • -

      The expressions as, - in, and using are now - keywords in the template language and cannot be used as - top-level variable names without square-bracket syntax (as - .vars["in"]).

      -
    • - -
    • -

      New parameter to the ftl - directive: attributes. The value of - this attribute is a hash that associates arbitrary attributes - (name-value pairs) to the template. The values of the attributes - can be of any type (string, number, sequence... etc.). - FreeMarker doesn't try to understand the meaning of the - attributes. It's up to the application that encapsulates - FreeMarker (as a Web application framework). Thus, the set of - allowed attributes and their semantic is application (Web - application framework) dependent.

      -
    • - -
    • -

      Other minor quality improvements...

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Smarter default object wrapping: The default object - wrapper is now - freemarker.template.DefaultObjectWrapper, - which falls back on wrapping arbitrary objects as beans using - the freemarker.ext.beans.BeansWrapper. Also, - it will wrap org.w3c.dom.Node objects with - the new DOM wrapper. Also, it is aware of Jython objects, and - will use freemarker.ext.jython.JythonWrapper - if the object passed in is a Jython object. (We count it as a - backward compatible change, since this new object wrapper wraps - differently only those objects that the old wrapper was not able - to wrap, so it has thrown exception.)

      -
    • - -
    • -

      freemarker.template.TemplateMethodModel.exec - now returns Object instead of - TemplateModel.

      -
    • - -
    • -

      The default (initial) value of the - strict_syntax setting has been changed from - false to true. When - strict_syntax is true, - tags with old syntax as <include - "foo.ftl"> will be considered as static text (so - they go to the output as-is, like HTML tags do), and not as FTL - tags. Such tags have to be rewritten to <#include - "foo.ftl">, since only parts that starts with - <#, </#, - <@, or </@ count as - FTL tags. Or, to recover the old transitional behavior, where - both legacy and new tag syntax was recognized, you have to - explicitly set strict_syntax to - false: - cfg.setStrictSyntaxMode(false). Also, for - individual templates you can force the old behavior by starting - the template with <#ftl - strict_syntax=false>. (For more information about - why strict syntax is better than old syntax read this...)

      -
    • - -
    • -

      New CacheStorage implementation: - freemarker.cache.MruCacheStorage. This cache - storage implements a two-level Most Recently Used cache. In the - first level, items are strongly referenced up to the specified - maximum. When the maximum is exceeded, the least recently used - item is moved into the second level cache, where they are softly - referenced, up to another specified maximum. - freemarker.cache.SoftCachseStorage and - StrongCachseStorage are deprected, - MruCachseStorage is used everywhere instead. - The default cache storage is now an - MruCachseStorage object with 0 strong size, - and infinite soft size. - Configuration.setSetting for - cache_storage now understands string values - as "strong:200, soft:2000".

      -
    • - -
    • -

      For BeansWrapper generated models, you - can now use the ${obj.method(args)} syntax to - invoke methods whose return type is void. - void methods now return - TemplateModel.NOTHING as their return - value.

      -
    • - -
    • -

      freemarker.template.SimpleHash now can - wrap read-only Map-s, such as the map of HTTP - request parameters in Servlet API.

      -
    • - -
    • -

      The TemplateNodeModel interface was - introduced to support recursive processing of trees of nodes. - Typically, this will be used in relation to XML.

      -
    • - -
    • -

      New package: freemarker.ext.dom. This - contains the new XML wrapper, that supports the processing of - XML documents using the visitor pattern (i.e. with - <#visit ...> - and similar directives), and to provide more convenient XML - traversing as the legacy wrapper. See the XML processing guide for more - details.

      -
    • - -
    • -

      New package: freemarker.core. Classes - used by mostly power-users was moved here from the - freemarker.template package. The main reason - of the splitting of freemarker.template - package was that the amount of "expert" public classes and - interfaces grows too much, as we introduce API-s for third-party - tools, such as debugging API.

      -
    • - -
    • -

      New package: freemarker.debug. This - provides a debugging API, by which you can debug executing - templates through network (RMI). You have to write the front-end - (client), as the API is just the server side. For more - information please read the JavaDoc of the - freemarker.debug package.

      -
    • - -
    • -

      You can query the FreeMarker version number with static - method Configuration.getVersionNumber(). - Also, the Manifest.mf included in - freemarker.jar now contains the FreeMarker - version number, furthermore, executing it with java - -jar freemarker.jar will print the version number to - the stdout.

      -
    • - -
    • -

      Added a new protected FreemarkerServlet - method: Configuration - getConfiguration().

      -
    • - -
    • -

      Date support is now labeled as final. (It was experimental - earlier.)

      -
    • - -
    • -

      The BeansWrapper has been improved to - prevent some security exceptions when introspecting.

      -
    • - -
    • -

      Other minor quality improvements and extensions...

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Fixes and improvements in the Manual and in the API - JavaDoc.

      -
    • -
    - - - - - - -

    -The history of the releases before the final version

    - - - - - - - -

    -Differences between the final release and Release Candidate - 4

    - - -
    -
      -
    • -

      Added a new special variable to print the FreeMarker - version number: version. See more in the reference...

      -
    • - -
    • -

      Minor documentation fixes and improvements.

      -
    • -
    - - - - - - - - -

    -Differences between the Release Candidate 4 and Release - Candidate 3

    - - -
    -
      -
    • -

      The BeansWrapper has been improved to - prevent some security exceptions when introspecting.

      -
    • - -
    • -

      The FreemarkerXmlTask has two new - sub-tasks that can be used to prepare template execution with - Jython scripts: prepareModel and - prepareEnvironment. The - jython sub-task is now deprecated, and does - the same as prepareEnvironment. See the - Java API documentation for more details.

      -
    • - -
    • -

      New special variable to read the FreeMarker version - number: version. See more in the reference...

      -
    • - -
    • -

      Bugfix: Greater-than sign doesn't confuse the - eval built-in anymore.

      -
    • - -
    • -

      Bugfix: The BeansWrapper now wrapps - the null return values of methods - appropriately.

      -
    • - -
    • -

      Bugfix: The FreemarkerXmlTask doesn't - need Jython classes anymore, unless you really use Jython - scripts. Several other bugfixes in the Jython related - features.

      -
    • - -
    • -

      Bugfix: If the template exception handler has ignored - the exception, errors occurring in interpolations inside FTL - tags (e.g. <#if "foo${badVar}" != - "foobar">) were handled in the same way as errors - occuring in interpolations outside FTL tags. Thus, the - directive call was not skipped, and the problematic - interpolation was replaced with an empty string. (This was - inconsistent with the behavior of <#if - "foo"+badVar != "foobar">, which should be 100% - equivalent with the previous example.)

      -
    • - -
    • -

      Bugfix: The FileTemplateLoader is now - more robust when it receives paths that are malformed - according the native file system. In the earlier version such - paths sometimes caused unexpected - IOException that aborted the searching for - the template in further - FileTemplateLoader-s when you use the - MultiTemplateLoader.

      -
    • -
    - - - - - - - - -

    -Differences between the Release Candidate 3 and Release - Candidate 2

    - - -
    -
      -
    • -

      Bugfix: Fixing a fatal bug in the template cache that - was introduced with the latest cache ``bugfix''. The template - cache has always reloaded the unchanged template when the - update delay has been elapsed, until the template has been - actually changed, in which case it has never reloaded the - template anymore.

      -
    • -
    - - - - - - - - -

    -Differences between the Release Candidate 2 and Release - Candidate 1

    - - -
    -
      -
    • -

      Bugfix: The template cache didn't reload the template - when it was replaced with an older version.

      -
    • - -
    • -

      API JavaDoc fix: date/time related classes/interfaces - were marked as experimental. They are not experimental.

      -
    • - -
    • -

      Minor site improvements.

      -
    • -
    - - - - - - - - -

    -Differences between the Release Candidate 1 and Preview 16 - releases

    - - -
    -
      -
    • -

      Warning! Non-backward-compatible - change! The default (initial) value of the - strict_syntax setting has been changed from - false to true. When - strict_syntax is true, - tags with old syntax as <include - "foo.ftl"> will be considered as static text (so - they go to the output as-is, like HTML tags do), and not as - FTL tags. Such tags have to be rewritten to - <#include "foo.ftl">, since only - parts that starts with <#, - </#, <@, or - </@ count as FTL tags. Or, to recover - the old transitional behavior, where both legacy and new tag - syntax was recognized, you have to explicitly set - strict_syntax to false: - cfg.setStrictSyntaxMode(false). Also, for - individual templates you can force the old behavior by - starting the template with <#ftl - strict_syntax=false>. (For more information about - why strict syntax is better than old syntax read this...)

      -
    • - -
    • -

      New parameter to the ftl - directive: attributes. The value of - this attribute is a hash that associates arbitrary attributes - (name-value pairs) to the template. The values of the - attributes can be of any type (string, number, sequence... - etc.). FreeMarker doesn't try to understand the meaning of the - attributes. It's up to the application that encapsulates - FreeMarker (as a Web application framework). Thus, the set of - allowed attributes and their semantic is application (Web - application framework) dependent.

      -
    • - -
    • -

      Bugfix: - freemarker.template.utility.DeepUnwrap - unwrapped sequences to empty - ArrayList-s.

      -
    • - -
    • -

      Bugfix: If you included/imported a template with - */ in path (acquisition), and that template - in turn itself included/imported another template with - */ in path, it may failed.

      -
    • - -
    • -

      New methods to the - freemarker.core.Environment: - importLib(Template loadedTemplate, java.lang.String - namespace), - getTemplateForImporting(...), - getTemplateForInclusion(...).

      -
    • - -
    • -

      Improvements in the - java.io.IOException related error messages - of the include and - import directives.

      -
    • - -
    • -

      Minor improvements in the documentation.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 16 and Preview 15 - releases

    - - -
    -
      -
    • -

      New package: freemarker.debug. This - provides a debugging API, by which you can debug executing - templates through network (RMI). You have to write the - front-end (client), as the API is just the server side. For - more information please read the JavaDoc of the - freemarker.debug package. (The debugging - API is present for a while, just I forgot to announce it in - the version history. Sorry for that.)

      -
    • - -
    • -

      Bugfix: With the new XML wrapper, - @@markup and similar special keys:

      - -
      -
        -
      • -

        have returned - <foo></foo> for empty - elements instead of <foo />. - Other than it was needlessly verbose, it has confused - browsers if you generate HTML.

        -
      • - -
      • -

        have showed the attributes that have no explicitly - given value in the original document, just a default value - coming form the DTD.

        -
      • - -
      • -

        have forgot to put space before the system - identifier in the <!DOCTYPE - ...>.

        -
      • -
      - -
    • - -
    • -

      Bugfix: XPath with Jaxen has died with - NullPointerException if the context was an - empty node set.

      -
    • - -
    • -

      A bit more intelligent Xalan XPath error - messages.

      -
    • - -
    • -

      Revoked fallback-to-classloader logic from the template - cache.

      -
    • - -
    • -

      From now, if no XPath engine is available, and the hash - key in an ``XML query'' can't be interpreted without XPath, an - error will tell this clearly, rather than silently returning - undefined variable (null).

      -
    • - -
    • -

      Bugfix: Some templates have caused the parser to - die.

      -
    • - -
    • -

      Some other minor improvements here and there...

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 15 and Preview 14 - releases

    - - -
    -
      -
    • -

      Bugfix: The new default template cache storage - (MruCacheStorage) has started to - continually fail with NullPointerException - from a random point of time, usually when the memory usage was - high in the JVM.

      -
    • - -
    • -

      Bugfix: In error messages, when the quoted FTL directive - had nested content, that was quoted as well, so the quotation - could be very long and expose nested lines needlessly.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 14 and Preview 13 - releases

    - - -
    -
      -
    • -

      freemarker.template.TemplateMethodModel.exec - now returns Object instead of - TemplateModel.

      -
    • - -
    • -

      Fixes and improvements for XPath with Jaxen (not Xalan). - Non-node-set XPath expressions are now working. FreeMarker - variables are accessible in XPath expressions with XPath - variable references (e.g. - doc["book/chapter[title=$currentTitle]"]).

      -
    • - -
    • -

      freemarker.cache.SoftCachseStorage - and StrongCachseStorage is deprected. The - more flexible MruCachseStorage is used - instead everywhere. The default cache storage is now an - MruCachseStorage object with 0 strong size, - and infinite soft size. - Configuration.setSetting for - cache_storage now understands string values - as "strong:200, soft:2000".

      -
    • - -
    • -

      Bugfix: - freemarker.cache.MruCachseStorage has died - with ClassCastException sometimes.

      -
    • - -
    • -

      New built-ins for Java and JavaScript string escaping: - j_string and js_string

      -
    • - -
    • -

      freemarker.template.TemplateExceptionHandler.HTML_DEBUG_HANDLER - now prints more HTML-context-proof messages.

      -
    • - -
    • -

      You can query the FreeMarker version number with static - method Configuration.getVersionNumber(). - Also, the Manifest.mf included in - freemarker.jar now contains the FreeMarker - version number, furthermore, executing it with java - -jar freemarker.jar will print the version number to - the stdout.

      -
    • - -
    • -

      Added a new protected - FreemarkerServlet method: - Configuration getConfiguration().

      -
    • - -
    • -

      Bugfix: FreeMarker has frozen on empty conditional - blocks in certain contexts.

      -
    • - -
    • -

      Bugfix: Methods called twice on an object using the - list directive, as - parent.getChildren() with - <#list parent.children as child> - ...</#list>

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 13 and Preview 12 - releases

    - - -
    -
      -
    • -

      White-space stripping is now more aggressive as before: - it always removes leading and trailing white-space if the line - only contains FTL tags. (Earlier the white-space was not - removed if the tag was <#include - ...> or user-defined - directive tag with empty directive syntax as - <@myMacro/> (or its equivalents: - <@myMacro></@myMacro> and - <@myMacro></@>). Now - white-space is removed in these cases as well.) Also, - top-level white-space that separates macro definitions and/or - assignments is now ignored. More information: Template Author's Guide/Miscellaneous/White-space handling/White-space stripping

      -
    • - -
    • -

      White-space stripping can be disabled for a single line - with the nt - directive (for No Trim).

      -
    • - -
    • -

      A new directive for the declarative XML processing: - fallback

      -
    • - -
    • -

      freemarker.template.SimpleHash now - can wrap read-only Map-s, such as the map - of HTTP request parameters in Servlet API.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 12 and Preview 11 - releases

    - - -

    The only change between this and the previous preview - release is that Preview 11 had a bug where DOM trees would - never be garbage-collected.

    - - - - - - - -

    -Differences between the Preview 11 and Preview 10 - releases

    - - -
    -
      -
    • -

      Many XML related changes. Some of them are incompatible - with the previous preview releases! For a more detailed - explanation of how XML related features now work, see: XML Processing Guide

      - -
      -
        -
      • -

        Attention! Attribute queries such as - foo.@bar now return sequences - (similarly to child element queries and XPath queries), - not single nodes. Because of the rule with node sequences - of size 1, it is still good to write - ${foo.@bar}, but built-ins such as - ?exists, ?if_exists - or ?default don't work as before. For - example, instead of - foo.@bar?default('black'), you now have - to write foo.@bar[0]?default('black'). - So if you have used existence built-ins with attributes, - you have to find those occurrences in the templates and - add that [0].

        -
      • - -
      • -

        Attention! XML name-space handling has been totally - reworked and is absolutely incompatible with pre 10. Don't - worry about this if none of your XML input documents use - you use xmlns attributes. Worry, - though, if you have utilized the ``loose mode'', where - only the local name of elements were compared, because - that's now gone. Sorry...

        -
      • - -
      • -

        Attention! Special-keys @@ and - @* now return a sequence of attribute - nodes instead of the hash of them.

        -
      • - -
      • -

        Several hash keys are now working for node sequences - that store multiple nodes. For example, to get the list of - all para elements of all - chapter-s, just write - doc.book.chapter.para. Or, to get list - of title attributes of all chapter-s - write doc.book.chapter.@title.

        -
      • - -
      • -

        New special hash keys: **, - @@start_tag, - @@end_tag, - @@attribute_markup, - @@text, - @@qname.

        -
      • - -
      • -

        ?parent for attribute nodes now - returns the element node the attribute node belongs - to.

        -
      • - -
      • -

        You can use Jaxen instead of Xalan for XPath - expressions, if you call the static - freemarker.ext.dom.NodeModel.useJaxenXPathSupport() - method once. We plan to use Jaxen automatically instead of - Xalan if it is available, just the Jaxen support is not - fully functional yet.

        -
      • -
      - -
    • - -
    • -

      New special variable: .vars. This is - useful to read top-level variables with square bracket syntax, - for example .vars["name-with-hyphens"] and - .vars[dynamicName].

      -
    • - -
    • -

      New built-in, eval, to evaluate a - string as FTL expression. For example - "1+2"?eval returns the number 3.

      -
    • - -
    • -

      FreemarkerServlet now uses the - configuration's locale setting, rather than - Locale.getDefault(), to set the locale of - the templates. Also, the signature of the - deduceLocale method has been - changed.

      -
    • - -
    • -

      We have a new (beta status) - CacheStorage implementation: - freemarker.cache.MruCacheStorage. This - cache storage implements a two-level Most Recently Used cache. - In the first level, items are strongly referenced up to the - specified maximum. When the maximum is exceeded, the least - recently used item is moved into the second level cache, where - they are softly referenced, up to another specified maximum. - You can plug to try it with cfg.setCacheStorage(new - freemarker.cache.MruCacheStorage(maxStrongSize, - maxSoftSize)).

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 10 and Preview 9 - releases

    - - -
    -
      -
    • -

      The special key @@xmlns was removed - in favor of a new FTL directive for the same purpose, - <#xmlns...>.

      -
    • - -
    • -

      By default, the system is stricter about the use of - namespace prefixes. In general, you must use a prefix to - qualify subelements that are associated with an XML - nampespace. You can do this with the new - <#xmlns...> directive, but prefixes - declared in the input XML doc will actually work with no - declaration.

      -
    • - -
    • -

      Introduced a new special key called - @@text that returns all the text nodes - contained (recursively) in an element all concatenated - together.

      -
    • - -
    • -

      Either Jaxen or Xalan can be used to provide XPath - functionality. Prior versions only worked with Xalan.

      -
    • - -
    • -

      The FreemarkerServlet uses - ObjectWrapper.DEFAULT_WRAPPER by default - instead of ObjectWrapper.BEANS_WRAPPER. - What this means is that, by default, objects of type - java.lang.String, - java.lang.Number, - java.util.List, and - java.util.Map will be wrapped as - TemplateModels via the classes - SimpleScalar, - SimpleNumber, - SimpleSequence, and - SimpleHash respectively. Thus, the java - methods on those objects will not be available. The default - wrapper implementation in FreeMarker 2.3 automatically knows - how to wrap Jython objects, and also wraps - org.w3c.dom.Node objects into instances of - freemarker.ext.dom.NodeModel.

      -
    • - -
    • -

      The FreemarkerServlet base - implementation no longer deduces the locale to use from the - HttpRequest.getLocale() hook. Rather, it simply delegates to a - deduceLocale() hook that is overridable in - subclasses. The base implementation simply uses - Locale.getDefault()

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 9 and Preview 8 - releases

    - - -
    -
      -
    • -

      Fixed bugs introduced with Preview 8: XPath, - @@markup and - @@nested_markup now works with the document - node.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 8 and Preview 7 - releases

    - - -
    -
      -
    • -

      macro and assignment directives now - accept arbitrary destination variable name with quoted syntax. - For example: <#macro - "foo-bar">... or - <#assign "this+that" = 123>. This is - important, because XML element names can contain hyphen, and - it was not possible to define a handler macro for those - elements, till now.

      -
    • - -
    • -

      Special key @@content was renamed to - @@nested_markup.

      -
    • - -
    • -

      Fixed outdated XML related Manual parts (that were - outdated even in Preview 7).

      -
    • - -
    • -

      Better parse-error messages.

      -
    • - -
    • -

      Minor bugfixes here and there...

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 7 and Preview 6 - releases

    - - -
    -
      -
    • -

      Caching of XPath queries should lead to significant - performance improvements for XML processing, at least when - XPath is heavily used.

      -
    • - -
    • -

      Refinements in handling of XML namespaces in the XML - processing functionality. The new - strict_namespace_handling setting - introduced in 2.3pre6 was removed. A general-purpose solution - was arrived at that should make that configuration setting - unnecessary.

      -
    • - -
    • -

      Special key @xmlns was renamed to - @@xmlns. Reserved namespace prefix default - was renamed to @@default.

      -
    • - -
    • -

      The ftl directive now accepts - non-string types.

      -
    • - -
    • -

      New special keys were introduced for XML node wrappers - in the freemarker.ext.dom package. The - @@markup key returns the literal markup - that make up that element and the @@content - key returns all the element's markup excluding the opening and - closing tags.

      -
    • - -
    • -

      Minor bugfixes here and there...

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 6 and Preview 5 - releases

    - - -
    -
      -
    • -

      Existence built-ins (?default, - ?exists, etc.) now work with sequence - subvariables as well. Read the documentation of the - default built-in for more - information.

      -
    • - -
    • -

      The matches built-in now returns a - sequence instead of a collection.

      -
    • - -
    • -

      Refinements in handling of XML namespaces in the XML - processing functionality. A new setting, - strict_namespace_handling was introduced. - If this is set (it is off by default) any node-handling macro - used in with the visit/recurse machinery must be from a macro - library that declares in its ftl header that it handles the - namespace in question.

      -
    • - -
    • -

      Minor bugfixes here and there...

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 5 and Preview 4 - releases

    - - -
    -
      -
    • -

      The replace and - split built-ins now support - case-insensitive comparison and regular expressions (J2SE 1.4+ - only), and some other new options. More information can be - found here.

      -
    • - -
    • -

      New butilt-in for regular expression matching (J2SE 1.4+ - only): matches

      -
    • - -
    • -

      Minor bugfixes here and there...

      -
    • - -
    • -

      Manual: More browser-safe HTML-s. More updated - content.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 4 and Preview 3 - releases

    - - -
    -
      -
    • -

      Bugfix: with multi-type variables, + - operator overload for hash type had higher precedence than the - precedence of some older overloads.

      -
    • - -
    • -

      The API documentation was missing from the distribution - tar.gz.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 3 and Preview 2 - releases

    - - -
    -
      -
    • -

      XML processing: Many various bugfixes, especially with - the declarative processing.

      -
    • - -
    • -

      XML processing: the namespace_uri - built-in, the xmlnsuri header parameter, - and the TemplateNodeModel.getNodeNamespace - method were renamed to node_namespace and - getNodeNamespace respectively.

      -
    • - -
    • -

      XML processing: Better documentation. Especially, note: - XML Processing Guide

      -
    • - -
    • -

      A new header parameter, strip_text, - that removes all top-level text from a template. See ftl - directive

      -
    • - -
    • -

      Support for a variable number of macro parameters. If - the last parameter in a macro declaration ends with - ..., all extra parameters passed to the - macro will be available via that parameter. For macros called - with positional parameters, the parameter will be a sequence. - For named parameters, the parameter will be a hash.

      -
    • - -
    • -

      For BeansWrapper generated models, - you can now use the ${obj.method(args)} - syntax to invoke methods whose return type is - void. void methods now - return TemplateModel.NOTHING as their - return value.

      -
    • -
    - - - - - - - - -

    -Differences between the Preview 2 and Preview 1 - releases

    - - -
    -
      -
    • -

      The freemarker.ext.dom.NodeModel API - changed slightly. The setDocumentBuilder() - method was changed to - setDocumentBuilderFactory() because the - older scheme was not thread-safe. The - stripComments and - stripPIs methods are renamed to The - removeComments and - removePIs, and are fixed now. A new method, - simplify has been added.

      -
    • - -
    • -

      The expressions as, - in, and using are now - keywords in the template language and cannot be used as - top-level variable names without square-bracket syntax (as - .vars["in"]). If, by some chance, you have - top-level variables that use one of these names, you will have - to rename them (or use the square-bracket syntax). Sorry for - the inconvenience.

      -
    • - -
    • -

      The ?new built-in, as it was - implemented, was a security hole. Now, it only allows you to - instantiate a java object that implements the - freemarker.template.TemplateModel - interface. If you want the functionality of the - ?new built-in as it existed in prior - versions, make available an instance of the new - freemarker.template.utility.ObjectConstructor - class to your template.

      -
    • - -
    • -

      The <#recurse> directive was - broken. It did not work with a using - clause. This is now fixed.

      -
    • -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_1.html b/fmpp/docs/freemarker/versions_2_3_1.html deleted file mode 100644 index 33d6e66..0000000 --- a/fmpp/docs/freemarker/versions_2_3_1.html +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.1 - - - - - - - - -
    - - - - - -

    -2.3.1

    - - - - -

    Date of release: 2005-01-04

    Maintenance (with some important new features) and bugfix - release.

    - - - - -

    -Possible backward compatibility issue

    - - -

    There is a bugfix that may affect the behavior of you Web - application if you use JSP tags in FreeMarker templates: - FreeMarker's implementation of - javax.servlet.jsp.PageContext.getSession() was - incorrect. The getSession() method is a - convenience method by which the custom tag can get the current - HttpSession object (possibly - null if there is no session). Till now, if the - session didn't existed then it has created it automatically, so it - never returned null. This was a bug, so starting - from 2.3.1 it never creates the session, just returns - null if it doesn't exist. The old incorrect - behavior could cause page rendering to fail if the method is called - after the page is partially flushed. But beware, the old behavior - has possibly hidden some bugs of the Web application, where it - forgot to create the session, so with the new correct behavior you - may face malfunction caused by previously cloaked bugs of the Web - application. (It's the task of the MVC Controller to create the - session, except if the JSP tag that needs a session is written so it - creates it automatically, but then it doesn't expects that - getSession() will do it.)

    - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      New built-in: url. This - built-in can be used for URL escaping. Note, however, that to - use this built-in conveniently, the software that encapsulates - FreeMarker has to be 2.3.1 aware (programmers will find more - info bellow...).

      -
    • - -
    • -

      New special variables: - output_encoding and - url_escaping_charset. Note, however, that to - use these, the software that encapsulates FreeMarker has to be - 2.3.1 aware (programmers will find more info bellow...).

      -
    • - -
    • -

      New built-ins for sequences: seq_contains, - seq_index_of, - seq_last_index_of.

      -
    • - -
    • -

      New built-ins for strings: left_pad, - right_pad - and contains.

      -
    • - -
    • -

      New directive: attempt/recover

      -
    • - -
    • -

      The js_string - built-in now escapes > as - \> (to avoid - </script>).

      -
    • - -
    • -

      The sort and sort_by - built-ins now can sort by date values. Also, - sort_by built-in now can sort by the - subvarible of a subvariable of a subvariable... etc. for any - level depth. (Details...)

      -
    • - -
    • -

      freemarker.template.TemplateExceptionHandler.HTML_DEBUG_HANDLER - now prints more HTML-context-proof messages.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      New setting: output_encoding. This - setting is used for informing FreeMarker about the charset that - the enclosing software (as a Web application framework) uses for - the output of FreeMarker. It's undefined by default, and - although it is not strictly required to set it, the enclosing - software should do so. This setting must be set if templates - want to use the new output_encoding special - variable, and possibly if they want to use the new - url built-in. Note that the FreeMarker API - allows you to set settings for each template execution - individually (look at - Template.createProcessingEnvironment(...)).

      -
    • - -
    • -

      New setting: url_escaping_charset. This - is the charset used for calculating the escaped parts - (%XX) when you do - URL escaping with the new url built-in. If it - is not set, then the url built-in uses the - value of the output_encoding setting, and if - that's not set either, then the parameterless version of - url built-in (${foo?url}) - can't be used.

      -
    • - -
    • -

      Using the singleton (static) - Configuration instance is clearly a bad - practice, so related methods are now deprecated, and the Manual - was adjusted, and the FreemarkerXmlTask was - updated as well.

      -
    • - -
    • -

      The - freemarker.template.utility.Constants class - was added that contains various static final fields that store - frequently used constant TemplateModel - values, as EMPTY_SEQUENCE, - ZERO, ...etc.

      -
    • - -
    • -

      When using SecurityManager with - FreeMarker, accessing system properties may caused - AccessControlException. Now such exceptions are catched and - logged with warning level, and the default value of the property - is returned.

      -
    • - -
    • -

      The needles InvocationTargetException - is now removed from the exception cause trace in certain - cases.

      -
    • - -
    • -

      Added a dirty hack that prints - ServletException root cause in - TemplateException's stack trace if that's the - direct cause exception of the - TemplateException, despite the poorly written - ServletException class.

      -
    • - -
    • -

      Bugfix: FreeMarker's implementation of - javax.servlet.jsp.PageContext.getSession() - was incorrect. The getSession() method is a - convenience method by which the custom tag can get the current - HttpSession object (possibly - null if there is no session). Till now, if - the session didn't existed then it has created it automatically, - so it never returned null. This was a bug, so - starting from 2.3.1 it never creates the session, just returns - null if it doesn't exist. The old incorrect - behavior could cause page rendering to fail if the method is - called after the page is partially flushed. But beware, the old - behavior has possibly hidden some bugs of the Web application, - where it forgot to create the session, so with the new correct - behavior you may face malfunction caused by previously cloaked - bugs of the Web application. (It's the task of the MVC - Controller to create the session, except if the JSP tag that - needs a session is written so it creates it automatically, but - then it doesn't expects that getSession() - will do it.)

      -
    • - -
    • -

      Bugfix: The BeansWrapper didn't always - handled properly the case of a Java class having both a public - static field and a public static method with the same - name.

      -
    • - -
    • -

      Bugfix: SimpleMethodModel had - incorrectly propagate exceptions sometimes, causing null pointer - exception.

      -
    • - -
    • -

      Bugfix: The template execution may used outdated cached - values when you have processed the same - Environment for multiple times, and changed - settings between the two processings. Note that this could - happen only in single-thread environment, where such setting - modifications are allowed.

      -
    • - -
    • -

      Bugfix: Some of the string built-ins has died with - IndexOutOfBounds exception if the template - author has forgotten to specify required parameters. Now they - die with more helpful error messages.

      -
    • - -
    • -

      Bugfix: - freemarker.ext.dom.NodeModel.equals(...) has - died with null pointer exception if its argument was - null.

      -
    • - -
    • -

      Bugfix: The cause exception of - TemplateException-s was sometimes printed - twice in stack traces with J2SE 1.4 or later.

      -
    • - -
    • -

      Bugfix: The - StringUtil.FTLStringLiteralEnc(String) method - was finished.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Fixes and improvements in the Manual and in the API - JavaDoc.

      -
    • -
    - - - - - - -

    -The history of the releases before the final version

    - - - - - - - -

    -Differences between the preview release and final - release

    - - -
    -
      -
    • -

      Added a dirty hack that prints - ServletException root cause in - TemplateException's stack trace if that's - the direct cause exception of the - TemplateException, despite the poorly - written ServletException class.

      -
    • - -
    • -

      Bugfix: - freemarker.ext.dom.NodeModel.equals(...) - has died with null pointer exception if its argument was - null.

      -
    • - -
    • -

      Bugfix: The cause exception of - TemplateException-s was sometimes printed - twice in stack traces with J2SE 1.4 or later.

      -
    • - -
    • -

      More minor improvements in the Manual.

      -
    • -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_10.html b/fmpp/docs/freemarker/versions_2_3_10.html deleted file mode 100644 index c6be1fa..0000000 --- a/fmpp/docs/freemarker/versions_2_3_10.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.10 - - - - - - - - -
    - - - - - -

    -2.3.10

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2007-04-20

    This release contains several important bugfixes.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      [1589245] MultiTemplateLoader clears - its internal cached data (used for optimizing subsequent lookups - of the same template) when - Configuration.clearTemplateCache() is - invoked.

      -
    • - -
    • -

      [1619257] A bug that caused an exception when - strict_bean_model was used in a FreeMarker - configuration Properties object or in the - <#setting .../> directive has been - fixed.

      -
    • - -
    • -

      [1685176] A bug that caused - StackOverflowError in certain interactions of - garbage collector with MRU cache under Sun's Java 6 JVM has been - fixed.

      -
    • - -
    • -

      [1686955] When ResourceBundleModel - constructs MessageFormat objects, it passes - them its own locale. More - info...

      -
    • - -
    • -

      [1691432] A bug that caused - BeansWrapper.EXPOSE_SAFE to be no safer than - BeansWrapper.EXPOSE_ALL has been - fixed.

      -
    • -
    - - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      [1628550] You can now use - dateExp?string.full for formatting dates - using Java built-in format - java.util.Date.FULL More info...

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_11.html b/fmpp/docs/freemarker/versions_2_3_11.html deleted file mode 100644 index 46f8b93..0000000 --- a/fmpp/docs/freemarker/versions_2_3_11.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.11 - - - - - - - - -
    - - - - - -

    -2.3.11

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2007-12-04

    This release contains several performance and usability - improvements.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Bug fixed: [1687248] - Warning! This bugfix may breaks some - templates! Fixed the bugs of the c built-in - (?c) that sometimes caused whole numbers to - be formatted with ``.0'' at the end (like: 1.0), and caused - numbers sometimes formatted to exponential form (like 4E-20). - From now whole numbers will never use decimal dot (not even if - the wrapped number is a double; remember, the - template language knows only a single numerical type), and - exponential form will never be used either. Also, the maximum - number of digits after the decimal dot was limited to 16, so - numbers smaller than 1E-16 will be shown as 0.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      FreeMarker now has much better JSP 2.0 and JSP 2.1 - compliance. Most notably, the JSP 2.0 - SimpleTag interface is now supported. - Additionally, even when run in an environment that doesn't have - its own JSP implementation, the FreeMarker JSP runtime will make - available its own implementation of - JspFactory and - JspEngineInfo to tags when JSP 2.0 API JAR is - available in classpath, as well as an implementation of - JspApplicationContext when JSP 2.1 API JAR is - available in classpath.

      -
    • - -
    • -

      A new model interface, - TemplateDirectiveModel provides an easier - paradigm for implementing user-defined directives than - TemplateTransformModel did previously. - TemplateTransformModel will be - deprecated.

      -
    • - -
    • -

      FreeMarker now finds the Xalan-based XPath support - included in Sun JRE/JDK 5 and 6, so no separate Xalan jar is - required for the XPath support to work. (However, we recommend - Jaxen over Xalan, as the FreeMarker XPath support is more - complete with that. Of course for that the Jaxen jar is still - needed.)

      -
    • - -
    • -

      Wrapping performance of BeansWrapper - has been significantly improved by eliminating repetitive - execution of various class tests.

      - -

      Note for - BeansWrapper customizers: - subclasses of BeansWrapper that previously - overrode getInstance(Object, ModelFactory) - method should now instead override - getModelFactory(Class) to take advantage of - this improvement. Overriding the old method still works, but it - will not take advantage of the performance improvement.

      -
    • - -
    • -

      Memory footprint of a wrapper created by - BeansWrapper has been reduced (by a size of - one default-sized HashMap) until methods or - indexed properties are accessed on it (simple properties can be - accessed without increasing memory footprint).

      -
    • - -
    • -

      Rhino objects can be used in templates as scalars, - numbers, and booleans, following the JavaScript conversion - semantics for these types.

      -
    • - -
    • -

      .data_model is now a - TemplatHashModelEx when possible. This means - that the list of the data-model variable names usually can be - get with .data_model?keys.

      -
    • - -
    • -

      FileTemplateLoader can now optionally - allow following symlinks that point out of the base directory. - It is disabled by default for backward compatibility.

      -
    • - -
    • -

      Bug fixed: [1670887] - TaglibFactory taglib matching did not follow - JSP 1.2 FCS.

      -
    • - -
    • -

      Bug fixed: [1754320] - Bug in setXPathSupportClass prevented - plugging in a user-supplied XPathSupport - implementation.

      -
    • - -
    • -

      Bug fixed: [1803298] - Parser error while parsing macro with loop variables

      -
    • - -
    • -

      Bug fixed: [1824122] - Loading templates from JAR files could lead to leaking of file - handles (due to a bug in the Java API implementation of - Sun).

      -
    • - -
    • -

      Bug fixed: Cached template is now removed from the cache - if the re-loading of the modified template file fails, so no - staled template is served.

      -
    • -
    - - - - - - -

    -Documentation changes

    - - -
    -
      -
    • -

      Substantial reworkings in the Template Authors's Guide - (which was previously called Designer's Guide), especially in - the Getting Started section.

      -
    • - -
    • -

      #{...} is documented as deprected - construct from now.

      -
    • - -
    • -

      The "transform" term is now removed from the - documentation. Instead the more general "user-defined directive" - term is used, which encompasses macros, - TemplateTransformModel-s and the new - TemplateDirectiveModel-s, which are just - different ways of implementing user-defined directives.

      -
    • - -
    • -

      Some more minor improvements in the Manual.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_12.html b/fmpp/docs/freemarker/versions_2_3_12.html deleted file mode 100644 index 5597dc9..0000000 --- a/fmpp/docs/freemarker/versions_2_3_12.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.12 - - - - - - - - -
    - - - - - -

    -2.3.12

    - - -

    Date of release: 2008-02-03

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bug fixed: [1857161] - JSP SimpleTag support was broken in - 2.3.11.

      -
    • - -
    • -

      In the templates, now you can conveniently call Java - methods that use the Java 5 varargs feature (variable-length - argument lists). Also the overloaded-method chooser logic now - considers vararg methods more intelligently.

      -
    • - -
    • -

      Enum constants are now identified by their - name() instead of by their - toString() (because the latter can be - overridden in subclasses). This doesn't affect the way enum - constants are printed; of course that still uses - toString().

      -
    • - -
    • -

      Messages in parser exceptions now display the name of the - template.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_13.html b/fmpp/docs/freemarker/versions_2_3_13.html deleted file mode 100644 index faf35be..0000000 --- a/fmpp/docs/freemarker/versions_2_3_13.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.13 - - - - - - - - -
    - - - - - -

    -2.3.13

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2008-05-05

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      New built-ins for rounding numbers: - round, floor, - ceiling. See more here...

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      [1898300], - [1818742], - [1780882]: - Reworked template caching mechanism for radically improved - concurrent performance, with help from Azul Systems engineers. - (Achieved 20x speedup with Struts2 webapps on a 128-CPU Azul - device compared to 2.3.12.) Also, template loading (including - parsing) errors are now cached, improving performance in - applications that often try to get missing templates.

      -
    • - -
    • -

      [1892546] - Allow for custom TemplateLoader in - FreemarkerServlet.

      -
    • - -
    • -

      Bug fixed: [1725107] - Using the FreeMarker JSP taglib support with Servlet 2.4 may - generates XML validation warnings.

      -
    • - -
    • -

      Bug fixed: [1939742] - ConcurrentModificationException on accessing - nonexistent SimpleHash entries in a - loop

      -
    • - -
    • -

      Bug fixed: [1902012] - IteratorModel eats exception causes

      -
    • - -
    • -

      Bug fixed: <#assign - x></#assign> (empty nested content) has - caused NullPointerException

      -
    • - -
    • -

      Bug fixed: [1926150] - CachedTemplate should be serializable

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_14.html b/fmpp/docs/freemarker/versions_2_3_14.html deleted file mode 100644 index 5c2f246..0000000 --- a/fmpp/docs/freemarker/versions_2_3_14.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.14 - - - - - - - - -
    - - - - - -

    -2.3.14

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2008-09-01

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      New built-in: xhtml. See more here...

      -
    • - -
    • -

      New special variable: template_name. - See more here...

      -
    • - -
    • -

      Now you can use the values of parameters as the defaults - of other parameters, for example <#macro section - title label=title>. In earlier versions it worked - unreliably. There are no restriction regarding the order of - parameters, like <#macro section label=title - title> works too.

      -
    • - -
    • -

      Added a new number format - specifier, computer. This uses the - same formatting as - exp?c.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      The constructor to - freemarker.ext.servlet.AllHttpScopesHashModel - is now public, allowing it to be reused in 3rd party web - frameworks.

      -
    • - -
    • -

      Bugfix: - freemarker.ext.beans.SimpleMapModel (unlike - either freemarker.ext.beans.MapModel or - freemarker.template.SimpleHash) didn't allow - lookup by java.lang.Character key when passed - a single-character string as a key.

      -
    • - -
    • -

      Bugfix: permissive unwrapping in - freemarker.template.utility.DeepUnwrap class - was not recursively permissive with elements of sequences and - hashes.

      -
    • - -
    • -

      Bugfix: freemarker.ext.beans.MapModel - returns BeansWrapper.wrap(null) instead of - null for null values - explicitly bound into the map.

      -
    • - -
    • -

      Bugfix: Fixed a subtle bug with property getters of - classes implementing a type-parametrized interface.

      -
    • - -
    • -

      Bug fixed: A further corner case of [1939742].

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_15.html b/fmpp/docs/freemarker/versions_2_3_15.html deleted file mode 100644 index b14121c..0000000 --- a/fmpp/docs/freemarker/versions_2_3_15.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.15 - - - - - - - - -
    - - - - - -

    -2.3.15

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2008-12-16

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Bug fixed: Hash concatenation (like hash1 + - hash2) shuffled the order of keys/values even if both - hashes were ordered.

      -
    • - -
    • -

      In web pages that are based on the - FreemarkerServlet, you can now use - <@include_page path="..."/> to use - servlet includes. See more here...

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      The BeansWrapper can automatically - detect that classes were reloaded by JavaRebel.

      -
    • - -
    • -

      Fixed a bug that caused null to be - returned from - Environment.getCurrentEnvironment() while - processing autoincludes and autoimports. (See - bug report)

      -
    • - -
    • -

      Fixed a bug that caused - getObject(Object) method on POJOs to not be - recognized as a general get method.

      -
    • - -
    • -

      Substantially improved performance of the - <#break> directive.

      -
    • - -
    • -

      DeepUnwrap now unwraps custom null - model of the current object wrapper into a Java - null.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_16.html b/fmpp/docs/freemarker/versions_2_3_16.html deleted file mode 100644 index d31e3fa..0000000 --- a/fmpp/docs/freemarker/versions_2_3_16.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.16 - - - - - - - - -
    - - - - - -

    -2.3.16

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2009-12-07

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Fixed a bug that caused incorrect unwrapping of sequences - to Java arrays (See - bug report)

      -
    • - -
    • -

      Fixed a bug that caused rounding of float and double - values (See - bug report)

      -
    • - -
    • -

      Created a new - freemarker.runtime.attempt category and - exceptions caught in <#attempt> blocks - are logged into it at a DEBUG severity.

      -
    • - -
    • -

      Fixing the (ages old) problem of - RhinoWrapper not working with all versions of - Rhino because of binary incompatible change of Rhino's - Undefined.instance.

      -
    • - -
    • -

      Fixed bug where TextUtil.XMLEncNQG - didn't escape ]]> as - ]]&gt;.

      -
    • - -
    • -

      Fixed bug where the root directory couldn't be used as the - template base directory, as - FileTemplateLoader believed that the template - is outside the base directory.

      -
    • - -
    • -

      Macro names can no longer be changed through the - API.

      -
    • - -
    • -

      FreemarkerServlet now cooperates with Session Fixation - Attack Protection in Spring Security, see - forum discussion for details.

      -
    • - -
    • -

      Substantially improved performance of the - <#return> directive.

      -
    • -
    - - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Fixed bug where - anXMLNode.@@markup - and @@nested_markup didn't escape - ]]> as - ]]&gt;.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_17.html b/fmpp/docs/freemarker/versions_2_3_17.html deleted file mode 100644 index e3b60b0..0000000 --- a/fmpp/docs/freemarker/versions_2_3_17.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.17 - - - - - - - - -
    - - - - - -

    -2.3.17

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2011-05-17

    It's possibly urgent to update to this version because of a - security fix!

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      ?seq_index_of and - ?seq_last_index_of now works on collections - (freemarker.template.TemplateCollectionModel-s) - too, not only on sequences - (freemarker.template.TemplateSequenceModel-s).

      -
    • - -
    • -

      ?long now works for date, date-time or - time values, and returns the milliseconds since the epoch (as - java.util.Date.getTime()).

      -
    • - -
    • -

      To convert numbers (usually Java - long-s) to date or date-time and time values, - ?number_to_date, - ?number_to_time, - ?number_to_datetime was added. See more here... - (Unfortunately, ?date and like can't be - extended to support this due to backward compatibility - issues.)

      -
    • - -
    • -

      New built-ins to format numbers with ISO 8601 "extended" - format regardless of the current date/time formatting settings, - and even regardless of the current time zone setting. For - example ${myTimeStamp?iso_utc} will print - something like 2010-05-16T23:05:45Z. See more here...

      -
    • - -
    • -

      New special variable, - now. This returns the current date-time. - Usage examples: "Page generated: ${.now}", - "Today is ${.now?date}", "The - current time is ${.now?time}".

      -
    • - -
    • -

      ?sort and ?sort_by - now supports sorting boolean values.

      -
    • - -
    • -

      When using unsupported or unknown string built-in flags, - FreeMarker will now log - warnings (maximum 25 times per class-loader, to prevent flooding - the log). It's certain that starting from FreeMarker 2.4 these - will count as errors.

      -
    • - -
    • -

      Bug fixed [3047201]: - Using regular expressions (like with ?match) - could cause lockup in multi-threaded environment, also memory - leakage when using dynamically generated regular - expressions.

      -
    • - -
    • -

      Bug fixed: ?seq_contains, - ?seq_index_of and - ?seq_last_index_of has failed with - non-java.util.List - java.util.Collection-s that are wrapped with - pure BeansWrapper (not the - DefaultObjectWrapper) as - TemplateSequenceModel. (See also: - getSupportsIndexedAccess() below)

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Security fix: - Using carefully crafted template names (template paths) that - contain code point 0 ('\u0000'), it was - possible to load files from outside the template root directory - like if they were FreeMarker templates. The root of the problem - is that the underlying native C/C++ part (which belongs to the - Java platform or to the OS) interprets the 0 as the end of the - string, while Java (and hence FreeMarker and the Servlet - container) doesn't. Thus a path that looked safe for FreeMarker - become unsafe on the lower level. The problem is present with - all ways of loading templates by name - (Configuration.getTemplate(...), - <#include - ...>, - <#import - ...>).

      - -

      You are not affected if you don't allow users to upload - templates and also at least one of these stands:

      - -
      -
        -
      • -

        In your system users can't provide arbitrary strings - as template names (template paths). For example, if users - are only allowed to visit the URL-s that belong to the MVC - Controller (like they can't visit *.ftl) - then they can't suggest arbitrary template names.

        -
      • - -
      • -

        The template names are part of the path in the Web - page URL, and your webserver or Servlet container disallows - URL-s that contain %00, or terminate the - URL at it before passing it to the servlets.

        -
      • - -
      • -

        You are using FileTemplateLoader - and linking is not allowed in it (by default it isn't - allowed).

        -
      • -
      - -
    • - -
    • -

      FreeMarker now can log its messages directly using SLF4J - or Apache Commons Logging. However, it will not use these logger - libraries automatically, until 2.4; see more here... But it's - recommended to switch to SLF4J now.

      -
    • - -
    • -

      New setting: "auto_flush", - Configurable.setAutoFlush(boolean). Sets - whether the output Writer is automatically - flushed at the end of Template.process(Object, - Writer) (and its overloads). The default is - true, which corresponds to the earlier - behavior. Using false is needed for example - when a Web page is composed from several boxes (like portlets, - GUI panels, etc.) that aren't inserted with - #include (or with similar directives) into a - master FreeMarker template, rather they are all processed with a - separate - Template.process(...) - call. In a such scenario the automatic flushes would commit the - HTTP response after each box, hence interfering with full-page - buffering, and also possibly decreasing performance with too - frequent and too early response buffer flushes.

      -
    • - -
    • -

      Added new setting: - Configuration.setNewBuiltinClassResolver(TemplateClassResolver), - or new_builtin_class_resolver property. This - allows you to specify how the new built-in - (like in "com.example.SomeClass"?new()) - resolves classes and which classes are accessible at all. If you - are allowing not-so-much-trusted users to upload templates, you - should be definitely interested; see the Java API docs of - freemarker.core.Configurable.setSetting and - freemareker.template.Configuration.setNewBuiltinClassResolver. - Otherwise it's still recommended to set this to - TemplateClassResolver.SAFER_RESOLVER (or - safer if you are using properties), although - that's not 100% backward compatible (see Java API docs) .

      -
    • - -
    • -

      Added - freemarker.cache.NullCacheStorage: Setting - this as the cache storage in Configuration - disables caching.

      -
    • - -
    • -

      Added getSupportsIndexedAccess() to - freemarker.ext.beans.CollectionModel, so one - can check if TemplateSequenceModel.get(int) - will work with a particular CollectionModel - instance or not.

      -
    • - -
    • -

      Bug fixed [2992265]: - JSP FreeMarkerPageContext.include behaved - incorrectly.

      -
    • - -
    • -

      Bug fixed: When using FreeMarker's JSP support with JSP - tags that use - javax.servlet.jsp.PageContext.pushBody (like - some Stripes tags), "ArrayIndexOutOfBoundsException: - -1" occurred inside - freemarker.ext.jsp.FreeMarkerPageContext.popWriter.

      -
    • - -
    • -

      Bug fixed [3033015]: - AllHttpScopesHashModel used - WrappingTemplateModel.getDefaultObjectWrapper() - for wrapping variables in the page scope, while used the - user-specified ObjectWrapper for all other - scopes (request, session, etc.). Now it uses the user-specified - wrapper in the page scope as well.

      -
    • - -
    • -

      Bug fixed [3128073]: - HashAdapther.containsKey(...) returned - true for a key that doesn't exist when - unwrapping the key has failed. As a side effect of the fix, - BeansWrapper.CAN_NOT_UNWRAP is now private; - earlier it was public by mistake.

      -
    • - -
    • -

      Big fixed [3151085]: - freemarker.jsp.TaglibFactory didn't locate - tld files properly. This fix gives better compliance with JSP - specification for resolving and loading tld files.

      -
    • - -
    • -

      Bug fixed: Unwrapping null with a - BeansWrapper that had a custom null-model - didn't result in null. Now both unwrapping - null and the custom null-model gives - null.

      -
    • - -
    • -

      Log messages doesn't contain line-breaks (CR or LF) - anymore and quote paths and other arbitrary text with Java - string literal syntax that also escapes < - characters as \u003C. These address security - concerns related to poor quality log appenders and buggy log - readers. This change is mostly noticeable on template processing - error entries, which will now quote the exception message. Note - that how stack traces (the Throwable objects) - are logged is still up to the logging framework you are - using.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      The DTD-s and XSD-s that are included in - freemarker.jar under - freemarker/ext/jsp are now under Apache - Software License, Version 2. This is also clarified in the - LICENSE.txt. Earlier these files had no clear - license terms.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_18.html b/fmpp/docs/freemarker/versions_2_3_18.html deleted file mode 100644 index ce709da..0000000 --- a/fmpp/docs/freemarker/versions_2_3_18.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.18 - - - - - - - - -
    - - - - - -

    -2.3.18

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2011-05-21

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix [3304568]: - 2.3.17 didn't find TLD-s in WEB-INF\lib\*.jar - unless they were explicitly pointed in the - web.xml with a taglib - element. This bug was introduced in 2.3.17.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Added LICENSE.txt and - NOTICE.txt to - freemarker.jar under - META-INF.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_19.html b/fmpp/docs/freemarker/versions_2_3_19.html deleted file mode 100644 index 7e36441..0000000 --- a/fmpp/docs/freemarker/versions_2_3_19.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.19 - - - - - - - - -
    - - - - - -

    -2.3.19

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2012-02-29

    Don't miss the security related - changes, they may affect your application!

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Attention: The output of ISO 8601 date/time formatting - built-ins, introduced in 2.3.17, was slightly changed. - From now on, the time zone offset, when it's displayed and it - isn't Z, always includes the minutes. For - example, 15:30:15+02 becomes to - 15:30:15+02:00 in the template output. Both - formats are valid according to ISO 8601 (so anything that - expects ISO 8601 date/times should continue working), but only - the last format complies with the XML Schema date/time formats, - hence this change.

      -
    • - -
    • -

      New built-in for escaping inside JSON string literals: - json_string.

      -
    • - -
    • -

      Bugfix: Wrong # tags were printed as - static text instead of causing parsing error if there was no - correct # tag earlier in the same template. - Since fixing this would not be 100% backward compatible, the old - behavior has remained, unless you set the - incompatible_enhancements setting - (Configuration.setIncompatibleEnhancements(String)) - to "2.3.19" or higher.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Attention: This - release contains two important security workarounds that - unavoidably make it obvious how some applications can be - exploited. FreeMarker can't solve these issues on all - configurations, so please read the details instead of just - updating FreeMarker! Also, these changes are not 100% - backward compatible in theory, however it's not probable that - they will break anything. The two changes are:

      - -
      -
        -
      • -

        The character with character code 0 - (\u0000) is not allowed in template paths - anymore. When a path contains it, FreeMarker behaves as if - the template was not found.

        - -

        This is to fix the security problem where a template - path like "secret.txt\u0000.ftl" is used - to bypass extension filtering in an application. FreeMarker - itself doesn't care about the extension, but some - applications decide based on the extension if they will - delegate a path to FreeMarker. When they do with such a - path, the C/C++ implementation behind the storage mechanism - may sees the path as "secret.txt" as the - 0 terminates the string in C/C++, and thus load a non-FTL - file as a template, returning the file contents to the - attacker.

        - -

        Note that some HTTP servers, notably Tomcat and the - Apache HTTP Server blocks URL-s where the URL contains 0 - (%00) outside the query string, thus this - wasn't exploitable there through such Web URL-s. Some other - HTTP servers however, like Jetty, doesn't block such - URL-s.

        -
      • - -
      • -

        ClassTemplateLoader, when it's - created with base path "/" (like with - new ClassTemplateLoader(someClass, "/")), - will not allow template paths that contain colon earlier - than any /, and will act like if the - template was not found in such case.

        - -

        This is to fix the security problem where a template - path like "file:/etc/secret" or - "http://example.com/malware.ftl" is - interpreted as a full URL by a - java.net.URLClassLoader in the - class-loader hierarchy, and thus allow loading files from - these URL-s as templates. This is a quirk (or bug) of - java.net.URLClassLoader, thus this - problem only exists on systems that use such - class-loaders.

        - -

        Beware, some frameworks use their own - TemplateLoader implementations, and if - those are vulnerable, they will remain so after updating - FreeMarker too! Note that this exploit only works if the - class-loader hierarchy contains an - URLClassLoader and the class-loader is - used to load templates without adding any prefix before the - template path (other than "/").

        -
      • -
      - - -

      These security issues mostly only affect applications - where the user (the visitor) can supply arbitrary - template paths to the application. This is not the - case with properly built MVC applications, as there only the MVC - Controller can be addressed directly, and it's the Controller - that specifies the template paths. But legacy MVC applications - based on JSP - Model-2 often expose the MVC Views as public URL-s ending - with .ftl, thus allowing the user to give - arbitrary paths to FreeMarker. Such applications should be - secured with a security-constratint in - web.xml as shown in the related Manual - section. This should be done regardless of the current - security fixes.

      - -

      In general, you should not allow users to specify - arbitrary template paths, or if you do allow that, you should be - extra careful with the TemplateLoader - used.

      -
    • - -
    • -

      Configuration has new methods: - removeTemplateFromCache(...). This will - remove the given template for the given locale from the cache, - so it will be re-loaded regardless of the template update delay - when it's next time requested.

      -
    • - -
    • -

      BeansWrapper ignores setter methods - from now when introspecting classes. They weren't used anyway, - so they unnecessarily caused - "java.beans.IntrospectionException: type - mismatch between read and write methods" errors.

      -
    • - -
    • -

      TemplateClassResolver.SAFER_RESOLVER - now disallows creating - freemarker.template.utility.JythonRuntime and - freemarker.template.utility.Execute. This - change affects the behavior of the new built-in - if FreeMarker was configured to use - SAFER_RESOLVER, which is not the default - until 2.4 and is hence improbable.

      -
    • - -
    • -

      Bug fixed: Calling varargs methods now indeed works. - (Earlier it only worked for overloaded methods.)

      -
    • - -
    • -

      Bug fixed [1837697] - [2831150] - [3039096] - [3165425]: - Jython support now works with Jython 2.2 and 2.5.

      -
    • - -
    • -

      Bug fixed [3325103]: - TemplateException-s and - ParseException-s are now serializable.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_2.html b/fmpp/docs/freemarker/versions_2_3_2.html deleted file mode 100644 index 6192e68..0000000 --- a/fmpp/docs/freemarker/versions_2_3_2.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.2 - - - - - - - - -
    - - - - - -

    -2.3.2

    - - -

    Date of release: 2005-01-22

    Bugfix release.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: If you use JSP taglibs in FreeMarker templates, - FreeMarker possibly tried to get DTD-s from the Sun Web site - because of a bug introduced with FreeMarker 2.3.1. This was a - serious problem since if your server is offline or the Sun Web - site becomes temporarily inaccessible the templates that are - using JSP taglibs will possibly die with error.

      -
    • - -
    • -

      Bugfix: The DefaultObjectWrapper has - ignored the value of the nullModel property. - (Note that it's discouraged to use a ``null model''.)

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_20.html b/fmpp/docs/freemarker/versions_2_3_20.html deleted file mode 100644 index a69ab5d..0000000 --- a/fmpp/docs/freemarker/versions_2_3_20.html +++ /dev/null @@ -1,774 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.20 - - - - - - - - -
    - - - - - -

    -2.3.20

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2013-06-27

    If you are IDE/tools author, note these changes.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Error message quality improvements:

      - -
      -
        -
      • -

        Many error messages are now more helpful, especially - for users who are not experienced with FreeMarker. For - example, some of the most common user mistakes are - recognized and tips are shown to fix them, reducing support - costs or the time employees spend to figure them out.

        -
      • - -
      • -

        It's now ensured that the error location in the - template is included in the message returned by - TemplateException.getMessage(). The stack - trace always showed this information anyway, but some users - only see the "message", not the stack trace, - and that often didn't contained the location.

        -
      • - -
      • -

        The template language part of the stack trace is now - more detailed, and easier to understand. This is especially - helpful in applications that use a complex library of macros - and functions.

        -
      • - -
      • -

        Several smaller bugs were fixed that made the error - information wrong or lacking.

        -
      • - -
      • -

        The layout of the error messages is now more - consistent, and generally easier to read.

        -
      • -
      - -
    • - -
    • -

      Changes regarding boolean to string conversions and - formatting:

      - -
      -
        -
      • -

        ?c (computer-language formatting) - now works with booleans too, always giving - "true" or "false" - regardless of the boolean_format. This - way it's safe for generating JavaScript in a context where - human-readable text is also rendered.

        -
      • - -
      • -

        If the boolean_format setting is - set to anything but the default - "true,false" value, boolean values will - be automatically converted to string where a string value is - expected by the template language, instead of giving an - error. This helps you spare - those?string-s after boolean values. This - is the same logic as with numbers and dates, which were - always automatically converted to string, according the - corresponding format setting. Except, the provided default - boolean format is useless for automatic conversion (but it's - still there for ?string, for backward - compatibility), hence it must be set manually. (We certainly - couldn't come up with a sensible default anyway, as for - booleans it depends too much on the application, not to - mention the localisation issues.)

        - -

        Exactly like with numbers and dates, automatic - conversion doesn't happen in these cases:

        - -
        -
          -
        • -

          Comparisons, i.e., someBoolean == - 'true' is still an error

          -
        • - -
        • -

          Method calls where the declared type of the - parameter is String but the actual - value is a boolean; still an error

          -
        • - -
        • -

          When the boolean value is used as key in - expr[key], - it's still an error (there was no automatic conversion - there for other types either, as numerical and string - keys have different meaning)

          -
        • - -
        • -

          The opposite direction, i.e., string to boolean - conversion; won't happen

          -
        • -
        - -
      • -
      - -
    • - -
    • -

      New built-ins for numbers: abs, is_nan, - is_infinite. - Like n?abs will give the absolute value of - n.

      -
    • - -
    • -

      New built-in for sequences: join. Like - [1, 2, 3]?join(", ") will give the string - "1, 2, 3".

      -
    • - -
    • -

      If you set the - incompatible_improvements setting (see here) - to 2.3.20 or higher, ?html - will escape apostrophe-quotes just like - ?xhtml does. Utilizing this is highly - recommended, because otherwise if interpolations are used inside - attribute values that use apostrophe-quotation (<foo - bar='${val}'>) instead of plain quotation mark - (<foo bar="${val}">), they might - produce HTML/XML that's not well-formed. Note that - ?html didn't do this because long ago there - was no cross-browser way of doing this, but it's not a real - concern anymore. Also note that this will be the default - behavior starting from 2.4.

      -
    • - -
    • -

      Bug fix [390] - (and other improvements): ?js_string and - ?json_string didn't escape the - u2028-u2029 line - terminators (problem for JavaScript) and the - u007F-u009F control - characters (maybe a problem in JSON, depending on - implementation). Furthermore, the escaping of - \, <, and - > become safer in that now they are - escaped whenever it can't be guaranteed that they won't be part - of <!, ]]> or - </. Earlier they were only escaped when it - was known that they are part of these patterns, thus it was - possible to assemble these patterns from two adjacent - interpolations. Additionally, from now on - <? and --> also - count as dangerous patterns, and will trigger - < and > - escaping.

      -
    • - -
    • -

      Bug fixed: The following string built-ins didn't coerce - the numerical, date (and now the boolean) left-values to string, - instead they threw a type error: contains, - index_of, last_index_of, - left_pad, right_pad, - matches, replace, - split, new. The other - string built-ins already did this conversion for a long time; - this was an accidental inconsistency.

      -
    • - -
    • -

      Bug fixed: With the default arithmetic engine, it's now - supported to compare infinite (positive or negative) with 0, to - decide its sign.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      BeansWrapper introspection cache - improvements:

      - -
      -
        -
      • -

        Added public API to BeansWrapper - for clearing the class cache: - clearClassIntrospecitonCache(), - removeFromClassIntrospectionCache(Class)

        -
      • - -
      • -

        Significantly improved multi-core performance:

        - -
        -
          -
        • -

          Uses ConcurrentHashMap when - running on Java 5 or later.

          -
        • - -
        • -

          The cache won't block readers while introspecting - a class after a cache miss

          -
        • - -
        • -

          If multiple threads need to introspect the same - class that's not in the cache yet, only one of them will - do it, the others will wait for its results.

          -
        • -
        - -
      • - -
      • -

        Bug fix [361]: - There was a small chance of deadlock when class-reloading - was detected. Locking was redesigned to prevent such - oversights in the future.

        -
      • - -
      • -

        The internal package-visible - freemarker.ext.beans API was slightly - changed as the result of internal cleanup. Nobody but the - FreeMarker developers should define classes in that package, - so it shouldn't break anything. But if somebody did some - in-house hacks there, re-compile to see if it still - works.

        -
      • -
      - -
    • - -
    • -

      Nameless templates (those directly created with - new Template(null, - ...) instead of loaded - through Configuration) couldn't include or - import other templates, and thrown a - NullPointerException when they tried to. Now - they resolve relative paths as if they were in the template root - directory.

      -
    • - -
    • -

      Bug fix: Regular expression built-ins and some logger - libraries (most importantly Log4J) were unavailable on the - Google App Engine platform. This fix is only present in the - GAE-compatible build, 2.3.20-gae.

      -
    • - -
    • -

      Added new method to Configuration: - CacheStorage getCacheStorage()

      -
    • - -
    • -

      Added new methods to Environment to - make comparisons among TemplateModel-s - according the rules of the template language operators: - applyEqualsOperator, - applyEqualsOperatorLenient, - applyLessThanOperator, - applyLessThanOrEqualsOperator, - applyGreaterThanOperator, - applyWithGreaterThanOrEqualsOperator

      -
    • - -
    • -

      Added new method, - Environment.isInAttemptBlock() to check if we - are within an #attempt block. This can be - useful for TemplateExceptionHandler-s, as - then they don't need to print the error to the output since - #attempt will roll it back anyway. This is - already utilized by the built-in - TemplateExceptionHandler-s - (DEBUG_HANDLER and - HTML_DEBUG_HANDLER).

      -
    • - -
    • -

      Added convenience constructor Template(String - name, String sourceCode, Configuration cfg).

      -
    • - -
    • -

      TemplateException-s and - TemplateModelExcepton-s now can have - Throwable cause, not just - Exception (it was an old oversight that - somehow wasn't fixed so far).

      -
    • - -
    • -

      Parsing error messages under the JBoss Tools FreeMarker - IDE now doesn't contain the usual location line, so that the - actual error description is immediately visible in the Eclipse - "Problems" view. (It's a "hack" in - FreeMarler itself; it tries to detect if it runs under the - plugin and then changes its behavior.)

      -
    • - -
    • -

      Mostly concerning tool (like IDE plugin) authors:

      - -
      -
        -
      • -

        The error message formats (what - Throwable.getMessage() returns) were - heavily changed for TemplateException-s, - and somewhat for ParseException-s. It's - unlikely that anybody depends on these, but if you tried to - parse these messages, be aware of this.

        -
      • - -
      • -

        Fixed bug where ParseException has - contained 0 as line and column number for lexical errors. - Now it contains the correct information.

        -
      • - -
      • -

        Added - ParseException.getEditorMessage(): As in - IDE-s the error markers show the error location to the user - already, the location should not be repeated in the error - message. So in IDE-s you should use this method instead of - getMessage(). (Under JBoss Tools: - FreeMarker now tries to detect that it - runs under the plugin, and then it already does this, except - that it still shows the column number as that's missing from - the error marker location.)

        -
      • - -
      • -

        Added - ParseException.getTemplateName()

        -
      • - -
      • -

        Added - Configuration.getSupportedBuiltInNames(). - As new built-ins - (expr?builtin_name) - are very often added to new FreeMarker versions, - auto-completion or syntax highlighting should use this set - instead of a fixed set of a names.

        -
      • - -
      • -

        The format returned by - TemplateElement.getDescription() was - heavily changed. It's what FTL stack traces and maybe some - outline views (tree-views) show. It was always for human - reading (and till now was too inconsistent for anything - else), so it's unlikely that this breaks anything.

        -
      • - -
      • -

        There were some smaller changes in - freemarker.debug, and it's expected that - there will be more, so it was marked as experimental. As far - as we know, nobody used it, so it shouldn't break - anything.

        -
      • -
      - -
    • - -
    • -

      In experimental status only, but - freemarker.jar is now an OSGi bundle (see - freemarker.jar/META-INF/MANIFEST.MF). - Depending on user feedback, the bundle description may change in - the future. So please give feedback, especially if you are an - OSGi expert!

      -
    • - -
    • -

      Improved the HTML generated by - HTML_DEBUG_HANDLER (the - red-on-yellow-background error message). Most importantly, now - it will word-wrap. Other changes are minor, like now it can - break out of CDATA sections, or now it has less intense - colors.

      -
    • - -
    • -

      New Template method, - getActualTagSyntax(): Tells if the template - is using traditional or square-bracket syntax. As the syntax can - be overridden in the template, also it's possibly decided by - auto-detection, it wasn't trivial to it tell till now.

      -
    • - -
    • -

      Added some utility methods that are useful for generating - error messages in custom directives: - ClassUtil.getFTLTypeDescription(TemplateModel), - getShortClassName, - getShortClassNameOfObject

      -
    • - -
    • -

      Bug fix [364]: - freemarker.template.EmptyMap (which is passed - to TemplateDirectiveModel-s if there are no - parameters) now allows remove(key), - clear() and - putAll(anyEmptyMap) as these do nothing - anyway.

      -
    • - -
    • -

      Bug fix [375]: - NullPointerException on IBM J9 VM (not on the - Sun/Oracle implementation) in BeansWrapper - when the Java implementation legally returns - null for some BeanInfo - getters.

      -
    • - -
    • -

      Bug fix: Cloning a Configuration didn't - deep-clone the data structures storing the - auto_imports and - auto_includes settings, hence possibly - leading to aliasing problems.

      -
    • - -
    • -

      Bug fix [377]: - After a failed method call the exception handler could fail in - the rare occasion when - targetObject.toString() fails, raising a - runtime exception that not even the attempt - directive will catch.

      -
    • - -
    • -

      Bug fix [391]: - If a template name has contained * that was - not the only character in the path step, it threw - NegativeArraySizeException instead of - FileNotFoundException.

      -
    • - -
    • -

      With the default arithmetic engine, performance - optimizations of comparison operations when some of the numbers - is 0, and when the sign of the numbers differ.

      -
    • - -
    • -

      Some smaller fixes in - TemplateElement.getCanonicalForm(), also some - quality improvements there.

      -
    • - -
    • -

      Bug fixes in classic_compatible mode - (this mode is to help migrating from FreeMarker 1), thanks to - Information Mosaic:

      - -
      -
        -
      • -

        When a macro was called with a - null/missing parameter value, it has - caused error like in FreeMarker 2.3

        -
      • - -
      • -

        When a hash literal contained reference to a - null/missing variable, like in { - 'a': missingVar }, it has caused an error like in - 2.3

        -
      • - -
      • -

        When a sequence literal contained reference to a - null/missing variable, like in - [1, missingVar], it has caused an error - like in 2.3

        -
      • - -
      • -

        When a the left-side of the . (dot) - or [key] - operator was null or missing variable, - like in missingVar.subVar, it has caused - an error like in 2.3

        -
      • - -
      • -

        When BeanModel-s are tried to be - treated as strings, for most subclasses it has failed with - type error, like in 2.3. In FreeMarker 1 all - BeanModel-s were - TemplateScalarModel-s, so it should - succeed. The fix for this only works where FreeMarker - coerces to string (string built-ins on - the left-side and concatenation (+) and - interpolation - (${...}) do - that), otherwise unfortunately it will still fail.

        -
      • - -
      • -

        The classic_compatible setting now - accepts value 2 along - true (alias 1) and - false (alias 0). - 2 means true but with - emulating bugs in early 2.x classic-compatibility mode. - Currently this only affects how booleans are converted to - string; with 1 it's always - "true"/"", but with - 2 it's "true"/"false" - for values wrapped by BeansWrapper as - then Boolean.toString() prevails. Note - that - someBoolean?string - will always consistently format the boolean according the - boolean_format setting, just like in - FreeMarker 2.3.

        -
      • -
      - -
    • - -
    • -

      Bug fix [394]: - When trying to access the optional Jython (or W3C DOM) classes - has failed in DefaultObjectWrapper with an - Error, rather than with an - Exception, loading the - DefaultObjectWrapper class itself has failed, - instead of the Jython (or W3C DOM) support being disabled. From - now in, it will survive any kind of Throwable - there, and if the Throwable is not an - ClassNotFoundException, it will also log the - Throwable.

      -
    • - -
    • -

      Improved the performance of - (thisVarIsMissing.foo)!default and similar - parenthetical existence operators and - existence built-ins in the case when the - null/missing variable is not the last step - inside the parenthesis. In that case it's about 30 times faster - now, measured on Java 6. In other cases (when all variables - exists, or the the last step is missing) the performance is - about the same (relatively fast) as before.

      -
    • - -
    • -

      Added interface - freemarker.cache.CacheStorageWithGetSize - which allows querying the current number of cache entries in a - CacheStorage that implements it. It's - implemented by all out-of-the-box - CacheStorage implementations. Also added - getStrongSize() and - getSoftSize() to - MRUCacheStorage.

      -
    • - -
    • -

      Version and build information changes:

      - -
      -
        -
      • -

        The form of the nightly build version numbers has - changed to be Maven/JSR 277 compliant. What earlier was - 2.3.19mod is now something like - 2.3.20-nightly_20130605T130506Z (note how - the last points to the target release version instead of the - last release version).

        -
      • - -
      • -

        The form of the Release Candidate and Preview version - numbers where changed to be Maven/JSP 277 compliant: - 2.4pre2 is now - 2.4.0-pre02, 2.4rc1 is - now 2.4.0-rc01.

        -
      • - -
      • -

        Added new static method to - Configuration to query build date: - getBuildDate(). This is also printed by - the main command line class.

        -
      • -
      - -
    • - -
    • -

      Various internal code cleanups.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Many JavaDoc improvements, mostly in the documentation of - the basic (most frequently used) classes.

      -
    • - -
    • -

      FreeMarker source code has moved to GitHub (https://github.com/freemarker/freemarker), - other project resources has remained on sourceforge.net.

      -
    • - -
    • -

      Project structure cleanup, Ivy-based build script.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_21.html b/fmpp/docs/freemarker/versions_2_3_21.html deleted file mode 100644 index 3769643..0000000 --- a/fmpp/docs/freemarker/versions_2_3_21.html +++ /dev/null @@ -1,1549 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.21 - - - - - - - - -
    - - - - - -

    -2.3.21

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2014-10-12

    Note that since 2.3.21 is designed to be backward compatible - with the previous 2.3.x releases, some of the improvements - and fixes described below are only activated when you specifically ask - for 2.3.21 "incompatible improvements", - because they could, with very small chance, break existing - applications. If the dependent project is still actively developed, - allowing 2.3.21 "incompatible improvements" is highly recommended. - That can be achieved on various ways:

    -
      -
    • -

      Create the - freemarker.template.Configuration object like - new - Configuration(Configuration.VERSION_2_3_21)

      -
    • - -
    • -

      Or alter the Configuration where you - initialize its other settings like - cfg.setIncompatibleImprovements(Configuration.VERSION_2_3_21)

      -
    • - -
    • -

      Or if you are configuring FreeMarker with properties - (*.properties file or - java.util.Properties object), add - incompatible_improvements=2.3.21 to - them.

      -
    • - -
    • -

      Or if you are configuring FreeMarker through - FreemarkerServlet, add this - init-param to it in the - web.xml:

      - -
      -
      -<init-param>
      -    <param-name>incompatible_improvements</param-name>
      -    <param-value>2.3.21</param-value>
      -</init-param>  
      - -
    • -
    -

    Note that we have changed our proprietary BSD-style license to - Apache License, Version 2.0. See the new - license here.

    Note that the minimum required Java version was increased from - 1.2 to 1.4.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Improved ranges:

      - -
      -
        -
      • -

        Added ranges with exclusive end: - start..<end - (also can be written as - start..!end). - More...

        -
      • - -
      • -

        Added length limited ranges: - start..*length: - For example, 10..*4 gives [10, - 11, 12, 13], 10..*-4 gives - [10, 9, 8, 7], and - 10..*0 gives []. When - these kind of ranges are used for slicing, the slice will - end without error if the end of the sliced sequence or - string is reached before the specified range length was - reached. Thus, for example, to take the first 10 characters - from the string s, or less if - s is shorter than 10 characters, you can - use s[0..*10]. More...

        -
      • - -
      • -

        Square bracket now accepts range values from any - source, like <#assign r = 1..3> - ${'foobar'[r]} will print - "oob". Earlier it has only supported - ranges that were specified directly inside the square - brackets, like 'foobar'[1..3].

        -
      • - -
      • -

        When slicing a sequence with a right-unbounded range, - it's now allowed to have a range start index that's one - higher than the last index of the sliced sequence. For - example, ['x', 'y'][2..] is not an error - anymore, but an empty sequence. (Of course, ['x', - 'y'][3..] is still an error.)

        -
      • - -
      • -

        someString?substring(from, - toExclusive) and - someString?substring(from) - are now deprecated; use this slicing expression instead: - someString[from..<toExclusive] - and - someString[from..]. - A warning if you are processing XML: Since slicing - expressions work both for sequences and strings, and XML - nodes in FTL are typically both sequences and strings at the - same time, there the equivalent expression is - someXmlNode?string[from..<toExclusive] - and - exp?string[from..], - because without the ?string it would - slice the node sequence instead of the text value of the - node.

        -
      • - -
      • -

        If the incompatible_improvements in - the FreeMarker configuration is set to at least 2.3.21, - right-unbounded ranges become readable (like - #list-able). Earlier they could only be - used for slicing, and behaved like empty sequences - otherwise.

        -
      • -
      - -
    • - -
    • -

      New built-in, ?url_path: This is the - same as the - url built-in, except that it doesn't - escape slash (/) characters. This meant to be - used for converting paths (like paths coming from the OS or some - content repository) that use slash (not backslash!) to a path - the can be inserted into the path part of an URL.

      -
    • - -
    • -

      New built-ins for string manipulation:

      - -
      -
        -
      • -

        someString?keep_before(substring[, - flags]): More...

        -
      • - -
      • -

        someString?keep_after(substring[, - flags]): More...

        -
      • - -
      • -

        someString?remove_beginning(substring): - More...

        -
      • - -
      • -

        someString?remove_ending(substring): - More...

        -
      • - -
      • -

        someString?ensure_starts_with(substring[, - substitution[, - flags]]): More...

        -
      • - -
      • -

        someString?ensure_ends_with(substring): - More...

        -
      • -
      - -
    • - -
    • -

      someString?number - now recognizes all XML Schema number formats, like - NaN, INF, - -INF, plus the Java-native formats - Infinity and - -Infinity.

      -
    • - -
    • -

      If incompatible_improvements in the - FreeMarker configuration is set to at least 2.3.21, - someNumber?c will - return "INF", "-INF" and - "NaN" for positive/negative infinity and IEEE - floating point Not-a-Number, respectively. These are the XML - Schema compatible representations of these special values. - Earlier it has returned what - java.text.DecimalFormat did with US locale, - none of which was understood by any (common) computer - language.

      -
    • - -
    • -

      New built-in: - someString?boolean. - This is for example useful for converting "true" and "false" - strings coming from XML to real boolean values. More...

      -
    • - -
    • -

      Date/time/date-time related changes:

      - -
      -
        -
      • -

        Added new kind of - date_format/datetime_format/time_format - setting values: XML Schema formats, starting with - "xs" and ISO 8601:2004 formats, starting - with "iso". The format string can be - continued with various space (or _) - separated options, like h or - m or s or - ms for setting shown accuracy, - nz or fz for setting - time zone offset visibility, and u or, - fu for using UTC time zone . For example, - to use ISO 8601 with minute precision and without the zone - offset being shown, set the - datetime_format setting to "iso - m nz", so then the output will be like - 2014-09-03T20:56. More...

        -
      • - -
      • -

        Because anything that's accepted as - date_format/datetime_format/time_format - setting value can also be used with the - ?string and - ?date/?time/?datetime - build-ins, you can use the new formats like - someDate?string.xs and - someString?date.xs. (For the - "xs" and "iso" - formats, _ can be used instead of space, - which means that, for example, you can write - lastModified?string.iso_m_u instead of - the more verbose lastModified?string["iso m - u"].)

        -
      • - -
      • -

        That "iso" and - "xs" are now possible - date_format/datetime_format/time_format - setting values also means that such values can now be parsed - too via - ?date/?time/?datetime. - The main application is with processing XML DOM-s, as there - values are coming in as strings, and now you can do - something like order.confirmDate?date.xs - to convert them to real dates.

        -
      • - -
      • -

        The ?iso_... - built-ins are now deprecated in favor of the new - setting values described above. They can be set as the - default date/time/date-time format, seamlessly fit into the - formatting architecture (and thus can parse strings too), - and has more/better options (ms always - shows 3 millisecond digits, fz for - forcing showing time zone offset).

        -
      • - -
      • -

        If the "incompatible improvements" - configuration setting is at least 2.3.21, the - ?iso_... built-ins won't show time zone - offset for java.sql.Time values anymore. - Most databases store time values that aren't in any time - zone, but just store hour, minute, second, and decimal - second field values, so showing the time zone doesn't make - sense. (Notable exceptions are PostgreSQL "time with time - zone" columns, where - mzTime?string.iso_fz - could be used.)

        -
      • - -
      • -

        Added ?is_time, - ?is_datetime, - ?is_date_only (should be called - ?is_date, but that was already taken) and - ?is_unknown_date_like to check the exact - type of a date-like value.

        -
      • - -
      • -

        ?is_date is now a deprecated name, - use ?is_date_like instead. This is - because ?is_date sounds like it checks if - the value is a date without time part, but actually it also - returns true for time, date-time, and - unknown date-like values.

        -
      • - -
      • -

        Added ?date_if_unknown, - ?time_if_unknown and - ?datetime_if_unknown built-ins, which - mark a date-like value with some of the sub-types: date - without time, time, or date-time, respectively. However, if - the value already holds this information, the built-in has - no effect. That is, it will never convert the sub-type of a - value, it only adds the sub-type if it was unknown.

        -
      • - -
      • -

        Bug fixed: ISO 8601 dates (via - ?iso_... and "iso" - format settings) now use proleptic Gregorian calendar for - the years before 1582, rather than Julian calendar. This is - (indirectly) required by the standard, and it's also how the - default Sun/Oracle Java XML Schema date/time/dateTime parser - works.

        -
      • -
      - -
    • - -
    • -

      Error message quality improvements (targeting frequent - support requests and some error message bugs):

      - -
      -
        -
      • -

        Fixed glitch where if an #if had - and #else or #elseif, - the - #if/#else/#elseif - wasn't hidden in the FTL stack trace when the error was - inside its nested block.

        -
      • - -
      • -

        Some new context sensitive hints in undefined variable - exception error messages.

        -
      • - -
      • -

        Fixed unclosed directive error messages at end of file - where the wrong unclosed directive name was reported

        -
      • - -
      • -

        Better type error messages when accessing XML data - (applies when wrapped with - freemarker.ext.dom):

        - -
        -
          -
        • -

          Trying to use - node.noSuchChildNodes - on a place where scalar value is expected will explain - that the problem is that you had no matches in the - constructing XML query.

          -
        • - -
        • -

          Trying to use - node.multipleSuchChildNodes - on a place where scalar value is expected will explain - that the problem is that you had multiple matches in the - constructing XML query.

          -
        • - -
        • -

          Trying to use - node.exactlyOneChildNode - as number, date/time/date-time or boolean will explain - that values coming from XML are always strings (text), - and must be converted explicitly via - ?number, ?boolean, - ?date.xs, etc.

          -
        • -
        - -
      • - -
      • -

        Trying to use obj.someMethod - without () on a place where method value - is not expected will recommend calling the method.

        -
      • - -
      • -

        Trying to use methods like - obj.getFoo or - obj.isFoo without ()on - a place where method value is not expected will recommend - using the obj.foo form.

        -
      • - -
      • -

        Messages are now much more readable when rendered in - environments that don't obey to line-breaks. (This often - happens in improperly implemented HTML error pages and logs - viewers.)

        -
      • - -
      • -

        Better FTL instruction stack traces:

        - -
        -
          -
        • -

          Error messages now contain up to 10 lines of FTL - stack trace (unless it's on the top of a full FTL stack - trace), because the FTL stack trace wasn't printed at - all when the exception was a cause exception in a Java - stack trace, or when only the value of - getMessage() was printed instead of a - stack trace.

          -
        • - -
        • -

          The FTL stack trace is now more self explanatory - as it contains more text labels.

          -
        • - -
        • -

          Stack frames that belong to nestings are now - marked differently, and are filtered out when the stack - trace wouldn't fit into the error message otherwise. -

          -
        • -
        - -
      • - -
      • -

        Bug fixed: ?substring has thrown - low level - java.lang.IndexOutOfBoundsException-s - instead of more descriptive - TemplateModelException-s with FTL stack - trace.

        -
      • - -
      • -

        Bug fixed: Slicing with ranges sometimes thrown low - level - java.lang.IndexOutOfBoundsException-s - instead of more descriptive - TemplateModelException-s with FTL stack - trace.

        -
      • - -
      • -

        Bug fixed [402]: - Fixed misleading parser error message when a directive - called without its required parameters (like - <#list>) was reported as unknown - directive.

        -
      • - -
      • -

        Bug fixed [222]: - Poor quality error message when - someString[someIndex] - fails with string index out of bounds.

        -
      • - -
      • -

        Bug fixed [27]: - Not very good quality error messages when - #import-ing a template whose parsing - fails.

        -
      • -
      - -
    • - -
    • -

      New include directive option, - ignore_missing=boolean. - When this is set to true, and the template to - include is missing, the error will be silently ignored, and - nothing will be included.

      -
    • - -
    • -

      The setting directive can now set the - output_encoding setting.

      -
    • - -
    • -

      New special variable: .locale_object. - This is like .locale, except that it's a - java.util.Locale object, not a string. This - is handy if you want to pass the current locale to Java - methods.

      -
    • - -
    • -

      If incompatible_improvements in the - FreeMarker configuration is set to at least 2.3.21, hash - literals that repeat keys now only have the - key once with ?keys, and only has the last - value associated to that key with ?values. - This is consistent with the behavior of - hash[key] - and how maps work in Java.

      -
    • - -
    • -

      Bug fixed: ?is_enumerable has returned - true for Java methods get from Java objects, - despite that those values aren't <#list - ...>-able. (This is actually a historical quirk of - BeansWrapper, not a bug in - ?is_enumerable, but now - ?is_enumerable is aware of this exceptional - case.)

      -
    • - -
    • -

      Bug fixed [257]: - The result value of ?matches wasn't - "reentrant". For example, you couldn't list the - matches inside another listing where you are also listing - exactly the same result value (stored in a common variable), as - they would consume from the same iterator. Most importantly, - even accessing the ?size of the same result - value has terminated the outer listing of the same value.

      -
    • - -
    • -

      Bug fixed [229]: - If you set incompatible_improvements to - 2.3.21 (or higher), unclosed comments (<#-- - ...) and - #noparse-s won't be silently closed at the - end of template anymore, but cause a parsing error - instead.

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Added new Configuration constructor, - Configuration(Version - incompatibleImprovements). This deprecates the vague - Configuration() constructor, and makes using - setIncompatibleImprovements(Version) needless - in most cases. See an example here...

      -
    • - -
    • -

      When setting the - incompatible_improvements setting (like with - the constructor above) to 2.3.21, two setting defaults - change:

      - -
      -
        -
      • -

        The default of the object_wrapper - setting - (Configuration.getObjectWrapper()) - changes from - ObjectWrapper.DEFAULT_WRAPPER to another - almost identical DefaultObjectWrapper - singleton, returned by new - DefaultObjectWrapperBuilder(Version).build(). The - new default object wrapper's "incompatible - improvements" version is set to the same as of the - Configuration. (See later regarding the - 2.3.21 "incompatible improvements" of - BeansWrapper and - DefaultObjectWrapper). Furthermore, the - new default object wrapper doesn't allow changing its - settings; setter methods will throw - IllegalStateException. (If anything tries - to call setters on the old default in your application, - that's a dangerous bug that won't remain hidden now. As the - old default is a singleton too, potentially shared by - independently developed components, most of them expects the - out-of-the-box behavior from it (and the others are - necessarily buggy). Also, then concurrency glitches can - occur (and even pollute the class introspection cache) - because the singleton is modified after publishing.)

        -
      • - -
      • -

        The default of the template_loader - setting - (Configuration.getTemplateLoader()}) - changes to null, which means that - FreeMarker will not find any templates. Earlier the default - was a FileTemplateLoader that used the - current directory as the root. This was dangerous and - fragile as you usually don't have good control over what the - current directory will be. Luckily, the old default almost - never looked for the templates at the right place anyway, so - pretty much all applications had to set - template_loader, so it's unlikely that - changing the default breaks your application.

        -
      • -
      - -
    • - -
    • -

      New BeansWrapper, - DefaultObjectWrapper and - SimpleObjectWrapper constructor that takes a - Version - incompatibleImprovements argument. This has - the same role as the - incompatible_improvements setting of the - Configuration, but it applies to the - ObjectWrapper instead. (As - ObjectWrapper-s are often shared among - multiple Configuration-s, so they can't use - that setting of the Configuration.) In new or - actively developed projects it's recommended to use - Configuration.VERSION_2_3_21 now. The - constructor without the Version parameter is - now deprecated.

      -
    • - -
    • -

      Safer and more memory-efficient way of managing singletons - of DefaultObjectWrapper-s and - BeansWrapper-s that are possibly shared by - independently developed subsystems:

      - -
      -
        -
      • -

        Instead of new - DefaultObjectWrapper(...) - and new - BeansWrapper(...), from - now on you should use new - DefaultObjectWrapperBuilder(version).build() and - new BeansWrapperBuilder(version).build(). - (The builder objects have properties (configuration - settings) like BeansWrapper has, which - specify the properties of the objects created.) The created - objects are singletons (VM-wide, or at - least Web-Application-wide) and read-only (means, - non-configurable, hence safe to share). The main benefit of - using these factories instead of creating new instances is - that it allows FreeMarker to share the class introspection - caches (an internal part of - BeansWrapper-s/DefaultObjectWrapper-s - that is expensive to populate) among the returned instances. - This allow sharing the caches (and the object wrappers) - between components that aren't aware of each other and use - FreeMarker internally.

        -
      • - -
      • -

        Deprecated the static fields - ObjectWrapper.DEFAULT_WRAPPER, - BEANS_WRAPPER and - SIMPLE_WRAPPER, because these - ObjectWrapper-s are configurable (not - read-only), and thus dangerous to use as singletons (a badly - behaving 3rd party component can mess them up). Use the - factories described above instead. They are also more - flexible, as you can specify the desired - incompatible-improvements version for them and various other - BeansWrapper settings.

        -
      • - -
      • -

        Deprecated all SimpleHash, - SimpleCollection and - SimpleSequence constructors that didn't - take an ObjectWrapper argument, as they - have usually used - ObjectWrapper.DEFAULT_WRAPPER as the - default, which itself is deprecated.

        -
      • - -
      • -

        BeansWrapper, - DefaultObjectWrapper and - SimpleObjectWrapper now implements the - freemarker.template.utility.WriteProtectable - interface with which the configuration properties of the - object wrapper can be set permanently to read-only by - calling writeProtect(). An attempt to - call a setter on a such ObjectWrapper - will immediately cause - IllegalStateException. (This is what's - used for the singletons returned by the - getInstance methods too; see - earlier).

        -
      • -
      - -
    • - -
    • -

      The value of the time_zone setting, - when you specify it with a String (in a - java.util.Properties object, or via - <#setting - ...>) can now be - "JVM default" to use the JVM default time - zone. The JVM default is the default value of that setting - anyway, but now you can state this explicitly, or restore this - value if it was overridden earlier.

      -
    • - -
    • -

      Added new configuration setting, - sql_date_and_time_time_zone - (Configurable.setSQLDateAndTimeTimeZone(TimeZone)). - When this is set to non-null, the time zone - used when dealing with java.sql.Date and - java.sql.Time values will be this time zone - instead of the value of the time_zone - FreeMarker configuration setting. This is useful because JDBC - will, usually, construct the Java Date - objects so that they will show the year-month-day and - hour-minute-seconds values from the database "as - is" if you render them using the JVM default time zone. - As time zone conversions for SQL date-only and SQL time-only - values doesn't make much sense (unlike for SQL timestamps), you - should certainly set this setting to the JVM default time zone - (TimeZone.getDefault(), or if you configure - FreeMarker via java.util.Properties, as - property value "JVM default"). The default value is - null for backward compatibility. For more - details see the JavaDoc of - Configurable.setSQLDateAndTimeTimeZone(TimeZone).

      -
    • - -
    • -

      When configuring FreeMarker with - java.util.Properties (typically, when the - configuration is stored in a .properties - file), for the settings where you could specify a fully - qualified class name (most notably for the - object_wrapper setting) now you can also - specify constructor arguments and JavaBean property assignments. - For example, now you can write - object_wrapper=com.example.MyObjectWrapper(1, 2, - exposeFields=true, cacheSize=5000)that's nearly - equivalent with this Java code: obj = new - com.example.MyObjectWrapper(1, 2); obj.setExposeFields(true); - obj.setCacheSize(5000); object_wrapper = obj;. If you - are using this new syntax (i.e., if you have parentheses after - the class name, even if they are empty), and there's a builder - class for the requested class, that will be automatically used. - For example, - object_wrapper=DefaultObjectWrapper(2.3.21) - will create a DefaultObjectWrapperBuilder to - build the final instance, thus the object wrapper will be a - singleton instead of a new instance. The new syntax will also - look for a public static INSTANCE field if - there are 0 arguments and property assignments. For more details - see the Java API documentation of - Configuration.setSetting.

      -
    • - -
    • -

      Template not found exceptions now explain that the - template path is interpreted by a template loader, and show the - toString of the - TemplateLoader. The out-of-the-box - TemplateLoader implementations now have an - overridden toString to show the actual base - directory and such details. Custom - TemplateLoader implementations are encouraged - to override toString.

      -
    • - -
    • -

      Added - Configuration.setSharedVariables(Map/*<String, - Object>*/) for setting the shared variables from - Spring IoC and other IoC solutions. The already existing - Configuration.setSharedVariable(String, - Object) isn't a JavaBean property so it was hard to - use for that. Furthermore, the order in which - Configuration.setObjectWrapper and - Configuration.setSharedVariables are called - doesn't mater (unlike in the case of - Configuration.setSharedVariable), which is - essential in most IoC solutions.

      -
    • - -
    • -

      Mostly concerning tool (like IDE plugin) authors:

      - -
      -
        -
      • -

        ParseException-s now also store the - end-location of the error, not just its start-location. This - is useful if you want to underline the error in the source - code, not just point at it.

        -
      • - -
      • -

        Configuration.getSupportedBuiltInDirectiveNames() - can be used to return the names of directives supported by - FreeMarker.

        -
      • - -
      • -

        TemplateExceptions now expose the - position of the error (template name, line, column, end - line, end column) similarly to - ParseException-s. Where applicable, they - also expose the blamed expression in its canonical FTL - source form; this is mostly useful for - InvalidReferenceException-s.

        -
      • -
      - -
    • - -
    • -

      The concurrent performance of overloaded method lookups - (from the cache) was improved under Java 5 and later.

      -
    • - -
    • -

      The Version instances that are - "incompatible improvements" break points are now - available via constants like: - Configuration.VERSION_2_3_21.

      -
    • - -
    • -

      From now on, if you try to set the "incompatible - improvements" to greater than the current FreeMarker - version, or less than 2.3.0, an - IllegalArgumentException will be thrown. - Thus, new - Configuration(someVersion) - not only activates the fixes up to that version, but ensures - that the application will not run in an environment with an - older FreeMarker version. (On an older FreeMarker version the - improvements that you have requested aren't implemented yet, so - you should get an exception.)

      -
    • - -
    • -

      Added new configuration setting, - show_error_tips, defaults to - true. Sets if tips should be shown in error - messages of errors arising during template processing.

      -
    • - -
    • -

      Instead of overriding - BeansWrapper.finetuneMethodAppearance (now - deprecated), now you can use - BeansWrapper.setMethodAppearanceFineTuner(MethodAppearanceFineTuner), - so you don't need to extend the object wrapper class to - customize this aspect.

      -
    • - -
    • -

      Added - Configuration.getCoreDirecticeNames() which - returns the names of all directives that are provided by - FreeMarker. This can useful for IDE-s.

      -
    • - -
    • -

      template_loader was added as possible - configuration setting Properties key.

      -
    • - -
    • -

      The standard CacheStorage - implementations now have a getSize() method - for monitoring the cache size. - MruCacheStorage also has - getSoftSize() and - getStrongSize().

      -
    • - -
    • -

      Various smaller improvements in configuration setting - errors messages.

      -
    • - -
    • -

      With incompatible improvements 2.3.21 only: Empty ranges - return Constants.EMPTY_SEQUENCE instead of an - empty SimpleSequence. This is in theory - backward compatible, as the API only promises to give something - that implements TemplateSequenceModel.

      -
    • - -
    • -

      FreeMarker now requires Java version has changed from 1.2 - to 1.4.

      -
    • - -
    • -

      Bugs fixed and improvements in overloaded method - selection/invocation, but only if you create the - BeansWrapper/DefaultObjectWrapper - with constructor parameter - Configuration.VERSION_2_3_21 (or if you are - using Properties to configure FreeMarker, you - can do that like - object_wrapper=BeansWrapper(2.3.21)), or if - you have a Configuration with similar - incompatible_improvements 2.3.21 - and you leave the - object_wrapper setting on its default value. - There's a little chance that because of these changes, a - different overloaded method will be chosen than before, or even - that ambiguity errors will arise where earlier they didn't - (although the opposite is far more frequent), hence the fixes - aren't automatically activated. But the fix mostly only effect - calls that were failing or have chosen then wrong method - earlier, so it's recommended to activate it for projects that - are still actively developed. This fix includes numerous - changes:

      - -
      -
        -
      • -

        Earlier, null argument values has - only matched overloaded methods where the corresponding - parameter had Object type, not a subclass - of it. That's clearly a bug. Now it considers all overloads - where the parameter type is non-primitive, and just like the - Java language, it choses the one with the most specific type - among them. This is the most important fix, and also the - most risky one regarding backward-compatibility. Like if you - have m(Object o) and m(String - s) in a Java class, earlier for a - m(null) call in the template it has - chosen m(Object o), but now it will - choose m(String s) instead (because - String is also - null-able and is more specific than - Object). Furthermore, if you also had - m(File f) in the same class, now it will - cause an ambiguity exception, since the specificity of - File and String can't - be compared (same rule as under Java language), while - earlier that wasn't a problem as only m(Object - o) was seen as applicable.

        -
      • - -
      • -

        The behavior of numbers with overloaded method - selection was heavily reworked:

        - -
        -
          -
        • -

          If possible, it now always choses the overload - where overflow and truncation to integer (like 1.5 to 1) - is avoided. Among the methods where no such critical - loss occurs, it choses the overload with the least risk - of precision loss (unless other conditions with higher - priority suggest otherwise). Earlier, the method - selection was prone to do choices that led to overflow - or precision loss, especially when the parameter was a - literal with decimals.

          -
        • - -
        • -

          Overloaded method call can now convert to - non-primitive numerical types, like a - Byte or byte value - is automatically converted to Integer - if the parameter type is Integer. - (This has always worked for non-overloaded methods.) - Earlier where such conversion was needed, the method - wasn't seen seen applicable.

          -
        • - -
        • -

          Method selection is now not only based on the type - of the wrapped number, but also on its value. For - example, a Long with value - 1 is now seen as compatible with a - method with parameter type int or - short or byte, as - 1 can be stored in those without - loss. This is important as unlike in Java language, in - FTL you doesn't have strict control over the numerical - types (the type of the wrapped number, actually), as FTL - has no type declarations. (If multiple compatible - methods are available, it will still try to chose the - one with the same or bigger numerical type.)

          -
        • - -
        • -

          Conversion from/to BigInteger - is now supported.

          -
        • -
        - -
      • - -
      • -

        Method choice ambiguity errors now occur much less - often. Ambiguities was and are resolved by selecting the - compatible methods then choosing the one with the most - specific parameter types among them. The changes are:

        - -
        -
          -
        • -

          When comparing the overall specificity of two - parameter lists: Earlier the parameter list seen as more - specific was the one that had some parameters that won - in specificity, and if both had such parameters then it - was an ambiguity. Now it's enough if a method has more - such parameters where it's a better match than the other - has, or if the two methods are still equal, if it has - the first better matching parameter. This can lead to - choices that seem arbitrary (but are still - deterministic), but as there's no automated way of - discovering method selection ambiguities in templates - (unlike in Java source code, where they will be detected - during compilation), especially as overloaded selection - has to rely on the runtime type of - the values which even make proper testing hard, this was - considered to be a better compromise than throwing an - exception whenever the choice of the method is not - obvious. Also note that in fact this mechanism is more - complicated than just counting the "winner" - parameter positions for each methods, as certain kind of - wins are stronger than any number of the others: wins - where the other possibility is risking of substantial - mantissa precision loss are the strongest (like dropping - decimals versus not to), wins where the primitive type - wins over the boxed class is the weakest (like - int versus - Integer), subclassing wins (like - String versus - Object) are between these two.

          -
        • - -
        • -

          When comparing the specificity of two parameters - types at the same parameter position: The algorithm now - considers a primitive type as more specific that its - corresponding boxing class (like int - is considered to be more specific than - Integer).

          -
        • - -
        • -

          There was a bug with overloaded varargs methods of - different parameter counts, where sometimes the last - parameters of the compared methods was ignored, which is - taking away a potential deciding factor and thus can - lead to ambiguity error. Whether this happened depends - on the order in which the Java reflection API has - returned the methods, which is undocumented and known to - change at least after some Java updates, breaking the - application.

          -
        • - -
        • -

          When comparing the specificity of two array types, - until now they were seen as equal. Now the component - types are compared, and then that with the less specific - component type is preferred. For example, among - f(String[]) and - f(Object[]), the last will always - win. This might sounds controversial, but as we can't - efficiently tell the common type of all the items in a - sequence or List, an so we don't know - if both arrays are indeed valid targets, we go for the - safest choice.

          -
        • -
        - -
      • - -
      • -

        FTL sequence values (like Java - List-s or FTL - [x, - y, - ...] constants) were - not seen as applicable to a parameter with array type if - there were multiple overloaded methods with the same number - of parameters but with different types on the position of - the array parameter. That is, if you had - f(String[]) and - f(String) in Java, then - f(['foo', 'bar']) in the template - reported no compatible overloads. Now it will choose - f(String[]). Note that if there's also an - f(List) or even an - f(Collection), it will prefer those over - arrays. (For consistency, this conversion will work even if - the argument is a List that come directly - from Java (as opposed to be created inside FTL), i.e., when - it was wrapped then unwrapped to the original - List object.) For a multidimensional - array parameter type, this conversion works recursively, so - you can pass in a sequence-of-sequences as the - argument.

        -
      • - -
      • -

        FTL sequence values that wrapped a Java array (when - FreeMarker was also aware of that via - AdapterTemplateModel or - WrapperTemplateModel) were not seen as - applicable to a parameter with List type - if there were multiple overloaded methods with the same - number of parameters but with different types on the - position of the array parameter. So this is pretty much like - the issue described in the previous point, but for array to - List conversion. The array to - List conversion will be avoided if - possible, but it will be attempted if there's no other - alternative. Note that unlike with List - to array conversions, here FreeMarker can't cope with - multi-dimensional lists, that is, an array-of-arrays won't - be converted to a - List-of-List-s.

        -
      • - -
      • -

        FTL string to Java - char/Character - conversion now works for overloaded method parameters; - earlier it has worked for non-overloaded methods only. If - the string length is 1, it will be seen as compatible with - parameters with char or - Character type.

        -
      • - -
      • -

        Decreased the chance of choosing the wrong target Java - type when unwrapping multi-typed FTL values: When unwrapping - a parameter value that implements multiple FTL types (e.g. - string and hash) but doesn't implement - AdapterTemplateModel or - WrapperTemplateModel, a decision has to - be made if to what Java type the value should be unwrapped - to (e.g. to String or to - Map). In earlier versions that decision - was made based on the most specific common super type of the - parameters types of the given parameter position. However, - it's quite common that the common super type is too generic, - usually Object. Now - BeansWrapper stores "type - flags" for each parameter position of overloaded - methods, from which it can tell whether a potential target - Java type occurs in any of the overloads on the given - parameter position.

        -
      • - -
      • -

        In many cases, less specific hint class was used for - unwrapping than that was possible within the limitations of - the applied hint generation algorithm. (The unwrapping hint - has influence when there's an ambiguity regarding how to - create a Java object form an FTL value. In the vast majority - of the cases, a too generic hint has no effect.) (This is a - highly technical topic. The way it works is that a single - common unwrapping hint class is chosen for a given argument - position shared by the overloads that has the same number of - parameters, and that hint class has to be as specific as - possible while it must fit all those parameter types. The - issue with the too generic hints had several instances: (a) - When the most specific common class/interface of two - same-position parameter types was searched, if there was - multiple common classes/interfaces that had no relationship - (this is always at most one class and one or more unrelated - interfaces), due to the ambiguity it has felt back to using - Object as the unwrapping hint. Now if - there's a non-Object class among them in - such case, it will be chosen as the hint (i.e., we ignore - the common interfaces). Otherwise if only a single interface - remains by removing Cloneable, - Serializable, and - Comparable (in that order), that will be - chosen. Only then it falls back to - Object. (b) The common most specific - class of a primitive type and the corresponding boxing class - was sometimes Object instead of the - boxing class. This has depended on Java's internal ordering - of the methods, and so were quite unpredictable, like the - result could change after upgrading Java under the - application. (c) The common superclass of a numerical - primitive value and a numerical non-primitive value was - always Object, now if they are a - primitive-boxing class pair, then it's the boxing class, - otherwise it's Number. (d) If the varags - parameter position was not the same in all the overloaded - varargs methods, sometimes some varargs arguments where - unwrapped with too generic hints. When this happened was - unpredictable as it depended on Java's internal method - ordering again.)

        -
      • - -
      • -

        When unwrapping method call arguments before calling a - Java method, if the argument was an - AdapterTemplateModel and the target - parameter type was primitive, - AdapterTemplateModel.getAdaptedObject(Class - hint) has received the primitive type of the - target parameter (like int instead of - Integer) as the hint. This did not make - sense since getAdaptedObject can only - return Object-s, not primitive values. - Yet, BeansWrapper has expected the - returned value to be of the primitive type, otherwise it has - discarded it. Exactly the same problem occurs with - WrapperTemplateModel. Thus, ultimately, - if the target parameter type was primitive and some of these - interfaces were implemented, their return value was always - discarded and FreeMarker has felt back to other means of - unwrapping. Now BeansWrapper always - passes in and expects the boxing type (like - Integer) instead of the primitive - type.

        -
      • -
      - -
    • - -
    • -

      Bug fixed [373]: - These are three bugs actually, which can cause problems when - FreeMarker re-loads a template because of a charset override - with <#ftl encoding="...">: First, if - the template loader was a URLTemplateLoader, - when TemplateLoader.getReader() was called - for the second time, and the Reader returned - for the first time was already used, it might returned an empty - or corrupted template, depending on the backing URL - implementation. Secondly, when FreeMarer has decided if a - template file has to be re-loaded because its encoding specified - with <#ftl encoding="..."> differs from - the encoding used for loading the template first, it has used - case-sensitive comparison, thus often re-loaded needlessly (like - "UTF-8" and "utf-8" mean the same). Now this comparison is - case-insensitive. Last not least, when retrying with the second - charset, the TemplateCache has forgotten to - close the first Reader, which can be a handle - leak.

      -
    • - -
    • -

      Bug fixed [411]: - Invalid and redundant execution environment names from the OSGi - bundle manifest were removed. It looks like this now: - Bundle-RequiredExecutionEnvironment: J2SE-1.5, - J2SE-1.4. That is, we prefer (and compile against) - 1.5, but only require 1.4.

      -
    • - -
    • -

      Bug fixed [409]: - SimpleHash's internal Map - is concurrently modified on a non-safe way when getting length-1 - String key that exists but maps to - null. This operation will accidentally add a - Character key to the internal map, which is - not a thread-safe operation.

      -
    • - -
    • -

      Bug fixed [273]: - TemplateLoader-s that use - java.net.URLConnection-s should set - URLConnection.useCaches to - false, or else it won't detect template - caches on certain configurations.

      - -
      -
        -
      • -

        URLTemplateLoader and its - subclasses and - WebApplicationTemplateLoader now has a - setURLConnectionUsesCaches(Boolean) - method. It's recommended to set this property to - false from its default backward - compatible value, null. As FreeMarker has - its own template cache with its own update delay setting - (template_update_delay, - Configuration.setTemplateUpdateDelay(int)), - it shouldn't cause performance problems. The - null value will leave the caching of the - java.net.URLConnection on its default, - which is usually true.

        -
      • - -
      • -

        If incompatible_improvements is set - to 2.3.21 (or higher) and templates are loaded through - Configuration.getTemplate, and the - TemplateLoader in use has - URLConnectionUsesCaches left on - null, it will behave as if it was set to - false. Note that this - incompatible_improvements trick only - works if the template is loaded through - Configuration.getTemplate (or - TemplateCache).

        -
      • -
      - -
    • - -
    • -

      Bug fixed: When changing the properties of - DefaultObjectWrapper or - BeansWrapper that influenced class - introspection results (like exposureLevel or - exposeFields), the introspection cache wasn't - cleared, and thus returned stale information for the classes - that were introspected before those properties were changed. Now - changing such properties always clears the introspection - caches.

      -
    • - -
    • -

      Bug fixed: Constants used for empty sequence, empty hash, - empty collection and empty iterator weren't - Serializable.

      -
    • - -
    • -

      Bug fixed [300]: - Logger class availability check was incorrect in that it has - checked the availability of logger libraries with the thread - context class loader, then later it tried to link to them with - the defining class loader of the FreeMarker classes. With some - class loader setups (notably under Netbeans sometimes) this led - to ClassDefNotFoundError-s that made - FreeMarker unusable. (The check itself was also not very - durable, as it didn't expected LinakeError-s, - only ClassNotFoundException.)

      -
    • - -
    • -

      Bug fixed: ClassUtil.forName, used - inside FreeMarker everywhere to resolve class names to classes, - if the thread context class loader is null, - no longer tries to load with the bootstrap class loader before - loading with the defining class loader of FreeMarker.

      -
    • - -
    • -

      Bug fixed [311]: - TemplateBooleanModel.TRUE and - FALSE are now serializable

      -
    • - -
    • -

      Bug fixed: Various issues in Version - class, such as wrong hashCode, possible - concurrency glitches, and acceptance of some malformed version - strings.

      -
    • - -
    • -

      Bug fixed [414]: - Eclipse debug mode running was suspended during FreeMarker - static initialization on the JRebel availability checked if - JRebel wasn't available.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      The license has changed from our proprietary BSD-Style - license to the well know "Apache License, Version 2.0". - Furthermore, the copyright owner has changed from "Visigoth - Software Society" (which was founded by Jonathan Revusky) to the - three main FreeMarker 2 developers/contributors, "Attila - Szegedi, Daniel Dekany, and Jonathan Revusky". See the new license here.

      -
    • - -
    • -

      The required minimum Java version was raised from 1.2 to - 1.4. FreeMarker will not work on Java 1.2 or 1.3.

      -
    • - -
    • -

      Many smaller improvements and fixes in the Manual and API - JavaDocs.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_3.html b/fmpp/docs/freemarker/versions_2_3_3.html deleted file mode 100644 index 3798b71..0000000 --- a/fmpp/docs/freemarker/versions_2_3_3.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.3 - - - - - - - - -
    - - - - - -

    -2.3.3

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2005-06-23

    Some new features and lot of bugfixes.

    Attention:

    -
      -
    • -

      If you are using the Log4J logging, from now at least Log4J - 1.2 is required. This is because of incompatible changes in the - Log4J API.

      -
    • - -
    • -

      If you build FreeMarker yourself: from now at least JavaCC - 3.2 (instead of JavaCC 2.1) and at least Ant 1.6.1 (instead of Ant - 1.5.x) is required. This doesn't affect users who use the - freemarker.jar comes with the - distribution.

      -
    • -
    - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      New built-in for formatting numbers for ``computer - audience'' as opposed to human audience: c. It should - be used for numbers that must use Java language formatting - regardless of the number format and locale settings, like for a - database record ID used as the part of an URL or as invisible - field value in a HTML form, or for printing CSS/JavaScript - numerical literals.

      -
    • - -
    • -

      New built-in for the columnar/tabular displaying of - sequences: chunk.

      -
    • - -
    • -

      The sequence - slice and substring operators now allow the omitting of - the last index, in which case it defaults to the index of the - last sequence item or character. Example: - products[2..]. (Also, numerical range - literals now allow the omitting of the final number, in - which case it defaults to infinity. Example: - 5...)

      -
    • - -
    • -

      Bugfix: ?replace has worked forever if - the string to replace was "".

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      New template loader: - freemarker.cache.StringTemplateLoader. It - uses a Map with Strings as - its source of templates. See more in the JavaDoc.

      -
    • - -
    • -

      Experimental Rhino support: FreeMarker now comes with an - experimental object wrapper for Rhino (Java ECMAScript - implementation): - freemarker.ext.rhino.RhinoWrapper

      -
    • - -
    • -

      Some new utility methods for - SimpleXxx classes: - SimpleHash.toMap(), - SimpleSequence.toList().

      -
    • - -
    • -

      Bugfix: FTL literals and any other - SimpleSequnce-s, and - SimpleHash-es now can be used as parameters - to the FreeMarker-unaware Java methods that are exposed by - DefaultWrapper or - BeansWrapper. That is, the method parameters - are automatically converted from - TemplateTypeModel-s - to java.util.Map and - java.util.List respectively.

      -
    • - -
    • -

      Bugfix: The JSP support now works in JSP 2 compliant - containers as well. No, it doesn't support the new features of - JSP 2 yet, it's just that the JSP 1.2 taglib support has not - worked in JSP 2 containers.

      -
    • - -
    • -

      Bugfix: The - Configuration.setOutputEncoding and - setURLEscapingCharset methods died with - NullPointerException when you tried to set - the setting value to null, which is legal for - these settings.

      -
    • - -
    • -

      Bugfix: - freemarker.template.utility.StringUtil.replace(...) - has worked forever if the string to replace was - "".

      -
    • - -
    • -

      Bugfix: The Log4J logging was updated to be compatible - with the upcoming Log4J 1.3. Note that now FreeMarker will need - at least Log4J 1.2.

      -
    • - -
    • -

      Bugfix: FreeMarker didn't built from the source code on - J2SE 1.5, because of the introduction of the - enum keyword.

      -
    • - -
    • -

      Bugfix: The return value of - SimpleSequence.synchronizedWrapper() was not - properly synchronized. Same with - SimpleHash.synchronizedWrapper().

      -
    • - -
    • -

      Bugfix: Problem with BeansWrapper and - overridden bean methods/properties. (Details: bug-tracker entry - #1217661 - and #1166533)

      -
    • - -
    • -

      Bugfix: Can't access JSP taglibs if - Request attribute is defined in the - data-model (Details: bug-tracker entry #1202918).

      -
    • - -
    • -

      Bugfix: Various minor parser glitches were fixed.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Manual improvements, especially in the FAQ.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_4.html b/fmpp/docs/freemarker/versions_2_3_4.html deleted file mode 100644 index 55f7316..0000000 --- a/fmpp/docs/freemarker/versions_2_3_4.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.4 - - - - - - - - -
    - - - - - -

    -2.3.4

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2005-10-10

    Some new features and bugfixes.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Now you can use [ and - ] instead of < and - > for the FreeMarker tags. For example you - can write [#if - loggedIn]...[/#if] and - [@myMacro /]. More info...

      -
    • - -
    • -

      Bugfix: the has_content built-in - returned false for number, date and boolean - values (if the value was not a multi-type value that is also a - sequence or collection or hash or string). Now it always returns - true for a number, date or boolean values - (except if the value is also a sequence or collection or hash or - string, because then it will be examined only like that).

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bugfix: the parameterless constructor of the - ClassTemplateLoader didn't worked.

      -
    • - -
    • -

      Bugfix: The Jython wrapper didn't wrapped - java.util.Date objects well. Now it wraps - them with BeanWrapper to - TemplateDateModel.

      -
    • - -
    • -

      Bugfix: the include directive was - blamed when the included file had syntax error.

      -
    • -
    - - - - - - -

    -Other changes

    - - -
    -
      -
    • -

      Minor Manual fixes.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_5.html b/fmpp/docs/freemarker/versions_2_3_5.html deleted file mode 100644 index fe68883..0000000 --- a/fmpp/docs/freemarker/versions_2_3_5.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.5 - - - - - - - - -
    - - - - - -

    -2.3.5

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2006-03-11

    This release was withdrawn because of a serious bug in - it. Please don't use it! Of course, all new features of it are - included in FreeMarker 2.3.6.

    A few new features and several bugfixes.

    - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Bug fixed: [1435847] - Alternative syntax doesn't work for comments

      -
    • - -
    • -

      Bug fixed: With the new square bracket syntax, the tag - could be closed with >. Now it can be - closed with ] only.

      -
    • - -
    • -

      Bug fixed: [1324020] - ParseException with the - ftl directive if it wasn't in its own - line

      -
    • - -
    • -

      Bug fixed: [1404033] - eval built-in fails with hash - concatenation

      -
    • -
    - - - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      A new Configuration level setting, - tagSyntax was added. This determines the - syntax of the templates (angle bracket syntax VS square bracket - syntax) that has no ftl directive in - it. So now you can choose to use the new square bracket syntax - by default. However, the recommended is to use auto-detection - (yourConfig.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX)), - because that will be the default starting from 2.4. - Auto-detection chooses syntax based on the syntax of the first - FreeMarker tag of the template (could be any FreeMarker tag, not - just ftl). Note that as with the previous - version, if a the template uses ftl - directive, then the syntax of the ftl - directive determines the syntax of the template, and the - tagSyntax setting is ignored.

      -
    • - -
    • -

      Now BeansWrapper, - DefaultObjectWrapper and - SimpleObjectWrapper support lookup with 1 - character long strings in Map-s (like - myHash["a"]) that use - Character keys. Simply, as a special case, - when a hash lookup fails on a string that is 1 character long, - it checks for the Character key in the - underlying map. (Bug tracker entry [1299045] - FreeMarker doesn't support map lookup with Character - keys.)

      -
    • - -
    • -

      A new property, strict was added to - BeansWrapper, - DefaultObjectWrapper and - SimpleObjectWrapper. If this property is - true then an attempt to read a bean propertly - in the template (like myBean.aProperty) that - doesn't exist in the bean class (as opposed to just holding - null value) will cause - InvalidPropertyException, which can't be - suppressed in the template (not even with - myBean.noSuchProperty?default('something')). - This way ?default('something') and - ?exists and similar built-ins can be used to - handle existing properties whose value is - null, without the risk of hiding typos in the - property names. Typos will always cause error. But mind you, it - goes against the basic approach of FreeMarker, so use this - feature only if you really know what are you doing.

      -
    • - -
    • -

      Bug fixed: [1426227] - NullPointerException in - printStackTrace(...)

      -
    • - -
    • -

      Bug fixed: [1386193] - Division by zero in ArithmeticEngine

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_6.html b/fmpp/docs/freemarker/versions_2_3_6.html deleted file mode 100644 index fff333c..0000000 --- a/fmpp/docs/freemarker/versions_2_3_6.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.6 - - - - - - - - -
    - - - - - -

    -2.3.6

    - - -

    Date of release: 2006-03-15

    Quick release that fixes a serious bug of 2.3.5, days after its - release. So for the recently added new features please see the section of 2.3.5.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      Bug fixed: In FreeMarker 2.3.5 only, when you read a bean - property for the second time, FreeMarker will say that it's - missing (null).

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_7.html b/fmpp/docs/freemarker/versions_2_3_7.html deleted file mode 100644 index c2029f5..0000000 --- a/fmpp/docs/freemarker/versions_2_3_7.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.7 - - - - - - - - -
    - - - - - -

    -2.3.7

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2006-06-23

    This release, compared to 2.3.7 RC1, contains new operators for - handling null/missing variables, , the substring - built-in, and some more bugfixes. Note that 2.3.7 RC1 has a long - change log, so you may want to read - that too.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      The seq_contains built-in now handles - TemplateCollectionModel-s as well.

      -
    • - -
    • -

      Bug fixed: In 2.3.7 RC1 - FreemarkerServlet has always died with - NullPointerException during - initialization.

      -
    • -
    - - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      3 new operators were added for terser missing variable - handling. These operators make the default, - exists and if_exists - built-ins deprecated. (The parser doesn't issue any warning - messages when you use deprecated built-ins, and they are still - working.):

      - -
      -
        -
      • -

        exp1!exp2 - is near equivalent with - exp1?default(exp2), - also - (exp1)!exp2 - is near equivalent with - (exp1)?default(exp2). - The only difference is that this new operator doesn't - evaluate the - exp2 when the - default value is not needed.

        -
      • - -
      • -

        exp1! is - similar to - exp1?if_exists, - also (exp1)! - is similar to - (exp1)?if_exists. - The difference is that with this new operator the default - value is an empty string and an empty list and empty hash at - the same time (multi-type variable), while with - if_exists the default value was an empty - string and an empty list and empty hash and boolean - false and a transform that does nothing - and ignores all parameters at the same time.

        -
      • - -
      • -

        exp1?? - is equivalent with - exp1?exists, - also (exp1)?? - is equivalent with with - (exp1)?exists.

        -
      • -
      - -
    • - -
    • -

      New built-in: - exp?substring(from, - toExclusive), also callable - as - exp?substring(from). - Getting substrings was possible for a long time like - myString[from..toInclusive] - and - myString[from..], - but - myString?substring(from, - toExclusive) and - myString?substring(from) - has the advantage that it has an exclusive end, which is more - practical. (Edit: Since 2.3.21 ranges are the preferred way - again, as it has - myString[from..<toExclusive].) - Sequence (list) slices still has to be get with the old syntax, - since substring only applies to strings. - Please note that the ``to'' parameter is 1 greater with this new - builtin, as it is an exclusive index. Further difference is that - the substring built-in requires that the - ``from'' index is less than or equal to the ``to'' index. So 0 - length substrings are possible now, but not reversed - substrings.

      -
    • - -
    • -

      Bug fixed: [1487694] - malfunction when the recover directive has no - nested content

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_7rc1.html b/fmpp/docs/freemarker/versions_2_3_7rc1.html deleted file mode 100644 index 3525c59..0000000 --- a/fmpp/docs/freemarker/versions_2_3_7rc1.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.7 RC1 - - - - - - - - -
    - - - - - -

    -2.3.7 RC1

    - -
    -

    - - Page Contents - -

    - - -
    - - -

    Date of release: 2006-04-27

    This release contains many bugfixes and some - FreemarkerServlet related improvements. It's a - Release Candidate, which means that it shouldn't be used in production - environment yet. We recommend this release for development, however. - Please test it.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      FreemarkerServlet improvement: - AllHttpScopesHashModel is now public, so you - can add unlisted variables to the data-model.

      -
    • - -
    • -

      FreemarkerServlet improvement: When it - throws a ServletException, the J2SE 1.4 cause - exception is now set under J2SE 1.4.

      -
    • - -
    • -

      Bug fixed: [1469275] - NullPointerException when using - BeansWrapper with reloaded classes

      -
    • - -
    • -

      Bug fixed: [1449467] - HttpSessionHashModel is not - Serializable

      -
    • - -
    • -

      Bug fixed: [1435113] - Error in BeanWrapper with indexed - properties

      -
    • - -
    • -

      Bug fixed: [1411705] - Acquisition bug in TemplateCache

      -
    • - -
    • -

      Bug fixed: [1459699] - Tag syntax can't set with - Configuration.setSetting(String, - String)

      -
    • - -
    • -

      Bug fixed: [1473403] - ReturnInstruction.Return should be - public

      -
    • -
    - - - - - - -

    -Changes on the FTL side

    - - -
    -
      -
    • -

      Bug fixed: [1463664]kup - [/#noparse] is printed out

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_8.html b/fmpp/docs/freemarker/versions_2_3_8.html deleted file mode 100644 index 365dcb2..0000000 --- a/fmpp/docs/freemarker/versions_2_3_8.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.8 - - - - - - - - -
    - - - - - -

    -2.3.8

    - - -

    Date of release: 2006-07-09

    This release substantially improves the JSP 2.0 compatibility. - (For those who have seen the same points in 2.3.7: Sorry, the version - history was incorrect... those JSP 2.0 related changes were not in the - release yet.)

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      JSP support improvement: [1326058] - Added support for DynamicAttributes (new in - JSP 2.0)

      -
    • - -
    • -

      JSP support improvement: Added support for - pushBody()/popBody() in - FreemarkerPageContext

      -
    • - -
    • -

      JSP support improvement: Added support for - getVariableResolver() (new in JSP - 2.0).

      -
    • - -
    • -

      JSP support improvement: Added support for - include(String, boolean) (new in JSP - 2.0).

      -
    • - -
    • -

      JSP support improvement: Added support for - getExpressionEvaluator() (new in JSP 2.0). - However, it will need Apache commons-el in the class path, or - else this method will not work (it's optional). Note that EL - support is not needed in principle, since FreeMarker has it's - own expression language. But some custom JSP 2 tags may still - want to use this method, after all it's in the JSP 2 API.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/versions_2_3_9.html b/fmpp/docs/freemarker/versions_2_3_9.html deleted file mode 100644 index 89f0b87..0000000 --- a/fmpp/docs/freemarker/versions_2_3_9.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - FreeMarker Manual - 2.3.9 - - - - - - - - -
    - - - - - -

    -2.3.9

    - - -

    Date of release: 2007-01-23

    This release contains support for accessing JDK 1.5 enums and - public fields of classes from the templates through the - BeansWrapper.

    - - - - -

    -Changes on the Java side

    - - -
    -
      -
    • -

      BeansWrapper can now expose public - fields of objects to the template if you call the - setExposeFields(true) on it. More info...

      -
    • - -
    • -

      BeansWrapper can now pass any sequence - model to Java methods expecting a - java.util.Collection or a native Java array - (including primitive arrays). More info...

      -
    • - -
    • -

      BeansWrapper can now pass any sequence - and collection model to Java methods expecting a - java.lang.Iterable. More info...

      -
    • - -
    • -

      BeansWrapper can now unwrap numeric - models into correct target types when passing to Java methods - expecting a primitive or boxed number. Use of various expert built-ins to - manually coerce the types becomes mostly unnecessary.

      -
    • - -
    • -

      Fixed a bug where BeansWrapper would - pass a java.util.Collection to a method - expecting a java.util.Set in certain rare - cases. More - info...

      -
    • - -
    • -

      Support for JDK 1.5 enums in - BeansWrapper and - DefaultObjectWrapper. By calling the - getEnumModels() method, you can retrieve a - hash model that is keyed by class names and allows access to - enumerated values. I.e. if you bind this hash model under name - enums in the data-model, you can write - expressions like - enums["java.math.RoundingMode"].UP in the - template. The enum values can be used as scalars and support - equality and inequality comparisons. More info...

      -
    • - -
    • -

      freemarker.ext.rhino.RhinoWrapper now - correctly translates Rhino Undefined - instance, UniqueTag.NOT_FOUND, and - UniqueTag.NULL to FreeMarker undefined - value.

      -
    • -
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui.html b/fmpp/docs/freemarker/xgui.html deleted file mode 100644 index f32cb0e..0000000 --- a/fmpp/docs/freemarker/xgui.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - FreeMarker Manual - XML Processing Guide - - - - - - - - -
    - - - - - -

    -Part IV   XML Processing Guide

    - -
    -

    - - Part Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_declarative.html b/fmpp/docs/freemarker/xgui_declarative.html deleted file mode 100644 index b3bd710..0000000 --- a/fmpp/docs/freemarker/xgui_declarative.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - FreeMarker Manual - Declarative XML processing - - - - - - - - -
    - - - - - -

    -Chapter 3   Declarative XML processing

    - -
    -

    - - Chapter Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_declarative_basics.html b/fmpp/docs/freemarker/xgui_declarative_basics.html deleted file mode 100644 index 5755504..0000000 --- a/fmpp/docs/freemarker/xgui_declarative_basics.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - - FreeMarker Manual - Basics - - - - - - - - -
    - - - - - -

    -Basics

    - - -
    -

    Note

    - -

    This section uses the DOM tree and the variable made in a previous chapter.

    -
    -

    With the imperative approach of XML processing -- this was shown - in the previous chapter -- you write an FTL program that walks the - tree to find the different kind of nodes. With the declarative - approach, you rather define how to handle the different kind of nodes, - and then let FreeMarker walk the tree an call the handlers you have - defined. This approach is useful for complex XML schemas, where the - same element can occur as the child of many other elements. Examples - of such schemas are XHTML and XDocBook.

    The directive you most often use with the declarative approach - is the recurse - directive. This directive gets a node variable as parameter, - and ``visits'' all its children nodes, one after the other, starting - with the first child. ``Visiting'' a node means that it calls a - user-defined directive (like a macro) that has the same name as the - name of the child node (?node_name). We say on - this, that the user-defined directive handles the - node. The node that the user-defined directive just handles is - available as special variable .node. For example, - this FTL:

    -
    -<#recurse doc>
    -
    -<#macro book>
    -  I'm the book element handler, and the title is: ${.node.title}
    -</#macro>  
    -

    will print (I have removed some disturbing white-space form the - output):

    -
    -I'm the book element handler, and the title is: Test Book  
    -

    If you call recurse without parameter, then - it uses .node, that is, it visits all children - nodes of the node currently handled. So this FTL:

    -
    -<#recurse doc>
    -
    -<#macro book>
    -  Book element with title ${.node.title}
    -    <#recurse>
    -  End book
    -</#macro>
    -
    -<#macro title>
    -  Title element
    -</#macro>
    -
    -<#macro chapter>
    -  Chapter element with title: ${.node.title}
    -</#macro>  
    -

    will print (I have removed disturbing white-space form the - output):

    -
    -Book element with title Test Book
    -Title element
    -Chapter element with title: Ch1
    -Chapter element with title: Ch2
    -End book  
    -

    You have seen how to define handlers for element nodes, but not - how to define handler for the text nodes. Since the name of the - handler is the same as the node-name of nodes it handles, and as the - node-name of all text nodes is @text (see the table), you define handler for the - text nodes like this:

    -
    -
    -<#macro @text>${.node?html}</#macro>  
    -

    Note the ?html. You have to HTML-escape the - text, since you generate output of HTML format.

    Here it is the template that transforms the XML to complete - HTML:

    -
    -<#recurse doc>
    -
    -<#macro book>
    -  <html>
    -    <head>
    -      <title><#recurse .node.title></title>
    -    </head>
    -    <body>
    -      <h1><#recurse .node.title></h1>
    -      <#recurse>
    -    </body>
    -  </html>
    -</#macro>
    -
    -<#macro chapter>
    -  <h2><#recurse .node.title></h2>
    -  <#recurse>
    -</#macro>
    -
    -<#macro para>
    -  <p><#recurse>
    -</#macro>
    -
    -<#macro title>
    -  <#--
    -    We have handled this element imperatively,
    -    so we do nothing here.
    -  -->
    -</#macro>
    -
    -<#macro @text>${.node?html}</#macro>  
    -

    and the output will be (now I will honestly include the annoying - white-space...):

    -
    -  <html>
    -    <head>
    -      <title>Test Book</title>
    -    </head>
    -    <body>
    -      <h1>Test Book</h1>
    -
    -  
    -    <h2>Ch1</h2>
    -
    -    
    -      <p>p1.1
    -
    -      <p>p1.2
    -
    -      <p>p1.3
    -
    -  
    -    <h2>Ch2</h2>
    -
    -    
    -      <p>p2.1
    -
    -      <p>p2.2
    -
    -  
    -    </body>
    -  </html>
    -
    -    
    -

    Note that you can reduce substantially the amount of superfluous - whitespace in the output by using the trim directives, as - <#t>. See also: Template Author's Guide/Miscellaneous/White-space handling

    You may say that the FTL that did it with imperative approach - was much shorter. That's true, but the example XML uses a very simple - schema, and as I said, the declarative approach brings its form with - XML schemas that are not that firm about what element can occur where. - Say, introduce element mark, that should color text - to red, does not mater where do you use it; in a - title, or in a para. For this, - with the declarative approach, you just add a macro:

    -
    -<#macro mark><font color=red><#recurse></font></#macro>  
    -

    And then <mark>...</mark> will - automatically work everywhere. So for certain XML schemas, declarative - XML processing will actually result in shorter, and what is even more - important, much clearer FTL-s, than imperative XML processing. It's up - to you to decide which approach to use when; don't forget that you can - mix the two approaches freely. Say, in an element handler, you can use - imperative approach to process the contents of that element.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_declarative_details.html b/fmpp/docs/freemarker/xgui_declarative_details.html deleted file mode 100644 index fc14d12..0000000 --- a/fmpp/docs/freemarker/xgui_declarative_details.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - FreeMarker Manual - Details - - - - - - - - -
    - - - - - -

    -Details

    - -
    -

    - - Page Contents - -

    - - -
    - - - - - - - -

    -Default handlers

    - - -

    For some XML node types, there is a default handler, which - will handle the node if you haven't defined a handler for the node - (i.e. if there is no user-defined directive available with name - identical to the node name). Here are these node types, and what the - default handler does:

    - -
    -
      -
    • -

      Text node: prints the text as it. Note, that in most - applications, this will not be good for you, because you should - escape the text before you send it to the output (with - ?html or ?xml or - ?rtf, ...etc. depends on the output - format).

      -
    • - -
    • -

      Processing instruction node: call handler called - @pi if you have created such user-defined - directive, otherwise do nothing (ignore the node).

      -
    • - -
    • -

      Comment node, document type node: Do nothing (ignore the - node).

      -
    • - -
    • -

      Document node: Call recurse, that is, - visit all children of the document node.

      -
    • -
    - - -

    Element and attribute nodes will be handled according to the - usual, XML independent mechanism. That is, - @node_type will be - called as handler, and if that's not defined, then an error stops - template processing.

    - -

    In the case of element nodes, this means that if you define a - macro (or other kind of user-defined directive) called - @element, that will catch all element nodes, - which has no more specific handler. If you have no - @element handler, then you - must define a handler for all possible - elements.

    - -

    Attribute nodes are not visited by the - recurse directive, so you don't need to write - handlers for them.

    - - - - - -

    -Visiting a single node

    - - -

    With the visit - directive you can visit a single node, instead of the - children of the node: - <#visit nodeToVisist>. - This can be useful sometimes.

    - - - - - -

    -XML namespaces

    - - - - -

    We said that the name of the handler user-defined directive - (like a macro) for an element is the name of the element. In fact, - it is the full-qualified name of the element: - prefix:elementName. - The rules regarding the usage of - prefix-es is the same - as with imperative processing. Thus, the user-defined - book directive handles only element - book that does not belong to any XML namespace - (unless you have specified a default XML namespace). So if the - example XML would use XML namespace - http://example.com/ebook:

    - -
    -
    -<book xmlns="http://example.com/ebook">
    -...  
    - - -

    Then the FTL should look as this:

    - -
    -
    -<#ftl ns_prefixes={"e":"http://example.com/ebook"}>
    -
    -<#recurse doc>
    -
    -<#macro "e:book">
    -  <html>
    -    <head>
    -      <title><#recurse .node["e:title"]></title>
    -    </head>
    -    <body>
    -      <h1><#recurse .node["e:title"]></h1>
    -      <#recurse>
    -    </body>
    -  </html>
    -</#macro>
    -
    -<#macro "e:chapter">
    -  <h2><#recurse .node["e:title"]></h2>
    -  <#recurse>
    -</#macro>
    -
    -<#macro "e:para">
    -  <p><#recurse>
    -</#macro>
    -
    -<#macro "e:title">
    -  <#--
    -    We have handled this element imperatively,
    -    so we do nothing here.
    -  -->
    -</#macro>
    -
    -<#macro @text>${.node?html}</#macro>  
    - - -

    Or, you can define a default XML namespace, and then the - further part of the template remains the same as in the original XML - namespace free example:

    - -
    -
    -<#ftl ns_prefixes={"D":"http://example.com/ebook"}>
    -
    -<#recurse doc>
    -
    -<#macro book>
    -...  
    - - -

    But in this case don't forge that in XPath expressions (we - didn't used any in the example) the default XML namespace must be - accessed with an explicit D: since names without - prefix always refer to nodes with no XML namespace in XPath. Also - note that with the same logic as with imperative XML processing, the - name of handlers for elements that has no XML namespace is - N:elementName if (and - only if) there is a default XML namespace. However, for nodes that - are not of type element (such as text nodes), you never use the - N prefix in the handler name, because those nodes - are free of the idea of XML namespaces. So for example, the handler - for text nodes is always just @text.

    - -

    For more detailed information, please read the reference of - recurse and visit - directives.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_expose.html b/fmpp/docs/freemarker/xgui_expose.html deleted file mode 100644 index f4f87a3..0000000 --- a/fmpp/docs/freemarker/xgui_expose.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - FreeMarker Manual - Exposing XML documents - - - - - - - - -
    - - - - - -

    -Chapter 1   Exposing XML documents

    - -
    -

    - - Chapter Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_expose_dom.html b/fmpp/docs/freemarker/xgui_expose_dom.html deleted file mode 100644 index 5dea0da..0000000 --- a/fmpp/docs/freemarker/xgui_expose_dom.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - FreeMarker Manual - The DOM tree - - - - - - - - -
    - - - - - -

    -The DOM tree

    - - -

    We will use this XML document for the examples:

    -
    -<book>
    -  <title>Test Book</title>
    -  <chapter>
    -    <title>Ch1</title>
    -    <para>p1.1</para>
    -    <para>p1.2</para>
    -    <para>p1.3</para>
    -  </chapter>
    -  <chapter>
    -    <title>Ch2</title>
    -    <para>p2.1</para>
    -    <para>p2.2</para>
    -  </chapter>
    -</book>  
    -

    W3C DOM models an XML document as a tree of nodes. The node tree - of the above XML can be visualized as:

    -
    -document
    - |
    - +- element book
    -     |
    -     +- text "\n  "
    -     |
    -     +- element title
    -     |   |
    -     |   +- text "Test Book"
    -     |
    -     +- text "\n  "
    -     |
    -     +- element chapter
    -     |   |
    -     |   +- text "\n    "
    -     |   |
    -     |   +- element title
    -     |   |   |
    -     |   |   +- text "Ch1"
    -     |   |
    -     |   +- text "\n    "
    -     |   |
    -     |   +- element para     
    -     |   |   |
    -     |   |   +- text "p1.1"
    -     |   |
    -     |   +- text "\n    "
    -     |   |
    -     |   +- element para     
    -     |   |   |
    -     |   |   +- text "p1.2"
    -     |   |
    -     |   +- text "\n    "
    -     |   |
    -     |   +- element para     
    -     |      |
    -     |      +- text "p1.3"
    -     |
    -     +- element
    -         |
    -         +- text "\n    "
    -         |
    -         +- element title
    -         |   |
    -         |   +- text "Ch2"
    -         |
    -         +- text "\n    "
    -         |
    -         +- element para     
    -         |   |
    -         |   +- text "p2.1"
    -         |
    -         +- text "\n    "
    -         |
    -         +- element para     
    -             |
    -             +- text "p2.2"  
    -

    Note that the disturbing "\n  "-s are the - line-breaks (indicated here with \n, an escape - sequence used in FTL string literals) and the indentation spaces - between the tags.

    Notes on the DOM related terminology:

    -
      -
    • -

      The topmost node of a tree is called the root. In the case of XML documents, it is - always the ``document'' node, and not the top-most element - (book in this example).

      -
    • - -
    • -

      We say that node B is the child of node A, if B is the - immediate descendant of A. For example, the - two chapter element nodes are the children of - the book element node, but the - para element nodes are not.

      -
    • - -
    • -

      We say that node A is the parent of node B, if A is the - immediate ascendant of node B, that is, if B - is the children of A. For example, the book - element node is the parent of the two chapter - element nodes, but it is not the parent of the - para element nodes.

      -
    • - -
    • -

      There are several kind of components that can occur in XML - documents, such as elements, text, comments, processing - instructions, etc. All such components are nodes in the DOM tree, - so there are element nodes, text nodes, comment nodes, etc. In - principle, the attributes of elements are also nodes in the tree - -- they are the children of the element --, but still, usually we - (and other XML related technologies) exclude them of element - children. So basically they don't count as children nodes.

      -
    • -
    -

    The programmer drops the document node of the DOM tree into the - FreeMarker data-model, and then the template author can walk the DOM - tree using that variable as the starting-point.

    The DOM nodes in FTL correspond to node - variables. This is a variable type, similarly to type - string, number, hash, etc. Node variable type makes it possible for - FreeMarker to get the parent node and the child nodes of a node. This - is technically required to allow the template author to navigate - between the nodes, say, to use the node built-ins or the visit and - recurse - directives; we will show the usage of these in the further - chapters.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_expose_put.html b/fmpp/docs/freemarker/xgui_expose_put.html deleted file mode 100644 index eea6c21..0000000 --- a/fmpp/docs/freemarker/xgui_expose_put.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - FreeMarker Manual - Putting the XML into the data-model - - - - - - - - -
    - - - - - -

    -Putting the XML into the data-model

    - - -
    -

    Note

    - -

    This section is for programmers.

    -
    -

    It's easy to create a simple program to try the examples. Just - replace the ``Create a data-model'' part of the example of Programmer's Guide - Quickstart with this:

    -
    -/* Create a data-model */
    -Map root = new HashMap();
    -root.put(
    -        "doc",
    -        freemarker.ext.dom.NodeModel.parse(new File("the/path/of/the.xml")));  
    -

    and then you have a program that outputs the result of the XML - transformation to the standard output (usually the terminal - screen).

    Notes:

    -
      -
    • -

      The parse method removes comment and - processing instruction nodes by default. See the API for more - details.

      -
    • - -
    • -

      NodeModel also allows you to wrap - org.w3c.dom.Node-s directly. You may want to - clean up the DOM tree first with the static utility methods, such - as NodeModel.simplify or your own custom - cleanup routines.

      -
    • -
    -

    Note that there are tools available that you can use to generate - files from XML documents, so you don't have to write your own for this - common task. See here...

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_imperative.html b/fmpp/docs/freemarker/xgui_imperative.html deleted file mode 100644 index 5bcb4e3..0000000 --- a/fmpp/docs/freemarker/xgui_imperative.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - FreeMarker Manual - Imperative XML processing - - - - - - - - -
    - - - - - -

    -Chapter 2   Imperative XML processing

    - -
    -

    - - Chapter Contents - -

    - - -
    - - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_imperative_formal.html b/fmpp/docs/freemarker/xgui_imperative_formal.html deleted file mode 100644 index 1ef121d..0000000 --- a/fmpp/docs/freemarker/xgui_imperative_formal.html +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - - FreeMarker Manual - Details - - - - - - - - -
    - - - - - -

    -Details

    - - -

    Every variable that corresponds to a single node in the DOM tree - is a multi-type variable of type node and type hash (for programmers: - implements both TemplateNodeModel and - TemplateHashModel). Thus, you can use the node built-ins with them. Hash keys - are interpreted as XPath expressions, except the special keys shown in - the table below. Some of the node variables also have string type, so - you can use them as string variables (for programmers: they implement - TemplateScalarModel).

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Node type (?node_type)Node name (?node_name)String value (e.g. <p>${node})Special hash keys
    "document""@document"No string value. (Error when you try to use it as - string.)"elementName", - "prefix:elementName", - "*", "**", - "@@markup", - "@@nested_markup", - "@@text"
    "element""name": the - name of the element. This is the local name (i.e. name without - namespace prefix).If it has no element children, the text of all text node - children concatenated together. Error otherwise, when you try to - use it as string."elementName", - "prefix:elementName", - "*", "**", - "@attrName", - "@prefix:attrName", - "@@", "@*", - "@@start_tag", - "@@end_tag", - "@@attributes_markup", - "@@markup", - "@@nested_markup", - "@@text", "@@qname"
    "text""@text"The text itself."@@markup", - "@@nested_markup", - "@@text"
    "pi""@pi$target"The part between the target name and the - ?>."@@markup", - "@@nested_markup", - "@@text"
    "comment""@comment"The text of the comment, without the delimiters - <!-- and -->."@@markup", - "@@nested_markup", - "@@text"
    "attribute""name": the - name of the attribute. This is the local name (i.e. name without - namespace prefix).The value of the attribute."@@markup", - "@@nested_markup", - "@@text", "@@qname"
    "document_type""@document_type$name": - name is the name - of the document element.No string value. (Error when you try to use it as - string.)"@@markup", - "@@nested_markup", - "@@text"
    -
    -

    Notes:

    -
      -
    • -

      There is no CDATA type. CDATA nodes are transparently - considered as text nodes.

      -
    • - -
    • -

      Variables do not support - ?keys and ?values.

      -
    • - -
    • -

      Element and attribute node names are local names, that is, - they do not contain the namespace prefix. The URI of the namespace - the node belongs to can be queried with the - ?node_namespace built-in.

      -
    • - -
    • -

      XPath expression needs Jaxen (recommended, but please use - 1.1-beta-8 or later; download - it here) or Apache Xalan classes available, or an error - will stop template execution. Note, however, that as some special - hash keys hide the XPath expressions of the same meaning, those - XPath expressions will work even if there is no XPath - implementation available. If both - Xalan and Jaxen is available, FreeMarker will use Xalan, unless - you choose Jaxen by calling - freemarker.ext.dom.NodeModel.useJaxenXPathSupport() - from Java.

      -
    • - -
    • -

      If Jaxen is used for the XPath support (not Xalan), then - FreeMarker variables are visible with XPath variable references - (e.g. - doc["book/chapter[title=$currentTitle]"]).

      -
    • -
    -

    Meaning of special hash keys:

    -
      -
    • -

      "elementName", - "prefix:elementName": - Returns the sequence of child nodes that are elements of name - elementName. (Note - that the term ``child'' means immediate - descendant.) The selection is XML name-space aware, unless the XML - document was persed with an XML parser that was not in namespace - aware mode. In XML name-space aware mode, names without prefix - (elementName) selects only elements - that doesn't belong to any XML name-space (unless you have - registered a default XML namespace), and names with prefix - (prefix:elementName) - selects only elements that are belonging to the XML namespace - denoted by the prefix. The registration of prefixes and the - setting of the default XML namespace is done with the - ns_prefixes parameter of the ftl - directive.

      -
    • - -
    • -

      "*": Returns the sequence of all child - (direct descedant) element nodes. The - sequence will contain the elements in the ``document order'', that - is, in the order in which the first character of the XML - representation of each node occurs (after expansion of general - entities).

      -
    • - -
    • -

      "**": Returns the sequence of all - descendant element nodes. The sequence will - contain the elements in the document order.

      -
    • - -
    • -

      "@attName", - "@prefix:attrName": - Returns the attribute - attName of the - element as a sequence of size 1 that contains the attribute node, - or as an empty sequence if the attribute does not exist (so to - check if an attribute exists use - foo.@attName[0]??, - not - foo.@attName??). As - with special key - "elementName", if - the length of the sequence is 1, then it also acts as its first - subvariable. If no - prefix is used, then - it returns only attribute that does not use XML namespace (even if - you have set a default XML namespace). If a - prefix is used, it - returns only the attribute that belongs to the XML namespace - associated with the - prefix. The - registration of prefixes is done with the - ns_prefixes parameter of the ftl - directive.

      -
    • - -
    • -

      "@@" or "@*": Returns - the sequence of attribute nodes belonging to the parent element. - This is the same as XPath @*.

      -
    • - -
    • -

      "@@qname": Returns the full-qualified - name of the element (such as e:book, in - contrast to the local name returned by - ?node_name that is book) . - The prefix used (as e) is chosen based on the - prefix registered in the current namespace with the - ns_prefixes parameter of the - ftl directive, and not influenced by the prefix - used in the source XML document. If you have set a default XML - namespace, then for nodes that use that, prefix - D will be used. For nodes that does not belong - to an XML namespace, no prefix is used (even if you have set a - default namespace). If there is no prefix registered for the - namespace of the node, the result is a non-existent variable - (node.@@qname?? is - false).

      -
    • - -
    • -

      "@@markup": This returns the full XML - markup of a node, as a string. (Full XML markup means that it also - contains the markup of the child nodes, and the markup of the - children of the child nodes, and so on.) The markup you get is not - necessary the same as the markup in the source XML file, it's just - semantically identical. Especially, note that CDATA sections will - become to plain text. Also note that depending on how did you - wrapped the original XML document with FreeMarker, comment or - processing instruction nodes may were removed, and then they will - be missing from the output of course. The first outputted start - tag will contain - xmlns:prefix - attributes for each XML name-spaces used in the outputted XML - fragment, and those prefixes will be used in the outputted element - and attribute names. These prefixes will be the same as the - prefixes registered with the ns_prefixes - parameter of the ftl directive (no prefix will - be used for D, as it will be registered as the - default name-space with an xmlns attribute), or - if no prefix was assigned for a XML name-space with that, then an - arbitrary chosen unused prefix is used.

      -
    • - -
    • -

      "@@nested_markup": This is similar to - "@@markup", but it returns the XML markup of an - element without its opening and closing tags. For the document - node, it returns the same as "@@markup". For - other node types (text, processing instruction, etc.), it returns - an empty string. Unlike with "@@markup", no - xmlns:prefix - attributes will be placed into the ouput, but regarding the - prefixes used in element and attribute names the rules are the - same.

      -
    • - -
    • -

      "@@text": This returns the value of all - text nodes that occur within the node (all descendant text nodes, - not just direct children), concatenated together into a single - string. If the node has no text node children, then the result is - an empty string.

      -
    • - -
    • -

      "@@start_tag": Returns the markup of the - start-tag of the element - node. As with @@markup, the output is not - necessary the same as in the original XML document, but it is - semantically equivalent with that. Regarding the XML name-spaces - (xmlns:prefix - attributes in the output, etc.) the rules are the same as with - "@@markup"

      -
    • - -
    • -

      "@@end_tag": Returns the markup of the - end-tag of the element node. - As with @@markup, the output is not necessary - the same as in the original XML document, but it is semantically - equivalent with that.

      -
    • - -
    • -

      @@attributes_markup: Returns the markup - of the attributes of the - element node. As with @@markup, the output is - not necessary the same as in the original XML document, but it is - semantically equivalent with that.

      -
    • -
    - - - - - -

    -Node sequences

    - - -

    Many of the special hash keys (indicated in the above list), - and XPath expressions that result in node-sets (see the XPath recommendation) - return a sequence of nodes.

    - -

    These node sequences, if they store exactly 1 subvariable, - will also act as the subvariable itself. For example, - ${book.title[0]} will do the same as - ${book.title}, if there is only one - title element child of element - book.

    - -

    Returning an empty node sequence is a normal situation. For - example, if in a concrete XML document, element - book has no child element - chapter, then book.chapter - results in an empty node sequence. Beware! This also means, that - book.chaptre (note the typo) will also return - empty node sequence, and will not stop with error. Also, - book.chaptre?? (note the typo) will return - true because the empty sequence exists, so you - have to use book.chaptre[0]?? for the - check.

    - -

    Node sequences that store not 1 nodes (but 0 or more than 1 - nodes) also support some of the hash keys described above. Namely, - the following special keys are supported:

    - -
    -
      -
    • -

      "elementName", - "prefix:elementName"

      -
    • - -
    • -

      "@attrName", - "@prefix:attrName"

      -
    • - -
    • -

      "@@markup", - "@@nested_markup"

      -
    • - -
    • -

      "@@text"

      -
    • - -
    • -

      "*", "**"

      -
    • - -
    • -

      "@@", "@*"

      -
    • -
    - - -

    When you apply one of the above special keys on a node - sequence that contains more than 1 or 0 nodes, then for each node in - the sequence (where the special key does make sense, e.g. text nodes - will be skipped for key * or - @foo), the special key will be applied as it was - explained for single nodes, and the results will be concatenated to - form the final result. The results will be concatenated in the order - as the corresponding nodes occur in the node sequence. The - concatenation means string or sequence concatenation depending on - the type of the results. If the special key would result in a string - for a single node, then for multiple nodes the result is a single - string too (the results for the single nodes concatenated), and if - the special key would return a sequence for a single node, then for - multiple nodes the result is a single sequence too. If there are 0 - nodes in the sequence you apply the special key on, the string - result is an empty string or an empty sequence respectively.

    - -

    XPath expressions can be used with node sequences. However, - for 0 or more than 1 nodes it will work only if you use Jaxen - instead of Xalan, because of the limitations of the Xalan XPath - implementation.

    - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_imperative_learn.html b/fmpp/docs/freemarker/xgui_imperative_learn.html deleted file mode 100644 index c074f29..0000000 --- a/fmpp/docs/freemarker/xgui_imperative_learn.html +++ /dev/null @@ -1,781 +0,0 @@ - - - - - - - - FreeMarker Manual - Basics - - - - - - - - -
    - - - - - -

    -Basics

    - - - - -
    -

    Note

    - -

    This section uses the DOM tree and the variable made in the - previous chapter.

    -
    -

    Assume that the programmer has put the XML document into the - data-model as variable doc. This variable - corresponds to the root of the DOM - tree, the ``document''. The actual variable structure behind - doc is wily enough, and only roughly resembles the - DOM tree. So instead of getting lost in the details, let's see how to - use it by example.

    - - - - -

    -Accessing elements by name

    - - -

    This FTL prints the title of the book:

    - -
    -
    -<h1>${doc.book.title}</h1>  
    - - -

    The output will be:

    - -
    -
    -<h1>Test Book</h1>  
    - - -

    As you see, both doc and - book can be used as hashes; you get their child - nodes as subvariables. Basically, you describe the path by which you - reach the target (element title) in the DOM tree. - You may notice that there was some swindle above: with - ${doc.book.title}, it seems that we instruct - FreeMarker to print the title element itself, but - we should print its child text node (check the DOM tree). It still works, because - elements are not only hash variables, but string variables as well. - The scalar value of an element node is the string resulting from the - concatenation of all its text child nodes. However, trying to use an - element as scalar will cause error if the element has child - elements. For example ${doc.book} would stop with - error.

    - -

    This FTL prints the titles of the two chapters:

    - -
    -
    -<h2>${doc.book.chapter[0].title}</h2>
    -<h2>${doc.book.chapter[1].title}</h2>  
    - - -

    Here, as book has 2 - chapter element children, - doc.book.chapter is a sequence that stores the - two element nodes. Thus, we can generalize the above FTL, so it - works with any number of chapters:

    - -
    -
    -<#list doc.book.chapter as ch>
    -  <h2>${ch.title}</h2>
    -</#list>  
    - - -

    But what's if there is only one chapter? Actually, when you - access an element as hash subvariable, it is - always a sequence as well (not only hash and - string), but if the sequence contains exactly 1 item, then the - variable also acts as that item itself. So, returning to the first - example, this would print the book title as well:

    - -
    -
    -<h1>${doc.book[0].title[0]}</h1>  
    - - -

    But you know that there is exactly 1 book - element, and that a book has exactly 1 title, so you can omit the - [0]-s. - ${doc.book.chapter.title} would work too, if the - book happen to have only 1 chapter-s (otherwise - it is ambiguous: how is it to know if the title - of which chapter you want? So it stops with an - error.). But since a book can have multiple chapters, you don't use - this form. If the element book has no - chapter child, then - doc.book.chapter will be a 0 length sequence, so - the FTL with <#list ...> will still - work.

    - -

    It is important to realize the consequence that, for example, - if book has no chapter-s then - book.chapter is an empty sequence, so - doc.book.chapter?? will not - be false, it will be always - true! Similarly, - doc.book.somethingTotallyNonsense?? will not be - false either. To check if there was no children - found, use doc.book.chapter[0]?? (or - doc.book.chapter?size == 0). Of course you can - use similarly all the missing value handler - operators (e.g. - doc.book.author[0]!"Anonymous"), just don't - forget that [0].

    - -
    -

    Note

    - -

    The rule with sequences of size 1 is a convenience feature - of the XML wrapper (implemented via multi-type FTL variables). It - will not work with other sequences in general.

    -
    - - -

    Now we finish the example by printing all the - para-s of each chapter:

    - -
    -
    -<h1>${doc.book.title}</h1>
    -<#list doc.book.chapter as ch>
    -  <h2>${ch.title}</h2>
    -  <#list ch.para as p>
    -    <p>${p}
    -  </#list>
    -</#list>  
    - - -

    this will print:

    - -
    -
    -<h1>Test</h1>
    -  <h2>Ch1</h2>
    -    <p>p1.1
    -    <p>p1.2
    -    <p>p1.3
    -  <h2>Ch2</h2>
    -    <p>p2.1
    -    <p>p2.2  
    - - -

    The above FTL could be written more nicely as:

    - -
    -
    -<#assign book = doc.book>
    -<h1>${book.title}</h1>
    -<#list book.chapter as ch>
    -  <h2>${ch.title}</h2>
    -  <#list ch.para as p>
    -    <p>${p}
    -  </#list>
    -</#list>  
    - - -

    Finally, a ``generalized`` usage of the child selector - mechanism: this template lists all para-s of the - example XML document:

    - -
    -
    -<#list doc.book.chapter.para as p>
    -  <p>${p}
    -</#list>  
    - - -

    The output will be:

    - -
    -
    -  <p>p1.1
    -  <p>p1.2
    -  <p>p1.3
    -  <p>p2.1
    -  <p>p2.2
    -    
    - - -

    This example shows that hash subvariables select the children - of a sequence of notes (just in the earlier examples that sequence - happened to be of size 1). In this concrete case, subvariable - chapter returns a sequence of size 2 (since there - are two chapter-s), and then subvariable - para selects the para child - nodes of all nodes in that sequence.

    - -

    A negative consequence of this mechanism is that things like - doc.somethingNonsense.otherNonsesne.totalNonsense - will just evaluate to an empty sequence, and you don't get any error - messages.

    - - - - - -

    -Accessing attributes

    - - -

    This XML is the same as the original, except that it uses - attributes for the titles, instead of elements:

    - -
    -
    -<!-- THIS XML IS USED FOR THE "Accessing attributes" CHAPTER ONLY! -->
    -<!-- Outside this chapter examples use the XML from earlier.       -->
    -
    -<book title="Test">
    -  <chapter title="Ch1">
    -    <para>p1.1</para>
    -    <para>p1.2</para>
    -    <para>p1.3</para>
    -  </chapter>
    -  <chapter title="Ch2">
    -    <para>p2.1</para>
    -    <para>p2.2</para>
    -  </chapter>
    -</book>  
    - - -

    The attributes of an element can be accessed in the same way - as the child elements of the element, except that you put an at-sign - (@) before the name of the attribute:

    - -
    -
    -<#assign book = doc.book>
    -<h1>${book.@title}</h1>
    -<#list book.chapter as ch>
    -  <h2>${ch.@title}</h2>
    -  <#list ch.para as p>
    -    <p>${p}
    -  </#list>
    -</#list>  
    - - -

    This will print exactly the same as the previous - example.

    - -

    Getting attributes follows the same logic as getting child - elements, so the result of ch.@title above is a - sequence of size 1. If there were no title - attribute, then the result would be a sequence of size 0. So be - ware, using existence built-ins is tricky here too: if you are - curious if foo has attribute - bar then you have to write - foo.@bar[0]??. (foo.@bar?? is - wrong, because it always returns true.) - Similarly, if you want a default value for the - bar attribute, then you have to write - foo.@bar[0]!"theDefaultValue".

    - -

    As with child elements, you can select the attributes of - multiple nodes. For example, this template prints the titles of all - chapters:

    - -
    -
    -<#list doc.book.chapter.@title as t>
    -  ${t}
    -</#list>  
    - - - - - - -

    -Exploring the tree

    - - -

    This FTL will enumerate all child nodes of the book - element:

    - -
    -
    -<#list doc.book?children as c>
    -- ${c?node_type} <#if c?node_type = 'element'>${c?node_name}</#if>
    -</#list>  
    - - -

    this will print:

    - -
    -
    -- text
    -- element title
    -- text
    -- element chapter
    -- text
    -- element chapter
    -- text  
    - - -

    The meaning of ?node_type is probably clear - without explanation. There are several node types that can occur in - a DOM tree, such as "element", - "text", "comment", - "pi", ...etc.

    - -

    The ?node_name returns the name of element - for element nodes. For other node types, it also returns something, - but that's mainly useful for declarative XML processing, which will - be discussed in a later - chapter.

    - -

    If the book element had attributes, they would - not appear in the above list, for practical - reasons. But you can get a list that contains all attributes of the - element, with subvariable @@ of the element - variable. If you modify the first line of the XML to this:

    - -
    -
    -<book foo="Foo" bar="Bar" baaz="Baaz">  
    - - -

    and run this FTL:

    - -
    -
    -<#list doc.book.@@ as attr>
    -- ${attr?node_name} = ${attr}
    -</#list>  
    - - -

    then you get this output (or something similar):

    - -
    -
    -- baaz = Baaz
    -- bar = Bar
    -- foo = Foo  
    - - -

    Returning to the listing of children, there is a convenience - subvariable to list only the element children of an element:

    - -
    -
    -<#list doc.book.* as c>
    -- ${c?node_name}
    -</#list>  
    - - -

    This will print:

    - -
    -
    -- title
    -- chapter
    -- chapter  
    - - -

    You get the parent of an element with the - parent built-in:

    - -
    -
    -<#assign e = doc.book.chapter[0].para[0]>
    -<#-- Now e is the first para of the first chapter -->
    -${e?node_name}
    -${e?parent?node_name}
    -${e?parent?parent?node_name}
    -${e?parent?parent?parent?node_name}  
    - - -

    This will print:

    - -
    -
    -para
    -chapter
    -book
    -@document  
    - - -

    In the last line you have reached the root of the DOM tree, - the document node. It's not an element, and this is why it has that - strange name; don't deal with it now. Obviously, the document node - has no parent.

    - -

    You can quickly go back to the document node using the - root built-in:

    - -
    -
    -<#assign e = doc.book.chapter[0].para[0]>
    -${e?root?node_name}
    -${e?root.book.title}  
    - - -

    This will print:

    - -
    -
    -@document
    -Test Book  
    - - -

    For the complete list of built-ins you can use to navigate in - the DOM tree, read the reference - of node built-ins.

    - - - - - -

    -Using XPath expressions

    - - -
    -

    Note

    - -

    XPath expressions work only if Jaxen (recommended, but use - at least Jaxen 1.1-beta-8, not older) or Apache Xalan - classes are available. (Apache Xalan classes are included in Sun - J2SE 1.4, 1.5 and 1.6 (and maybe later too); no separate Xalan jar - is needed.)

    -
    - - -
    -

    Note

    - -

    Don't use the sample XML from the previous section, where - title is an attribute; that applies only to - that section.

    -
    - - -

    If a hash key used with a node variable can't be interpreted - otherwise (see the next - section for the precise definition), then it will by - interpreted as an XPath expression. For more information on XPath, - please visit http://www.w3.org/TR/xpath.

    - -

    For example, here we list the para elements - of the chapter with title element (not - attribute!) content "Ch1'':

    - -
    -
    -<#list doc["book/chapter[title='Ch1']/para"] as p>
    -  <p>${p}
    -</#list>  
    - - -

    It will print:

    - -
    -
    -  <p>p1.1
    -  <p>p1.2
    -  <p>p1.3  
    - - -

    The rule with sequences of length 1 (explained in earlier - sections) stands for XPath results as well. That is, if the - resulting sequence contains exactly 1 node, it also acts as the node - itself. For example, print the first paragraph of chapter - ``Ch1'':

    - -
    -
    -${doc["book/chapter[title='Ch1']/para[1]"]}  
    - - -

    which prints the same as:

    - -
    -
    -${doc["book/chapter[title='Ch1']/para[1]"][0]}  
    - - -

    The context node of the XPath expression is the node (or - sequence of nodes) whose hash subvariable is used to issue the XPath - expression. Thus, this prints the same as the previous - example:

    - -
    -
    -${doc.book["chapter[title='Ch1']/para[1]"]}  
    - - -

    Note that currently you can use a sequence of 0 or multiple - (more than 1) nodes as context only if the programmer has set up - FreeMarker to use Jaxen instead of Xalan.

    - -

    Also note that XPath indexes sequence items from 1, while FTL - indexes sequence items from 0. Thus, to select the first chapter, - the XPath expression is "/book/chapter[1]", while - the FTL expression is book.chapter[0].

    - -

    If the programmer has set up FreeMarker to use Jaxen instead - of Xalan, then FreeMarker variables are visible with XPath variable - references:

    - -
    -
    -<#assign currentTitle = "Ch1">
    -<#list doc["book/chapter[title=$currentTitle]/para"] as p>
    -...  
    - - -

    Note that $currentTitle is not a FreeMarker - interpolation, as there are no { and - } there. That's an XPath expression.

    - -

    The result of some XPath expressions is not a node-set, but a - string, a number, or a boolean. For those XPath expressions, the - result is an FTL string, number, or boolean variable respectively. - For example, the following will count the total number of - para elements in the XML document, so the result - is a number:

    - -
    -
    -${x["count(//para)"]}  
    - - -

    The output will be:

    - -
    -
    -5  
    - - - - - - -

    -XML namespaces

    - - - - -

    Be default, when you write something like - doc.book, then it will select the element with - name book that does not belongs to any XML - namespace (similarly to XPath). If you want to select an element - that is inside an XML namespace, you must register a prefix and use - that. For example, if element book is in XML - namespace http://example.com/ebook, then you have - to associate a prefix with it at the top of the template with the - ns_prefixes parameter of the ftl - directive:

    - -
    -
    -<#ftl ns_prefixes={"e":"http://example.com/ebook"}>  
    - - -

    And now you can write expressions as - doc["e:book"]. (The usage of square bracket - syntax was required because the colon would confuse FreeMarker - otherwise.)

    - -

    As the value of ns_prefixes is a hash, you - can register multiple prefixes:

    - -
    -
    -<#ftl ns_prefixes={
    -    "e":"http://example.com/ebook",
    -    "f":"http://example.com/form",
    -    "vg":"http://example.com/vectorGraphics"}
    ->  
    - - -

    The ns_prefixes parameter affects the whole - FTL namespace. This means - in practice that the prefixes you have registered in the main page - template will be visible in all <#include - ...>-d templates, but not in <#imported - ...>-d templates (often referred as FTL libraries). Or - from another point of view, an FTL library can register XML - namespace prefixes for it's own use, without interfering with the - prefix registrations of the main template and other - libraries.

    - -

    Note that, if an input document is dominated by a given XML - namespace, you can set that as the default namespace for - convenience. This means that if you don't use prefix, as in - doc.book, then it selects element that belongs to - the default namespace. The setting of the default namespace happens - with reserved prefix D, for example:

    - -
    -
    -<#ftl ns_prefixes={"D":"http://example.com/ebook"}>  
    - - -

    Now expression doc.book select the - book element that belongs to XML namespace - http://example.com/ebook. Unfortunately, XPath - does not support this idea of a default namespace. Thus, in XPath - expressions, element names without prefixes always select the - elements that does not belong to any XML namespace. However, to - access elements in the default namespace you can directly use prefix - D, for example: - doc["D:book/D:chapter[title='Ch1']"].

    - -

    Note that when you use a default namespace, then you can - select elements that does not belong to any node namespace with - reserved prefix N, for example - doc.book["N:foo"]. It doesn't go for XPath - expressions, where the above can be witten as - doc["D:book/foo"].

    - - - - - -

    -Don't forget escaping!

    - - -

    We have made a big mistake in all examples. We generate output - of HTML format, and HTML format reserves characters as - <, &, etc. So when we - print plain text (as the titles and paragraphs), we have to escape - it. Thus, the correct version of the example is:

    - -
    -
    -<#escape x as x?html>
    -<#assign book = doc.book>
    -<h1>${book.title}</h1>
    -<#list book.chapter as ch>
    -  <h2>${ch.title}</h2>
    -  <#list ch.para as p>
    -    <p>${p}
    -  </#list>
    -</#list>
    -</#escape>  
    - - -

    So if the book title is "Romeo & Julia", the resulting - HTML output will be correctly:

    - -
    -
    -...
    -<h1>Romeo &amp; Julia</h1>
    -...  
    - - -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/freemarker/xgui_preface.html b/fmpp/docs/freemarker/xgui_preface.html deleted file mode 100644 index e0c109e..0000000 --- a/fmpp/docs/freemarker/xgui_preface.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - FreeMarker Manual - Preface - - - - - - - - -
    - - - - - -

    -Preface

    - - -

    Although FreeMarker was originally designed as a web page template - engine, as of version 2.3 it also targets another application domain: - transforming XML into arbitrary textual output (e.g. HTML files). Thus, - in many cases, FreeMarker is an XSLT alternative.

    Technically, there is nothing special in transforming XML - documents. It's just like when you do anything else with FreeMarker: you - drop the XML document into the data-model (and possibly other - variables), and then you merge the data-model with the FTL template(s) - that generate the output text. The extra features introduced for better - XML processing are the node FTL variable type (symbolizes a node in - generic tree structures, usable not only for XML) and the built-ins and - directives dealing with them, and the XML wrapper you get out-of-the-box - that exposes XML documents as FTL variables for the templates.

    What's the difference between using FreeMarker or XSLT? The FTL - language has the usual imperative/procedural logic. On the other hand, - XSLT is a language with declarative style, designed by "too clever" - people, so it's not easy to adopt its logic, nor to use it in many - cases. Also its syntax is terribly verbose. However, XSLT's - "apply-templates" method can be very handy when you process XML - documents, thus FreeMarker supports something similar called the - ``visitor pattern''. So in many applications, it is much easier to write - FTL stylesheets than XSLT style-sheets. Another fundamental difference - is that FTL "transforms" the node tree to text, while XSLT transforms - the tree to another tree. So you cannot always use FreeMarker where you - can use XSLT.

    -
    - - - - - - - - - - -
    - FreeMarker Manual -- For FreeMarker 2.3.21 -
    - HTML generated: 2014-10-12 18:53:30 GMT -
    - - Edited with XMLMind XML Editor - -
    - -
    - Here! -
    - - - diff --git a/fmpp/docs/frontends.html b/fmpp/docs/frontends.html deleted file mode 100644 index 023be23..0000000 --- a/fmpp/docs/frontends.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - -Front-ends - FMPP - - - - - - - - - - - - - - - -
    -

    Front-ends

    - -
    -
    -

    Chapter Contents

    - -
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/ftl.html b/fmpp/docs/ftl.html deleted file mode 100644 index 0f20032..0000000 --- a/fmpp/docs/ftl.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - -FTL - FreeMarker Template Language - FMPP - - - - - - - - - - - - - - - -
    -

    FTL - FreeMarker Template Language

    - -
    -
    - -

    This is the syntax used for the template files. Please read the FreeMarker Manual about this.

    - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/index.html b/fmpp/docs/index.html deleted file mode 100644 index c85b3e7..0000000 --- a/fmpp/docs/index.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - -FMPP: Text file preprocessor (HTML preprocessor) - - - - - - - - - - - - - -
    -

    FMPP - FreeMarker-based file PreProcessor

    - -
    -
    -

    Page contents

    - -
    -
    -
    - - -

    What is FMPP?

    -

    FMPP is a general-purpose text file preprocessing tool that uses FreeMarker templates. It process entire directories recursively. It can be used for generating complete static websites, source code, configuration files, etc. It can insert data from sources like CSV, XML, and JSON into the generated files. (You can add new kind of data sources in Java.) See the Tutorial for a more concrete introduction.

    - -

    FMPP can be used with UN*X-style command-line interface, or as Ant task, or can be embedded into your application using its Java API.

    - -

    FMPP was written in Java, thus it runs on all modern platforms (Windows, "Linux", OS X, etc.).

    - -

    FMPP is Free software under Apache License 2.0. See license...

    - - -

    Features

    -

    A quick list of FMPP capabilities:

    -
      -
    • FreeMarker as the preprocessor language: -
        -
      • All the usual template constructs, such as include, if/else/elseif, loop.
      • -
      • Macros with named arguments and nested content (body).
      • -
      • Variables (global, or local for a macro call)
      • -
      • Complex expressions using string, arithmetical and logical operations.
      • - Extensible with custom functions. -
      • Automatic and manual escaping (HTML, XML, custom function)
      • -
      • Transforming (filtering) blocks of output; extensible with custom transformations in Java.
      • -
      • Capturing block of output into a variable.
      • -
      • Charset aware, internally uses UNICODE.
      • -
      • Number and date/time formatting with masks (patterns). Locale sensitive formatting.
      • -
      -
    • -
    • Bulk file processing: -
        -
      • Process entire directories recursively.
      • -
      • Different file processing mode can be chosen for each file, based on path patterns (as file extension): execute file as template, or parse it as XML and then render it to output with a template, or binary-copy it, or ignore it.
      • -
      • Can ignore bad source files and log the error message into a text file.
      • -
      • Can guarantee that certain files will be processed later than others.
      • -
      -
    • -
    • You can expose data from arbitrary data sources be writing extensions in Java. - Currently out-of-the-box supported data sources: -
        -
      • XML file
      • -
      • CSV and tab-separated text file
      • -
      • JSON file
      • -
      • Java "properties" file
      • -
      • Ant properties, Ant project and target information
      • -
      • System clock
      • -
      • Plain text file
      • -
      -
    • -
    • Other highlighted features: -
        -
      • Output splitting: a single source file can generate multiple output files (including 0 output files).
      • -
      • Automatic file inclusion, automatic escaping, and whatnot that can be done with automatically inserted headers and footers, chosen based on path patterns.
      • -
      • Generate HTML <img>-s with calculated width and height.
      • -
      • Calculate the relative path to the home directory, or to any other file.
      • -
      • Rendering (transforming) XML files with FreeMarker templates. (Similar to the typical XSLT usage pattern.)
      • -
      • Query the size/existence of source files.
      • -
      • Query output encoding (charset).
      • -
      • URL-escaping (with the actual output charset).
      • -
      -
    • -
    - - - -

    Documentation

    - - - -

    Download

    -

    To download the latest release, please visit the FMPP homepage: http://fmpp.sourceforge.net/

    - -

    For text editor and IDE plug-ins and other FreeMarker template-related tools, please visit the FreeMarker homepage: http://freemarker.org/ (mirror: http://freemarker.sourceforge.net/)

    - - -

    Contact

    - -

    Ask for help or provide suggestions:

    - - -
    -

    Please report bugs you find! Any programming, documentation content or grammatical mistakes (even minor typos). Thank you!

    -

    Use the bug reporting Web page,
    - or e-mail: ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)

    - -

    Please report FreeMarker bugs at the FreeMarker bug reporting Web page, not for me. If you are not sure if you have found a FreeMarker or FMPP bug, just report it as an FMPP bug.

    -
    - - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/installing.html b/fmpp/docs/installing.html deleted file mode 100644 index cc1b151..0000000 --- a/fmpp/docs/installing.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - -Installing - FMPP - - - - - - - - - - - - - - - -
    -

    Installing

    - -
    - -
    - - -

    Warning!

    -

    Please understand that FMPP, as a bulk file processor, may generates high amount of output files, and overwrites all files with the same names as the names of output files without warning. It's a practical decision comes from the usage pattern of the tool. So watch where will the output files go.

    - -

    Also note that, according the license, the author does not take responsibly if the usage of FMPP causes harm for you somehow.

    - - -

    Pre-requirements

    -
      -
    • Java must be installed on your machine (version 1.4 or later). Note that Java is available for free, and on various platforms (Windows, OS X, "Linux", etc.), so FMPP works on many platforms. -
    • If you want to use the FMPP Ant task, you need Ant 1.5.1 or later. If you don't know what's Ant then don't worry, you will not need it. -
    - - -

    Extracting

    -

    Extract the downloaded archive file (fmpp_X.X.X.tar.gz or fmpp_X.X.X.zip) into the directory where you prefer to store FMPP. For Windows users it is typically C:\fmpp or C:\Program Files\fmpp, for UN*X users it is typically ~/opt/fmpp or /opt/fmpp or /usr/lib/fmpp (where fmpp is the extracted fmpp_X.X.X directory after renaming). From now on I will refer to this directory as <FMPP_HOME>.

    - -

    - - - -

    Setup the command-line tool

    - - -

    On Windows

    -

    The steps are:

    -
      -
    1. Extract the downloaded archive file (fmpp_0.9.15.tar.gz or fmpp_0.9.15.zip) into C:\Program Files\fmpp (note that "Program Files" may be shown in a localized form, like "Programme") or C:\fmpp or wherever you prefer to. From now on I will refer to this directory as <FMPP_HOME>
    2. -
    3. For convenience, add <FMPP_HOME>/bin to the PATH environment variable. (How? Google: set path windows)
    4. -
    5. Check if fmpp.bat isn't present in C:\Windows (or in another directory in the PATH) from an earlier installation. Delete it if it does.
    6. -
    7. Check if the JAVA_HOME environment variable is set correctly (should point to your Java installation directory, not its bin subdirectory), or else that the intended version of the java executable is in the PATH.
    8. -
    9. To check that everything works, open a command line window and issue: fmpp --version
    10. -
    - -

    Note: Because of the limitations of .bat files, you may get error messages as "The input line is too long". To solve this, install FMPP in a more "shallow" directory, so that the path to the FMPP related files will be shorter.

    - - - -

    On UN*X (Linux, FreeBSD, OS X, etc.)

    -

    The steps are:

    -
      -
    1. Extract the downloaded archive file (fmpp_0.9.15.tar.gz or fmpp_0.9.15.zip) into the /usr/lib/fmpp or /opt/fmpp directory (conventions vary by distribution), or wherever you prefer to. From now on I will refer to this directory as <FMPP_HOME>. -
    2. -
    3. For convenience, create a soft link somewhere in the PATH, like sudo ln -s <FMPP_HOME>/bin/fmpp /usr/bin/fmpp.
    4. -
    5. Issue which fmpp to see if it's not shadowed by an earlier installation elsewhere.
    6. -
    7. Check if the intended version of the java executable is in the PATH, or else that the JAVA_HOME environment variable is set correctly (should point to your Java installation directory, not its bin subdirectory).
    8. -
    9. To check that everything works, open a command line window and issue: fmpp --version
    10. -
    - - -

    Notes

    -
      -
    • If there's a FMPP_HOME environment variable, it <FMPP_HOME>\bin\fmpp.bat and <FMPP_HOME>\bin\fmpp will use that directory instead of its own grandparent directory.
    • -
    • You can run FMPP without the provided shell scripts directly with the java command, like java -jar <FMPP_HOME>/lib/fmpp.jar. (You can also put all required jar-s and class directories into the CLASSPATH and then issue java fmpp.tools.CommandLine.) Note though that you will lose console width detection with these approaches.
    • -
    • You can move the jars into the lib subdirectory of Ant (if you want to use the Ant task anyway). If you do this, the command line tool need Ant be installed on a "standard" location (like C:\Program Files\ant), or ANT_HOME must be correctly set.
    • -
    - - - - -

    Setup the Ant task

    - -

    If you want to use FMPP as Ant task, copy the required jar files from <FMPP_HOME>/lib into the lib directory of your Ant installation (issuing ant install from <FMPP_HOME> will do this for you), or ensure that the jars are in the CLASSPATH environment variable. Then, whenever you need the FMPP task in a project, add this line to your build.xml:

    - -
    <taskdef name="fmpp" classname="fmpp.tools.AntTask"/>
    - -

    And then you can use the <fmpp ...> task. - - - -

    Installing optional parts and custom extensions

    - -

    For the command-line tool, simply drop the jar file that contains the required classes into the <FMPP_HOME>/lib directory (or, into the Ant lib directory, if you store fmpp.jar there only). For the Ant task, either ensure that the required jars are in the CLASSPATH, or drop the jars into the lib directory of your Ant installation.

    - - - -

    Updating FreeMarker

    - -

    You can replace the included FreeMarker version with a later version. Download the latest backward compatible FreeMarker release, and overwrite <FMPP_HOME>/lib/freemarker.jar with the freemarker.jar of the FreeMarker release. (Of course, if you are using the FMPP Ant task, you may need to replace the freemarker.jar in the lib directory of the Ant installation too.)

    - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/languages.html b/fmpp/docs/languages.html deleted file mode 100644 index 9bf7eea..0000000 --- a/fmpp/docs/languages.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - -Languages (formats) used - FMPP - - - - - - - - - - - - - - - -
    -

    Languages (formats) used

    - - -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/license.html b/fmpp/docs/license.html deleted file mode 100644 index 8c1e7d9..0000000 --- a/fmpp/docs/license.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -License - FMPP - - - - - - - - - - - - - - -
    -

    License

    - -
    -
    -
    Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -==============================================================================
    -END LICENSE
    -
    -
    -SOFTWARE INCLUDED IN THE FULL FMPP DISTRIBUTION
    -
    -This section only applies to the full FMPP distribution, not to
    -"fmpp.jar" (not to the Maven artifact, net.sourceforge.fmpp:fmpp).
    -
    -  This product includes software developed by the
    -  Apache Software Foundation (http://www.apache.org/).
    -
    -The full FMPP distribution includes software developed by various parties,
    -under various licenses. Below you find the list of these, with their location
    -inside the distribution archive.
    -
    -  The contents of the "bin" directory is derived from Apache Ant, a software
    -  developed by the Apache Software Foundation (http://www.apache.org/).
    -  It's derived from Ant 1.5, which is under Apache Software License 1.1.
    -  Read LICENSE_ANT.txt for more information.
    -
    -  "lib/resolver.jar" is a binary distribution of Apache xml-commons Resolver,
    -  a software developed by the Apache Software Foundation.
    -  Xml-commons Resolver is under Apache Software License 2.0.
    -  Read LICENSE_RESOLVER.txt for more information.
    -
    -  "lib/bsh.jar" is a binary distribution of BeanShell.
    -  BeanShell is under LGPL (GNU Lesser Public License) license.
    -  Visit http://www.beanshell.org for more information.
    -
    -  "lib/imageinfo.jar" is a binary distribution of ImageInfo, a software
    -  developed by Marco Schmidt, who has contributed it to the Public Domain.
    -
    -  "lib/freemarker.jar" is a binary distribution of FreeMarker.
    -  FreeMarker is under Apache License 2.0 (since FreeMarker 2.3.21).
    -  Read LICENSE_FREEMARKER.txt for more information.
    -
    -  "lib/test/junit.jar" is a binary distribution of JUnit 3.8.
    -  JUnit 3.8 is under Common Public License Version 1.0.
    -  Visit http://www.opensource.org/licenses/cpl1.0.txt  for more
    -  information.
    -
    -  The "icomoon" font files (icomoon.eot, icomoon.svg, icomoon.ttf, and
    -  icomoon.woff) under "src/docs/style/fonts/" and "docs/style/fonts/" are
    -  generated from Entypo pictograms, version 2.0, by Daniel Bruce
    -  (www.entypo.com). Each included pictogram is either licensed under
    -  Creative Commons Attribution-ShareAlike 3.0 (CC BY-SA 3.0), or under
    -  SIL Open Font License. For more information about these licenses visit
    -  http://creativecommons.org/licenses/by-sa/3.0/legalcode" and
    -  http://scripts.sil.org/OFL. Note that the fonts are only used as part of
    -  the FMPP documentation and the FMPP Web site, thus aren't needed for the
    -  operation of the FMPP application.
    -
    -"lib/fmpp.jar" doesn't contain parts that belong under a different license or
    -to a different copyright owner than the main license and copyright owner of
    -FMPP (since FMPP 0.9.15).
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/manual.html b/fmpp/docs/manual.html deleted file mode 100644 index 2043b24..0000000 --- a/fmpp/docs/manual.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - -FMPP Manual - FMPP - - - - - - - - - - - - - - -
    -

    FMPP Manual

    - -
    -
    -

    Updated for FMPP 0.9.15 - (requires FreeMarker - 2.3.21 or later compatible) -

    Note: The FMPP Manual only covers the framework that FMPP builds around FreeMarker. - FreeMarker is a template engine that is independent of FMPP. - For using FMPP you need to know the FreeMarker template language.

    Table of Contents

    - -
    -
    -

    Please report bugs you find! Any programming, documentation content or grammatical mistakes (even minor typos). Thank you!

    -

    Use the bug reporting Web page,
    - or e-mail: ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)

    - -

    Please report FreeMarker bugs at the FreeMarker bug reporting Web page, not for me. If you are not sure if you have found a FreeMarker or FMPP bug, just report it as an FMPP bug.

    -
    - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/miscellaneous.html b/fmpp/docs/miscellaneous.html deleted file mode 100644 index a54f357..0000000 --- a/fmpp/docs/miscellaneous.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -Miscellaneous - FMPP - - - - - - - - - - - - - - - -
    -

    Miscellaneous

    - -
    -
    -

    Chapter Contents

    - -
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/overview.html b/fmpp/docs/overview.html deleted file mode 100644 index 03e8b6e..0000000 --- a/fmpp/docs/overview.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - -Concepts and Terminology - FMPP - - - - - - - - - - - - - - - -
    -

    Concepts and Terminology

    - -
    - -
    - -

    Read the Tutorial before this, otherwise you won't understand this chapter.

    - - - -

    FMPP core and front-ends

    - -

    FMPP consist of the FMPP core, and the front-ends wrapping that. Front-ends provide interface by which you can communicate with the FMPP core. For example the command-line tool (that we have used previously) is a front-end that provides command-line interface. The FMPP Ant task is another front-end that provides Ant task interface. A graphical front-end could be written too. But whatever front-end you use, you (indirectly) use the FMPP core. So most of the documentation is about the FMPP core, which basically encapsulates all abilities of FMPP.

    - -

    Note that the FMPP core wraps FreeMarker, the template engine.

    - -

    For more info see the chapter about writing front-ends.

    - - - - -

    Settings

    - -

    Settings are variables that describe for the FMPP core what and how to do. Examples of settings you have already met: sourceRoot, outputRoot, data. Front-ends basically do nothing else, just set the settings of the core, and then "trigger" the core to do the job. So if you know all settings, then basically you know everything FMPP can do.

    - -

    It's a good practice to store the settings of your project in configuration files (as config.fmpp was). As the FMPP core understand them, you can use them with all front-ends. Configuration files use a simple FMPP specific language, TDD.

    - - - - -

    File processing and related terms

    - -

    Processing a file is the act of the generation of the output file (or files) based on a source file. This may means the execution of the file as FreeMarker template, or binary-copying the file, processing the file as XML, or, in extreme case, create no output the file (say, for a .bak file). The path of the output file relatively to the outputRoot will be the same as the path of the corresponding source file relatively to the sourceRoot (at least initially; the template can change the output file path on-the-fly).

    - -

    Term processing mode refers to how a certain file is processed. In the Quick Tour, the HTML files were processed in "execute" mode, and the image file was processed in "copy" mode. You can find all details about processing modes here.

    - -

    Processing session: This is the course of batch processing the (selected) files of the source directory. For example, all fmpp call in the Quick Tour did a processing session.

    - -

    Strictly speaking, FMPP only processes files, not directories. It looks for source files in the sub-directories of the source root directory recursively, and when an output file has to be created, its missing parent directories will be created automatically. Any setting that deals with processing things is applicable only to files, not to directories (with some exceptions, like alwaysCreateDirectories).

    - -

    FMPP doesn't use the term "processing" for data files like data/style.tdd or data/birds.csv was in the tutorial. A data file isn't processed like a template file (or an image file), it does not produce output file itself. Instead, it can be loaded into a variable for later usage in templates.

    - - - - -

    Data, data loader

    - -

    In FMPP context data means data coming from data sources as XML file, CSV file, MySQL database, etc. In the Quick Tour, data/style.tdd and data/birds.csv are data files. Files that are processed to produce output files, as the HTML-s and the image are not data files.

    - -

    The FreeMarker templates see the "data" as variables. This set of variables is called the data model with FreeMarker terminology. The data model is shared, visible for all templates. During output generation the template may creates new variables for temporary calculations, but those variables are not part of the data model, and will gone when the template execution is finished. Templates can't modify the data model, so all templates get the same data model, which was filled with the data setting at the very beginning of the processing session.

    - -

    Data loaders are objects that load and interpret data from certain type of data source, so FMPP can expose the data as variables for the templates. For example, in the Quick Tour we have used data loader csv that interprets CSV files. When the data source is file based, you use paths as data data/birds.csv. Relative paths are relative to the directory dictated by the dataRoot setting, which is be default the same as sourceRoot. Data loaders are described in more details here.

    - - - - -

    The pp hash

    - -

    The data model always contains a hash with name pp (stands for PreProcessor). This hash contains directives and methods and other variables that templates can use to control output generation, do path calculations, and do various other FMPP specific operations. You can find the description of the pp hash here.

    - - - - -

    Virtual paths

    - -

    FMPP works with 3 file systems: the real file system, and 2 virtual file systems:

    -
      -
    • source file system: The root directory of this file system is the sourceRoot directory. Template files usually see this file system, as when they <#include ...> other template files. All files that FMPP processes must be inside this file system, thus inside the source root directory.
    • - -
    • output file system: The root directory of this file system is the outputRoot directory. In templates, directives that control output file names and paths (as <@pp.changeOutputFile ...>) use this file system. It is guaranteed that all output files will be inside this file system, thus inside the output root directory.
    • -
    - -

    Most directives/methods in templates that require path parameters use one of the virtual file systems. These paths are called virtual paths. Virtual paths always use UN*X style format, so they always use slash (/), not back-slash (\). Absolute virtual paths (as /foo/bar) always start from the virtual file system root (not from the root of the real file-system). You can't leave this root, not even with tricky path as /... Relative virtual paths (as foo/bar or ../foo/bar) are resolved relatively to:

    -
      -
    • If they are used in built-in FreeMarker directives (as <#include ...> or <#import ...>): the directory of the currently executing template.
    • -
    • If they are used in other directives to refer to source files: the directory of the currently processed source file.
    • -
    • If they are used in directives to refer to output files: the directory of the currently written output file.
    • -
    - -

    Note that the dataRoot setting (used by data loaders) just specifies a base directory, not a virtual file system root. So you can leave it with ..-s.

    - - - - -

    Real paths

    - -

    Paths that navigate in the real file system (not in a virtual file systems) are called real paths. Real paths always use the native path format of the host operating system. However, Windows users can and should use slash (/) instead of backslash (\), to keep UN*X compliance, and to avoid escaping issues.

    - -

    Real paths are used in these cases:

    -
      -
    • For setting values that store a path (or paths), such as sourceRoot and outputRoot. Relative paths in these settings are resolved relatively to the, so called, configuration base (unless explicitly stated otherwise for a certain setting). If the setting value comes from a configuration file, then it is the directory that contains the configuration file (however, this can be overridden with the configurationBase setting). If the value comes from other source (such as from a command-line argument), then the front-end specifies what the configuration base is for that setting value (see the documentation of the front-end). - -
    • For data loaders that load files, as csv(data/birds.csv). If the path is relative, then it is relative to the dataRoot, which defaults to the sourceRoot. Note that the usage of / instead of the native path separator (as backslash) is always allowed and recommended here. - -
    • As the parameter to some pp directives/methods that explicitly state this. -
    - -

    In other cases FMPP uses virtual paths. - - - - -

    Adopted FreeMarker type names

    - -

    FMPP adopts some of FreeMarker's terms regarding the type names, to decrease confusion:

    -
      -
    • String: text. -
    • Boolean: logical value. It can be true or false. -
    • Number: Number... maybe decimal, maybe whole. You often will also see term "integer", which means whole number. -
    • Sequence: You may know this with name list, or array, or vector. It is a list of values of any type. The items in the list are indexed with integers, starting from 0. -
    • -Hash: You may know this with name dictionary, or map, or associative array. This is a set of name-value pairs. The names are unique strings in the hash, so they identify the values associated with them. As it used to be said, they are "keys". -
    - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/pathpattern.html b/fmpp/docs/pathpattern.html deleted file mode 100644 index 02c2fa3..0000000 --- a/fmpp/docs/pathpattern.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - -Path Patterns - FMPP - - - - - - - - - - - - - - - -
    -

    Path Patterns

    - -
    -
    - -

    Probably you have already used commands like dir *.txt (or ls *.txt on UN*X). This lists all files in the current directory where the name of the file ends with .txt. The *.txt stuff is called a path pattern.

    - -

    With FMPP you also use path patterns to select certain files, say, in the modes setting, to tell FMPP which files to copy as is, and which files to execute as template. A path pattern looks like a path, but it can contain some special parts:

    -
      -
    • *: matches zero or more characers, except slash (/). For example a*c matches to abc, axyzc and ac, but not a/c. -
    • ?: matches exactly one characer, except slash (/). For example a?c matches to abc, but not axyzc or ac or a/c. -
    • **: This matches zero or more directories of the path. For example a/**/c matches to a/b/c, a/b/xyz/c and a/c. Another example: **/*.gif matches to foo.gif, a/foo.gif and , a/b/foo.gif. Also, if you use ** at the end of the pattern, then it match with all file names as well. Thus, foo/** will match all files inside foo, such as foo/bar.txt or foo/sub/bar.txt. Furthermore, if the pattern ends with /, then it is considered as shorthand for /**, so foo/ is the same as foo/**. -
    - -

    If your operating system use something else instead of / (as \ on Windows), FMPP will internally convert the native paths to UN*X format, so do not worry about this. Just use slash in the patterns. (Or, in fact, you can even use the native "slash" in patterns, just it is not a good practice in general.)

    - -

    Note that pattern as *.gif will match only the GIF files in the current directory. If you want to match all GIF files of the subdirectories (and sub-subdirectories, etc.) as well, use **/*.gif. - -

    The meaning of "current directory" in FMPP depends on the concrete situation where you use the path. In most cases where you will use path patterns (as with the modes setting) it will be the source root directory. Also, the meaning of "root directory" is depends on where you use the path. That is, absolute path /foo.txt maybe means foo.txt in the source root directory (this is the typical), or in the output root directory, or in the real root directory of the file system, etc.

    - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/pphash.html b/fmpp/docs/pphash.html deleted file mode 100644 index eb6d688..0000000 --- a/fmpp/docs/pphash.html +++ /dev/null @@ -1,974 +0,0 @@ - - - - - - - -The pp Hash - FMPP - - - - - - - - - - - - - - - -
    -

    The pp Hash

    - -
    - -
    - -

    The pp hash is a variable that is always present in the data model. This contains the built-in, standard variables of FMPP.

    - -

    Note: For more information about variable types, directives, etc. in general, please read the FreeMarker Manual.

    - - -

    Information about the source

    - - - -

    sourceFile

    - Type: string -

    The path of the current source file (includes the file name), relatively to the source root directory. It does not start with slash. Uses UN*X path format.

    - - - - - -

    sourceDirectory

    - Type: string -

    The path of the directory of the current source file, relatively to the source root directory. It is finished with a slash, except if the directory is the source root directory itself, in which case the result is an empty (0 length) string. The result never starts with slash. Uses UN*X path format.

    - - - - -

    sourceFileName

    - Type: string -

    The filename of the current source file.

    - - - - -

    sourceEncoding

    - Type: string -

    The encoding (charset) of the source file, e.g. ISO-8859-1. It is always a concrete charset name, never host.

    - - - - -

    sourceRoot

    - Type: string -

    The absolute real path of the source root directory, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - -

    realSource

    - Type: string -

    The absolute real path of the current source file. As it is a real path, it uses the native path format.

    - - - - -

    realSourceDirectory

    - Type: string -

    The absolute real path of the directory of the current source file, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - - -

    Information about the output

    - -

    Note that as the output file name and directory, and the output encoding can be changed during the execution of template, the value of these variables can change during the execution of the template, to reflect the current situation.

    - - - -

    outputFile

    - Type: string -

    The path of the current output file (includes the file name), relatively to the output root directory. It does not start with slash. Uses UN*X path format.

    - - - - -

    outputDirectory

    - Type: string -

    The path of the directory of the current output file, relatively to the output root directory. It is finished with a slash, except if the directory is the output root directory itself, in which case the result is an empty (0 length) string. The result never starts with slash. Uses UN*X path format.

    - - - - -

    outputFileName

    - Type: string -

    The filename of the current output file.

    - - - - -

    outputEncoding

    - Type: string -

    The encoding (charset) of the output file, e.g. ISO-8859-1. It is always a concrete charset name, never host or source.

    - - - - -

    outputRoot

    - Type: string -

    The absolute real path of the output root directory, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - -

    realOutput

    - Type: string -

    The absolute real path of the current output file. As it is a real path, it uses the native path format.

    - - - - -

    realOutputDirectory

    - Type: string -

    The absolute real path of the directory of the current output file, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - - -

    Changing the output file

    - - - -

    changeOutputFile

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • name: - string. - The new virtual path of the output file. The path can point into a different directory than the directory of the current output file. - -
    • append=false: - boolean. - If this is true, then if a file with the same name as the name of the new output file already exists, it will be continued, rather then overwritten. If the file does not already exist, then this parameter has no effect. - -
    - -

    Closes the current output file, and starts a new output file with the new name. All further output goes into the new file. If the name of the new output file is the same as the current output file, then nothing happens.

    - -

    A word of warning: Don't forget that the path that you specifiy is interpreted relatively to the current output file. So using a relative path like products/${productName}.html ( instead of an absolute path like /shop/products/${productName}.html) inside a loop is most certainly not what you want, because then 2nd product will go into the /shop/products/products/${productName}.html directory, the 3rd into /shop/products/products/products/${productName}.html, and so on. Of course this problem doesn't occur if the relative path is just a file name, like ${productName}.html.

    - - - - -

    renameOutputFile

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • name: - string. - The new virtual path of the output file. The path can point into a different directory than the directory of the current output file. - -
    • extension: - string. - Replaces the extension (the part after the last dot in the file name) of the current output file, with the value of this parameter. If the file name has no extension (there is no dot in it), then a dot and the new extension is added to the end of the file name. (The parameter value should never contain the starting dot.) - -
    - -

    Changes the name of the current output file, or moves the output file if neccessary. If a file with the same name already exists, this will overwrite that file without warning. If the new name is the same as the name of the current output file, then nothing happens.

    - -

    Either the name or the extension parameter must be specified. You can't use both together. - - - - -

    dropOutputFile

    - Type: directive -
    Supports nested content: no -
    Parameters: - none -

    Deletes the current output file, and drops all further output that would go into this file. Call this directive at the beginning of templates that need to be processed, but you don't want any output files from them. (Of course, you can call this directive even at the end of the template, just that's slower...)

    -

    Note that this directive can be neutralized with directive pp.restartOutputFile.

    - - - - -

    restartOutputFile

    - Type: directive -
    Supports nested content: no -
    Parameters: - none -

    Empties the current output file (but doesn't delete the file). The next character sent to the output will be the first character of the output file. Also, the charset of the output file can be safely set, exactly like if you were at the beginning of the output file creation.

    -

    Note that this directive neutralizes the effect of directive pp.dropOutputFile.

    - - - - -

    nestOutputFile

    - Type: directive -
    Supports nested content: yes -
    Parameters: -
      -
    • name: - string. - The new virtual path (includes the file name) of the output file. The path can point into a different directory than the directory of the current output file. - -
    • append=false: - boolean. - If this is true, then if a file with the same name as the name of the new output file already exists, it will be continued, rather then overwritten. If the file does not already exist, then this parameter has no effect. - -
    - -

    This is similar to changeOutputFile, but it writes only the content generated in its nested content into the new file, and then it restores things, so the output will go into the same output file as before the calling of the directive. For example:

    - -
    The 1st line of the original file.
    -<@pp.nestOutputFile name="new.txt">
    -  The 1st line of new.txt.
    -</@pp.nestOutputFile>
    -The 2nd line of the original file.
    -<@pp.nestOutputFile name="new.txt" append=true>
    -  The 2nd line of new.txt.
    -</@pp.nestOutputFile>
    -The 3rd line of the original file.
    -

    A file can be nested into itself. For example:

    - -
    <@pp.nestOutputFile name='1.txt'>
    -  The 1st line of 1.txt
    -  <@pp.nestOutputFile name='2.txt'>
    -    The 1st line of 2.txt
    -    <@pp.nestOutputFile name='1.txt'>
    -      The 2nd line of 1.txt
    -    </@pp.nestOutputFile>
    -    The 2nd line of 2.txt
    -  </@pp.nestOutputFile>
    -  The 3rd line of 1.txt
    -</@pp.nestOutputFile>  
    -

    Note that append=true was not needed for adding the 2nd line to the 1.txt, since the directive just switched back to the already opened 1.txt.

    - - - - - -

    setOutputEncoding

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • encoding: - string. - The name of the charset, e.g. ISO-8859-2. It understands the special values source and host. - -
    - -

    Sets the encoding of the output. This will die with error if the output file is already partially written to the disk. Thus, if you want to change the output encoding, do it as early as possible. FMPP buffers the output for the output file in the memory until the buffer size reaches 160 characters, but after that it starts to flush the buffer to the disk. Also, directives that change the current output file may flush the buffer. When you start a new file (say, with changeOutputFile), it starts a new buffer in the memory, so you can set the encoding of the new file.

    - - - - - -

    Utilities for paths

    - - - -

    pathTo

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. destination: string. - The virtual path in the output file system to the destination file or directory. The destination file or directory need not exist. - -
    - -

    This method returns the relative virtual path that leads from the directory of the current output file, to the destination file or directory. For example, if you want to create a link that points to <outputroot>/products/index.html, then you can write:

    - -
    <a href="${pp.pathTo('/products/index.html')}">Product index</a>
    -

    and the link will always point to that file, does not mater where the file that contains the above link is.

    - -

    The returned path never starts with /; it is always a relative path.

    - -

    If the destination path is finished with slash, then, and only then, the resulting path will be also finished with slash, except if the only character in the result would be that slash, in which case the result will be an empty (0 length) string instead.

    - - - - - -

    home

    - Type: string -

    Same as what pp.pathTo('/') would return. That is, the virtual path to the output root directory, from the current output file. It is finished with a slash, except if the current output file is directly in the output root directory, in which case the result is an empty (0 length) string. The result never starts with slash. So the possible values are something like: ../../

    - -

    Example: The src will always point to the file in the img directory of the output root, does not mater if you move the HTML file in the directory hierarchy:

    - -
    <img src="${pp.home}img/logo.jpg" alt="Logo">
    - - - -

    outputRootRelativePath

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. file path: string. - The virtual output path to convert. The output file pointed by the path need not exist. - -
    -

    Converts a virtual output path to a virtual output path that is relative to the output root directory. The resulting path will not start with slash.

    - - - - -

    sourceRootRelativePath

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. file path: string. - Same as the parameter of outputRootRelativePath, but it uses the the source file system. - -
    -

    Same as outputRootRelativePath, but it uses the source root directory and the current source file respectively.

    - - - - -

    sourcePathTo

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. destination: string. - Same as the parameter of pathTo, but it uses the source file system. - -
    -

    Same as pathTo, but it uses the source root directory and the current source file respectively.

    - - - - -

    slash

    - Type: string -

    The platform dependent slash character used in native paths. This will be backslash (\) on Windows.

    - - - - -

    urlEnc

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. string to encode: string. - The string to encode. - -
    - -

    Deprecated: use the url built-in of FreeMarker instead. For example: ${"a+b/c"?url}.

    - -

    Encodes a string with URL encoding. For example the result of pp.urlEnc("a+b/c") will be a%2Bb%2Fc, if the output charset is an US-ASCII based charset.

    - - - - -

    urlPathEnc

    - Type: method -
    Result type: string -
    Parameters: -
      -
    1. string to encode: string. - The string to encode. - -
    - -

    Same as FreeMarker's url built-in (?url), except that it does not encode slash characters. For example the result of pp.urlPathEnc("new products/bálna.html") will be new%20products/b%E1lna.html, if the output charset is ISO-8859-1.

    - - - - - -

    Utilities for files

    - - - -

    sourceFileSize

    - Type: method -
    Result type: number -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the source file system. - -
    - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - - - -

    sourceFileLastModified

    - Type: method -
    Result type: date (date+time) -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the source file system. - -
    - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - - - -

    sourceFileExists

    - Type: method -
    Result type: boolean -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the source file system. - -
    - -

    Tells if the file exists or not.

    - - - - -

    outputFileSize

    - Type: method -
    Result type: number -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the output file system. - -
    - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - - - -

    outputFileLastModified

    - Type: method -
    Result type: date (date+time) -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the output file system. - -
    - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - - - -

    outputFileExists

    - Type: method -
    Result type: boolean -
    Parameters: -
      -
    1. file path: string. - The virtual path of the file in the output file system. - -
    - -

    Tells if the file exists or not.

    - - - - -

    realFileSize

    - Type: method -
    Result type: number -
    Parameters: -
      -
    1. file path: string. - The real path (native path) of the file. The file can be outside all root directories. FMPP passes the resolving of relative paths to the host OS, so it is not defined by FMPP what the end result will be. In general, it is better to use absolute paths here.
      - Windows users: According to the syntactical rules of FTL, you must use double backslashes in string literals: "C:\\work\\foo\\bar.txt", or use raw strings: r"C:\work\foo\bar.txt". Also, according to the Windows API rules, you can simply use slash: "C:/work/foo/bar.txt", which is probably the best solution. - -
    - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - - - -

    realFileLastModified

    - Type: method -
    Result type: date (date+time) -
    Parameters: -
      -
    1. file path: string. - The real path (native path) of the file. The rules are the same as with realFileSize. - -
    - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - - - -

    realFileExists

    - Type: method -
    Result type: boolean -
    Parameters: -
      -
    1. file path: string. - The real path (native path) of the file. The rules are the same as with realFileSize. - -
    - -

    Tells if the file exists or not.

    - - - - - - -

    Writable hashes and sequences

    - -

    Writable sequences and hashes are an FMPP specific extension to FreeMarker, as FreeMarker does not support the modification of sequences and hashes. (This has good reasons in the on-the-fly dynamic page generation segment that FreeMarker mostly targets, but it can be a problem in extreme FreeMarker applications as FMPP.) To read the variables of these sequences and hashes, you can use the same expressions as with plain sequences and hashes. But, to modify the contents of them, you have to use the directives described below, since predefined directives as <#assign ...> can't modify subvariables. Unfortunately, sequence addition, sub-sequence operator (like seq[5..10]) and ?reverse do not copy the original sequence, just wraps it (for efficiency), so the resulting sequence will change if the original sequence is changed later (this is basically an abnormal aliasing effect). The same problem exists with the result of hash addition; it just wraps the two hashes, so the resulting hash will magically change if you modify the hashes you have added earlier. As a work-around, after you did the above problematic operations, either be sure you will not modify the objects that were used as input, or create a copy of the result like: <#assign b = pp.newWritableSequence(a[5..10])> and <#assign c = pp.newWritableHash(hashA + hashB)>). Of course this is easy to miss... so rather try to build the data model so you will not need to modify collections. Keeping templates simple and moving complex calculations out to custom data loaders or BeanShell scripts (see the bsh function of localData here...) is advisable anyway.

    - -

    Note that only the sequences that were made with the newWritableSequence method are writable. Also, only the hashes that were made with the newWritableHash method are writable. You can't modify plain sequences or hashes with the below directives.

    - -

    Also note that writable sequences and hashes suffer from the effect called aliasing (that most programmers will find natural). This effect, explained with an example, looks like this:

    - -
    <#assign a = pp.newWritableSequence()>
    -<@pp.add seq=a value="red" />
    -<#assign b = a>
    -<@pp.add seq=b value="green" />
    -a: <#list a as i>${i} </#list>
    -b: <#list b as i>${i} </#list>
    -

    Here the output will be:

    - -
    a: red green
    -b: red green
    -

    That is, FreeMarker variables just store a reference (pointer) to the sequence or hash, not the sequence or hash itself. So both a and b points to the same single sequence object, which floats somewhere in the memory. This fact becomes significant because you modify that object, otherwise you wouldn't notice it. To create individual copies, use newWritableSequence or newWritableHash, for example:.

    - -
    <#assign a = pp.newWritableSequence()>
    -<@pp.add seq=a value="red" />
    -<#assign b = pp.newWritableSequence(a)>
    -<@pp.add seq=b value="green" />
    -a: <#list a as i>${i} </#list>
    -b: <#list b as i>${i} </#list>
    -

    Here b is a new sequence whose initial content is the same as the content of a. Thus, the output will be:

    - -
    a: red
    -b: red green
    - - -

    newWritableSequence

    - Type: method -
    Result type: writable sequence -
    Parameters: -
      -
    1. initial content: sequence, optional. - -
    -

    Creates a new empty writable sequence. However, if called with parameter then adds the items in the parameter sequence to this new sequence (known as "shallow copy" among programmers). Example:

    - -
    <#assign a = pp.newWritableSequence()>
    -<#assign b = pp.newWritableSequence(['red', 'green', 'blue'])>
    -${a?size}
    -${b?size}
    -

    The output will be:

    - -
    0
    -3
    - - - - -

    newWritableHash

    - Type: method -
    Result type: writable hash -
    Parameters: -
      -
    1. initial content: hash, optional. - -
    -

    Creates a new empty writable hash. However, if called with parameter then adds the items in the parameter hash to this new hash (known as "shallow copy" among programmers). Example:

    - -
    <#assign a = pp.newWritableHash()>
    -<#assign b = pp.newWritableHash({'red':'FE0000', 'green':'10F000', 'blue':'0007FF'})>
    -${a?size}
    -${b?size}
    -

    The output will be:

    - -
    0
    -3
    - - - -

    copyWritable

    - Deprecated: Use newWritableSequence and newWritableHash instead.
    - Type: method -
    Result type: writable hash or writable sequence -
    Parameters: - none -

    Copies a writable hash or sequence. (It is used to prevent aliasing effect. The result is a "shallow copy" of the original hash or sequence.)

    - - - - -

    add

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • seq: - writable sequence. - The sequence to modify. -
    • index=seq?size: - number. - The index where you want to insert the subvariable into the sequence. The index of the first subvariable is 0. -
    • value: - any. - The new value of the subvariable. -
    - - - - -

    Inserts a new subvariable into the sequence, at the specified index. Shifts the subvariable currently at that position (if any) and any subsequent subvariables to the right (adds one to their indices). If you do not use the index parameter, or if its value is 1 higher than the index of the last subvariable, then it appends the new subvariable at the end of the sequence.

    - - - - -

    set

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • seq: - writable sequence. - The sequence to modify. -
    • index: - number. - The index of subvariable to set. The index of the first subvariable is 0. -
    • hash: - writable hash. - The hash to modify. -
    • key: - string. - The name of the subvariable that you want to add to the hash, or that you want to replace. -
    • value: - any. - The value of the new subvariable. -
    - - - - - - -

    This can be used for two purposes, depending on if you use the seq or the hash parameter:

    -
      -
    • For sequences: Sets an already existing subvariable of the sequence or hash. The index must be the index of an existing subvariable, or an error will occur. - -
    • For hashes: Adds a new subvariable to the hash with the name specified with the key parameter, or replaces the subvariable with the same name if that already exists. -
    - - - - - -

    remove

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • seq: - writable sequence. - The sequence to modify. -
    • index: - number. - The index of the subvariable to remove. -
    • hash: - writable hash. - The hash to modify. -
    • key: - string. - The name of the subvariable that you want to remove from the hash. -
    - - - - - -

    This can be used for two purposes, depending on if you use the seq or the hash parameter:

    -
      -
    • For sequences: Removes the subvariable on the specified index, and shifts any subsequent subvariables to the left (subtracts one from their indices). The index must denote an existing subvariable, or an error will be raised. - -
    • For hashes: Removes the subvariable with the name specified with the key parameter, or does nothing if no such subvariable exists. -
    - - - - -

    clear

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • seq: - writable sequence. - The sequence to clear. -
    • hash: - writable hash. - The hash to clear. -
    - - - -

    Removes all subvariables of the sequence or hash.

    - - - - - -

    Miscellaneous

    - - - -

    warning

    - Type: directive -
    Supports nested content: no -
    Parameters: -
      -
    • message: - string. - The warning message. -
    - - -

    Issues a warning message. It depends on the concrete front-end in use and the settings, but usually the message will be displayed on the screen and/or will be added to the log file. The processing will not stop if you issue a warning. To stop processing with error message you should use <#stop "message">.

    - - - - -

    ignoreOutput

    - Type: directive -
    Supports nested content: yes -
    Parameters: - none -

    All text generated inside the nested content of this directive will be thrown away.

    - - - - -

    locale

    - Type: string -

    The currently used locale in the usual format. For example: ar_SA, ar_IQ, en_US, en_UK, es_ES, ...etc. - - - - -

    loadData

    - Type: method -
    Result type: any -
    Parameters: -
      -
    1. loader name: string. - The name of the data loader. - -
    2. arguments...: any. - The arguments to the data loader. These are 0 or more arguments. - -
    - -

    Loads data using data loaders, and returns the loaded data as the result of the method call. For example this:

    - -
    <#assign foo = pp.loadData('csv', 'foo.txt', {'separator':',', 'encoding':'UTF-8'})>
    -

    does something similar as when you use the below in an FMPP configuration file:

    - -
    data: {foo:csv(foo.txt, {separator:',', encoding:UTF-8})}
    -

    The difference is that with the pp.loadData, you load the data on demand, and into a temporary variable that will be available only for a single template processing.

    - -

    The get data loader can't be invoked with this method. - - - - -

    now

    - Type: date (date+time) -

    Returns the current date and time.

    - -

    For example this:

    - -
    Current date and time: ${pp.now}
    -Current time: ${pp.now?time}
    -Current date: ${pp.now?date}
    -Current day of week: ${pp.now?string("EEEE")}
    -<#setting datetime_format="yyyy-MM-dd HH:mm:ss zzzz">
    -Current date and time: ${pp.now}
    -

    will output something like this:

    - -
    Current date and time: Apr 12, 2003 5:28:50 PM
    -Current time: 5:28:50 PM
    -Current date: Apr 12, 2003
    -Current day of week: Saturday  
    -Current date and time: 2003-04-12 17:28:50 Central European Summer Time
    -

    For more information about using date/time values, please read the FreeMarker Manual.

    - - - - -

    sessionStart

    - Type: date (date+time) -

    Returns the date and time of the processing session starting.

    - - - - -

    s

    - Type: writable hash -

    Stands for "shared". This is a writable hash that keeps its content during the whole processing session. That is, if you add a subvariable to it during the execution of a template, then that subvariable will be visible for all templates processed later in the same session. An example of the usage of pp.s can be found in <FMPP>/docs/examples/session

    - - - - -

    doc

    - Type: node -

    This variable exists only while an XML file is processed in renderXml processing mode (see the documentation of the modes setting). This variable stores the source file (the XML file) as a node variable that corresponds to the W3C DOM document object.

    - -

    An example that uses renderXml processing mode and pp.doc is <FMPP>/docs/examples/xml_rendering

    - - - - -

    version

    - Type: string -

    This is the version number of the FMPP engine.

    - - - - -

    freemarkerVersion

    - Type: string -

    This is the version number of the FreeMarker the FMPP engine currently uses.

    - - - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/properties.html b/fmpp/docs/properties.html deleted file mode 100644 index 437c2a1..0000000 --- a/fmpp/docs/properties.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - -"Properties" Files - FMPP - - - - - - - - - - - - - - - -
    -

    "Properties" Files

    - -
    -
    - -

    This is a standard format widely used in the Java world to specify set of name-value pairs, where all name is unique (a key).

    - -

    Name-value pairs are specified with name=value format, and each such pair is in its own line. For example:

    - -
    bgColor=blue
    -textColor=white
    -copyright=Copyright (c) 2003, Big Joe All rights reserved.
    -

    If the last character on the line is backslash (\), then the next line is treated as a continuation of the current line; the \ and line break are simply discarded, and any leading whitespace (space, tab, etc.) characters on the continuation line are also discarded and are not part of the value. It is useful if the line would be too long for conveniently reading/editing it:

    - -
    copyright=Copyright (c) 2003, \
    -          Big Joe \
    -          All rights reserved.
    -

    Note that if you accidentally put a space after the \, then it will not work.

    - -

    In the name or value, Java language escape sequences \t, \n, \r, \f, \\, \", \', and \uxxxx are recognized and converted to single characters. Any other escape sequence will be converted to the character after the backlash (e.g. \x will be converted to x). Note that because of the special meaning of backslash, to put a backslash into the name or value, you have to write two backslashes (\\).

    - -
    aNativeWindowsPath=C:\\My Documents\\test
    -someText=First line\nSecond line\nThrid line
    -

    Whitespace is ignored after and before the =, so you can write:

    - -
    bgColor = blue
    -textColor = white
    -

    Alternatively, you can use colon or just whitespace to separate the name and value:

    - -
    bgColor: blue
    -textColor white
    -

    Thus, if the name contains =, : or whitespace, it must be escaped:

    - -
    this\ is\ the\ name = something
    -C\: = /mnt/win
    -

    Empty lines of the file, and the lines that start with # or !, will be ignored. This can be used for commenting:

    - -
    # colors
    -bgColor=blue
    -textColor=white
    -
    -# other text
    -copyright=Copyright (c) 2003, Big Joe All rights reserved.
    -

    "properties" files always use ISO-8859-1 charset. If you have to enter a character that is not in the ISO-8859-1 repertoire, you have to use the \uxxxx escape (where xxxx is the hexadecimal UCS code of the character).

    - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/qtour.html b/fmpp/docs/qtour.html deleted file mode 100644 index bdd98e7..0000000 --- a/fmpp/docs/qtour.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - -Tutorial - FMPP - - - - - - - - - - - - - - - -
    -

    Tutorial

    - -
    - -
    - -

    This chapter is a quick, practical, but rough introduction to FMPP.

    - - -

    Step 1: Process a directory

    - -

    The basic idea is that you have source root directory and an output root directory. The source root directory contains the files to process, and the output root directory will contain the processed files. Processing the file either means that FMPP will execute the file as FreeMarker template, or that it will copy the file as is (in the case of image files, archive files, etc.). (In fact there are other seldom used processing modes as well, like XML rendering.)

    - -

    To see an example, go to the <FMPP>/docs/examples/qtour_step1 directory. Here we have a directory called src:

    - -

    Quick tour step 1 src

    - -

    Also, you will find config.fmpp in the qtour_step1 directory. This file contains the settings for FMPP, and now contains this:

    - -
    sourceRoot: src
    -outputRoot: out
    -

    If you issue fmpp command from the command-line while you are in the qtour_step1 directory, then FMPP will process the src directory and places the output into the out directory. On the console you will see something like:

    - -
    Note: Using the config.fmpp in the working directory.
    -- Executing: index.html
    -- Copying: falcon.png
    -- Executing: subdir\something.html
    -
    -*** DONE ***
    -
    -2 executed + 1 copied = 3 processed
    -0 failed, 0 warning(s)
    -Time elapsed: 0.234 seconds
    -

    and the newly created out directory will contain exactly the same files and subdirectories as src. - -

    Quick tour step 1 diagram

    - -

    The above messages suggest that the PNG file was copied, while the two HTML-s were executed:

    -
      -
    • "Copying" means that the file is copied as is, without changing even a bit compared to the original file (binary copy). -
    • "Executing" means that the file is interpreted by FreeMarker as template file, and the content of the output file is generated by FreeMarker. Template files are plain text files that can contain special parts, which are instructions to FreeMarker. Since in this first example the HTML files don't contain any such special parts, the output files will be identical to the original HTML-s. -
    - - - -

    Step 2: Pulling data from a data source

    - -

    If you look into the two HTML-s of qtour_step1/src, you see that both contains this line:

    - -
    <body bgcolor="#FFFFE0" text="#000000">
    - -

    Assume you want to store these colors in a single centralized place, so if you change them, all pages will change. For this, you have to tell FMPP what data to expose for the templates. For now, tell FMPP to load data from a TDD file. A TDD file is a simple text file that stores name-value pairs. (It happens to be the same format that config.fmpp uses, but it's just accidental coincidence. You could load data from other type of data source in the same way.) If you go to the <FMPP>/docs/examples/qtour_step2 directory, you will find style.tdd in src/data that contains this:

    - -
    bgColor: #FFFFE0
    -textColor: #000000
    -

    Both line in both HTML-s has been changed to:

    - -
    <body bgcolor="${bgColor}" text="${textColor}">
    -

    The two ${...}-s are instructions to FreeMarker that insert the value of a variable. When I'm saying that FMPP exposes data for the templates, then it simply means that it creates variables for the templates, based on some data source. We tell FMPP to load data from data/style.tdd file before it starts to process the files, in the config.tdd of the qtour_step2 directory:

    - -
    sourceRoot: src
    -outputRoot: out
    -data: tdd(data/style.tdd)
    -

    If you issue an fmpp command in the qtour_step2 directory, and look into the result in the out directory, then you will see that the ${...}-s in the HTML files are replaced with the actual colors.

    - -

    Quick tour step 2 diagram

    - -

    It is important that the data directory was not copied into the output (the files in it were not "executed" or "copied"). This is because src/data contains a file with name ignoredir.fmpp, and the presence of this file instructs FMPP not to process the directory.

    - - - -

    Step 3: Even more data

    - -

    You can use any number of data sources, not only a single file. In <FMPP>/docs/examples/qtour_step3 I have added one more data source: data/birds.csv. CSV is a primitive format often used to exchange data among spread sheet applications and other applications. bird.csv stores a table with "name", "description" and "favoriteFood" columns. I want to use the content of this table in the generated HTML pages later, so let load this table into variable birds, in config.fmpp:

    - -
    sourceRoot: src
    -outputRoot: out
    -data: {
    -    tdd(data/style.tdd)
    -    birds: csv(data/birds.csv)
    -}
    -

    Here FMPP creates variables for the templates from multiple data sources (data/style.tdd, data/birds.csv).

    - -

    The index.html now contains some new lines, that fetch the data form the CSV file via the birds variable, and print a list from it. The <#...> tags are instructions to FreeMarker (see in the FreeMarker Manual):

    - -
    <ul>
    -<#list birds as bird>
    -  <li>${bird.name?cap_first}: ${bird.description}
    -      Favorite food: ${bird.favoriteFood}
    -</#list>
    -</ul>
    -

    The output of the above template lines will be something like:

    - -
      <ul>
    -    <li>Arctic-tern: Flies very long distances all years.
    -        Favorite food: sardine
    -    <li>House-sparrow: Don't you say you don't know it...
    -        Favorite food: sunflower
    -    <li>Sakeret: Great hunter of the sky.
    -        Favorite food: pigeon
    -  </ul>
    -

    Note that the template uses birds variable independently of the actual file format (CSV) behind it. You could replace the CSV with whatever data source that can be interpreted as table (as a database table) and the templates could be the same, only the config.fmpp has to be adjusted. (However, FMPP supports only a few data source types out of the box yet, so maybe you have to write/obtain extension Java classes for it.)

    - -

    You can find more information about data and data loading here.

    - - - -

    Step 4: Multiple output files from the same source file

    - -

    Let's say you want to create separate HTML pages for each birds, rather than listing all information about them on the index page, and you want only link to those pages on index.html. <FMPP>/docs/examples/qtour_step4 does this. The index page had trivial changes to generate the links. The interesting is that we have a new file, bird.html. This single file is the template for all bird pages, and will generate a separate HTML file for each birds:

    - -

    Quick tour step 4 diagram

    - -

    The bird.html looks as this:

    - -
    <@pp.dropOutputFile />
    -<#list birds as bird>
    -<@pp.changeOutputFile name=bird.name+".html" />
    -<html>
    -<head>  
    -  <title>${bird.name?cap_first}</title>
    -</head>  
    -<body bgcolor="${bgColor}" text="${textColor}">
    -  <h1>${bird.name?cap_first}</h1>
    -  
    -  <p>${bird.description}</p>
    -
    -  <p><b>Favorite food:</b> ${bird.favoriteFood}</p>
    -</body>
    -</html>
    -</#list>
    -

    The <@...> tags are instructions to FreeMarker (see the FreeMarker Manual). The pp variable is defined by FMPP, and is always there, automatically. It stores the built-in variables of FMPP, e.g. directives as dropOutputFile above. <@pp.dropOutputFile /> instructs FMPP to drop the current output file, so we will not have bird.html in the output directory. <@pp.changeOutputFile .../> instructs FMPP to start a new output file with the given name. So bird.html will produce 3 output files (one output file for each row of the table): arctic-tern.html, house-sparrow.html, and sakeret.html.

    - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/reportbug.html b/fmpp/docs/reportbug.html deleted file mode 100644 index 28ebff8..0000000 --- a/fmpp/docs/reportbug.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - -Reporting bugs - FMPP - - - - - - - - - - - - - - - -
    -

    Reporting bugs

    - -
    -
    -
    -

    Please report bugs you find! Any programming, documentation content or grammatical mistakes (even minor typos). Thank you!

    -

    Use the bug reporting Web page,
    - or e-mail: ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)

    - -

    Please report FreeMarker bugs at the FreeMarker bug reporting Web page, not for me. If you are not sure if you have found a FreeMarker or FMPP bug, just report it as an FMPP bug.

    -
    - -

    Back where you come from...

    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/robots.txt b/fmpp/docs/robots.txt deleted file mode 100644 index ef7885c..0000000 --- a/fmpp/docs/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /freemarker \ No newline at end of file diff --git a/fmpp/docs/settings.html b/fmpp/docs/settings.html deleted file mode 100644 index 7294722..0000000 --- a/fmpp/docs/settings.html +++ /dev/null @@ -1,1255 +0,0 @@ - - - - - - - -Settings - FMPP - - - - - - - - - - - - - - - -
    -

    Settings

    - -
    - -
    - - -

    Things you must know about settings

    - -

    The basic definition of the "setting" term is here... - - -

    The common characteristics of settings

    - -

    The characteristics of a setting can be described with these attributes: -

      -
    • Name: The name of the setting. This name is used in configuration files. Also, front-ends used to use this or similar name for the setting in their user interface.
    • - -
    • Type: The type of the value, such as string, integer, boolean, sequence or hash. If you specify the values in a configuration file, then the TDD syntax clearly specifies what syntax to use for which types. For the front-end specific user interface, it depends on the concrete front-end how you face with types. But, if the front-end wants you to enter the value for a single setting as simple text, then you have to enter scalar values (string, integer and boolean) as is (without any TDD quotation), but you have to use TDD syntax for non-scalar types as sequences and hashes. For setting that are sequences, sequence mode TDD is used (i.e. no [ and ] needed), and for setting that are hashes hash mode TDD is used (i.e. no { and } needed).
    • - -
    • Default: If the value of the setting was not set, the processing session will use this value. If the setting has no default value that doesn't mean that you are required to specify a value for it.
    • -
    - -

    Notes:

    -
      -
    • Settings of type "string (path)" are real paths.
    • -
    • All settings are optional, unless explicitly noted otherwise.
    • -
    - - - -

    The merging of setting values

    - -

    Setting values can be specified in multiple layers. For example, it is possible that a setting is specified in the configuration file, and then again with a command-line argument of the command-line tool.

    - -

    Setting layers has a priority order, for example, the setting layer defined by the command-line arguments has higher priority than the setting layer defined by the configuration file. When the value of the same setting is specified in two layers, then the value that comes from the layer with higher priority overrides the setting value comes from the lower layer. If the type of the setting is not map or sequence, then this simply means that the value from the higher layer will be used, and the other value will be totally hidden. But if the setting type is sequence or hash, then the sequence values will be merged:

    -
      -
    • When sequences are merged, the two sequences are concatenated, and the sequence with the higher priority will start the new concatenated sequence.

    • - -
    • When hashes are merged, the union of the two hashes is constructed, and for clashing keys the values in the hash with higher priority will be used. The type of the value of the hash items is not considered when the merging happens, simply the item from the higher priority hash will be used in the resulting hash. Thus, hash merging is not "deep", becasue the value of clashing items with hash values are not merged. For example, if you merge {x:{v:1}, y:2} with {x:{w:2}}, then the result will be {x:{w:2}, y:2}, and not {x:{v:1, w:2}, y:2}.

    • -
    - -

    Logically, the rules described in this section can be applied for more than two layers of settings as well.

    - - - - -

    Directories

    - -

    - Name: sourceRoot
    - Type: string (path)
    - Default: No default value
    -Command-line short name: S
    -Ant task attribute name alternative: srcdir
    -

    - -

    - Name: outputRoot
    - Type: string (path)
    - Default: No default value
    -Command-line short name: O
    -Ant task attribute name alternative: destdir
    -

    - -

    - Name: dataRoot
    - Type: string (path)
    - Default: the value of sourceRoot
    -

    - -

    - Name: alwaysCreateDirectories
    - Type: boolean
    - Default: false
    -Ant task attribute name alternative: alwaysCreateDirs
    -

    - -

    In the typical use case FMPP processes all files in the directory specified by sourceRoot, and writes the result into the directory specified by the outputRoot directory. These two root directories serve as the root directory of two virtual file systems that store the source files and the output files respectively. This means that all files that FMPP processes must be inside the source root directory (except data files - see later), and it is guaranteed that all output files will be inside the output root directory (as far as you do not by-pass FMPP intentionally with custom extensions). You can't leave the roots by moving upward with ..-s. Also, when you refer to files or directories in the templates as the parameters of predefined directives, absolute paths like /example.html are interpreted relatively to the source or output root directories (except if the parameter deals with data files - see later).

    - -

    Note that both the source root and the output root must be defined before starting a processing session (but a front-end may assings a default value to them). Also, if you use the outputFile setting these two settings always have a default value.

    - -

    The directory specified by dataRoot is interesting for data loaders only. If a data loader gets a relative path, then it should interpret that relatively to the data root directory. If it gets an absolute path, it should interpret that as is. As you can see from this, data root directory does not try to mimic a file system root as the other two root directories. Data loaders can reach files outside the data root directory.

    - -

    By default, the data root is the same as the source root. This encourages the practice where you store the data files in the, say, data subdirectory of the source root, and then mark that directory with a ignoredir.fmpp file (file content is irrelevant), so FMPP will not process the content of the directory. Thus, you keep all input together: data sources, templates and static files (as images).

    - -

    By default, no empty subdirectories will be created in the output root directory. More precisely, directories are created only on demand, when actual output files have to be created in them, hence normally you don't have empty directories in the output. However, this behavior can be changed with alwaysCreateDirectories; with that setting set to true, each source directory will produce a corresponding output directory (unless it contains an ignoredir.fmpp file). Also, if a source directory contains a file named createdir.fmpp (file content is irrelevant) then the corresponding output directory will be created, regardless of the alwaysCreateDirectories setting (unless, again, ignoredir.fmpp is also present)

    - -

    It is possible to tell FMPP to process only certain files and directories of the source root, not all of them; see the sources setting.

    - - - -

    Source and output files

    - -

    - Name: sources
    - Type: sequence (of paths)
    - Default: No default value
    -

    - -

    - Name: outputFile
    - Type: string (path)
    - Default: No default value
    -Command-line short name: o
    -

    - -

    Be default FMPP processes all files in the source root directory. But if you use the sources setting, FMPP will process only the files and/or directories listed there. Relative paths in this setting are resolved relatively to the source root directory, not to the configuration base (unless you use outputFile setting).

    - -

    If you use the outputFile setting, then FMPP switches to single file mode. In this mode, it will process only 1 files, and store its output in the file specified by the outputFile setting. You must use sources, and it must list exactly 1 file. If a relative path is given in the sources, it is resolved relatively to configuration base, not to the source root. If you didn't specified outputRoot or sourceRoot, it will default to the parent directory of the output file or source file respectively.

    - -

    The user interface of front-ends tend to require you to use some special way to specify the value sources setting. Please read the documentation of the front-end you use about this. Note that configuration files are front-end independent, so there you always simply set sources be assigning value to the sources key.

    - - - -

    Text encoding issues

    - -

    - Name: sourceEncoding
    - Type: string
    - Default: ISO-8859-1
    -Command-line short name: E
    -

    - -

    - Name: outputEncoding
    - Type: string
    - Default: source
    -

    - -

    - Name: urlEscapingCharset
    - Type: string
    - Default: output
    -

    - -

    People use different encodings to store text in binary form, often referred as charsets. Examples of charsets are: ISO-8859-1, ISO-8859-2, CP852, CP1250, Shift_JIS, UTF-8. FMPP internally uses UNICODE everywhere, but when it has to read a text file or write a text file, it must deal with charsets to correctly decode/encode the text. -To read text files, FMPP uses the source encoding. This is be default ISO-8859-1. Also, a FreeMarker template has the ability to tell its own encoding with <#ftl encoding="something">, and this overrides the source encoding for the individual template file.

    - -

    To write text files, FMPP uses the output encoding. This is be default holds the special value source, which means that FMPP will use the encoding of the source text file (template file). If you change the value of the setting to a concrete charset, such as UTF-8, then text files will be always written with that encoding. However, templates can set the encoding of the output file with <@pp.setOutputEncoding encoding="something"/>, and this overrides the encoding dictated by the settings.

    - -

    The urlEscapingCharset specifes the name of the charset (encoding) used for URL escaping. It defaults to output, which means that the output encoding will be used for URL escaping. URL escaping happens for example when you use FreeMarker's url built-in (e.g. <a href="foo.cgi?id=${id?url}">) or the pp.urlPathEnc method.

    - -

    All of these settings understands the special charset host, which means the default encoding of the host operating system.

    - -

    The set of supported charsets (and their preciese names) depends on the Java platfrom implementation you run FMPP on.

    - - - - -

    Processing mode choosing

    - -

    - Name: modes
    - Type: sequence (of function calls)
    - Default: empty
    -Command-line short name: M
    -

    - -

    - Name: ignoreCvsFiles
    - Type: boolean
    - Default: true
    -

    - -

    - Name: ignoreSvnFiles
    - Type: boolean
    - Default: true
    -

    - -

    - Name: ignoreTemporaryFiles
    - Type: boolean
    - Default: true
    -

    - -

    When FMPP has to process a file, it has to decide how to process that. That is, it has to choose a "processing mode" for the file. The processing mode can be one of:

    -
      -
    • execute: Execute the file as FreeMarker template (FTL) -
    • copy: Copy the file as is. Uses binary copy; charset does not mater here. -
    • renderXml: Parse the file as XML, and then render the XML document to output file(s) using a FreeMarker template. The template file is choosen for the XML file based on the xmlRenderings setting. For more information read about XML rendering... -
    • ignore: Skip the file. -
    - -

    First, if the ignoreCvsFiles setting is true, and the file name is .cvsignore or matches .#?*, or the file is inside a sub-directory of the source root that is called CVS, then it chooses the "ignore" processing mode. Also, if the ignoreSvnFiles setting is true, and the file is inside a sub-directory of the source root that is called .svn, then it chooses the "ignore" processing mode (note that it doesn't ignore conflict files, i.e., *.mine and *.rnumber). Also, if ignoreTemporaryFiles setting is true, and the file name matches ?*~ or ~?* or #?*# or %?*% or _.?*, or the extension (the part after the last dot in the file name) after converting to lowercase matches bak or ~* or *~ then it chooses the "ignore" processing mode. Note that the FMPP Ant task always sets these settings to false, so it does not interfere with the defaultExcludes parameter of Ant.

    - -

    Then, the processing mode is chosen with a sequence of path patterns, which is defined by the modes setting. The first path pattern in the sequence that matches the virtual path of the file, chooses the processing mode. If no matching path were found, then FMPP chooses the processing mode automatically:

    -
      -
    • If the file extension after converting to lowercase is xml and the xmlRenderings is not an empty sequence, then it chooses the "renderXml" mode. -
    • If the file extension after converting to lowercase is one of: ace, arc, arj, avi, bmp, bz, bz2, cab, chm, class, com, dll, doc, exe, fli, gif, gz, ico, jar, jpeg, jpg, lha, lzh, mov, mp3, mpeg, mpg, msi, pcx, pdf, png, ps, rar, swf, tar, taz, tga, tgz, tiff, tz, wav, wma, xls, zip, then it chooses the "copy" processing mode. -
    • Otherwise it chooses the "execute" processing mode. -
    -

    The modes setting is a list of TDD functions, where the function name is either execute, copy, renderXml, or ignore. The arguments to the functions are one or more path patterns of virtual paths in the source file system. For example this (in a configuration file):

    -
    modes: [
    -    ignore(**/tmp/)
    -    copy(foo/**/*.html, foo/**/*.htm)
    -    execute(**/*.html, **/*.htm, **/*.xhtml)
    -    copy(**/*)
    -]

    will produce this processing mode chooser sequence:

    - -
    Path patternProcessing mode -
    **/tmp/ignore -
    foo/**/*.htmlcopy -
    foo/**/*.htmcopy -
    **/*.htmlexecute -
    **/*.htmexecute -
    **/*.xhtmlexecute -
    **/*copy -
    - -

    Note that processing modes are only applicable to files, not to directories. Say, you can't tell FMPP to ignore a directory, but to ignore all files in the directory (as **/tmp/ above). The end result will be that the directory will not be created, as it contains no output file.

    - - - - -

    Header and footer choosing

    - -

    - Name: borders
    - Type: sequence (of function calls)
    - Default: empty
    -

    - -

    With these settings you can insert a header before templates, and insert a footer after templates (templates = files processed in "execute" processing mode). The insertion of header and footer happens only in the memory of the computer, and does not modify the source files. This can be used to add common headers and footers to the templates without actually typing them again and again. Also, you can change the header/footer of many templates at once.

    - -

    The intent of headers and footers is not to show something at the top and bottom of pages. Rather it is to insert FTL directives that import or include commonly used macros, or to place the page inside a directive block, as <#escape ...>...</#escape>. For concrete examples please see <FMPP>/docs/examples/border.

    - -

    Note: Unfortunately the inserted header displace the error locations (column, row) in the error messages (I can't fix it in FMPP; FreeMarker improvements are needed to address this). However, if the header doesn't contain line-break, then this unwanted effect is limited to the first line of the template. So it's strongly recommended to not use line-break in headers.

    - -

    Footers and headers are chosen with similar mechanism to processing modes (see modes). There are two independent sequence of path-pattern to text entry mappings (so called "choosers"), one for choosing headers, and one for choosing footers. When FMPP loads a template file, it checks if the virtual path of the file matches to an entry in the header chooser sequence, and if so, it uses the header specified in the first such entry. Also, it does the same with the sequence of footers choosers, to choose a footer.

    - -

    There is a single setting to build both sequences at once: borders. You give a sequence of header, footer and border functions in it. The first argument to header and footer functions is the text of header and footer respectively, and the further arguments are the path patterns of virtual paths in the source file system. If you omit the path patterns, that's the same as if you give ** (i.e. match all files). border is convenience function: border(a, b, paths...) is equivalent with header(a, paths...), footer(b, paths...). Example:

    -
    header("<#import '/lib/css.ftl' as css>", **/*.css)
    -border("<#escape x as x?html>", "</#escape>", **/*.html, **/*.htm)

    This build these sequences:

    -
      -
    • Header chooser sequence: - -
      Path patternHeader -
      **/*.css<#import '/lib/css.ftl' as c> -
      **/*.html<#escape x as x?html> -
      **/*.htm<#escape x as x?html> -
      -
    • -
    • Footer chooser sequence: - -
      Path patternFooter -
      **/*.html</#escape> -
      **/*.htm</#escape> -
      -
    • -
    - -

    Only the first matching entry of the sequence is used for a file, the later entries are ignored. But sometimes you want to choose multiple headers/footers for the same file. In that case, you can define multiple independent sequences, so said, layers. Layers are separated with layer(). For example, modify the above example, so it imports /lib/common.ftl at the top for all files, without disabling the other headers/footers:

    - -
    # The 1st (implicit) layer starts here
    -header("<#import '/lib/common.ftl' as c>", **/*.css, **/*.html, **/*.htm),
    -layer()
    -# The 2nd layer starts here
    -header("<#import '/lib/css.ftl' as css>", **/*.css),
    -border("<#escape x as x?html>", "</#escape>", **/*.html, **/*.htm)
    -

    Here we have two independent header chooser sequences, so both CSS and HTLM files will import lib/common.ftl, and in additional CSS files will import lib/css.ftl, and HTML files will use an escape block. You can have any number of layers.

    - -

    A header chosen from an earlier layer will be used earlier in the template file than headers chosen from later layers. A footer chosen from an earlier layer will be used later in the template file than footers chosen from later layers. For example:

    - -
    borders: [
    -  border('L1(', ')L1')
    -  layer()
    -  border('L2{', '}L2')
    -  layer()
    -  border('L3[', ']L3')
    -]
    -

    If the content of a template file is content, its output will be:

    - -
    L1(L2{L3[content]L3}L2)L1
    - - - -

    Output file name deduction

    - -

    - Name: removeExtensions
    - Type: sequence (of strings)
    - Default: empty
    -Command-line short name: R
    -

    - -

    - Name: removePostfixes
    - Type: sequence (of strings)
    - Default: empty
    -

    - -

    - Name: replaceExtensions
    - Type: sequence (of strings)
    - Default: empty
    -

    - -

    Initially the name of the output file is the same as the name of the source file. These two settings allow you to change the output filename somewhat, be removing parts of source file name. - -

    The precise meaning of the settings:

    -
      -
    • removeExtensions: If the source file name ends with an exension in this sequence, then it will be removed from the output file name. For example, if t is in the sequence (note that there is no dot before the t), then the output file for example.html.t will be example.html. The extension to remove can contain dots (as tar.gz).
    • - -
    • removePostfixes: If the source file name before the first dot ends with a string in this sequence, then it will be removed from the output file name. For example, if _t is in the sequence, then the output file for example_t.html will be example.html. If the file name does not contains dot, then it still works: example_t will become to example.
    • - -
    • replaceExtensions: This sequence is used to replace the file extensions with another extensions. For example, if the sequence is this:
      - ftl, html, xftl, xml
      - then the ftl extension will be replaced with html (i.e. the output file name for source file foo.ftl will be foo.html), and the xftl extension will be replaced with xml. The 1st, 3rd, 5th, etc. sequence elements are the old extensions, and the 2nd, 4th, 6th, etc. sequence elements are the new extensions, so html extension will not be replaced with xftl. Also, only one extension replacement will occur for the same file name, so in the case of
      - x, y, y, z
      - x will not become to z.
    • - -
    -

    The settings are applied in the order as they appear above. Each setting is applied only once on the same file name. - -

    Note that output file name deduction is only apply to files, not to directories.

    - - - - -

    Skipping unchanged files

    - -

    - Name: skipUnchanged
    - Type: string
    - Default: none
    -Command-line short name: -U
    -

    - -

    This setting specifies that the processing of which source files can be skipped, if the source file was not modified after the last modification time of the output file. The value of setting can be one of:

    -
      -
    • none: Don't skip unchanged files. -
    • all: Skip all unmodified files. Warning! It has the problem that if the data that the template displays was changed, or a file that is <#include ...>-d or <#import ...>-d by the template was changed, it will not re-generate the output, since the template file itself was not changed. -
    • static: Skip only unmodified files that will be simply copied anyway (the files where the modes chooses "copy" processing mode). Process all other files. This is the recommended setting for most projects. -
    -

    If the output does not exist, the source file will be always processed.

    - -

    This feature will not work for templates that rename or drop the original output file during the template execution, since FMPP will believe in the next processing session that the output file for those files is missing, and thus it will process them again.

    - - - - -

    Turn choosing

    - -

    - Name: turns
    - Type: sequence (of function calls)
    - Default: empty sequence
    -

    - -

    When FMPP has to process multiple files in the same processing session (for example, when you process a whole directory), then the order in which the files will be processed, is undefined. This is a problem in certain use cases, where it must be ensured that certain files will be processed later than others. For example, if a page contains the alphabetic index of keywords occur in other pages, then that page must be processed for the last, because the information is collected during the processing of the other pages. This is what turns are about: to guarantee the order of the processing of files.

    - -

    The processing session is divided up into, so called, turns. Turns are identified with the turn number, which is simply the order of the turn. The session starts with turn 1, then comes turn 2, and then comes turn 3, ...etc. FMPP puts all files that will be processed into exactly one of the turns, based on the turn chooser sequence.

    - -

    The turn chooser sequence is a sequence of path-pattern -> turn-number pairs. For each source file, the virtual path of the source file is compared with these path patterns, and the first pattern of the sequence that matches determines the turn in which the file will be processed. If there is no matching pattern in the sequence for the file, then the file will be processed in turn 1.

    - -

    For example, if config.fmpp contains this line: - -

    turns: [turn(3, main_idx.html), turn(2, **/*_idx.html)]
    -

    then all files where the file name ends with _idx.html will be processed in turn 2, except main_idx.html, which will be processed in turn 3. All other files will be processed in turn 1.

    - -

    There is no upper limit of the turn number (except a technically limit, somewhere near 2 thousand million). Simply, the last turn will be the turn with the highest number, which is mentioned in the turn chooser sequence, or 1, if the sequence is empty. The first turn is always the turn 1. It is not a problem if a turn contains no file processing.

    - -

    See <FMPP>/docs/examples/session for a working example, or the FMPP task call in the build.xml.

    - - - - -

    Data model building

    - -

    - Name: data
    - Type: hash
    - Default: No default value
    -Command-line short name: D
    -

    - -

    - Name: localData
    - Type: sequence
    - Default: No default value
    -

    - -

    - Name: templateData
    - Deprecated! Use localData instead.
    - Type: string (Java class name)
    - Default: No default value
    -

    - -

    As you may know from the FreeMarker manual, FreeMarker generates the output by merging a template with a data model, and the data model is a hash variable, the root hash. With FMPP terminology, it is usually just referred as "the data". In FMPP, the population of the root hash happens in two places:

    -
      -
    1. Session level data: Once per processing session, at the very beginning of it (before any file processing is stared), the root hash is filled with variables based on the data setting. This is what happened in the Quick Tour, when we have loaded the colors and the table of birds. These variables will be constant during the whole session, and visible for all templates. They must not be modified while the processing session is executing, even if you find a technical way to do that. Note that FreeMarker uses multiple variable layers, so you doesn't modify these variables with <#assign ...> or <#global ...>, just hide them for the time of the template execution, which is OK (the effect will not be visible for the files processed later). - -
    2. Local data (file processing level data): For each processed file, just before FMPP starts to proccess the file, some extra variables are put into the root hash that are specific for that file. These variables will be present in the root hash only while that file is being processed (hence "local data"), so the next file processing will start with the original session level data in the root hash again. The local data is built in three steps, in this order: -
        -
      1. Variables created based on the localData setting. (See details later...) -
      2. Deprecated: User written Java object of class specified by templateData adds an arbitrary set of variables. This feature is deprecated and will be removed later. -
      3. The FMPP core adds the pp hash. -
      - Variable added later will overwrite the variable of similar name added earlier. Also, variable that is local data will hide (seemingly overwrite) the variable of similar name that is session level data. -
    3. -
    - -

    From the view point of FreeMarker templates, variables that are part of the session level data and the part of the local data are not different. They are equal parts of the data model.

    - - -

    More about the data setting

    - -

    When you use TDD syntax for defining the hash for data, TDD function calls are interpreted as data loader invocations. For reminder, here is the relevant part of config.fmpp from <FMPP>/docs/examples/qtour_step4:

    - -
    data: {
    -    tdd(data/style.tdd)
    -    birds: csv(data/birds.csv)
    -}
    -

    TDD syntax makes it possible to enter values directly as well, without using data loaders. For example, you could directly enter the "birds" table with TDD (altoguh it is not too convenient): - -

    data: {
    -    tdd(data/style.tdd)
    -    birds: [
    -        {
    -            name: arctic-tern
    -            description: "Flies very long distances all years."
    -            favoriteFood: sardine
    -        }
    -        {
    -            name: house-sparrow
    -            description: "Don't you say you don't know it..."
    -            favoriteFood: sunflower
    -        }
    -        {
    -            name: sakeret
    -            description: "Great hunter of the sky."
    -            favoriteFood: pigeon
    -        }
    -    ]
    -}
    - - - - -

    More about the localData setting

    - -

    Let's start with a simple example. We have a variable bgColor in the session level data with value green. We want to override this with value yellow for the source files that are in directory sub (or in its subdirectories, ...etc.):

    - -
    data: {
    -    bgColor: green
    -}
    -
    -localData: [
    -    case(sub/**, {bgColor: yellow})
    -]
    -

    Complicate it a bit... now set the bgColor if the file is in directory sub or sub2:

    - -
    localData: [
    -    case(sub/**, sub2/**, {bgColor: yellow})
    -]
    -

    Now do the same as earlier, except for files that are in directory sub/sky, where the bgColor is always blue:

    - -
    localData: [
    -    case(sub/sky/**, {bgColor: blue})
    -    case(sub/**, sub2/**, {bgColor: yellow})
    -]
    -

    The rule is that the first case(...) where one of the path patterns matches the source file path, will specify the local data (given as the last parameter), and the further case(...)-s are ignored. There can be any number of case(...)-s listed (note that localData is a sequence), and a case(...) can have any number of path patterns (but 0).

    - -

    Tricky example: do the same as earlier, but don't override the color if the file name starts with foo:

    - -
    localData: [
    -    case(**/foo*, {})
    -    case(sub/sky/**, {bgColor: blue})
    -    case(sub/**, sub2/**, {bgColor: yellow})
    -]
    -

    Assume you want to set variable author to Joe for all files where the file name contains _j., and to Amy for all files contains _a.. But, you want to do this independently of the bgColor business. In this case you have to use layers:

    - -
    localData: [
    -    # The 1st (implicit) layer starts here
    -    case(**/foo*, {})
    -    case(sub/sky/**, {bgColor: blue})
    -    case(sub/**, sub2/**, {bgColor: yellow})
    -    layer()
    -    # The 2nd layer starts here
    -    case(**/*_j.*, {author: Joe})
    -    case(**/*_a.*, {author: Amy})
    -]
    -

    The rule is that layers are separated with a layer() function call. You can have any number of layers. The case(...)-list of each layer will be searched for the first match independently. If more layers put the same variable into the data model, the higher layer (earlier layer) wins (hence "layers"). Layers are calculated starting with the lowest layer. Note that to ease setting merging, layers that doesn't contain any case(...)-s are removed automatically.

    - -

    The last parameter of the case can be:

    -
      -
    • Arbitrary TDD hash (as in the examples above). This behaves as the value of the data setting, so you can use any number of key-value pairs, and invoke data loaders. The value of hash is calculated at most once per processing session, when it is first needed. For the subsequent file processings where the same case(...) is choosen, the calculated value is reused, so the data loaders don't re-load the external resources. If the case(...) is never chosen during the session, the value of the TDD hash is not calculated at all.
    • - -
    • A TDD function call. The supported functions are: -
        -
      • bsh: Deduces the path of a BeanShell script file from the source file path, and executes that script to create local data. The path of the script file will be the same as the path of the source file, except that the file name part is modified according the options described later. The script must return a java.util.Map, which stores the variables (keys are the names of the variables, associated values are the values of the variables) that will be added to the local data. The following variables are accessible for the scripts: engine, the fmpp.Engine instance, and templateEnvironment, the fmpp.TemplateEnvironment instance. There is 1 parameter to this function (optional), a hash that can store the following options (each is optional): -
          -
        • ending: The string appended at the end of the source file name. Can't be 0 length string. It defaults to .bsh.
        • -
        • removeExtension: Sets if the extension from the source file name should be removed before appending the ending. The extension is the part after the last dot of the file name. The dot itself is also removed. Defaults to false.
        • -
        • ignoreMissing: Set if it will be ignored if no script file found for the source file (and the source file will be processed normally), rather than aborting the processing of the file with error. Defaults to false.
        • -
        • encoding: The encoding of the script files. If it is not set then the value of the sourceEncoding setting will be used.
        • -
        -
      • -
      -
    • - -
    • A string. In this case the string will be interpreted as BeanShell script that must evaluate to an object that implements fmpp.LocalDataBuilder. This let Java programmers to implement custom local data strategies. See the API documentation for more information. (The predefined strategies above are also implemented with this interface internally.)
    • -
    - -

    Finally, let see an example of the usage of the bsh function: It will execute a BeanShell script file for each HTML to add local data. For example, the script file for source file foo/bar.html should be foo/bar.html.bsh. If there is no script for the HTML file, it will not consider that as an error.

    - -
    modes: ignore(**/*.bsh)
    -localData: [
    -    case(**/*.htm, **/*.html, bsh({ignoreMissing}))
    -]
    -

    A possible .bsh file, that adds local variables x and y:

    - -
    res = new HashMap();
    -res.put("x", "Just for test: " + templateEnvironment.getData("author"));
    -res.put("y", "Blah...");
    -return res;
    -

    For a working example see <FMPP>/docs/examples/local_data.

    - - - - - - -

    Locale

    - -

    - Name: locale
    - Type: string (locale)
    - Default: en_US
    -Command-line short name: A
    -

    - -

    Set the locale (language, country) used in templates. It has significance because different countries write numbers differently, sort text differently, etc.

    - -

    The value is a string which consist of a language code (lowercase two-letter ISO-639 code) plus optional county code (uppercase two-letter ISO-3166 code) separated from the language code with underscore, and if we have specified the country then an optional variant code (not standardized) separated from the country with underscore. Examples of valid values: en, en_US, en_US_MAC. FreeMarker will try to use the most specific available locale, so if you specify en_US_MAC but that is not known, then it will try en_US, and then en, and then the default locale of the computer.

    - -

    Also, the special value host can be used to ask FMPP to use the default locale of the host operating system. However, for most applications it is not recommended to depend on the host locale, since then the output will depend on where you run the generation (and not on what people will use the output).

    - -

    If you don't know what your locale string would be, use the --print-locales option of the command-line tool. Note that unfortunately, the codes printed here are far the superset of locales that Sun's Java platform implementation actually correctly handles.

    - -

    Note that the initial value of the setting is en_US, because it is the locale that formats things similarly as a programmer would expect.

    - - - - -

    Number format

    - -

    - Name: numberFormat
    - Type: string
    - Default: 0.############
    -

    - -

    This specifies the default format of numbers when FreeMarker has to convert numbers to strings. For example, if you change this setting to 0.00 then:

    - -
    ${1}, ${1.1}, ${1.245}
    - -

    will print (if the locale setting is en_US):

    - -
    1.00, 1.10, 1.25
    - -

    Note that you can override the effect of this setting in the templates with <#setting number_format="something">, also you can override this for each interpolations with ?string("something").

    - -

    The syntax and semantic of the format string is as java.text.DecimalFormat defines it. For convenience I quote a part from the documentation of java.text.DecimalFormat:

    - - -

    Pattern Syntax -

    - pattern     := pos_pattern{';' neg_pattern}
    - pos_pattern := {prefix}number{suffix}
    - neg_pattern := {prefix}number{suffix}
    - number      := integer{'.' fraction}{exponent}
    - prefix      := '\u0000'..'\uFFFD' - special_characters
    - suffix      := '\u0000'..'\uFFFD' - special_characters
    - integer     := min_int | '#' | '#' integer | '#' ',' integer
    - min_int     := '0' | '0' min_int | '0' ',' min_int
    - fraction    := '0'* '#'*
    - exponent    := 'E' '0' '0'*
    -  
    - Notation:
    -   X*       0 or more instances of X
    -   { X }    0 or 1 instances of X
    -   X | Y    either X or Y
    -   X..Y     any character from X up to Y, inclusive
    -   S - T    characters in S, except those in T
    - 
    - -

    Special Pattern Characters - -

    Many characters in a pattern are taken literally; they are matched during - parsing and output unchanged during formatting. Special characters, on the - other hand, stand for other characters, strings, or classes of characters. - They must be quoted, unless noted otherwise, if they are to appear in the - prefix or suffix as literals. - -

    The characters listed here are used in non-localized patterns. Localized - patterns use the corresponding characters taken from this formatter's - DecimalFormatSymbols object instead, and these characters lose - their special status. Two exceptions are the currency sign and quote, which - are not localized. - -

    - - - - - - - - - - - -
    SymbolLocationLocalized?Meaning
    0NumberYDigit -
    #NumberYDigit, zero shows as absent
    .NumberYDecimal separator or monetary decimal separator
    -NumberYMinus sign
    ,NumberYGrouping separator
    ENumberY - Separates mantissa and exponent in scientific notation. - Need not be quoted in prefix or suffix.
    ;Subpattern boundaryY - Separates positive and negative subpatterns
    %Prefix or suffixYMultiply by 100 and show as percentage
    \u2030Prefix or suffixY - Multiply by 1000 and show as per mille
    ¤
    (\u00A4)
    Prefix or suffixN - Currency sign, replaced by currency symbol. If - doubled, replaced by international currency symbol. - If present in a pattern, the monetary decimal separator - is used instead of the decimal separator.
    'Prefix or suffixN - Used to quote special characters in a prefix or suffix, - for example, "'#'#" formats 123 to - "#123". To create a single quote - itself, use two in a row: "# o''clock".
    - - - - -

    Boolean format

    - -

    - Name: booleanFormat
    - Type: string
    - Default: true,false
    -

    - -

    This setting specifies how boolean values will be converted to text or from text inside FreeMarker templates (not in data loaders). Note that by default doing something like ${myBoolean} is an error, because FreeMarker denies using "true,false" for implicit boolean to text conversion; write ${myBoolean?c} where you want true and false as is in the output.

    - -

    This setting directly correspond to the FreeMarker setting with similar name, so find the full documentation there: -FreeMarker settings.

    - -

    Example: "Yes,No" means that ${myBoolean?c} will print Yes or No. - - - - -

    Date/time format

    - -

    - Name: dateFormat
    - Type: string
    - Default: No default value
    -

    - -

    - Name: timeFormat
    - Type: string
    - Default: No default value
    -

    - -

    - Name: datetimeFormat
    - Type: string
    - Default: No default value
    -

    - -

    - Name: timeZone
    - Type: string
    - Default: No default value
    -

    - -

    - Name: sqlDateAndTimeTimeZone
    - Type: string
    - Default: No default value
    -

    - -

    These settings specify how date/time/date-time values will be converted to text or from text inside FreeMarker templates (not in data loaders, unless said otherwise).

    - -

    These settings directly correspond to the FreeMarker settings with similar name, so find their full documentation there: -FreeMarker settings.

    - -

    Examples of datetimeFormat-s: "dd.MM.yyyy HH:mm:ss" (where HH means 0-23 hours) or "MM/dd/yyyy hh:mm:ss a" (where a means AM or PM, if the current language is English), "iso" (ISO 8601:2004 format), "xs" (XML Schema format). - -

    Examples of timeZone-s: "GMT", "GMT+2", "GMT-1:30", "CET", "PST", "America/Los_Angeles", "JVM default" - -

    When a format setting isn't set, the default format of the current locale (country) will be used, which are specified by the Java installation you run FMPP on. If the timeZone isn't set, the time zone of the host computer will be used (specified by the Operating System).

    - - - -

    Handling errors

    - -

    - Name: stopOnError
    - Type: boolean
    - Default: true
    -Command-line short name: s, c
    -

    - -

    Be default when FMPP encounters problem during the processing of a source file, it terminates the whole processing session with the error. It can be annoying if you have many bad files, because you have to restart the whole session and wait until the session reaches another bungled template (or other kind of problematic source file), again and again, until you have fixed all of them. If you change this setting to false, FMPP will not stop on the errors, just skips the problematic source file and continues the processing session with the next source file. You should use logFile together in this case, so you can later digest all problems occured during the processing session.

    - -

    Note that this settings will only suppress errors that occur during the processing of source files. It will not suppress errors like, for example, bad data files (unless it's loaded in a template with pp.data) or invalid setting values.

    - - - - -

    Expert mode

    - -

    - Name: expert
    - Type: boolean
    - Default: false
    -Command-line short name: x
    -

    - -

    This setting is to enable suspicious situations, when the engine or the tool suspects that you have miss-configured something, and thus an accidental data loss can happen. It is recommended to leave this setting false, until it actually blocks something that you want to do.

    - -

    Please note that overwriting a file in general is a normal situation for FMPP; no expert mode required to do that.

    - - - -

    Case sensitive path comparison

    - -

    - Name: caseSensitive
    - Type: boolean
    - Default: false
    -

    - -

    This setting tells if FMPP should differentiate upper- and lower-case letters when it compares paths for equality, or when it matches paths to path patterns. Regardless of this setting, FMPP always tries to keep the case of file names (i.e. the output of Foo.txt will be Foo.txt, and not foo.txt or FOO.TXT), as far as the host operating system does not prevent this.

    - - - -

    Logging

    - -

    - Name: logFile
    - Type: string (path)
    - Default: No default value
    -Command-line short name: L
    -

    - -

    - Name: appendLogFile
    - Type: boolean
    - Default: No default value
    -

    - -

    If these settings are supported or not, depends on the front-end you use. If a setting is not supported, the front-end must silently ignore it.

    - -

    If the logFile setting is set, the front-end should record information about the processing session into the file, such as the warning messages and errors occurred.

    - -

    If appendLogFile is false, then already existing log file (possibly left from the previous processing session) is deleted and restarted. This is the recommended default behavior, however a front-end may chooses something different. If appendLogFile is true, then old log file should be continued.

    - -

    Please read the documentation of the front-end you use for the precise behavior of these settings.

    - - - - -

    Showing the progress and other messages

    - -

    - Name: quiet
    - Type: string
    - Default: No default value
    -Command-line short name: q, v, Q
    -

    - -

    - Name: echoFormat
    - Type: string
    - Default: No default value
    -Command-line short name: F
    -

    - -

    - Name: columns
    - Type: integer
    - Default: No default value
    -

    - -

    - Name: printStackTrace
    - Type: boolean
    - Default: false
    -

    - -

    - Name: snip
    - Type: boolean
    - Default: true
    -

    - -

    If these settings are supported or not, depends on the front-end you use. If a setting is not supported, the front-end must silently ignore it.

    - -

    The quiet setting tells the front-end if how much should it show the progress of the processing session on the screen. The accepted values are true, false (of type string or boolean), and reallyQuiet. Also, empty string is equivalent with true. (Values -1, 0, 1 are also supported for backward compatibility.) The precise meaning of values is front-end specific.

    - -

    The echoFormat setting specifies how to display the progress of the processing session on the screen. The meaning of values and the set of understood values are front-end specific, but values verbose, normal, terse and quiet should be understood, also the shorthands of them: v, n, t and q. The front-end must not stop with error if it doesn't understand the value that comes from a configuration file.

    - -

    The columns setting specifies the number of columns on the console (terminal), which is used for text wrapping. This is only applicable if you are using a command line interface for FMPP (or something similar). If you are using the provided shell script to invoke the command line interface, that will try to auto-detect the actual value (since 0.9.15), so you shouldn't set this setting, unless the auto-detection gives incorrect result.

    - -

    The printStackTrace setting specifies if the front-end should print stack trace to the screen on error, or a terser error description. snip is deprecated, and now it's just the inverted alias of printStackTrace.

    - -

    Please read the documentation of the front-end you use for the precise behavior of these settings.

    - - - -

    Meta settings

    - -

    - Name: configurationBase
    - Type: string (path)
    - Default: No default value
    -

    - -

    - Name: inheritConfiguration
    - Type: string (path)
    - Default: No default value
    -

    - -

    These settings influence the interpretation of the configuration file they are stored in. Although front-ends may support the specification of these settings outside configuration files, with the front-end specific interface, the meta setting specified in this way is used to emulate that the setting is present in the configuration file the front-end loads.

    - -

    The configurationBase setting sets the configuration base for the setting values stored in the same configuration file. If the configurationBase itself is a relative path, then it is resolved relatively to the directory of the configuration file.

    - -

    If inheritConfiguration is present in a configuration file, then the configuration will inherit the configuration file pointed by the value of this setting. If inheritConfiguration is a relative path, then it is resolved relatively to the configuration base, which is already overridden by configurationBase if that's persent in the configuration file.

    - - - - -

    XML related settings

    - - -

    - Name: xmlCatalogFiles
    - Type: sequence (of paths)
    - Default: No default value
    -

    - -

    - Name: xmlCatalogPrefer
    - Type: string
    - Default: public
    -

    - -

    - Name: validateXml
    - Type: boolean
    - Default: false
    -

    - -

    - Name: xpathEngine
    - Type: string
    - Default: dontSet
    -

    - -

    - Name: xmlRenderings
    - Type: sequence (of hashes)
    - Default: empty
    -

    - - -

    Catalogs

    - -

    Catalog files are (primarily) used to map public identifiers (and system identifiers) to local files. For example, you want to load an XML file that starts with this:

    - -
    <?xml version="1.0"?>
    -<!DOCTYPE html
    -    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    -    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    ->
    -

    Whenever you try to load this XML file, the XML parser will need the DTD requested by the DOCTYPE, so it will try to download it from http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd (and all other files the DTD will refer to), which is obviously a bad joke. The standard solution is that you obtain the DTD file (and the further files it refers to) and store it locally on your computer, and also you write a catalog file that maps public identifiers (as -//W3C//DTD XHTML 1.0 Transitional//EN) to the local paths of the files. Then, you have to specify the catalog file(s) for FMPP with the xmlCatalogFiles setting.

    - -

    FMPP supports the "widely known" catalog formats: OASIS plain text TR9401 catalog files, OASIS XML Catalogs, and XCatalogs. Delegate entries are supported. Don't panic if you can't undestand a word of it! :) Just look at <FMPP>/docs/examples/xml_validating. For most people it's enough to know (copy-paste...) what (s)he sees there. If you still need more information, please visit the Web page of the OASIS Entity Resolution Technical Committee: http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=entity.

    - -

    The meaning of xmlCatalogPrefer should be clean if you are familiar with OASIS catalogs. If you are not, just left it unchanged. The allowed values of this setting are system, public, and globalDefault.

    - -

    Both catalog related settings has a global (Java virtual machine level) default. Please find the documentation of org.apache.xml.resolver package on the Internet about this. In the case of xmlCatalogFiles, the global default will be appended at the end of the list of catalog files. In the case of xmlCatalogPrefer, the global default is used when the value of the setting is globalDefault. Attention! If you don't use the xmlCatalogFiles FMPP setting, then the catalog feature is disabled, so you must specify this setting (even an empty sequence) to use the global defaults.

    - - - - -

    Validation

    - -

    The validateXml setting specifies if, by default, XML files are validated (i.e. checked against the DTD) or not. With "by default" I mean that this can be overridden for individual files, as with the validate option of the xml data loader.

    - - - - -

    XPath engine

    - -

    The xpathEngine setting specifies which XPath engine will FreeMarker use when you access XML data (see XML dataloader). This setting accepts these values:

    - -
      -
    • jaxen: Use Jaxen. For this to work, you need to obtain jaxen.jar (1.1-beta-8 or later!), and make it accessible for FMPP (e.g. copy it into the lib directory of the FMPP installation, or if you use FMPP as Ant task, then into the lib directory of Ant). Jaxen provides richer set of capabilities for FreeMarker templates than Xalan.
    • -
    • xalan: Use Apache Xalan. Xalan is accessible for sure if you are using Sun J2SE 1.4, but not in 1.5.
    • -
    • default: Let FreeMarker choose the XPath engine it prefers. In FreeMarker 2.3 it will be Xalan (if available).
    • -
    • dontSet: Don't set what XPath engine will be used. For most users it is the same as default (see below). This is the default value of the setting.
    • -
    • All other values are interpreted as the full-qualified class name of an XPath engine adapter class, that is, a freemarker.ext.dom.XPathSupport implementation.
    • -
    - -

    If you embed FMPP into your application, then you have to know that XPath engine choosing is a VM level setting (static field) of FreeMarker. Whenever you execute a processing session, FMPP will aggressively set this FreeMarker setting according the xpathEngine FMPP setting. Thus, if you don't want FMPP to interfere with other FreeMarker dependent components in the same VM, you should keep value dontSet.

    - - - -

    XML rendering

    - -

    XML rendering is similar to the typical XSLT usage pattern, if you know that. The source file, for which renderXml processing mode is choosen (see the modes setting), will be parsed as XML file. Then, this XML document will be rendered to one or more output files with a FreeMarker template, which is choosen based on the value of the xmlRenderings setting. The template gets the XML documents with the pp.doc variable. Since the template shouldn't be executed in itself, it should be an ignored file (for example it should be stored in a directory that has an ignoredir.fmpp file). - -

    For an example of this pattern check <FMPP>/docs/examples/xml_rendering.

    - -

    Note: Sometimes you rather want to handle XML files as data than as source files. In this case use data, localData, or pp.loadData with the XML data loader, not XML rendering.

    - -

    The xmlRenderings setting stores a sequence of XML rendering configurations. An XML rendering configuration is a hash that stores the options of an XML rendering. The options are:

    - -
      -
    • Options specify which XML files should be processed with the configuration: -
        -
      • IfSourceIs: Optional, defaults to an empty sequence. This option is a sequence of path patterns (strings), or a single path pattern. FMPP will not render the XML file with this configuration if its source root relative virtual path does not match a pattern in this sequence. If this sequence is empty, FMPP will not consider this condition, that is, it will not exclude any XML files because of their path.
      • - -
      • ifDocumentElementIs: Optional, defaults to an empty sequence. This option is a sequence of element names (strings), or a single element name. FMPP will not render the XML file with this configuration if this sequence doesn't contain the document element (the root element) of the XML file. If this sequence is empty, FMPP will not consider this condition, that is, it will not exclude any XML files because of their document element. The element names can use name-space prefixes. The prefixes and the default name-space of elements can be specified with the xmlns option of the configuration.
      • -
      -
    • - -
    • Options specify how to load the XML file. These are exactly the same as the options of the XML data loader (xmlns, index, ...etc.), except that false value for namespaceAware is not allowed.
    • - -
    • Options for java programmers, to build extra local data based on the loaded XML file. -
        -
      • localDataBuilder: Optional, defaults to an empty sequence. This is a sequence of strings, or a single string. Each string will be evaluated as BeanShell script (once per Settings.execute()), which must return an fmpp.LocalDataBuilder. The aim of these data builders is to do the complex or resource eager parts of the XML processing that you don't want to do in FTL, and expose the results as local data. The data loaders can get the loaded XML document with templateEnvironment.getXmlDocument(), or templateEnvironment.getWrappedXmlDocument(). These data builders will be invoked after the application of the localData setting, and can replace earlier added local variables. They will be executed in the same order as they appear in the sequence.
      • -
      -
    • - -
    • Options specify how to render the XML document to output file: -
        -
      • template: Required if copy is false. This is the source root relative virtual path of a FreeMarker template, which will be invoked to render the output. (The template file itself should be an ignored file, as it doesn't produce output alone.) The template can access the XML document with the pp.doc variable.
      • - -
      • copy: Required if template is not specified, defaults to false. This is a boolean value. If it is true, then the XML document will be copied to the output file (exact copy). In this case the template option can't be used.
      • -
      -
    • -
    - -

    Example:

    - -
    xmlRenderings: [
    -    {
    -        ifDocumentElementIs: product
    -        template: renderer/product.html
    -        xmlns: {D: http://example.com/xmlns/products}
    -    }
    -    {
    -        ifDocumentElementIs: book
    -        template: renderer/book.html
    -        index: {
    -            element: [part, chapter]
    -            attribute: ppFile
    -            numbering: hierarchical
    -            value: '%e_%n.html'
    -        }
    -    }
    -]
    -

    When renderXml processing mode is chosen for a source file (see modes), then the first matching XML rendering configuration of the sequence will be used. A configuration is matching if nor the ifSourceIs, nor the ifDocumentElementIs option excludes the XML file. (Thus, if a configuration doesn't use any of the if... options, it will be used for all source files, unless an earlier configuration matches the source file too.)

    - - - - - -

    FreeMarker links (external includes)

    - -

    - Name: freemarkerLinks
    - Type: hash (of sequence of paths)
    - Default: No default value
    -

    - -

    FreeMarker links is a dirty hack to satisfy a frequent demand: <#include ...>/<#import ...> files that are outside the source root directory, as common FTL macro libraries used in multiple projects.

    - -

    Assume you store your commonly used FreeMarker includes in the c:\user\freemarker\include directory. But, this directory is outside the sourceRoot, so you can't reach it with <#include ...>/<#import ...>. To solve this, add this to the FMPP configuration file:

    - -
    freemarkerLinks: {
    -    inc: c:/user/freemarker/include
    -}
    -

    Now you can include files of that external directory like this:

    - -
    <#include "/@inc/foo.ftl">
    -

    Here, FreeMarker will actually read c:\user\freemarker\include\foo.ftl. The seeming @inc entry in the source root directory (seeming, as there is no such file or directory there in reality) acts as an alias, a transparent link to c:\user\freemarker\include. (Note that in the configuration file I have used slash instead of backslash for convenience.)

    - -

    It is important that link entries (as @inc above) are visible only for the predefined FreeMarker directives that use template paths (in FreeMarker 2.3, these are <#include ...> and <#import ...>), or for user defined directives that internally use those predefined directives. They are not visible for anything else. Thus, they are not visible for the functions and directives of the pp hash, nor FMPP will try to process the @inc directory (since it doesn't see it at all).

    - -

    As you have seen, a link is defined by associating a name (inc in the last example, but you can use anything else you prefer) with a path. You can have more links with different names. The link is visible in the source root (never in its subdirectories) as a directory (or file) of name @name (where name is the link name). Regarding the associated path, the rules are the same as with sourceRoot, outputRoot, ...etc: it is a real path, so if it is relative, then it will be interpreted relatively to the configuration base.

    - -

    For example, assume, that you also have project specific include files, and you store them outside the source root (because you have multiple source roots in your project), in the include subdirectory of the same directory, where you stores the FMPP configuration files for your project. Use this in the FMPP configuration file:

    - -
    freemarkerLinks: {
    -    inc: /home/joe/freemarker/include
    -    projInc: include
    -}
    -

    Note that the path associated with projInc is a relative path, so it will be resolved relatively to the directory of the configuration file (unless you have overridden the configuration base, of course...). Now you can do things like this:

    - -
    <#include "/@projInc/header.html">
    -<#include "/@inc/foo.ftl">
    -<#import "/@projInc/forms.ftl" as f>
    -

    If the configuration file that contains the above is /home/joe/projects/foo/cfg3.fmpp, then <#include '/@projInc/header.html'> will read /home/joe/projects/foo/include/header.html.

    - -

    In the generic case, a FreeMarker link is associated with a list of paths. For example:

    - -
    freemarkerLinks: {
    -    inc: [/home/joe/freemarker/include, /home/kate/freemarker/include]
    -}
    -

    When you use <#include '/@inc/foo.ftl'> in a template, then FMPP will check if /home/joe/freemarker/include/foo.ftl exist, and if not, it will try /home/kate/freemarker/include/foo.ftl.

    - -

    Files that are really in the source root directory have priority over files that are accessible through FreeMarker links. For example, if you invoke <#include '/@inc/foo.ftl'>, and the source root directory has a subdirectory called @inc, and that subdirectory has a file called foo.ftl, then that file will be used, without considering that the @inc in the path possibly refers to a FreeMarker link. If a subdirectory called @inc exists, but it doesn't contain foo.ftl, then the inc link will be used.

    - -

    A FreeMarker link can point to files as well, not only to directories. For example:

    - -
    freemarkerLinks: {
    -    footer: /home/joe/footers/gpl.html
    -}
    -

    and then in a template you can do this:

    - -
    <#include "@footer">
    -

    The merging of the freemarkerLinks settings is differs a bit from the merging of other hash settings: when the two hashes to merge contains the same key (i.e. the same link name), then the lists of paths for that key will be concatenated. For example, if common.fmpp is:

    - -
    freemarkerLinks: {
    -    a: c:/user/fm/libs1
    -    b: [inc1, inc2]
    -}
    -

    and config.fmpp is:

    - -
    inheritConfiguration: common.fmpp
    -...
    -freemarkerLinks: {
    -    a: c:/user/fm/libs2
    -    b: [inc3, inc4]
    -    c: foo
    -}
    -...
    -

    then the resulting setting value is equivalent with:

    - -
    freemarkerLinks: {
    -    a: [c:/user/fm/libs2, c:/user/fm/libs1]
    -    b: [inc3, inc4, inc1, inc2]
    -    c: foo
    -}
    -

    Note that the name of the links doesn't start with @; the @ is used only to refer to the links. To protect users from mistakes regarding this, it is not allowed to start a link name with @.

    - - - - -

    Activating fixes

    - -

    - Name: freemarkerIncompatibleImprovements
    - Type: string (version number)
    - Default: No default value
    -

    - -

    Enables the FreeMarker fixes/improvements that are not 100% backward compatible, and were implemented in the FreeMarker version given in this setting. In older projects using the highest available 2.3.x is usually a good compromise. New projects should use the maximum, which is the version of the FreeMarker used. If this setting is not set then FreeMarker chooses the this version itself, which as of this writing will be 2.3.0.

    - -

    See Configuration(Version) in the FreeMarker API for what fixes/improvements are activated.

    - -

    The format of the setting value is major.minor.micro, where each part is a positive integer without padding 0-s

    - - - - -

    Object wrapping

    - -

    - Name: objectWrapper
    - Type: string (BeanShell expression)
    - Default: "b = new BeansWrapperBuilder(freemarkerIncompatibleImprovements); b.setSimpleMapWrapper(true); return b.build();"
    -

    - -

    The objectWrapper setting is for FreeMarker "experts" who want to use a customized ObjectWrapper. The value of the setting is a BeanShell expression that must result in an object whose class extends the freemarker.ext.beans.BeansWrapper class. The value can be a simple expression like "new com.example.MyWrapper()", or multiple instructions ending with a return statement.

    - -

    The freemarker.template.ObjectWrapper, freemarker.ext.beans.BeansWrapper, and freemarker.ext.beans.BeansWrapperBuilder classes are automatically imported, so you don't have to use full-qualified class name for them. Also, a non-null freemarkerIncompatibleImprovements value is exposed, which corresponds to the effective value of the similarly named FMPP setting.

    - -

    The ObjectWrapper is created before other setting values (or the fmpp.Engine instance for that mater), so the BeanShell expression has no access to any setting values, except to freemarkerIncompatibleImprovements, as it was shown.

    - -

    A subtle detail regarding the default value: The default value shown is actually only used when freemarkerIncompatibleImprovements is at least 2.3.21. Otherwise the default is created directly with old-style new BeansWrapper(). See the FreeMarker API for the otherwise very subtle difference.

    - - - - -

    Template syntax

    - -

    - Name: tagSyntax
    - Type: string
    - Default: angleBracket with FreeMarker 2.3.x, autoDetect with later versions
    -

    - -

    The tagSyntax setting determines the syntax of the templates (angle bracket syntax like <#include "foo"> VS square bracket syntax like [#include "foo"]) that has no ftl directive in it. If the template uses ftl directive (like it starts with <#ftl> or [#ftl]), then the syntax of the ftl tag determines the syntax of the template, and the tagSyntax setting is ignored.

    - -

    The possible values of this setting are angleBracket, squareBracket and autoDetect. The recommended value is autoDetect, which will auto-detect the syntax of each template independently, by choosing the syntax of the first FreeMarker tag in the template. For example when it finds a [@ in the template, it will choose square bracket syntax.

    - - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/style/fmpptitle.png b/fmpp/docs/style/fmpptitle.png deleted file mode 100644 index e372167cc6c98de62d84f1275639b18fda9dd744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 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 qHD+Rrs^>4TU0000)@Mlo diff --git a/fmpp/docs/style/fonts/icomoon.eot b/fmpp/docs/style/fonts/icomoon.eot deleted file mode 100644 index d360616eff01f0e64740d89b9a553f61a790992c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2776 zcma(TTWB2D^_;mgcOG{h`~i9`OUcc2`?Fs%1eU%Os7BojNTQjb%xe1eWAP zYH@HKi;}uv3N`(S4Jo9xX-No%reOM!fD-iKKoU$TxKJ7zQbeK9HXrSW6R&#i%sQ5g z3q3P;&STEG_uO;Nef-e^s8K^uU^^gOMk#sv$acBZjp4|J+7}Q118`v;reFycs4c-F zDY$SHW?&Y+2d7~YUL;8f$4T-cER(L(DZ&8sLVu+Dur&$gfC5&5LI2@neS_}LSe+#A zP&+ZTFnI=M-~J&fwG%%vJGp#@aDw==gpJwLFP&2UdFdy_uLAJZxtYmnRa^Tm{i5G6 zG)DscJ@zs2Un9PAZeitYH?T7C6U5g}FHKGIUmDcEahdq`g~_vLAO+Wme~b9y;^e~2 zbJ<`0gZK|=j3>`5Ew7ND1eP!V15*Jng9e~nRY(JV8e{xBRMC`rTL8)J?Qj5KL$I|? zde|Be_f_zvUQvFc#K{qT8dpZj2NlK%yEH`wILV3|xS?-|&3l`hBqzHK*ibjjh{w&( za%xV=VaqyFXnhcnEWD`KSfl_n_R2y2ZBZgHsOT=z zTfh#?bYQhKIMmpWBRJGezk66ENsrdWKDjo1;y2e7s*o{UFq55nDoOKSCiGq%X);#Q}$kS#_%o6HwbGAbH#B*Rg>PW z+rJl%%J8^wnW7o^F1}_EG^Y)hYrMH`dK%|A++62e^GqBjp&M1DLeZ_VO^R7NJWeqy zksIVidTWdt=_p1O87FeIRF)CzBcBQF#>hYhnce>KM9Nn+#9gRqJWR5Esep5pSkzQM zRaR`n^hNW!$l7*bbQpncXRTk0v|(82u_>XPGITv9npG>U>ju$j3qKMmqF*pPPM~Ry z-eEYJrWraHH|x!GLrE zRIqsk=kOI)Sa1Gy9gjviA#`22q5OyH2dGL0q96pmjELSZzm;g}_1e&goI7Evpz2_l z!JCOYs;)$!t9KGcAnedEO~YDSGYO2)7J;E`BtBIwO%oaynr3Q$Nyr=-zOVvu>lW3B zNSlUX>e3gL>f-C{4x4~B_zwISUMG*DNC#1Ew929;Gf^QY2=$PMae^W}q6f%r9%iDd zZ<+1GYB*TkhYcd)%8I(^c`!5TES^-ge{g`_!67-pEs?0O|K*2r&22MHAxyK)m6T;k z>Tim|Si)PK7x`qeGo9{CCi7x`)k`p@uvFeM#mNJsFX#2Nuyd}Pvqf6ZzdU;2q%f^~ zviW`G(D}aJI@fvNW=6WYp6x~KeYUG>B;!$Dc)hpp{Gsa)27BNDUh-_Glunl&+as!+ zPM3)Km%gV^c&fWR&Qt{zdQ~=F?tZFJ*rWTq+p>+~rB^#E4x&@(eDzYXk!{=U-}~GN z!((H~lIP`}z%>jvaPpp4N{$^1LkA0w8b;RTPI!j$_cYMiKG zMv|T_$!baZ{Wy0rk7Zujg*{Y+@$!t6w@Koh4r4tYi`{W{xNf`W<%CFTZa(1^lTI;} z>Iohj%kAhuS_Z=}R0qFZ(M^@9ju6GPoe{#fGC{Dn#2wBZoeEVoRkM<5+gr>w3LT?m zE;zl#v99iCc3%8w?8$M;njKoo=iF3Pj%Mh(g#>Lp++=P@1zpJH4nC&Y8n-wr`y?@y%yze5N?Oi&cUo<4kd{RBB=WgL5lC*xa% z9Q%My&yW}{*MW!WDjNzj;ZVF^>Fn)4{ia@Dee?NuW+$$!)@rZ)Rz;=?L;3T!CPqga z=gapBIDcV(XXiMoTrh@ov_%IFz!$X(N1peF{|!Qws}XLmy!+)=OgrX0@$%G*f$Zej zDHpB;wt2s&h?O7bD~bqdMw$w>8a1SLj@nf^!H*K&*=p6u#-ek!16JU7*hYKletbol zW5w6yrp9dP^o yZ<_&(MK{0|DAEmahVFv$UN}jCoq=hRorIU@dnme5exr4x?3J;L?pTs|H2fD6|7olM diff --git a/fmpp/docs/style/fonts/icomoon.svg b/fmpp/docs/style/fonts/icomoon.svg deleted file mode 100644 index b8aa80b..0000000 --- a/fmpp/docs/style/fonts/icomoon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fmpp/docs/style/fonts/icomoon.ttf b/fmpp/docs/style/fonts/icomoon.ttf deleted file mode 100644 index bd33c028b170ba0bedeb4d61e3ebc1469ef1c53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2612 zcmaJ@Yit}>6+UO~%$>)b$Ii}Uy&JFhEM3EwXw33VbBS>u(A*B33AP~qxLIU~&euQStxicHG zkqT$$&Uwte=Y02^GjkUZ00e9SgW;2>heqA+vIbe+rg3(Db?zc8z4Z+M>?VD7X>Q{p z@eJvgh#N~6UOKP*{o1!l-vZ!U%Zqahse`t_@<2BN|SLZHWge=@7{imdt*XC9iKcD~6-$;LtVmxzkePfew5?P^q z4on4n4Kx7dhC(yoJ1NJ%LLE&xuY-_aKS{>`b_LtsqaWJ_(m>|o5tS1`p}UM2(p^3c zL4_IOE^Sc(PPXzc?&`Z@@8RAa*$LGy?5ewFqT}A53Ti zYCiq6KKA>Y3%Bp6TshGC;DEx_JGU2Zny#iY*3E3wj4bvkD>6-+RHmw)`I|R?`6gQQ z%dK5yY-5A5t81EXS+Vs!E6a5vo+UB1EMLPD$XgE{Jdj&PLO8I3Z>4wib=hvO9U?%w;ga8!n8gv%7oz<2NsgQ&G& zxLo6{9n;e|$BEVs=bC5Y1R33=D-}XgXM2>hZg`qtRR{*52s(4r43ZqxWS$6Ur7ANv zM3{*k#AJa?GQ0QD*=(q4hzC&9cg^cazC=dB-$ zz%VTI*t}5A8@iqqt-2NHx@{5MYi8Rg8dkja@G(+csb(K=J0oNuOcFrqmTD%iS?%lIlQ?X>>9gQt?35WA(^ zR{ll(1JorWNfM$^W<(#B_gb>`#@P6z+&gjVp!#T>!#kP#s;(rYtM@ZTB<$EQO~cyW zHi?Yb7LlRsX8x#JnkFJp1eeep?lpUpxSdan=tQnzxRF!zyox`4I*uJI zeOwsXm;2#4s^6!9&IWp~WeX*lZKiTZrKmI!DIaoE zRXLim>y|R~;o&B8V`}J9p>X^u&DOZZS*ft^_#vyywhK;vC<-apj4_kG8MVoLzNRBX zNyXu8HVS)$5Trz9A?$^dCwI;gAS>tC`#hQ7IuzKi==6+9;qpE3FsQTfI2Vtn-z%NH z_1m8{8e2bk;q9f_>sw=EZ~R=$!3=P51?N(YN#{zN##+kR3}RIPimZ$VW&z!?+;7ev**R z=tsL#NIu@SGm?ATvP$yj+OkG@b=xur9Y))-Md#MMJik?wEYfExr#@3T^_j}4&s0u* zrZT6shudpYpDW~d9ad?q!y24{MfeJAz)GT(VFU(Yn6!>LEA#8C>+5Sz8sQWzT!OE{ y1(+iTPb`4x#Mvg4X~rT2ks;x)aIB;6&F z`y}e`u=kf%HeMjz4@s7>H3ooH&#%o%yWf!9Ba#2Wcx7ew1@deBi{x^QX}G>RyRraa z=E(OG50!&n-j`8L)X)yUAF>VH;4}`d{3l_f8Ovofu=cn zuir3dF2Du0$V$|G(BG{1l_ugYF14?=zjk38d$!v*$>ti_d_A$jkZeL! zuzeMm@DeL+xBs+_C*qnAxuM)t{z?4<)Fq>F62gqkh(036TD3MVTI!MZR!yb zn1*5MG8UEk;uGvHI}JJb0(=9$M-j!D4&&bFv_(T!qDDaw8Kel40>yU3k5bq?%En#a znRW>4(OCTuwunhOD_&yo;m&BWWK;E#u~B-)#^naPGErmyEe_?nn=?%zOf%<7&ax!; zXGLKwVdEeu3NB0pch}7I&xN+R?%;N zMLBkHc&N#B9=h4d{{Cl%5Qm=W@1M+iR2SYH8oqe!#zSWh1Hdbu?NoxG>ewD})gY)4 z_jmn3sr2MPb%v=5D)gvqraJIssdPZk?9b&}mYaxXkh^?M5F+^6qawosheR>F5xib@kweq+sG zSFt*pkxWuMS;s1`?ZZK8!sPRejUUk@HJ!j_;)~sN_PB13=M{wTHMf}Z%Dz)hrw7Bw zrVD#|kv@Zo=j&siuj!`BR7Z$%U}uHMSlKWAjcVn|@-3s%A%)@&Pwhm7^KCZYf0v4>y?`QA3vsg`m@+*7&(nB6~YD~5?&y@MmP8gqI)}7kLOr)-}b@={1kI^mLA4S$~?=k zBe4euzTa{AAd+r3F38hQ0@5A*V0Q}fM>~2(d|!uGiT_N8*C?-Uhv%TfSckXhW}TDw zw`!6`u9@)3nhBq*nefS)37@Q)@SNrz?95HpT&8u`V1;lER^b#Zz?WbhmSd?5qc8*` zBz4&=&#kSjt*t()gcCGz5xxxPVU`wnWCBdbi)}!eEEdR#bTLbbU4VJgorM=^JQln7 QR40rfnLGK9=YPO|0JV=@^Z)<= diff --git a/fmpp/docs/style/header-footer-background.png b/fmpp/docs/style/header-footer-background.png deleted file mode 100644 index 0f65d7a472841dc1e2b50fb14ed0750eb6118a3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3827 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 b0X@*KZ^VlT3oSo .table-of-contents, -.content-right > .table-of-contents { - float: left; - margin: 0 0 0 15px; - padding: 0 0 0 15px; - border-left: 3px solid #7FBB7F; - list-style-type: none; - min-width: 30%; -} -.content-left > .table-of-contents ul, -.content-right > .table-of-contents ul { - border: 0; - list-style-type: disc; - float: none; -} -.content-left > .table-of-contents a, -.content-right > .table-of-contents a { - display: block; -} -.social-icons { - margin: 0 0 12px; - padding: 0; - list-style-type: none; - text-align: center; -} -@media print { - .social-icons { - display: none; - } -} -.social-icons li { - display: inline-block; -} -.social-icons li:last-child a { - padding-right: 0; -} -.social-icons li a { - display: block; - padding: 3px 6px; -} -.social-icons li a:before { - font-family: 'icomoon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - margin-right: 3px; - display: inline-block; - width: 15px; - height: 14px; - position: relative; - top: 1px; -} -.social-icons li a:hover { - text-decoration: none; - color: #333333; -} -ul.download-options { - list-style-type: none; - padding-left: 0; - margin-left: 0; -} -ul.download-options li { - padding-left: 2em; - margin-left: 0; -} -ul.download-options li:before { - font-family: 'icomoon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: inline-block; - position: relative; - top: 1px; - margin-right: 7px; - width: 14px; - height: 14px; -} -.site-width { - margin-left: auto; - margin-right: auto; - padding-left: 24px; - padding-right: 24px; -} -.ie89 .site-width { - width: 944px; -} -@media (min-width: 768px) { - .site-width { - width: 720px; - } -} -@media (min-width: 992px) { - .site-width { - width: 944px; - } -} -@media (min-width: 1200px) { - .site-width { - width: 1152px; - } -} -.warning { - color: #cc0000; -} -.clear:before, -.clear:after { - content: " "; - display: table; -} -.clear:after { - clear: both; -} -@font-face { - font-family: 'icomoon'; - src: url('fonts/icomoon.eot?-20325k'); - src: url('fonts/icomoon.eot?#iefix-20325k') format('embedded-opentype'), url('fonts/icomoon.woff?-20325k') format('woff'), url('fonts/icomoon.ttf?-20325k') format('truetype'), url('fonts/icomoon.svg?-20325k#icomoon') format('svg'); - font-weight: normal; - font-style: normal; -} -.icon { - font-family: 'icomoon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.icon-house:before, -.pagers .pager-icon.home:before { - content: "\e601"; -} -.icon-flag:before, -.pagers .pager-icon.report-bug:before, -.report-bugs .strong:before { - content: "\e60b"; -} -.icon-folder:before, -.pagers .pager-icon.contents:before { - content: "\e604"; -} -.icon-download:before, -ul.download-options li:before { - content: "\e600"; -} -.icon-arrow-left:before, -.pagers .pager-icon.previous:before { - content: "\e605"; -} -.icon-arrow-right:before, -.pagers .pager-icon.next:before { - content: "\e606"; -} -.icon-arrow-right2:before { - content: "\e607"; -} -.icon-github:before, -.social-icons li a.github:before { - content: "\e609"; -} -.icon-twitter:before, -.social-icons li a.twitter:before { - content: "\e60a"; -} diff --git a/fmpp/docs/style/main.min.css b/fmpp/docs/style/main.min.css deleted file mode 100644 index 352488f..0000000 --- a/fmpp/docs/style/main.min.css +++ /dev/null @@ -1 +0,0 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;color:#333;line-height:1.42857143;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;background-image:url(header-footer-background.png)}body{margin:0;font-size:14px}nav{display:block}a{color:#168316;text-decoration:none;-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.42857143;font-weight:700}h1{font-size:24px}.ie89 h1{font-size:30px}@media (min-width:768px){h1{font-size:30px}}h2{font-size:21px}.ie89 h2{font-size:24px}@media (min-width:768px){h2{font-size:24px}}h3{font-size:18px}.ie89 h3{font-size:21px}@media (min-width:768px){h3{font-size:21px}}h4{font-size:15px}.ie89 h4{font-size:18px}@media (min-width:768px){h4{font-size:18px}}h5{font-size:14px}.ie89 h5{font-size:16px}@media (min-width:768px){h5{font-size:16px}}h6{font-size:14px}hr{height:0;margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #ddd}code,pre,tt{font-size:13px;font-family:"Droid Sans Mono",Courier,Monaco,Consolas,monospace;-webkit-font-smoothing:antialiased}code,tt{background-color:#f9f9f9;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1px 3px;color:#6D180B;word-break:break-all}code a,tt a{color:#c00}pre{display:block;padding:9px;margin:0 0 9px;word-break:normal;word-wrap:break-word;white-space:pre;background-color:#f9f9f9;line-height:1.42857143;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}img{border:0;vertical-align:middle}table{border:0;border-collapse:collapse}td,th{padding:0}.site-header{border-bottom:1px solid #ddd}.site-header .logo{display:block}.site-header .home-site-header{text-align:center;padding-top:24px}.site-header .home-site-header .social-icons{background-color:rgba(255,255,255,.5);padding:3px 6px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:200px;margin:12px auto}.site-header .home-site-header .logo{margin-bottom:12px}.site-header .home-site-header .logo img{width:243px;height:70px;margin:0 auto}.site-header .inner-site-header{padding-top:12px;padding-bottom:12px}@media (min-width:768px){.site-header .inner-site-header{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-moz-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.ie89 .site-header .inner-site-header{display:block;height:92px}.ie89 .site-header .inner-site-header:after,.ie89 .site-header .inner-site-header:before{content:" ";display:table}.ie89 .site-header .inner-site-header:after{clear:both}.ie89 .site-header .inner-site-header .header-left{float:left;width:600px}.ie89 .site-header .inner-site-header .header-left .breadcrumbs{width:600px}.site-header .inner-site-header .header-right{text-align:center;margin-top:18px}.ie89 .site-header .inner-site-header .header-right{margin-top:0;float:right}.ie89 .site-header .inner-site-header .header-right:after,.ie89 .site-header .inner-site-header .header-right:before{content:" ";display:table}.ie89 .site-header .inner-site-header .header-right:after{clear:both}.ie89 .site-header .inner-site-header .header-right nav:after,.ie89 .site-header .inner-site-header .header-right nav:before{content:" ";display:table}.ie89 .site-header .inner-site-header .header-right nav:after{clear:both}.ie89 .site-header .inner-site-header .header-right .pagers{height:55px;width:250px;margin-top:10px}.site-header .inner-site-header .logo img{width:121px;height:35px}.page-wrapper{padding-top:12px;padding-bottom:24px;background-color:#FFF;min-height:300px}.content-right a{word-break:break-word}.site-footer{padding-top:24px;padding-bottom:24px;border-top:1px solid #ddd}@media (min-width:768px){.site-footer .footer-inner{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-moz-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start}}.ie89 .site-footer .footer-inner{display:block}.ie89 .site-footer .footer-inner:after,.ie89 .site-footer .footer-inner:before{content:" ";display:table}.ie89 .site-footer .footer-inner:after{clear:both}.ie89 .site-footer .footer-inner .footer-left{float:left}.ie89 .site-footer .footer-inner .footer-right{float:right}.site-footer .pagers{text-align:center;margin-bottom:12px}.site-footer .pagers li:last-child a{margin-left:12px}.site-footer .generated{text-align:center}.ie89 .site-footer .generated{text-align:right}@media (min-width:768px){.site-footer .generated{text-align:right}}.site-footer .external-links{margin-top:15px;text-align:center}.ie89 .site-footer .external-links{text-align:right}@media (min-width:768px){.site-footer .external-links{text-align:right}}.site-footer .external-links a{display:inline-block;margin-left:9px}.breadcrumbs{list-style-type:none;margin:12px 0 0;padding:0;font-size:12px}.ie89 .breadcrumbs{font-size:14px}@media (min-width:768px){.breadcrumbs{font-size:14px}}.breadcrumbs li{display:inline-block;vertical-align:middle}.breadcrumbs li:last-child a{color:#333}.breadcrumbs .icon{display:inline-block;margin:0 3px;position:relative;top:1px;width:12px;height:12px}.ie89 .breadcrumbs .icon{width:14px;height:14px}@media (min-width:768px){.breadcrumbs .icon{width:14px;height:14px}}.pagers{list-style-type:none;margin:0;background-color:rgba(255,255,255,.5);padding:9px 18px 6px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.ie89 .pagers{background-color:#f9f9f9}.pagers li{display:inline-block;color:#999;padding:0 6px;font-size:12px}.pagers li a{display:block}.pagers li a:focus,.pagers li a:hover{text-decoration:none;color:#333}.pagers .pager-icon:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:block;font-size:18px;text-align:center;margin-bottom:1px}.pagers .pager-icon.previous:before{text-align:left}.pagers .pager-icon.next{margin-right:12px}.pagers .pager-icon.next:before{text-align:right}.report-bugs .strong{color:#c00;font-size:16px;padding-left:19px}.report-bugs .strong:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:relative;top:1px;display:inline-block;width:16px;height:16px;margin-right:3px;margin-left:-19px}.toc-header{font-size:18px;margin:0 0 1em}.toc-header.alphabetical-index{margin-top:1em}.content-left:after,.content-left:before,.content-right:after,.content-right:before{content:" ";display:table}.content-left:after,.content-right:after{clear:both}.content-left>.table-of-contents,.content-right>.table-of-contents{float:left;margin:0 0 0 15px;padding:0 0 0 15px;border-left:3px solid #7FBB7F;list-style-type:none;min-width:30%}.content-left>.table-of-contents ul,.content-right>.table-of-contents ul{border:0;list-style-type:disc;float:none}.content-left>.table-of-contents a,.content-right>.table-of-contents a{display:block}.social-icons{margin:0 0 12px;padding:0;list-style-type:none;text-align:center}@media print{.social-icons{display:none}}.social-icons li{display:inline-block}.social-icons li:last-child a{padding-right:0}.social-icons li a{display:block;padding:3px 6px}.social-icons li a:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-right:3px;display:inline-block;width:15px;height:14px;position:relative;top:1px}.social-icons li a:hover{text-decoration:none;color:#333}ul.download-options{list-style-type:none;padding-left:0;margin-left:0}ul.download-options li{padding-left:2em;margin-left:0}ul.download-options li:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;position:relative;top:1px;margin-right:7px;width:14px;height:14px}.site-width{margin-left:auto;margin-right:auto;padding-left:24px;padding-right:24px}.ie89 .site-width{width:944px}@media (min-width:768px){.site-width{width:720px}}@media (min-width:992px){.site-width{width:944px}}@media (min-width:1200px){.site-width{width:1152px}}.warning{color:#c00}.clear:after,.clear:before{content:" ";display:table}.clear:after{clear:both}@font-face{font-family:icomoon;src:url(fonts/icomoon.eot?-20325k);src:url(fonts/icomoon.eot?#iefix-20325k) format('embedded-opentype'),url(fonts/icomoon.woff?-20325k) format('woff'),url(fonts/icomoon.ttf?-20325k) format('truetype'),url(fonts/icomoon.svg?-20325k#icomoon) format('svg');font-weight:400;font-style:normal}.icon{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-house:before,.pagers .pager-icon.home:before{content:"\e601"}.icon-flag:before,.pagers .pager-icon.report-bug:before,.report-bugs .strong:before{content:"\e60b"}.icon-folder:before,.pagers .pager-icon.contents:before{content:"\e604"}.icon-download:before,ul.download-options li:before{content:"\e600"}.icon-arrow-left:before,.pagers .pager-icon.previous:before{content:"\e605"}.icon-arrow-right:before,.pagers .pager-icon.next:before{content:"\e606"}.icon-arrow-right2:before{content:"\e607"}.icon-github:before,.social-icons li a.github:before{content:"\e609"}.icon-twitter:before,.social-icons li a.twitter:before{content:"\e60a"} \ No newline at end of file diff --git a/fmpp/docs/style/none.gif b/fmpp/docs/style/none.gif deleted file mode 100644 index f191b280ce91e6cb8c387735c10ef9bc5da6c83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 ocmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl(S^Yp0J!f4_W%F@ diff --git a/fmpp/docs/style/poweredby_sq_simple.png b/fmpp/docs/style/poweredby_sq_simple.png deleted file mode 100644 index c9422699de2220e84b55bd23a4cb4246cd10ebf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 zcmVWdKupZy+)@Aa84QE+8^6Fft%9G&(RjIx{gKD=;xIFg2+l%m4rY2XskI zMF-Lf8Vm{?0mAiv00009a7bBm000W`000W`0Ya=am;e9(1ZP1_K>z@;j|==^1pojB zNJ&INRCwC8R#}V`MHsHLr>Ey0c43!8js@h}RS;QGyihp;LBt>iBtjH58Xq)XFJ3V| zh!Qk-Bw|2L34$aNLc#)yge!<#t}CaDv#blV$868+?(|G`l~vO-J%hrVR?k#-RabrW z^?!U-0Q^q{0+GAhOkQr`>QX~RJ zGDfAi?qK0`xbsR^b60UWl#uxsu$piU)$8zamv(Bt(qddaT>U;{UxS@{B&E}Yu;myz zhi7>1mbV~hTu5hd^-k6ts__gYbzMG*tHBi2k$eG4(J^=@2kSWFOzr1z2!uaB{aLyS zi^Y>SB-o1E#BXn{X&iyjo^9L5LwIi4)}|_mTGoDBSxGbn{QJ4OOeKQfl(p_0>R3SH zA1>NhQQZ3O2Vcfg+4mN`zv-_e8+iDK(;KFl*7B?1*yS#EIkL#i@UPmy>6UJL{iw$S zS!ZgzdiJqI+U^@Wa9bC1Ig?UL*m~cFNFw6-Gul+q8PbQZT)1&GW}@qP6G{`srgBO| z_reskIByAD2@i&QZgZ;u#*O3mZ~^B?odmeR^0Vc5vvGUO`w`taXqXgs|lEZBT3>*AhJQ z-6Lj?+3G>jvJkej(j-i3gp9Z|KG0eD%J-vqQC$l_M|J)HmP%6SI%(ihEx* zKfR-2F4x-DOt0E|%9z=|WA)hcPuz22fAvToLay^9?70=YW`0C4MwjfDfwAdQCiK$g zhBq&6e4*~lYkzE65L^jx&I6CXeJRrXJ_9%1^#Bbg8prpu_dJ%qX+!&-IadG8o%EN*7#y|xBp^LF z!`mFm#D|sfB&?ep6elNT%JwDWgQGyx1-Yf_;HHH>&1G!Yt$t(j^gw{H#y-Aq*mHS+ zHUv+n_lXcI9h(W53%oa2YVme8MNqf2G?-uX`#7)_5? z4L;ORJ9s3d5GHzSI%zrDJZcJuGSeN#Dxi$MzRIb`mM!zgW_k>bHAi&)nJ-TDzH8#V zP4(rq6HYA9jG=vfVVQOJ?I^bm)aIw8{npS!+tI{>jp30uCuAGc)r{kaXf$VIwc{wE zU{-h1>>~c|xTjoatylGk-QJp}K~Go0qJEUt{2;|Wpd*D@PZs&HrTNn)qLzg~CQH0P zwuzNuM2Zzs!TSj*=o~SKw}%l*kq1IQ!jwm78hMDWTTp{u*$!~bLOQb3HlmPWEF}c9 z3;--Ejp0R9LI5OTMLv!TXAVGgYztco6h}JY0vS}w7NC@=umNf}6be z(A-`r+cKk-ZC$w_pm=^!vITK&D@UqQqQ;f9(*h0x7Qh1|1-#2F|e^Q z@T(J}>DjaAoSYnjf`VjN2oOL677%C7p4+r#%lGd;kOec+Qk2BSe^01pQ{!gv$YbCY zhx+ir^_AjxC<6myZdN8RbUuIn0`z=lS}M>Ah-oUyN0$?y98v=A2Fqr@q z0}}#T^aBJCqOe@BcnQ!Zp!*)k{^L6&K?;I^01!d6 z0HuHl8|dfhv*rLj42&gUzyYOz+JR1d|Na9oCEvYw52yx+TwR>bRy7`SFc@13wWU65O2fC`|unK4i`nB-sjJs6D(Ocz@Z6A z5x`7`sQ_p`&~OM_2V4`U6>H-EHS_UQvfT0e|mcW33 z6ST00SDBm|5gSex19HGoXL`0A?{@2)cp;ard6R@Z<>;hZ_ZS z2~g_D(WBa0TJV$$6bEZ`!eux>05KtF4WLqBF$0NtAVMzNu3Wta30hnR0m}%WPk{EV zT(btK3@!NKJ_lL>MB$+!SPkJ$u>Q6CATBGeg53a0U)I);cmkHkkPHaVWe}HuGK-`X zW?TZD2g!z*03d)60Rd3~%xpjiG#$v;y%(Y9$kAiKD?n$UIT#KA0+3zCC;-AR6ve>{IVxUH5O3fy+*}nsi(9K8E`mOM zAc9+IlBR8v|C5BF%UPqU8-YOjv`fJZ`sBg*v#L1@EcCw-QP_x3Km^6ScOooqlD#Ad zw&OIDWrhnE^0Z%|f{=9W``K10?EYz}j&V59ny?fo-wYX#f0%+(3#M38FfC$0{_MLDk14@1R^a+^@Ob&RA1qdLP zAru5o_70FB$jJkB6BaF40P$*kVq#TIHAD?iq`jr}YZ-Pn_`g@d1jgU9$!#`|;yP zAU7s53ZfXo1u6!r1ag7mK$So(n8pId0Rm`b;RoimXT!G2@pVoF(CfG zdByPQ2gCEr40ks$ynX%e3)7z`-+vsqK~SS6cz9+HxV#`000hur42XZsd_QlnF`T)~ zaBTm-%dfuP;{W}GnMFYaoaaB|(FiFx*RNd*EHdGOz~ZB=r4?S9z{?AGV*~;K0%*Vn zZ}CNrpuoq)SAX67@#_)Wm#e(r&#k;q@aegTzj+q(7V&!3Ep48R6OQ9)ruRHTx!GEf9qxm>((5y;rEZr!Pq zr(9fJAvR8#GzlPp25G13*M&zPN|ygTa^wFm1`c}-k@dMu0$j+|0T2M=57=aW`s68G zBq%rt7&^d!Sig4N6L5sf$jId6iC#!P@(zF8~GvKmd(S q`9T3d0I@*AV>BQD0t^5EplX~|`sPId0000 - - - - - - -TDD - Textual Data Definition - FMPP - - - - - - - - - - - - - - - -
    -

    TDD - Textual Data Definition

    - -
    - -
    - - -

    Basics

    - -

    TDD is a very simple expression language created for defining hierarchical data (hashes, sequences) with plain text. It is mostly used for configuring FMPP. For example, configuration files use TDD syntax.

    - -

    TDD syntax is identical to the syntax of literals in FTL (FreeMarker Template Language). For example, this data structure:

    - -
    -(root)
    - |
    - +- user = "Big Joe"
    - |
    - +- tall = true
    - |
    - +- animals
    -     |
    -     +- (1st)
    -     |   |
    -     |   +- name = "white mouse"
    -     |   |
    -     |   +- price = 30
    -     |
    -     +- (2nd)
    -     |   |
    -     |   +- name = "black mouse"
    -     |   |
    -     |   +- price = 25
    -     |
    -     +- (3rd)
    -         |
    -         +- name = "green mouse"
    -         |
    -         +- price = 150
    -
    - -

    could be described with this TDD expression:

    - -
    {
    -    "user": "Big Joe",
    -    "tall": true,
    -    "animals": [
    -        {"name": "white mouse", "price": 30},
    -        {"name": "black mouse", "price": 25},
    -        {"name": "green mouse", "price": 150}
    -    ]
    -}
    -

    which is also a legal FTL expression. Please read the FreeMarker Manual about "Specify values directly" if you are not familiar with them. TDD doesn't support any other FTL operators (as variables, built-ins, interpolations, etc.), only the "Specify values directly" part of FTL.

    - -

    TDD syntax allows terser expressions than FTL because of these additional syntactical rules:

    -
      -
    • Strings need not be quoted if they doesn't look like a legal boolean or number value, and they don't contain: -
        -
      • white-space: space, tab, line-break, etc.
      • -
      • Quotation marks or apostrophe-quote: ", '
      • -
      • Separator-like chars: comma (,), semicolon (;). Colon (:) is allowed without quoting the string if the string is not a key in a hash.
      • -
      • Bracket-like chars: (, ), [, ], {, }, <, >
      • -
      • Equals sign (=)
      • -
      • Plus sign (+)
      • -
      -
    • -
    • Line-break can be used instead of comma (,). That is, in practice, you can omit commas that would be at the end of the lines.
    • -
    • If in a hash the value is missing from a key:value pair, then the value defaults to boolean true. -
    - -

    Utilizing these rules, the example TDD expression can be written as:

    - -
    {
    -    user: "Big Joe"
    -    tall
    -    animals: [
    -        {name: "white mouse", price: 30}
    -        {name: "black mouse", price: 25}
    -        {name: "green mouse", price: 150}
    -    ]
    -}
    -

    Back to the strings... Examples of legal unquoted strings:

    -
      -
    • **/foo-bar/baz.txt
    • -
    • C:\windows\system32
    • -
    • 25%
    • -
    • #FF80FF
    • -
    • ?!
    • -
    • 7.txt
    • -
    • 1-2
    • -
    • True
    • -
    -

    Examples of strings where quotation had to be used:

    -
      -
    • "contains space"
    • -
    • "a'b"
    • -
    • "(c)"
    • -
    • "<head>"
    • -
    • "7"
    • -
    • "true"
    • -
    - -

    TDD supports an escape sequence that FTL doesn't: backslash at the end of the line. It is used to break strings into multiple lines in the TDD, without actually introducing line-breaks and indentation in the value of the string. For example here:

    - -
    {
    -    text: 'This is \
    -           a single \
    -           line.'
    -}
    -

    the value of text will be the same as with: - -

    {
    -    text: 'This is a single line.'
    -}
    -

    The exact rule is that if backslash is followed by a line-break (extra horizontal white-space is allowed between the backslash and the line-break), then all characters after the backslash will be removed until the first non-white-space character is reached, or a 2nd line-break is reached.

    - - - - -

    Interpretation modes

    - -

    A text can be interpreted as TDD either in:

    -
      -
    • Single expression mode: this is the basic case.
    • -
    • Hash mode: The text is assumed to describe the name:value pair list of a hash.
    • -
    • Sequence mode: The text is assumed to describe the value list of a sequence.
    • -
    - -

    An example of hash mode are configuration files. There you enter the settings as if you were already between { and }:

    - -
    sourceRoot: src
    -outputRoot: out
    -

    and this will evaluate to a hash. In single expression mode, you could describe the same value with this:

    - -
    {
    -    sourceRoot: src
    -    outputRoot: out
    -}
    -

    An example of sequence mode is when you specify the removeExtensions setting with command-line argument to the command-line tool or as Ant task parameter. For example, when you enter this in the command-line:

    - -
    fmpp -S src -O out --removeExtensions "foo, bar, baaz"
    -

    Don't be confused on the quotation marks here, those are required by the command-line parser of the OS shell, it has nothing to do with TDD. What FMPP gets don't contain the quotation marks, only the text between them. So the TDD expression we are talking about is:

    - -
    foo, bar, baaz
    -

    The same value could be described in single expression mode as:

    - -
    [foo, bar, baaz]
    -

    When to use single expression mode, and when hash mode, and when sequence mode? Hash mode or sequence mode is used when you specify the value of something as discrete text (that is, not as the part of a larger, enclosing TDD expression), and it is known that the value must be hash or sequence respectively. For example, in the --removeExtensions example above, the TDD expression is given in an independent text fragment, and it is known that the removeExtensions setting is a sequence. Compare it with the case, when you specify the same setting value in a configuration file:

    - -
    removeExtensions: [foo, bar, baaz]
    -

    Here, the value is not a discrete text, because it is a fragment of a larger TDD expression (which is, by the way, a hash mode expression). Thus, the value must be specified in single expression mode, regardless that we know that it should be a sequence. Because, if you were allowed to write:

    - -
    removeExtensions: foo, bar, baaz
    -

    then there would be an ambiguity, as it could be also interpreted as:

    - -
    removeExtensions: foo
    -bar: true
    -baaz: true
    -

    (Since, if the value is missing from a key:value pair, then the value defaults to boolean true, and comma can be replaced with line-break) So be sure you don't forget the brackets in configuration files.

    - - - - -

    Hash addition

    - -

    TDD allows you to put hash value directly into another hash value, without specifying key for it. For example:

    - -
    {a: A, b: B,  {c: C, d: D}}
    -

    In this case, when the TDD interpretation passes the {c: C, d: D}, it will add all key:value pairs of it to the enclosing hash. So the final result hash will contain these key:value pairs: a: A, b: B, c: C, d: D.

    - -

    When the hash is added to its parent, it may overwrite keys in that. For example:

    - -
    {a: A1, b: B1, c:C1, {b: B2, c: C2}, {c: C3}}
    -

    will result in a hash that contains these key:value pairs: a:A1, b:B2, c:C3.

    - -

    You may wonder what is this all good for. Hash additions are useful with data loaders that return hashes. Read on...

    - - - - -

    TDD functions

    - -

    TDD has a construct called TDD function that is identical to FTL method calls. The meaning of TDD functions depends on which setting do you use them in. For example, when you use TDD with the data setting, then they are used to invoke data loaders, and their return value is the loaded data. A part form the configuration used in the Quick Tour:

    - -
    data: {
    -    tdd(data/style.tdd)
    -    birds: csv(data/birds.csv)
    -}
    -

    The first function call (tdd(...)) returns the a hash that was built by interpreting the data/style.tdd file. There is no key given for it (like someKey: tdd(...)), so its key:value pairs will be added directly to the data hash (hash addition). The second call (csv(...)) returns a sequence, which will be stored with key birds in the data hash.

    - -

    Another example of the usage TDD functions is when method calls are used with the modes setting. A fragment from a possible configuration file:

    - -
    modes: [copy(**/*.html, **/*.htm), ignore(tmp/)]
    -

    In this use case, you are not interested what kind of values do the function calls return. You just use the function calls for describing groups. It's the internal business of the FMPP core what the function calls return to solve this task.

    - -

    There is no restriction regarding the type of the value a TDD function returns. You may thought that TDD knows only these types: string, number, boolean, hash, sequence. These are the types for which you can specify values directly, but a sequence or a hash can store any type of Java objects as values, not only these. So any type of object can get into hashes or sequences as the return value of TDD function.

    - - - - -

    Comments

    - -

    TDD knows 2 types of comments:

    -
      -
    • FTL comment: These are delimited with <#-- and -->, and can span multiple lines. They can be inserted everywhere where optional white-space could be inserted. FTL comments can't be nested into another FTL comment.
    • - -
    • Shell-script/"properties" style comment: These are lines starting with #, optionally preceded with white-space. The comment spreads until the end of the line. This comment can be inserted everywhere where optional line-break could be inserted.
    • -
    - -

    Comments will not work inside quoted strings, nor nested inside comments. That is, they will count as normal text in these places.

    - -

    Example:

    - -
    # This is a test.
    -# Now "a" will be 1
    -a: 1 <#-- now "a" is 1 -->
    -b <#-- this was the key --> : <#-- now comes the value --> 2
    -  # Comments can be indented.
    -<#--
    -  FTL-style comment
    -  can span over multiple lines.
    --->
    - - -

    Character encoding issues

    - -

    If you load TDD from a file, then FMPP have to use an encoding (charset) to interpret the bytes as text. The default of this encoding depends on how do you load the TDD file:

    -
      -
    • If it is a configuration file: ISO-8859-1 is used.
    • -
    • If it is loaded with tdd data loader as tdd(fileName): sourceEncoding is used.
    • -
    • If it is loaded with data loader tdd as tdd(fileName, encoding): the encoding suggested by the 2nd parameter is used.
    • -
    - -

    A TDD file can specify its own encoding with a special comment, in which case the default of the encoding (see above) is ignored. For example this TDD file will be always interpreted with UTF-8 encoding, doesn't mater how you load it:

    - -
    # encoding: UTF-8
    -some: tdd
    -comes: here
    -

    The encoding comment must be the very first line of the TDD file. FTL-style comment can't be used for this purpose. Extra white-space, or no white-space is OK between the # and encoding, also extra white-space can be present around the colon. Word charset can be used instead of encoding. The words are not case sensitive.

    - -

    The encoding comment works only if the file can be correctly interpreted as US-ASCII until the end of the encoding name. So it will not work for UTF-16, UCS-2, UCS-4, and with EBCDIC based charsets. Note that an UTF-8 BOM at the begining of the file is automatically ignored.

    - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/tips.html b/fmpp/docs/tips.html deleted file mode 100644 index c96a8ee..0000000 --- a/fmpp/docs/tips.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -Tips and Best Practices - FMPP - - - - - - - - - - - - - - - -
    -

    Tips and Best Practices

    - -
    - -
    - - -

    Finding out the reasons of errors

    - -

    Use a log file (see: logFile) as that will contain the full error stack trace. Also, if you are really lost, you may use temporary pp.warning-s as a poor man's debugger: you can see if a certain line in the template is reached, also you can print the current values of variables.

    - - - - -

    Speeding up processing when you have many files

    - -

    Some tricks:

    -
      -
    • Try to use skipUnchanged setting. For most applications you can safely use it with the static value, and it speeds up things a lot if you have many images or other static files. - -
    • Try to set the quiet setting to true or reallyQuiet, or set echoFormat to terse for the command-line tool. Surprising enough, some terminals scrolls screen slowly, so FMPP has to wait until it can print the next line to the screen. - -
    • Process only the files/directories that actually need reprocessing. You don't have to process the whole source root directory; you can select the set of files and directories that you want to process inside the source root, with the sources setting. -
    - - - -

    Avoid too much programming logic in templates

    -

    FTL (FreeMarker Template Language) is not a general purpose programming language, just a template language. Implementing complex programming logic in it is cumbersome, and defeats the original purpose of templates: to be simple, almost the same as the output. To avoid this, pair BeanShell scripts with the problematic templates, and do the complex calculations in the script file, and then pass the results to the template for displaying. BeanShell is good in calculating data (and in whatever complex algorithms), FTL is good in displaying data. So you use the adequate languages for the subtasks. This can be implemented with the localData setting and its bsh function.

    - - -

    Showing information about something that will be generated further down

    - -

    For example, you have to show a Table of Contents at the top of the page, but the list of headings is not known until the page generation reaches the bottom of the page. In this case, generate the section that contains the headings first, but capture the output in a variable with an assignment directive (as <#assign var>...</#assign>). Then print the top of the page, and then the captured output. Check <FMPP>/docs/examples/capture to see a working example.

    - - - - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/versions.html b/fmpp/docs/versions.html deleted file mode 100644 index 70bdf76..0000000 --- a/fmpp/docs/versions.html +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - -Version History - FMPP - - - - - - - - - - - - - - - -
    -

    Version History

    - -
    -
    -

    Page contents

    - -
    -
    -
    - - -

    0.9.15

    -

    Date of release: 2014-11-05

    -

    Bug fixes:

    -
      -
    • Fixed an oversight where an Engine static field was accidentally initialized in a non-static initializer, causing problems in multi-threaded environment.
    • -
    • Removed version ranges from Maven dependencies, replacing them with concrete version numbers.
    • -
    • Log files now don't contain the stack trace twice when the processing session is aborted by a file processing error.
    • -
    • Setting values with integer type haven't understood + prefix, like in +1.
    • -
    - -

    New features, improvements:

    -
      -
    • Added JSON data loader. -
    • - Exposed relevant FreeMarker settings added since 2.3.15: - -
    • -
    • The command line tool doesn't "snip" (--8<--) error messages any more, instead, by default, it prints a cause message chain instead of a stack trace on error. This is especially useful as newer FreeMarker versions tend to give more detailed error messages that shouldn't be cut off. Stack traces can be asked with the new printStackTrace setting. The snip setting is now deprecated, and is only an inverted alias to printStackTrace.
    • -
    • Improved console error output quality in general.
    • -
    • The command line tool now detects the actual number of console (terminal) columns and wraps lines accordingly. Earlier it has used 80 columns. This only works if you invoke FMPP with the provided shell script (bin/fmpp or bin/fmpp.bat). Also, it won't work if you have explicitly set the columns setting (like in ~/.fmpprc) as then that will take precedence.
    • -
    • Better java location detection in the UN*X shell script (bin/fmpp) -
    • FMPP license has been changed from BSD to Apache License 2.0. The copyright owner has been changed to be the same as the owners of FreeMarker. The two projects now share the same license and Contributor License Agreement.
    • -
    • - The dependencies of FMPP has been updated/changed: -
        -
      • Attention! The minimum required Java version has been increased from 1.2 to 1.4.
      • -
      • Attention! The minimum required FreeMarker version has been increased from 2.3.15 to 2.3.21.
      • -
      • Removed Oro dependency (lib/oro.jar) as regular expression support is included in Java 1.4.
      • -
      • Updated FreeMarker dependency from 2.3.15 to 2.3.21 (lib/freemarker.jar and FreeMarker Manual).
      • -
      • Updated ImageInfo to version 1.9. It isn't included in fmpp.jar any more, instead it's a regular dependency (lib/imageinfo.jar).
      • -
      • Updated xml-resolver.jar dependency from 1.1 to version 1.2 (note that thus its license changes from Apache License 1.1 to Apache License 2.0)
      • -
      -
    • -
    • Added new constructor, Engine(BeansWrapper beansWrapper, Version fmIncompImprovements), deprecated the earlier Version-less overload.
    • -
    • Removed long deprecated method: Settings.execute(Engine eng). -
    • The project source code was moved from SourceForge.net to GitHub: https://github.com/freemarker/fmpp.
    • -
    • Overall source code structure and Ant build improvements.
    • -
    • Updated Web site and documentation design, also cleaned up the content a bit.
    • -
    - - - -

    0.9.14

    -

    Date of release: 2009-03-15

    - -

    Bug fixes:

    -
      -
    • Fixing bug that caused skipUnchanged to skip a file when the destination was newer than the source. Now it only skips files when the modification date of the source and destination files are exactly the same.
    • -
    • Fixing some TDD parser crashes occurring when parsing invalid TDD.
    • -
    • Preventing obviously useless traversing inside SVN and CVS directories.
    • -
    • Fixed some typos in the documentation.
    • -
    - -

    New features, improvements:

    -
      -
    • FMPP now can create empty directories using one of the two new features (reminder: FMPP creates output directories on-demand before an actual output file is created in them, hence usually it doesn't create empty directories): -
        -
      • If a directory file contains a file named createdir.fmpp then that will ensure that the containing directory will exist in the output as well. The createdir.fmpp file itself will not appear in the output, it's only a marker. -
      • New setting, alwaysCreateDirectories: If this is set to true, all processed directories will produce a corresponding output directory, even when that directory will be empty. -
      - -
    • The XML data loader now supports XInclude-s by setting its xincludeAware option to true. - -
    • To follow the Ant conventions, now sourceRoot can alternatively be specified with the srcdir attribute, and outputRoot with the destdir attribute of the Ant task. - -
    • API: New JavaBean propery in fmpp.Engine and fmpp.setting.Settings: dontTraverseDirectories. It should be set to true by front-ends that explicitly specify the list of all source files and source directories, rather than expecting the Engine to discover them. Till now such front-ends only specified the list of files, so this property wasn't needed. However, to support the new alwaysCreateDirectories setting, now the list of directories should be passed as well, and hence the need for this new property.
    • - -
    • Updated freemarker.jar and the included FreeMarker Manual to 2.3.15.
    • -
    - - -

    0.9.13

    -

    Date of release: 2007-12-16

    - -

    Bug fixes:

    -
      -
    • The skipUnchanged setting haven't had any effect since 0.9.10. Now it works again.
    • - -
    • When detecting the dimensions of certain image files, new lines were printed to the standard output (i.e., to the console).
    • - -
    • The slicedText data loader has ignored the encoding parameter.
    • - -
    • Warning! Incompatible change! The csv, text and slicedText data loaders didn't skipped the BOM (byte order mark) character at the beginning of the file. This was a problem as the Windows Notepad inserts a BOM there when it saves with UTF-8 encoding. This fix is not 100% backward compatible, as someone may indeed wanted to have that BOM.
    • - -
    • API: The fmpp.dataloaders.AbstractTextDataLoader ignored the encoding returned by the parseExtraArguments method.
    • - -
    • API: The fmpp.dataloaders.AbstractTextDataLoader didn't removed the BOM character from the beginning of files.
    • -
    - -

    New features, improvements:

    -
      -
    • The csv data loader has a few new options: normalizeHeaders, trimCells, and emptyValue. More details...
    • - -
    • Warning! Incompatible change! New setting: ignoreSvnFiles. This will ignore directories with name .svn inside the source root directory. This setting is by default on (true), so it's theoretically not backward compatible.
    • - -
    • API: DataLoaderUtil.getStringArrayArgument and getStringArrayOption now have an overload with allowString argument, so that a single item can be easily treated as an array of length 1.
    • - -
    • Updated freemarker.jar and the included FreeMarker Manual to 2.3.11.
    • - -
    • The project has switched from CVS to SVN. The CVS repository is not used anymore.
    • -
    - - - -

    0.9.12

    -

    Date of release: 2007-04-27

    - -

    Bug fixes:

    -
      -
    • Warning! Incompatible change! In TDD files value types were incorrectly forced to string if they were inside an explicitly defined hash (i.e. inside { and }). Like {x: 1, y: false} was interpreted as {x: "1", y: "false"}, that is, both values were strings. From now it is interpreted correctly, so with the above example x will be the number 1 and y will be the boolean false.
    • -
    - -

    New features, improvements:

    -
      -
    • New data loader: tddSequence for loading a TDD file as a TDD sequence (i.e. list) rather than as a TDD hash (i.e. map). More... -
    • Updated freemarker.jar to 2.3.10, and bhs.jar (BeanShell) to 2.0b4 in the distribution pack. -
    - - - -

    0.9.11

    -

    Date of release: 2006-03-15

    - -

    New features, improvements:

    -
      -
    • New setting: tagSyntax. This let you access this new setting of FreeMaker 2.3.5. - -
    • For nightly FMPP builds the build date is now logged in additional to the version number. - -
    • Updated freemarker.jar to 2.3.6, and bhs.jar (BeanShell) to 2.0b1.1 in the distribution pack. -
    - -

    Bug fixes:

    -
      -
    • The Ant task have processed all files of the source root directory if the number of selected file was 0.
    • - -
    • Warning! Incompatible change! When sources was set to any empty list in a configuration file, the whole source root directory was processed in certain cases. From now it will process no files in that case. If you want to process the whole source root directory, don't specify the sources setting at all. - -
    • Warning! Incompatible Java API change! The Settings class was badly assumed that the whole source root directory has to be processed if the sources setting was an empty list. This was incorrect, as in that case simply 0 files should be processed, and processing the whole source directory should occur only if the sources setting was not set at all (it's null when you get it). So, if you want the whole source root directory to be processed, don't set the sources setting at all. If it is already set, you can "unset" it with settings.remove(Settings.NAME_SOURCES).
    • - -
    • The Ant task didn't logged setting errors into the log file.
    • - -
    • The test suite now works with JDK 1.5, if you add xpathSupport.lib to the build.properties. - -
    - - - - -

    0.9.10

    -

    Date of release: 2005-10-23

    - -

    New features, improvements:

    -
      -
    • The pp.newWritableSequence and pp.newWritableHash methods now have an optional parameter, which is the sequence or hash whose items are added to the new writable sequence or hash. This makes pp.copyWritable deprecated, which was not able to create writable sequences/hashes based on non-writable ones.
    • - -
    • New setting: objectWrapper. This let FreeMarker "experts" to create and fully configure the freemarker.template.ObjectWrapper object that FMPP will use.
    • - -
    • Java API: a new fmpp.Engine constructor now let you specify the freemarker.template.ObjectWrapper to use.
    • - -
    • FreeMarker 2.3.4 is included in the distribution. Note the new feature of FreeMarket that let you use [#...], [@...], etc instead of <#...>, <@...>, etc if you start the template with [#ftl].
    • - -
    • <FMPP>/docs/examples/multipage_list was updated to use sequence?chunk(pageSize), instead of complex BeanShell script that was needed before FreeMarker 2.3.3.
    • - -
    • Manual improvements.
    • -
    - -

    Bug fixes:

    -
      -
    • On Windows, fmpp.bat has sometimes build the CLASSPATH badly that ruined the command line call to java.exe and caused it to die with a strange ClassNotFoundError.
    • - -
    • When a file is copied in "copy" processing mode, FMPP now sets the last modification time of the destination file to the last modification time of the source file.
    • - -
    • Warning! Incompatible Java API change! The FMPP engine has used and modified the shared - freemarker.template.ObjectWrapper.BEANS_WRAPPER object, which is dangerous. From now by default it uses its own ObjectWrapper instance. If you have utilized that it uses the shared ObjectWrapper.BEANS_WRAPPER object (not recommended!), then for 100% backward compatibility you have to use the objectWrapper setting with this value:
      - "ow = ObjectWrapper.BEANS_WRAPPER; ow.setSimpleMapWrapper(true); return ow;"
      - (or if you don't use FMPP settings, do this in Java where you create the engine object: ObjectWrapper ow = ObjectWrapper.BEANS_WRAPPER; ow.setSimpleMapWrapper(true); Engine eng = new Engine(ObjectWrapper.BEANS_WRAPPER);)
    • -
    - - - -

    0.9.9

    -

    Date of release: 2005-04-12

    - -

    New features, improvements:

    -
      -
    • The csv data loader was improved: -
        -
      • With the new headers option you can specify the header row for a CSV file that doesn't actually have a header row.
      • -
      • With the new replaceHeaders option you can override the header row of a CSV file.
      • -
      • The values returned for the rows are now not only hashes but also the sequences of the cells. -
      -
    • New data loader: slicedText for loading a text file as a sequence of strings. More... -
    • Java API: New class: fmpp.dataloaders.AbstractTextDataLoader, to ease the creation of custom text file data loaders for Java programmers.
    • -
    • Java API: New StringUtil methods: normalizeNewliens, split with trimming.
    • -
    • Warning! Incompatible change! The + operator in TDD files and configuration files is not allowed anymore. This operator was used for adding hashes prior 0.9.0. Since 0.9.0 the preferred (and now required) way of adding hashes is different. For example, assuming that your configuration file is in "properties" format (that is, the extension of the FMPP configuration file is cfg or properties), instead of this:
      - data={a:1, b:2} + properties(data/style.properties) + birds:csv(data/birds.csv)
      - your should write this:
      - data=a:1, b:2, tdd(data/style.tdd), birds:csv(data/birds.csv)
      - More information on hash addition...
    • -
    - -

    Bug fixes:

    -
      -
    • The csv data loader has incorrectly interpreted "\n\r" as a single line-break. -
    • Fixed some mistakes in the Manual and in the JavaDocs. -
    - - -

    0.9.8

    -

    Date of release: 2005-01-28

    - -

    New features, improvements:

    -
      -
    • FreeMarker 2.3.2mod (a stable nightly build after 2.3.2) is included. -
    • FMPP was updated to enable the new output encoding and URL escaping related features of FreeMarker 2.3.1. (The usage of 2.3.2mod is recommended because of a bug fix.) -
    • New setting: urlEscapingCharset -
    • Java API: added static final fields to Engine for reserved engine parameter (setting) value strings: PARAMETER_VALUE_SOURCE, PARAMETER_VALUE_HOST, PARAMETER_VALUE_OUTPUT. Also added the similar missing static fields to the Settings class. -
    - -

    Bug fixes:

    -
      -
    • The reserved "host" output encoding value was not resolved in some rare cases. -
    • The the pp.urlEnc/pp.urlPathEnc functions and the fmpp.util.StringUtil.urlEnc(...)/urlPathEnc(...) methods were malfunctioned with a few charsets, for example with UTF-16, UTF-7, and EBCDIC based charsets. -
    • Warning! Incompatible Java API change! The documentation of fmpp.ProgressListener.notifyProgressEvent(...) forgot to mention regarding the event parameter that: "As new event types can be introduced with new FMPP versions (even if it happens very seldom), a progress listener implementation should survive events that it does not understand. That is, it must not stop with an error, but it should silently ignore the event." Note that there is no new event type in this version.
    • -
    • Many fixes in the Manual and in the the API JavaDocs.
    • -
    • Warning! Incompatible Java API change! The fmpp.util.NullWriter and fmpp.util.NullOutputStream classes has no public constructor anymore. Use their static INSTANCE field to get the singleton.
    • -
    • Fixed test-suite bugs: Windows vs UN*X vs Mac line-breaks, class-path problem in the build.xml.
    • -
    - - -

    0.9.7

    -

    Date of release: 2004-03-01

    - -

    New features, improvements:

    -
      -
    • New setting: freemarkerLinks. This is a dirty hack to satisfy a frequent demand: <#include ...>/<#import ...> files that are outside the source root directory (as FTL macro libraries used by more projects).
    • -
    • Later nightly FreeMarker 2.3 build is included.
    • -
    - -

    Bug fixes:

    -
      -
    • Warning! Incompatible change! From now, native separators (as backslash under Windows) are not tolerated in the paths used in <#import ...> and <#include ...> directives. You must use / there.
    • -
    • Fixes in the Manual and in the the API JavaDocs.
    • -
    - - -

    0.9.6

    -

    Date of release: 2004-01-20

    - -

    New features, improvements:

    -
      -
    • New processing mode: renderXml. When a source file is processed in this mode, it's parsed as XML, and then the parsed XML document is rendered to output file(s) by a FreeMarker template, which is chosen based on the path or the document element of the XML document. -
        -
      • New setting: xmlRenderings. More info...
      • -
      • New pp variable: pp.doc. More info...
      • -
      • Java API: New class: fmpp.XmlRenderingConfiguration. New fmpp.Engine.PMODE_... constant: PMODE_RENDER_XML. New Engine methods to add/clean XML rendering configurations.
      • -
      -
    • - -
    • When template execution dies with error, and it didn't generated any output yet, nor it flushed the output explicitly or by changing output file, then no 0 length output file will be generated.
    • - -
    • New target in the build.xml, qinstall. It's the same as install, but assumes y for all questions.
    • - -
    • Added figures to the Quick Tour chapter.
    • - -
    • Java API: Added a new utility method to Engine: static String getProgressListenerEventName(int event)
    • -
    - - - -

    0.9.5

    -

    Date of release: 2004-01-14

    - -

    New features, improvements:

    -
      -
    • Java API: Improvements to the Settings class: -
        -
      • The API of this class is now as stable as other FMPP API-s, so it is not marked as experimental anymore.
      • -
      • The execute(Engine) method is now deprecated, and will be soon removed. Use execute() instead. If you use Settings, then don't create Engine objects manually anymore, just use the Settings object alone. See an example here...
      • -
      • Methods have been added to deal with progress listeners and engine attributes.
      • -
      -
    • - -
    • Java API: some convenience methods has been added: Settings.set(String, boolean), Settings.set(String, int), Settings.setDefault(String, boolean), Settings.setDefault(String, int), Engine.isXmlSupportAvailable(), TddHashLocalDataLoader(String)
    • - -
    • More API documentation.
    • - -
    • More reliable and helpful install Ant target.
    • - -
    • Terminology change: To prevent confusion, the settings of the fmpp.Engine object (known be people who use FMPP at Java API level) are now called "engine parameters", as the "settings" term is already used since version 0.9.0 for the high level settings seen by usual front-end users.
    • - -
    • Many grammatical mistakes have been fixed in the documentation. Other minor improvements in the Manual.
    • -
    - -

    Bug fixes:

    -
      -
    • A later nightly FreeMarker 2.3 build is included, that fixes various bugs with XML related keys @@markup, @@nested_markup, @@start_tag, and @@attributes_markup. This is mostly important for people who uses data of XHTML format for generating (X)HTML pages.
    • -
    - - - -

    0.9.4

    -

    Date of release: 2004-01-03

    - -

    New features, improvements:

    -
      -
    • New setting: localData -
        -
      • Till now, all source files (all templates) have started with the same data model, the one you have specified with the data setting. With the new localData setting you can add variables to, and override the variables of the common data model, for groups of source files selected by path patterns.
      • -
      • This feature also let you attach a BeanShell script to a template, that can done some complex calculations before template execution, and put the results into the data model for the individual template.
      • -
      • The templateData setting is now deprecated.
      • -
      • Java API changes: New interface fmpp.LocalDataBuilder, deprecates fmpp.TemplateDataModelBuilder.
      • -
      -
    • - -
    • The borders setting supports multiple layers. That is, multiple borders can be used at once for the same file. - -
    • In <@pp.renameOutputFile ... /> you can use the extension parameter instead of name, to change only the extension of the output file. - -
    • Java API: TemplateEnvironment has new methods, most importantly static TemplateEnvironment getCurrentInstance() for accessing the current template environment in FreeMarker transforms/methods.
    • - -
    • Java API: New methods to Engine: Object getData(name) (returns unwrapped original values), Object removeData(name), cleatData() (deprecates misnamed clearSharedVariables()).
    • - -
    • Java API: Engine attribute that implements ProgressListener get notifications about engine events.
    • - -
    • Java API: fmpp.tdd.FunctionCall has public constructor now.
    • - -
    • Warning! Incompatible Java API change! Engine.getData(...) doesn't throw TemplateModelException anymore, because data wrapping is now deferred until the session execution.
    • - -
    • Warning! Incompatible Java API change! Synchronization was removed from Engine. It did the same as if you synchronize on the Engine instance and call the methods anyway...
    • - -
    • Warning! Incompatible Java API change! ProgressListener.notifyProgressEvent(...) is now allowed to throw Exception. - -
    • More API documentation.
    • -
    - -

    Bug fixes:

    -
      -
    • <@pp.renameOutputFile ... /> has malfunctioned when the buffer was already flushed.
    • - -
    • Minor documentation fixes.
    • - -
    • 3rd party libraries BeanShell and ORO were upgraded. The upgrades fix a few bugs.
    • - -
    • Warning! Incompatible Java API change! Package fmpp.listeners were renamed to fmpp.progresslisteners. - -
    • Warning! Incompatible Java API change! Engine.removeAttribue was renamed to Engine.removeAttribute. -
    - - - -

    0.9.3

    -

    Date of release: 2003-12-22

    - -

    New features, improvements:

    -
      -
    • In FreeMarker 2.3: The quotations in FreeMarker error messages are now terser and thus easier to read.
    • - -
    • Various really missing XML related features added (Detailed information...): -
        -
      • New settings: xmlCatalogFiles, xmlCatalogPrefer. With these settings you can setup the OASIS catalogs that will be used for resolving entities in XML files. (See <FMPP>/docs/examples/xml_validating)
      • - -
      • New option to the xml data loader: validate. This specifies if the XML file will be checked for validity.
      • - -
      • New setting: validateXml. This specifies if by default XML files will be checked for validity.
      • - -
      • New setting: xpathEngine. With this setting you can set if you want to use Jaxen or Xalan for XPath-s.
      • -
      -
    • -
    - -

    Bug fixes:

    -
      -
    • In FreeMarker 2.3: A bug that caused template processing to fail with NullPointerException on low memory conditions is now fixed. A bug in Jaxen XPath support that caused NullPointerException-s has been fixed. Etc.
    • - -
    • Warning! Incompatible Java API change! Engine.process doesn't throw sly unchecked fmpp.IllegalConfigurationException-s anymore. Also, fmpp.IllegalConfigurationException is not public from now; it wasn't mentioned in other public API-s anyway.
    • - -
    • FMPP has died with internal error if somebody tried to use XML related features, and XML support was not available.
    • - -
    • Minor documentation fixes.
    • -
    - - -

    0.9.2

    -

    Date of release: 2003-11-12

    - -

    Bug fixes:

    -
      -
    • Warning! Incompatible change! Only Windows users (and the users of other operation systems where paths use something else instead of slash) are affected by this fix. Relative paths in <#include ...> and <#import ...> were badly interpreted relatively to the sourceRoot. Now they are correctly interpreted relatively to the directory of the template file. This bug fix is not backward compatible, if you have accidentally utilized the bad behavior. For example, you have included <sourceRoot>/includes/foo.ftl in a template file which is in not directly in the sourceRoot like this: <#include "includes/foo.ftl">. Now you should replace it with: <#include "/includes/foo.ftl">.
    • - -
    • Minor documentation fixes.
    • -
    - - -

    0.9.1

    -

    Date of release: 2003-11-09

    - -

    New features, improvements:

    -
      -
    • Warning! Incompatible change! Data loader antProperty and antProperties now can convert the property values to numerical, boolean, or data/time/date-time variables. For example, to expose property x as numerical variable, use antProperty(x?n) instead of antProperty(x). This causes backward compatibility problem only if you have Ant property names that ends with one of these: ?n, ?b, ?d, ?t, ?dt, ?s, and you have specified their name as parameter to these data loaders. In this case, append ?s at the end of the parameters. More info...
    • - -
    • Data loader csv now supports columns of type date, time, and date-time. More info...
    • - -
    • Later nightly build of FreeMarker 2.3 is included, that introduces new built-ins: j_string, js_string. These can be used to escape text with Java language or JavaScript string literal escaping rules. Also it contains some minor bug fixes.
    • - -
    • The text hard-wrapper (used by the command-line tool) has some fixes and improvements.
    • - -
    • Added a chapter about writing new front-ends. Here...
    • - -
    • A few minor fixes in the documentation and in the examples.
    • -
    - -

    Bug fixes:

    -
      -
    • The expert setting worked inverted with the Ant task when it decided if you are allowed to use the project base directory as outputRoot.
    • - -
    • The install target of build.xml didn't stopped nicely if the ANT_HOME was not set.
    • -
    - - -

    0.9.0

    -

    Date of release: 2003-10-30 - -

    New features, improvements: -

      -
    • Warning! Incompatible change! The default configuration file format is TDD from now, instead of "Java properties" (to decrease the number of syntaxes user has to use). Files with extension cfg or properties are automatically interpreted as "Java properties" file, so the old fmpp.cfg-s will still work. But if your old configuration file doesn't use extension cfg or properties, then you have to rename it now. Also, note that the default file name for the new (TDD) configuration files is config.fmpp, which has priority over fmpp.cfg when both present in the same directory. More info... - -
    • TDD was substantially revisited. -
        -
      • The TDD syntax has several improvements and also conceptual changes. The revisited TDD is backward compatible with the old. However, I will remove hash unions later, so + will be available for other purposes. To prepare for this future change, just replace + characters with comma (,) in your hash unions. See the chapter about the new TDD... -
          -
        • All FTL string literal features are supported. Escapes, raw strings...
        • -
        • With a new escape sequence, strings can be broken into multiple lines visually, without affecting their value.
        • -
        • Much more character is allowed in unquoted strings.
        • -
        • FTL comments and single line # comments are supported. -
        • TDD files can specify their own encoding (charset) with a special comment in their first line. -
        • Line-break can be used instead of comma to separate items in listings. -
        • The hash union concept was gone. Instead, you can put hashes directly into the enclosing hash. -
        • In hashes the value can be omitted from the key:value pair, in which case it defaults to true. -
        -
      • - -
      • TDD error messages show the error location (line, column, file) and quote the problematic line.
      • - -
      • TDD now uses term "TDD function" instead of "TDD directive".
      • - -
      • Warning! Incompatible Java API change! fmpp.tdd.TddParser was gone, and fmpp.tdd.Interpreter was introduced instead, which has different API.
      • -
      -
    • - -
    • The FMPP Ant task now can load the settings from configuration files, with the new attribute configuration. Thus, now you can store the settings in a single place if you use FMPP both as command-line tool and Ant task. Look at <FMPP>/docs/examples/build.xml and <FMPP>/docs/examples/ant3 to see applications. - -
    • New setting: inheritConfiguration. It is used for "customizing" an existing configuration by overriding some settings in it. See <FMPP>/docs/examples/inherit_cfg. More info... - -
    • Warning! Incompatible change! Setting sources now uses TDD sequence syntax. Thus, you can't separate the files with : or ; anymore, but with comma (,). According to TDD syntax, quote file names that contain problematic characters, e.g.:
      - no/problem/with.it, "but quote this.txt",
      - C:\windows\path, r"C:\quote this win\path"
    • - -
    • Error message creation mechanism was changed. The messages are now more "stupid mechanical", but there is far less chance that some helpful detail is accidentally left out. - -
    • The default values of a few settings of the command-line tool can be customized with .fmpprc file placed into the user home directory or into the FMPP home directory. More info... - -
    • The get data loader function returns the values of other variables in the data model. This can be used to pass previously loaded data to other data loaders as parameters, for example:
      - data: {doc:xml(data/foo.xml), index:com.example.IndexBuilderDataLoader(get(doc))}. More information... - -
    • Data loader eval has an optional 2nd parameter, the hash of variables that will be available when the BeansScript is evaluated. For example:
      - data: eval('...', {foo:properties(foo.properties), items:get(items)})
      - More info.... - -
    • With the new appendLogFile setting you can specify that the log file is continued, rather than restarted for each processing session. - -
    • Warning! Incompatible change! The fmpp file extension is now reserved for the purposes of FMPP. Files with this extension are never processed (they are ignored). If you had to process files of this extension, protect them using double extension as test.fmpp.keepme, and then add the extra extension (keepme in this case) to the removeExtensions setting. - -
    • The quiet setting now accepts values true, false, and reallyQuiet. Integer values are supported for backward compatibility only. - -
    • These settings were renamed: removePostfix to removePostfixes, removeExtension to removeExtensions, replaceExtension to replaceExtensions. This change is backward compatible, because the old names are internally translated. - -
    • New FMPP Ant task attribute: antTaskFailOnError. This tells if the FMPP Ant task should abort the Ant project with error if there were errors during the FMPP processing session. - -
    • Engine.process(File src, File out) now modifies null sourceRoot and/or outputRoot settings for the time of the method call to the parent directories of the source and output files respectively. - -
    • FMPP build information (build date) can be queried with the new method, Engine.getBuildInfo. Also now the command-line tool prints it with --version. - -
    • Improvements to the command-line help, such as new command-line option --long-help. - -
    • Warning! Incompatible Java API change! Engine.process doesn't throw IOException anymore, only ProcessingException. - -
    • Warning! Incompatible Java API change! The built-in DataLoader implementations were moved into new package tdd.dataloaders. - -
    • Warning! Incompatible Java API change! tdd.util.StringUtil.excToStr(Throwable) was removed. - -
    • Revisited documentation and site generator. - -
    • Now mode x is set for bin/* in the tar file. - -
    • Added test suite. (But more test cases should be added...) -
    - -

    Bug fixes: -

      -
    • fmpp.bat was stopped with error if it didn't find Ant! AAARGH! - -
    • A later nightly build of the uncompleted FreeMarker 2.3 is included. This fixes a FreeMarker bug that has caused the first empty line of the template files ignored, when the template has started with empty line. - -
    • Warning! Incompatible change! The FMPP Ant task didn't aborted the Ant project when stopOnError="false", and the were skipped failed processing. Now it does. Note that the old behavior can be emulated using antTaskFailOnError="false". - -
    • pp.locale didn't followed the locale changes made at template execution time with <#setting locale=...>.
    • - -
    • Various other little fixes here and there... But don't be sad. Many exciting new bugs has been added during the refactorings... ;) -
    - - -

    0.8.12

    -

    Date of release: 2003-09-30 -

    New features, improvements: -

      -
    • Warning! Incompatible change! A later nightly build of the uncompleted FreeMarker 2.3 is included. Unfortunately it contains some incompatible changes (Sorry... :( I will not risk nightly FreeMarker builds anymore after 2.3 is out...): -
        -
      • White-space stripping is now more aggressive as before: it always removes leading and trailing white-space if the line only contains FTL tags. (Earlier the white-space was not removed if the tag was <#include ...> or user-defined directive tag with empty directive syntax as <@myMacro/> (or its equivalents: <@myMacro></@myMacro> and <@myMacro></@>). Now white-space is removed in these cases as well.) Also, top-level white-space that separates macro definitions and/or assignments is now ignored. More information... -
      • The return value of freemarker.template.TemplateMethodModel.exec(...) is Object, not TemplateModel. -
      -
    • New pp variable: freemarkerVersion. Also, new fmpp.Engine method: fmpp.Engine.getFreeMarkerVersionNumber(). Also, FreeMarker version number is printed together with FMPP version number everywhere. -
    • Warning! Incompatible Java API change! API change: fmpp.Engine.getVersionNumber() does not throw checked exceptions anymore. -
    • New pp directive: pp.restartOutputFile. This directive empties the output file, but does not delete the file or discards the further output as pp.dropOutputFile does.
    • -
    • Warning! Incompatible change! New setting: "ignore temporary files". This filters out certain typical temporary/backup files (that is, it chooses ignore processing mode for them), unless you explicitly set this setting to false. The old .bak and ~* filter mechanism was removed. Note that this all does not affect the FMPP Ant task. More information... -
    -

    Bug fixes: -

      -
    • With setting "borders", using headers with a template that contains <#ftl ...> resulted on illegal FreeMarker template, as nothing can precede the ftl directive. Now the header is intelligently moved after the ftl directive. -
    • The documentation of pp.set and pp.add was totally confused. -
    • The engine was unable to return the FMPP version number sometimes due class loader issues. -
    • Warning! Incompatible change! Setting "ignore CVS files" had lower priority than the processing mode chooser list. Now it has higher priority. -
    • Warning! Incompatible change! Setting "ignore CVS files" didn't ignored .#?* files. Now it does. -
    - - -

    0.8.11

    -

    Date of release: 2003-08-11 -

    New features, improvements: -

      -
    • Warning! Incompatible change! A later nighly build of the uncompleted FreeMarker 2.3 is included. Most importantly, its XML handling is now much better, but unfortunately has incompatible changes: -
        -
      • Attribute queries such as foo.@bar now return sequences (similarly to child element queries and XPath queries), not single nodes. Because of the rule with node sequences of size 1, it is still good to write ${foo.@bar}, but built-ins such as ?exists, ?if_exists or ?default don't work as before. For example, instead of foo.@bar?default('black'), you now have to write foo.@bar[0]?default('black'). So if you have used existence built-ins with attributes, you have to find those occurrences in the templates and add that [0].
      • - -
      • XML name-space handling has been totally reworked and is absolutely incompatible with the old stuff. Don't worry about this if none of your XML input documents use xmlns.
      • - -
      • Special-keys @@ and @* now return a sequence of attribute nodes instead of the hash of them.
      • -
      -
    • The xml data loader has a new boolean option: namespaceAware. If this is set to false, you can load XML files with the logic as XML has worked before the introduction of name-spaces. -
    • Minor fixes/improvements in the manual. -
    -

    Bug fixes: -

      -
    • The FMPP Ant task stopped with error if you have used nested elements and you have executed multiple "top-level" tasks with the same ant invocation. -
    • The snip function of the command-line tool has snipped the text-flood too late sometimes. -
    - - -

    0.8.10

    -

    Date of release: 2003-07-03 -

    New features, improvements: -

      -
    • Warning! Incompatible change! This release uses a nightly build of the uncompleted FreeMarker 2.3. FreeMarker 2.3 adds several important new features to 2.2.x, but it is not fully backward compatible. Do not forget to read the list of uncompatible changes in the FreeMarker Manual! -
    • antProperties improved: You can give the names of Ant properties you want to expose, as parameters. So if you want to expose only properties foo and bar, then just write antProperties(foo, bar). More info... -
    • New data loader antProperty, to expose the value of a single Ant property. More info... -
    • New data loader xml, which uses the new XML wrapper of FreeMarker. It replaces the old xmlInfoset data loader, which is kept only for backward compatibility. More info... -
    • Some code clean-up (as removing a few unused variables). -
    • From now, freemarker.jar will be checked in to the CVS repository. -
    -

    Bug fixes: -

      -
    • Warning! Incompatible Java API change! In fmpp.util.FreemarkerUtil, FtlVarToCoreJavaObject is now renamed to ftlVarToCoreJavaObject -
    - - -

    0.8.9

    -

    Date of release: 2003-05-02 -

    New features, improvements: -

      -
    • Better error messages: FMPP tools now tend to show the whole cause chain, rather than just the top-level exception. -
    • New data loader: text. This loads a plain text file into a string variable. -
    • New pp variable to retrieve the FMPP Engine version number: pp.version -
    • Easier to build: -
        -
      • Task for getting the latest nightly FMPP. -
      • Fixed the class loading issues of the "docs" task, so the default target is now "build". -
      -
    • The distribution now works with JDK 1.2.2 -
    • Minor additions to the Manual. -
    -

    Bug fixes: -

      -
    • The Ant build was not working without build.properties. -
    • The localized lookup feature of FreeMarker was not disabled, and it could cause confusing effects. -
    • The log file didn't stored the source file path for errors that was logged before the "END OF PROCESSING SESSION" message. -
    - - -

    0.8.8

    -

    Date of release: 2003-04-29 -

    New features, improvements: -

      -
    • Rewritten fmpp.bat; it is now more flexible. -
    • More documentation. No more "Under Construction" logo. -
    • New pp hash methods: outputFileLastModified, sourceFileLastModified, realFileLastModified -
    -

    Bug fixes: -

      -
    • Predefined data loader now didn't used the "time zone" FMPP engine setting. -
    • The "turns" setting was missing from the Manual. -
    • Fixing some typos in the error messages and in the documentation. -
    - - -

    0.8.7

    -

    Date of release: 2003-04-12 -

    New features, improvements: -

      -
    • New date/time related settings of FreeMarker 2.2.1 are exposed now: date format, time format, datetime format, time zone -
    • Date/time related pp variables: now, sessionStart. -
    • Final version of FreeMarker 2.2.1 is included. -
    -

    Bug fixes: -

      -
    • The classpath in fmpp.jar didn't included bsh.jar. -
    - - -

    0.8.6

    -

    Date of release: 2003-04-06 -

    New features, improvements: -

      -
    • New pp method: pp.loadData(dataLoaderName, args...). This can be used to load data into a variable in templates, with the same data loaders as with the "data" setting. More information... -
    • New Engine method: TemplateModel wrap(Object obj) -
    • Newer nightly build of FreeMarker is included (2.2.1). -
    -

    Bug fixes: -

      -
    • Warning! Incompatible Java API change! DataLoader.load(engine, args) now uses List instead of ArrayList for the args. -
    • The install target of build.xml forgot to copy bsh.jar. -
    • Minor fixes in the documentation. -
    - - -

    0.8.5

    -

    Date of release: 2003-03-23 -

    New features, improvements: -

      -
    • New built-in data loader directive: eval(JavaExpression) -
    -

    Bug fixes: -

      -
    • Fixes in the documentation. -
    - - -

    0.8.4

    -

    Date of release: 2003-03-21 -

    New features, improvements: -

      -
    • More documentation. Especially in the documentation of the command-line tool. -
    • New setting: replace extension -
    • Warning! Incompatible change! If the option remove-extension or remove-postfix is specified both in the configuration file and in the command-line, then the two option parameter values will be merged. -
    • Newer nightly build of FreeMarker 2.2 is included. -
    -

    Bug fixes: -

      -
    • The output file name deduction was applied twice in certain situations. -
    - - -

    0.8.3

    -

    Date of release: 2003-03-16 -

    New features, improvements: -

      -
    • bin/fmpp and bin\fmpp.bat now can load the FMPP realted jars from the ANT_HOME. -
    • Added install target to build.xml that copies the jars to the ANT_HOME.
    • -
    • More detailed installing instructions.
    • -
    -

    Bug fixes: -

      -
    • fmpp.FileUtil.compressPath has died with IndexOutOfBounds in rare cases. -
    • rar was missing from the list of static file extensions. -
    - - -

    0.8.2

    -

    Date of release: 2003-03-13 -

    New features, improvements: -

      -
    • Block assignments instead of @capture. For example, instead of <@capture local="foo">...</@capture> you can write <#local foo>...</#local>. -
    • New pp methods to calculate relative paths: pathTo and sourcePathTo.
    • -
    • fmpp.FileUtil.getRelativePath does no require anymore that the starting point is an ascendent directory of the destination. -
    • Newer nightly build of FreeMarker 2.2 is included (supports block assignments + bug fixes). -
    -

    Bug fixes: -

      -
    • fmpp.FileUtil.getRelativePath has returned bad results in some rare situations. -
    - - -

    0.8.1

    -

    Date of release: 2003-03-10 -

    New features, improvements: -

      -
    • Added "ignore CVS files" setting. -
    • Added xml_infoset example. -
    • Simplified build process. -
    • Some minor fixes in the html-s and txt-s. -
    • Newer nightly build of FreeMarker 2.2 is included. -
    • Warning! Incompatible change! ?chop was renamed to ?chop_linebreak (due the changes in the FreeMarker 2.2 CVS head) -
    • Warning! Incompatible change! CVS files (**/.cvsignore and **/CVS/) in the source directory will be ignored by default. -
    -

    Bug fixes: -

      -
    • The Manifest.mf in fmpp.jar was empty. -
    • Last-generated date was incorrect on the HTML pages. -
    - - -

    0.8.0

    -

    Date of release: 2003-03-05 -

    The initial Sourceforge release. - - -

    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/docs/writefrontend.html b/fmpp/docs/writefrontend.html deleted file mode 100644 index 9172386..0000000 --- a/fmpp/docs/writefrontend.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -Writing New Front-ends - FMPP - - - - - - - - - - - - - - - -
    -

    Writing New Front-ends

    - -
    -
    - -

    Note: I'm talking about writing front-ends here, but of course the same technique can be used to embed FMPP into your application that you couldn't call a front-end.

    - -

    The low-level method is to create an fmpp.Engine object, and then set it up with its methods, and then call its process(...) method to execute a processing session. The API of this object reflects the internal architecture of FMPP. Higher-level concepts as settings or configuration files doesn't exist on this level. So I don't recommend you to work with fmpp.Engine objects directly.

    - -

    The high-level method is to create an fmpp.setting.Settings object, and fill it with the setting values. This object can load configuration files, and its API uses a higher level approach in general. This is the object where FMPP settings are implemented. After you set the setting values (and also you have added progress listeners and engine attributes you wanted), invoke Settings.execute() to execute a processing session.

    - -

    -FMPP architecture
    -
    Figure: The components involved in typical FMPP usage. Red arrow shows direct method invocation (or constructor invocation, or static field access) between the components. The arrow points from the caller towards the called. Dashed lines indicate unimportant or occasional access. - -

    - -

    Note that some settings are not implemented by Settings (as echoFormat, logFile, ...etc.), and should be implemented by the front-end.

    - -

    For more information, please see the API documentation. Also, you can look into the source code of fmpp.tools.CommandLine and fmpp.tools.AntTask.

    - -

    Example: Below is the source code of a very simple command-line front-end. It accepts one argument, the name of the configuration file to use. If that's omitted, it tries to load a configuration file from the current directory.

    - -
    package fmpp.testsuite;
    -
    -import java.io.File;
    -
    -import fmpp.ProcessingException;
    -import fmpp.progresslisteners.ConsoleProgressListener;
    -import fmpp.setting.SettingException;
    -import fmpp.setting.Settings;
    -import fmpp.util.MiscUtil;
    -import freemarker.log.Logger;
    -
    -public class AdhocFrontEnd {
    -    public static void main(String[] args) {
    -        // Parse command-line args
    -        File cfgFile = null;
    -        if (args.length == 0) {
    -            cfgFile = new File("."); // load the cfg. of the the current dir.
    -        } else if (args.length == 1) {
    -            cfgFile = new File(args[0]);
    -        } else {
    -            System.err.println(
    -                    "Usage: java AdhocFrontEnd [configuration-file]");
    -            System.exit(-1);
    -        }
    -
    -        // Shut FreeMarker logger up
    -        try {
    -            Logger.selectLoggerLibrary(Logger.LIBRARY_NONE);
    -        } catch (ClassNotFoundException e) {
    -            throw new RuntimeException(
    -                    "Failed to disable FreeMarker logging.");
    -        }
    -
    -        // Now comes the meat...
    -        try {
    -            Settings ss = new Settings(new File("."));
    -            ss.load(cfgFile);
    -            ss.addProgressListener(new ConsoleProgressListener());
    -            ss.execute();
    -            System.out.println("Done.");
    -        } catch (SettingException e) {
    -            System.err.println(MiscUtil.causeMessages(e));
    -            System.exit(-2);
    -        } catch (ProcessingException e) {
    -            System.err.println(MiscUtil.causeMessages(e));
    -            System.exit(-3);
    -        }
    -    }
    -}
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/fmpp/documentation.html b/fmpp/documentation.html deleted file mode 100644 index 372c346..0000000 --- a/fmpp/documentation.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - Redirecting... - - - -
    -
      -
      - Redirecting to the documentation... -
      -
    If nothing happens, click here: docs/index.html -
    - - - \ No newline at end of file diff --git a/fmpp/gulpfile.js b/fmpp/gulpfile.js deleted file mode 100644 index 49cf8fd..0000000 --- a/fmpp/gulpfile.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var path = require('path'); - -var gulp = require('gulp'); -var less = require('gulp-less'); -var rename = require('gulp-rename'); -var minifyCss = require('gulp-minify-css'); -var prefix = require('gulp-autoprefixer'); - -var SRC_DIR = path.join(__dirname, 'src', 'docs', 'style'); -var OUT_DIR = path.join(__dirname, 'build', 'docs', 'style'); - -gulp.task('styles', function() { - gulp.src(path.join(SRC_DIR, 'main.less')) - .pipe(less( )) - - // prefix - .pipe(prefix( { cascade: false, browsers: ['> 0%', 'last 2 versions', 'Firefox ESR', 'Opera 12.1'], } ) ) - .pipe(gulp.dest(OUT_DIR)) - - // minify - .pipe(rename( { suffix: ".min" } )) - .pipe(minifyCss()) - .pipe(gulp.dest( OUT_DIR )) -}); - -gulp.task('default', ['styles']); \ No newline at end of file diff --git a/fmpp/lib/bsh.jar b/fmpp/lib/bsh.jar index 36fe03d71c4fd6659777dc6627d52a1e2d5d78c7..e326510007373f0a5f96acf121e97fb58c4fc8ed 100644 GIT binary patch delta 332893 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

    ytp&nq}0Z zIW)8=(yv$w%*WT0;ti(Jt4Wr6O$YSqxdEVIVfif!e44HF2Cv0dD-T%psL13V>8a2) zJIXnYqnOP)H&Jt+0&NpqjWz#BAN9*II#7oic^m}v*RBKvDw#NYP5F-fj|6Tn=w(PKz{&GKb!Bu*QM8_hPi9@-l-vjIY! zxHheueX^vYG&n8Sw~*O*OvpJuUPoed;Q-4MV0S{!+W zxw>CU!-Qj;$@*pLOAdI=Q^mXzxB$?<7R#D--siu2uU5mULs=w!iO#}d!BIfp(~m0) z!k+^HYQJurU&tv}Iy*D`qx_o`neG^m~Z6dL@&J(`%`($$CVRs*?%q#ZpUVx&{A zdZBhcwc?dL_83gK6orEKSd#F^1|}yG&BAD)=w|XvnHFMuX@3@M3V9;e^?%lMkbdY2t!758SbUWHAMk z%hT<&tDz%5(fkfH995c$&T5`dN}tB)6u{ZZM)HkFF}Wok**lK$ z8@_6)c9PFwy)Q2YAV=jrR_7L>dI!mMq@-|%$rllC?#wBhcHgLS56YV&48t_PWHrc4 zLL+hON|KXsX2&4b%fES1W=$1%ZSTQ7+CeZAPRjcD8}xtQTt2H%wlIHq08ZFnzi<;k z#0ddv5Kh=?KZddPxk^={)i^i_R(~05f9AWm6+s5Y+B#zj1;X*ZdJ|-_o!KjKOcOV= zw6r9rU%U3UAyn-8e;`u-67Y|K;i$AyLWrnn59Z{C;{kbpnm)}~W+A)2>TK4$pI^H? zSAM_dba%q-_;#cW@D^swhD1WU#`kwrqB;Yp$1YCP+j-k5KhR)Mja8??G;qzNN$<4XK$?$vtC4*y29*E-D$%%UtAF(yvf3@_q-;xb>?n6 zqS4}8vFJ!|;wR`LhNvJqC^N<-3U4%lw&ixfIekm_#W43gsLZU)bJXjTs{%Bry6pk> zoHv;teX+r;)3D*XUla47UUQT3R_gaO*1`0P?@b2Qe=~1 z2i!mjWt2e$kh<>D=#B&nFw=3J?_>e?i2~1&&r|l83i8d;>>ghAsTmEOOiS9Tb-Tq? z7mwYBg}%QBmD3!mGMCJN$+#qy3bKzqDVYLR^0u58;4om3963=1aLRPvYEZ=Fc;X5=Kh0jw#9VEi_tY`;`&9%GU|Bz7|VCX zV={{a7KoIk>e^O1%NkxI^B1NHsqOMo8}0=t@zvfHgAf@4D1ZSy?Ow4slDR_HJ8=LUdx#b%}ZYBkp0!i|SU$2E_Vqkclf*~SDa;{tyR4NXYg`hYkQ zQ7P4x`#$Po`8OMKlWir)>?}1MOK$3}HATD4*uDkm4Iq|+_)6NyylgJE5zNDMTUwKu ze*ytP2kQc56Hiapv|;IENJun(T8}T!LH3j#(2L4O=mIXgRL}sW>;xwuGY!n|iLzUy zB1*a(B?UO`MF)xs3JXkvu-)VHW7e#ct*f{LpNi1r5j>8q&jP#unva3zY>f-Ok{pANPJA^(88oV>;O$w zK!cvAOvLY6FmlojucnDMi88<|_)(0ZCFI=~S(9IPeQo|P+@RrFh`CCTZIWFCkFYL0 zwJrEaRM(>Q2DUlFv{iZTfb#cLbuNRiA89p_31!4A3lpGAp#iZ6U+9;?d0+U47Og;keMdi%jiq|kg(5+pCZ3qt1-?rF z|4qz1smyL0Q`63zZA^b{6w*F>f8Y2L;zBVzJKWWs|rS#J$d81>SXrw9B8QOk;?erFc%X| z!`Y)&9mOAqR}}tBEHO}PqZb?;2_n^t2yFq-SEaM#G0Egvj#D-})^&yANuGw-I>(<{f z!rUFg2+f0;OQq_By;yLs(O^(kKrN?|Z&IqbNv-5?x=|GCd|!7LDH?D4ME94}?5(E$ z10ZSjnr(Fl*O{;SoUp#x5wLhcxlLE^XFu^+tx(mocsIYpFJC?fgL83I?K%}VM`yz& zhM;8Ic1H0mws@VBtA(5W^#J;E4BLl<+JzDI34+!(N$^Pc=o|!c&xrAWp|kf%)B9S! zrTq$jMy~lZ&Q1H?f2FJ%Sh1EBp>k9-<#R8ZxEU+vUOs@rHCcC%RAx!k&%n}GbF7gl z+pHXGk9OSBkhHq`KT?^5a+o9l^hYX#O6Zay0wk%f|7`GLe>KZAjJiS<74cKA<@>ia zHbN>(BmDf!qiLcDLPcmfjkg_*+LRHvrQN!r-3os@c{zaQl;#93*olCPhGy!zIq2Sd z$=YO=Nx(Pa;z-%P{Gi=_y?ouzvFZkLN8YAfi9`T}+pmpOz?ddS7m~ghM#1h4%;{GE z@L4)cgh+rYv0n)d#F#k<65MhSxGVaBPgBj%(-6@bi3V5e)5yNY!rxc=lcF24l;mQR zm=ODjhxupPYfH(R7ZW^z<_~8BSg0ZV@+_>HE9hMH)mzM%m;z2c#@0khH>vW5 zQseMpBunK^o?dL4>3vy%gs~2~$Qj{MXMRuNaV$sal(bXQU4lJ=dDa4`z>> z3Ii_%LRM=?5*V~1a;{vO11z-I8j7dt*qE71CarWNXtGW?xp_*4Z7ii^`30Q;(tJt8 zHa~7yQj8`FDgyO!PKI^nIS7PMnWALGsh7$$4yrr;;_2MyW(GL~3rRtEh;yko z!hQw;c-oSPL3OtlMfbo+kfKrmwfRFfiyf~nO`RkIWjJ}A^i<^eJM`})7?qtm6?OSK z(3qbzJ11&a7CvI;WMKXwC`#P{4-}n~M-G3{d0vJeS>s^lI%l5 z(c86hm;tI&_)UwFatmYhZ@ej~R?^;3lrn>wztGoqYO7}bvjIAN)S$thLBQ0GKtsg- z4s$h)dYVRiQ*nW%5+5E=;Owr+ZZhwvV72)hji1rp2xTK$!k*C;EVaw&{M`keG$tAm(v8%->5dnnt z^R+ogj0U5UR<4u3TsQ<$v2$t?n4Rm?WUVOikT#r;u-At)GIL2mg1=iXlx5$n5G4n|N%hNm6G zQSC$mFA!qX8zBp@c6qUm1m#*MCnEo{x4~s$Q}8O9P!2JYbO{PCULm1^cE<+Jb_Cv3 zffiR@m!-gr{R)osoVyafE5(91-i`9)ypIKl2}`T(YV{QVJ*NDSk;HvWnLV*pwnfGN zjtr*yomWe#DR#IR7tM`Xu*I(<)`LZ0Fqu^9jWe0BT;~dKM4*v5zf;GHy8GWU9QT64b(#~0LjLq@tK^jM{B)6TWsC9 z2kj<=h-QqCb=Hs{mMK5P_NIt6vVeWaEj4xeev#xz%iFxo0(0L;8o3d+Q+hz@L;%mt zivw2v4xR-N^74RHd_>-DY}6Wv&h>!Y)$iavJ-idc?q|gwruXuvBgkSybVK45lv&;q z$#o`Qx{4fkSoWo~9Y)UnxFpCnyA2BRGFtIUVr;W`0QTZ2oP=WO9rn|6jbaz)BF~KF z;fd~Heq8hIgN$cW?C;a9Qv)9O2-c7Y^d3He{m73jn*;Iz!!d*Yh4#PE&e)BUw#tuk ze-500p-2L7QL?c^6oB_dtZfK!;8%MR2W(<;D=5M+{{Wd%TDt#y?)NY>C1iA#bo zYy^d2{1`7~2rMUUoxWlyejy=O?gK`oG@3ol$E>wp5kYq8GVm&L`q)vZ+Ly- zZm$-w9N;R%+V0C%8K-xD?!K}cjed8|ufs)dnM8*@JIe+sb1+){zS)CdSCnkj1CwItu;6k4+ zt_C_~385yUFGGTKS*7k5G-VXwYeHtZ1UJ$ac0?R$R<19>TRwF-G-r>9>kee`Tt|JN z11ml(Vi8&5U1eDN5rD4s_3~e!t5gpr4Iw!u<}4ik_PI=mP(w`YgE`Fnt>tH!d<+9T zQLHUH-SQfC!`Ik67+hdl7~NwPzllS`9jR%*b5k~zu?J3Jz*wh$1M@=!xgi$AN4Z2NNGFh@IhI;gj_8uH5Z&7K;}i6nB_^PH$*fDj?VGONH9hc7sy|8FewSj& zBWu}!!)P`V{#j;TTX~Fy^tK7~REF(Q} zrY>*)C{ZG`r$vEnO-NxF$gog1x0(t1H=gDTtY4Vmot2F30K-|eX|mp_>O@{hBsa-U zPH?mqVS=QRhz-G2X>wDQgcFqBy1RcE(1GvT@Qed|+pii)XVKe!u$ehAzO&MKGX z>d@?0aPJZoCrq5~`D%5V^&XNAo7_l*;D(SXsRYx#i~~V2XzxJCq^nRkFx1)+`>SnD zX=ml>HA{4MU7~tGcS*H&EXk7lSbYPDMG!z&pntj|}Bw8H6Fw-p9oy60sm^ph>#QGgx zNtV8dNIFHLAZuAfyC2IvfpH5FGR?g->SD?_Yw zhYKBjHa$Mgu&R^2GmaoAtcFeB@Da|PxwG5bF`-c?qfHzcAK&5;`jELXMMW_N*@H69;uvmz=E@f8!z31TF^H@aRFiG z4GyT88CZ4~kHlqodx1TFL9j76_o=surDiT;Kn^!Y7fUuZR$4xzp*#t!^^{7*MPjo3 zC+z79|I=1=MnM`z;+u=&m|v>|_&AQG)?!pAIg6jP$Gc{xl2T5TR{9>{$XYqo3Rt{NfV+(gLe~ zEP&r;y}{ud+U4Y1)}tGQQS@H!iPH6+jzQco-Z2H{`uwx=uDe0_Sf#i@I(P|oMSlZK zclBUI`u6!}k9O8L1*!E*42A(#>2=@lCFK`iOSmXSR z;XV>0;;t_0doW1kD?Jp`>8||bGZB#!di3tS5;OeyLIFF%%Xhzb?E3-K{jdkYaG+K{ zTQk^5W|C6ko#?R^vF(1V1>AkVhmrQyi3jLuP~;{X#1lF3Kmhbcpmn;B_KZVjA3jQ9 zVWB8z^`#!(s?Wg=U&sJ<&0~_Jx&we*U`iIVNpOl{musD6sv4b;JI@2B~sNKA%X zyl7^2ulgIN6zRutOaR%WAn0XaDJ1xlCgR;@!8F5=g#`5ye2XnYi5cUbp69%*yI`~WKj?V!n3mrzFr ztEG{(6t%Abbyc>^{9q{naWn3>uw0BZ^|&YDtSS|Nfa+^7)yXIv9fU?h0f+e(Y%6h( z2I+eUfIP;>55hPg4DPm|V31kmB|t@Eyl2xv1c}Y+fIDTTEK;T3zG<-6?Y`XeEe%%9 zs2pA9sFE$Hj~>1&OxQtlLT!(L7A{OY1AWM#(#0r!sKP7sDx;DstrVpYRE$|M)CP-K zig*d&(NUd{O)nQm$*}B5&!v|+$BG>A*Gb+)urr~uA?eJQ96%ei$}A&--I)-cowE*A z5>w+7l3`plMxkFoR+3SfmuAsd>&Pg{ZUp)h$D@`gmp(I1^+P4-B5(3&c^-;l|?Z;Vl zv8#G@pR@nWsfHXgWX+Ckc?HmWRcD+I$5kq-XUgIXqHdRe%y9)y8$8QKNXgn{$tNk*^@l@@2aTj+jzZoHJQA@IjU9^JsallBKJ49EQ1+ej2{Tqo z3D|%aBV*l~eCRy>QOmUKCYx?a4*~(kMiQAVQZHtxJY87hjgff5hgq%I)X^RS3q}#P zBr}>k)E5fl&@Pw>QkSI~>WnW!3GQg)7bt|h0Qa@fIkMAN9Wfcp?O}`+vfkv#F0N}- zG#S^Uhd9noec`7*=NlD^ozmoFUR9RPs@3+oRZtB)s`cD=%HLC0NS?K#yD6ML=PgUtP3tL=J zR5KqP)yJ0)>5{@aqKQMP+C_lnmBAmncX$j>Wz+Oj5sA;H1DWm$lq0jG(R2m2swys; z&$L(%)dk~iLN7_`(YJb&zIbsw9&CHNWNSMEIpQ|bjmy8Cgb3GjSp~WABoVlE)dogB zok(L->TkA(%TE{|b70WEdo^N2-7ah+DKxD0-4^2C(ofTvb9RP+AFTbgYJICin=}4` zKDDSf>AhPwbsRJ8`lPi|UThs58C(p@zge{0Y)LVA2ck|*#)@!VWiR2T%|FaA`jWQ` z$i<-C6w-1A!3C8Q;2Gg&qbC>gplWyx;Jm^H`+|}EgRP)328;mP!OeeN;BY5z0?CTw zA5^Jj$3@8=WhT0o;6beUkeRaEO9k*&@{wQ@J)9E+QmBXlm~XxqB?X~M&VgbLPq zund+6hh)-da*{iq4>yHX+=qnOHx$_p3{U%r*^OD-Iw=;3(|J!$@;!?R?yYm=J^4jueld=;wW(XE}7+XVqEiS10v$*DQ0Cv!C{28T{n zKOL#O0&V$>ocAl21^A$&-CT*#2O(8>bH(Lo9U}RIME+${R@g)G#NH*J{wt(R^%FBM@vxGot)_aQ|ig>ZPNC@p#bp64#H^r{MZ@~ zu0FNfB60znlS+!MkO8eQ&kn|PSA)FqR|MStA-5poWVhsUD=`7?+DLo*^li4uV0<|h zcm8*ZJ&qP%h)i6HOH5{~pj1VEX2<9X0JuqG#tx8QT%BVcp(*Jv6p(;Kys9D_` zVO|pv|2iG$p`vYNupb|8`2A=e_G^>0%}ugD4H3zwk+ppoKh#_&CU%EfF-6^2T-w;U za7QhFtRBbTe_sNXsARE(CC>(6SU}!9LhJ6xN3@j|<*crKNc3-6Bmw3pDWl9POR(+G zfkcZ#GlBKC3nqDf|FG3&W)-*dqEJI>OeKTv`s8^d)r{yxPzK zSVB%I%)bWl0%uYF(VFaYWkFLbeQi}t+J#k#=28g)D~+OURtTI%f(}67lMyo6k!1^m z5`Z=4=gQ4f{6}(gc%q8g2uy3PGQp%bQwVc!`9jzwyb~=izdQamdz1A2A8_Qqx_&sK zR`BtEtUb-YerqDP+Dkf3w+ zQf=Gw?XLFWk#taBqhmfZCM*JbfEl?-4wL63G~tX$OD|bahXX=~Axx$Mynlj%=nCiB z3l(TgMt49Q+8*%wk5dGT>*KKyW&?z4Mmd17m{Oq>ME-?c_3+FDqa2+Zl4cj?KRrvZ zmG=aP8DY6FqkD#I8JU+klh3OVl0Lv_&%;AwLO$l6k(bXBLZ6a~v=pio@9OyY`J8x3 zS^NXn&YZcj#^J1WfIKM;Y9`IjYuJC$1a`SbYI^30EMa(Bs_ma)Z>o6zk2)s) zD zt|Guz=#0&_pNLomBE4G8t;z5mIx?;K460HE^V9Xp<8sl;0&J}YV|k?dK}G;SpIkv2 zR!0s$2Vy_G`dC5yz7Rg$WLtc5KK@CtdCnokcFO6~t*t;*j5Uo=HU-=O6pbB8IdR#H zmG+Ihv#0V6AV*uvo+O8_;klj2QvlR$XApCtNk1dwQQF$Mc$)mw3WjyBUK`inCG&>& zXM)K=#>FeUGTxVUPQB@-M-&&1g3fE0d$5O%^Tv85)hJmE=rp1UN!@U`uHs#Bp5<(o zt?&`MfF!=K(4|Mlh4ZM0nYqGH%Y%l-$IqNpsvrvo;3b%PHS68~)z;I8FrTCuTY7(u;{5k6ZrGz>#R@s42{e1HOJhn+~6*Kjo~8vZkAD430Ofr@CNZ>zPn?yKHtfc#;dq%K@IUo?ey85EM>ipD1_M z(h`Ra7s0k;tVY&;Y_|W~uCm%l0;KaZTgo5_Rz|o0C9VG&tuL@xnp%0OL9NaO&j1>l zX7&G%t9RgzG;FhQJMP#{#kOrH9orpSm2`~iq+{E*ZFOwhX2*7NGBanLne(kx^#k5j z&->Jky|2wwxGMg2veG2KhrTp)fB&O?IKIk7N7m%?z5F&_I7L8+O_Yq)lQIE%4o9Ukk=gMmX>_Wy23fMVW`%0 zR{?$azltr{cMx5niAe+1aMAQH#?~)zc++3?2{9(2UKLxHTnD<{^nx-gXlc`v)E_4v z*5csGo2EAW#!mFh?k6DX4O3m4l^*qt+7<8e%S4^vp_445=1^fm7SQFHn4{&k~ z>mv04LMMr9D;+yhaUo)BdT+2->2j1qQ@K}RBrDHsfTkg##ka;$C54Ol=WoT*9IWVU zy<`DhWZv%JwADFxK;>@(rhDMu6nYC9BCbKWvB)7siU2$^@#I@NGE4LtjQ6?UF4IrL zD?#8KgD{`RV}@YK7|PJeK#9_+ZQ6TMxfL6&yodsCd7!&!sZXz5H;?EU`2m))V4j9O z-RQt|4@k*Cv(mgpWJ*5J<@7(+B-%bK=Qv-7Pv&cAP5xhVs(5uXGLVnT|J-j75E#oU zIuZlE!tc~X;S!P8xj2O4YG|`*hF2cil&mfErf#w?5O3IB&%5O>zyI6d82nePldUpk z@R*XV{V~I9D#Od-@B7mmR5xH=b(^{%Mp)UQ9ae8{_@3N;+Z@~r;TmQ(x$J9LlPQ~R zP%IVGfg|JkT$ z?)P1c=f0g)4KXN$fVBoGF{E{mWt}cPEosj~ZNJMprDl%~Rf*y}Qr7KkJhScSiRo18 zPpxAk!eeA-#mL3T$T)g%07@UZSR8?8ZqgheW645#3?%dq;S>ar#uF4P^VtncB|S0% zrwH?!+v~=RF1%>Ix+HvT)P<*$)}hWf&V@@Sao#Krbg?B@s&|BcMd14+!tX0nu$=2& z6=7Z|8Zx;Tr*2DGl=kcsj@hwn6*ZC1W`!=|ZIheZT5*h+tQS@&h;#OFc+a2A-(u6* zMZ`Fv0_{vI24LNT<9+i1C{@I|yWFBL!}Jxq$nh)rOS~4&Aykl>VC-s%CAk-QQ7W8v zh$J|6S23bkNnYL(Z25*)T1PRVyu-~A1ym;EYUM?FfVvG$ z6Qz8A|3g|0mwwne_*Gc6e4QbjZ^=EVka!?7~|6pMnF_(R}{3pe9r_ zI)5z`aPhF&fgHwVkD?%MZnl~6f-AZ=iCCprE#gIQjNN4k31#fAht_E4sm_o0qanp_ z(Y5M-f_2psfbEj?+C6~NR^1)}zp_b#vPUO-C$MXUoHw~4UJ&E99kMHu$9)_bMGc65 zz7}tyI9GOSbb5M@fHIanm~{c`)7kS`%L4qgj~U<10MfxNYhH#V^-c1{HEpQ%ms}s)zQ3sa?1}MFN`|Hb)em<1>}*Pj@FPFRlWqQruK&E z1Vaed6EC4pKsbQtzToX6B7!NF8w+E z6^NQwpj1OKZEaaggIPwJUelo4lwPxva6`ep+nM~8wKf3sB*7kLrXfQj!Y18Aj+qJH z?%*o+LMSyfPprK3zs$n-dHstUm1?B5cBpeEwAvZBcHJGx(&Y`4>MUI0$}O za&~{cB`v%qMx`;yz^RHY#+9E-zOk`u^;njqv0+(nblhEIm89GScPXuw-)1o)a}t-6 z;&pATubQ}2_zG?rfIi-4WA5BEG@hcEL-0V)Cz)hYm5yawlC`6dmPM4FBz?4=(7J`j z<3KZYtKlaig>Nto1TTt;Pf4gT2Q``i0LSECgb*ij=i1Z=x2DQ&Q{5(0m6UYj-m#T= zBO{$5#xrxmF|BzZ+&Qo9IED|vvo{Y3#tML&p|SmMxK}l1jwPH;g0GyKxUP7dl7GpG z^3|ChZVq$!5XS&aCH-gW3@5+>s4(QAXE+mnE}=Jl4a+EFS+x!@-5jz2wP?>#cn)5; zk303mCjm~2tF$85G&Q8afZ8|NrHC`vWr-UW zS?q8J-K#N*+DMgSdt_p-S?nsIVr`{AbfR{$03#_?B(&oyVwm`RDbABE&}%lT zP-K`6?EH!M#dA$oD1Q7PPET%1+SaoO?0?xDqSfZL`DwHsnOD!093o`#EKs<*v`TBr zl(dU5`m|>mEY49`cxz+#{knUF@HUhSKdPzQK0agnpURT{nRztbbSBrt{$*RpSV<=M zxz89z>-*dA=tV+W$Vojgxj*a35Y#nZ+nVF2Sp$2enLab=EOW;MnzEGA5&g!&ulsL2 zzpUCbczuQZXKW#V*`-(%G^tH)R5?KVy19>XL_3Xyp-lKuE+S5@|wNL;@96P9-$6RaNUy#e_@ zFW<0|mq?Va|5%f+I_xe6DyQ+5i(LmAJC_o%JN2(6ZNfJ#Q_1KGGT(hYKlSynsTl^0^%q8jy}pr8`=# zVR!RKs2ZpEl_bMX8?B(eJo^FMUpjz}X>>z{y$&kR46jBU0jYibyz@K`4x|cWTk`=| z*@LN?O_IcV*#qZ(!F}Vo_q@wC5fABcfeJ&S^pYDaLL=;G#N zO=2JlY+)0DotD+A8+vq^>^z!`&i?rqY&p=56nd;54-Wc*X0OW+2AZ&HH#U?!3|f{_ zg&Mzvnf&MXpTo%r*DCEDQc`T(+X$eQs4EXQPN2uKn_e`3s{*rQhX57E=*M})SZoMR z6R$mc-Ou~Y2dOXCGZkQjYCRb-2ou=dy_ztB42a&5ktyZ`OyxK9yasWub?xu4@88)a z@R=M<*9r^~tzNFP5K*UKD0{`yDpkHmcGplQ-6Nc06XP2D@oA9hf!j4jL4&+$CAQ~? z&6!dHAwG0Uc5bktSC#Lr3SwpQ!|?hrB^J=*ONZJEbn()M*=*^pu(lC!6W2&Fb&PP7 zvKtps@3AE?8Uh?J3-f4o;cl6AvnfB0rNN$3=>U`lSm2J2a49Bdjbcc}TIne!(( zwAe-kNZAZe2Q_k*Ed*^2)PZKQ5CVlVs!e#5_J}GM5Ir6&Qq9%ec0Lnpj%5dPvM@bm z#AANnJ!aS*$Y?Yvc6S}SYph_vgtf?Sz41ew4qF9~b2>)u%F!sW1m42J_MbG+)tXdf zkZDu`$TllMQoC$*#nKl?5wiD?GePeE)E~CwHArJ4N8X$_?lk= z26~&qh1I$P>JejVS!ukL$@~MOQQm;TsQ4Ccg_2Bm#;UySm0K#Y2f>I`ur z-qk&dUTan|I#YnmbCwEfk4Wny$#aTEE;0Jyo)Kp76(Ur0z*R|@hPUcKv!hl|Gp4tc z4o}`T3ud{a8m$l`(a`=KERYjBytZPKF5^3&x;pDZ^UoE>5JJY!um;dwc6CMt*14SZtru z4ieEyikG#x4PXC(HGhSkfu^O=K8=?(;0)(m zwqwCvm*>MbJ`-sTA^E4iL6qZH3Kv>wkl z&>0VIcBC3;&w{cXMk0#?<9mR)b~wnC1BsIcb??TN)?O>JBsgxjG3&FN;%-VsGtF-D4) zB;s}kELaOjmfvS!VliujUDFQX*_qZh;9Vo`oUncZY*OcUEZtD*7gL?O+jCZK%Oh$6 zBY_K`W3K&}1fehljgQN1+q`m4ItJ1?` zONTaFzN`xK%Joghu@#IGB8C|*%R{FmvFg+K1weVFtXff+c;Z+c7zfo_S=!Kx4vJvE z%J5i{IK6zGjCy$)fr+4vQWa2&0)hp9{6M7DCNcfi=4d0WLc?7j3;pI z?spXi>g?%J68BzK?}QLMSp^+e&Of+wd?TZh-jMHNr_`kDD>Ypv`lw~OnA2wL|009% z<|0b;!niUdoUjlfXG)~PLk82Hwq>1BYqj8qBQ?#;r1s)>!-(tiAP5Qi zQ`?H$YtF2mS5IO>TH|L9YDu+d*=V|px%_HT5d0YT^DvFL#SAaOtEJZvf}rcd&o(~| zf!%2E>YXN=rxsKiVpH~Or%j6f5CZ~B8&@<*$f_|6Gu!cYE;KWw6ujUSgX@Rmg)h1PfH|dX5Y^*#g zm^w!juu#lb;knZ9uMjOgTPm1T(dQS++gt(o3cwQmmVij?;aDqzK~!;Zy$Vzr@_q%N z9Kq3R1GTh5X!!08f3rA>?i&sMoKrQX-irk(msp$l-J2C-CY;56iWmZP$=s#D&GCK=E9OAfb!!T{G}nn7e457 zKls7R@fwVugqa49nPHckd~usPR)}=vs`q9L5!;u`VFu!% zw?K1KzWcV+V8F2$8;jx&p?7Sn5B8^o(3Dj^e_~?&*o*?g)&3}G=Buq%@7>*cLaUr7 zkxY0rjuCRz8Tgs9C8FV0=pNk2?B1ps-kf^*`s8e0=^l>Dh0^N_^!M1Bv^MWIGXJ#C z8xNJz{sZ&0N5h0v%ln$kG8O+s>&9L~Ym0TaH42)u7#RNik0SDcWuQ&+3!V^<{Ph)f z!2)T%yI~w)`ckfJtgIl!1TbMM=VC6~BB16r*#Azm{T={afEWpF4XneBgH6voKcgo~ zw6?QbSXFGKZD@qEwl248Kq*n`${Ai(nM@16?ySnp;E5VYS;7G1)37d?)Ljsn36 zm~YeMD&o6K9&17V?XBM(t~Ps)j5_+oUroYqcyI=Qsc#Aj%0jitUPxzE!+;D;_t`*fKL7_=Y$i;=*+wOTHmO zJ9z?ReQ0_+{(XL413lYh*-k^ZVFB`pItvd511;}F)_X!b^;H5o(+5QGDuK`^MI7AA z26v;A`vhG1xtx@4^N1^5()OyF9D`{Ip4Dt=^5twgmegUtlAgCPRh?w$GB55c=QlYU z&nKUnlJ9M+?ARb|%dqN;z%dRYUn}k;rg&3IBgP;ZD3UL@eZ-`MnQ<>-D{S7 z`A%v=Y+{})Vt5*#UyN;a5jjI8ze02D8I@C{2)Uu52?#RRQHOYPIe+iYpwNTYJycZIEW^;I~SXTP?@NQ&5sC~P>=zbq40e=z?jcIrK?ruNQ!t&5$KnTy%+imFZ=HyZ3} zEx`F+njJD0l|TfFS&1q&Y5GNu)5*y)srh|XM~d|{Ap~Vgr$CAsGi!aTrJG{2g1L!u zP1{tBY`V(@9?TVn4!E#kV^n@2x9~k=w&Z|lAiaB3oV(b%2vuXN}Bm^gE?1_q^0)DpLM)VSa;BNO3X=#CF74vRt zylL+KW=w>6dNZtl?yfw(1U>NI;c=rCi4(p{{;3ugifEnL<~bfh6@(%~#pz2qBO6jq z{;tmj#sQXUhd+&iWqH9sZ(TxS_jG9&{$<7tnECn3~XX1N9Ll$S=d5#?gXfhSKpr*>_YeFLV}o~voKN9fO27P^&(xv}s5yxZmU*D={|r;%u} z9Bak42~Js)fNG&vaa>u<>z+k%Akm_9JbLlioHMz2>gMcA|{?9>W*~t*}!j z&P<4?u>B8Ri#^Da)Dh451wXkzUD5btr3EB??MEEB7zLSCFs|JDfpb4t@{F+W@8gB{6{zSmr-7kQmBgT{@f%W(1r}v> zb`?pX1v3nyVPBM)oU&4^r9c={mmDtad{oxc+6pG+YY>6+HAW zZ`8d#&=^j!1VngCrO8M);ra}aE6fY}VaFF?>`7LXfBIT!h|F(Uvhj@H)wY_k#?8L4 zi&Jn*Cj})$&xtk)Bq99cVD5*vy!u!Z`!8BoBWII=2dqlWWV%1j3vmaG+F4{rJ$Z-K zJOKh#hE(B8*ng{64w5Ds^qm-{ZZfR{{a!NaK);9K`!(%;u41P7shrqb;7Oh{j3t`* z)zdU`nYG%_G|MVd&a?l#wyQo|@m44}TC8NSS#P8*-&3tpPo^0do~!)vs?iJh7Uafz z0S>W-BGc_qe|ouNKJKkqXTwTn-WeR);8Y>&5?wSq#t>|PT85_0{iY7tYkKsY;9yp6 z3xY+syeO0rft-A&VzIBRSfltkXo~lmcw)B&wD``k=K;s1*7O5htbGt^&R10(1aqu4 zuv&A*;dy%hmcp2cqIN0zFIqo2*CTnl{Lv6q6`Jp-&i z1y-4@P!p#<$d7o@T9MO^E?;ZoPWFLA3dH#^%s9bMnJG^WT<%{oeBafVH{SK}HZ+E! zl1u1LQv4|I;I(|mDW|N%VFM!BP!ho5lIk>nHukT$zix0(%1j(WIx4o8Fpv?4n zMPym&QF%TCqS5(!SS;DXTd*Tnk=B2jHVw!Zzb`IY(>za)->VmwOhM2hYs=uT|K#(| zE1=9(*Z7Qex9pK;oYO~N*)BBOt)0qJC8YW{#b?(P{4Z9*Z4B;p{rZs#Our{i`5)PG zchyrc?G)-hpDgBDS1TF@Y=!=L1C3rG#V`yg2M9GW9ElMeOb-cFnFkq&b?lcQ_l?S4 zrS_rIRRtpb3OJEmz(b_D1|J0^j4alg_QjeIHCBJg@;KvmZ3YeQVf z+QLs#Re{fhW9(1wbBxG{$sj)i9KmXehFlBo1bNH8136LEmE(cpH206k>=mT^{C*fl zls(lb#vAyI{O;sovY`-7j4|hRfMEl0l;SxG%Dd0hT~?+f{@yC;WmY3wk-_tN66?C9=hxIX^V{L_Fq(F8eO&> z84AO!0Q;C(d4g{K_L6RJM&=y}&yCzIR<{e_k)XY^18#K4m9T&vNJ}<>NGs1n9GFE2 zEii|1MS6ryt$>7X8%36&C|ks~h(^&Vr@R|MI#$YZLH{VUw`pWxtWx*=nymjd!!@C7 z14E&mCL@Q2w~}}t3a3Fd)~1dhSbBLpVhaJ|+3wa@e!6@9?b`LXJBn~r5p!i3cRq8~ z`~Q)3qWzaH(LQQbq4;YwOaH}m`r?!SMTaB=MQT3l;vb>(}E8X(TP0&@PsrZsZc{V@HOm#39>U_Uk+Jbb1{G8qH)B9G;Tn!8<)ryhV3#`mVfJGz% z{UOUJAoyjLs8U-ZGV}-RhB0Z+m#4m9XYVNh0lCy&Yk-WFFtIPX)Ln0YisNjs(21Yq zwz$8$c7- zR)xb-Dq^{1N2_iM&F7*bQLVEjyD>2s%@TfH;F0y#xapmW)#HGQB^XsTUDvC3HKn4^t#aWtU$FPL1hb;CXqVr z#9={a?368gVk`_Db$;~j{e_SVqFcrv^~+daOk`cfO;%E~8(N5~GLcvZbHYeKM+f{s zl^14B(!Z3(T;WGqEh_`*?oqhu8z7>PlHzND^sdQPlM;&wN*Bio; zOGlV`*4AC|Sd&Rn&v&(>XKovA$^LeR#PoSN{o@q0@aE8goyeTo%L!*PISc;P#5&_S zrw(|lvTI|s1}<>Ic_0L+`otYz1Bd6Yks$-Lr5tgb*p4`dv}5w&^^M{ZA5aJ0$$!P+ zRqQbU{&q9Dyutm&+H`<>iwy^0w*MWt{Pjl2hTxLb{G*D7)uCSD24!kBif&(M_-Y6| zRD_Rk;hL(0tU?Go{i)=hZ2Fu*d8gt9cotTfbNv_MA z$0xSqb!<30Uue&rXPJc!o5A0~aqHgrE}7HNSw0KBESfv7YWEjxmYhWGC%Rgdq-Hkv zHr~b%AYnFVkfwuh(Vsgfx8~M3T$64acoM^COC~NMQ`?tl81yHMO%y{t&!t|Ztx8{x~TE5q%N~2qDAPr!tG*K6vv_5p;UjAgxo1G_Grj=W+%GAd0o6Kwx zK=0JUbu~wCm7#8l$307Rcejg3g2!;UYm!~u^*>L`cWnZtVVrGIGOrC5y3)=mh2h)! zbotxPk!;F5Ln_KryIs@W3kB9`QTI=^I{Y$j(KK!Em~yiuXLA`-!!((|DlZ$+q>zvo zfFNZhCS71t85>}Q(i|&yg}V<`%Kp9}=Otl4ub#}5cmjcOidvg>2!woAxe@6Rpxzm- zn&L_)C4vS``hGlRZg&Nj*Yhj)wvu*GAyVkQ(8^Xh>G~T)@hOe6$i;^&$!~ zj?R6r2+$2I8YyL`)!_9;>~b8VwQrZ1027?J*eeHJem@_{=xM>G9pZGl>?IVOdDyeh zI^GUd{dG%-d~4Mu{fK@-yeVa>Pd$V(=`0bzBLvMH@i+&s?emQ+tCJ090LO$`p)BAQ zy!4IMywf`}gLRUs%4mpnwA^)5n4y5IegobM$2`s75g?4Zjl@yxb`VCfDwIOzK8r?Ma0wWt0L!{Mw zrK2VY3T81!vBKz491l_bQfDB`#?qF5wDliogFvH}EAnyOR$Izv4-t|}pz_u+IyWiT z)|B{?IICWqY7>gB$ypGwk62?scLb4@e*PiZn(Qapnn0ynz0*CmTpKhkUiq2Io~9`c>y-e) zQpu9v%Tdx1kVT|Pp5tz)3!-G4v%H-rdN?Ee`V@tdSrOdh4Dk=LL<1ut_N>+qSXKoj z+lMTv_QdhrR8K}i%c9tM9S-xjCR@PfB63IMB%g&Wu-uHZJoF7W(JQQixu`~-+B%?U zvb4krkc~q>s~C4kKIA=drgl&}0u-d4#k~+5wt-3i3iU#V8N!%nLCgpPaH`3-+1;fO?Z&KZkv9q zM$IE9yI)yB%|NNJcG`8EL{4QQW1QPv z1F}K&C*W2%EG9@kgv(f^3YMrQSsA~{_xi61c$fymui zKUYwA(v4pztTXXnz9c#g+zM6#KiT^UcBuYHrW;T3G-mK7MD<9y;83K>EqZXbqqiod z=iYxOfaX%K)gH1yOiA<3M3>NIN}+(wQzA(tL4hNZ`kTgRtHZ-m`Gd1P%FI!z&FZ)x z7ZI5`pCk|zj36IOXMS9Ph1*QumH9Fhg&oa4zFQl_bF%)&g9fX^Js{9g9@e5AV3$Z0VGU?}f$CPqY~&+3;Y&KG&^>TkVhD;MV( zOm9)oj|x@WA1Me`N-5?;KU;xOuxyCsbE($N?=ZX|xz)59Di0a8h6k~6Dg*=C*kDOc zBz0BKEM5)(uW>x@jA2xO!u}z=wCmRJc7(AYmf;$6WGfd*fH*yQa3)76PJLIEWj$7><*?eyYLJX6JTE-7>z7+36I3V2Zn75~Dc`HFwBT zb6De)PSl~86`8Ss!9gzIV<|n(^gDqN-WkLosOe|}JyLhbDh*MrWZ(b|%Ma9Q9w>8E z(Uje`VIhCPyvl3^%(|O7DdZek?Tm^-izCLgB)94HMHNY#efU*Nn*4VYKrj=4T4$gT z?zho!ZQFn1f(H6JlXSmcII%B*EB^mZ8#FDgY|T{TAA^xWYUlRonkWKXoA*_j95KRi zY0i|vb^fElV|^gF3l*~GG@q>{2C3<`CS z+MOmvR-lC?w;Ky1Mu9bl+vWIrDv$Hwh2Yy!v=CUvpdK1;oy?sHeUF*mxdLvAv@x3M zsM~5cA8ZPUJHA^xgDr;5(SZ1%;qXn?GPsVUQ%QIoBV>v@3w;vKGWF&d?x)0GMyLlS z?kqi9t}@mZb4`66XzaJN^QvXP{JSb;_@#`b?qSi!Moy1XR*=sG(5zZiBxkC$ULlq0 zpy(VfV?taiyy*)kWtWdqYQ~fx!WN?kpAUcfP$U34S=~GzDg4(~QOYhk@%XQhPu>qg zS$M#TUB6Yj=GEFARmi4YX|1N>ou^0&l`W;Tr}JC$U@O)G*7R{d0xH18Zop^O-${&DI|G zsc{h2hjwN3T5cFz;1;Z(fbCC%@0%)ieb@g$`VC`#bB1;DF7Fyiqt1#$EA`k{ynkT; z;8+sW*3S!f%F7&@i4<7^b@10V`$THI@7>%;P5@sg@L*<0@phvKaao_}7!0`3-`cT@Yjr{Z8hqPwbR7Rlu+jILvImTUMZ=VElt z-{|9LRQA(k(gDJh|9;)E{Qp5p0?|du;9t|f%CD^>&VTz-G{bN}YWiOcB@}@r*Ry5i z-F~2+Aeyyh?uR8lT%nR4oV>J^&X5cct%QasEDxA48Yh(mq4)-Cn9_AKdm=|Pi=FP5 z3&F&Hm5<|Ejj?Yvu4RS=1?u5%(|$m9dj-24Bz+F-03+NdXU;) zl@rv1zXvKi_@^*8W5wXH<1H6^qOZ@UUPSnvWIC7L4+vh_l~@{yU*6Gy+}68a+xq+pHtZPX)!kPijazIrPZmI+o-V(U zN2!m)5kiu@1({W1uwCj+jXqxJM}g-8&Rp!wEe`I6Qb z$0XqTD8%ze5+1QXGa4&r6?mS}WDE3rKBhJuWI?MQ8`tT*!K)&(D8Her>XRdf2ZQ_u zKZG?uV^ct)ctXes?0e1;MuS8p+e;%yPrr>t>x>{}ty3@hBoADCaew34E}C_a?atk z;t`V>+h$ObJWvd}#d-W8` z`sSL#?Ffi~t#8268Hya%k_e39u?X1lbf$PpJ}goZOyEGr^3oRvc%rH7S2QKIz{7wU zr5=;MwN~w_G}CLNu2&;Q&00>?QVPknhtzOp?(mdy+ri!nX>W<13H} z(+iL6SD&Nt=&hgO-*$1nZxd8K?}&*LWbQKe&rpERd}~9!C#5v4zPj^7)y$!oGdB>q ze*)#T+78Z|Q)1#9Df%k;4e9$B0V~WOA`A^joX*dB3tCNqU*UH&Tt}uV89Vh89RhLs z+byg`ImW{y+!rJcRlo_jr!UM+sDrgYhgU>ZM7H%pal|@yf>fI7nRhcYv{P!8T zDljGNzRs|ywdI345hhfE?gYtIaHrtxIyFH|?*N zay+N}M+d+=dHOw1M~b2>pn4_z)Zp%Gm_pj4cR3qIhIr=q%OD_gQFexFpAe;U=7vaeBnvS>-a2Irrag3dk zRIA~Ii8S9SE-opsC@J({j|qj2!Y`D3;~Y5^MGGP20P`!L6fQkGAW0-4aLoLc$m}Yj zo5G@1_F7_?d){XQFV}wM9jr)x1}YIVGQtx2`dwP0A$nfyjw!<79m0_?77x#hJQz3C z63&JGnx2y+BRy$1ZWm(UjY!h*9Op>%pYRM)M-Ej?DQnzV8~rkgctwkjM(O#+SWoFr zF{+1I+mD7nFtlQfgs%^CC7|T|S&?#3Hj6_G0uhY1T?zmWe zJ!c6gmt(z<%U$|3B^QzWm;vh;kYt5UclNXRF_^C_INb@{*aAOzZBrP(>I#8hON{R| zWUCxa45pVJg5Wkc_>*+&C(i#C1ON4MFk~we@t}PBrcNGj6hjQshV{l+^7!mpu(oK_ z@oNwThs{SIhTXUU6PL!phh?s#@I&2|vz2TovzoAWTgk+XX+Q+-74Uc-Sc;`B3W(ts zGf+0=DErLY$?XwZsW!``ZvxZC6p+{CSBqpmx6)TuRuAYa$c2V{%nLPy|Y$fdIig@yfS5G(pxvLg=X-0YH zdk;paw!TY~thTw!#`B>PzrRz7>7twZjNAEZ_LPkxaqLBc0#^QsIOCbV@Mv}bgOlPv zesgD~N1_Odp%eR+0wJ=vFQ7G`P5|fR64Ixae_e*+a%&Aj+0}_W-8T{MnuqZ~{O&9k zg6~mDpjQlx=T8q@_0;ZyN?|d?O2CCCa)=RQP$zyYB0d$_q)yfjN7ZRHT}Tc@ml zKylbX;+ZZ5YR0txSx4VD$lan6`-{*F{oI7IHOWEJ^`{xyBi(Vc>N@=oKgvEpgb?8- zW_lTSpYIQ-gKpRj>iGiY5{tnu|I&(|U|)cQmtw9{ZfE4lcDBX|_g3(h-#{u}hK((b zxlWs{{93TYo<6Hlj-J&D9VY6GFuk{Qcv)=Fe#?)!oUJ z-6}Qp*I>iG+Q#xP*Q%}hfXe$r9=SM4Q6SzAT$UA3>!R4gE!ZpB;4jX^VeKLvLY6#d zO4UD|0u}@4@2`<(8D?@+a+impYO}GB>1>o(*yAaPZtD$)DlC^T1!h{;CGB0j=9B&L zF$0A)Ri zHy8Avm&(?bZ_3tqlan+zdy=y$jS|u3a($@l+GhWbwTk8^F(+S*;w!Xr#hah{p(x7k zJCE|rSHp_qo-_cDt4irp&Q(}WE1gH%7~pMv&fc?VYsfBH-{#0MRL>|UHCs~hYM2sJ zmAqC*W2qrrRZmvMM^}?aDNGFJ%h9h=M${NV=#7|^k|>R5`pjrvY^e#<J z`A@8gv;2AIc;HdwObB29&BBt|^TohxJpN9RE_Lu4$Hfm4%gUD{!A3_>n@U?G;ZFVS zk3$!p&R+RZDrRC_-(WP+lkSuXIafAYeNX7$Ue9SzG?@s?gl?yS<$xee8cQ6*QpW3e8}f%hysWH;k#9nGPs#2&z)THGS# zA0~!&m#xh0GMe?~E~KCJ_eW87vJ&Vp_Bn0P!?@+$O2&wCINO#fN=tx-Adf<{$F@<%B+EW5RVwSkIDXWf3&x-m|wWq%bXPyX4aA>9)YWSvx zHvuQy+HHWgh$2)m3L^H+DYbMKie*jQZ5<84-?{EI`-31JRM~(A&C)Ug_cg;p&~DBa61M(b(zO>exniY}_o}t#oS#M<|INI&|M(Sv1m^F;hSq}L z-hHoWcXj8B>EdpM@oiFOf6!x5Vh^f~-&3F<#|EAKa9g>?XT7&WNNhktxOAYZ)~SOf zO+Lvxq*IQu?0vMUBvwKhI$q=oR9OT{Z;u&LyFo$|r429`HgjoaTBS8_|2AA5Yjs+c zav+$fSrj=gNzjOb9h!qm(a#qI zQA?IF6#;&e3X6qQB485Z)ugccfYl+T6<(KGWb&CzrQ)#Su(J~)&Uc)kNaO=uVGsH8 zcx-$1wLm)LEfi=Za$YuFjAynl%*lVs_uH-vhnar^5Iu!@Bp{J$ zat(J%5Y4;OOo%_1HiGJv-KWV|>b0ELF-#8SR^Qe!5n-jJ|5e!$E_VMFbcANeH)iJ# zjmb`J=u1m9=&ygWYyS94#Lj zk90hcY4ZHioPO2w7iL}WOR8_W7p@-XMHlTI-mqESd~WJb^&Xl+fk zBbBUOX4ffNDo}i;QvdqYdsf$$)Qmzs5=T3BlszG`W6AB|)2v>{b%~S~Lz$8~bw)^eFOE6JA}yCWu`RH_D!rH6uV|ca8!kC-sof_y72_>u7A;%0&Bg zL6Dtr#bqjY+$$k$S>FZN`En~jKJEX>k{vN*wr5IFk*?uvH3^t2Zh)Rbo<6F<^bL#1 zZZT3z|9H&!okS~Mr~7Syo-PIvMlbg>BO@(5hjx1>Nxd3Vet5zO+EmSapIEuq)-SSO zZivFBP%8q6s)!L>C}Mb&*bE}yqr%6tO@8^uvpDM*=QzzFTl3hW?3lvnbdo81XgyXL z(p2QhS(p4ui)8z@Lgkk11%Cc-Kbu0TWw1ppQ1T!JT1a=kFfoZQLc%e3^ zF$~D#OU#VN1d0c0>@cTJb@&of}nc+Fv5tbBktLb)Pq~ z@l~^&phHA^IEBj5JNyjvJHp&B9{1MflBB9bN_Lt~kv=(Nq`g}C0kvx6J^8J@BfAiB zGo{atph=l>k#ps(6n8(?=)q?pAf`0S7fhdDKv!W|&sk~zUa&ofPh@14pGSa5(a{;y z2HphtiQ)-e>OAY&E^s}F@O)|rsCC7Km~08elZHQ+;Edv}w^CJqB5C50Pya%Fq2)U~ zW6r&IQoJ>9bmMAISnW9FjUY@H2_=->5-q2n7;B%gNFTUvHc*H4BknGR6ly;icF+ z493tDb|9bQiS(Cf$-|2X9g^ugQ1F2G*N*kjP~HKy zz-+Z~aFPvBWvC8vn)Y_$*ClE6^b_D!m)LraqS%A~o$1<<#C(i7sdEV5tJy@i5aPY6 z$mw$JvCD;LlGZ7^#52KiZB^V3*heFab!=qYNFN>FmmpvTsqA2oW;VCS_1zKl_`t-9 z(5b2)A+ggV9%^{kck!W-kmUjydcq6H>MjNHjO`Nju`mj1X&TMpkknta&IZ(FtGZ|X zkuH1RaIeUtdBtD{F^~&AFyn|Yiii&y0%f29k8tjn_fm{K=o$d}gbF>78JJfzVtS1w zd>IrQfk@j?Gm~|vHCljD$JP>`vtAa%Z4U0{+1lKyqm9o!dU2dYkm~DC=+ep;dXoUc z?HcT=TPW)>-8269-W1=#d~N18cBdpbcc;=sguV@^WVnDmYJl?1dI-;dwZ z#yQa5zf{~?(Ny?=osP(13o3vRd1?q=o?>Js!Ra27Z2qIWBtl?=tOhC@2YwmDx#ZSX zv)R{p+l*Hjvekrm!Fxbh3RI6@w@!ByQ14ilQ!Ct{VaR(UjcsG6d&qP~*&c(l^*+sK zd4~}mPV1o-V5%jLSGH=9%^g<^;VPy4RlMqw;Z<+@tlL8QU`F zxI}o^t)5*n>W{(~TLIA*ON=Pq?4 z+0=4drFI&Et+Rwr=-eYTMlpDUxL9f;R_x{hlzleJ==O~QQj3DV8KDpzWY{QAicv2U z|9<<{v}&~pqfnL_#Sg5D$_i{w!G*Pppq$Jb2bPQuWLnnv=yX;1TKd|cmGpFi6fYY49wA= zshu`Ln!ZBSu?^q?5X{ayiKcZ!cs=PEVgoO9MUUEt< zw|pJ{o@SDWoBU1(a#Kjo>7TF)lBL#IM;N#{OrC&w?$rRn-+q;b^hlz7VzQi!HwNnq zg1vIE99KA}>lfhnT$K^QS6jp1djMKNss(_>^=63GQb0LFrPX?ob)7gn&}IhE7d5;~aF0qPJqBX_9cJJSW)Y%N1N{BdbM>d=8Pi(ffj>&h z$--@zLsBs#tpuc2$ISLuBJHfHXyQRT4kXnl+vbb=Eoi#RWDCeEoR+TzJFPu&!QNt~5ev2n0*Qn3a6!XeEWz~RBc<4get;1M7;5aF!$Apc{sr1*U)B20AcYlt8q zNCe*l!v9{1EWp{^&V<3(+R(|VN(0_oTOH`}1+1_1a&aNxj>tMF_Ml?3z+a8YNXZy2 zQYf+5i(B3sEXz`&8DEak(nL+jOmH=({nH$HXAVzK?HnX@4z`)>TDQSY`U6l%u)YEX z`nTc_hFUgWEZDh*|26m1nN%_c+#7xP6z5as^?T2?cg?>n@5g2NOsLvqSBP6!9unZB zzSKW;s83wVfDIm+oLC&}!ENl5{;{92gz=_I>G^ERb36=_+fx66*h&!I3HYcdEi8%w zS5a&^sHK$b-dZEucp84w*uNu7*m$aTiP*fCdQmeMZe!=Z64}1!CXW&5hI`DP)e*mn z_y0ku?ZI3bO-(kz1aA_#6*1#^uj+^$6TL2cgGN&Jm>klzDp#3DvtoiMq&e>VSUT@&A9Z~ zZk*nQFoD#xU-YSrIL}1yQet1UljFF)1cQ3-A$S3DWL=CBE(gnHdL@2x>4HEmNOl%B zIF$YYR}zeA^7(>}ePdUBj_g|4XztLvQ0}g9TOoTo)=YfKwKi`H7j=sO^$!aQKxNkQ zQ0ySL^6kC3nZ6*C2mPPX)!)Fmkr9UJ z=sT_lxWYB!Fdj5M6?mr!27KTY!jnlzEb0-Jzt?N?Qz1+EIY5=;LJ2)c6l2}#QR1&0 zI#*T`>S1=?xx3@hOD1PAj83`?C434>ySB7-=B7H;&@lX%OnZk^jw+na<}}Sl0*+d` zeDUSxzOk^YEzp~)=uf)jpz?<`$%`xHNAQ5;G%D}QKz64;^R>z`MhMVe_}rR&TFD4e zcw*^ZX0rQ^Ia=B>HJK~mpO33r7bzF zFngYz>9QNn;kc=~+TWaIvD(po0+4@pGm~o45)pTVgG^W=z~V#Z#9L!$$;OR%Gk#ei@7Ww)Aw2Z})n0EF;COAU_ErC;P1mA_#F@!z{l6w$Qz%2f1; z_3r$-4>ULc*QTL-v85L?Wt}rAI;{x3LZjtb=d!UTFtUq&K^33;2e_5g*yJxIMslN1 zoN}$~DdS;|-j7^D;)s-&fPHcm^Gh?l6-fE;PK#_IE(M9=W*}jBiIjqGI3|bSQCQYE zdFW-tf^=Xd=m>$Qrk0!@b@&$?TuzrBOSKf1i?;?xC7Oy)j2QV~v&mer4u$I8wR;^m zb+-NQY(~z~=P&CVok^pU;HZB?sXl49I{n=&)MI8bDfUaFe9EnT?pI`sF{6YFy+CcH8ZC=Z=Q6m5Py)|13bgrZ`S+)%?QO6*mlOrP@iw5lcl%>2Fg*nelh^K_0FHui>hG&)>i1I_bWiSC(fyT-E z_!$@_HU~V5i8K)-sr0*L=GGmh<@mc!yU-b+*1n<#1M?_KQI){jJZBl5Ptl~v&CN~A zoh|jlE3R&|316`STfi_yfzy^GV6!izfPFzyg8`@8xl*FpSx`g+er&c;AkCS%YSBDP z^4tRa*dP4V&@1TrYPyNPSVekw)gj-<_*MJ%P>$9svB&!9(e1B zY5|uHHo8R^(lEX@4zp}CB-e}NtWp)TYPYHFBuu&9tkpDWJPMR2=y>#tl**CsI#lZ$ zq=tr*(l#`B4t4h(hZufOCpbl3S5Ywq3MY6I47RJ4kz!`oT>X}}JfP2u80;T*xpT2l z-X>BRTWFoI+>-To=ddcl=`Ki?X(--cTLS8e>IVw5e}rfa87@9(x^zTHxxQbeJMtgL z;0YAhJqPRp%ynsM4)Sro^2S8_TjzfhkbbI>#MQd->!6o>?-Jt~nnHmliQzbo{l$$8DzbceDEA z=_tW?Oz1AG)9v-?UQdw*v+Kq7>BnVNr4{*Buuc9?tmcSYL2*!4LZzUk?JAI`&c6hV z*?=Z>9)EuBZ2pO|ygQ%42988zj%MHzjXdo~gR9S(yh*+IxSXaY`!Zli_d|!Jwr8=T z@(Lrwi&f{vX;V$?;#g&R;SKuH_R!;dC<8)`u3=8ul@ie-%Z|?eW}~`q7RAn|It|D>YhzKl*TFBhs|Njk`}4`^Ib{eB2go~8zn2Oc} zmS`TOwMLfy_pVYfY@IlnOw89vcc3((s#8OR+vci~@R@h|g*#6Pv zN=b^Gea}*7Y@-NWyF^SUwnEvJx@f5)K9fFI%#lMj>oRt;fgDHQl_9bjgE<9gxMxa; zQb%)GIqA5Rd`H|5*X?JjmNi79_17pY7X^A4%^8Q*O$N3d0oea|54=r<_ers#e5zL? z;tdZ$BXk##{gwvGhW0{|z2n$c*Kw+Jy)>t1yksdFHz;&=Z+(B9 zrflp~>-mqD{nvI3zZuPHXV$4mpIBp6R@jHHFMEF|?Sz55DbtN>r*IWsEBN&R!S!BU zju|HHyIaTe9`PPMka+mI_Pq(4ClA}&ev}7_I96~J@U!4)M~++~Ox5#O11)QC=QV!u zJsr1koY_=U)=)%ywSaW)+6FRP(VV{8eE_&suHW=G&#&zvl`m|A`^ShOW z7k;GNAXrJQ`wn_Cf{dYsyCw<>t-|0Pi5}pE6G!JaJp?T@updhkH2X&0aIrDgFWZ~&5pCZ8TN)emD{F3(1q?yt-RpHU9Lu~Ei7z4uIlU2<=* z9wP?EeFVHCi#zIZz$z~8$obpvO$clY9PZ67o_1VWcm9~$6Ft`iFMA^8&7rY9aQvnO zjwz33zT?%`OtW*R?5gRu=Hyvu2mYKMYnL1zVuFe{p!yBmvFrAgIm)>asO|DdV@%16 zI~*RA$gJ{8YsV$^iA#>i@>KIY55O0OmIl!W7EdcbtfRh6`z*Hag33r)CZ{)Fd8M*9 z$Qq8hId1BuZGDa&h?2780;wGU_737}U_syKV&>qaEgkn&rJVCQa(mVdYaNM`WXlQ43XQ5t(@rt7PF7c79PnN>C^r8H$`FJpge!07al`( zM}Q{mH=-Ri^Ozw&$q}^2gw~;nwvf{hr2V;u*(q&Yd>G5Fk=MYqKuDNDu8L2Wv&k~f zWvj5(@H_97GmT(G{I{B3@AyUGWn=V@S$6ZM#W!3Z!)&*`3r(H=Hp(E7G^R2X*@d7X zAi7x4ks4vF`pd{Et|z$eI54p>oP|vY61NENl&d{y&KbHZ{;CjvbD&|w zJd;o6*UUgCm*lV6#Cy|Mu&$)+673UFV0)HczT0!y)y?9(mv^*t52K9RTl%TqwvcC! z9W24Ws@ym4nu2|rrD=OZ=268LVz~=0LXp@At3X!4Fk@Y@Wyd342GZ^%V7{Z!ObhZk zr`JX_ls@aZglj5lNzwChJl+?N<9?2~?fbvcXdofyEzymQx~LRLagBHq1+LXUAg4G@ zJBIu|=oGVHJGgxP=9NiVj3Fu!z(bg|x-67wcPo!Ot;8fNSPm0Odbv2E^(e=$=PEwU z4bw-(!nnI(WZW2jlO*B*_^5Mm=?yhzEiL`&nsjcLkV81)w{NTJM#8J(V8i%OeHlw# z9{Yv)Uzl9}yG_J)fT@rp`X;b?!zBuq;sB#nwbk(e=$nZ_WI?;hbAB`MDiy?eGm%wV zG;rvD(v?sOMLV4(ika9Z2FD7MEEz4eQ)15;Ymr{}gk3B&q?4PbKf!>}?b9Zyg|O{9 zwCCO_oMt&bk8a(J!1sr9QjigQ#*l&3$ek)|uvEKYV!A=|t>nY})X4fyGSe~~8sJuZ z*CEVS(rp*aR_tCN_L{vW58J8^N+L#Lq(H18<57Mq$$t5BrKrK+3~k0aiylT|tdX#o z^2P)V-EAgXln?|FjX4dM)?;~qyQywRar7U2QvUi61 zPX0mCSH!}(HjDujlevi(uT9b>&(mcmgvwfre;T0vKGA@L%o^*1y51?jl1NV*mY3!1 z+Cdgf%hOiecqB7(%|oMuaW8e(-JjVOXa)UceYT86MrM8JbQP4qEIwE_Yy;F@N9PJ0 zkCvItFU~Ev6<(-2B3Nfq$8fF_da}MtZ{t#0EebVK2;GYa$PTGNE233*=Il{eqOn$E zFXs&sNJbq#s!GUOEJ5U~;rRMj3sNp&6t{77PZ3DYwavCW&4 zw%eiGF?h2QcjEizME2bPnj`l_xv#QL70t;mw zS&~7VnY6Wlgf%gPG7BJlpFZ+ydUOD7oW*q0m-le8?QWCF%Gv1)quG?g78?MmFK9|1k?n`lk~E1`tBE_gQ5 zw~zGB?^9V*QDneEx?AU_Fo<+>bIs1L`;YGmZrvFju6X)d zjJ`|U+pRG7cq-~BdSTVhyyF>BJwtfkHr?T^q1Z*J%AG*U{@~d9&<}#^xQ(Jyn+x4F zA(F%xx0G3@__Ay+BK&p!`xDTFZ-D8}Sl?S8=PmS+h;d)w{bvc_KJt1q_wHjGm@p%d zG!42%a+4Li$DrC4%CIrQ=iL|5E+5?O{8E(4DR_;;5n7w`m=<#j)h!sJyCC;FG8<>B z4DJ|GK2|W>2A`y=g!MF{cA7`b&rURuMjz$Y%Jj8ZEQyd`9r}U5Rkdwrxa$S!zuV}4 z27hitpJvG4mgYI2i4PT2Kp%zi@2C`XUNmE)d2^z*Y7u0eXOKW`T3aDV;?}ZDU!~B; zzrW)p*K%&GbYL0YLHMOQ6WgiaruMctW4(@8a`dl>Kp19XYyIWIHj%x+`Y>?Ht06r{ zRtt3gib%6cizSh>;$_M}yf?ZlfK^3BwQKVn{@ohaVV$3hC|f|Y0FLbv&D9*Kz_E>l zG)UBpJ}+SdlfGZF4|yaH8zv-`May}#8jv7FPUpU?Ns*%?g0sr;9LusEf}D>D7e%N$c;V+S|W<$TCMb&5^fua?+)NRdyRX82fINK4amuy1yFp=Nkss9>m_v7MFuHS0egOZjlAZ1d zjN9(=9r(I!h1%jBP~rD(V;)wzb*hz2!5k<2E7|psYp0yNc_!JbH?_X{svS=70+1n| zo5w>AYBoHmlzhaee;ly)P^EU_U&N}y_xV41&dGd?#7YGD$H{xn!Vj7 z6J(REf2T+4yJQYDVzI`VzrkqfmHh)#^RBf?N*j(RMCvMs2WPELsAU6Kpc<<}cG~abo@hBA-%Z$l&`EF$!kE0Tc_zbMT+*FxD&JsHFd=JplpH9%;yYe-g?IE1`Z%nSkl6 zQ%lad#2y{NUg?{FM20#nbCkk>EFCS!mxGcPIJc&T#1=V>zf_SlGS^62Y+bt7K!2A zg_D7H2*s3o)t=Tmpjg{P7Ri8n1DCi=ye}H!vpL&#kUDsarO}Bj0VHaE(le_L7lqv= zCe?X$N=nP|9`iyGU%mimA((mw`m;W{Lo#30z=s8ebTcXVR`L$!OH=Hwc;Sg;O#o8_^BQ;DFt=g=$|>j?5RJZO_7$F&IW13jtp?e( z6P9BMf?IM$29X=x(740gN@NO+CDJXtK;Q~hx{rhZ2F&uDw(*i|jrwCcj1qlKKi7%q zOe^0QY3-UfOg*=zdoV4N>1uy)jj$b+lJ-PSJ+3rYJlBW>R+US>gh1S^P!h^P3#)7m z^<#h@EfnJ(XdJB&3-k0RE*AD5gp)H0mVwl!oT4>UVBx`Af=4z4*5tE5W)vL_AkR+Q z`6y>bir>H+tIHVU^;qgF+`n%5cam55iqI>Pa{_6Wdqu#fs;9D%2?fq663XVu&}rBS z%memwM8ey_ONjS&KGHVI>UH=9Qi4VT+`|~Ae*9jv+&&Fov2M{=YY42QO+5#>ML1}C zQ0E)=&siw_Jhzgil(SBqVpa#wSCOe%m&|y=c*`&em-qj%HTcgC+(Vay#P%)5a)C;` zsr?DmR{pju{=~GLU&>WLhg1|0)K)?66uMD6P_pQ&`y2JT$3X`mCd(od1^U~4{?PB5 z@GD?F%V7Pa8flOW-ZH%>ru6FOefn?(etg~`_Clzko(vZK&TqvZ&;Z+S%^wU3kwjEy z*IBlw_5aN<#8mV-FNG~NL54hFgXo66Hh~HpsMDEU$IfYLJ*J1zZryOx2_)tswK+{x z^rGqdi=5`N1Tiq1**N3~=%Cu5>@-J7nBb&nQEQ`3(t{-Z47tZ{m+G%UnwUwHYLUZc zh9%C~pxEBs$83?#L$qOr^XP=i@v@1iXC%mYM16}W*<}zGr;efqGYk1uhC32)E!6=u zfq*>7VsB#zKF489SKzVQx z(?AZFRBx}^qNn$aH-$Seu9Dij4paGWN-eW(esw6?pxBNxXRj|Dk~fX! zyY%R7n_-k@7b%pMv4`Roe95{Y@gWcF&zYzK5iKQeE_<_({f zx1GeBtM*x%gk_J(d2)o8MFavHxkRk;$;S2zqvvy|ot=>`!0Fd!gjsO?6f=L8g+l$t zX&sr3fy2nM2r5N8%G>L1_}4`7#(FgF?_A3ONZpw9`;7x;IEW!%fh=^`xKgWvN1_niI@ zi0CeKj9>a)*1UYH3~)eF?64s4fHsQja^G4B-tj68+MkY!ox5EIK_>;cM1!fR$UZZv z&#k?1R+h{~&${VUWa-bKzJDB=*`)lexw6uDolK`Lo~B2z{Cv=zPex@8;UaO9ogv~Q zjWj>hohwOdI@uA=aXGMsTq51DO)HSz(^BYde~n}Ob&kO%8JSDIf))OY5A2}dP_ii6 zL`JwRZyW+V)lp>P=`~O#RyLn+v>(Q()a4+w(Mv|pEozmp|7On{@PLh4c@qxwgu11n3uD>5ov)b_BtR5Dr|cSPLxeKoC^Er0dVg4%#$WVI2u2 zTHcozuHPf=Fqkn{PkC1~h}P38Nin;Rr>YmcGeaiDD>=ajKBf%P=iH1$z zd35r!(%*4@K8eF3#!bxz4`+fm;0StE?$o#FBBhVr;l!G&rT{nXckOHlq)!mwpWk?0 ziv+1@Po`UVkLPduXuafOu%6h1E0N4(BFptjS0S~)1pde*i6rxL=c6d=^Rd%RWVr`r zQS5{Is;lJ4d={j9g^4IfT{w0uG0%5#U`Ta*vVAI6vt)^sh8LqwVpsBFWMX?3vM0Q@ z*X#>ZM!)I^pTzvOqxoxmEmHsO_hz@3Fh~z-)Q1Y#GpPi zbPn=*J8-&xZRU~zpPZJM`rb1pgG10?AYWAbZ3Jm1=istyPM%ksIZo5OB_IEumhC_= zR1#bL*3atFg;1@eXbTmBiW(EHI(OMOcV^%i&uR3RJDdYc3xdZ_>KleLR<`O)g&EE0H6ek`H(Phj zq$<3&p+Ii#jfTaymC_1N>|O)eG!Ff|%_#{7kXzqKiy`n0PT6c#15FtfpU03|&7C;SoK=(Sk1J;v_Nv**i$sC1atDO;4u|G5g z;kVzvW-0~YJ}kj|W0L~b^i?J?R(gp4<)3rM-#~?K2Kh%3b0encL0iD<#s&D2{bi5V=t!Z4pxvPt6!wp5Z1#-I=p z-vR@5j9Nve(It1{a&zp{*b)WMV`y99*o&9#eWJF6cyuzB@^;BB;KLoHw798dnOhHSZ0s&7s@;}0+bsEoKEWhJRC?8sB?Q5=*-#;2VavWs z^idkzQVLylsFOQ?eZ!fo)2ys+v0q-#lzvVc>bGE~sxo^If?8V&H>T)zWnl(#eVqaD zH2J_*s%VBXcf4yV4TU`7iXB~yfl+FWgwPa>&JqL7Au7{?R+1d`!-SM^0EWZFP;Tze z6b#5^^v;?cE@2ssN$&pLY(s4Xw3qdFhG{n5fr*31A4fP)4A{xLx<=U25F8XOmT8N3 zHj1}LiJ~DAOVw~8@tua@Nk>`r_O>_mlHcs@t!n#*Q3ByBVZdMo9>c({=oM~~XiN9S zm_qYFF1>cLeLaPnt{`T(_iB|{eY1tqPpP6_dOfr$l_yathtV5Aou~S5NdB8{5u6wm zd_j)362%fPK~D;_(ANE%H;6veC!UakaFd$fQdu3e-GV?8k3>P;h737TIvmuGXFed$ z{9JGdn#R06t{Gb=MAq&Q?+C5ze5WZMrr^Y8MVMIJ%i_=MsVv+gbC2q+xK34<>7}mr znGVf4+U7$~xrV**je2W&#_uuh@jS~bV!56ChDtfFkK*VXE}wwnKyjyd zi^?@xC9aHLNzo9lryOAfb=r2+T-N=wlPSuTt)PZ1FrER!<-4wg(DlCU1qUv9T^MI) zRXI`KV@i_Q0jNo*e;7E&io?X{QFhKEt0nEqFkZZ=815c*TyUE;mH5cWSupIxr{vH7GX zcyd8^=W6R4!QiO~!$(U=no=n-rc&6|S1nGAEmHs(bOryL=LvrJ`5ChQyiFh!KAp+2hc;zElY zdqv+yL~FlsiL4BHZrEr0oow*E8sSZ2lpwqF7rH4<@uCdTMsDe6Z-IWf-l5Akyr#F{ zJ~_UFsJ{I!?@_3}{=LaaI+PL(3e2+hCWJ`wi+S&1DF~9-_)PStZ&_`q?`e zNq|vPH%ij3N1!B;$C8zt%AYct6S+&w;|%;slY3oA`z)2~A%!;%!nxaVdc0WucwFc0 zxa;})c){|kSW%pbEh9rsl`|0Q)7_9ZQ0v1#8gkSh4u}%Pk%mK;A+M!-1XgMgh8^Yw z;H#mx%ZCG0he>f_G46N5qu3#RG_b~%arC8s|0-z{Go0F-@@y~gXeJe$)JndZ$Vfjw ztA=Q+)YOtZ9tzgk+RRREkyU1N53#9QV5A^#l*LKjos2q+^P5DU)tfxS&*NyR5x&*cMsS(LVQ8slVYKTa zSObH$H3TOk(En0w#ZRv1f_-J!&*#6jOHm;HLJ*RMznZ|bQaHupDamS;u& znzfBmmem_KGnN^%_~=-n;Oi@E>a2nbnku|uuiglkB%;beo3>J!QEMM%k<0!t$x!qVSnw!H5>0 z;g}wcY7B=&m_3Kc_bUP5q9Z3@d#&4y{;sIh1>325haP)xC0~-}b%^fQj>R^fXB%r2 zwUrxU27f3lqJAVi0xudZtcIM&SKQ`k^me@J-gAY7^~3~4QQ9M5y@?HXE|QH3lcS&q z3TVzA@0gGj>%#$)n~xBZ806L!O!k4KguaC3?;u*D<9NlpI7SoeL!GVgHHgbj!la5d zf&8etc@}%eyG56kmH^&`^-w(ri_J&@HP%EbpAj zXt!u+$R%2~u6l48L|tkFmD-ZgEN#qHxLg?4gLjj&R1$~WORfUZA;>?MX#;n*l1y2h zJ<84;AUr-fGw~mjzxdeI7TMKKDXk;oPd`88h=s6be)m7%8rd@oNLJzPvJx3V1h(RX zyo*U2W_U%80{L6hBCbdu;fIxPeHwZ3s|0;R2Z_SoBO=?tsWQCG<;%WB7mG8R!pnS9 zFTMoO5;s>o^d7##7jg-mK_uN?=jv1@M&bOt!me9L^V2=)a1 z$AhQD%Z4nNeXm=#E0n6;9e?9s`^$%l z*hi9DNdASkTbRH(dMV#N0*Om+0NQXNA(l(4#WI%$QH5LpW6nk@-_OlEO49qpYN&(4 z9%bx*-J})G|c`V^O}?^?C)eS8|8JmZw0w-NtWx0Laq|kPq;05QR*FC z1qO`Tm7ge8f>EY$;87N4qt2H1zup77QPA|r;KC_<{c`pLWB0h`;Z@&eSj}>}p17>4 zd|vmTmajpEYfJMGjfo+c8B(lptM@~OHxV&@scyjSa$K1!IH(iGjM)nfkX@CvG9otu ztxIx`Aw{%u=>giJ>Ma|U*^D^8{lWs{=c2!ws<@?bJV+q4B0>(Uu_2X*`TRk=bOJRJ zivjHr(Zj5E_br}tjfwIIJ_Gg?A@yKVf42-&#fKZCij;`We#<}TWK(A0cOJE4~mCY~e65!%*l2nrVT>0~w792D1G4`9wrX#6g{|m!b)l3pp^9 z!7RP$ljO!L6KHL0Q7!0)Jhg2k5+7yto4wYY;KE@uYpsm3WVi9dF4Dp?@a#!+nJUh? z7?%4-!LKbgV%ht3@|HS>v`>OxVj1{O&fF}2$5Dpng*9<85B8za@AC-=ysJ=N$Q%M3 z%!Kg)8;i(pPDTIpO5y@{)<(?zft*A=RpGnBVL^A0-ST<^lGT@S*FN~58^Iw~Cr<*M zj+y-yFLt{z4P>ct4JL8{zLf#RXgRy^e_$CLNY@CBzd-*ij!9_a^lcX8e4tcCfoc~2 znI%k1m4VP`iws+?i%bs6+5YU}Dsl*Flgopgzc&myJ957SV{m$wEKJiM1k&@6>>`-f z4Nf?MUpgnb5{WrXIURd1#=~d(MXG{cQ}O)lK!t|cP-(}|#{u2mx+$|g9AG_6m7S>Y z>`SYRUzWywjHvE;wC&UrEXBhZAg@Q?Vwmdi*|H7e=6@q4Br5Wkhk->^WvR?r?<@p+2R&H)DKb zvTV}*+0gTRq#a=lN(;2snK~Tzr1s1<$(C&VypFn9|YOY{u0Vq`lj8q6l&J4|J z^$Kuz|M`6cmZ{lN-&;fl+<$1~DL@}h|Wu{$wA7|PPe-j19?Le{zxtV!_%CKK=g(yR@j8liBCRkAL zV~L~6fK+-3*WuWDVrr%hikW|gbkJ)?pH!K%Bleup%^*(Lai;#>c%s{h+?t}dQ5`{Y zG71wz5gc=Iq8Ct&^~d=glWK(JR{k_sgKrObD?UCi+O1S9OL{<{hsF@0@$AZ`ol8sQ z%jt;2V>q7Jvu`%UF^#{P@~+mY{^j@r3Ca6-3WUY2H_H9RW11>vtkc)+?}gMdV#&?> zTU-l`qbl2CV1YF<$zwBpax%q+K@}={Tr;Fn*SJ=Z<;;qWg7M&QVzO$Jgm51FS}B(U zhBYDf233;6z~4hyw7UD%1XW$7nHEs1yhX(_Gztz6=9*<(u|+cP!qQ(X9IFts*HuP7 zlfW*E+)dgrn%H$~vxi7Tqe^=1aMrWloj=n_RSa4lAF0G?cKOU1Em2wn)ti-x62153 z@nfp@*3oKX^ET>Hp{7gecolD$x9LU8&J8nnuYp5db64?arPv~(Lu8K??%1&+2IZys z#d{72R4Z$Gy`+(1Z9h*-wY0|B*~XZv%7E_hY7j0Mh*9H4v#SQFYn)I?h*-5L>@z0q zL0vT0D9hUOYuJLAlaLMVCYFG5AzYzv^EHf6z_ubzj3K`?b91vi*5d~H6CG-B$W&co zjK5Q9E0qbut|NrH3Qx2m#&=>>dsw*4LxAg4xmshy7L_V||G5q90~Mk2OqX1MHBg}f zA=~mIW~$ALcT;)z#qu&CKu=x#{7Si+!bg#*F`ng`xvlA_@7Z&bnJVKNYkA7Q?2C(W z{R0=djavy3BULuMZK1pg)1qgqeHq6cE&4S|mxbfB(aY)N&}m`X4drBqKN#Z0nE8^i z3Bn>wsE(Yoxb-_WRnXUs>{>vw7?=)2=C&<1GDFjzAS?@EN7^Xl2GYT4d+Y_<%oL{R zOcMQjIIfqqG1fRNyAV8>7rPn!suvBRYK4^;t=3GaAW+S6n*5fMcdsM4GdM;y>MP== zj5~}hU)DLIEL;Ok7j{wG)hRj5Yn*T@-P_IXXXZ&(F@0l%E`x+rGlhv28ZcwSr#kZ6 z*}V||+)+Dy1i8=YcfT7D6(?pyaS)bUHu@gv7C0z-m7Z}!CcVG%tY*wVOV%cA>xfcj ztAFRlC^Ny4BL-t;y+S|5QR9h%U)z_x$1`fzqx+`VVmjc8{gaH`+yQBQxD&CI3y-Il z?MHj)h_2kONyMa{MS;pe8ZaSNX+;=j-R4iPvEIL!b`ey$f9)H|bd=4F8bda`3`|8V zo(8WgDEVynclsbc3E@5>U{uwrYn4sqnI`^QDo_?X9p+--RMpoQI(juKQ-%Y&| zPiIJ}^Q}r)^EpX#$DhrQ@o<~wJ9jfv*I#uX+^O#uqc^CRGSH#6yFmXMhrcyry7(vF zGm8h!J2YY+z9?VKx$>{|H$jZ>@{d4Zyd}9K$R_?afaJO^=i2E3^!0|=bUPm1viid)G&%Jm<_Kx&3-)s=>AAP)Xk{a%OVwH}3U*%>+b^qu;** zy|Rz`g*Cv-Bvif1fwlNFZ|38;lC}l+$7PSioQHA1-M@o99b%7F_JsDxod~A3@nZNR z#CysQQP*wc$+Cm?+$q`{UVq@vRU*kZD2{zf)7OUB(J*n7LGt{YMdYaC|9^2t`RPXx z_r2>H!6(KJlK|B;mGM>4KhrgFLrhmt`^g588z#Z}u-TyMk>g?DM8Ju`94tbnn7+L; zT#>Lh_7hSy4kMFQ`CfJsmIsx@3U#)W4jXz#?zr93aSVp%z}l~Qzr{G-W*w6`z^^+z zKjY^{%oL%O*fM0oApikm@Xm-c0XZv4HpXp|XJ?eUGq4j^2xgwdgB}9S=|RFsZ;FmU z9gsNZp!Eo!pNRQp#Z?_T1EozE$;HA|Pb?A#Z}>}Zc{ivQtGaYLVz)A;Glm@TVJW)v z&_u>-V#2~4zsr;%gID^caZ^~ZCuFD0nIen7pbslr*5U@q^q78D+N|=nXozz>jqTW4 zN=vLk5;&jDlGS*@o5$Z1=gNM8o8^S%8NwsJf0WN2&zgui8!Nu3sHt*qmyxD2EwUwP zru4Cn4I6GSh8VQ+SlsrPclP`=@RC&P#cr8Bo=|= z&QG-Y+fJ#xgzQjNGGtP2KNoZzn7Ezh0lkoV4p47aX|&!rFfn2@wd9Zsnvs$sH5ZC= z=`x<5McksRYV3rbt2ZP~#!V))V8#X>FY0WdEyXyhQWq!0!fuOeaCmiM6Uy2xFidqX z&&VC63S<)px1M)?r`AVntiAAhvsiQ3_zH()5p1T~B`vZH{RqY-KNtJFr{=_GQ{~v5 z1sJ$&ZJwkuaop?E%jpy!`xckVFXq3x*L#{;?E z;|00iCwsT{jE3{_MS$}PL<2FkTk2sD0jMd{|FQq9_0w#T7DW?Zs1Y(E#u`d+q~S|k z=^<|+P9kT)Odlt#Yqz>7Bc4iKWy-~d|9T!6hh()%6^Jf2q%}!42XJVt($!i-ttyFd z9CI8&OX9L@&NhszbE9T{s-hYbT6}7%m0-c8-QOQu!D|@ZlQO0>S_9jGz8T^s19qG( zh0Sd{O*&GiOwn-QX3KEPMpkkt{kRoK@6JXIGiF&lxY zDk6_$PlEazVjN_&R}?dcH|vC|2eAB!_;`LJi-Cw4Hurqp+zUIHPp5W`%M zcME0#V`r#EJo`fR;AQ}`k3M)t6h)5tPSV#>@OwSngtRHj&3_^g>KYNj3orp<8%+*f zg60v%y0Ez8fWpvn{`$4}HS=|uP} znCV%|Hu$ti!P~O-f+_6|1)v^y_P{hYg6~@eFB$x#o&mc&yk6@Acy{BBe5g6bO3JM)SXTU8L&%GZCCxPd|>YN zN?UZjA-vgF8(E>*7VR?mI=7I%C3{Y+>q&;ZjmQrezg0Gp0ZaHrG19Sl zY<)SwN9grA0T99a5^egdq}Bh>7@`hT77%<<;(UfX$Cw zD)yr)Vf^2nOK}?~V+T72LIw^z=AX2 z{-H%Va)u%)aZT9ioa()y#4rF1K~D(NR+AXyTES%Ju~avw227Y@*+8%+nv}b&cvtWK2_1{~5TFQw?02Bv2rT7X)8wPf^sjA^##|BTGI$>EV|LDURfccAREecd+*Y>Wg^TL1aKFr3xnyu$da(F z{Bf9L-Rh7Mb6P}P{WQmyG?3PHe{u<7TS@ZOT4Q97>=vt$0v%?=?0-ek5qhzBP(n#d z7N2Fj$<4+@Z})ByZEHb#27-8tgr6C70Gp>E2@FH4j22^#{KIgN$;7ZlKAqvK7 zR}`Te`?D;bdKcH_Cs=@18)jU_bYL-SQ%dl^Bh~+$67tyY)-dU>Ukx(~_LdBD*a3XR4b2m+wt&Mf8P1O~y~;iwo(2ps+1+DjI4fWYCL zsqAv1F6u*p8{FkZD-`amSj3Ixb+wM#Z~fQEn~Mq zOyvt%lYJyIfrBlN~yi zGhF(IoZw&wHy*1SMAGFE{@~U(JuVg~pqEV0wRN+t;F;vUTm?{A4YN5lHDm^I#SlxO zOcim1taWZ(5NQ+#c_jjjoVXa~PEbA4;MOj)=or?IJ^4<45csufPPrjXv%=uoGy}Rs z1KJid#&`Cuu{W#%RSYM9bKozDUXMf;RY}LF32oBJ#W^j*nMVJP{v2Dk98HQev1Kf$ zP62kvEF8Et@xQM10?i}OmEfCX+v|m|MJ&xYP9Xx^uxq0lG_Y!7uF$-$qo(np`J*}Q z!g$yAv&|b)yUnSNFLe+;LeJ16@33vUEg!xi_yr+GhRu;(`?=SEx#xrX_qua^!V4sG z{KO+hbC*{4ahrfAv2N9-E0hwi5Wj})NiQj}d172`gBc)pFF^>nH$Q<8tp_0lfFDbY z*_q(Z7)#x>u&SO!yy7fdAvI^}!nQfVsmB{UU8qNwj z@)|O5eTaQHKi6*EDUh!*&W;8ja#$6VtL=x25f#gB`?YZhgJg#mlT4eb$W72&VOy4| zxUIF`P*4?@e5Vm`-oA$Trukba?p6|0CnFae1P9AP+{zL_gTJ9h01c5Ikm+ak8$XOG zR?YJ_ww1L8z@~;YdZ$#Ez>=W5f){lkB@0t=0a^7qCAKm?{w$B@XV|7Q5_>1 zA|Ho_K~NCDFhL%^2;aDX1vi9N(Wh2Gy@srX_>UQf2=ZztNv?yEr`sIJA87;i#0=Wi zN|*w2wDylAPeYhJ+Q1rddNR17Hr_2JaS9T2$X-1n7j<3OAb0(?`XTfF{AGLzcOJrs3*bVmN= zW-C-y#12Qp%SJpuwF*K+_y$Toc`sza{_o*;sN4E4-5n_3@bC@6X}|IdP)%d$^4KL5 zm?6vfwFTL~Z7j%P?9`94R9ts+Gfv{5nr(TxFH5hQ8vdELawHQKOltvnndAPNdj@2^ zZfW5FPihB5lP2Q}$|}tDam0rxAjY7%@Ws}|ooTafk)_U}W zapKWUD7hm@(5*)~(625eI7xYPY|f#A*oCJ6Fl-c8k)>kok#k$86o-#<)!J#+ zo8o+lY8wZVK{#s}>g<{h5baM%_y0O755r7S5v6)Zz|m6=M-YpY9=e>H)(+>u4pFTD zqzl3{7r4v?^m}!&3%8S^$A98cs_0};^?htLrybmM;c&}~Ksk=wLpWO6oC+zggNVr? z;pKpu%%h=bL?gu!^<3%BEC|20lO1WO=_!Z|gey;?#FS`bDg|2(D>2u(qYv*5;sfh| z%*#_}*|+Pc*luM~ul3~IEfRv5q}v+-Z1OykaY@5Mc&8>MnngwTNp!W0tDI!XT?ZYJ zOS5#nLIPF%o$6KH;tFu!n2Nt79ep)O$Q@}HMuC?Obux<4j}LXUa?mjjbd>A~tEnrl zOsJmLtMK)eY%$_AhZCp`^6ze5osYA|=VC$opC%&EY3t`wOyr3fH7u9gVqZ!C&Wxn( z4VSRpN%e&Z_y5!?{ozfG!SLe#oX=_0(vOnl(Iy?bbAjAG8OMR086Jc+G8(68j3242 zXR}ceKJS0fpdP~1hBIo5>vXANGC7u^cw+#XG!M%I=;V@woV%COI*PAamJ~)4GciYw%7R5b{A#M;#a^Xx zkN!&v6qmUASUzIjXS3BdFoh^-<-qJX@R4F&3_|UYRysrLnUL$@HZ~d&QV6f6c&b0a zWnwwLL%({Gw@j;SLPr-S!sfD;I{2YfM73unGc69YUPl&*MT_T>b|!8Q2;MYX(;kL` zBa;~(B#RzIB9j?J>flXmxySw-`pd716UuRsz~x;S+d!yY>6_L?V^*iLR`a7 z8X|9i8$mzWsFDkrGu^HO%naqwqVOx<>!1n?RI7Ym+K+(>i<1sT!xMXC%3X zSRH{~^;?(D2qdqU8Mk>SG~7etvDjlYhu;w};g{Srr3@0ko@ploME62338&hqR5N5J z=D%eur})-qS&t$##!L#sFN(0)zy@l17dxh%)!!-U-*AX)R%$t997?vS?d`9Gq&(pJ zWGX*M&grmi*js%&u13|y59}V<*QGfc7B@iTk9?!G-Z;ut#}Un<0qNeo2XWXa)x$XM z^T}lWUYe=TLB#gk;OeEfs~FPb(du@Sw6k)i9T@OM2iI0KP8oa+XhUHe8T=zHlG?+? zMW8O?(HUt!EvlEIMGQ4Ej%lmJa%!%frIF)A0bqt-UFZ;S(<0q#CY3oy9-TgdOf&UQ zl9L~PvdxYIQ~3gVXkbfoQ0jYd&4{-oflXXWQbSNZx?ocSWs-k$0AA}N50L&q@J1md zOataJJ51&+nC&1XK}&lHJ-nJTf5jPE`$P4lZDZV%Y?~KMB$42FUAzL2S*xY`54k@Tm;=B+|l??g`MR`E?N;vCjg#nFm5t|r}m4#44 zZV{UlJo;-}-K*T0qSOs-E&XMUN6Sz-nBY$?;N)R>-(7_v*s$;(mwj7l6e11*CbZ)O z!ka(kG198sKKC&$N;P7PjNwqqn%E_YA~l9IUSX68`z}uL*Kk|_{pkn{ZxNeFIfFe5 zd}Gp)_@9bfrT19<715dq(~UZy9TUVH9)Y?SrghdX6+pqc~t~ zl+L=YRC-p1v9WZmlx&Nv*1nBR8oQc>b?&CqWJmiV#1dqe(LP(^t~{X|?uBhNkuKK^ zMkResDsJiX#kX{F&Ln-!d<}Q%QAx})#>%KLgBoL$VAx5rP+!lwpge!^Zu5fNdlp?Z z$)s&8MT1teg-v#$i$s)ZBzCS@vlY~cbmzw!bWD#LRg)WHlyz7IKZjUvt zI>1hsRMFnn09Mo_N0N>aQ`Rx66tklyS)gb@okcQsTE}dJ@*EnTSY$(18aplV6M`Up ztW}c2(nLl)!DapkC7VG*9&SRyx>|-b;b2~zu91nUsPA#6(L45!zRDAI`vCxDY>B1A zXO(-FT&|X!y9RdzlwNv65B`F zy^78lic62(B?1G(i9eCi0F!Wf9frai`hmuY;lO`)50aVL%Rp|vs9UO_Z#o!hEH;=& zugSI-X9PDesGwOiHYgcs#L>Q z7189#!n`m}N4Dcki!_a-cb9O8eXR>!p(H9h;NW;2N`4_~B5~kff$iZ?pV1nz+;f8Jl)i}47p;s*(IE} z#EAinjbFX_GP&Jiy;*gzN%zX5k~`^bGd-2pl()V~5?3WIfg5C3jAMWkvzusru{u%) zkDm5Xu}LnYZGHo?nANZ5P(B0Ucyps1bR@#{N8(6y@h}e0BkACbz(>X)W3XA z6q5i-a42#qzFl8T%RUr$1ipLNvg%umC(}C})Z;u`|L{+m3Eo_p6PUm^x36iXdwh%a zc4X`rfs8*N@p!~~e)p=^K!9KS=7#8vjNxOR;UxilcMHJ^MHqm(KqEPR5xbUaPVPNv zVGdjp=k&AL^-Ie^#@tTOVZyiP;y(4Lt-$Q-5l97p+EJ0{p+Eeg#r5^zfRx-t%mCvL ztlzZ{?a@E+Ki*+-!|#IU54PL|YXS0sZtjby0nss_;O}3JEJcA1G<8cGbjJ^il#BW+ zQ6K^!BA1T(3*3f1sh@gO8Yf1p8}-+QuE?2tYEXkAC5@E>;W!}VHo6ClM>WT&Y33hR zpnFUP&4a3n^7Hce9irz>0V+EW^mjSU@-k{;eZ?kxW6*yWTciKG6OOB|KGY`|x{Zid zR@4jJ)wWV7xuz!G02urpFaW~dFQBDIgy!VT%BeC^W-0iU8ljKk=^uoCgT-*oeyPF1 z*BGc$0R@Fp`!^`at~Mt0H6@i7I%r6^{+OLy)WCq4zLt?;#$;{Y_h2y4A_x8~p2y#ziwnlCR_%fH5beq)1a`ID*gM}7Xz-OK5$YmOV^-QQxEfs zX?75~08F$WoEp3}2R6}(DL@m9-LP>lEZcT{2)`XEJwaj90N_ZDP^F3tGP0!zYn}yr*QP;SH>1xFqvXV zPW0z>-jKz$0U%Dy*_d@-`j2;%P7yyC9Jk(&iHL+n3D0-PCPh15HAyvIH|ZIbX0=zJ z@LF8$pD(k;o%(Tnv==4!9TP9mQ`|c2S<|T3K?Zm;*frIJL-PnXN zR@E9%ka348L%w9snN3Qf{oaL@Z$ER=vN1io=d}LjJpdfJ#s>oSzG+0X{EdPSv^UXH zPY9u5(KR4K^f4sI`;ZV)e1WGKVoK4gzA`haJ-?O<2*X@V>Tyt((XM(`0T zEA9(VjhI(+UqiD3!TthRYp_pi(q9Y4+a3?L$5D?2e1)J2g1@PcWTQu81OEO-t7I5n zEn2%`6o8|TCZb2{Qpc8!kcny7lH7OM0_Cz}vNFC8YU2meg60#A(NldZ_(DA08L+-$ ztrN(l6HeEGx#tBN@K&y6>_|h zp$$e-ZLt2n63hb?&3r|f;YoW0pq&6RlB8}HJt8jh{onuR9so^(5QNP^pS{}*#Bg)+Yy_mKDM?G{bkz^1!_p*cwyTKO>KnR8yl z(Smn@)R~T4^EzR3QxmiK&$lvU2l&?c({rcK!}=&T^8t!l1GtH@aogn=T^&673ukE? z2T-z|>#39ton+79a}V6oiKT2G+Q+v@BEY1zyi-@UCvh?H!n?X`meWaV(no)Vu*Jl9 zj;G4_zNDcdAEL`%t>T-j*1qZM{HgbG58?2c(dSUl=DY|gYHHQ?4vMX?7pjHV{Rv*UCE~hMsHz?1?jekk&Er*mZht>>kq2&rCyx=1|O-xCZpHWdnZ?!kLOc zTIIy`0TQ9#el{IosnngWP5W%5ao!LWCI3b|L)%FvF38AM^2O7k{Mdf$eL7muShg*) zS;j9oT)6yZF*v7r1(dyG3cBOULHI$3x=)80>dCPxRx`c@L%z#5wF%z`K;;2dybWQ% z%iaszHCGFr?jhpo6CaUR3!AQ8|3YfmhpB-AK(F5jx8MT6m-ogq>^g|PrGYMnb$j)_ z@S=BdZiu>|x(BxJ@I?B^m7@RVGh~Yx5=QN&cSPxY5JwO5@1lM%o332f-~f^dumQc` z*kR*t-`HCK_-ota&*NRd_6nnS&(zno8!i5D`mIn$;`8N!_w#L6h}(94hb{XT%JWY5 zt@{T;S0KUe`3qxLQ1%YNjiOif^LNBEKqMd1oTb$qHuYl>qC3YY145c4Z?IqJPr;+8Kzmg2j>%^;<33c|W2!30ryARG|Zl;phvz)F+Y4=U4b`mMjgEm9D%>+iZXv&T^j`cxt}&`Tenp8o?<&EsbO(@F^w$- zxrs#rAZ0cKmRX-KAPWIT*>Q!dkOYR)Uo29v5c{Cr%@b0F{;D${lxTLHus|1tYFtZXlSYIb42X%J5#XqtUI!^RQExJCYVBj=1YCi@^R?LfwP2$ zRl~N}f_DA(Hoh@R;U$`ye(jz!;oUN%eRP!L4!H#27$9hHa%_2q@E^Y%P;GTWz^#k< zxWRNA+vrOg9^Y6MMbnlwngs($7sG5doHBu~fz08${NZy4j+HeI*oXtV!#Vv;Fy>xd ze96rl?_HeHp55q5FuHa*T9nTa70rYY(yTegfx+7b6RwX$e#*@G4{un%Ecsd)clJQj zNxxlPLpaj>@F9(cd-|gJc!#$WO1?ce{v4&SwPSl_Pe!Kn4ee=rRqAh} za;_4HGeiec66LMI4Ou19F?C+tL+(HrLsrwvQkhDzkb=`_2%L-xkC zA+FjF;snPdzTE5R#JkT6+g((=YwZEPm1_#v^^P7GJ~jEJ_=f z9Pv&2R&6N9^P6tq-Z;|*p7v;))AAQUurmQ}yxtJD1=qWm58fRi_(z_&L*$r4jKR0S z{V$yTZbA6Hs;BZ^0r>sRX6#*}o;Mtqhwb=92GQgJCs^1r(+*yoeeBz!K5Mcl99saX zTzqJ|3G-YbC*tePUeD|O&drWzq-g&36HFm@8O}29mr^zy@N&%EAyx+YK}hzklDt6; z{LV21_An%yJ4d?TjD6Cya)kyzL%tS)L0q9$y7kT5k*b{A5r=xFf53S|b7D7!()g;1 zC(u4!()t*@>2z|pq}j&x>Vp``_mF_vjRWH*5WcA6fyT5XkSF~8k+@5LT?xnDqJ4kq zh$5O6@!_r|my3L6?`y{;LxYw>&v=>dS5y&Y>|9lS$j+o-=Y{}h7M&}OFVrQYjgCz^ zDcY)sFA5<3qm7z690}_Kf7K!|_x!Sn+Un{uiGNSP)uGSdVOH6Xv@6DX99>Zs1T2MI zm1Mc!A>%7WWE|aSvhKw!^et~f*f zBbhmTdVa*xZp2b<5v0^xJ8Jo$#2ZU}t+dr~p-b*7kYiZi^=Y?@6G1omzJ~nW?i)8G z;xGo|vVYvF3SL}fXAI;<@@N6yjkQ!K*$54+kqNT`PQq{kF@#abY6yTjp3Sp{$#ns2 z*h<<=bV`NLXG!$CdLudLj{1~&fKe)F-YgG^; z#OK`niCpHR-0Is-?2hyLZYdSS3j?q%Rw3 z`5@`~FxGc&mEyE2m8cb;V4lt}&gBK%ZUwJf2X{=ZkUr~ZIRm7iV{BPhq|A&8Jv<>` zmAxc-2+C4b0SS3hiAlcvnX7Q#3*la$tvGKQhiU9(L9Plk^n1(KG$HQsYD77iU~Nsv zu-2^1*H)N0l>xIFzlO}u_4Ag1=NsV|BrSvH8-CNwtz~4Vi3Ip<53Hw7%yaN!9GSEa zYvMk;h0q3`QUN5)v0%4*RhuwU zua%R{Io82&;_v0i@0Jx?5P*GhwYUDAPo=YX2mL#uolb(AzU_8>xqMu`OunpEA*J;l zqt0H&1;A{@QO@RwhzE0mMRTv5HTT4#OO3!59Ne0W*}_$z$|e5sqz-g^qP@ioWZ@Xc z;hMnln!x)Sct)iZ)BW1>KFCw!biH?u1N&VB9?F-#O|g|AL5SA)XXls}01moQmotN2 z%CTPv&mj1RX*XuqPXgGm^$Zes5lbS{`{H{M1-K}EX=@lUTBQVT_g)|IeNSK914i7x zJYT%i!LW`|ZmL7-r@H6gI~?OLd3;u0Q(t_z`Aa0rM!FYevoZ)iMDIFcE_kLXqiUF+ z7fp}m35t>FACr;%8-S@^OOx@>_WJ1kEPZzs6Tljc|#u)A!1*$0ZVZGXNvqvNjX`Gy^!4CeR{{kt@;Y-^ARaZ z^bhlrdO14K0gpZmf3FdWPe5>o&}%=Q_bB-I2fp+re@iPDQtMyvZP>;nvl(*mK=Oc!=;M8+lG01+w{2c0pwU| zpbKPmy?}OWe#dGT&D?RMOJ2jK)maJi6N`ddk8BsO1I+BoGL5%X{K40UblegT8!#r2 zoe2I+>tJg6gIUycgGyuRWh2uZWJY|7_8#*4dbjH@?m4ZZtJgXEoM*<>YGgEW(HJ(8 z7&r`{ z6vFN)z1GlswKPHRcqq8aa8+lkkS~%IU=Fh%rFZ7o14?bB<0azq@uzp{0i1u=$Tgd* zCSLQn{6!rtzSvKV^RJ%K~_Eh=1iazb5s0zdLOfl)P=5P@mI<<&5nca6sFjH=7gcX4_?1GnOF!V@ zQ_VTAlv@72Ij@CY6aTB0=L9W4+WJMKl?z|*1&72GwH^#EpEY^B+NAFU;v^SCi#yf^+s?AWkS&IVgtoLwtm73L33Q zxvm+!VWx3Og41(h^%B#;peIb%5AutX#%itB<~6xnm{mmLq$Y=TzE@Lv&RxL<)=%WI`U zxZS7@rwOwhf<1tz5cV6&NF-I_C6KQC`FgaIM0MX3M)L*7tM)$;>fhxsnjikb*7=)8 zmn>PEvj6L$`vJqiFp0)e{TcaLOO}L+cRM8jC|mvz+%SFE)WsmjGgbc7ph-dr{DBcJ zq-7h>>48*24AjvRM^_t}oCK%;9-#l+;pk81%4bF`av3@`{SIRO^8Ernzt6H_C;Zj# zNq5aTeczE>|M9t<4FGz3=A(I$z~{$TXS?7(1S8 zvOE^vRp>e>sAz98D%p2Z5h+vv=j%Z`YALb+-x99&<72$u{pUAsuqE2<7t&&|^Fvsh zYTf|P((CUb8`&y~WiqibwPHKg;7&5sgNX-M_`S*@62xfTgPdaRWuyn82<~FcNj83- zViYuuE-z#W=AmynEm7-a9i2D{AW*xNI+7V0)8I_To6$=wwtu7lYZ~&eaaoN<8@hbg z;^BuPbuWOP+=<4!jMe0L6`o2djv{f&`Bynt(9`n@xO}{8&uY{G3qGh8r!}&8K1`dt z-v-t(F*c8ReABD<4_@|fm>%^%7C9nG0#V7Gaf3T%H!)~|!9Y_AkPhImfB~7DK^>wR z7yli{lSFgv$RZu769h2F#3qQx2I-mCEzOtp0F{3YNKJSF;eY*z!U;!YVf*oSF-30| z2cr>vjzE^mC#%ZFoxctdyc;EXXuE85mSSdma%F-YQFTaurT8N{voeF>!FESLl^{C3 zgA!vtLXzT=>qSI>AwqMPJr6c#Bm zCb$o)7eh7m8Y$D{^IZo{yKI)L7-E$@W;kt>_?tZtzL4>TLeUo@0R$-uPuI$Z%MpqA z`pA6*t+U`u@E;L<3bPCwD)GDAy~&Q&;9Df+pI0)UQxDbI=CqWHs6RP(Oy3lsM?FB2WEybi?Z`%4N~UXo$14EI;Uawv)35lUni!W%$#nNyyh36FBF}F5h%x} z<)TX`6`lQVy+woI7tt9(lBMMYks)X%o+IBNzPMk-2YGV4Sgff`GAW?)bQET7-~UhT zJ2HuhZmUr3eg79*?mrkTNyCB?LWEzxoCx9(F9`r@Fm4HpsXo&a{L8STBn(jc{=sSt zu&t=riWo%DKrG1O7_rzj)?~~eQn)5_qoDrEbkr)I^FKJtMTtKwn%v6f={Z3XvnrK? zOF9cSuA6T>-cJ^n#?9@P%c85#+~54ntx`Gbo2EY$%jfLzXYb?oZ1>$wTV60dMxU!b zj1GWY%W}Z;Zp0j3!j+`XM#wwZTb&bvnCnQ8J_fw!?jRDq#7&MAe&QA3DSnd8-?r|j zJ!-eVZPgyHsfn%C;?E^sd}K5Gz-jqy*T#k&+0L^zrkd4{goxR~dA44hreovVoo`ft{%f zaJ2_xD@|^58~;MdIjz_GQ1E?36vBG(v>c9p^>6H)%MQCV*&-BkgRd>izFcVK%OL|~ zpAbygjOJ=@;K2Z<1e9#Uij(JtyJj?Ky#cZOUloBEno&R+^2XK2Bo<<#^QFAHA*%>Hu;3eBy zDhRKLEw+15AfHbUQ1X7x63B>z`IG~4HaqN4*o{$vkHC<351Njm*5^yL{R5gAnAZ1s z*vji&^*rwvH;AOtnvcp{Rk=30i88TKt9VCOsy4tn$*iE}K1RZpJIS)dQeaokSwGdX z_`p_X6OWTol`#h*3M{mn7C{Azk9&jzIRoX*_>fzUS{sNd*EHvgRoc zMFnl@@DgESi?{3!g5kn$dY+z0s;^hk#}C-z!HqAq(enF<{|=P5wrrSh1w}oGe80IQWcL_$X8@hIRiuuZ_Qur6quf`mN zQ~emVhq&m)%rEI@#-1pt;lfhG*M#GMpCVBa9-;3covT5BqY!W^7HI;I1Z5`Y5{PG* zTqRmM@27issezUBKIu{B(+V!6>)7c>up0{Ljy*kW*$APwbBFK!`EhDouKGfquLLUXc;#FkUkr^y|nqFA7TyG{~+xM>xG3o%6N*L@*iM zDi8IPB3bkuRc&>tkucwWT=_{!c~ND^gt&?-e72(rK4!*G)0_h+mxYV{cNb=wVOrwG{k8ZL$-J>m5HGi;2D_L*DT(3~kKH!JnY5Xj zz?n$i26dm}sF@--E*~X1Gp6+BLW+J{)_Otz+8$FZ`l z`%Jogw)&oWBCz@%eA>3U77NnLN^Po*mXl#aNRO$EtlZ-<{o>b@e|xHkb2iFUS6#|{ z=Qf`4oLGeIUGi2MM*A^(CE`ej-O88TQUUc zX0za(4O(S(vnzrr zofLkMUsk@0x|$`ttUf-AdhIZSM9D)BZ+FPXC&eco@`5U~g}32K?&=f0dqxNSjjwZi ze=>+cu@Rs&o}5y2wVYRWc*upN)vwh!%1R56XI0Qf3g%+%%}jBnt*tob4AX3MfaoR+ z-bp?uAZs^Fv4$Gl{x`|(U5dVs)b<|05*z{@Er~Cc1||`n%Pe|o6QKZctIY4KLa0V7 zSk5*`UeG8DtLWt7Cv4InI!>=et8Se|xL$H(E#p@RruVm>*p6@<_nv~T&#+{eap($A zeSenU5X5*CLOxWx#u%h5M1{;ew6ku4KSQT(QOBa&5t`+I%6vb;dBRBCBItyV+grF~ zGAs}8AXdFJ8d>qz{RL7&FnCMrA2)yo0LAD;sO_%^xx>{QU;%F3Qw?vH;C5C7crq00vFaD zEF41;lgsdoT|PY9$l2zmp>ZS*7%u1($Ru8_cXvYml~fZ{!D;U7;BWAT=r4LiwsmQ;&hWXWC?AsCY29D9G+aL!>Mz$OpQ8QzVJLf8>w3}^`Z$l`(Qo$ zxK=0bkh%Q`4?5*HU?-lDe!<`x>YkhQkzV#d2}x~?W{M{;9P$WX)%vS$9!`y64k^xt z40Af3T6f6?y_jQX%O>4=`cb6CunUDF5z>m~rSH0)Wcj&_P@X1d2irJg3^)rD zYWTy6^nfs@Wf{pk#L%1?Ck_wTrU#1Q!7`z1;ZW+AJM8A;_P=vx9g=sjkT#=%u(CL~ zuqJa6IH6ye9$95~SO}2S%i3lqSqF7MxUB!9iofQn>blI$s!0=^41tFjJVGk09|`Pkl&}4)s!I zaHm7dS7O%`X$@}mK#6%nd0o{2jp-AOFrfJHKgz?Nn!DRc^~TbK>+5O!C^!HyjKLn&+8}-EN6KDf zzi12v!IWDfv)5vNU33XyHAr_fu9XXaRXF{owW!y#A^Thl0X`+#9+}M3L>`yQ7y75( zIVkVkeaO_(dAi$Vq*jGtH)gn%LdZJtt7aJ02oZIJ#gU{|lNNZeNUbnT1{tmblEah4 zw|QJ%!X@cCIeEa2CO^UgzC%qUrvWK-h|9zQh&5ZbnWK8;!tJRuBY`fQ1wDGXx0&+0 zeQH~fkNYnIx#m5tNBf78bwt(XWA8xr(e36K0q>|J7Xo6xCnP}vVx#35=|EW8sB~I5 zuNl~l3G)bxqkp^mYD#*`<(U`EsP}kjS|b~2%kpveMX4>iV!oe$psj8 z(uqCo0Q{bJ?<~CcSm&bGtWkAa{$3pC7aM=Ct}q zGPm}Ej=PQ>IW;$K+^)O5A1Mok&nm3QdgmXt09-fJVfTBI$G-zr+aFEGE^e6{D+i9m zh#eH(kDUFoX++$b3>O&*uDn~Z$Hd6!*}K{xfNVW2nRUdK#BY|U6z84*K(|Z@Qa6)0 z(s_?mbm0#Nie|rIZLiZC`gu5O<-r`IY!1IVv0_ay5r&VjLrn6UhBCXU@smxK#YM8N z0Mxm;CRO9V;z=l|<%zMaM*?2?EgVqDsASktInwjL;XL4i-$*4E&s)Skp{W=686ZC$ zzw~LUgERiH@4IA@z*+T?Kk!3@PhW0~SC32F`NjT&EG6-wg37w!0jpF#>n7eZV)=k$ zeb!7U-PTWf`{bwvy)$@4<+J{DJ|vW<2NWN0MIVA4PEJuvZK3dr$d)tqJ+Hn1qB%;J zHQ+qU`?t;-n%gcaZ9L1#cOWrEYs4*(U*~(bwl~kL{#ApxB&OT3!sQDe0Z-|v{wX7n z?O9yN7d2IEShN;o1(KCj?b$rz+|j%IMnkzrKi>c>K z)&CDy=MxSiiVjcQFSFiVkW_+y!W&D;U&_<79Zr$<_L676h8jjYYMkV}ORKv1H z!_EG&b?VQ#rAKSZmPcS=@WVG7#61qcfdO=<$bY+t)}`X*p7V2w*M;Xx@q6;XIO&n= zjh=*RI#=tCN0f1MUC9NDglqMHg7;PxQw;X?EGOU#@c(IQcbidt!2hv@H2&#w|JiE) z$CxWGt@eKqyjnKK_!c+;eLD)4U0F+au|4Qkzosc+7=`a?Z?B5||)O8hK8! zW{Z~YImac;QrV)ZB7IC`b?9Sg(uF|sICSa=RYnLAbQP3pXwWGNL+ZDly(>qrWrroA z$GqFuo_Sxt+Zq1%dw(QQZhex-<4$LM!GxI7U)tGnrT=Ct_mWRk!7{Qs`JvIYCO&0t z`Un6cmiibYzdI$fZ^4^>tl@Uf4R|5=F-1;xE{wdE^&4j6m7c>Dqicb?khM#@rLc2B zxxhJcED(v~IKmx3b?%HHS==Lnd1ZG_4``x+iOi&@UN zyfsCAz}s^<_g^Ld2E)dLBVunF9ucD?#4H0OK!24`29W+$Lg2?7sc_DT%A+LYx(_ve z&hlOwQKQVq4D*K!u-rd|%xAf)9qP>7xo#!DYAj(c>J!+|*vZtho-sb+DYMQu~*V9;lJe%|K5@!X8A3|+cPB|UQ1W>8e5tlK|!(^gaBS=-V@aV%+? zH$)2@L)#5l%tE2sEMg{;n)8^8h!AkTxM&5tPNpjgVFy zVpwJ*I1lHeYtA~5tx?<~Ubjlm*jxe59lf?Sy9KIwD)KOse15VdUPP0hJH{FG_k?9z zrQfEt?$0yrrQB3Pox}zZ&l-?dU?kS2#F1`!Tt7cKR~$lUn8?0wi#n>gKoqnHn`q8C z8n9ouZ!Ts#ugg%{t%c=@)1oFswR*;6?p`g{d+c;hBN%n+nRM;ype9TqBC!M3S-O{# zuB&+Ve|ZmHg$gpXr%Xy))i#1@Vwe+6>DXUIN#-0RX-~PhX}slU>H_(yVM|`&%Tj)uDnXww3 z#3Y6xehv*`Et(gB#9{V@F4F`2K%Oz}TlKgJtf*7t9C4$s2(LbV0usUx7hUq6rn2ZCIU=7;d7~S-rD1hcW+%JIrz6YGsJ`*gO z)Ja+x*YSuR=I)rAxKnIIvH-9?F%@B4p$_Y*|G)`01c z%6ZN20Mc{@VO1d^zE4=S@}HxtB8Tx0l3??l(Wla2^&)66dEW9iLB`PLp|15M6(mI0M`;kvI~Ka%Q8SV$DZrFGs_FIU07dv*4I&6W zy5pi_@2Drak$mdRS*UTf4GmT*&hSX!JQz0mT6`!fN&7c;`?0~?DA^HQCbMdQ?V#-( z^WqTbG@JF!?gap#LcT$)sl*^2L_{tk%IJ2uqkDF?Xuy{JDCa5*9fPIPTUYKrijC&i zijI*bjD%Ak5Cp{a%JYq}(J?C(gOiUsXd^h){KstnJsQ13abFxQ#!Ykn)L@Yk;6wZk=L4Kfqr!N`FY5lh_>9x z3NS>Jxg$Vj1UASE8*RIY#v2r{hT9tXE7~UnT3sEn_{_1cJmngM+Hyt*`snMo%%?jYtIQPHC6J~zFr z0~vCSd%+*$81vx79DW{YMv2M|ZnWAZMrf<~N`LKGCN(rvq2qoF7E`Q`NkOJlOA+H? z-jq*2M-tPJIQq-H$wVHrX1VW{_@hY&-AZQ$Ka?YR6vDhIioQ<~6DxUC!rX;LN52^h z^BzDCCnHES4)bT0ihc#tH0rZH+85Z3h_;S#4+C%V8AuQDr!lg3u)-Vq|t zfc)uz-@cR!s*&LJk!$zSkFiLvs#a)Th6T z)l0C$$Uz?JnI!5rGp*tzc!w+Y(`L_9(3rlJrbP+wzen(k9T#kct7ZFY&xpdN2NU|l z387F3F>X_6xDS-l=6UB<>ckkg(h-0o)yz`K9~E{oVr{8Yk<*Iw=@r}Bsq)pQYI$Ct zF?=^!p$oTk%;!Vy#nW?Ld2SV#MkqeZgJ&}x-d9XZ*M!XRmy)g~+C97&fyabBe@!Z& z6$K0(R3^Ms^Jo1&M0#JwIrZN-ZvC_>SdB2&<7$Kpe*B6LxaM;o8Y$x;TyH>Pm>1OY znTh%V%FK9)`1&NfZ*JIM7*e58yD#>n0uxmMxuer22&TJ{m`}5xI7C1UzhEs52tjxVKDx0DRv-X#J2aWq|Fw-X3&w4WnFx)r{Go89hRA5oXXYu-42#Tl2Q zZZlHn(3#>ne~!kKJf2e+?ON>L+ID3+9`pQS&0%GE)8};{93IRn%eJS?+m{IE(d-)0 zgXa&=!ueHpUM3J4?K)t)EGMR&&NL1bZa2iTQzf#|(jgpdwTb?%SK3E-|6h#k|CDEb z%F~TN{iCH7!Tb-SvJmgT7?qTsS9OQwlbnj#;gpVYIU_cN)Fq#{=P$Ud%SlOjjj8qJ4SVC%T4P_N$T5YwvBv85FdMXntAh`;L zbpgFT6DGt+?!cGK_>14{O9n@c<%l#cXw>_8*~Tc14NTYki~<&DiGuN7ml`KgX80wH zIjr4gI3T^@y*#bpcTaRf8ogQY7E@09xe-QWTr4Bp2vuG)iF2Xx=9s8MuX(53l8P_` zcb6rDT|Le9AM@>o%={-tpR~_UMdo5p>*I%bh6O%WEXfXbUk;-ugJr|K#Kq(;vyZWI zC2~DIq~fc4H04-@<;SZ2&OU8jHur+d>n^pHD8Qo1Vvpp)jC4%qD|iAIo9q zW4Mva6sUoM8(X=_b#`_udx8yZ`Sovovq2PWN041!2@3(!(l^CU;srL=P1Y?|0sFvW;Ex_BngGc{5jOX6gY6VN)Pp z{HTXcuDG|mjl5ZSlfPDrz;dEN;tS#CPr#^${bN#T@l`ARtMnZLZM5b?r`YT9GweL) zvUsKaS^7!x3UdQNfBYHo5Ut--&YS3Pi=Jl(MGUrlmSUfEVxWZ}tc*J+e+EGc_~E~4 zkBW_Sg}=zorhFsS9H0i+8(UAlR+4%HJNSAW6M!>w zI7x=XgztpI7!#LNr$ZP)8!8kjp>P&ae|15NiA6%YW~D_!r)DL!2TNtz+(U^XKY`3c z6j%Fs2QhvG{dr}|;7Rs5NLJ?oo?N8eWw=gkM@%f4l7CdA(*TJrqq7+SF?$QV`@IE9 zE5*OTFAU_EV+Ce+ILUPLh0Y!Y*?>*aahd=KcxCZz_Vf@~oe2_jvnWv3t}hJa3_X?Te4#GKg7{wp>N3FAqjl3A#d% zE}1!y&Ja@GN>C~T$Ty@htTnx37zG%B8QFkI*?>`8!0=|k^v{5C+NpT6&^xlZ9;DQ)Id(|OUM=G-W zMc2#=%5eKSQ#`>t;z(Safov$udqcd9Qbt+F-j4KVjlgoqwB9O9nz2&X*2SuBxz-7J z#}Hiu*r}!Tk9;4zLd=4tIxK!T}#XYa05FQx!~I z(Oh5+df%Y`PyY^UnUg&&5#Emn>^$_3Mn^lvhuPfqFTyx$mtC^rr#<-90OKw0{5c5gkM)epAu<~Iz-@YWv!;oN%?Y4k@Rd$q^q*n8B+r``2$!+vw?k56;-48h54 z7aqQDAZuNCr^O2`+}jc~08Bs{j>kQC4I2&->_70bCKcpwED3*wQS_w|b@;fD?an1A z%)BGs*e$!X#Cu(MXT*CwKKZ(D7a#WWekqTC^mq#i4!9AmxX`iforE#GA;0q19+L42 zRs%f|h?ehM2ny~@`EKrp@;cRq4dm@Q;(gt(_7TpHq_BkYkH*zL0qfHV6&!w&!~W3u z-rgSMzfm0{iI3(RlW4Cg&a-dk0>eIIhJ)!XlOY zIOCC_swewXwE{H*H3L4U7y8gXej7<{44%3GjZ%`Gl++EW(m$M`W=-n6+Y9`3OUZ^& zfxn@3xj9nK%8}zI0or8U)-wH&j=Al{oCJzec$nf#bZBwp&aBDN$XI2q_AtS`Y>U*- z(PLyBbv2h{lM=u`nJZKx_!*%oDqroqzn`Y4Ssr;ci5YKb7QNX85Q<9Kr@4C>hVYZ1 z&(1^ZuI^8&vq}vZ?6`CSG{={d%;i``=O-Z3yOq^u701%-))~`R?6*y&7OOpO*65kGI+_%7C}IkgwRTW^*(Hn; zQz?-V@(6)RK~An^$8N3C+Y*QAYDw8zCvR|3;YKCFqxI{JZu3^dlP)n%aat)T^u3=u zH`640a^i_J0w`2SBV?FjYa>y@{s~Beudm}dwJmLlq3fB$XrVjG(U#3vM0I(arA6iR z&=j-rKSP(r?c=U8WRXXuSy8PFu3f_m(af9CLYw9Ec13vsfXNlwA9Yho`D*7KJ; z6!gPo?fa++hA)EL?5)Gsq=(JM-s z#X@e))w`R1_2`B^lyGZqi>2sXW7k|yo-LZK-cvDWE zf25zTv!orf?tn2h&)0HgXUiZCKVgLN_(^QAu4aubS45?f7_N3$esdnm1Bi$hv6)NzlNz3hLDSO~rRkdMR_w>m zZ{I^}Xgpwc*9oF@XGV3!YRq-Tvd`l^6)0uW4Z<`)2gyHK&@gy8LIoH808I=Z+c9Pe zf|CZe=sgh6{*SW&TOfv=$gmZ=YF(T3FQ!>WBFZCRcM=tF-C;lBEGUW=;cgjtxI>xA^Yo?gr6U86XQi3hio+v6Mbaw@IF>S5 z#G4zh6c136n|sWS1#yoe>8qEB?i1q)!HmYVymP_NspbihG`S=X&Z&L2$mzb#LQU?) zd67A_G{Nb4N4Sjh!A!R+B8ZCPEQu840oFt>c;3(e)BTz^HD2Q09wgBwb6jb10u9g^ zCkU~e<4>HgiR5@J#$>8FUEWq-EnDkvMWqSo8*rQC+-@*Ufbq5LkYXTOh31sQfr6^= zC(qE^DEMED)EW1jl;b2=Io}g)TN?kLtX;g>@%1ES6|?Z;VJi?@LRBVZ1+nZg0Nxmn&r0`~Br zx%_}k8{enA&-6kQtH!Q!LBa$3xYfg4?>$EBmCwU2CldYV7IZR1h z7ShRM*!lNvG_pe|qgNq{ z$9WU{3e`_UNJ|YO+TWvj$wmnk{2na8VDni%Z1TVykG)F9882Re9ThG3~MY#Mmc3;IhcOiO^Q-4)P4qgeX$|# zJlf{Dr9`rQ30i$VlkN-GH~1Vx5-}Xdqim?vq1Q$*5!lGm+$XiBOvHjskHCL|_Oss^ zylqG3~)$mdQ-+JB`oYiMZTyg7Yt4h+M0FrKmB3BAPuK&1B75Mjc@rQkt8 z5lBK!p*1?W!;|3f`33UgYaL~*#vssKX6jm7W4)T6`S5X+2zG~QlC>=@Q7g-j%1G=T zH*|1jY7Z?QOey1?$SgoZOGb3tp&ZoG4iS6|vK$D8U@y}iB!(cN!Q&a zp+J4iveQ^d3Mst7FDgAzUB!snMWx8%7E8kyUbg}jdKiKLy43CLma?k_lEY1v%T_=6 zS(M-2StgJ}Mv=khF-OC(Z37TnRMFUEu9-#?D92VMp*5P$AS^A6cI(nG(8oMOCZbn% z9Eq(!yFydK($k?Un$o1wd~~z0D#qj#Yw|6u))AkqiG}DU$*ctJUSdbx&KX!TM`@*w zb7y5crddP*YhKbeR5yR+d_9`maaCArRu6VLRCFv6vNEDeuWQf+_odYSGNr7sam1X? zQ$eNvGDXQ7Zj+aRUCane{8+{-@RYoX&t1cfx4=SduS<84A#IVU_f-Xz5~I87q5m^Rn-Qloz&0D%Ph6u zW`_C|W-;xSrWG3kp}3RN%pa>3lme0SwmL7xdDfe!kahQ2U(HftsI*abUwPa2k>dR# zOQS{upzWWHL4obXSrDn@KBq;N6<6b%ZhDu3}pku%1U6$R!ugiGxwEqqP zw7HGT`RsUY!mlxe0zP=ZP3^2CqUWnHN^P7i{N|YSIvFgE!X$4JdtvTzPKf4^!q97 z=>`k_267vWR2qq*@(RQwg8YG9z`t+_@JP7;v^)drSa_|wgMY?8QC)|cmxY`k42ZE8 zs8i3>X++bPM-4gl9U!PJ)a2SBbzXdAEba?N@4@>sBp~h(Q%b?LI!43 zKC@Q6!@`FbByu;1A_q`P@a>xKM{1r&YT87N)e#MosEULvw*JIgyu{SH>#el-ysS*% zve!Qr!JZ<$4iogqTUg831A#aOJQ+dZ53@d`zj@1vHzsrTHtQXTm~#dip{5xPGJB)R z?yo6B_LB(qr!7G${E2TpB!^UK51{0V&=aDB{oia?Uqjq|JX^d9C3`%7aB1X8q%l0FJeB@q_V|cg5z*|p7=0f z?||jdRI|bi=mnF#5WN8d2rvEQwC=o~zzg_83-iZEUmFgtZHy7S4NG#Z>4%wic>auB zOP1AEW01YKV$mk#v^=nP#y^K=kX>n_7i%iAPk}YleBz^Cb`bXk4c>;kYGz}QxW@>zF`+;+%atFU&c6#cRM2h*v*Z3*@nquUd%S^ z#0a-a79g>!mhlvlx4q=K9dXLy>OxRrxn}7C6D8>gk)CaMr}P>~<>XG8#a#OP2PAWU z&1-lCj9Imh&p3Op7b7}2V3rfktL3C;oGR?eK?>0V)`c}^Ef_mSm^(>N*HkIfQR!}W zKmEj>;TiYYFKMA`O&j4lCTjB zD^pNx8$Yx~7VCVA)}QK@(s}h955^lC*XhkZwV#>W?2H6bdsR!F|1=`z6Ns66kYukz zrMx$1!4P@MXiLEXUQ7e;I|k0Ww?&ERG|%VhwGe%`S$GZZfN2Frn`~6Axey&&`Cipt zSj((>RJ+3T+#M-p=x_3lPo7^BOvbQ&Vkqa(^im)u>id2x`>HEI$fu#%OenpkAB5up zjd&l!4bDG$LWcLn@DU4u&{rX5jX&g?h|*0^Agd}s>CX3Pw8N+tU+wuZl?D$Rag;_L znM2oap+PaD#{6Qrk#r;S_Na6&Y0{=GoiK-{Y?R_y z^(ga)?*|(CRJ$WFqXqY@_l)&e-vbEI12w6lJ-Rr-Yt+Mcx)!XvmGZ-SsXE>@sDp8` z_*8O#8i4fEw@q2VTKKzc8dKLO;>#kZW5W z&uX+g8V^Ciy8Nj5N)|s6gBT&zh9RuqHTM)ahKL~r_B!Mtxp0n!#6t{R_F?CiF;`w7 zJtF6^Iklab0U}ZH;S!1EiO<{;Xa3A-plhDE{xPCB4GSaPtx8U+1@)zcnL`^+10`3* z%%6I?0HDf?2*_vrna?CRDKp^Er<{$m8!h=I*=7}BA-c!0X z9b=%%0>arg3nW($P?!$uwqp54cJEw;wof`an}@Oz1o&VVt58++CmhcJLlhxN8YQdbOznZ;-g$UJt~I&;5t&2C5NxpKm6nYX3NmLs2~ zrF0Ef2-Sa=finKl?>Ve$I>wMA#}~$+t3|cuqUuK!yB{kt}Z!&JETq?TKdH95!8Z zhxVRUE)Z@}ZmjacV(Wz{d6ipx$uR{QM0`2=N=&o|B@_S-@`){ZNQFG2WP%?6iFOCa z4bva0c1QO{NEj|58rBkqMM{d49frgRK$UPV!-m$18FbF04&NG8?$iS}&cO!Z8<9Rk zr)V^a4b~d5_7;l`+KW;3mP#G0AcZ!Hf>j^k#wU&+ZZZXp$3k3^>B1(z&xBbfIXG8)@Ed7WU z2B}5=Q1>s5B^p`flgcuYC`+wGvEgdYJ1B}do+K8Rdbb*aZZAnp+T#3eX)teb@bDN7 zX5A6i=t5N*66K9MK|fFTg_6UbOJok>q8B4uQbadjt7d5oS(ekTGz5i1AU(Q820 zg=+AMu>v`h@$cTAjT+@dvt@?-_nO`oHzuYmAlg-Jo4s9EQ|mhrNr5e@Alb#|kf>dO zY*|zXQk!ay-{AEAd=qYxcS}>oY~Adj-I7pMBAp#xU+=4A*j|4HT|*?-;J8yeIfGvX}Hng zl$X`?QQEyLKNzu4B=6p&@mZafKRpx#Tc+M^lcvUy_sK7EQp3nc)*o1Vsx|u(wsK=r z7DG?BL6hk2gVnNJT!%QQs*R}O4O#9YFf*jt6T64mQ(uYz*@OX5zlVOp*fL4b|0!bkkO`p8B)Ecr^lKf&@m+%yzuGN?D>Hdg9UU+{+sBX)w4pPK5EA; z`UyH7DP$tu6IKz^K~v`w!N25-jd5!x>lav;+OAJ4So(Bq)+6c{tT%ER|C%N2>JLto zvTdazFm3E%5~&Dyrn=%{mbJw^Vqfi!@t62>E7x3$=V*ih`9ilp;Ga%iTDiK6!G1$P zx|{{xc6@Lsg4Q2Fq_sZK8j@a?5uSe{qfj2Ed;}vGUKof@^e+S>w3BG(q8{F5W5zV>2p*B}xI5m@ z2x{MbLT`!U)fhA&w-4+Cc|fmt9qdgh+Fyiw-h)DKG!^#9!^6mO8372f`%noN#UE)E%8l$ol=dG52xDM@w>xaa%7t}vp0!KiO zQ1v}Z-?&ra+Ofo*n!6p~Psq&+^x8VLrgR-|A6|lBM@;p8#0OuS-4ou?+u|sUHqP!| z=ZcWZZt|O7o;_RYv8!G~0waz>_BJK|E+t40U4$ke(D8*Bh($rqVqf`FQSrX;47SW0YXP zgXenvRUlRBxJkqVIKP6&LVyKVj||3>$uW+4Rlp<7hYRv==aMw6rhj+H!!#{&zuQ2+ zN|MM%xZgn6no+HJOS*(7>tFz?Vz2f^EUG>}v64q1|8I~7b*Kq72I2%Mreg4isLJ9( z+)V_vL{?JW%A{GtwEfjd&-tR5{Yw`>?oHl4PzbM0wJ*`5*8rKm@*?nK6qC-}@zzJE zwx=Lz3PT&~iuXIKLc%J~qo1GE8(DwK(;_-k7CoX;y_R2@D{bN@C$S^n1JL+++i~e( zSL;1<-Cq>%jV3L>APMOY{^t}{YnG9vzDz=^&XDnwDof13cZ3RI8~8JUVO7+%*$+?OWN#mt3sv3$b80H7}c;OIPP2bnwDoUL}jR zJjrpi+;LgDqYn=p5yy|HvxC5=L3#2i`bciBOTj(&1>hVID3K#=i+_X&v2Y3|6u!HTIQBuJv; zU;M(^KVLFBRg)C4@P3tJjV!FptjsKdKgi(7z}Udx5=Tb{U@14SI|JFVz@!oQz^L%3 z{;MVTKPyvfDu+Vu`L{FzkcE4P!3~xk zCGY=>vT#k7RK3sRDF*K5TA0w9<|6uOK1pHGRyNfP_wTBd+o1^Ki-v@tWEydOy4)M6 z+ep7=AgJ8q?5d5BdHXv;^L=_Zh4jc`5&)j2_OS7pS|$j$pQysMLCuUOZNRK0D%+J zgl-WtsNAc<6aip3{7Y$!fW%sb4Y&BP30LPj$j?I@E__R+r7IoW{1TuK7yqasaUs*v z9V!CTa)?&$l?E5Qal_)Q)6T-I;k>a^BiH#0!{&2)3W3Wo^3WS1L*HdM>`Q)3@2x2j zvP!>O6Ozqevdt&oY=8M-qTH(lKp?(9qoED{_BmI%P`_l zI5pvfOy93GCIcC*EObCBCIE}c?cP zAgAv~v%}!_$o7`?bfHtJ)VDpVwV*ICs@3HUrhsR_e|Dh2*f%u_$T8qQI;b)5i;L-4 z7}lghLX$w@ayqoLiR|*8nLX^uD{LqcxXkklNpW(&S8(@gPboM&%E|MKNpZ5+&t`L2 zY_0ZTtHv>3tB>VKsD^8Wyxams7?gp>2V(EAPSh9>Xk%gjMul#`)gVd;AF4UC(Idu% zAICATg%cMGN@ExVV2AjbS^4s>u-bYOui{sDY+uxg;VQswC zwz!c#S$kjr5v?q7lBrg~p^u6Hjn6zL$t4`C*f)a&Q2je7S9LJsA&c$S$m23LW%)R= zSHyS<{xAjw`ae9@8pmRZG&+@);GP6sO|lU}lHJ{(2D(z$mscTlHz%)6JL^aUp}0s| z7LCPx*)iE`873)lQoq>uL3zoVU`?@1{i-DOe=k->GBd`SKO-b@Ztuf73S)^fp9z~b zMA@MNcmmk5BcagNYXVR`K`b3hSys?R$8*)QVKp5%K+UHFA>jh>dw@gVAboF=2ks9_ z!HT!5bM?0{5;iuH#cZ|zijSMaGSO6AT(=jo3t2|0UG#Z7RzOWM!>Kq&I}*xRzpV3! zG15L&Z1|22$Py4(L^x8&Qkz9Euo_a$FE&5N9iK zQLmI=R!w5yvbCC);X~$NICYlTA{n^=6md42fgh0)v$fwj3*>E%>9WH=<#b?}3bpX- zTmha+R<<0m>!I9?2qP8((ElFyq@u!@!H%A{r;I<9K!3GT$@d{f9Ug7nK+>Cu#ZgaT zkEXk8x2_8J6yd6 z;$jYwJiGG0fArd*bK2%;9~3ouP(w=~8|wMut3ZO)p;v$|YM9rvM0+4mr|OfpNUq+N zpWvee#SH$y`?79~GQFafE7xh~!b*BXRKUYf?U5IIv=hP4XD_r`BHLc>pg^^*#nRWM zLV~QLu<`jL6a1Ivw|4a`Hl||(K;y}pnNrqY?1lC{xRIJ4R=PzR3uig~t9DQt_n{X! z9$8uLaH08^vDnPh*W1CjFwCz@MYDsmZk-cRAxr}+YCg6#0 z-;8J_NS5kAYdWS51@&bxLO4RE-SQ?E`IOTKiz>bd^TiYwo8I-mnaV;HfPBilvSI*Z zpV=-64TnjO?)aKWJ37TKo~0v4Vw*P8&!0PyjN8~KG+W46eV7?-@JpS7xY1CjGF;fX zjr?XdhQ9nJfuSx72@cK=kBK45-Uj9h3+_!k;H(n!Xtd@5+T&E=lcw{h1n}qaKU($D{vg93goIM!IAF2 zQHS5)Pn!uVo;7!oS@8&~wpdU(Tfu4UFC?HIEEf^}5R1I(*k8k%=HDY;rF zT7GRY-)E7~iZ<8&sS7?^0wUc>(bwNXy!h6q}HT(2N=A5U_!=cGEKNJjezR%@{S1I1^7D#PuA$=5i0kb zXh-sAe#ry>GOg27z$2XXdU=b{fQsm!JjA_WB;K5{@=JTzoa#rocM0AeXr}W!zBlEF z3?M`vjl6`FQnT?;T*GI!$JwW8KvarR_2cyZEAO=VFWw%|hGMX?^Jvq^X>r%{g{90G#+^Swxsy>PX9ZlM{J0`&lGN`0?ZU z%TI`}V)b~2pXiY_8O7X-Huqov5s~J{s3kX-eWs$!b||9{{d6w;C@Xdq z|KR$BCGRZuD*;WIkP3+wj5tN|oP{{UDNu000^JYIi%*PpiPMH;n*K3BP0REK2JdH@ zxEB~isXU!4?D%tf;gg)ph8`*3WLYOXub=oI4_~?1Be@u!T~snZocpBohZzdC;JpCE`3Gz^g|)Jm>6*I9gs}3Q zVszi%^wC(hy{tLO(^cbwQ;BpewWh`@1y+PlF#m~d%A__!k7a?UEZz7xTxtYJ<39J> zRjJaE;o8U5%3WLj#YXf{a3-T9PIw0)QP^6-u!m74tVmJV6rk=o5w>?E$E|JmH2wPv z9Rp`fSC+BZUAb;G4j0a$Shs;>sU2mMkff@dW=ldz3YD2bF`_BE)vt5LvGi=M{QYdn z?v{1ldYJ0NQpO2ko}K93`h5jpUCDutlyvr6;?dSJQ_8{4;6<$rBq=E8ya2o5{4dx% z=%T@`UUEI=JO^**1T`wP9`WB~--DA?`C`ky#Z+Mrv)&-^k%MQ4LCDhLqI^Wm`;e?LhTNvt3JOIC=f1@pHbOGLDhCilhnfrpuNg3mtT%PVx9OtL9O+|6ucTSM$57)!K(K-^~R#W~#KVcXdLl;`#tw5nJz zVj=bId$SQMgXId+xe#vJ%TkRjixHefJwKiD6W9E5P5gUVQ-`AR<`*!bwKo}5VQTq_ zG0UvPt9h56BS1lEnmV`&*d0ukZ8H(r@nMv>v!aYS!Gh#X$IgVzWg6mqN?n*)jvPxB|-{ zvNtMX2@6VMApWeNl)Luq@E$P6T^Iwj zx*W9kN06gfA=V4%lU!+D;1^imkQF$4baF`=OkadB4>)6&`@sOBNP*)*`Vr4d@Z-Is zGsAg!EQRl2Ud9GQR|DK1cac@YiGc0m!XGYR`mlktoOg#8f|q zr?4cP??%attJy)0gTdp+mge5Xl>J$Tw@xgQJ*q;VIDbqdMiVsonLdeYSCCgDfqhm0 zZ)YB~mll)rq@*e^fC}h1=8MrF(bt=JNp~B}uPS3?q=WTDCnl3#l=y%)5siW{K36utrffXVD~=2AWEiQg{9l_#~FeqGcEsNmogn+BZRe zV&e>P*1jVE#mpxK?m4Ru;Zodyu(JmTE5fCU(f64yms>mL4yg!gzYLB)k6r{&Xc9nFoGK&=3P@=Fiw#+fL;=lt zJe4_yzx1h9NG@~ox65PzRsCpySM{LKRozs@3iiFAcvrCHysAJVK!`>vmxam=cmqFS zjx!Ut;4n7Fn#FiuKk8fD@$E>xi#S(|sQmlBdfrGgwZU_6AHCla_emrfE>o?L$gan> z=++5PbUXj2Fv5*xT9kx(0cx8b&#F2O*_a2D1nxdRbCP&l7S(o;V;Tf&y3Hleq-eHr z!BX3rja-+nS>Dfx*vzBS^&yy`Qs~xX;=yAWIhIE3HL&A~c@%Fgx#y6&^6is6+$1eq ziVvLXXDe$D-Y!U78e+7JB{^rO=pZBPOBhm!h1w~jInQCLYxpMNf8UegojjSPpaNH$sC^t zkG76pX|85MkprSoi#uo5)`;+{H-9$b+CC_8*AJdFO?l`++bDI2bHeJcay(*kIK?7> zAYI%`8+C_-LY7S|sjM;mn63FWG*!cPNH#4$U73b%xKlm$bJ@Y3>4KT$GG@RNhSt7_g-4A;D14y)Fnp#=w&MxO>SyPH zp$sW&-3ASpheIB5qVbmK33iqKbTAM>;gxD{Waa3Msm z3kuzlhe1wM(~(2Rxcc#7QSFdqc?s><^Qnp{R}EmUcR>}7vgIuo)A#)>vaeX}PF|0a*}ZfA+M_^%e7DzFelHnR?^PysCA_sep7?kV#z<)LkxK>;auaZ4RC z>6~b7=CB~!+#n4Y8a8qB{-oK&(BQzV_=&)2a7FV^pld!gXKWPnZ!&ngh}|5`C>q&1 zG7zUP!S90;o|0DPl2%KGSzR1jJE~;GlufUfx3d}#^|)M>4rq7%uX&siTUgRKr-87? zKs}X*+h+tbXbqVkU=4L-IpfH;@2yhhzwMG!gk(I?d9YH0+|dh0trfylWW!>0jh@Yt zi|ji!POrh;ZK|f!4UXAe=jfv0?JkksE}(gD`jOG#h?75<%G6bzaI|EL=x>VqU%ql0 zBL(?UVc(NK`Etb_QDlu6n4-Ic!+kM7a!elGpp0#mO5s9B@pm25Ma!l745~eLw5R0I z_9XOkBUN@tXBeA}{_usR{_%?7bW~?JVrAJzDp4;23E}&C`-lD&?TntNSY!`C8Vurb zcSTn`&1I>HG({|*uR_G*IJ-`Se!^xx$MHg;W66|`0)861clvY9xSXcFXun}xMP)}+c!JDe2~be>1UKC z@Hcd|_Xs6=4u$`6P$1*LUZ;>+@mZj3P%9P)t(+!mmZ z;_S`Cn0Xkr66L+ZWk!E!j7Xbjdt0j)i`62nN?i_$h^>l9t%^j3yrEeBRiHmIf#AP? zCVb{)&;N&I4Z3$JF8GIndwadl{NArss3Ogh850vCAE1Fh&0@xE6T9&<%7J{wR3VK0 zB96^!n)-+fD?X2Nd2JD!O|{K9hlQ3DPcYQ1NG>EeUGMG46= zzC<*0ttNp!p>R(UwKrl%)*;UY+u;KGkmMIqf9{%K6TI@meyj?_#{ zj31=_8Q31T3wO$iIY~NL5k#tAis+^0br>Q-V(?(;!m~d92i<-L)KQrh7oIp40J>BQ<7a;)nWNln(L)`fY$vBUZMI>V?BFMunO8TXtS$rR0U~0lg{CUO(xqNs zfzrX06Drs&90}r1kw{biRcbtg;wO%}#d)w4Rw#8^9pb(24e{e%xQV}*NptlkZfu2- zS&&0{h&qY%J3_~gOFlzJg%K_A<1}j|w?Pz739M&r_EaRT&fsqg{e0#mUl)!WMjW=h z<+EY1{o0c?R|#(z^GVp3-{*mP=8ioB#vPl#p-IDk)ivoW{Y2!f$X7TK%E-7YkQc`V zi$F9^DZM{P(5{JtKlReW^Tn6CGki72E>dkPHYawi$d`u%oIRy^PV54-xrydx5{E60 z+J>|F7-rdR{X$4v737MZjmp?cWHB%Fdju}wMROx5BF7~z{C;#GvwNrrLt9GVjF zidctQsz#%S)yPD*j`Av>tHwdd8@@4zErIuhO!g*ARIs(biDVhhG%WLd`YFyfrqaYR zis%+lzoXNwrKe`8Z3d^^bVoQM2L;!h&HakF&oo`=!DBrGJLT)P_z(-3M)gd6wTklp zG7C>o(!f;d3Sx!+0{9zLf(mq%HNw+3Ex4k%P*GbiEN=RjK=FjarwjqP%RVD3s}4xR zKBL;FUl$oalS-_8E0*F%c1wpyrjLnfao4&G zvk5regdp1i&oIJl$e0gg!Wyuzv!1h!O_j0qpj^Cact*GBs0~&}X~R(IMS}hv01c9lh#IUY;;w`5Ii@)ui!JxLCUUW zU)YmIg*3ZEk3BkS8v`6*NMf9%^ z88bHv7O9$dGQ9?-qNB!)iTN<)D$Ee}7c#{!y=cp2fXLn)5$?928KtRaQmi6>{vN<< zC`Oak^J7s@WLg6)$a^QB!Qj_YHs(CDUjMMJ=@q`Ez;l`$I}2>XQVktkv7S(sNNQ|= zPTYinUE!fuvrw&Q2t8W)!*09-NI&0jZShA})cGE|asI4Y>l~`Ff?}5JkD1qC3~y7N zIc)t0*+9j#mZqp)U6hzd0Xluq+*@o4fm-?7SbB-Smbb-+m6cjOJ0TGhs#-kl0N&G- zDvW1Cj$Q=iRstN)6jbO0niq*Ll+-htas#KcBt;rc4eI%=g(BVfhViam!g=M(6~;_) zEIoe(?hYXJWUI~g7`#xOZS+UYvS$u45Ir$s5{m1I0!F#mZQPrle!QQT0CU#qg4V%; zzJkLy<24+lDUA(ZOzkXbRV2MaQWdwQN+4*~)*y?J z{)1^d#HHBkkD*=reMtWg|9Z^;lus4gkkGlp&DR&si?Q~gbB87qAsChF>!JJefSZ^X z;lA=<+mkFL`nxaQ6pZHVd6ckQBw13dz^kB71zxfl5mu&~em#Ffy z&h=4B!;45U%4|BO7ocVvCPu|XhY36q>PZ{L2}bq%g0}I)Tg2#k`D$d+%Hk}-45`mMB{H9XEfW8O3a)} zR~!=co>4YD&eC?MaxNT|Rrd$FG6T*}p9ggwHAHgz^gywRfbE3W}8{=&gela~=h~wD2>qB@ z(XKMl4btp2JMp@2xwl}~UGNID{%-!*kh1<$yHg0sP&oP)%-<;5YgP|vigMisZAXh^ zkon|GtaHv* z{kXq)Y-h$a?XHGRw_}{@BYLoebpt78L1$|?HCa2*WSjnok|T|E*FcN9Mjg3vz2Uk! zC@n#*OT0Qk7ATG5$auxYv2<~o>T_FBFK(~_%BHB5ev!9+QHO%6)_H9AHvA` z23&8TU+?Hs5k494h?K)S+N}})G5Yp^)tCCjw805FvIEES($KU2zDQM&ET$a=WSZ51 z7PuMi+UJcKx5hfw<%*=Z#@e2&XO-UCuo`^utTaIF2MfpnZ4{B=>7F6h{3E1OREJ%$dcF6?$bsewanoHxyJipRP$@y zpj%E@fkWiGuFdXIKEwVa#iyBT253AWH7WR2zt)m!9MDUq$($d!Brsi1v}B0yBr zBJQ#!?gypa7mGE+|MABfq>3vt3Lx0{TG9j1+^daUi;`e`T^Ot-O>0z#I`-gs2 zbesHSdUw5FaCR%mhmb*?05eY#KEHMl5|R*N7mV=3Jb>jshuoY&)QtB_cNodn%DaMH zlt|LB>|V2q9t3Y7%FKhrQudkr=lQ~5w4nz~=Lhy)?I#2qku%-|b8*&07V31c6)WQ(zGHvaw2KPw0Nv?l^}<;KL0nT0%qNckP~YbBBq z@zV8O{_Hl$Y$~7fDNs?fKO>#dUL0eftkpp}C1?7v8Da`>*2GS02)wIF+7xdbrE4<%fD(nv?7&PxQ0^?E#0jPihAXOL% za2mi4j-b19De}Zu7QzbGi}U4TnD<7h`(M;{pr*6%>FANL;&2pTPyHq=@LH`&2hxcX zC<95Qd15U{*|$R)pi>DpfpEFs!cM-`fyt&uJ&=RTObfw(jo;QI;na^+Tt&e@aEQ~= zB#@0&U3DRta56Y=nh*}SahyER&4CSH^?sV=d-pMMx@qFF6s*bbLmFrk#%vDr&2wLI zEX2B<;w#NutQz6@?R1{QmqB-+29-W@1MOytKckbS`Oh*6@(#o&3xeVK-@nI>lPXZs z8ZMR4cydt+YL>lkb@hL7AsKCk5-26wF+kg>s35FV&~#hqk`!(J6dL^v5@@#+w_jVl zj7aA0LB2qZa1m17W7)S?cyJ3i-|T9rpGJMOACqohb7v;dz}l(7%yh^-lm9ekry6ee z=)WRsciC&cDJxKrhTip3pM;9NV1n7eX5DNfWtdoL0CyUWVlD=XeWIJq*T)}pPT$qW zNzCcyr6J?=xI|ST*fnDTrE`{^m6qpkNU`^oS4Ep6kd2v)z-wmvkm3Gp}p{-0^)$1|J%KDkQv`(${+zi9?_ldCQukGj$(BCJRt3MVvn{Q8) zn{echtFkvOqLVRk!ew-1i`k+N&R zFAJ3f!FdoiU(RD0@jL$9oE%*PiubBIiBFS^4iv_?_G=cCaRsZW^=#bZv8};*sS)o$ zq2NB+_CJ);K0m^iL7uYu(#bzgb_wFtG`X=AXgP-ks*lc!rE3_r$|}UQ-R;y+YR!QZ zX=O>4B0tkdH9q_w$?%$n6JvezqqjGi+WRS*+W8gAmh$eCwt0;bZrX>Yn^mF z;>~<{hv7P7?eG3n{3QfGcVK+*QUe11T&T%NbLYn|`Wld!;z57PI6j4zD9!zRK^UVT zch&V7py1yg(#6VTQbfCb`!6g#r_RZGfbP}dF^sPGC#+pZJ{?aL;iJ4&+5~RgZpDVT zg!1&YXA>uaB}ha&LNErO&PdV9U!wzh<)Gsq18%F|Kjt4^zYd01sXZshjtwSux%V7Z z?q|_IKkDQLmX`%0IUovl*@uUMrlPsy#PX<42Q!g^X#bFQRsUcbVPs*glcF;<|3x3q z0&X<#XQ|yVguR;Zi)!UpBTemE#6If8cjN%yn}-JRNr0U3_Oz0b_$V7V_{yakWIf~V z2*>v)w|J(1`%`W7s)3d0kDjs;X0xJMDpI0o=xrQudhjvL%!vrFBBOW4tN4_#dQi+M zy5Ew&`oPGK$Wh(tPfwtssz0KSxmFF5fIRux=*+D>ar znr`}^(76=sONSUKrBjEt$q&7A7TU2}-7{FfmkS16=RGjA9-uj>?q$O00?7!+}+fjgb+Txn*T@DKzo?iGpL8$TO^EGs$V)eq>5^D+nC6 zw4gyR)C0N2(;Y%IyX`kQ#rs$e9Ct|%>)t!7dw_TtogQ|jE>CGz4BoTQU!cOZRmYkg z?$27sGOnom{1Ls26QS2HF6(O(9?6+MUiAncxaIX(zo-n>)7J?2tttXwWLfMY+H^HPlvT*eq@-yL|))|5K z6D6}e@Xd`LfV*7PKrq5OCAuOOnFY~vp0CNWg`gd)Ar3_qF{1O~8*!7qsNoNNd5b7K zb{-VL*(n!%nWr#BZU8~`%aZyegD_1~Fwqlz;8m;L)(iwmT8f8geZZ6pHt{BV81zF< z80GnkjX!)JdyL0|s3kF4t~3W>`Uy)j)q-eg_+>174)aB|ZPCUMX)HXho-Qq+uA`a6 z!XOYugGGb4Gb1vgw5;Q8Ayqf^GF~wI=jPoVimrX-Hp#5>j+A_Q@05~Hf6%D|@ia55 zg0o!O$=`0JmJQ+8DDU0;MjVorFpv&Gw8P9i!khLptiz$ih2?|Kk%})dnc1iJxXN3O z0tnrD;sO@ZR)UUPmhLRK)JwYSUCCsZNVjc|r9U);F~NeUxrQ$w=>OjD zjPf$$rG7Mm&6xqb&=epEcv5e8Z*O>3Y50cyx5biU&CZ!TO=EMwrr|q?jBa|)bjEYW{!>?|I6FVO11ev$&EqEsqiVH z3Jh)RTu>6QTv0SY^;*QFsvbc|87n0D0{hlLQ5H22>fdloS64cIlV`Bc^=@w~=AG($S#}?LhvgG4zuK`L6}-g6khK zhE$JgS|hL!Pj zn@P7{%x&LC2rl$es#Oi;FH6+86Rw}Jd{m`o#S6`DzDxQS(FR~9UiYDt1EmtyWah)J zfmAP_vHS_z?4bPGtM2Gi+%yx7&H9cn1@e31cR@%z^ghTij*c)5bKB~H@(c8%7cOp{ zGQ=2jF;#MM5>)z_Hc2F8 zWMo8hIB2yCdgPdxb@DxauGZF6OT0kP_2c>Dc;uDGb$<8Xy!&lVA6ggVy?bORNk$g# zDr#1>4^gIP;qup51*8l$SN@&prDs()IEXy5aQQv88xF)C{JEw}8*eT87miyfI;mSJ zh|;;FOa<#0%W-vt<&f(*KpU?!=DS^B-P4zow)j9c49CiS^t(&V5u=zcgGkk8Q5=-X zpyYiTt?kknspFkm2_ZMCa^Gyupm5Vd#;dhaozbmp(Xzl5~+mpP8Jm zE=tBT3UjY)O9tmQ3*GI|V0q}s^TY`Z^5O1#_^St*g8Y(V`lK-6bXg%dAWgO_w}m5Bt`Kq@{XlI zU+n5{jA-Q7qFRKKUIdD~kx4F95d&t&M9Kr0F`l*Pds&~AHOrC(0&U=>F}I~%dntE{ zhZ9dv7S2+ys7-(nd}I)9DqA>tx+yb+4}1%-17IQ20?R&Ls!fnjP-iK!hm*&W=aNT~ z>m*m4D{{pS#F`R9Ji)z4))?Co?5X?4U_C%9(kaG_R@tkkHVICsR;H#@PGxJ3b;Lc= zl};Igr*@|ES~@QMVyHl^iqLz~9O2?<#G<&AzphREEO(-99jN&?J;VarP;y`#$F6yf zat2X>83(ZhCo;wrGN)Zy314@!zz#K;t|xka*$*@<>tTy&XPNTDfxpC4wJy#upPv?<>d z0ip~x0`wvwgAkFCjH!L2O+SfYLX2T3?V@G%H)Wa%_qD)li0Bv?Itn8zi$s7(M06}- z3i6DM1RyaLyZ%S0DW;0TH3r7V1@q%V_MeIlDXOwu15k++#aEt)I0p<=yg`ESgH@2C za?8IX4Uj*j>@$HIk>;=hC2m+CaNujisQ7YFEFcpxnEWZZ%q@GL4jG7~@D0O|g8VMM z0r)0;BM2b_fPimOuJQW<&}ihG80;|0XVohjJZxXrx*^5xmLEW7Oi%Aw3gL>E4x|6gka1yvez|fdD5dnN>=};{!iJ>5Ryrr zS41ENfWEET1{cvlCs!#_Gh#(gNtU=ffbqe)U><-QzzJy+vyJXdbUwKVOUwq$3NS+I z!Stj%6Pr&h!V_}=`+|i5K}bNv7tG&u_@eAdUnew36-AF3KGBfhrA1=Jk$0t&C!113 zFMui(+ZgtgT@fI*Fo%lSd>W(@qInEhHd7=0nAh{Pa%676!VPYTmv1~4CxX+hQLvB6m-Bq~$V0-tD%wiuH4XHBqn8JXLMcCA zW>V6_J?n-IR>k=NmNtoe;wfvB8f5@92IPUZhQB1C9tl=_llCd{_Y$#W{3vG6=Yv35 ztis|qA6r1+7Y!Tb-cd}S?vKuBIBZ?<8vrCVrVqPv;*L|wxZ&QCKasUT^*CKX*%QT6 zIFDQ|IOggg%)d$z%ia%7IrOC6(L}F+;S& z8!MTmY^W2#uGp${Uk@Dhlne$O<6Mjz&CJmJWJnK0X*R89FL0fyq( z>;*nX8J-ep&i&HES$urLokh@f{O^F$w_V$Boj9;){c5GH?wm~*HKoM;^AqQH-qv|_ znl+7j-`pm(g*cQ*Y*H3mAZ;h?#^-I5>$iG#)RXc^SWSES$ERiGo%jVgd8u+n7k4r_ z2}5HTJVK+2ib58ijvac*%W>GHrHs~Lwnx*U#{O9yA3(~4r*+Oiya|1 z%PQ`O{*qU=V*jkko^l)ON`b}h7WE^pMfXFwboOiZR;oo#1Jp6}VNM3Nf{c%r@*LfJ z@_1(QZ@jb?vV(ovXKIks;_+|ITFJ!h_F{MK_ro&ksapMYdalmjWpQpSs# z(h3~r>Z^Q?!6#6+s#B>8q20~gjuwe_lhvsni=137IL}tg8EqGk>Ld51)E0m1oDOMq zQ}VFSQm-kg9+OGzSrWQ51o6~#D`&=nWbkHY(Dpy@!bnnkOo1Rq?3}WCaTdU-*~l8Mddf>Ti{Dk>zI zY0liulJO~AT<+?XW~uF-g@+n;*$f+Hf#t1#@Euo$J`)5mPdW;FueeI=d8iw7NDkMZ z(|esg)y?$EN^F6$IXL6+DWp4$B7d{yXX7w!MA2AND^V)VPUK@JYRwSlrYUylG@IDZ zJIzUOINg`51x}#@;SzbDLbHma+hRZ)mS>3^3q+iy%YR% zGa0s^Sm|)}wLl5kjdgrIVu2k~bQ4tMLo1SJCSIoDKD`Z}B~bF2hpF}^b=~Q*CYSc- z-r@W;2J=igi^Z`M>r?ATUP~7lX19J4t=6_bp0gx^t5p^9YQV)7C8`8o#b8b#sDpyP zAH{#nDhnj-ytWF$>xOyua8H1`cJ0&}n zbCr0l;~uBIlYH`(*`}gnyQd;u&SW^bMnO7;OK;^V?)dk%fh=9 zijz`aQ`uL2x-`O6f^-a2AJ*RMz)Xb73cB>m1Z0rJSY`YyL$Y0F8n(pTTgQv((Hsggqg&+7Ht8>e;`)&k#ffEwQms;h|L+ z@)Fl!y&3AdnOb|#t+(0D5l?9l{|Gu9saS4597-n5v5#bfuAtNlv&M=Q`W7RuyuSZg&5joIX zYr^PcGtKc&XZ`t8yO2+?Cn2AE(1}tsRHC;MWG3xNvsG+cel?G}$RTn=O&u?%q@v_z zn9^g8$>*NgiIzFU?Zx}$W6o94y}cq39W%X4nIS+iCy#3Z%{3iV2N8g9+oB1PPs-7#Zt-#7&In^av6it>2pDuW>Gcv(sO8mt>q5Y-ZhwU zaw~{FYHl95Qx4j7myaXKcgAc{?=?pDl3!MGF1TKmkrc=FH zDMF$%jsq*y!UwLEA;}Wj0C9~yyns04co;1zZ)~u4#z5U(L?B!il1vL?1_QwcnXQE* z{moq-x8O#q>n!?zRx&#V&#{h2jb6E{!7fZPAqjOP_0irV-f4#}7DO@@`Y$MPe{Ap^ ze6S|Bd={>qRyMDsK}ZV;HOVm>N?s2}X~QlI4!>=`sphFsT?&lwpA$KZdx5YQHuv_L z(e(rfk0;hmo@FCNOY%90hs?@SOpje0$r59hs*}jqmwMGdpMj8dwwF#N&nbJRT_*J` zrA#Q!)R8DT9VL0U?M%P##(=!i))p~&rxt*fPJ%4Md$Df8&HOaimf<|Xx&Dp%CT;na(P?{8nb`V;@nTMNKSs) zA;dlhaL;YT21CZ$AIjZ%He5{RcDD{uLa}*Rxu!I=~?M+ZLfyh994sanY<4-OJT5!A(~)PsQWV zQQRlvl-(L3@#%AIc`3-y#vniDz%jaXj)la_TYj_p$SE(zGEpO8Voscd8GB`M0iqn_ zW-pp2VeK~el<*wq!R+N}O=KfTe2(=?rx3_5FuSPssvAk3*S%Hqv#EV`u6P>~#B$lC zoO7qJ#J|z(MK{%mTK}d-5+CoT$eG7KpVt{g$SNXm$i4SX$Qk5lYw$@gF5h9#BC7_v z)HDoIeM(uOt=m*7FlHQpetG~IN_C5m`E{_cdX#&|C&zXRh@^R4b+amni#qi{{>&w0 zRh6AXsyCksG;zLitLFc!QF-#@9GO02FuJwMg48NM`UgZaL%~2})z(~mIW3JGn^-BY zA-8Iga-KlPAOzxUf_^wxP|lBFV$iq1SCOxYSC}ozwesGp4Tsxsu)(rb5oB0=+zwA1 z(u&OxaN;zcP|gPvB$mi1pJ;H|{^S*)V`AWEu^?{fP+x3OFv{K!@H}=v%5^-K^j_37 z+^fD!U1CZ8B@t)iCbV=`95;P&e!48lYcfJMz9=vJ;0lU;jN*5G#u=Dlxt747yIE64=8YpId zvhez_*kVe1WF6R=6*;|TxWnvxs|duN-glwDp^u?% zW7!pC0G*xsX{LU$ckPf3fEVIa7v~y}P{;bkbjQ#cs4skR`s>M`*CbXg9BD|hb3Rv| zS?91g+(4KLG*YyyL>k_8(yDom6bv-LKE4HborA`mpRwLsa<6Hg!U{d6e>@#Iiyi#f zxvM;0l5@_ik{0^8X><3(d4P;++T^Bj`;F4e;solG?Dk#en-%=$zn$###v-F zU2(OZ4SMvNXRweu14HyxY33ymrQYXQKx`(S)0xMyF>j%i|EeZ3ah~ZwZ;RjQVML-` zQ8t$OR`c54Y&zdiL{4zstENt>f^qV-?nOWjt|$kdYZ7C@;ht55qxaDjGo=9aMw1*liZiBEEd2tBMq=3Et4VdXPG& ziO1d+%eF-OOT6!;Ps`{XO=siI9oh0DXbRMQ;&A5`tLTUWc?x!;v$T%$m>xwYXQQ8~ zca?HwDxvJg(Q{2V&HI{rj@lQ26M6WLKsszbZ)QeSvthp3mw|Y@KCyL*H-2Gr1XR|{&gpS+q@O#H#P|lFSp+peI3pR z*pw#qf)p(#0*WnF*FL7UlWWXx*WM_XO~dKPF&`o@IuohU&_4|QX4kj^$=D7%ro6i> z+X{ETzZ8;0=MzmaARr8|nWWOS z`APTzc3=9wGMED}319$J1C9`TG)8ykSb{oT$#A$og@BaQPE)TD?simoNy+i0AaI^X z$T-hja7XdC?DNLozO|S0TctJ%^y{>cv0z&Qqi5h*k01Kos zjBT+b@%e%xOffj{6kwvn*^Tmfh(2^2k+fnT0Coe&0ZNgaOM7DxNhx#{Khl#Pi6O?| zS%3-#Gu2bXJ`lnNm_}*;1iyVIa2Vzm^N;RdJ!ikYWQa`}cF8R9hjS$X8T;LYs z1I7ilZ+21Cz7!Y+OadUo=o7zzfz$#J5Yd5sQa7}aSHLwU{>&W@gacd(kokaCc~pE- zt||L`5I=A$;2Psi@rDDE2{6G3l)m}=!JrC3h{4oPsr#IeYrr06p!^51lKCK5${25= zH$;D+>Gm1{APmDYhY!#L)|sfpKm^1!^h*zn9ls_8;vg}q-5A`ZQ_Uk;g6#oXh}+m! zBF}^vANy2EHTDCfYJqzID@gW0ZfeBxw$bBS6%6tDP*Zj>EU+sKo0ta}5xfcjsii%z z-FZ<~$zUj$#_78OH~=h2Jy@PJXW}0yiAanMy!-Kf>MtTZCMq?)=zJl0h$%kA6^!|@ zLZbnlz&J`(BxkxL#0ZRSxg!^ivBzM17Vn;> zE2fnf;2K`DOj~uNZ5t6CTM_D9PMUnVbBNjrjDchP!%?-2RoOEdFskP~koV+Ew{i^U z*t#fcS4AJcjjR^4sB3qqJ>=?EGq0!-7zR(nro5QuT28P+K2*(jcR3{tX#;A@$=5%%N<=0QmsIl%rcH>nV4gWQQWv%ymTxZhO-uM zi>Qh1H{-~bKa`bc?{?~=SeW={$K=bcmZFLKe!7%v2IV8CnQ^>a2v( zx}7z1=`8TUQ6S$-R%I4HldC{k#B`_kILrMaBDvLL+|uAhBi@?})-EX{0cH3=?q_%P z80Ls@TF)mOMy1be+KdjAx|;I#EpB{0lS+gRe~=ltHuFGQ3BnnxVejGr>cv9UsyZ>v zl)v}Rl{ie;rR6%)n|nvMioQIRIlc}m^P}>8;_05v9q{0u($w^^SSkRHc2##{pD;`4_NQ+s={W{%}I6KnQykZ!iXx|XR3xl<_z3&s(+wO*l}K_k3;s>UVB?IP@Hze?4nvNr zFO7|B`y^u8?$es9j{ZRA1V z?w=fsA{Hn2b?Kj!1LN40Jy9RwsDvx|6A!MMh6EXA#w_B!Z+D{LeA}s9{V9+wU0C|s zcA|7ZvgL$2L?M9A8@vUb*|<@Y!+ov6osunOsh52mbZ8SD%qo6Ua>VIp;>#mD8LuM7pW5SWQw@W>@!9kK za7itj4?;LM0~l868~Gzzq#~w_JnZU&?(rp*&et6A!hFvgpyk%}@AR)*)(S@3l;U_X zXF;9&jUw-ahisUjKjHO<+GY;Hw;a8&IiV(%Otm#71ByTH^xC2|Nu+s!jJ&?c_vbaov37KN1 zu_rxF_#0k12g(yR-ss-)^!x@kx#=HZevy^Ed`&@+AgTiWwtQP@*{01P za_*jG<{ff3(0497kv4EwVfVjlF@GF`pNX}S=Wr=s_m!0{` zi=R-vq6u$fW&O|Cdw);R(%Q$zb}!Di{*+24EcOkS^8I0X4vk&HOotd1-}ee<;GST>}&y{anobnIg?@#lO-4LwfR~QD&NWOa|%1#9$<3v zVr~l=!CjKv`5ho6a|FWPB$&;GiS=D3(={)|n#Bcpkpqm_Z#lRWJa_(6*}yx0q0S^W z!)-JYmXJwk!0DgggQf-?RR{Q+ay&l1+@BiLWrDa8 zU$jY$%*$?S7M;)Rtx9t?u!~65Wr|8X$1#DgB{IGv&SxM3Qpys_%LwE4d(%FW;jYB< zZSApX(prS0aP;S~C?$;$Op3eOd4y~R$=y#u4{B8fI5nM#P1ge*$g~Z*oZm65_Po>7 z&~Qin#axE-BWKUT1q8pJwx;q0!o0x{8j5Yb<1h|uRY8MF>i!KCKMJ6?jdy?Hw=mX`)((qf{%V!3gLarAG~X%FLvVL1^y;ZZbv-9ojOzn2n zOizE?4b#OI7%X0f`IyuMwd?%bHn%D~e-rJcGYKBIujgy2wYA;b1)>-Q{9b>$VH?lN zw$AqYZ>XWf@V}ACIulMOfaXu?F+1B<7G|DFC+}ZT#QZI?c-9H<-Y~100URQTn%(SU zpN%gxMouCa%!tJP#UR-^Pfaj0_ZbHX-B+M3&WAHIP!M|yzQ`%FSCqnUp8~V_)^)A6 zMAihY6o&s&Y7=((St1*ySWf&O7qA$qqn1q9bD>YrjVcku>$0ce0hT(>6SQ?jVFN=k zBLWh5i9Zm8Wkgae?B5SkRBLg8&Jgtbz!-Bz8Dl)fyNWu~hCJMcyjn{XD~LMx@AaWs z4oP_ZkpU(ZP4qEi_j=pPwXY4=4-k$4x@B0+G2P_h;yN`5YZH&FM3F9$VA?C~)ld#~kpeT#aW0hLZMN0pCk?4-=Z zez1MW2(^o-Wc2w1Fq$X{KQTw%3@$e`c;q66(u{_%cZ{cQUq0TG400AX{6VW z+p_*JBG8A)^Kfz+#U9K8kJ)57OE)>ahUuH1fzjw0MSiP50dwyd*Eig5+ZwJ zVV@coCeTd(vh%0q{o7=kk;~;x9P;{Mpq4HVRtH&7F~F;KZyKT9nOz4d0>aP|R3+)9 z2aB`JU$~6+y_N*5FY8S)7WTAaE(WC!Y2Xd#`0x$q1;Gc#-&+Z)n-J&4TNXO;aGU8C z^g>XqVwuVY1Y$)G{yfAhMx|t}|Nf)D%t9^Wm*5hQEpX;Hk__*?= z;fnBk@cs?z7b&MHkGa)}4i_f2AQ)+k3M_kn>7DyOn3rfRQ9cD%l$@4D0y=wKJqBh5 zH{;uZxZkuk_NmF2HfhNjcrU->Uw()GPaX=ejzYUAal6!_pF|W+uQ{Zcs7Ti0?P|B( zBModfR+UCg<*^FIwY8wdT);(l!u~W8pbR(-rEDQ5o74~fr2b)NMgO}6TR&A3MsocN zD6|v#WChwIwlg5u1ySET%#mIg24N-R0$(6{$28%600)~_5lIl zRm?HeFYHBhi)=J1(UK~R%Z7L_hUuA#Ez^7|rvNok)UU13eK$M!RVpNL{D^9G;#^qB z=1BO4%y974oAAh-qusy%{?3-Gcw)FgXC=;-q#dHexxKse>Ej4Tz=EdG@mmc%v|SyN zB}2D0rXm^XMMUHPHuq(QoPfO%sdf~Q%@nwXvmn}1zuN-ogx1~G(T6xc`fGFf8gGo!>{{pW%Ty?Id?En?h4y(Crq%wH1YW3=JcM#Y1LOc z9vT>i#u%^zARC@21K=@x4h{cJ^5MhiiR6v8L&ClDPi6IYa;17VNfD=?CCiV8p>b}_`Hd93OTSk^!X};`^6{Ko zUB5cMe_QoYANgj23Jj#R&<{;wFasJaip0G4Q;l{A#wj4H6To&#*MUpWV7HP`z*U=4 z=lVabaHxF+YXW8oc*PQSiHu9P;9I z0h``)SaBxhAHUy!W_DwxvZ8l!{xp687)}!}L~{T2ZtaWZB2z?igo)8p^txR#-%?GP zJw2>LFmrliuK@35N1>>!eP_N4PhIf8)=7#jwFj}(J7n@vjjQ5khK~pASI%W^c-sX;)_4a05~5Evu|IhQWlzC0ExGL)?{u z!h>y8jjIse!z0_{BFPjIyI`kzy-ToFSfvbBwA}U9GvK1DB>*8CK>v|B7Bkb^FetL< z<@u{opWL)61wrd%@BhEt6)6?p2})EM%;UuShbF>(=P{0^T7n%r#kOJpx5AP^`B}K^ z`vu3dc;p9)`eMzQ9L*MRdSpW?@f6Rrvl#9et!iP3(r@kpD!TwrA3El50k*&%TQ9f% z2k(1*kF;(Wga;ws@wBJ~%&QzpWB5ogbp#ei)ch7-sNUZs=Z# z_R3^@BCdY)*-kyEd+hk~PLuleeLhyG!+#cA49zhnyC+&q159fi{cf4CPPSF3@S~(% zvJ%4^(R0NIo3OdK4xB5Ev4BDvF9%Vcyl8An9og}qV){Inw_VohYg=WZPY4CE>dDyG z><7L)BSWN%j4!7W18BI`>P{r~<8AZ}7%Syr&Ovhm+kw`p@3q4^lp6y!l5>Q8+Sq5dmjA!o8xeoL@(4 zzLCq1FI`mpVza!c%(~{7!!}SZeMqH4r+mBoUwLx@$ z>&MsPmWB?B8cF>6eF)4TQ`Serz>&!f@e*2=4t^73fhV@+m{yDm2-QaYGH;xlhYyR^ zm}rfAd|>LVKR;6PEeZB?I*(srB#2mFA+R;|)B=)4@J-$Ca_Nn5g*13BRG-ZBI&WdF zG9Jt?$&$x-D9Yu4vXB?42rC+#&aPvL_%B%U!hf0&A6afoDGy-SMbg)#4ld|w@V66X zqQ}(k9}`9GU>xWZ$s-`e_v&vK{hEpU*khH4mWj2!g_FnP!_p9BAAEa}H4W`rjPp$C zBAInGYMMvlj3lUN;ZIGCLHH69Mn_|)G6v?FkDvQzQ;3qg#zEI+p+#)Fv*_n`$s6Mr zUfY3o7Q5+>iDz>qi~&eTIZA0_4vUIuVwIoOpO`DGTVgMN5C$@G;;NYwmXABArs)_3 zuw#?sNcK8`xiu;O#+ExF*y2hSv=vfz%K9IKxD=-R009br{Kfj1c^St;F@pI@8J)q* z^4G%n#XT0H_&!Xg1?9UvG?WB>cxQn&eP4z`+S6#q4fjIQD(l#zLJ;e? z07N4K8%l_IRWQt=JiRGdNQx$g5ylA{Zf!uHKDVq#+B$7VpCroDiY8bsnW1B-7!hGv z75p)Sp<~hbBh`NMjM&Ox>lc)h+6U*;HtJ?$ij(GLzpWSnI@ zgYjs@ugUaVyP=3B38$`)K+@1(*{QnkJ&0KH5MEH+`h)0iE@s;lIS)UeG(sPFU@dxL zeO{)@m>BwoHXn*pibkhIA|!6d8?t(V6^v{_Dawmb6~dO+d4cDG(-k_?=SfHn_`u?X z*c-(=K-UGI8-_YyHSS|uPhebxUr;mmT_~g0^j=7UKi6$4+$IyZ??^+AI5=#X@esz@`mrUKmxjnTV(kHh(NPX9+LA zClF7R@w?2{);Z0N=xYmbfNQw`nEv#sO$Q6-7CE5hhZrA*e_4^(oz}tqD1vL`Pv2{( zYUzyf|qTzAz(NXJt?yX*D z_B-;H=h1v7*~6i)Az84Q+>Cy62YAZwHh&zfO?xg&O)c2BU|41jV~+&^wCes&`3PT) zC7P5_EiwkpAzHP3Oqe>LPGcE2#b`GOT$jEZ+pi6t=I<8y68sAIz0?sdANOWH7pg$T zf$f!sFZkQRj;oE&VJQya>6KKTkbc?R1MPa$B}hE8mp|)JAZrtJGa-W7KocfaQy9N7 zg5^iIU|M53L;{3wD2^Y21}p>-1V?rkd;u|yT9j+tc2S^~1QoZvAF~!A8rxf>Zkc3u zK!{xeg5nZAC#4)`PRHnBm#R&wY~9z-LM6r05wGMBcz#3T=vlcW7#W zgyrEg-tR2CZ`2;BN!OU%WVOF@&dK@wHjhEzKO}oA@T?~SkevWtg?qDkg~l#x;2OGD z5DO~ZdGs>vm{(vT#+0|?YYpB>UPmy2v@{+!{%zvz$G`^@fF4!L-2CHMhvQ&jC_2aX@mei##i(4?*yK z+InhlRC6EO_IKc3g%oaSa4qfAMz89nyt;_2angV(K2>zU^OzWGKx3Nm7reJfFt9EzS>r1p~|zYLZI$mNnenPFq>4BMi%eUQ(# znm1*F;GkA&;KBCyJ(LautKrE2!V114qk7NwNf6+9LT$W8+insP>spT#mF$V`RX@vq*FF%P#$>deFptePg{ieP8 zMXUZ%;wv0LJy7)>XG$dU{_E@j_jdw~-cOEPvxCH`tkoez+x#sWx)^s+Bw#E@9A^A~ zlnQ@QD+VnLVT;!Tt=tV)MK9r&segv03}!iKGJ{gI6Fy3onld-G^?%K)Q-l*}qZ`L7 zCl(JhM(WvHum$@XSB;w``}=l&Ieac+O+AP^`|wW}V9GM7+RGT4Zz$$K2vh*H`Dd4! zW_fPC&cu)C2&GcvWpk{)HNp^Ks@EVU(|9rB_FefIOJN&x&L)`ednsDc=81>I;-1Y! zquTN8F4XQ94+-v|Psk1OCu85UC1B%5y+?3`lP7MtCewXiDQ(})tw>(dY;BYO8cfN< zi~U{;Y(tacqKjf&qW!_bDEJhY`zfx^=aP^aGp--|(k^jV03`2&!5wkl&wUBI%$n_= zGLUc)>4A(MQ34M4fRBx$=>2hN!b|N3V-S9@MRKWfkKUic@r)1}H8@2`AS`8l-~R4>Ac-cc_frM9x0w5URG9c zlkSu^EUUS1E_&sXe)%f>0weu`E&U>u_-K~+I7NTMM1NzTbljac4@i~0MJT_a6#1bQ z>7!+z4DO6E^qealL8lygkqE0X`a0xtP+6wo?WHrrCh`&D#2EnN;* zt4wytxDZ0FOuzdb%`kKx^DOCSz=N`h=Esm;>@tSkANrbfTw-NXx$_wX^E$cnI{EVj zipMkbH|q2^i}W{|iC!c?q8F)jCyTToe$fVe5qX%h{d=dT!;f>Kpw7^eRh_b&zMcaTcsKwv=joMt8-s!Di zKdVp7iITkqgnlsn73>}QZD=9x0=CI#AOQfh{vh^}g`opcbM^C|tic=DRbQXqrPZY6 znXz)ZdFvXH1Ihl(w{pU(h46S_j94!&glpJ3J3j)>X+6pUs@w9osKM>h%B8F zW_F8nN6ZRF_Huy{If;aJ6uF3`Sh8{fgZ+>r_KgmwbCpWNwxNx!tVzE|aqOh_fP zQ^>u$$ZdtQbow{5dnT3O4JCIb@})IwdKdpygH}Tzd|qQy^_ZHaEbd)+!0*!ZUFNtz zt}L#hNNAPeMlztN>v1#rv4H+&Sn)VY=~zbTcueUS@T9*`3Re{HZ>vd*d?H(we&xLyDz1e*}&sK!1pJLV7xkU_;M zV;f7j22#d~G-Zq2H7i{9#bh~^s_j75D_qLWaDjT1Mli~~hW{iTW|-(gc$OI3<8ef< z4B_~bv=P`|wDY}I3M_;w91R{WYW{7!8DKW+{k@hBa&`vuL*3myXokD-C#cL-&;P92 z#$K};6m45Ovu*=xAH3C_eNPe%bPHT8Rn6B}_!~s<3Ypm25>wk?HxPRCDNR-xPI|Tn zJrob&K>K|WNJqY=`wUHfW@LliBRw}NkT5`@fvN?JW zaYph?CLd&vy}Y&bYL9pN_+_4TF)YT&J{v34ZM2fB%vPF`_m;JjPv+~20~&4D-!#Y2vBUH%7BqQpEqSAWk4v+4C3y_~x(F@0 z1g5P*F3B09Jba{&V-tqI{*sa>>-1ssVJDByfTVxI+3XSiNihKv@u4@3*%_t$C6C-i zzli*cq@N?WR@idM*BEOBfw3BXP+=k^!C7|G1Ru?&%NYstO5&K3SodEeBevI=h}QyYt1lWFm7ECJ2)ll36|e562b(pPxnJ={aa z5>X6K(%nB+>|)taccVw_2H77_c4g<|M}E;M1h_hJ1Ge$bh8dYr#Gmo>c22UeG32^d$R6a`O3y0yl5oEJaVV_)7&VE z9g_q`#>8?>m-26Fih+{X*@4JE5|tO%@!@eqq3^3F z5p!Znf58>9hq6A>*q$0lQXlPPukj+Y1Kn-(pO7ccanGEC>ZDZiGHS`L#V?v{ z3Blz^uM5&=dix-QU4pIj4l-9mgySCW{dj|(TEJQW<+pp?>J=+#z1y0X|^HCpzU?|{k3v@O%QAxTDUk#Uj;&)#QmXI*N##|vKF2x)#yx9-E zwRe*&JV|y>-k*eg?uhdfksZJDW2?0ZAFM_TsxV@81mlg_JJC|?rTavuq{RI@zFPY# z?iaR{w7D0vch{=%>Mu1$=RxxD$vzCsN_YkYfuXO$d_X>t7ztAs;t$k*8P6QuDzCwG zW8D{yS9n4qU8Bx>oA;;>?tVGXC4x&#+}Xun28cONtdO&oa}Mgogn0bPxa*|$kQa>| zs8;jn2DP^ZZ-tXEl=Msv5ye2ul(dc{;sX;hBJf3T{(cW)GUr~D#yL);Zo+LaqLA1gA%t{I|4LUsPN zW9@DP+lA`XLr0Qq-$a8}%v%!dv|pKQ`$I`Wq|!s?@(L}+#eTfo+uQ<%x%ZnSn>N0z zX8dPs^?&TF78+jGdN(}|;NzvfhvvOT?ug5}7Rm(JbyXfT=4O?V#P;lwS(3~hGG
    %i4>uI%^&FfT*R`=aB7$}OP;OH-^X2qW2?b07BCB^ zuhiCSBkj&xe(mp`n0+A>s$g>OjGCk2)eBd|qpSMZV=rwml=y*`;U%^F`XFzVaO3-r zeYr$HmAoi=&o0riqyF;@ccGbWl-Uq#%2 z$PH>kSTrtgA&lb(Hh0E{$!|g^80G;$Kx<9dsFZy>@8|IDUKA}T7xIC--#K!ItaC@M zBgN{xi%vVt&7FI0O@FJC*Cw2f{GWEz1<64`v`?|w?n?3RxIbaIbAM)dX3K4aP`@Yy z=GT-g;g~-jA`UhASlX4Ux_qR~C8>fr){ZDjiAO5`OvFg9l3N!Kcav!QX`b|gvGseY zN?wc;L4!(hZ`SDg_iRqXd?yT322LembCKH58IESGbBRx>I%!jkOn3FxqcG}Hp1(pE z0TeBqJ)?cKY}1LPB4%Z+$yFxL%8I(c8zuF6qfugRX|1vNB(zxApA69G62U9lS5*?t z#Ir0`11O#sp^k+t;fNVJF6qWUIPjtsxQdot(vJ)07NH-Hg^Op+w|_3b=3H8Z8KS_b zZ-`_>5^?+eFZ~>NSI}jU@N-QS2Iy;3<;+5Hevc*E2)x7esllpEwYuo*?>7s zvdGJ*!}DUC5)(EfnM7;qr#D0R#2`Q^w}Q4J4ZX`4!mi?pwa@5nn5P`<(nf&K#MV!2 zMq#UX+poT-Ryez4NDz8wcn=kd!G!Qj9;453&-FIODcu*S$uttCw^*SV9VSgwXeswG zpEKqDYdvGiirQ?YTyLd}^esW|)M|ysM*G$V3-Y~CgUl_NFIB>=cFZGZS<2-|D8Ii9 zx>g#~1PMbnA$I;YpNiX`{G1!H}Cy;9*OaX0)Pty;s?TV`<>7Sy+1H459 zL2kem*%vjSD-3auszI5Rvh2mb@RmA$RpGm}Fm>5WV4)jaF=Kb1%N|c^$ul|z1JGl< zfF`rx1d?RIAXz~ERihg;G3q)WXuMnmgIkKKugup`9_gT&w8f$pfT4;fU%~GaXw^N? zK)`XTP>xVtif6~N47tahthsfZJAZ)dwISu{#M}b*0v&WvxOKEIx&5)MsR;``!J|;m0|FK?OjPF=*xz>ItlL12P)^@ssA%a zH!)%&9KWnuV&}-L2_V=xptG1y8%G{9PVZT%OT2(>5B#qr8XH7hqZmU+D=~9 zDneVCZ(dkBROf;pyCRu?9}!}6SrDZb8O+Xt5j)bHxyhtr9vIipUn}JUhUedX zO7Hi;a}iV-F>3eeDVE9y2_C!Lt7ZWK(QX)-8s`#{8F1ZY^+dixE5g1e(8cyFrwdNL zCpYi%yqt4bri@qve}D0D^39+iW!b0ZTN27WZ6=5WeV0?iAy(jItA(tHx4PT@$na08 z0f;~zW4E7^W^({pSr={ikJj(;#XH6BES{~qgiqsZUY)PG97X3lHFBH&jlY4I)l{dS z6do5Z2OHa^gYdPr%bHF+hGWBZa^pgQ6TDgxZBQ%QBBoJczgX}^S>C<2mI@*3-*AMh z5{T&BI9k@QhO!=GAC?J0Umhp0>*&E_l#UtYrHA#OAs6l@fuwzrtvvAi^*t2b(!oz`}_%!`z8f;P9pa<2oiBap&JE<-GwkDYgpomP53z+HGMC zG+9<~<2184HY7u8RT=v%0A)W?&Mq<(R?U6av2ciYMlUYQ>1DogCZ*{151VIm^m#_kR_z|Ty!<*l(+o1` zM5HKB*^2fevUu$7i#wj;<$evsy%wk_eC@R^1M2vX4Jre?VnWK6w4$}g+iarIW_UAl zk!<5>>xt6)$Y;Ma$vfA^X!G4xs%M|hGJ;@$iT=n2X$V;rqqjlDxV)v>a-24r+xv&k zUD(yF7{seWuc->T^3vARH>en1vx)K0IK|)4uo-`{lDju#iH=)Lzv9s5rKsTANz?w2 zlh1Xa(unUVn1BD3C0#hbaXZec>H$X^)u3$fYC)THGr#fOx3XJ@qRf_rwy+s(5P3;a`eP#zFVvkk(qAXIT~tnEq6#;%b=ZXDCnD8zO~Br{G|mpJ~gA? zep0BrJ*0}-$`F5y?QI6$#5CXDUiN_Z1Ep)khVH!k0?c-c|CGs_-Z>}+63zLiy{mof z!IPCV`&nd(Hb^G}My-JvamMMR>X<~APjqJ~i)feb_{Ma$sl8Rka{KBWBszI&(kf%+ zU{(1xq$xUUDY>4a;j5dL4$$j2qh8nDpr$*m?yROW#$g4Qd2e~_AMqYu7kfzDSpRy8f2uMS_ z1m|owdOuD*F&j@Yi%$a`s-TP;M8oIw11DF>53BJ+*z9WhqrDN>ft|@)^`~zqq$&qg z_pCE2otRx1*9>)0LpAbu25rf)Q|VXJ-mW@ZpWxN=2 zcvnNLg{`o!Ce4Kz=Rdxu7%GUiy=HhPTY&3oJDrl1*4Q{}!2FXN)=x?m1`<_%XpN6h z);A}L2HvnVo`?w1K>xI|Kw!{NhC_uLs-%s*NSzxgzSVgT&T2d8oyw$cP0<5?`eE0G z4oq}PyJw@TI&?@oUAsZ zHlWB(cbTxBQdJb{880+aXz87PwkdrX?`vSHY`tZQTBxoAZdcDM6K=yg)&3>yB#366 zO30&XixZgqo@4ZvaA~};jV!VVirg9&SBMd9A^kq(HyXrhMsVtJXVLZ~L;mMsFel+o zn*6KYzKL=7J^?@`J3OSxpJsS$dXy-#q_#kM#CSkJ!R=C+VOA9Qprz?7`uAm1wIiy9 z{M@d^v4PtHIQ`Rzdye+l&%NrZ+F|T)^8G7+5T>60V;ibb8_a|YUcM`uu`3z>(a*zj zjX)tUSHi+2f1Ml57P%Uvf}2%#1&ojoFJH|{9{(aQvE>S$P+u>?jxwH*=4X&UG)-JRJ5P! zyN<04*@$SIZ3ppolAIK}TXf!#SLSR)q0M`*%`@}jI{vB(?^MKUCyHFA_NQ`dK42-M z<@#qASOaSSt}UpIZDN8`yBXi)Xdq_Xn4s37jfVsbAU&mv%u4G?%ceQ zs~-ge47fiYBun2J{^CDH`n3sM>FhqIMFU7#n~q2^lN7g`tGqFJ!vDa6F0Z3u1&6w0 zVL^wwQ(-A+K@f1`>#AHWr5XHnT4XLsL<3tTVG!*%gU@d426TBQYuCg`f+od+hL3J5 zS@$+}#~&Jc4dC}DEyHU3FMU>LEJTGGM5Mj|lMs#(-uhwFopEv%pXix?p#rT#DXcfI zxyP{6wg{qdzL;yJ7)BX4c@QmM-nHU5LxF3C%5PJ~Y$q$W-PvR4$0{q7zQh9M3KqjR zL=eFjayQZLl&nRI+WJRQH~pM3)}y=HoNG@=q)-msA;v|(BaDzZ5FR&8aP|9<`WYQ~ zQOYi4+b(et^CIuoG3d28R=9+FWPB~{N@rUj!?=B@gQ|}q zzwMyk&<<2>Lg&}a$?1_-dO_oPCC_;MLeDR+bTgs&V{&xe!WW06$F zG+v^}Y2*;j6=O>0v_*Zar^I@yN?D0A}GFW1Bb)8Rj>Fib8%w!FLs9&-Ka>9OzeuAVI7?mlE*cD zr;j$j$|-_fUR+c2DFUq?jZ(|Hk(@bBVPv0pi}lL8VLcz)Z@=YidC=DP`O($`h!2e^ zm$LgaP|vGt$=@(+j=lY}UD%tgy!Nh)nz2~zLz#B_X{jN#{R+h3$ayok%6Pl|yZBtj zjN18(ms8Xk?T)aZ2W*T^+qqff1hiozS~XdnO6yf)t{j%zwmg;%ksORUVJJCa=)LO% z`dEy-SU=?S;}S|yVOYmUsc8{F7-jt?&dC2233XerKHx)+0XM&RG?Xk zM>EROq~DWk$>~cR*NxI?0*et7n3e=v1LhQ8)Te85%U>hQz3|j-cpw>ou%g3m5AUK1y8Vi>ZLNW?Yxq|}xDD<4<#pC+-_7pT-Z zXH+VFEif{*(I?=@2x|hUuV#P^q}+lfm(l;h8k2>^<|#R`vuebeOZ9HmRL=D(66K9% zRR<;mZB@tktJgAW4pH@vY+D7@VYT#@n_4JiH6!MBIecFA@$`TiY@Z$_=3Y6HV>Lhf zh8hKJ8*!hi26gJ0H7ci`oKaT=-`7KHXpD9$qlgL=W@p!s#%kavXk>wmyFK49iitSe zxiN6PdQtH(GC;6e(_;b;K}y#S+)^Q!>EPw9e< zQ)rI~U6|$x%>q$xJSofyy>4Oz*@5={ulfgY{jQnkjyEEDhf!_6{M)86T#cZv-OvJ| zt9$=Yh#3~z(EmLnMrWwTDn)4)jb*~RG5R#_5EHmky|yK^^k#M5zEe=zbvreFHtS~2 zsY8c{C}D`>h0(e6DN#}MT;hoAXf}~b0uJVT!Zv}3H6kFbrut31(w|IX03II_v&m^@ zK{v7vi9dgO^nAO&G}@ocnt1o~=bY{RGfjZ=hbr}!}mR}8?CUQ@e(~?$YzX6-BOX)L z7QM8cwgP*i4ZIgl-_i>jF&^oUPzrte4x-c3g$_*s%-C#bsj1)si{2S$#iN7#*(tFi z05Qo=XrY!ZSLjya%W_w0=o*D&L2WSY8c+U}Fz^Fog=fb2$z0pmKwjoFZWj3oS@kt3 z(aZpDxTg5@cKC?s38!JR3m*?4BWtcHA#ga=(tU!j_Fd`1t66|*TmPKCbi_lSrqrU=I^A)WI5~`6M@E&@I$s3$x z0f3Vd5{-o=SRf@zTn69%b;a?o-W5a$e-k`KP?EsNizJui1cD`3oGm+E_|nY*a_}Q> zhg&@PP-BI|De+U(#bO$wS1u8yckcRCC&sxrH2DQ_5`7`3sGma&(_0N6L&8w0{HQ8H za@;$`I1K#Bb+6(DCi9v&(*;Z3i%i}NfR*=37+u*6OxOrb*a%42D3ZJ#o1gUyQ9jkc z65cF8eR?_se9;bk#QGtdRDK)z9Jd&jl`mrHmT!n0*CxD2I0G{_4zm`e%1c;M_S5iB z1mOh+`EoDBYR4q}(Kb2to03V7lMWl23IF5?Ck0G-&!PG~*I_4_u9BPF{a^O45Dsk5|0U9A}dOxUSS2kemFvC|MZ4MOXICooCIM_Y=)|Yv5I$X~;Wg zXA?KLF_(oc*}GGIU9p#u5wBP|ckgIx>ZMlv*6AJ(H`6IYp_k1mgdg3N_3!4v%S2}A z<5S=+$P_Qw#xEG4I8w(v`(6#qWyeV%s`~6>+*j_r-L1U&<~aU{oQj7PlHuB%TWH67 z+wK$5Nw)*lIba^)4_x&&*-2Y>VVHLZxt-88=m;0AKZa~Wx|N8Y&Q(WV5$@s@BL(OZ z_gRr6{*s7loxy^I&N%Y|&C;jGKdV^&OrvW6F=J|LsUzC4*aW*ZnHmA0s&w`Nbsa+M z3Ody0M$EJ3MgnqB5fZ1ZUT|8|Mj!JUlu?r%h<%h>mC%laA-Xn(U}%*VdB;{I__ArG zPkfEaDBdoOeekx0eW6J|_2*ikjr;bhZ_6!+eK?tV9F6(59u1B4ww?^F!M@32rt3y= zm1ixx$5?nRAv!HGdk7$_MSEmi=^AbsO*=erRwHE5n<1^X#%~;(+disLg-s~&l!A*s z7jRr~o4J}U81s7!7fFNM?kbr-!Yl|f&cml!K}7buze~0Cr;P>1I65;D9jic36SBqO*0tLW#PEZRP@cc z{J6)^!*ZK@>LYKXgcR8aTO7qYr2FCNLq+ND+V&Aur#kpEQIhVG_EApKk?!Y**s{v= z_9fxPI{oN#)&*R_gc=6ClU!KxPF2Bkx(K=%0XCc=DJ?>MV?&Sg*u^(xzA*ykdLk>b zH?dk4Ccf6r@Mhjbi7YkUH_siny5t&q87Z!(+u0~9?93x`?94OGioo-Dz`* zfWa@)UHEkvJuyS&^*ap@?rwsemx1tc)%gn1N?O*M1w)P&yy_ z@-xmMVU5mbP>{`MA`8Du#HGv5OYXsQXM)~>XsY3cJJhV(n&P(jJl2tmvuJ>{8vmpW zY7EOd(O4~L606#+G<kvacw;Lg=XSo#GqxaW}sxa z8!-*?7j;~#^ut_)LHcxR=>|n+xw!C%25n|Bo58vUeV19u83`S69zhl_%jUzP&iuH# zK}&whp=lzHSk~~%>tfCL>aEo{hf{)io#H?0M^>t%c4^=LOR?Jd*IVm_y{hwdftax{zhCIC6ZcnSF96d z9-vm}21~`#f7u^Cip;WQ`S(yn*%vL@pbC;%ms+d|Y?A&3Im_DR#N_aatuy>Ynx;ZI zW1CgVrhtsK86n+_7#oG{RZe66PAa$0Lx*#6CfD_$0t!7@FRJe3Cebrb^=FX|Tvvbb zu-fC*#u1%0O#OQUxmQz$ESZSwWXo*PQ-FA&T9STiUn+AFrby78SYgU0Ym3zrp0%~W zKe(x(SI|!~s(4zNUR!!>e%{4i5rWih-dEGPwX|_zW5CFA8)Sf>h~W6KC?beKg%myq zz2x^cqSrT4q?`=}l>w#FwgRgz-cWM<;aTNf4XT`wXIe+n^3(gRgEGqsa9QKUJn(Hn zMS=Y**J1Yf32UKeJHD;{-CL-Lo`qs?Q)1mhIMtt~I zZF0{`|7SPX>j1Dq5-_0Dq!~QeOzg{Hd(PW3O;`g9lhXX?8hlZwNWBk zbPO8|`m1z_=`K6Iua6byL@;>JGPeEiui7Qy-EWV~cGj+;bzC;5&8Qk@;i#0B%>kUh z=i5Kd>@RWcaTNYZ3=-U9Z%1{=_(a5E8SKkMT0C5B^KGzojcVW-?ASyRJOD%6Cq5{b zXkCq#%miRRo~p#3CY6alaZ5#gU?uU0jm1mxym$-^pi$hcL)-L3Sv2SVp}jTkcfq15 zW;~%cBqypFX}yctLF7HFt}9V>8;pitNX152g-|Z?cG%&9uQ=C0Tv_Zr5*JpD66d9g zHH%-U$1QbHlzVB(JkY_Py5JL;(mW^y$h_{gqm1ma_zVnC9*H@Wh9b-NhIq~W4 zJpU{wyH;53ZY%$IU(2y4H!L^Pj?{JO5j`6k0ra5(y=Xu`+M8lD086>qtHg((@B^Jd z&9$X0yI(AZRNwj-q{tbTq|IlWcuX&P6q`Rks1)tRCq4ZwEGv{xocPpX`a_twisLD> zZad-0BI|q|oLGc_CYrkllc!s1YaQZ%1b5X59 zxkWh~T#dduITTkHz%V0s{wd{-$-aYQsS>L=-OR4zw0V$pSfNJ&*^Qpfxg;CEag&1!v&Wz{v2f?pb+nYeFQ zcQ5{ty+8Cx0T5*W8O%STGMu_wW=NEFpy$py_L7Xi?xf*$H?@_iyg>4>Q`frhw>L3R z+gaC&zoIJxpf6bq;x(R8F_BtFjDfX>&y_Y(3(09Ay*+w@q7%WG1RpfM5vcx1O7g%{ z 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

    k6*=@nL$xc2hSBWpK}DT; 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

    USo_b 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

    s=bLn@T(?;*E4X?v1AMcz;km;nI^F?#6 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

    (1 zy7IRnvQ>(RrOO59>E@oN)%msytRLpvHeMb1ZY9Z}RKF8Rtz%yJp8v9#G*nJD<+4BB z`2e9xcD{0aWV$>o;G*Qaaz(1kWnPiXS*tYgAJ{geEMPL;D)z~#nSkIe74x9 zNFe!Jd|%X-p^cLm(@z6c`k92Z2wH*y*^Ve}0gYBrfd=8tmPse!H>QrP|orU_PK^#G5?+5FX1d^N&Pd<>CD(u#*9FDf~ufk0e zRj9zhv^~WW^CySP{;Ju57&Wf`Vt}o{Hp0x_)qyAmJ2zw8Mnl+DTb!~-;a%wL{XweB zX=5o59uXb=bAL+H_2nY5nK^U7v*MtQph7RnN+)8VZ2|FClh2V*&;mm!1Xzv=)wOvf zYz>YDmBpK|l`uBgwn7@L}?j%sw&`F)A%jAOa zf6XvR3tkxSb`X1m-j`+5h8Y&U8}A@Zz^lVe7=Kggkir)(%PdGlP703vE)b6Ro&xjy zK8Rx9!ydOt;<>jsMV3Q!e!=}=3odQ}h{h1-ir!;`z;bNm&+mglv5?s(C+m%Xn zeL*(Uv%Uz_)F7{C{!--?s5X$++oCMgRH=9`jvGZJO7tHX^`DiXq?3L$ns+Ba7yxmDUJk{Ten8j#e z37g9K{9B;3t^a|g{EgxWzYT={b*IAokDZF6g@f6DO^E(ep(OR!xBqUuny8>5^UZAh zH2zaVMd_!ABsc&`ZW*hrDA+^s+m9?RWac=& n%%xZ&rFngQmbvK-_vxJTqB%fG2 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 FVr@A$Zl$29)Gst| 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%0D}m=P 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

    km33gNApPg;TYXf3W1xzN>YtkRfP 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 g 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�YotmWAjIL=Kv__u$N^o*}(F8QV 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

    1riQrfEK{VBB*kB?E>zrO1=Q~ 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�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

    ##p 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

    LY*^aem*1T;TX`~1CT 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 literal 1524587 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⊤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 z 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

    QLy&Yu@)*i8FsG)NE=ih3qZk?8y`G`fIw)Ch@SL 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�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

    R!jnL&NWgXEgu`I#`^9b)a{Yr-_x%+oto0Tu) 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

    RD~pr9zTI75T*KZd+G_k&o>~ue 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

    _yy*A$3MY$+Ak_HJtiAe=S^M9a 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

    Mr|TIRZiBc<%0d$GpLYHi}r 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
    $F!8$Hwgn$mTw4C5*4S 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

  • +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

    Ur=L$J~e6rZfz*(V7&z9Bi! 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

    @r1n?PRJSqg+4^E33a13 z21QOsTRMEUM`3}lxeV)^{_$+03i(hMt7HA_%%3|(BhDdbWV3it5dn19Brrc9oI+(% z0&49dcW%W^%-r37Le(6+DVMe6Dp9-_F4>CJ5&9pRUiemj74lj9ov<^1(~9^V;SN); zbm-NrlA%>`e^)Hz=8E~6!P}X3HuVbGKBl+7c?F2B(5ShJe-YeK}pYJB_ zFk#dc0SdqX?&N12q4Yz%dCZkij9o+`g#cw1Hqt(qw^61QUMZ3EFZ+iewwz+q zsbh1ni&CwbuLijZ4@Hhonx=@0PyEu7R8MW=dUp8(`6FD8_ay>Ca8}s;whvFAdD9@u zSBR&v8fIu1zA=3z-SMr*QTFg+2Ceo>ls>7S3-su5uRgrOAo1Xv_~c=~BRgHi4{w`d99`;@ih%`Vu>}@WB5y|k zuW8M#yQW7-*D#BaBPoXB+(7403Pu-`lhN_01?Wt2B-Og6qMB1eP=kr?QmTp+(qqOf zRWC!69EQ6MR|!jZyiz2w+97nH7E_1CTGqW`=rFu_l(2MHSN|P!yqSxRcUgz*NtFp# zy1GhUr6@snUBmPptOl5Jr97>}Kz>y=7!Ud@C`q{>^o66I6ZI51c(zvrrHvs zm07%7XvKAHZzGR_dK00&J-G1-8$5os3Ea*|`tGkdd8dBPE)f#>rTM|CY#!pPQl%0d zP~q5e++dMcc?ap13u2wIR(`JRf}VOykYe^gc5;N6g;&Hc5@ZI}eL^!(aWd!qLI<7! zEveU=5Y3mpkDNOz!HWSrPe*%N`uV-A`#ivo|R*f+x zU%swxDILNEy%WjqAtgLT0lWl2^%(qZ+oG>%SKUy=aI8^FM|0*R6=bI62Z`Ti5Wm4q z$8Sn;(n%26wA`^@G8V<>nckpZ|JgHtS9~%Z{LHXa{$qy4@xO7GKOE-|EeK_qzq^Wx zlp~f1{JUsEb3&Ir@{j~RY@VO^eZ%K91lMd-;Yp6IwM+)%*CJJccwu~c^Lmb24ye7xRd9w*^GvENYqUqz82xN$yL zg$5c=09hlAkS1<7Spi4x-UOf^XwPh1QBrA2b{qj{2J$zAP?3}@R@AB!OC({2*wCEBjGfic55|EQwCX5N09nkn6f;?#)J%-! zuCY}t;?O0j)scp;DV-RY=mL=opH;0t8hb)EfX)O*kvC^?y4|=$mkvOJgnXY#zhprN(G?Q?l{9X zSM9=Rt6Y~v*uy4wo0jPc7IFX7BukL)Oi7~IxUPye8c31&>8S3M*}9+ML_FdlHMHg? zwtfAj0yyRu$JwaYfW80NhXNZVqgyKM`Lw^PmolYO6@6M_Co5MeOw02=sS^ zxGjiYJoae5{GD1}{$SiZAcs+-v9CljvqsaJ&41_|=Ab6>gr9rumL`8+%_ z&EAWy9w~N#2Elo(?vHbU-a-CIxPKAyiC=!c!NULX4gPnsUH@1@_~$qHZ;>Qf&D~3R z3FZA#n)EJ>JK>u6d>dbjF%cf#SOq@_|5&<-l;3_Jb&LojZE`T3?Q0WFOF==kwGLG^ z)KZJRQx!*kMr8*t?n!11OJ=Y_AA<>oHwqc>BtYyS9-ta zr$=(--BtMMz8w4-sJ>Vpha(RTFBRJFq@h>=Pag1Fv$NR!_l||8pUdjC+!ce)?bZx3Cxy2a03g^}ALZgx>eJruoH?uhrSc586?#5_1 zY!Z6uLR|gAg)xydRG(4p=MS62$nRadKs6@=q9i6QYS`WP3y9TY%1kQA=&q9}>5)YY zMW--hCCIgl#Z|1va>1oReOj~>7*S_T9_)#PW9_~u@*VULu>&PVu`(ag3LF!>GtPD@ z&!Y=6B~A$0B(B)((KL@va--7lF74@`{9H)t?;6BzeN(N0+D%M|6lm5_m?#h|Mz6hOeXZH?TSP=M}-0-9_NQA3}1fEh0UC>%fZs^lHj227^8;nlz>ZrES}HbKb8Vqmu}9mFzjcYLC!eOG#qKaN*eMr^c`yTvNSjj@VvnrI5#to<8CD)b7!A z$ynj)nSDEpN>7e?`X)6|s<{x0gql2jF8hLSW!fL*zAPR3dk5z-ZW+dQ%xJ)bJzGLe zBSscbY8H~vK6NPz@4I*dySa2j)>WC;x}qwNWzZhj6Ts{!Ig(l@rQav6WOB&=>*tN> ztBB@HPR!$tKmW6M`lyt2xq+j4t2(m*O~?br*i|I0tj_i6Q>Ajb5qgR9D-7Q8Xra)E z3&(lf0LpRPgVudEyIZqJ)VpQ%0PwF;!j0fu7L=7U@+5jolBi8wMvPP^?Pr z01Ek9MpI^{Y7=>+bVXhJ0#?QyH`6NnedNY@8kb5+^oCdx^P)xHY}4d;o!;<{;q;A$vyN zdg^M%j1&{no$)kg+`ir$H@eumYWsVpGBQ>9(-11v=iKwY&`Uu(`IyH+&AIvC-0tFB zB>ZK6Iye|th4MpErPyQl;{2}bVncQYisWf<4tl0SGHy1{Tw=c`@uP*G0bkWZ^1+1{hA^I z+mCh6xJE;}D6q+NK;e4Idg!5>R#B-!U11Kgfdf4j7PLS@< zDuTWA;I=8CR4OXWk#mD1Ofr-^Ht$$ifsV4cMunIusvTBCg06y%q2X>f`>B?}cXUIE z=V}+mun)drp=%76Rn~P>HpM8kZZ`7R!*CA1U`SUurQQg9PLZx4dANZ<*whU{hIQI0 zEQ)sox8LDJHCZ)zL%qJZ~qB zq8m1K*QyCYN6oK-18y-S7E zo^H3T9AIxf^KC0Ej=OY$DaFOnQ07*sHm2b3(5o8}%H`u=bWeDvu`2ni?TRafT&1*I zab8btY`I0k8YMrls0G(Uj0H5N z&dV#aRs&gh=^fjShc)Uqd{m>^3crOjWy%7%C@n7``@$d{X-W^^P8vu~j{Krz!L$oh zWEBiPoFzVS;G;Ms1k+lY{AHu@aF?kV12J}#Z7C_p8L>4MuYONHEP|qKs9@eph9{;` z^bq+qm~@V>H(GmRaAgWTT1!38c1U>GCr@1N^6DFsN>)+t1sS~CYAHllU?mqvXC%;7 zNw2q&*Ofi6jWfvQF%r3CJ6&LN@QylF9ok)1+u*CIYgO)F(vi|_O`7OXD(M#Jh+&E6 zKBHQX+QpFp`(68!RK~%pA?o&a9jS{?=IfN$mG&GS>~r!xV6}aDLblpLUAklpcj5H`1 z{%QjCyN`@}Pmqz5m4OC&s~?2qBu7vvM$e&B2VNOaH}bxBSak#bFK2;yxDIZ~7Svz# zTsV|Fv4Ii>t|wFiX~C{hio-%G!8MK?vK6t?E_q#Xle61r)lDZ;4#!SbL=|$24Q79r zW^_y*VI3*I*nJhztp?T$^bpxm5|5?okUWHb|Fg3slYy4*@yVjphVswDh<_DK5dUwb z@~0BspUdGw04rk~BY=abxv`azqq42==O3SvBre7df63HF%XZ6t>Xf~M-o$Vb+<=^u z=K&05jxZ1rk)Z1Hv0~z>FE7%&c@XuY1Hi8Hp*zuJj-4XX#~zvPyuI<{zFaa$GKkv? zjY_f_TP{Nh$fWQ!`>fvitDH3}Q0a_yv@quC`o;FqlkL+vpGj(%A)Ob3_kg;fI#YxM zg|d+;)_bCrb}8fC$hq?WmitA8hh{ZsvqIC9X5Cmpq_FsaKOIT5{?-SV`Xho0nk||+ zXpOcQ(5W<&*`1U_|1K95#D7eH`U^tsIJ7$StcGlKU=o3aqJfy}&qaF-e6^mX&x4Zu z?8^V2xz4{H<$rC`{o^SAI68TNgQM}kXqROxNJ)MwoqO{znJ|-z7KV4s^urn1ks!{A zD1$>23O8O2GPX>U-8&KM3drqA+U@+YgU@q1+y>v7&s$rei=twCMOXX9rA{*_k_2yp zR}~oYH>JWMe_jj1<|r42Fe3)2PN52;mGuK~my3r4P_jIU6KBltq8Vd8gCfk5Zy3Ld zRDXN`@if+&E+N#&`#O55-6Ud4R=mR{yQFcF8n|lnLvVA_CP3N8T2jX8ip< zJ%l640Ta)dnm#;GQnxYexoezI<;NM`9|auzgpWGQ=iQ)vc831_{roo?fIqI~PgDQn zhqA4Nk{mlLJ;Psi4>0`fsk;BIvWu3l|MRAh_OdyUuD?+$4GyzJgR6~65aSn#&o4(G zxmm5RC3Z*0=`~(|dnF&c6u?hrADX;A>>inXef9DFmS&K&OFhJ~Q-ml-PAZ4>Zq)p1 zwJf>jpuIi;4*+*g@|_b1H(NP+!3v7iKyT$B$ZEw(hl0sEh(030IZsziA%bA%eJXtM zd~=9`?pG*8)U?d+Y|hz{dJUGlgWbyq6A!yw`xC5IBJFn`-05l*HFO&-a|pDJ{t)Y8 zR5~n*f%3f%>Uel?p20jHH^i6xvz?|1hz5BkVc7@)#^pb4-o9prcI(sTRsW;S%l*HG z4`l~)7juBsU#I!+qeykqmK>54^2qlE^G+uXcqkOA0$mZBUt(`>iIr-RX89440_M8| z^D%X88$%bU)!z+mydLKU(eP}fFBg){Bx=HIN#7NQnHE&#!*BI7C!f!s862n68-JhN zec*jL7t<9(gB6_(7s7-UvjY}$w!==Gu!kXI&VuFE5& z(w@hhHbp=a1{7vp&jvjcyCO+$@5sjF3MN&ynDpRS|yl^9JHXmSK;(lEo z^bMnOayIp@%6+0K69ZbKpEkwuGVdg^>1+~e1}&*M-X43Wn4+~IuPpvtMlLMjWCKxm z9Icomb6v$JMNejI*?w2$LdIE`yi-ubrY}y?2=n`^q{t(k(zrEw2Gop^J_cnurBSF5 z$!Fa%D$iVb&%CF~EvZ4JAv=^h1~yT^PpH^nwPsPLK^?bbr#bFQvJ866{u2*soHTVn(r?uT-4|8o`O*l2kS}lMpeK>Y zafJoMiG>npq8^g*M#Ms6B6V!z>r$5Ll+Vbl2w2WwR>P_Z&}*}5a3;QqEy+$$W3Av` z!j#XrUW_$#_-$dcT);&cKjBkud78#(g;D1;18*>SiYz0~KJY1{?Yl!BjI@12Sy2|0 zghGS1he3lpux1gVSj!4oP%R1&pxEkZN?7W7ehB`5l)YtFaNa10Xml|>WkF>n|!lITA(VW&-d0qPUrZ^A4x^HIWf#JaKjVNU!1Tt0Wzv#|Mma$)`dqW${!QK#_# zSoZ(9qt^V_f~pj9Lj@ZF8XOuEyaC4y91ATmhJAfjOCAxv3)!45W=;R+M)Gz_poG6V zX`<9_Rg~ao?z=T~k`U3l{9z9F5$_T=t6-r2D~b_P1(Ocb{CBuZn@IL=@nQf1Y2-n? z%Z1*-Q5*?WQW;~a$nF`EJGEtYUs99x*wMjmnwzW1 z7>P97h0>e5aFUfF+M+kFMU?Tkqb%Rj`doO$!yKTUg^P(>b=G9zZ{PUNsrk=?s@-CmJi`Th1C zw+IGmvC(FClD1s)rYgQI_}-GcrBbSitb2}hx!{yaME5+e;hUA|$$8vK7gO4RH5S33 z5&iq8PmjnH*oG|BaoKY|Es>JtiE8O^_#(q9t{Cpj%P+KLOGE!3i}~oc=Ih@K1i|z1 zIipzCMGS|YAf>ry+;(Xp1esE~V78t#QcAhJpWz>H2*)#;D3XL zW^MRSI(R|wXyT8>Z88!hWGESv9XYQtvxu099E6xO1Q{xNACpbH9vu2=k5U9MBl zd9Ih;cX3~G1JWWbZfH^dw3jDPc1C(f%kb*6{V3y^$voUWd859`*x81_;cizN$BL3{ z@JcP$qgiDET1L0%9ca@`X?VwjT-60crK+8-Gijz=XS^83^T)hI}ES0(pZAyD>*RZ4yrN2;!%DU6DAQUhqr2PkgX>SA{0I)we1$9FdYmUTp2< zQsuw95?vm1H{ls6y`<)rGT5|e3vp1I55P-uLz`1;~5i`cJt{!yQGZ;FgJ{)yR1T`tdUOtKLy23e z{Axf;6@J|yUbP*V$TU zt1I-=IAssCB*7bm5Ex4hM9|JN1>sA>scN{(Pk^u%*zLc{W@*$~S?v0h%0)&}z9s#l z32bAu3OcKnyTr5<_1^=fbyzSvuqJRWEwHgKf}D9%mVWiRS$A8{g4fI{c+lDCD64AH zdZ|&2fzt3wnPoYj8E>b~WkUy8bw&95|5%ZEVcYc-Iyi5f#xG2KrGG$n|9T-G=MI?n z9{iA68b1`H!#sho?D>Q~`Frc9hc8({>1sV;qnsHf4(_u0ruO+_V^Y0dMT z>>7;htn0(~6>f$yBd^}21I7ZG@$ZO-2a6i5^YAl(UjK}t60LB<%qa6na`%}|$;Rx- z#v@FRx%NvVkb%a=tV(Mka|OR@{AgK&k*3qwxcLVZ7=BPE1zEeI0frkM54V+Yh#+|? zKqE(hyNk;|U>tQKZby2s%F0O&S9ywUR{k5|+H_Z2QBAFnxTLqFsj95x!)%FsjeE1) zALs%pss_{`Wu><0Q5_6qsD}NL0;&3jI!jTe#oaAblxV6*kC(x!w}!-H{E$U4Pb!p1 zh7ABBjPF~+ME~-*SbZ61?D@B^Xfk#`s8v3BASY1?O{OFy&eGuE6w)dte$xCSw zlDjYtm*w$rAArWcl%F zwLq#iHst!hzD)62>##$4L0l2nG|szV(;HBpEh>DB|0xxo+Iu{dvdd zX?G6RWRQ>@CBqB&s&I6-*4TPS_y3&dZsw9mn5Yw$jUulNIXWa2|5-zXpNFm7ISC4Wwnuf z2Hhw}si8{gk9Pk8C!qxMZ9RBV$pqsHm_g$iDWeP!@>w||&*1RouLUGAHyE6-UoE7p zQH?A&c)N#gs1^S(n~)ee#*MrB72<)8qT^}pmJx5|$9ZL*C77H8OajbbM2EIOLrQlR zzk%;`Den1t^$tJY`r~a)eKA@X!XwJJtiRuNiR=CSWk7O>WNz)I8Z%TSI-*1^9tdKN z`$+GJ>)xzj1y`k2I>%tD&CxdySi*^f*-OHOH|*kE#$9b&I7+a4uupA^dS!r#59tx} zoG!aU_bX^)-2B?jwYxT*p121w4G8Z{&kyy)ru=W1@E2=0qK&I zLwgy+Q`ZJ@0g8ds$6yQgc}&S)*t>pykqC|Q!++mVGNjWw)Wwc*=%Wa%YWkkY z7%I&c#=MLhM~sI~j?Uk(J#0jGDJvGlWoSs&MvkcnR{o+3y)%87@2Kn~T0KRycABkf zpjA496ISve{CEDCSeT#6E{)iwXIdpqv@`cy_*hzGPjAwc#t?#H>%3hg(+Vm&1_bL*~T!nfhV?gNOfmv6g~6)BM{mVwNtGRiXW;+gI<5Ct^5 zEi3-8TTvms|3JJutt)N5DKde+(@9S1Mn0jzeJyK7s`A3BANu4?V{(=F;uC|U+tv1t z!gz;IQuzIELLEh?j})HEh;*Ei?2(7SVzC3=zt9*gpHlwt*M51^7asr9Dzd4Yx*6uAgJstT~is)~r)okeLsvtErn<<&zO{cRu~l~& z^uGmmaZONuS#lj8s|;$$YS=a^cCBv|bqrKU&f%%XPu^1z&KRlPsy9v$eDil*6}7eI z@lEKfqfo)g{V5@X8Rx&_R>qB=dbvK%X1f0xQcO|>B{XD=#~^jd8bX4378iI?#Wx53`1V=#S~Y#ayAYLlt)CGvX)6Q%GvIBELzJ(41%2IqIBvo?tvq zOe7ogDh)(hRd#9FF|FMjN+=QF3{&HCB!hiB4ksGvi{QRq6ML!x`^bVOf@dE-%_}Uc zCmElMP_xxdQc7b7hIuBz|?+`)>VSSYW^8x_lfG= z88>Ao^*omZKohQ<-zQxk&x_9eJjV=detS~>ncdZUlo_3)^wuF$6uF&0FB$OjJTl0# z*}ci~%6Y!j_B}`sLwWse;a~iFQ!x{`NKi#tmDlJwhop2FfY%%`9CRy1gE4QVRA2M} zrcIxaFGw-8Cw~*mepfu+9x1WoO&RNhgVcyau>m``A?p2ob>Vu)!^@E}){8aP9e=zz zJvU4;VQy(!K+>>;DCmV<$N09r10Ff0^Mw7HAR=gFw)KQIA5+R7x@#mTWX%eCa~)cf zi}=VJ(!_syFo>g*ij#56cA`PsdvxxU3NyP?*=?8us{$Eo` zDjdHzN}XcugH;vxz>_VLJqX^@nDLzG4pte-mqDxvSYYYxLMUnWWA`C-nK*l2_xClSyED2& zR=ZcraaUfg#pB1a8~8&u4gmFCUk(1Y14ATzHiC#lE`{pW*xkk#VuB!>rmMadL;*7m z%19Ga;Fs%&rkTdF$s_*EdF@T)$T1EG>9+I7e93t-SJ68G5n%0PGOA&jitHChBi%L8 zXj*5Dhw!H$(bLYnTEw4D0ze1Nm5wkQYONHe!tuqK7l{iZq-F$U7 zP6b?~7}d>un)!=;SUu-VjQd+JF>3!bds7gVQjes#jKS!tWw`nt!Vk7>3`qJabnQ%Z zo&8Dx1E#y$35`JREA-5vs1iY_yja@^%44j1s-(TS6pHW)c~pH1;~h%%6=t+cpja4F zc%WI|tmbFy&qmhs+3X;P7Q{?yw&7*X9S_@M(ApB#35DS>7Sl z?rQs?FmAhgqb<3RE;-{f9=dmhc6w1e9>ORX-6I$bFWtIq4o&#+wqAF4MHB661VF4$ zIq~+6+dk`how@gX51jb=#!z?Edj})FlV9kZo;<73b#>Wve@lAUGFGZC26#3t@9lycme-+26W|Ne?t)>4J@ zNB)(m+@7H-={uMj1!dyGK}I8?^c}ldyPP>Y2YTID!vxjv%QA=B2N8ld2&H)GFC?&L zT_jtHw^jrwlq-9vs3h?LWxoG^|2>$Fuac9qRD{R?^QIM#%cjers^94+)ELBgcY=X9H-~MSF_W<~>rQ*HBcWU`5R{ zF3U3C)dDgszB1Ccq!ARXKsNs-HM=HOd4>laQdWe1k=2iOTPYv!EM{<320A8pjF+_T zs6#JO|HCA!z|}=m4eC80efEl2w0AgUxfc0Y(>w7nt7C|=iWm0OXEJeL@8@A!f0iPu zz+Rp3-BJGYUE~3d6-lpD%oEle0-h?Zm0V3eb91mbWlbM>K=O=cA5Pzh!ua}W1(kq^ zWpvy+-<02!b}qE!@i{`(k`IpjPqpQ)MX^nxhC!yrEG=M}%&~n8|eu4TU{l-n>!` zHcsmV>Gy1?7z3AwIA;Ek$TUy5<_`H|Kkc`OMmU#{ju0Ob@uP*EnHU zz%`y$g}_zhTOs*4Cwk?DK+U76!8gGR)Sf8*yAch`yrodhD**u<*miRme|n{ikemrAJl{! zgjq^)ATp<-qbh4HPhY~`oLZU!Dg8EI#V8Knr@icVy{y>A_ghIu!Yb@kT|Cw%lDUd2 zg;?qVwaV?FP3&6-479aGlCDHWT2Yj=y;7(D5P zEFobET2`ez+$0jCf|`M)!k>JIW)|GSb2CjEG164TDtpmL0~u3b6}4tN4B<-r#bPs? zZhJg76{ixgF(r+fQ#s;RJK88_scclXk(_0E!qpi68<5tsH%q+ulM@zsk+?&G|QapKt zA_PA*h+jz}3Cdk1$;|hZgf5&}S;ms6Se?Y-7jS8s$q~rhX!A`X8nF2lZ-0tdBv&%D z>-)FB6}Kz)?5`{=YJS?sqalSt=4HwXJu%GAVK)IYvTO@)&kIj}4RC85e93rTs|WO{ zFw0};dt%?U#FQfOX>E-J=qE(W z=zYnnz0@ko)<@^X4f2$=*Yh+=c;UF@2V3y3?E4dCmdM@~n!a95JEza#Ri6C|ExRMp zeE9c>!p_e$a{C^HrIX?4ieQV@^hvFG@0fPD0|XpYKi&pc&+p*DM0Gu;t4`f_|N zn24|nr=(kJ&m~-$yb&|gJ&FQ(M3rf_#PH*QT1GKaE)W#;TE_U{S8CA(!Ryt!khoKi z?aZ>-%PY>5Sb6f-VQ7S$fRKOg>f?A|S3KbLBl-N%sQHxXvM6VU8q?OU^O$o*b*CM~ zJCQHQtr*39GdHBui@FCc-va-!qB*HzbCAUa1AFHBzeOMaemO_?pH?*H=1%Gko}by? z|9eSOqWSKNxqubm=+T&RjzR_nG5igRv<+$?8bK;}8MTmvxIE~aR*a~}_n?XMMqYe4 zjhm2YqULWj?pRn#{W`kBwnjrV(IqwXO-;>PHTDmR$9MOf7rvGrKRb<6>`nxxCc9lP zxv%(-Ht*Q;{GKmg!7TO=i4F(;7!#rk+?!PS+1(X=StGw7#M+`e@~R`Exm0Z!{6ci8 zdGnnJk5KI% zz`RKvk>ZZ^vzNq>0M^!nF@hb|)QfULF;Tc4+jS0+=brcT^3@2U*GvLWSMlz5f-jX^ z#k=N27X1u^v@U+?c<##)q+aqp0aFnYUA4QfG@Gc?X^b5uHSR;Ji+|E46@r*AvhNM} z0gE-r{fqU437m*tI2mcyjF{I@rJnFqHA#uYN;3{R5|V|MKhSgw>JU>@76?xk2lai% zQ?INGO&r_7Z8gFm}!>=J_dl))37>jA@=$iVdIix#TK-?i9 z)<`L)DaSe8-4leR*R7ekt%XuuB-uhdh=ajBt+u%1E3d_BsWq|K{PG$1T0dvkD19i8 z9gY%x=0FAO>z|;%W)#g%VU2j%>4A3&vWk&%XK9-Ck7wGc8i#UA6vqe{?!qO zFCV3uG{N$-I6s_%&DN@41XAFId#$W@vQ7M;4f#>)KSX=}K^21yjFXkO;0nmb zj^W8_2+W9aw?G{q&hi^+tH4 z{w6#~bVG@peQlYR+)qp%_Z}lO7)foBFJZ1W0j{0OG)S!drL^g^@o7Hn_$1B&x5ib* zSl`V5$Ha8y+_mPL{NUD2W^|y{6XoXIHRJOq3G98^4o=Qg)7CNJ)LmXp>h%5>SOaAf zQDH&{hmX|Bjuvx6o*=-@{^*xuQ1`$wWnW#LkIsQJreVc6 zn85%NQO-`-?NAC@BZFeIo)#LIq+=w^lWAWsGjk6zjF^S6KNq`4yL(YDsA6TvQklDsWfu}&1pgg7s2>^uH7d;Ec22zHVzg5i*Itv5a&rIL$V z;{7dwHKR^LhAIAE1nRh7?G0e@Dqu(PXig3!@hVX90(6rTiM{03m%3apX0#cLPMmyv z;6|tLUTIPBnU+k(7J{i1B@*0_H4Dr7aO{gadLenJmUA<>F_RYeaMl0*Q)5w}}#4>R5D?J*#vko-l-Tr4w`- zRlpv4rQTB|<}gA|AD48MLSb0bY5Xwe@FxOSFc~~Gegc)tPS)8bq_e-8^vCK&v#;Otu0kp!F+$C15pjnD`z?Ya? z#7pJI=Xt&M`sljw>P~N4RsnatxHdDJ@<-GHb(+s>j4DgN`A8w~W^Y z^e;yAgoR@lVgz4OOmRH6(FBNw4EVy|y$Bp#{9qNYcRhYiYz?NpOXnP%mU$uM?O4Cz zzg`pZ#V{se67o^9@i7jY^k#(Oh=DOiuXst1_k+&_hnP?wweBQp1*H$sbdiX7scUi3 zd2B~6M=Xh<*TuYhi4tsUUK3x^{rEuD|G=F$hHidP>3lvOpjqui{E2%-d$Q`wj9k?a zj`Ge---Tg#bgI2dXN~aCMc}!E@3yrfrXAzpRk5ZQ3NR~K_lAI+AfpfEMq(d5+7Y*x z01&P=Mif|%8ex>N_77(w(d~?zEd#&pTEwsgroOG@)9(43sT`A07BM-hP59%RkK~wT zPw=o%4&{WRj_|~*=WN9J9B;Z%g!@!Krv3eAVv~HE{-KEXlKp-3%1V}boi6<2hO-vE8Gb{Y2J8T%WM`l4D zx9?u84{VaYMBO}Xzgl^Gk1px(+f=Ijt)FD76n^r;eZ#_+wAXLIl{E1wpsHGW4#KCQV9R*jc#8;)CHqDN zv!N3Eg$#}1aptK_9E>M)ILec* z6_@ym-K>x*%3Urk>Xpyfs{53_i?v3PM4!uk!G@njC)HW)!SebACq7mkg?;M^|5N}R z1lmuG3KCnQyh-}bf%kH0yFz)-_#a$_Y!}+9fT_0J)Hu)vVtcioj*f;LC!O?VY~7Ar-hL0pU17NxttEv|)Z z3*%tA(TBS}pB{M4_K z2;`yfi1E73*O!zVoH20XKl8heOe{d%1$(c~JYtf}+E!~k3P-TtcEU(T?cEX?eZUo$ zUanp$k?*%gXpDgKY8Z&{F`8CxIA!CF9lzPO2#ZM>Es9s`ZI2fm!RMOXqA}flMNlA~ zA?(lFWil+t3f)?wmUhM@5Z&uURa~Vhdq!>z(_|W`+o7F4$tKXw;gY4ti>Z4aoTq*b z_~LKd2{*3DC!R>~7I{o4V%u=d&}4}bR2F%^<9UCV`HK7Uj2&MR5@m!a!P69RtV7Zi z6XfQ_6lo}GO^>EvMW53Kh>{EtGGQrz-c7=War8Lg4g8x4*NnO*%(k(WOa78~@huI7 zM(ND4fDExP&*pg5-MZD|f930V_4c}E55`_CXM&*KJl|OFOcUds zqp^xx(p{a_p<|%jqq*S15fX-k4b8$y5Xb?LfM{PVn?x?#g$7m?;EX0_Ys}xk{8SGz zu_aAyJPXYmtw$eq*zzRN#+Asu5;s(55YrDd-{$eJn56UOXVk&gT7N9qz)9DD9+#L- zgP5bQqhv(xJY(tFt$w{Huz{}KtK%ssJO5=}DF%IRQAar#euV^+Y~h^;KfajZ`GV-q zEsB+W8nC011+fBT)L%*H%IExT6y=9i$DYMJK)S3?L^4X|mQ@KGb<^^wvDy>F% zne@e+&Kw*yzvxCRhBKxQ;=u<3gXusdO{5E+- z>>9Fd`m&L@m|CO8KkAH-)EAQ4Xm04ORhfw}Pc3$?b@=tmb-iixKEQjY4r*9C=5Cl6xY zHc_>8;X)MkTYnUtQ-;(I$HA9th*5MM-rFv&P&H?FWEQB@VRySixgB409kGjXPVW`q@qJyeA zZRu|H-fGvMg2;NWcVD=F)cTK#m$}4G!S}$w2)_RvPy8nu<^Rj_LC^=8sTIP_zC z>YdB=aC|)T^>r%25R69acm!Im@>(b?f<`VA5L#1YM-mbpWR1b&+9(!iiS?3HyLD()#!NYcu5x}Oc z$7{jb5n*LNn~+$8)TyntzohB~YQE4u{T?xno?0w>Oi^St$?D3758Z>(g`acvr)FVG zD*=z6rW)>xE{PB2hLlveOhLn7uhSaxIfL58ADg0XkZ0A<+?m^0J_a*Vp8j;3UD)aF zUs!hg`W{0{MIsG(}$?4 z=_J(JiU-8881@jfT?H&%u!c0Je)}q`OVYkxpvD05E=Z!kuIxp z%P%*r_9Yl8ES&iOZ{j1Pk!g}tnlSFC0$*e5uKKARDAvXB1l1o_t=K8fgaXFW8YA%n z-RbLIDz3w}MWc6EysRq6XUawon>U>Q-_!wC=JeDEkt=;mSQq5hsGaGN`08G9!(lqz8Oy^`msYI=KOts(sY2Gni{#a=7snq`UFaDwY?E!M1 z5ct1;|0xzh#@o%x(Lu%C!OhzKzsD6&-Ck8y5;K6K9TmM*O4znQ=~cwm;QM!-s$fj` z{24F}I;*+G&2_u&)ofo@PJEi)-&2!P=l7yNDz;u=UmSV(Einw(27a4eUatH+;yd!c zn+gp4fHp!2chZ28t=WIp>y0%awSXW9#gR< zcaYhEF}MLhfM~E^!>4Dbfd~ns{L}K|!7h-svs83xE61_TKs#*Cz9PQ>`b9^@A#npv z-`}a?%|0kegj}uCCZe~3=?tm>#PG7_0C-YAuuVQ+)OGN8Q~BnqrBr1z@v|Ak(R9}C zL+NWN=?MMt9$vRmY0`|lbKKo{I*t^>KTLv0~Kx19Q2YVZJdpC*q8HU z$(#?7?d8pmuN{64tn?@Ir{Sg_)#jCTo>N`o*eS zrK{WI*O{XEJCB;ux5mC_4M+mk9QZY7wI7Ez$rM#i$!OBuMaQu;spVK= zNS0JTR>GtbE=ZCIx5U}_tu6*+dc~GpJL0zaYBq`?i$}5Hcn5Tz2n->@P293@BYB5aO{aEJ4i~>x;XUF|Oa=`ZQ1+ZlI~k z{r1oM>H7Ry>6g#J`1UU#_}?4Le~Rb$m&WqHXCqKm_aE^bAEo*o7b*;ekYX+9 z^G{^Muu&8lB5?Lhd?@BrMQbY-9%;*gVNviB=z-rq51l&JsI=Oj1x-E1t0G)LziPv00>cAN0k@sv1yg>6v-a}1Jv_qgKsN5IziZ*y6$A|`8*=H zJ_pwtvZ2P-=H_7q20g+H4*b*hb@;F7hcyO8IOvteaN_F~Q@>8wf~8u2@#1>E5e&Hq zKJ(=oQz!5Z11uQIhlgDV2_tKKF5YCC1+3%xyE#IQcjTmP8@(?c+b$}}W926z3-7T4+Aq&>b( zNc_`H^&72x2J`riK=mly;f)d1d!5lpdZ}S-NbxmO8X|!FVp^X9C2s2<@XfQuNkIB@ z{9XOa`1^PG#{M}7|EC0W1xFWqV>@dfa|LrxJ8K8?{|*5Gs-Jy&GhlwS&_juYf=V7B zf`e67MW|>Dgw#-rSJQBX5_dGMT2YauDW!$IX)TM#f5(2=7Uj;}NM%uR4kudS_x-bW zrRRBf_Lz_d#-e2{i9;B*(*P({7rPM~Qsu*#b%ka%VXhMCM}&5zQET82OBcz)%FskG zpw0LclpxufmFZZtWxkpb06NT?mdA)P3il z!_PFEb~R7G^B;U4*WWmL#TvVAH+YaAyYD@P9@*feyNkqmDllJN$B?v?U%Nj7v|woR z`BwbIdBRNEjiWD(D3pva^A#Vj*dNN+dO z&-eJ4lN`*6huu(I@P!$9X{M$Cwi|C3pnk0}$kK>MXp~y;Xy{<=74Zo1!xjQ6*ZOx+ zzOfS6J*`D%!QE9b>wOM&BW)Z3ORQm3MuC6&t7UBFuc2Cm#oe}CP8wFziB^&T=@6AU zd>}%rEK-QD?%UC3^Rq&J;W&9#Q0TENo2~e3(`&7$ zjcr&;((8T?z{MU{-E`GR6JjnWeJ{J82+TdQs>V#P0(!aCCsdK)4l7D2|bJ!T;nk;{W@ zWr_uM@V&NHyu!Yhn5T>IJh#Or6>jpwn5EA;$Uly-O|1%?fsMTqEBa+}enJTNvoA`0 zx~-dG;H%Op7hL8J1Q@@ZE|mct`#HsbL#E|-hqmA8SwV;f-D4~h?O&tfutTJ zyPSxt>b%#hQGaJkdtMD$w9;b@RW6@2@W<7-KR!+!b ziT-TY`ROj&x>a@3s6LDI4ykxYA2O>!3Gfql=&g6l)tlvPtK{q+?MtWuUu##q>f%q%U zxNYc!d+AnQp{6KQi(!LLuCO8bnhxmR5;ZlC0PS$&M{BTR05A6#9ZjzcPt8ZdIYbR02_Syyl*UM$LM;I@M+g&i z$9s$`#{>laGaiEUl|bVk<%an`mK*1PDmQmKJ7E_~cYAXOw|_HT0jAhH&MIM!{7o-w zM9J7)KFrZIc4Y$850x_m;_%X~;ChzHR>ox8MOsy)y4hbE{8-V`kH^RZsP@`RTtg!O z+4s3~zEjWdQ{48SSr8wPeZ(lczfYw|%8Yd-0ldz9N*hfaU& zWL^y(o)C)DYYHbf+T{1t?;rAWt0FFAr8Gqrni)rb$Njf>FiP)TQB2>_&hzIL=w6AHW8rKHYM`Y(S zA@wP){cuC^RsYYQ_A0N~0dlyV;y%UXgzth$_6 zi0ql^a7rOXN{oVQdDCiZZd!PPCK%@60FRSJ2+2dm# zn8r0p9Hxu)uNyHW#i9DFUs)Nh{%qBhH?hR(bebNw2Lsq4DwQ2MdB>Nqmo|ig71|vm z>|38U!LNlt|FKn9`GihSOsD^3EKEK9PluIS?ca3!PBggHA$TzSNT^f(WfH!DXdu@4&336Vzwso zd!4wo2qYU@sU0m(+PC?mmVVAdJp9rk_A6?ec}3h|Uvnn9`(ou41%s~3lUhkVYI8Me zw@S-E51!X-Tv)M~M7aG;1?t5|YZ4BbXYt&*&%T z2Z;07SU4CfIVsDuU}8~fFj1Bt#sE@G^5mHN7sv4LRye!(@aqx zp&SnJ;v9~h#n{MayX5SVfF$BP4o#_?ylgJ<-}c2S>WfO@g|E)TpVEklEvNnxYDxj0 z_z`_w0*BbY%p1SY2r;wJO#xB=$9PEwudQbG`<>MOkIwpEdzOFyPHc@#o&I6i^q-Wo zy0r$%8m1pOnwvX@Alw^6sx^&%ej+el7lg>-gWgo_U#}r%X#0%;#QbIrm;`@BYjj z*nfQ-EC1jIsAJABY%`de5MGY9nYJUOEQF+EJ33lSI1m%Yg^z61W0#pwU^p79i1Eoq zC!OuQ#9`BqQv@9hL>u`@!kF`TXio2?C`Q~xUhSbzHQBujjCyq+j&fpR1BBW2QVxc! z?YilTl*XsWu#GtA!`MxA`Xey(5W_ws6z0x$zsRrsJ7T{)0Q&>H0@*z$CxBKAx~MGT zpiUAIJ+x)+AgufSCigkIdB)-jpke3K7yNQwgwd9S{N@w5GxNs;4 ztTgtr5p2eKXu@_+XMy$`i3zw>oTLM5)<k!Ydb%F-258vbh4B8T{tLY+lu^+?cIp#1nr_2<}X zy%kL9I+m5(JPI))B32rX)cC?t4pq-@I4iX@J_}|u6y#(A%=gHS&_1?LIKbM7KJtwP zE~KTRG&}63K21#HP;y*nh-={V1p=Dc)06Z%Q}Jk*c#+nh1S`-Zd5lxaqOEI|npzPS ztI=vre(YGkEt3tViV{~5SWOsjnP~Ds5-Hdlm2k}Xc($z3dbA=z=Tu3HiT#c4oYQ)& zc=qM#Ez6jTRRxiz-}BihU^CnZ%*12M4nd4_Ei#5pA%mnrBp%OUgOnWOx@JUZi<>Tq zXF)D-ZIRkgaQl#u)JsTO(;$ci`wY9p-d=sQHkGMC2yqe?8gQiIvF*rgHG7I?TP$ax zL3#VW1Fi1o}pH+U##ZZ-!{q@ggzuN|Kfe)Z6upEN&ycdR~5gt}V7FabfNCFt}lF`%dL|#blEKvf(SohKySmW|Ux7O#6)_^(ap^YIr;KO7*1# zYF>6cD@YH2ZFx%JH-Ma0EL4~^+O*H4ot3)tBhXB8HrK$lQn{ZsN}EWpbtc#A%LQks zia#C#%Hx_7ZH3ggoI1M=3(0%~VP)f>hl|_R_qu&Wq`ks-=*VYxXHv*#YcCQ?0uAa< z4fn9^$74iR(pPQimcW9cnJ!7ZDBrICh}Y9YbOQ&P0{2;RnrtvQ1gKK*ff2zx>y=>@ z_-8Q*kSW`34-qMZgN2-c<6$9;FfH{;XkeF5T$8drn9fhr_d=Hx9!jJ{Jv5o8X7hsI zY)qBGby1MGIH-w5P5 zCa8PEYf75PJ6$-X){;1pS(_(thh<++a691F$qq8Z-tBOzV!to}1L0UJ1ZY){n%&wK zJk$V|dYd7i&V|}+2N%AKgSzKKy6a2^i*Vc*Lv&dV7;kS%A-yexgvF5K4z#;vksI9@ z**5mqa=B6%laJuLi1qV}4kq1zlLf@EFRa9ew1({yBGDXqFo zstseVEu*@75@S^Pi$a^k>;r>MY5Fh8Bz_%0&xL24oOLf8HZBSKSNZsL@th%mw1JUX zxCA*=3Nf^Dn$r^z6-PTgN$s>a_Q#%lLNhXoAdk?GJHilb%rAltcxK_T$T>x#-!STD z5b@B{%c!T9U;|F^8-HV7{{r#8pmTo3BEP`rCOh3HHv`E_R{>&<#p{}3=cJw#N_KqM zBeMBNc+deUJ44*pMAOdjHHqc!>=nqxvm47v#k~YpULL}QCXPpz63Nu%<`OGg?pvT? z#i=M^UN=sr=mltgbjks@51MorH_a%q#J@Xo=A-?Z#YF`8!uYdB zDHBu;NLhrKvYn`v_IqT`O#VDa`GS)jfYmQmB8d*ygn|;5Q9wJRebgQ_z6Sa2;J$!| z6tlm^iOM?N5+08>U>AkwKd#4Xs@=AkC_b_CjNh!Ce?-#ad46}@MrQE{Xi^I5VP1E~ z=9U7$X06+mmEE(sZDJBD()Wt~s;M0pONz(XlITP-EkBf8XCr^${|BpD%erwa@h!3g zLHOSUF#nF^kvFpXKDGXBlIrZ@8F(_CUO)rL;Y zpc4^R@_11aiAPz@oGEd*UcBb|-0;xQL#oS#3DOjGQV&tc2O5dC!<5||BKeOXtCyXR zFy&d=yzrE>08eBoRsd(gC{x##OVY!rkm0F94DRwHGhRFS;*I^RBRlsOpBo>CraGQK z{R{KPrb(t6z?7VZDQ9aZRV`6QokHZ zAA7Ukns}_z9ro=&i4O($I>2PpNNj z_8E|b239JR>Y)PSG?@@JtQgQZ5PHawnfz67f=GlX5l?lDk}Zkc#%Ov7cYE1xUKsEO z^QN605(z$8Vqt_uiVS~0K5Wdx$QZ1NEHAi>^-2G0KJk-NIcz$PSTfTdF3j+cnh?Xe z9*=6x#2VyE9&*w3O|gPHfhwYsCNyowI^|Fpy>MNQrD#=P&R-dd=VX+@CIqpPkR0He zgy#Jc!SPa2oJT0or>~UUVQHv#S~QQHw9sRdono!iyz-inUF<}dDglEduMWmhy)J+? zQR=n4)(Vy9j)b|`WZi}3`+M?J4+D?9A*1e*df)8u9 zmbf^!YN0%{l7jeinjYb~^irI~O)8j^M?_s?EiLR>tK@zY4RQA1A)KPbc);-*{{#FD^n1eX>>*;vkU#>9Uu5)Jy|E0BAGd)XEsra68)q6GE6jr`TyB~ zzmqx_t9_G2!T*CS`d8Pse>bxGk7q0P-~C=~j=ATop1pIk__bRoDT>|8 z6;tuno|GxH(-#*;rFiKc5B2157?KPL0)w79+88+N z6W27CYdkMM@Jww65-cFXrPOgdE34M@@$-Jz&8t{YWK(1#UDge}$Sq(#LtL2p+o_3h zH)UTA9A!79>pkTGKMsbV!*M+fawBWT`%m;xn!&#!cO}oC_nKZ8&7_46W}GYPg~i-e z8w*)mvnMjl85$kQAc>d!@r=01Qy9GI&1cdwKkDMEm*e>IXFV{=+rUR2d@3-@QtJ|9 z1u7uo_yw*cB%y$+ikvd85@dXUy4?3qm`xnGkgR@xK-2&60spms{kJf4_|}?ykKF!y z3#+QDjID~{CkL@%q6q~H5~w7FX_YjObR}LBnz|^&SPw$-v!L~mjK=W7EX|IMVg%{~ z6^={K`vA6vnPml2-2Q`g*OR>0-2G8-0FycC(U1Sl?`DJl>-B{F#~MIK1O-{PJ$?d# zPwbboGLhpFkO|_?X$Xl(2%}Vd=l2(pejkHB^c;QtiDMB731|tB2TW)pAr0dl@|1B zkdu%fshKBGgu}ZFY$zjxjOxg5tzL@_t2|e*YTdE5jUXnQDkRwljXT&F3NbT%vkC~Y zv`qke%<8IPXqwE+DisN;H8H_U2~)KOFUi?+2EqM`h5vkEK02D~b@K{e>C zPNS;GUo{t*Jvr$+%`HLCDlKRdf|@NExk9T^Zkuehr1At*%<$o*3&z|^ZG+`uyLk-Z+x^jr=Fi4;SY{J- z{>uH59?Ha?<^hRtv00D#C70+tlmhZ_WJbsILsYhm`8aExk`75`^&Sva!hya zX6eBpyokJ4PGfGNtz~FThTAVon#DJv<_;5%?aRW#G>O}o(a%R;UDvQ9P9@gnh(WY8 zvo(*#qo;|^;No(HSsELv)J#Uq&cZU|$6gTDq33+=xHa7=g5sqFtGT?wooKn0t_Q-0 zo7Nc?RO@5;-}9>Q&L5JreTGD1KY5{bozpI;z~0YKwZ(PV_k_ds?$1@j{~jFC!(i+Z zUho#iSQx*fu0tF7xYRs)FNvT1;M5=N8kVd@?&yKM&V zxxiTEnL^VO+07x`WM2Kr&NZL240JhPA5jl3kG|*+D&2cb1o5-#FdJQKQD4kY@mr@8 zY1EF#P-ZqgiS?h|0ccWXY0owgA0{1VC|sZP|0rzRaN#BOzUgVG@8b5qwnzRo_W!%W zR>{)X;(x^d|BU#t4N!v&7$Nkk*fr5f_5}kI9nt&68pY1leQd0@!V;+ZGXvkw|HEjG z6ou{%Q};W(xozCv2@)r}XpV6o0wbur+C~VvB+{^3QL=N>G`W3U%6MFk*)tU;DVTJ! zgf|g2&Z($`Sdp_Nr7Ma)!f@F@XzGw+cP2g(4Grzh*6~$l`b)R9U893VhrVbseUU3K zaG+{O5Iq*d%hd~@|BwIQ4ficO?>lq@|F5C@-^nGEzn5pe8G6rukdKxwmj6vIp`0ZF z5X0@WY>wj62O;aNl*q6Lf?gTBm@y7~m)j-_%m|CJ;J;~+z@Jc)K%;{*@t|pG{A5UH zFQY;PxD`eGmZL}tS+8N2V^Ng9q_f;pxZ_CHLp z!*YHumTj%o8N1LU{;z(LqR+7*Hv3r)4@3ef(l=v|g3%Y011FbXHFMWn5!!DKpo(3i z>vz?o#uK_U)agbSrmfMI$r{X_)3Atq4XqtQH%NzI9ns()D~X?j_59)JnkzhL8fOg= zY3UOH&nbhx!G8jx0^N44_8Sae-+c6cJ&1qJ<^T79VEWHqPs!T)9|Qd)*`^yaR?C_v z-5Rm1(J?JhMHIoPpad&I);;p9Etky+yNn#zV|~hI3O@k&OVKd5b;$h70Nu3jG_Uh* zM$X&g+8_KMYzsR5IJI2Pv;v@Oz}x+m@mYL!uNuezaV2&*OPcy+z64@S%M6&pI94jm zZWIXJ4ta0g3TLG9Zl%b^I?&aurt^)Q*jfQk>YK+2Ep5`@g!s?n*OR$qYxJ=tw^Btq zd>b@dzA27deq^D?z<=D5p!z?If2s6eP0TR;Eigqb#ZaA(Kv#{WKQ96pN9)pv- zN#sCNGqIGK_}<_s+H_z!EbNRu%C%>cFayNyA*_9}Mmc6aNw$q|mV0A22=4O`jPaoe zfy}DgPmc7%Tv*?`Tc%LU^3li|w5^ShT$_wm!%X1I{>a)X4>@?b718~N0XF8@j4orv z;wCiw&yQc;eg3f_Yc6wKr0?);0x56rHvwZjj;H{i0+qV1FVK4UZ1G5SR6_MR$KOHD z@xC>#Um%4~`yeH&>K^(~`<|_Fqp?o0wi?5%%MHVN`#`DWEOQt)R)$yUnsJJM!ye9* zapcQ51|h@4qd~1e)7I0z>GS$=#r|^6cKc8Ee*};)GPM1fZ@kEUw;BI`;)VJD!HexT zUJ(4)B%NO)%&U3Y(6TETVrIm9_?2Lx#4d>yDB3!#F>!Q zf8bVBLK~z;4fn8eV)P*;&hQpK1x7d_BWeYnTI8C2iRWQbi92rs1x(3t8QWKvAblsv zg_-o18OYLzVpVt)#JIivG#kLVj%0R72%C_rXo%U`yx+ns3a1e><`<7S)KUkxFEzF_ z*UKo_t9@u~WHqli(Y4t;i5$M|9G0IvJtPuM%l71*kr%{ooY>MJayt=fUxkrIEJx)x zNWBx{cz6;l45f`wt&#ZXBqVr#10;z0Qw2O`nLsbiqmkEXY8yGZwwb*qP2((ovo&&^ zu=8@NqXmwp+xVw4y37@inb6F!zudK>-F8NvWRJ2kIT+i}bhJmy@UR17(kh|!2$L^e z*YE>K+al2GhWmy^pY@DxNViN=TV{`xBW6b_rE>5o{OJQ&`EX$Ya8E?j7pyD}8KiT_ z>SrwU7&ktR&Vw}M6dxidTbOZwpmCgL6~&qabcbA1QMdbLtD8=ltw3+JKmI8i>ekzy zTKYx}!~cq!f0uUuUuow*F{5U!jx3Jh7iPew*#=5vVNF9v8=3&2JxqmFDO!nu{S&*S z^p7dCBzoFTcF+8S@ZW+jp)KbC<=Kl1bN}SBI~lZs`jZf!^^TrLp1JO{jBdZjwY?vu z3kr#2F+tc=UVw_Ito9NEwE*n99M!h9FZ=Y8b5%*N(pZbisb$FcsJDL)l6#7tXzwf9c!p zIrOH=y=u_@Ou<}mZnX?`nP{YI7@z9`u(Av4th#(SH+9ZFm7RAAGIUm&WXxxN+cL(H zdk^K=9x}ughWj+#q!Y3i&bwVZY?V7wKU6%*#M$B@TnR*nx7-BSsQcEE~5KrLr7_4%J!clr7U=kazP7Lucx=s;DJErV*ky3+*glo z6W(&3;8@z9VO@%}kS7dmbV@Eb4C_9!Rx8MHPDS?Csqsv-zYlM9I2l2<%S1xJsud!K z&zl%1S~A+I3?j$s6^bqRY9C}K)YSSi!y7-I-*R+2$I3O79azK4HO}sKm5m1yTBd|EI}Z7q3IV3M zavvLH&*~Gt!kp(QmVNInHH+M^1OOfl4Z&x92T3{@Bz#y7WM-)zGD_z`zVJ6{YU~}T zNid|SKq}`5mv`(Xey?QhR^8hz46(Wg8;Tul@Zrc_i~~9Cv3x*bo(tbjR6Q;m7Ek_CVI4 zF(S#u1EUU=vJ^tiw4jy=bm?EoBkjKR)0T39e!`tm?3{9ZscN9S1gLPA)9c%-%hD`F zjCq-fQF|NITQmpHM?(L;F(Afk;+*)>5|=pU(AcU8W5@%>0h_X8wJkoEE3o)^{tbS% z#|Jtkb*f0*;9J2b0;3#b=to|O(sJTkd^NI2myB_Ck3W7ZTyuBmBeylcJ;K{9En6GU zS0d*R{=tnw(GxT9mKa$PUNFCwpOJ;pPfL_JLPA*zp497JOp;>(E+GcFcAPQQz_E~3 zjF-ezW|Yx~JNfOi_^PXuzyzLT0*5<3eYbBUZtMr2CO6qF!w1CM|Di!bDJ`N>&`y&$ zEv_rU0zn@vzbobTLRRzLCJLHV3PU0K&2^yg<1{H`xw)G!^ zr}9C{$;t09;ru@;^nWc#B>#=zN!i8lAIG{(gzaq|oJ^gaN&fW@|6O5Hqo!?-EsDWw zU3as*QEayf+e7kOi2kBIi1f(P^!%l9!`CFlaJ5*SHw^vE|F0e5!W8TOWDnu*PMhOaeX8f4= zl4MGbh`&h2BUOw9gcx>MS&+8qgZyeykvsp4b-8&nW^k*I{pu27aoG9RV^Iv`QKONF z{Q7h8=SqDEVndv?Wv+`ltEhuNVsilK#y8T(rxi##>kyT=9A`Q)9U!9gl`OL04Z?~X{-hm==ovl4ux$sn!-A@ z*O}k;9-ivr>$4K`pzF* zwYFnmn^_mUL+#UUv24JSkMcuh6H9<-Jpt=HF$L=!F$wEe3WnIuKRYbgmgwUb%gK~?~w zOL-%~4hSm;Feymwi9LTLYEi}a;xz)11vtfIL(gPX&jv{OZ~a~wBuXnu^)z`FY-<0aC?&_b3u57yNw0HPA0CUyK{%_ieWSiCf zQ7l5$=PvQEuMhCg`Qx}#ep?*qj~@`<_Z$Dey9}oP%Ovoh<)W&s`ggSNSt7AnxABYw z9qE;@wG|dHYB2&8Aq>l8E2b|HNMPFuk?eG7n%c18S>Zoc_x3rUI4jTlJAi+3KWj%2 z_-x?q#Kg_*oX7pAV{ZDI|LgOfJiywcnmEc6x9FuXuLl%XfAn4zC|YANK~`XBjmt@6 z)j@fP-SOC!#DO|)3kwPo#)veoFpQh)S9?`CP^vf9tu+N?Osdb)23yZf_15;2Nma|O zX76v1nC>G9dh4v3R2xVbI$jOE*`2!Nhpdjt8y!so&2`2;X6Dul7ADfYrtHz|{)_6X z=JE5o3^#42>SX#|nq#U^p9W;MZrUret>?7Or_SF}tMDR`-2y!NG&OW+O`L%jLOV%~ zmR|BDY4@hiYizz5mT#%HuY2Zk(5IEYkEzD5&_IdH!^ud%iiV;m;4Rs1}rJ+4Ii)<_!N#!c$yq zyFanrq^tROvCIKY&l~+_o&DT+_j1(By-Tcf(l??bq)+W;U~}mTZM9E`=VE9!Ub8CqqWQ9R4F+ld#KEM`G5DbxQb!Us z?hy~CdY2GO{Kbg6x~e}zg`NT@hr96p2WA^w9q}%Fx0RR@y}s_{HTD1y?h-J-41Jqd z;B_XFRp*$L3o5Yf)hDg5={oPo*B6ShH|Ne1e?QMV_k+=tI8Sl*o}#{Ix(#y{n(yf1 zfa94U7hDm)e&rS9_93h?=q%-r}*A~|UkPwtB~1?SuVT)4WRUKogZfzC;T@J}L*d@g?E?Lkdmd#50( z^0Ess>E$Z7Cyimm4Vo%%F?f80myEb9RUHyNrs5DwE9T1n83595z^Gd`4A<-m~-Jibr-%mz1>{!t(f*EfO>j_Lq_tOZYL1yK4%E6C@#zQ=qU z#VxZBG|a(U`%nU~C9a9Jc84Azxh@t=2^7G$mGnHMOEbYwyOPe|4>nWfjzUblF=Nu*oK3>ic12+r|jsPIQiy*=x zy$6FwN%;wu69GK9k2_;X=e)NdOC*RKlPMxwNJ2KMgXL^<`?fjbYjb-|rn&Y~b@|84 zBSDgF@6X5MTd>w7Y5@e2)M&BET z$UnsMd5ys3M8QhHkS`D>O15aKCdyU`IcESJAWsl5Srgvv&)+FFF5tjP`UK; zA49pibk3q(^eUYDW~*5AWS>|;fLL0!q-a|oNqNd2n<$!8&Rn_l#imgop)R`h&S1Ip zYahjO*e`ghAI);==3k{M^+gR@X4fQs*zyy%8v_U3&?B_RG|EZk2sm&ntO^n&^=kkT zTDegM<|g+f3P14E9CE%m_;LYgmmD?wj_^MV-M7UF@_sNLdi)F&0ulv@f}H=ABO~k( z)X5`A!zsti|H))3j@#ReN)D+a$sRGEl=~Gaa1F9sc(FURpDQP}>9Oh6E7pGgh12c(o((L2TAuj6Pptj& zD=1fAg32dRj=oKJ-U}($Uh$)}t6#>f;!SPDk@`cGi(gBQ{!ksM11@5(-WmJ+qgd>o zi8&izSif1UeZgSgdIs=Q+}^bP!fOrJUgaYiRiErx4O?%lecR*KE3V3-m;rbow`;HR zS(i(%_L=*|yIsy+(IYR{Ue&#?Tk7l`Y4IC{D}SsTzbU*$cTON%L36vs-w-7*A3w&R z2~!9%qJ*eY8FPZUbXHjAR!LK3GJ2{^KG^%;9Sg-=uA4+Qa{(y~5%jh2tf3zT02_Z@ z=O3Jq0pl7y7K;$i)Zebm-mrs{*`ZGWzYLIrVe}W%#E02J@89;Az<$#bDoU5ohZnz2X%O z@$oGzU{s9tSz&&evxN^1m=TLS=)`h`PX>dD5VI!@hJJ?4}zgsAXGUN6DR6(N$`K0@paZ z8(+t|%*-lf4JRko`eXXJq8fO3|5@)ZR30Yr9KksFD{y@-00Z?g+W20wY6LD7!ShXu z1{PdMB1^EXl=La~pm0>|>+DgtTldhbFe1otCYwGJy>QccYCJ z;_QgTECp0JHsVBeIwRt@XX?g9P~By923T6_u!tu0Osx6t&si#%Z2YB6gpW%EwqIDG48y}%ujHb< zX2zT-8ltO`GH`E@37gWgfnY2wE1zV^Yo!9^lo)We5c4QNu!CYMYvF1jSPNunNKB|B zksFvMiR!UGx0Nd!CNTZ29Q>7bPUxnW^q~@YQwKpR zno1?ii42k5ytK;gSa0Y2614ofd#{oO_9D-;?YeWMK&$sHWdFQ z^8MqjBeW)u=B;F76w443oQSw>4Lv0RRgHq9gNKq*VoGdLLs`ayF?}e1oC_tuv+m&AWaE(7 z;yv?k$cN0z-?JwSXb8I03*WQ6mea#lvn3&sg>qItv9DpqVWZJKCRM(NVGJqJu7_aj zPk1ac;gB&oW$^3tfXsx9&wT1b)vS0{)!M@x%RtmXu&sut9%x~wnsqGX;0f)`pG!ls z&SYv5{q_b0p8K972Cjix4K01JHlTNrJc~8aU}WMz(8AG2+8#<7-N|d&*4N6d!&H!I zV0-V;y(XOsR+5@7V+Tj4VHBxn#-vD#7_XqjjJs(1LS}TPyJ2Y-XNh&A`wXu2e@N zk}ruYuH-{uXhEFmjx4Ta*_xDa#5`S)N6Ce$vqS3aX-qE+GEl};qen)R`~YD}J%*Y= z-~Gvos8=NhnRwaJUfWw)?Pq4-=$zB%I7r2UDm%Jp@`X;H&sfh<+HHvI-gF%3b+h>V&!5NaR|0>7smz!`@*25dVIhs zV{V|d(GmoWQv=TIRq!(*n15Q&tzM>5w;zp51FfVH5{4*Q_#F|Pt7`?$FP*>gehlZ` z@e?GF91_PdKV0X|z-u814ajhxQ2wYx zaeJ;>3n*r^NHiX?KRI5m-eJN0llbEk9n{g&6Ly7eJ#6pYr2205@AkC-?vPm}+%MkO zYT*8PJ5iN5LU(AU5XoBpxSBwgtehp&^In@U-kH>=HI;RB&@aMz4M}mo#s0QLfJ83r zSxEW2*L$z~rW^5FyaR)OCG^GU9vHlcFH=U3@#Aa^RY$Zc9%$T0xd5Spj7ygj9BC*@ z=STg3Eic4W&*~8&`k-J{tuT;i2?xrBl_{RqcI?*nJf{(Ti#XQrUrv=;|Ek zxuNk;i~caqYp>uuuNGG61@pxI`8%{5=Jh>FdzMV>714t&RDA~z9*l!q5-&B6OfBs| zJO1{Ar^s?zjl`jnBnLYEQS*`JN`Qdcu$nrcrS%^FH|N#=G#NwETn~1vBx06~I>%xJ zPiD>1>YW<=E7L!ih^M!sl8!>I(87zj;Zhs?3vMO&Bgc2&Adk_+pAIw5WvNW^&tKW4 zlbYx6U5*~rpZ0WeQQ0I-{5m!E6*=6gFtcnph~Qtj{3d@db>Bh3-!eW5@9}Zo#oZv# z{rN_Lg9l52e=*Kmdyo_d*aQXxo1f#NM;D|c;>3Y#A_|q1K+Itykw?hxI`pIgy(qLQ z3OIk11%E}qvV0~5e@**4I)LBZ?#tyK@AG=ntF*sDJEJjZ5S-pUmUycdPSicKuX?1h zvPWjDfnYoSyj1i4XlYjSv-gVA0N2@ofPw;|6;(BGWI!4GPBpm2#M1P(dn~Yg<6{P+ zckW8s`s(3&^094JtP696aMjDeqlI6o^{I^G>}2KyO6nG5zfpP^0Ak(5?NtUfPBA6~pnB|c3$!cJZvD6Mcu?sgs9A6w&fqgeUXLlY1aG&;m+XKoD zd#7K74l#KS^-UXp<RHEHDcBq~hjh6QSS!+<*BSXyRXc1vI$f>akP z3+o*l6=lk7Twc_bg!r&>(4la%)THT7?r=igu6(8=U`moiH%W~;UVNm@Xz6NhSy1)+3W2qhMR*%xcP9!NxjQ47|u-z5aLC_%1lOabY=;H z@6cgZKvfa`ENe)aUXdP~jw(m75KBVMj~S}f`800q_tNjO%JTz=xq?X=Tb`xN)KQ<; zoR&714TIeppHDVWB{B6S8X*XdW;RC0*F;j*naCs;&V|GwyP^|^2yk2F?ju?uihb_a zx=4vUiaaCqB3>E(DI8HXjNTJ(MYMTx_C_z+P53)2~*CpkH@E3y(mqI>dpOqC;D zF#0gF$-@*(FnX>ZjbMn{BTM z%o$RI6f-@{GUjX^ImdlY)8}*^GseJxjfELzHWa4en~onD{WD4VapcBWMx!Cb4JG07 z{{+a7xc^w!3seeFKn(?6w+Mj)4n%Ead}(fIsD>z}i`@#myIAz_DH}b~VElniuNNxE z;IMuXv@Jqn9%D)|4zzWfbmB|U61<&qY630WC8(^B9-<-g6C5mi(r2Bo2{$BqtD<6M2aPh7D7?^nG@I8AG@#hO?QHF}!pXOA8^~Z8Z-kGe^kB z*g^@EVx6|$-1kjzD$TQ(=%h-im+a(}MMmvyVVealo^jX$CRL zuIRM6UFO(93KCcYU{jBz*oE9Jf=n#LwixSvk(G4u~uQqYbfbg4n7zAk&6=G`jF>gTNKY z@B**)9ov7#5#5{_KzGCV2dW>SdBEF+!W&ZifVK^|&qI9$+RB98Scu;W*xDH*AIPbJ zac|(P&r}}JsX_m#7h507G{o12{nO~`z~6=O+$3F)qYDXNZ@o{@g^6dReSpw~thK@G zklr#>bPd5nXz~Sh9`@K7ENjl}&>I=Si(Hcy=etWcdAOek$fsyJTJJS0u>f|(+1RRv znX)McN9-9`reVuMK~i>R7!kFiYfTU^71!WwO;GH@Gk;_V)f$E~j$y^{+{xjcreY{5 zD5W)kmL*1DQS~5*iXggs?l{3h;W`Vd$(QKbc~DEnZZkq@K?rK*?u?0CN9<=L`C!Qg zn#(8PvsQcxR8+;MC>;$6qGzH3Z&Vnd1mYn?#iF7sD5NOf*z%`R^R#{u3fkR*M-d~8i;%RFrQ%0p+%f03i3d9EaBYzDDpL@_O*Y$%o$ z#Wb&yOsH8-`9_F1f~)LEloCZ5EM!*}|jiVm0PgAQ0gx>u3t=t2$C z3h}8STs6lw(p><8tZ0`lr!#GqrW7fKF7ResS?AiO%W#7ub!F!8QL<_jdK0ti&6Kj* z-vA@_Ee7SXO#(CAA*e<^crh6%u~W%tGD^*Gx@cmvlK6}mlQrw=nj=>4tcZ(gU7WB8 z?~iSg5^5_0x2PtcZ9&IMGjV7@0Wh$`m{mAnJ@!kif{QWJ$Bc9?Y3g$%Jq1(R{FoL> ztIviFp-P4PnF>mn3QN6C(4KtK|3m}dYP4~4K7S+TUWdEGeP{%JNJU;9j20AVSa6tE1;T6Ku~lan-s@xf z+>zAGcMMZI)J%Hhk9FlvDv^$n7wZK(7PasSIDUJ~Uoay?lw$;#FG(afzp2IuC^sBN z@7JFv<*ZLHG@6#(93a8R$Wo7ltI;c65xkPUd8~9xlstcU#i{&4{XJc;Soe{@Ge%m3 zOwKH5ohJ#+8fRe}R;5d|2X*!`{wCow2%^lUgB zl+Cr(YL4y@&$U+SK<$vkqZbP^y8(m;v6wb{K|LX9byvs^(eN#U-6`+3R3JKh82+(Q>CHUWBK{T}9O|WwF85_{dQmS^@=9P6zGi_{YmaR?2oY+=J z3#!;wF047O1vTRPST7%StV22_>d>*WdfC&kil%6p6}+j^2G#Q%s_{CZ)-V|Xa!}1^ z92T}#>k#DtFoKbbK3E&dS=KE>t*9o6;xpUuLlpB`iTHK6vJwt-+t6+l^Jlej8ArHH zs1K!V%kz{Hjy3zxW0bQWffrkF_jWL*O4*zgo=(`~XzU9LCtEa?-3ova1|jNDcIz@^ zBWItvbT-3Y=K0Yt|x8>ac}Il-ERkc z&ESvgeHmhQpo<*j>5cvjiL~N_KK@89)K-|qi;$BMj<)sagc?1<4(T&CKFd#Uq#K=$ zeO_8xS?7J?9=+u`Mnw)Gs+Gh;G73sSiJqTAny<>D`(YEhfv2EL~IH}mSx#FZ^+qP}nR>ih$TNUGF?|sj^ z?VQ){-tB&PA6A=fwfSMLHD<@?V~qa)+1Fl9IgUN>LUxUh{=)a=4bx=_u~xQTI0cD) z9N`t`ORTAlL(M9Hm>c^^hd*+H9v)!>hLMbAH~5YYS|Gts>5c2x+c^il85=4^AV~%? zVq*@3&~%1oz6f7pJycgo2CA~6GSO~H-v$;RzerNcpiwmc<{2CgRfwe3%-ddZ)4dhb%rSo?35LL`i3xV08n*3 znYJOEw%FS}l-BhA>Psii??YK<2swS1TT-Iv4k92CMFSj#bmPbelCsa)1#oE{LgIsp zf-SA=qUBy@OXM*$gTUMG=x0PELPq2Xmg}V3bMMuoq#_Xp&zys5o?BSc#O8BGTG;@ z-)H)LJ_6rgSwON*(BLlCOko1UUC(6#ldtg%*6_hyuSYtLYARB1V`H>IH-)6MX>sUW zOElmlJ-NI|?}bx&(>6&Wvi5`L8M6+~y_LlZEsc$uHTsDhfb1g6z-!SWP!HCtx8JA+ zo!On*kM~#EGqW2`k&Z)zJbGn+>^uT z9*HqECQwlK2g-|?tAC82>5ICnA4czZC+61C{;n4<5bqAkE(|YJ_Yv6*9v_PLZo)2T zj(^<%OY!~bM6YS>RcGSg1LKKF)4DBB`19%Gp9Bo1tDd|#Lo_Rp-M(lyB9^~uj1pRN zvPLU3sA>QXuD+A|5gKTEeHL!9U~YI?Qz>;O_y!fOAX?)o1ySbz5V&_{MQFfrW9~?* z(eHSXY>ufhh`Cw3;Oq|Wnpmz!c;R})2@~r!~v1MMgX0-WsAq{$B3DB;J)-3D<#bZK4)? z9sDlI$Rn~~GY@Re5knIsw9}WSN9JFdJrYq71STmI9oH0wKb%X~nCIhOW$yAB)p+7- zoODgOR>gD4X!cVhT#IOxVpcUg!^tJb5)*+1%@jW{(_YWu3TPxFp2O8*Zzs-v$s4mC z%h3}y%c9UKk&U{UzfS;DH9L!z!1sOBD%R`>a{osr8)t)I&1i{l_%njwa6x)`IcQIu`~ zPhP!~*60BPeyQW<{4ue`J&a3JNK&JAJ1w~*m>@orzXUXorG!yf-5rh(@5u78a2mke z-;jsH1IJU;Ns;08_Bf<1i&50|4D3LEdxHKJ1U+{Ik=nBQJ59c)?G4S-JhZwmRlZ!|YeEP1SJus|~;%jL38IDbr@AhO#Qs@mkq zsexu1g^yI6+-`(r^(f((z@=J=*lu{|hB|;DaLgcp>w|@Mh9;+W&l-?NU0LpVie>%4SqSumaTXvQ=_?UN~4#s&s&cEvNKrf*Q-g`N}0Q{XG z_ojv@%m-xjo%`nIT0zR&SKwWYvgerNlY!;OAATx6poW*4k>dnJVb-z)Ocp8R$^_*V zLUY^f!hW)Nxax!p+X_?&7b*Bwx$qDWMfN&+_T4pjemdrj*6vsndpEWRQx`}St!N~T z49NPL{=e%)nF0q6jvx3&F4%rQi=DBr@Y|a^242YoaMtOhrG5q;(X5yV;&LLoYtl2tU_fpQxoQADLTl!9>q>1z{r|I}Jl!c^5F7q3B6xeV- zr3p3UF=*1l4)S2iLg&A;2pOf)DN)8rtpkrYP=+xrpzjCmnw$WrT~$N8VWye%il9@d zbz4uRh)vZ3*@k0*n$Q#z&q1wJVpL528sX89qY(9fw+US? zS(|6lSAlCVi9|VHIjokk?{=qm?Q%3qqH^;j99+T**wCDCG$b&Dfg`09-2-ObPXeSb zV*q;K0}>!a0(SxkR4DEet2=Sv0@aByFN*ky;sJnm7SJOJp*&S=@NvdX(k$?bA_dz# zWnV>hZ0ls`JQZw^^&(=kgrQy?MJCA|R}SJV_!@DPT`O~BPr{@gzCz|5ic@KFiG+f9 zjc{akC2=8OTEG(w6qTPg;4fNZ)u81c4yP{o^g-2<{>fVD6-=B)fuveuXU)A(as4x2 zw@O39OF>df5qp}j1(4ME*-Lu1w^o?TgxQcW(#KqL7kJT@(V`=3=7|&zCqC(dP0{?I z{1lh2$7kdc!@Lz%6ZPN51R} z^V`96NRa-Bj)tHAm?PE}JJ0ejq-+aWB}&*3Psp5i5f0szCLLJIYplqptDCW_7h3@& z$R2!*D`Y};0X>6<6p<%~*`dWww6h}5Q)!4k`>!Lp@5IE9SI(OVTdR1g?$Pct^{~;F zB7!wU`Twr%S%=2C1z;RHMBcHgBQiiAVS@?K+J^eu7wFTYpXBRjD=;F#Smx_@E5zm` zsRJ@uxwD*JB$K7gL%>)>X-~ShG-tpcY1ha$9oQsG2Mj0M9Gz{ZglItL>?4(M1QPmo zV$<_V8iC!VX!3Fzq3a75Tibu@H#VXVNuBGLJF-p0F9`)T0;!zfD(5)>iX8DPQ>H>9 zilS_b9Dyv8=>ySEiC3s}fIW(2X6SXGVnr?y|v()ni zwS%2mE>fThGQd0r*=Y7p@G+=GlJ7D~rT*r)n}#9G3b+g8Srz1|OdctWbOMWoSMcMn#u#^1$DYS9A!Un2bkB=aS!eA#A=H zG*^#PbV#3=+@YX(C1Ac9FjtRJWK2LCepkatZ%3PJD8&OysMqv@8}%s*f|yMFL1UZ}vDe!~(3Mqa&SasdE2^ow z76I*Whb=byJ(6Lmi2PwGs<5Q0yEZDQ)xT96De05USAJ=WRjZt|!+|StumX|PM$U?Yt{`sbm99x|7<1sQ2t z(5idup{f{>2spu`U;~1ubK|Uv;z)*)*#svTs(N}b4F|th)|qhsWw4OUb9OElVm`F`j5>6!2N81+uS&hGV;RAGh;f;K#1hQ7fKID_2EQwW3Xhx*+n`rWF*h+1c3F6QC}?7@J4{s#ZV0sr(s ze;431*k}tc9aE_)9D>GfbMqIyViX{8N%T{nfl|;v(4k_y(*zaW3c$k*`&4b^C95k( zD=s931ruPq)+(5lm^BNndlh0+AAx5@Hy`_0?@fzmM02>M3R^@kXRV42R+czN0V(_& z)&y)?hbFc_kJKcf;E`P9Y)&IBE>Vf%82DFQo19SyxM9m*gTeww_|jfs-K@+C88sO? zv$n?^or9*5Bj2c~$Vi3eIw8KbJ?XEsg!VjiN(pH-+P(%wsS31(DU8Lrh!%_k@^aXk zgYacr{^KvH%NPGXO}_?(9c@Be`o_J`wFu$M!Td*Lsmo$j%!GJXbDCB=OD(A5pWjeF zuwzAmU1)(_Nd=FjqDKp+U>V?JY(IzZBd=58Bo;LoP3)m-ICM?yO?_=tVHtzs&5#xq zV4r%RpOe5}=rEt?3LfXq{#ta+-69hP4W(T&3(cCpMPAqh96EB{I)aYy8Zk(loBUyh zg*wFd;HB2tW*=o|olDF*#^;<{Fz@kzkLmp!T6)@szaRD#y4IENoKy6;rJ5WY@0t@E z^%i7#fx)5{rV1fk;XHc=BvtW||M)$G@(a91WnSv?t$I7S$Q&_{nfoj*beV37iF{;~xG1RE&GN3Ijb4H~zi8HYP0imTDZeVr-a5_R z{EIFl{BandtUGCs>}z^_M0WmA-_UW}?~Ug_Iw`ybmwL@Bz9r}0#P_&q?R1jZZZ&-m z>XY#0TmGX>^4gz>I8VZpPD(~T)Kmhfi5R+6g3vWN;meZzM`o$ZWB>Dk_Q;8$@y!Sn|-uB7cg$Wv}i8ZQKtB7&K^cO<-V9|O!g z2D4c2V5y>g+o%VE$OWIE5+nHOapX?&@tds5pCOip67^Yd@pzV*nLUyR!fZOS1`Y>G z>IEACIusNQe@3V*|74DB#dckIaYlI&mpJHLjeFhw$fhv88Lf|DNOo`&pW2_i)9;qW z@0(5uxzjrI^j633jTs|(IkxvhrHDyFJ|w2nz^90cAC_u344VUXi*FR*6>68sCT|*@ zFX}kJn)AAoK4oo_ewD~3$%;K5vv$k=C8$do6NfR1av<5JSsg!}1ac>0U**}+Da=c_ zJdQ99cej6M|B|{v$;ZGxS~CWCfp80oC#+F*AN!pMxZ^5P<`tt#nN~p`J*J{Lj2ioU zCo-mY5Rn9NATxG;mo(OKr!p3Dw>Wlu$68LVSMnHVqx?3?URH2Ocjoz`y2xOof-z2a zX3?h7rO>U@CDJX#LwPN~op`OfopP5!59Ak~E}74a&%*b-&&c<<&$f37vDjjQm~MJ6;@7>V70=uB%sF^H z8zL9Z6wrvRu|dx->Mx_P*Z2a^oX7#7U$c>~;1RZR*jZ=R#vq<$m>X#BCz^IHF%7^` zB@l*eCg-8xgXij0i@&DtSCo&)p zP=A4xM`T)NyQz z%4^TCB(`T+A#=uD3TNUct;DE4Pom#M)w6nf{Gey}kbTmIS*9!MP@0_q{kztH&ri~N zT|r>d$T9Hr;g{CCxbs}v^+-&s3vm|N305%KzknZaGAYbp#;qdl3n#scvzS$fm{r3= zmLI6xCXJ%eV|&*8zxP_You8vg9a%D{s~L)$@9t^UWMNt&Xi9K2CuvGLVF|XXJi}pD zqpX3eZT;Ez*?6%d-Yf&m8+RO&C=zR$>wX;VQ7wzNai%)RS0~$(rOs2SiL@!CHYm_b zw^^p`{Gb&&Z7EBX=!Fd?g}RzFn^wRR$urpSN5i~fHnG?2kr`f=CGf%$yrzR8UbLAr z($ue$+5%=v+e()UB@9~^f{Bb6U!~(8q$8KbHW`3`+OyP(u^id!z!`nU%;koIl5$d6 zAcO^|tz2Uo6>Fp9CCVDnkaQJcbw!;LiWg3>#E+0><7@;~trJPux>fXE`uP`9ixO6U z@}_&CZtQV|D3PK3WL>vUVOej*-c`)nx}2d~FG??WEsz@2sQ%t=6%bDZ{FvigZwo)G z*9mVP`Zd|hLhbxuRzkhLN?S_xqS-9vz_sMKps0JDx!kU-MfrD(?Mkw7H#ORKb7B^4 z4&~gAE4>D;@j~_q%6;AxZH!Ak=`Ui5rLXHD?nz!IOjpwVF03)hggm`(+gMPo_;#xRk97(s#nDfrrPgvtf^M14gQgOxu0YV&Q`b$DO<%_ z(4!XXvKReXw++i%(b^AXOtqMbZlY)-m@N;@s?RyOY-384(xn#I7y_r@!k}o(x|zQ% z11!;FMbVhyx9Ve^%$U~&_@Vbwbz_6jSiptCA;4Lfb0Aw4A5cRTvI;S_f8lTl^;mUB z%3Y1SE6q8!pH%WpHO6$Ml6}-R*6_}9$jK}DLc^!zmOZVeyJJel@Ew<=JfrTQ`PAH^ zY?QZl)u@ke&e7~N2fzhvN`Hj$&_!QOhZn1gC}D^yEsH2=<(D;^o#mOGsk8jmVEJn! z&C_pE&~%O`V=T!2SlQaaNUT}hYx{`1nQdUWgW6EZA{ay$w#OO}@u9L~1stN`EQETk zPdX?j0OX;&5#)-B&ptet!N7hk$ngReS8?3QdY2Ec#1N{LWA`o!2;v;LKVOY7Yay$h zXUI)Ocd9g3@F<*tH<3fa!Q_n`chYh8ITVTry6n{j1Ox?nC3Tr>b&oOAT^vH}hTMVN z?4y>noVSQk4VhvEWjjBYxQS%)c0Z?DXfaNk=BJl|SGRyX>1p-s=0()cqF;9)R)7WL z1?J>49QlZDiXFr|Qw}QcF&wF6`%vJsZymKIg52bYousoRKjz1Pe7(imGsnz<udXyP+VOJ3kpiV!q+cY<|#&0!W*VT z?kj}G1XO488@|$zQc~=qs(`eV3$;w%{IQaGbS<@biCr`6Vv^cFR4|2iHIuc#slvy#}Dg$R%qB)(gaQI8Z z>PXiK?7F7i3F)*p<;l<%M&x zV^J%sJ5(4i%iBz+LhinD#AM7gFPkob;Tg(f*>mI-^P}6tWBKis&{JF1mUFT5_b=8- z);e~7pbnbqX6)LZUP&P@GCYvlcZjsJ+GwD=n~l^O5Vw|#dX~(%P@~~UI8@%{EiF~w zCY_&5sa{61lQfH7bbjz6_|fr7$gvQT7xD@z`3^WK;SHbj#w_}PN_-@lz0PpoFJ_&8 zZ~iUq*lIYjt9VAxn(laSSm-v}0s(8ZE-bzi+;0 zZ3b(fRjD8?o?WD7!LZOd$Z(XISZ!4o(ChLPYJyAF#8?WqSt=kH@kt97ktEq_ri`+zDfT<}st^MR2!(px^pR6sg4LkL)R{#OJqqRw7^K4es=8sr)B! z@k}jFE0S@{2uCMhf=!9zkP?Jl7^@WsOPv<8m3*v6Khcks9AsXf=uMQi-!_$!UUb$t z(8fpZ?4ermY1}8S-R7%uA&vIkaQCfh!5p*40(*rO4_6cSVP>zlz$wIW5=ui87`FEq z@-ne>;qM!txDJ*txABjdk0SprMdS$I}FNTkW)&Ht%G>bb&7`bD<0I98wsMT z=dMnun^G$hfwZJ&=>wxKxQW(`5s{xJPgGabiLM-JE<7Fss0v?>AULA~CRDGudoJEI zv@w{glQh`CA>L+x{dhKgu;~AF-%vSl!kV7uLH_o0UE>|!vS6=rFSY;GLQ@O0Touet zlhwYRyj&jMaoWc4>nES!vxK%+?R-pi+D9WHycO9?+M7lT)ybRmAaA=|*ejK6yIwHa zv$z2iWP>pEY^S}6rDbV(TwQ2QPg7Cr8PQA=SFQPYZiXsB*L%fI^^48^7|zr=M|32; z=RpQZK_b(dbu3b^;TM1+KZgs8$TxY9*1}Xm=OWbExkN6@o7L+xp)UQ+kmV1fr~~)M zNoH9Q))8L5E%a-U7j27W!V1+$4C=#=$=}U)W^FV3(i-s$CG7{2b5)7o4Drz*dSl1+ z(dh{j660x;lZ<%HeWVf>>jhP$w}P(|4Mk3Ds0Fmm;-YkzxhTj{X%D&$ff39^(r{YMm$E5^|03_n7_Z-7c5)~qBlW^tZW{@Ey+pk z={vK2+1g5odt*Hu)W1Xk0}^mj_rhBjY^f)9$|09tds(WXKB)Ypk(x*K_qkfqq5 zO<;{)6HOG0I`^?Z7mufs85gJAja=H0D|rGZ+%Q=#8N;^=O5tM!>K{2CX0rnY){rpE z@q_~IS$-aCq~`L3z`6q!n==TuJ;o2Vq)%TCQFt&amGTJnrjjpY_p=x&WNt;WjT*_9U)Mj9G!$Jx+KimE0rZ| z2I2RrOv`g=D;93pJ!E82N69UciG!Ya;?qEKPRU4Cuam%oA7bW&0 zD>Orz6=@!LKJu?yo1B zTYc^wEL^1y^ES4nm$aNTVMU=G^3f zj8I~_MDQqwY?wi5FOJk@vlMZwS)p@kse1v}q{&NZy!Fw+kLS!B9(zP}5EUC4c9#1m zj15^?YjuJc`7{vjax;I8YR{<Ki1lkngak(QokgmMoE(y+`>4es3i_{VZ~X+l#f5lKI={+sV$1rdF)Rea@};NH%_1 zNl+y;T*DN~qnZO<&I^b9aJsW(s?KXBfz}lu{!NKfFP}l8SL7ZDMP}@lMsJzAe27Rr z;?QOBF)ey%$pMN+HyyHv!^7GaGcaW~v0I2N zThgGBTQeuX03wqE2Jgk@IDfp?mn>xCg;cgD5eK#_#nb4P!m|@o@DG^6vvRN z|I-C#P)=}on4{txu79GToduItJ?3m&so+odV?eF&kC>JQpr`!(r&vXL&bMjmlq{!) zF*H+G)wVNS)^pv)1w7UW?!|#qJXY^=4N+FOhA~!!OWSh1zvE@yX=mqU_~s|TR9k}k z%6(XZ93;dn$~17ZVnT_cN`b+`b3LHk9ub73I7Lhloo3gfd)*q*(z*yjJLpE(`}hVt z*B@WseftoQ=pA?R4_rTfblLv9K7O|U(8sTAY-MW+a5R>&F*3INM^o+p#xq9Bzyk>& z2I;;04j#C$q^o2#MMRDW1B0J2ffhQCyCSz^g@Lf8oJDa~Ju51|i+}1qKL7l|D5}K| z*$6pX-@1}$+GZkXGg#7~nw>yw*!9@v+#k?RE$CvQsMES}f&BPJj1mf2P-V=+_5MP(Gw!s zFj=8ADuo@G{HJ;v7eQfE<@dh@{?@|!KkFLk{@;(se+`j1z`^XF!zAJ=W$dO3uyit( z2bkMSI2zjnz6IDxnf|4L(4_Le5Ueei#&k`@>Yd}nMfwbs#Qvm(z2dEApg4Q$wULg1 z4k_mnP+iYk1ao2qPe$Iif=E;J0chyIc^zq|X%4d8FH=@;AHyj%Kd4h>38T3!&gF=K zNWxgaSvF*d!h2EgFz4iF7%O-21DgA-45coZ9vC`r1I=u0q+H3Uu-DmA@*C|*Y1_~H zvW-GV+YfP!;f#ZO^@dD0Y9QbnI_?c>hAxX;d+BUsp<|?$4QGyV#avY~-nwtFRKMI+ zlr)>ko<2M8(5So$CL>V)P>t6eu=KBcme8A%$O*9qizf*OSA&fsNlgxY^VOfzWzsMF zf7^Eq@knLGBqAlL1ux?fTPZ7Bvjt|V72%H{G^t!1TvSsv7aekS2SW>G{s1=nN!KAW zjVebc(*49zw@1Fci~3P%xK?e$i4!5XwCRLb&|0$(On)XWupBoCf@kO|zUhcwU_6HT z1ni2p?^*~D95zH8UX&$^Bq}hVT-{iuWzMHVY5_FA|^wSGx%gOS6typ3}aiNy^v;LtJ z2&xLiUVY}Pb_dN$5#Vd|3N5(B(lDKq$@{j zVR)bGzYKi(dCiiN^HnsvuVU8j9*iP2q~pTKlxI_F-nft7WL~*2eFG&D#>P9c60vpfMAoNj4SMD^-nE2;0RW{G@N|Xb$5~d6TTS zU~2DV_#wa=OYBv4p$^y{?s&S9=NWj7IFs3lZGYjV(H+L?6g}7!6Sx^`HP6!cbQH`5stJsxe50ycX zWyaBD^NVpg|h!9J5y*;zmsB%Im4`ulj! zUpCmwj#zJSW7lAEsI?F>8*ZhfV4~!4O50;)iE+|+HkM^3(A4d0DrkewfefCJ$^(}% zhNgBzAlpEi3Zr;B(!Mvsha;D7rouC>ky^&lkUb8xd{%s?n-+sWl3eR)3JbGDDt5FzpQ zU-X1A7D7xfuh}E_Y=8L~S_sx#WyTDm=>2ob5Sy#29Q3XKw)}6Ue^~yn!@J$?@b>^wV36oZgSdnMS~Fe9-GJ$yUqVa5xY(x=Qs{lU=Uf z)o{ZyHsZMApJbI+BfA2mjh>`)p9u#^k!%PA;|2V}Brno|7E)4Vj`@&BS&Z<1c?4Ij zz(EZIdIKdXA`c(UR+22l97(P;PDpu>zyyOdJm$<#yhj$TopfoaLIf|R4$mcweG2<2 z7sNhos0^_fTA8g-EIbsCq3UM{X^*7vTHBoLi`T5tMYgOD77hGFa|8nWgntce{kj+h z!6Ub`*adINp&(gIKH*MayHt9PJ zk`NPcL47;<3ABsavc!ozjCGCq0LbK>w8Q`fJ5LngT+VE}{ZvBco7Ybo<40KL_7CZA+ruB511iWtVDAV3!l8 zlLlk|7`a2cpNmqz78}2gkD8l~)Z(oda_$Fxrz)BioDMec@m51px_(`0*_Uc_hDWI% z(3@9ftJrNBXhG1b#sa<3ciE?;)9J~v5#&CGj+U(v19PgwHNaNtsM>L4m6`t0QX=c@ z_Xa}`(#1?>>(K-=0{304OXqA4wONf@NYxAl)GKJ~kV3>Uw5W8y=WbF)jHetAfmzl)c%ivC(e8tQ zU1lipD6v#!5)uK-kr!`?c;ojBA2nExA*Ziy3-+o{U!d@EcCy3eoIJ@tihGsU&R9SS zBER`VqBN*KC6(*5il3&*t{80fhEo(hgFGf!#aCkSRCz^hSMS|qQ_Uf)up6F-n7vWqa~5v}r20a0}3{sC@LJXg32-C@sJ>Ny2E z-2Ho=RUv0rsB)rqv|`9*C6}mSA<}g99IY!&hJ(a@)pK5rmiY4F!;Fv!pzfOzQ5=5 zxgn(W7InAn`E!99o8d7jmzV$8P&hl^+!{^u{1Mr)nyuw(r!X)X+4+&Dw_5CEV!^CQ zrEv^;SaQWnPXYhq-Zm&#)D8%%yKg*pennsvBI$>dpk=RJ<9$p&Qeo>Cbdz3zcRG5F zAuvT1_6ns&Al35`EMo0HtEv{{e}9Rs!GF!PlZ^Z zIC+O#UxFLsS(70(6xcd$Nk06iDE(Joxdq@`{*U+H&H;G;L+n}k`kXk_bpx?K5k&OQG?&Rvl;T@Bz_t=4s1tIOW8L;YZMdc zztt|1IqC1UrZlv`T`u|#lN7UJOTlGiN0tJoV}!2#$C(>MQ_I2Nj+W9;O|}@wm9-op zJDQ|M+lCMRLDt=h8b@^zB-75r&vf`RibJ2!$!X?fyS>9M3F;lhAI^ARK_K{2F{?xt zv|SF{WbM&85BO&0#pncjMpWokB0>+&#Xg?S6DGoWQ$||;t#Po#;{VozM5)K3B@|nE zxo$!{;={`d>_*;N9!%twObWt_R{7|bNJWB3d*mv9uq0sm08(`;fN`JGfFZ`ox;tl(+HYx0E9id(!RpzJepjxM+;EXsZsSAh+SeDYq zN+W;kWEa52lXJcgOY>Kisz>^!W#=N0N{f}JA^amz8|Kyo_w_@B@!zW?~L z?Trm>Os&6xLPpBwR>qn(*8iWkt@!&NAZecON+vn!j#^(uUAKv@7mlE52m$+JAr%uk z>>EkOo#^MqvQG=-jYfJGO8Wl82laN!xj+Sy$s|6_<9dqccw+T!|M3mZ*J*)nVol#w zn}0P^&hpnFGs@&@EfZfPpcNgRmi8xyCitEdYIw{qL|BwbFYghaoDdxwAsQ@a9N3rT zpNX$1zEH)|H!9vyKm;%x z7h>x88%*Yv=O{68D6#WXwez~fSJ{3l18uyrt{h9j${5kd>U0T4N5dR202bAz6*#20 zhRq0y;Pv5+C+6*$WLF&t0yxP1NPlWaE}=?NC8QkiSAW6<&Fk5|6t*VzaD2c}!IG#u z{63=ihrzs*c18_+8;r)k6_XeEj|SuLFItzek*w1{NXkN%00)Qv5g>{b$E{JAPu2pB;sXMMnE#cuoQ-vPq@j#i7WSRYS__B9LDBYe}-l`vdtCwRcAHaeMa5`_|#6 z#@7LLwrf%(o>P2tBIN3rpy){P`cxdGL(!o*&v4xeg>2(8HUoJ=uI6KcH)7_WD$S*q zinn9(sbx3YOQQGwvhM*b%U-vFYl6<70(U(}%-TF5oQ#^~yA9eyAbB7QwL<$@f>22T zP;cnR3Ya_a&O94%GyKf_`6L`jmutmc zvKm_`)bwtKcR0oH9SqHR1wzjzFlr*@jw^yGQ$(o#-!3t{y^&Q}Ui48j^|z`*S) zf5>W*(Tkc!d4ee&IO=yhg`XYs*`k?lI5P?$G5Y1<*(xl1{}WzjP!3T#{cSzk|IK>- zCjsa`Nz49IK3v}3#_=0)`H#f%uj*1Ksu#YOA2aZ{#)1k0qCO}8&eSa7e|%BQ|b zMZ+gd&Ee(;zNBRqwnN%MM%u*Ny(f^mK4Jj@2@&k|6l9GKSte8-bDA|2iNj_S0q891%pX0-Y)&H#`^!GScQ=%#0I~Fw%7ef6MrlJ|f^WRQN;rq=@A^E?xECgBEDK zvhssqIh5Y~@YppGhLg^Hty|uPvU<*@9&v^ z7;oVFhSe)GQ^5k*f{2d_okTRz%Bm%uWXjnOL{-XPK+%z1l?ZQV>`OYW31h82jd&Wv zqt!Z(x&1DuVK94}=hLX6w9PDEn!5~N2-dxsYF*Z<(N+encUom{+;02vT-xRv*P4IT z?=)uawDYri^f8OoOjbdiu-eR{V_I|2y>(qp1z-B;TeWIqnY+r2>ojv<>JT=)Ys_0iL@%F__M{`PzBRdr+Co}e zJGOutJpBevZxK;)xI|Z&Ae8T}U&Bwpx=DjdGw0bc*0OGCka1KM4QJP>>90_7>8jpt zwBfAJSAsazNxp~;J4_z9eGkX8^vHnPV6;PtAfI#X9iW2Ez!caTK(-*CGVB}Bn$t`^ zOIEfC!6_iOA89C{APs5zwN2nR-xc(l1>y}_EQcB^{i`-Wx6uC4>|RI@pQc*<@@3=8 z^rtavhI5FL2KA`-A?aIJQ@!>%C-cXYYJfk3NhkwlvaHnO4{r%FwY@~7%;27g zMvG8^eHRWrSKzom&!BbhN@jdx1tan}puj1%!LP8(kb@eTAckfDYHoliB4nZiBD7*lvZQF#>w_s^@%=_D{?bU1H5}4r6JWwZHqH9W)g?!g6w5Q zaECF$pZwDViJvFDiXlzX#AV*fN3MoZ?r3WIdH!;?XnMQY-2zQDQ=0)?E=<98sxLpS zvbNQf2T=fndsydEHy+-V`7u#7YI}xgB!)(N+xydkL#awE@3X^w1))I<#OU5(>ZxJs z>Iq>OKe-G~GH8o(5+n0!)E;;|U1*0~;pe%~QRbHWI~{1r_ZlJ6dC^&B5MI|1J-*=k}H+DugjTq25L#0|LOD^une8xlGQ?H-dtKXwUh;FLI^NE6M ziKlj>&nBql;Px0g$GkD)?{#C$WcFA&D;kSiag>%==-|>hq=tr9I|?z0j`u^E?;z`` zC4JOh){!RdL?&5d6N4@cZ)$@R)1y@$->b()VeJ&iKW3pL(RmyEr4`0zL!4?D0z(DO zT1(|qY&F1W@&i*A2H#QSLBjsEK}Y#azTfd32?_u0;ycZM$ff^pRQOjIj8fM5=R|AX z`c#p6q1-n#9J+{Zq}f*wbykxvff$k6!V~*U9=&CgtAlk{&yPIbY!Bf^4C`82O%XtF z($D#{#p!W9vAX*CdB2b0OPu{^2$}5f@1O7Q1_lFFSc^HF1-jSzdruem>9%JeJ}f@W z7zJTpJ#1eAHwG)dMw5<+2L9>SE|YLMt3LvoKL)DEc*QyF&`<`eWaQoJ8oAJR{bv0K zn&!k&bE&2sA9QeD`6hA=_oNlkZ_o8S$@a6QwuZr?s=HjX=MJ{0wCXEyqI7L<iL zr_M$?zgm*O0)~e(lnN3s2M0+-QDJFX3wQke$1zDNrVbX26h_AzcO&;x_FUtI!RD#0 zo*j$TgV`5XUw`IsSJ!}SIrBglPc3BQF0gTSF4itJKM7|^PloVl!uY2j(Af+pO{%ox z!}lvbM%KI^WGK2+nm!jZT&e~DdR%Baw3CYt-dY7(c)^12LjlrmVgw_pKNat7dq{v{ zEZ8LEz)^JbCWuW2zR$A1!c&FnXV%JL*z8gR>S=mdwJA(ebL%!k^!oS{Ic`yIpI*{P zQXwd~CeGkdbW~;pMA*yN=VwWa5hc<_^tn#Bs?~n%(-=Uw8%#%wr@<*<1IDyde_|I; zgiw(H#?lzcxQj?LOk-rWAQRghzg$SWiIVYWEDICT3r-!~ML=nR=7E{WrWHg;bo6jwuYt2vZ+-csDri1;}YQY4M9j%ke{6aXY5PDb5to63guq zN`R!PQ=?xU)+oBh0$eE!dY(e2LoHqH-HXbL8YD-9Nlh*CoU_HhBdg4M!t<(^>k>t1=Pzopz$ z#``K4(I1a+$1d9Khg=7fGzQw2jUkJWoWw;#yaR~g-4LHnKw)W7gXT*=x)QcRc@EbU z%?|>coeGs|yy~|`8)wUyDmspFYc05Ju~~FfeRUCR1aCN<_ly6j3bQSYYO$F@IW4Og zu3MYNh(Fb40L4N;#@&@~lBbdbvRtHK#SCk?9Z9$x2hKphE2Ej-0-StWTWhQE{yUVM zrd96&2 zrI7$tiYQZ9umfjZGuYIOdK^0n2eloa>8;tFi^_f7#3C8YN%$YT;tF{yu=}w!d;FQd+2x#du)_s?kv{m5>QB5Q zNCp3_lfnz=Zo)LSvtWc6BhaB_<4}37Bg5_E+nzn&D(~;p7?B6Xp?xu4A>iM0pCthI zUnvc~SY#+$pC!&GE=4gUqYJni;;mJw^cj!WA1Bh1DpFw;bW(JBQ=+}K+Fy6HE{m{v z^amr#t=Eb}J#dq`z*Z(9$nK~=c6`xvKe>%4OA2&0Bgc9&)REj3jU{P}KXB^6>A@4z z#OwYUT^5S~uSm>oLPKvfa!}ExeNPbQ1?rx+W+kCka+cGAd*9{@V&e&6TPQ;K9T_`? z1Q)X7cL>?e=sly*y29N^+YpJ~TkP^V!?@yi_;Z)cE?>2WHrU9`hA9#koZ%D?ahrrY z*+Riwf~??AQYuum15iSazDHOY{P|K|L!J#&%eG)=kIat{kM49=vj2y*>i}=+Sh|7` zdhb0H(|hm54KUc)V4Ds`wq;u&OGc8xriBuE3!#J(LJPfw8WMUS^xh$K5(vHb`k#?p zG`f4QuKa#|Palro=W}*vXJ=<;XJ_{`Tr(-IP`R}^7u9{3;d^a`gm14O*;JxI-Ww6o z2}A1l-+K%X$RF7~@AT~J^>fztnR&0ouN#X^8o1P4W&OA22Vd3i+cRqO%;N3-nEtre zU!QC5zneGiPE?g=Tj~_9k>LN^;bMvT$8;}zV*kyqpWozed~oU4alOZn{AX5|yaT!| z8T;h+gx)VtZ@!qAqp=CFbT|5-Vz(}59No2)C+s?PYb1uGXZhZtAq zuXJK(%hP549kOC?<`TxWYxnN;j>~oVc)2U{eWv^}x&NtQdCI>&8j#gHblpeH?YD_{fCZU;arq z{?D5gKWF}Ve(2QqWrIE!nR0yPKi8)Id-B)PZ^l^8e^Y<@yXm@(-?yD_c)%N4To(6HJA7u;z7 z&y#~|r<8BB#$)GkpYtnBCq2*TFP>QD>-Ejtb^~*Nxz=yuvAhdj45_(mz=vmtVqWU3 z*Cw~ve{P?D-ZOKX#cymnE4<{0KHbk>c>8^`$agM7WO{M_PE?Jwy(On%#vT8*dh&X7&kOep?Km~6@9Q6HOn;X+_*Lb>#r{6BkIxu(*X3*5J1|@?xI=-w@Ag ze(hV;2=Hw0*UC3IqCTI;OA2=0m-+kf@m^#>vN%{eui%B->PgxD17Oyi&lC0L#U|*cFSuwgm-?wyQ^3_qPbVc-osryMS*0i7c9(Y@_yfQ_ z0LkORRzs5p;i1;bg zn*;CnRtH>HtQ1doJjz%%yGAp$s76yMRU`0I-`1*t#juCB-}vq+gy54+qiM!qUk3|e z%@(Uo7m~%HUabeOZFFuLM6(!Lf+S;yPlv7ossNoi8n5!W&vV55?}Ze_Ab>JO!Q99Th(IP=A@AK*3 z_NO5sGnVG^sp$BrPq=FW=^)c$m+s8gr^V6WKcSSAy`B2`zK;kq-eA=y%ROm=2GH-6 z7Po|M?>_2)e-?`yw=KDi>NuorCwUy2P}evW0>6L}EuGqM{B+DJz-@1`tEXt)C%AL5 zTUx&doF{a?0)t!AUj!F#FgR+5xQ%;q-fvPA?b`(zmtvqF69k}vW<_gSv~$t*TY(e- zE#MjuIY@vOq{V9M%0jn2Fs|Erv@k#B1n;)_TN%ubx@cX3VnZ_rbO;>_S$>1Y@(G0=ABRQS zs!OnnNf&NeIIB1MmK9SB{-wjmbBStFTwf8Rf62Id?o~505zI99qQI-EqgPke(>6&)1YY`xUo9Xb0fVGe~hsmNAc|uMJ3eI|4dSA_~ zFM+=UY~>tyG@8Pv6_}KaPt^tuqW=Nh1dJ$Ohr`aegtXn(l1iP-%!dBqn>s=ubD^Ht zOgVh!oKwVA)IZyjY|Qs?1@NBZi@lV?r`1K5$Q^YScqSsdK+rK0%MH8&Vbp=Dv~d8| zXxd&<3*BB9jV)V$UGgy7XOx{+EUF2Urdq~9REHrd&id13wX8uV3-*uhuuh$l7~~7q zi(uvJz}#ypS;gJSU8?AaH4xrge7Qf}=%!0xtYcU>qZ8#uDBI}nl^Ubf<wU zzakTTpN|6M(2oA8_JJaU()N-)%J%QI>0Z$EMp)lD>M~6_>B{1OD(3+<1?sI6+gjDY z2wu$RtbZ*s3Q#-i!nJX6YMR@?tL!w|EKPt8mSRFUkV^m@X7fBegZ!kOca9umbL;TQ zm6xNL%sl=}qB~J2$HnaMP#))S-opk8{u+(IPB1t*WiYw33d=EZ)IU*gOCuPg;pi{l z(CjKKZJ}pmB$oULt<^Un&a8uXXEJ)&f1xwN=0(!wUa2IA=jn{xpFe;jKU{Y1VDv7Q zHXh#uG1Jg*8h-789<>J>4_odl~mm$Aq0zfmu|FJr&KEl_C0G`gnOCRl{i_phv4fbD%NzQ-l z6<-DC0V|3-@35-*svyC{v*^tIZJwGEjrY(JgSwzEMbH<%``i`mnnv98I!hWfXpeQ` zI95>Za`)}7h?!zH#JB-j!b=Q;xtm(j+5F~-6yU-FMH^#rnjuE}VN2qsZ?X1_$mYCC zT<@oZ=4Z56&G8X*Y9R)0a$(WJKG3&q(6=&7-?j`809&n?GFC5xDWb0!?}P7uqrb({ z+YiIU@%jxG;Kf@_$Z=J`^FK6as|O5778nq2ZCehL;(2K!`VP>VVcKKkpiM{?PPQYC z6Hwgpc7{<+x1rT@alToON#Z!JOgL^FX@#>j+0(_S{n_A${GA}&ZV)baTd#~0K$;>G z9mb26Bk{hUR-r}>=3mVOh4>l@!CO0NvP)>O0Dc_#Hp>KvIz5K30u#W0(?pOagHCI7 zWq!gY6>sL@*&@VvTuqAX zs5M60Ynq7ren_KFI0DeS5Gl7TZGRGgnswT~4nrlzd|KpvADCFpD}4DOtbV=>W}uk{ zU2lwczE9&U1a0>F>xQGf+0foHOswe_3b5m&6&6p*$L~Hn+wgAK{!Hwv(Uf3#XBLa_ z^aiV+z@iY8dDx^G{{kWk-R9xE1l$FX%%gZ4l$X|M)J1lV(HTAMCP5pAc$-wNM9|k% z^O6QC6^_ZuRcgmcSpqD*w91PSPp@tH-$Nkg$2{eupX;m=A~}g7=Z#vqchsPlIe=LR zt>mL0cu@({9}$a)L|fv&tORaG4mo`XqaOvAn(v%`zpRLDGR1Y$n)Ru-C>-^QTD{Iv zx^4y_kHh5R$ZxMHAqOCBBt9-M-WnG#SiuPSS)s;wl1HQY7RY?mI^9%4ZjVAl;!(>o zGsozaVczA$yyFf-;9C_8kuVY=iE+9xeNA%a@V1>yHTrT*X zSrsvT6Z96O+C=EuXpNBuOaoD1lNip9%~kg>THFM~>&=$KW7*tfNa6IduXN%rW$c^l z@H`NvgDvA*{mi-CB#g9&Q=wXdyd3J>q_7;8EfC#c41YV;xjcE(%tc!`tJY`@&{<XB19=xt)BsytAC;8O$%%4_bF;l%c$JUeu(|$}G9+=Km$W104>5N6B-XzNfqfXUm z52AYLQcEVwxkcP0iqTraBFN=8TIJZrK7acD2}X{xs<@VPF7759%$su0dTrGIZUR>j zw4^rc*@lwtafydW`{198T_L&NkR11qhU0ut!7z~1rL%bS)g{V~%Btye&vXNJ46ym3 zXnkmfYwZ41%TE@)@Q&|(DgenG!LcY>L(CuX!^((UuEPJ7>{Di+zH8)sj3L0_LE=RL;*|iVXK|@j;H@^Sg{uzf1@irVmhssI~!T8>{aMF7swh1& z3*~6mU9FdGD`*aahO5BsdhXF6l~|VL(BF|gsZzlOu<*s@>xS;Jm?9$;#rEH%x&J-G zWGV;`(}$^a9UO)#SQp3HV)3An35!UKFzB#Ud-*9XoTi4iV`=a75qig$vzg7($S9tz zIm_ND-Wy$e0wONN_buEdio-_Jnkc6fy|=Az8v`afNomQ1_?K7On8G5oadK=;GK`C- zg|n_?v6+KYceO(%l^Ja~8iYsBBMV1?KE5d5Zmo#zxM#L_(8Y`RxG?N*;FpT}L0sM1 zR?C|MT)*SX7tMNY)pJSvL9WanaeLdm$B1a*^YR_R&+U}4DZ4Zdp;m00QnzT{a(#GR zEnmCtn55Ui!@YM+pc_005XmtNK3=}w74#$y3_eV^b|48xVYF>|vMD`@u+2*^T@>QI zxK2|$vQA`eflE!}@+kYnZa1M@8?rk)OW8WP$0!{e!hiYAp%*bQH(e2%=Cj4Wha32` zxkaZa5N6x4%N%t35BcZWON>xK><#NN`IUkDu3CO}HgSj64QTwdDu!r0CJkQ`5@8io zQ_zB~pa^BAR2c&|T+<6I+-_#;>jsP75*D81`N-^Y_x_!$1so~OEQt-66zd*Qgvnq) zofDkb$Z2=KKi*`6>!eu>E>AW(rQ_1dg}s0r-QmigAD0K+M9}diVXN6aI?@M!eP3vx zSSN1eNQjIE(-(;l+s3=k6c|PJNRF#&Sl=4{;Cciu?q!uoaFa`qVpx>yB}eu3i7zXz zg6af9p*lZg6`!Rsrien#5Bn$H5}<4kOk1AFhVK#|G zM~m#kKHHAKx7N%D4WGQd#=1*m^A}9Ekh>gR_NsTP&`6C19beNm6WpY;#dYL(>J~}d z;Q=10-c6n49*+^hc{!HeS--N7DU$Z4*!OO-*uwR4Jmo??H%cxd9*-p{ z=SGfcsofoG_bJ#2YbZa4o4dNR+~Yy`-DrVFB)h51RC(nw z*cweJgvV9x=o~kwj5tQH#AzdBm7zk^4{aZU=Q((|ld=JURMj4Y1@~O#MrT*U*Ms}P z5BdY1R~xp{rd#L^MbglCB!y29H$mDcq8ZX9Wz57dASjpRS zK{;+l{rLTmV*pMvS~JRDSEYs0G1)@4pZ&HJd-ny>ZHRm=o|tqWmz~rPprYcx3SH#$ z1X?l~C%b&Z)c!a1B;tWeUwD6uW$3_p3>NRe>^~H-=>QTNC7eT8aF1B|m@mt?D_0b0Z+lWV5ITLY>8>QtgXA|#&Iwl00S3L&|hj8Fcx8CY~*_I&y11VUIRZj z27r(9(EaYzz-V|?fG0vCTFPL`=ET_T3&q9lwP{Cq0nPfwU;SDp) zI{@g)7~=A54s<%@8d_`|2EX-swiHn&UMSY1Nt2a`kmWq(M_@^FQco+Rr&+yUO?wM)9kJ) zbiMp>XS3FZqsWlaJOMU8Zs~Ym9kwM*kGdU3gxcj)r)!9AJFq2ZnNr;IWDu5ZTlf2%YWc$4j#VYjX-jk!n79k&S(l#pxRksN7?3} zLNwHA7H&rVr+ZZ5p_;m7rRQ?^5l`{uNtvO!6d97Y7P8)iuI~v;07NtjdoaFY5XySPy=#8$ad{G>z_q zaW|)7Dfjrq_c6(QDvi)74XG?OS^J1gXis?q?P_+~`FE=?#-L6xR?G~NwEn{)FJRhD5 zr1O}=ke)Z=Jk!}dPKr^hAj~p0mls*W??A}q*r%I&gdh|5sq>s&g+76zBq+EX_w{g( z!XNpy$c$Ift!odT{X%}k0H{YBCdc|=?r|bmqBE;xebupi;#VQu$ zrg|ZHnnM{g;DRFez&FCjP-iiqkYV9SAxklmVyf5K-yWe-W@gBcoBbaB-K7#Uyc#<` z_5d_u6*|MCd94!EF^F-CN6js_3M2jwUmhON4N=CmoqAZjv=)7YoO}A*JgUlKOi$WX zbK@2}R6RJd>cSMgx>|FF8z{Y#ZvFBt-2ga6N(1fK2hixPT7$xA+>**w>;4HIied9S zirFLG;E6HCg(23b3#U7ra@KTV`opLHhUhlITlHi!azEb7Roy3K^E<8bVl^o8+rem0 z&`~xDkD%uomlirP%lFq!W3GW^8#?91I`tdsO{wja&KPM48-P1sE~lj?AXDuV7_dST z{mU>VO?={RB@UXC8=kyoAgre!>sI5b?$B7`&AKr4y&J!C%G?X+U1RjFC8NDM{ePhq zce2&WAM!SWHLU{!)Q+*0`O$4QT+}gJRSu$Q!?AUj&`lq7lPk^HpZ+&uaYyeTYgujs zSrT}GeCCyyubxk}1DLhnxQHc~6PqDhKJ%I{P79s5Q-3#!_WKM09){!ImW`g@QuQo- zb-K7PZIms#=FtxS;YmL$<&7UbxuX>2#8ZMlH_f|NrHxnIzr7zjrfUHSc0?G7?}{F* zNefSyeM_vala&^DUfYLG-bN?s<;v90vW@=(xwxn0mmI0T4kOtLBgyCCrOj@Vh1(K~ zVMS>uLvichpfr?OS`L^+y*!0p@-SL@YzfsGZ<`7w6N`Iz&2XhsMvUcA^e`w@miVdW zjx-TD4yMa)?rzy9nnGN($8O2kH|_af*u{Na{KM*ZG(V!j#t)bt{H31Fpfg6(awz85 zcQ-hQ4w$xsgU`WyNLf%ja0U~d)I?}079!?(&^_;oUC_+-n1eiNt=A#-JaJkaqquOl zf9pQ9E0tg02{vBfVa#zinZ#W=ICw^v{18_~$%aSL0W?ihQzb-6XhdM?^TLOuT ze)Vh=T#uGI>59Ji?EgY5?&STfn?F(~i=mTzqj~?l+iY-K)b#LA&+J+hw9r(+$niay z8Q0C+6l^l5xO+Y)o2{%3nn75{x!ih@+6^Mx zDYMc7QnKgRGtJQ252|UzgTCR# zniAhYi3?&0*I)17mJuY+gal{Fp_knjwP< zZBAi~vBrW53smxTGe6sPGeJ3AqRkpSz2q{;@JDo(=Om8Jmi!`?6ZPfAmH=F;l5O39mQQ1mL zRZ2?rCJS%-KT^s=A_H7WJ9aPZ>qDbf3oY_xtyxn3e{PLf0QcK(&hP~jp#Z#1Za{8U zR86UHZHfAeo%wQ5c6g0Y)D#2#q#^F`{CMsF$bz)4sd_^HOgzKmY-P%V;`Xl zGutzVZ2zGYJV>~*emA+g2wyq5x)-~rkyhNlP{ZprWUCfHM|ie;`d;dZ#Mmv@Rc>Ap zdRGEH8yMR!6wW+R+gg|&F)1eHuuU=l^mYYCsVX#RLiB<@82IYk5<8;;xsypEh&Zr7fP zFGfH1U(+p@(CidqL63BEi{Xu;DPrv8jesME&0P~q z;`+Vrz3ImEWW-A=Gf7-sBBY>dSQeTX$*+xwakZKYvk{8WyoR2^U^sj}tPIxIo0~b+%VRg0y?QDxZ`xk3Blr7S@(4nnWA{I|u$pS3szqr56)Pw>|1OY@JAbQb56m65qoL z#hwI!?+CPopDQ-q=YlWPUe`FOYc6<7-1yk5v?nTE{^DF|{uwgj1nQGA)M5>vUE&w- zlW6xF$f**OQ+SrIMR>My_%4g>kN-L2f{uVZ4llnPgB_P$0Bc*fJgpejaD)fME&VOy z%`8;V=_OXFQVg;>vTU7u?xPEjkM^RZGBH|@yHny<0Ob+BdMC|XKyK@ufd`VjPl26jTDWBLw~wK{I?j2JLqazhE}(=0L|E6 zZ#LN;u@UJi0k&N;AmTItCqZ>MV1~BJfPydv0hYP=VUresFC;Cj5TFbwh*S`uX-=p7 z3jw$twuHCvQlK(mU9k+iy!`R(4XAV(j0y)l0(<2=?|mI)SWgU?{+A{GC>*9Kju!I8 z>|=;BAotOO@hEb%TiIbNFiq>J50tCTTaIizHpO)xHq- zrt!R=FVKSvILdS~i$k=^OfG;2ADf&1I>fXLs^-IVcVmPLV3cLiMfw_a^c+*NU+9x; zYrODEkGLzBbImc8iG*@Lb9S~fL@P2%;mB&09W-V^9L6{iE@o-gf%qc=I13Jvbuum+ z!F3#`PgfGD{vBK4asz{_drAO@m@d61D{k7#JBLrfE7R=6K`Ts`!{_Hm0xVkv_0)w- zib*P0VcDX+#h?fjWa5_(S3DPCCi~F{uiD}}7%ZKYbXs5;34cJZ>CGRZy(iK6QVuPK z<$bAyFKsPJbJe--5$~b0k6>qc4pi6|5gMwx;}xQ$m(=V#HoG$^vXn${EytLO2BASO{ueA zoUsZFm=I1<^1ySG662~QCBb??3_VXwDT~s&wkK}+K-a>n_U#6!W%=DB5Ug+{qI_9|>b zNdtWQJ@9)4qx}pm@M6Y$TY2}`Q)q2Zz{u6$^F6k=s!stt@lehAZd@sZ*xi`*VqwlZ z__phObmJ(#rC4|NHj~1)3Q%4uitW!|vLXaS=hJ*OUWez2oEw{h*0wEen*dC=n-?a>IdTh z$&cd5$f4$!xecxy!2!y~bWTCUU7Ad?4Gb~$)gcsW)JDr`@2nc_zJCMxM#J^xoAVb( z1-Q_HaJ-x8GQ@ImbmjS_p%WMJtbw)z5UnA32Vp;el=Js~_+!fj6pYZkf)F@-$YponWxR~oumbf~AXrhZnDc!8 z=b9VvV$rm(Uby*Sw0#%mGdDo@?n}Yjgar62A4rk76M{O_BDaWw?0h@$$72B|j^C0V z4NW=Fq2QHAEjf92_+@`%)MwJ%Mw|J$%gAT$;EN?PZh5W0k6|SH!({LS#Vaq>ql>Xe zo|^xm2wGhq*rk~we*IAqTMVb4`DV=$z+A~ddwlJP%pgDv4y2;+$+IN2TCEs-#&;JV-NLxtB?++JAIa?oxa>RMqArV8W8lV8Z8w(-^rUw_j9jXwc!uGA9?s{~eTc#DPlVt0XE01Yq28s4m! z06!A(4SkeeZXBy*`>q+CW{d_JKkc)W5}-vX1Rs_j&ONUKRAM5`4~HsQUI1l`FvQEf z`nh4#qVx3fmOl(mS=Ps`wM9_yFyl-}{S&@`O`|;{?|=tnX{byM&uqC^R}Rpuvw9>C zdXU*fu8zs9nBAqxfBET6H2JDTZb__Tvf#eDd06|8>3J zkBIq{D(Gy9{94Q6chp7cQ0_KD=?P}in~zjskG2E>_?MQY(9e zHhPf(#{6k%=O9MSE?Hn8+huP8^EmUAWgjLW)@&-`)h+E%=$R1Yh;f? z<8$gU_kP3N;K+Yi#mLEX+tq4R{`i^Gm(X5%Hk@C&9GsvQImx1Xcx#c4hr=DQ#LtxQ zo}P#y+=98yLlnDk#m;#%(-zW^_Cay&D6%79#P<*qJ^I64mf7Da6WA;CDy5-(ouS{F z!VuGA;PVvBQDfC(s}t1Oj+HO;fa}!^CzCw+Bg+K0xx`};cwx}Do*3}~px{UE2d7FY z><@a|wu0vP2xJ)9_p$he{iIyHGSRes{a|I?jL_L75>Kz+j{+WjxLIpX^fzf`o?rcR zan+oZrF3zJZB_{c`vi7K=fX{B*Hs z$IQsn?k8vo-HPRlaf`KLIC|8jqdq#u8fpxuDzLi9j#^{1PH{0Fy5Z)@y)ZRDfQhed zo*Ud}k@m!9)pK>YbPeL@2A(nwVnGeHO#%*jL|M^>w`@^;4Mk&0Vg&i<&D^YvheMGF zK~e%WGNMeIc^NT!`w;6Y%NkkZcPVH9y=>#5*vi-@1N^H4uqOcdqBwew44_zitELY9 zB?jH?f~j1Qwd~VT5sGB2Gz?}XISYW=QRylFWChX`Z1rg z3m$MIJxXt?r1hjwy%-fveI{3|=qEKqxX z1laDHJess+q&fM!C4L!>R=tKXDZ^T}_=X58K^JLL9HUII&KNQ2r+H}C9LSDOeCur~ zUVGaSZ4zL6lQkGclu;}Ur?$$8r-vE@j~Rnjmw<}$t?7V!B9;Njjt7gyYPa02a9vky zu4%BUd#o+K0pg9s(!h1U`(qh!scZ?T?U>zls91F(jGzaTZKr1fAd_dj)#Qs>$l`oG zLLB#D$nGvc3z~Ai2QK+Oz9R)H2mvlwdzg zpGD%8wWs_~`#~)|0pkMubEc-73IKZ;u(>QoWE5hnXz!xDq1~EcL8=NF^T_*yEJ94m z4N_WR#R~knN2|J}(e$+vu}sM(q;br;bs?7C-)37xhfouN%@>C3xy0Bu8|wn~;I%+a zb)en`Di8T2_R-;G3*?j}Cnix8)di2o@SEmq;DKlEvBRaFE(})>vn(P0mu;S()dZj0o-qK-kIZ6$j_Lp9NwsNX2G>% zlL5u8#ptVxy?l>riW(gZ6Zf^ePP&wRL;<0S9-| zMxv6lBX~+LgtjPI02=;Ze#>~nfcZtz1*pU4<`5Y~m|(?71=)e=JxYvhBb>Isd@F{< zoeDSn_C6au(oF+2AH_y^Pfq8ZMc1hUNQ!?* z+eQlYDRkTMJCNZ~=xZs~UE?enAel>0wyCsy;MjKPX>rM}V$oaynl1wM*vyFv^Zrcf z^JV@*KPl6qG;3b-`9i>WJPtsvw6wRRm6facdXz+OQ8?7;c%j2m5ge}R$F#{Ms3`=cE(>b=okZl|@IRA7rie=mK;*c}bVd!0@V&isb}R3=I%#@>}}#F9`n zcr+T!uUPCtNf2kV8mx;G!@QZ_Z_r1W`tvvts22OSkK>^otQ+cl517+i8k+m1T%0u&hWrYc<8W@bo6H zu5%I<;xv(1mbnqCb6O1Oph)62?iu&zy=)lhn}Fp@hvB>klIp;Dn$22R%YL?}3&gPN z_FdTb4Bqwk$QIyTKaO3swCe<`=tB0nI^J>za;yPk$&E;E?CvChwtMa}Hi?YfkM~yI zD1~lYp^JQZ_kAdZ6MA-{cpO1zeRyrnb3p6SS`NMYv07+Bz7IkF{l}fjm!Y0lFjyQq z$8)vNb)*AE(8p)=9R3@iYXF+B#oo9n=PX~LK%~HAuB%tQeDZeyPk^L(@r;g$GRgv* zq*tP4)+};>_J7^x+rJ8HH0hc+x8C$tiA2!_BC+gVkYNnHblV?dsmP}A#5`GLTd#D$ zNT?NRj(=1KsLh}zJYYF7pBhxzBR>LPIenY;2xiI7QqD%Acma9vq>C}qF(k;0zfT)8 z84{QPmw=nw#vU#q1?S_W7hm=1u_q(?Z;;Hu;&9#M^dhO5mJm}Xy+tn*bzWzQSdtaZ z-HRE>2W?1Yd1(87Nd9_EW$!t?=snLbK<1P0YBhP()Vw$u^(Fb18fX6bBD9O1oZ|ZM zq=r1SV|Yygd~m`f*gDW5ZQltM|x>~ZRB)S{xRp)h5ra$?Yf3VZbb62~cPKc& zB6)cJkOaTgle?KpU>6Jj@!IRZBi%#EPN!UlP0i&QQg$H<+R^Rbqt*{ly*@za>;Jx% z^2oOAez^bwDaU}oKBGMW*$N`zIY5QHRKY3;gz&#=SvB?snjHuZ9-jH#TNS>n?$LlA z-0LxC8;~<%%5azcwU0b{7ngILu=}medyp1d=}_iqt$>}JT`Mz`gxoPt#4&s^vpL?DA)Rz~m+UC8 zStRnDh;vN*T)&>+qiW3kQVH?X#jgJ|XG%-#iGA=lLwKWI9y3Nwj4Ra)8gUkpg&wSV zXS@IJ&Et)s+^-m&=zyOD^}?I*I18zSWD*i{$E=nHE}fGuAM6|p3*6)E(JdY z?Hnm!q{|FaAZq$=M{+E#hV4sM?5@kQre}?o0SbsV` zB;uU2>XoC)RJ*{y7tYP26&REwV5C)hPL60l5@NZ4xIK5NrjHc?Ba(yFT^AXW7^f5x zCFu9X3dH)M%{|a&?wy#Yh@eR)5FMgZQ8icB;ujh!{tS4!|IgRAqEkiil#m@s86h62 z#kG`9G?sQYjGBchQoFqKcDL{}MSQW2yq#Utivq+EkcKy#Bwv0J!Sywo1{i4<_}0jPS}*mxPo`=N4P;4dERqt2q#Ce0m*SE@F!Vftryf zMY>w{UHz88rVM|+f9<S2OboBxIqf$;I-HXTC70YZagRH&EKZ*&uci;3_(Y>t+u-NRN=0 zgfzH#fA~`hA7%@d`J&h@6{3^9uF&ZFKHKP~Z!kdlDt3IY9BA^LN%4SHT-f;j?Hs6O zP|7(itk`}5qPNMc^9+)y37vgSk&ruR9VHvVAUS;e;S4!TG>owPDfLlDyJ?yI|A-IO zK9~GjqZxx$mSc`SFN0~n9iV`@x{CL|f1#aGXlGf6R>Ir9EWq@^JNJpYNY6mCr;N8! z_0Zzo>7hzP0m!!*Ij+eA;%JSYHO63vnCxv950Uo>OFKIMsw6>=y&;d@D#V|xvJW1w zr$l*Kl^UD>s%ZptZWKG;l1IlCM{ljsWTb;kn!Mtc&;D{Gf;LE$fyE;%QU5Ap z2jET(uDFU(t6wP6d*kZi%Q@|o84 zt~^QG4)G>Y4HB|9(=$&w))QzbWbfo2Rk^Q#h&Ruv!FY~0Rx6fApJwNdQp&_c0CPw5 z=0kblKr>#u(8{Eq{!*~u%5Ty83xMU9CZ;@*hYXHE8m29+LB2-SnaFpEB-dj==JPq` znLM)m1fjLJe5ow`*JB=k#FtOMrbytC*d5z0!C_t`l|B}2HwitUN|(sQBz5EYOYL5| zf$n8M{Vrp)bO?!~tyiOahY`WbSjKr0R(!3VLyAp$H}sEEcaA_Z1<(hS0CM=W&y-Cn z9lAXtsFcwJNdL_H?+%%{@=&x=4mfZaGs_|Q;Y>~3uD~kUznKD*W%%-TZOkfzCa8bW z6zw|cHQ?EB^llp3#@jV9n;epSyXr?t z3ogH^6IVrmY>%QQO`qg~lDG;Ouci#Jwa&T;t09Y=7&tzyj#PJ#%VZW!T~htP{bw$< zhm_8jb$(9dat*gRlKM%zGgo_U<6mVSSA!f;g-#RTFy0!?!WM4xrjjL&5SYQz|mZ^9F~mjt@aC%;tB^0ZX!4T_7<;*P9a13S1)gR>D^_Ec(#TbB{5Z~kmM zvOl`n6Jyzm@plVxn?G5LT!{AN;n6?jF9UDY-}#Kjr<1#!Vr7|9qtK$(=+O&oyPL6I zZA}m`P>@5%v+&3a_!(o6{E8Tt($0CLKL7n+F@S?Hfc)C1VX%NISwyK8JhdLBxG((N7kqih;_O5rTP&Wmi_%jJ3;TyS6OO`l7-hNTa>$uo zEqh=%>1`3dcHEfc4txria_Aw;xsel&V?3^9bUw~rHPsC|@xWwT7xtd=1`eY?e6Y_? zcL5FwNijQMv7_+?r0tU@>0kRlHE~72VV@C6<)CW>wM&;izb3yXbLPw%S}XSkSvSz- zm2~KDY4+#+M1O88Cmo0FpP)4axA|7V98?OHUN7fx=jRAoV=Gaupj$6H)Vq5Et*Qx4 z=3%z^^W@;7aTw;xMzpS1e}e^>lxe|ZmivE}$CXKlpLO)nUq%4o#-h`WjL{1ez`PB5 zvI4E*b6|1CoSI#A*bOxq&|+%Z;fYqZVQiMRO_G|)Bs>hvZ+U&IxQ+D!I_!>Xaf zg01o4;-+`1`FP_x;L`qg!R$u^XQe+g>}-)YV~lLi)>;8L!9 zz->@iFglN`;?ouywi6l_#01#m!v9Q7@oF2lT*q%$y8ZJlu>X#Zw`c4gfB*lni-)#$ z{PN{%z`az$J>qIwxgCtNV!xL)Zj>b+cCQWgnl^_drSGe5{C{zad;Q7c8}l5hwhC*n zPYNsjFz0q!nX%bb(6G~qLt+ntu^t%x7~|)AX=PO5WtaZx{)%-N+6*{l<&mjokKL!0 z3X`l)hT8Rx?nSrmV`W7$vcsptEB84R%+UJ~YrX7{;TDN$9`e~Wky+k;hL@b0WiX`F z17U0KeB4TxUFy-;+=FD(4EKwG6`DQnqW71lm}2K)T=>>?duA2r$$pc3^Q&}kd}SZx zvIlbE<~c`pHwhHF@oMS3sMQ$U*Z6WFHO#GoC27%>vw_QtPklp0k@un>Ege({QK&p_ zpeIiWoALKEMwz54OCCk84Vyb20NWu6+roTlU`wgACT1IP<+sIJEX_45IiHA}FQA@H zitX&#B0B8wnO2Em;}#)vX`TNV?Q{5?mj1EU$N`!`j$f`=4BIg6SJZHJCJR)SuoFNl zl%Q>eBJJ3L2>IF00t6=`)a3SSS9HGsb()At$jfz|Xzdofc%C~C z7s?Vje6sjUD8h9}`(q<^=NGPmpd4A9iqY%z`fO5D0 zVSr4VJk8Na4Z%?1NZ;boK3=Y7P;hzu+y_vC$vK>3wygqHK?mC}tfl5A(0K<1knBZY zlaEd1(kwHroK;~e&bppfa6a*0AF765I$>!9cI5Kvz5v3aA{_vB_{{1fi;Bxa1fhtKc{O1Md9NOCLa?w?|wdI9nfbb!O=pQHv>Z~>3>b;az* z!RY~;4l2N5*Gy3ZTSqK}drSU4N$E5p5HN?$_=6hQx?)(}+Msf~088gA9JcUuHLx-d zcNBaza}r%}Yyeeg=`diJZ8O!t+DoQ;;s_9rMW7-py`MwLQsPeRS+;!kS71wo$bA{x z^bv2m8h7GSOuR5XB(=;7KE$P&{te^Fy{KoX zZ0vAaO>?dviC;yDBHaQnNggA8yht?hEMEdj^X z4(`*@mZzqn-Sid>*Xkj`GVoM;(ldD$%D=jD^Z89PomC9NEazI?r?Wa_vA+C}>rQtP zMgz3CBGbSe-PPcVQA_sm3Z;i-=`j;NSL*k2jVi``zskQ#E)3mze7PYV5+Q?`{9syA z`jm?l7q8#SIW_FFB*HyKN9N99dXtE?u6dixA~lFEvIP zhUDW5xwWT_Z_iO1(co-YJj*i3tZ^6TowY**#De z8UfMB)E#Flq-BM~%cfu49JjOX?_l_ZZv}i)KRE|0G6Yi|oQ$5oZ?HDgFo=8>n$1(N ziw%(hMP=b2vpyD&F89~jlIy&1u?3az;WY*t4T<6xzG;aXob_|rP2eJ<%nfIzZ{@gb zRXi0Pf>%{)J-!0e-+{^vXP)7%QN?<1o;|R2CD^nd5!U2}({rQ@W+0MB40sL!DU$jG ztko8~|17gwXARtQuqI~e5Ae9S2YO_jOM)b1IVFUj#g+=!$>QitBq&&)YsuP!3i*Eh1sjwNHnF({uJ*UEp)gmh_lh3;kFoxkg zsR+vJbC2@gGPUr*@!=Lx`XLEM)33+0Ly&$w=u%5I9?Q45#J3mfp-UwmUi#>yx2S_n z@n*T4p7mjWY^@6>3axOq>%Y6nMg>1`<--d5ZE1Qog z9_JQfRruR4&$LD0>xwzqn(snAK`CZfOuAxG`p)%18jenSGE&c-X(ok@lZj7; z{Z=*$RVj=Foj0Sqvn#E1Nkb{_-`nMRzoU9(Qk5C^XIcsUO`Tkdis zEljQC=h~-_&w5e;KzhZMr(6DbEG<-u^K5LUJ5x7+%ok*>*u-9Y;(s6uG%Iwl=cghO zgTZ+bs?SI5?5VVH%FpX=HOKX$-VKzD+SW5^VN#f2ncHN0Lk=(%EbwN6yl^fpRGniG z_qVUK;u$@$dsO}HASwq^F2#=*+$U6;WudEL^U^Hag|6`gvoe?5VX~=&(j+^1uT1eJ zAgTx=zG3NlISoXLia)K%kkf0yWd;`)U!SXK;8M^GOS+}qw}Pnyn7o)~jJTc#CYOrw z{mfRuWPD45lMmPGn{M+d>BY9r-dB%;get#yvW}g+WB+x-oa;0qEk}D_AC5WkcGMrDz1nx@1%)JK|OZnerVbau1H9cyN_4yrj08W z8zf{!+C62lEI)6Zd}1ettP+U1Eb}}_1F4dhw40M_6y2z&>sj0vX#CI}DzfrQV-~k# z^4)RZIWJLhE^a4N%sv^KHQ z-}igl>K{n+5AgC~>;BFiPTPPfsbayOvToS{AxbUqvJY+(DM|7Ef+e}zA|qlR&T8>L zhtDz8s#k3i#o{Vg_2zRVC2Fo0b`F$T^X7B~-brhA87O-&zsDOY7nB3z!7W4SZ)6B) zQ{{GSvZQYvkB8vsfmjVUc1=sm@F1hufFpXO2)TC>c;r@_i`&tqL7?MF+SAI(Qdw-F z6ED0unsiA0Yog^5S#)>KfBE*|Yl-;|144SQA#q0!0?iiFhCnljkQ z_4t#{>%_P(8*gb$t4w)d^P`Z-b!2g^ije2F^?6OXYvfSzw!i|Opt z+?mjSdVz^&ua#_|3Ro!t%B~Y#Z2YF{lU$YVQnwYi9vhkP3QLn#`7|AE_rBk za2pk%3bDr=+fOFOLjxw_%e8D@kSuai@{_&Pq<)~>k%VvKy)#gaS+fVCD9^NPW(PTJ zE7HCr6xy48W4i8hpbqV!4qUudd$`7w3F6lb_5OoWWNQPIpJx>7B@0T4PKxIlA-M|0 z+ybfHJ#$STOatEc znb9(cDATEpLS8o=ddZ+ZEZy|{XAJoV^xu;W{Y#S!YM3qc5DD-e_MeigxWtD?P!^bC z?pKiEwgHAqv){v6EZTmq=){6f7qM_rZVX%jSO`9N|9mTlNL3hZ8X+T;6(8RpKM#S- zk*Hbgk#d-JDci#DwZtvm-T!J`xbd28#hqJf8RZ&Pib?k?irr4gL+}1vgHrJ0)eX~R zFyon0#M#ph^g4@UF$3p&75SKEgw2vbN19?Kw<^+44{1UF@UGl(~5#b z(wLBlW}8!^s&c{w*v*c?wQQXIqMt+p4W6b#j;0gumI!eEa8IQQ1pE))XO z`$4uWN@PxHsrsq{`0(2`E*=MP3&?%N+pn)i;V@pas+hB%G2>SuX41PJ z3eBwj(qu4Wyr>Q@Ut+^|2qD{Q6LiKdc=9VIsTRG+ks|@T9d>eX0iga0A#mjCyHp|z z4si+j$fJX0>8P)8&d`tzs`>*hk}kI)Ie6tDPOh)Y(2vNUXJEvJ4*$~;++4RfUf z<_e#GbFR2Xm9~_uX8P_oN`Eeim%+WAD-*uECyS{t`C4uHbn}<&8qGTFK6x8kXUQcR zI_kN-{Ngy5Gw|zPE4-fiH7=>Z(H)w|Ls`VFzYG02D``!NlUzpuCs3VI0=e zU`TPIEP;YD%GCB=-m`5r1eZYp_%w*{QAy$*qc=q2-CQ|}w|)D~=?C#V1_e*MDc@QZ z1@4wvkasGF-#zBfq6xsK{Tfe4f8*yCJ}OxnqU2as<~jFI7+C0WRvzy<=dX$-*`Mu_ zTvK1xqJ~^pJCfe$m@Kh>^8?jTc_$bCrqYpe{jq*nbn6kc>m0O;=UVOUsEWh{i)*yX z!Cy_dup?9N=FYTzjg9tE&)yTDP&wb+p5K`kbuLh{4u_jxMb8&H4La|t6Rdbe4~^aikjXj!BR9q!=o(@#ynwrBy$I zhOU?K$-QZ`8XDW{^)e1sjpNmCwZy`G4;xo*n3j!Gg^jgB$uKRc)zsV-Tf!Dz&Vl*X zQ&iwf1>)=j^I+ktHBwMZ919jwxvVX*4`y$HR_B-4fre{^0QNJD5N$Lr>iPP&iZ|NN z1?|rT3-5{&jd$$P$DKf-fn5v0KdGNizovx-g>b`hha@t&!jjC^nW$fsc>2S7(Bd_1 zO?WCVeyXrOE!4@BK6*2qiT1aL_8^U5`>C2O>aWnAF~$BXegir@7va7r)}ENn|F7*y zZm2y%ZflWmf>e!2Mu+k=YZwg~oxsAzWpw5D|D{bS`(hirdKpbfceM`fZs}?mU4`(?78TleGz?bEByVB4m@j%?4JS2-324O5t1S>M-sPvbR#8ze&rOF3r z>D3v*BPeuQ@iuB~*$QZSHXyfWsDB<6qP9X|EPCBoXKrhW!?i5~UL&#{|J&V1kJSI) z*FVXn6h+sF+i36H=x6xwUF0Jsa*C4S6ACr?fh+deSwsRM(7lRXh6 z=+Xxw+7w2+Pvgs%(&IN&Lkq(0Bzd3vlV==2vsa?oTqa(()ME>d^QhrRhc=x+4`XbW zcu7&WU4RGSPt*ZmZ%m z3NfLQNzzwX9s^1g|FscX*#Oaaj=D6994eY;SfKL=YVt^5y+U%R zo#`0}vuy4S4cVGS@dbB45Ao2g)8S~5l0sMq4OE<+H-7v1w=a-wd8i?GMr)K60^6Mr z2!gvMa)u=&AS&S$X8u#CdMML}$>rU`PgeAl>+?xj2^i~?Ux|lg;-D;T+hRy?UhcHp zxmD4fCWz55*YR2$3E}O6@#jIN@im0#5FPhcJiJVii8g&T%EU`Z1M*d=vaJsmnO~83 z#CL_A8mQy}vt8B1Jz3{}I`${Xsb4PVczl_b>KMehrA{{VJqH!=hYIkCR9*?;Ys)7#NXq`*p z6ck9G~mrQ0G#_Os7|KJrH)8M_oZj6J;2#3jN z$yh5G+-7w-fc~$WwmS{EqM)7Aw&3eH6>L~=V93QC`TkMO3w@y*s~|$IhPC^vhQ=GV z^jf(K2Vnc7&*Ps%Rs%uDeVoh*YN%XU*Zgmr?a4sPe|cw{*DX;UzWs?X?5^z+vsGFX zZnAC0TzB!OVo-tVP`p-51&&Qf6CGmFI02`WH(_l~;(SokqB{;7n+vfmK3YAdsOLnN zf<3#q7_FYaRx4K*-MfnJaffQgbQM&g9sTKA3OZ!V_Mper#0r?ccFrtO(1;UIKrY5w zvsCbO)`eq%57L?a_2IA@>TK2NCvRrvZUqZH_ul)DO2Si?~xgy?;484yW{& z;+?l&hZeXd5M$~lA3ECx=B67qOMFYS6uTTjY{0I>kO;Dp#c!aJN?CMG&t-t@8$zx4 ztn|GmgbhoLIXLWYYRlQ@gjJ(Pq{n(%86^+-A;*dv?%+#>LXn3b_YHb;9on-1n#zwa zv)pqBy_Tr?L{R9{!`1ZqS#yYo6Zk!Fk3it+62W}ag?byYoqUdLWqxYC?vYyrQUN(1 z7+?e(K6~Cu;ca#7*_i<~aoo$$wSPj$bXmBX0|F{!zLUeSm#t3;hscRnJEQJv@=<$B zHq;&;R6NHD$gp4s+8mBH^VyP5lSeXJ?ESX4*%n!lYwr)WmlvN0%droZqXH8} zh4d<5#ce(GxQk{Ogzy$to#%EH$)W<(R`yMdT=ctD+o&KlRRG|DxfeNt>3jw!?4iwQSH+JQMC@4!kR=;uOQqzo2WD2Lqvn$asRtlIn7>VfN|FZqw%*$vy)!O9i+*mIq@Z_l^ zICP;l??1R{5v8+wVxIDKZmW+9SZQ0GwV;rL4&a(v8wsez9uQ!9K>q5o@-5%eK>0!s z_+-f8CkuiM+cs8fTyO-Q&bFjDCDK+BLE)$%b8bwAuQ3?{SS!Ey%My@JY(G9p3S@X7 zk`aYtRN5E&8TD4|7PPT=s5?RzC%?U$Kd5(4x*Yi)+QRo-;{)BJri@Qs9pNHyr!aAjEH+t{ zj=FyF$a{BTRha z2wRj!DzV6JoXnPaABeh0M3!@zB2lo;LJ!cm5ZMD==Bv*!hra?vWv14(SIfft86ynw zkva-Z$jRrwo3Fc$h2A0~)#(^!@LE;4_MAAoNlzMmv4B30dN64Qn5JUsugH2}{7ns$ z7&YJDf4#OsE>uCzkD+$mseqca2-)LS9?3p5-PfdFVa~a*Zt49h^tp_EZ=n*-+f<+3 zYH7tC8u4OIx1um6^&u*LsG4{}7MY(ID5#RN>w%ODhtI3i5{7uxc4dACc|>1M9L_og z0;lJMsyO^TT(2`?1iwfu!niwWYnnDrq>ThTuHdiHEdV?fTF!w>pH~Mg*oG2tSX zfz978euDv^R~5JqJn5Yn*0%ex1&TauKe~7`G-vRLlD7dq7-2aNrtG&rxFQfYIqybu z!$m-PfNyz*SUg=`=XjiL0@~UsdsIteXu9R%yam9zi*I#?nK!){Gile8Z2M&Pgw6&d zAH&Z1l>|E>R%$PHk9gXx7eqK0>Q$BjbPxliq{0h|WstsZ_-X#O#Q-{oFCP<4W?_rk zYy0b?=^Y3;%QG-b^-RTJc_;wOx74p(A$q#F>St_R;X)fgKLa$^(7xGRG&TiV@v_&x z#mBEw4S{YT;HDvePFDoU7yM-JT23Do7(zFtsp1D0%;?-Mz+K(Lxw*)4uP~skfabB@ zH+fw_D_`UrJbh3J3Th6QNJL-21+wcqd=0d_@3#f`6@cSh%i(jika}>%5sk<{Xk7>> zZc2nczNjmTq+%X&S9vlWzTK=FpkD!+yY`JrsDxI!88~Bir+yuhTF&jz^KV?h+qPIr z7j1Trt2jLr*zeGE?i$T6;{rRypeWy^3N!uKJP-_zB*N)bPA!ANHL6hqNAC{;`~|>s zFC;@n7w~XP;X%m_>cQ$U6S@HSIe_`W<(kSafIGx%4fMEOq>|*r4b3-D!;b-#w}9`JX4Q59n{;VZx^B~|bD-C! zyQknl?!)0>8HZ_)XUgg*+BK*<8)Eny-*Wh- zekKRYVk+M#tg@nH=EYF1vDl<=Gd(aw2pNWg3w8UXdJ4AxR8$C$8TWh}!7V%kh2R4? ztg{*lu`K#ndgbfCSrSo99VTFCBbs(T*Hf-ye`w;OYB}bjYGJ zw(%8Gbq+sG8=!(f3hL}GBdX%?89a)C8cflWt@XJDIU=v2%Prw5`#St7O1Me?7&if9 z5ft?|MMooKLI3E?$vMiR|4-Upn$P)0RN8g~gEtFLX&z>BeEU*Zm1s8OqmZ<)UPg`(gK!Ya)tNx*UyeBw?lH!qpGAE3+82_A9S zzET1j=Gk9sFd4bf9DgU~2=0~XAUz@=JrBIIMiqw`_NUS}L$5&Yv4H0G`PQ#eShpq& z4R6AL$YKv687q{DPsbALrSNS-{kd3Dej#rBx!=$Gefxj4T?urJ*A^DEYDy$#ujZJQ zkWjNE5=lq|8K_6N;)&^D)z}8rh^bmp^ku2OmZ~u{C?#Te z-@dswvh$yRxNog@*SbrRwS3<``|LCAea_wx{1-6r#XDxVI=UD$EveJi<}m*lNX+-; zz4l5mA+A>(m$}TJ#0*)1J0Hx2)K?*OTW0bHztX}WMxEi`VJTghqc9cUCoa#HL8Wk% zb%2H=$|0AAqet~|QI#NR5tc2!8lFBV#T{aakLT);i9^3#Ft5wU5ceRU`8aHQSOctB z2cNfSHzFSz4FWLNY?T}-XqmZ5c0w$_1acR%*Aa$l)*~A;iUG5Ako;LIn}>$&hg>}% z7e7ZP$spM7@~HT;X!`d%c3u|>+>THrKP@fD6-$S_B@onH8Wb3=Pn4;)*aP^BS9agB z39?_om-m0~V`6*?kjKVYP%;&fAkp$iu;Y#dc=|%@O%R(`1L|>H3#^}hqRtX;4l_(N zTfLuQaEBo>B()17yPxS&!2@K{nDO-!TF8R+F}mpKHcIQ87F$mTQ}slnnAGp{OI@8u zB9+O-@)o|}I}M~#P?}G7EPiA4HuMCY2)TExutn{%$CXlBv`KBPdTFyNQJ)a_{g7{C zQ_&w4aM<#}KQBLzTWSaQHK4+eE}<-;xGk5)yn2grfZW5(((fe~ekyM503B*+sdMF3 z^>tnXu3`z-^LE;~C~>Vim)8zA{W2SuH*43kj@r3OYImu#9ZyKOjyVu*0fhWwUY(tQ7|?(y0nsOW>uvTZN0?=L#d~=Ft!U4EeEBAEYLp^69mu;NsS~70zyV6S^A=-SO~P z)Of8Dh>>I7T=x^LN4POvE)KD7q9QWNrYIWnt~Oo<5YLtJMym7K3FshA{l3r>? zk*1mJ;=8>umGwgZaI0!=Qlu%F_f_uu&f2r*uN0t@Gn1o#ZFT@%<|fL|owvS)WRDg6 z;KbrKyLzg2baB5PZI}56g@Gt_)G%hV<5IL^Tc3LBjqWz%Wjd2R_0cr8F)#bP50rKt zJ{`Wwy!nyC^x_tVY~R~#Hz+1xCgay_E-uhc!H!#EqJGl`8K`vA1GJ?DQ|04DVj_PW z5T|2+i18XlwWu=;M)e-Lhr6AxS#muC)pJr_*1er@3r2O9lZmeGefg`a(@neo< znV7)3r_{v{wHOl(CRD62z1x6NB5=>u`g;32Yfx9NxFm z7QHwIT~QrGetw>wE@rcaj!|o9LP>21aToaeO?pUGt5;#8z>_8{TO$W+b*yVY{gZd$ zR?MJ7RYB7dH2fWmZoQbM^kTJLRTLK~^)-ka)3ss2uYi5MPZvdR);5>W8+#O;9Di&ce zM(ayzx@of0_CD9*mO&-=@Z~Qb>U}9D!S&BrMDdg9`HkI%)Mt!uM&uS{K>bOW;s&xV zsIyCk$C~BwC4!+BAEQyRr|j48fAZaJii88$s3 zdXmwQK+_zNNEJa8sYiMqKY`s>4x+nU5&1c46jDU8`HwxD>?d!jC)CRk@8u~W(tb{i z7`N|z({`W@#5RSi_Ol8W-^hm@dHNhvy~dl`u8TD)-&`cc;>;-O+Pg z+^hLY&|%RiJ0X}zsG9=!JXx^`R&@{*Zs3u7GF5r_pDg+}i`eN*laun8Q($3b_mcP0*!d)Tn z^83f@ca>?xV)snW3L69?90$?)v0+m6IzlhDT`$TD0m)kLgjWZOwG0G4U+SG}Dr3J~ z3KVvx{avb_JOcPYnnakPv~qR`UX;O? zluD@&Yw6sET1mAr?T=2_jJ3Z)Q`iExv;0OHnZ%}0F#lY^REYl!y5j-#JDoHF2kNM1 zu<&|2^~}x+M;j~wgExiu93T)NL3XXZX6SgA9VFHpEbL@}w(O zmvM%Zmox0@<{*Qh{2Vd-HuGw$@1Z3+lyE=nhTe`bi2M2a#Xe4XFi|R_zzry`uQEPu z_!LIFZ{4(&7i?pI?|vTj(+Dg#xnB19q4Q-xll5?qO9yYw&|Tfj9zDg%`RVR^ODck- z28?I`8^;!(|B=Xk#uXE`T7P-KV-R%#AzxB&_-ZGVV$(@<)2S+^0$_iD2JsH*w3f^5p|nz$xv6SQ!}y8lRdE z&@=dQMHd8U0G0I>(U1-Ns?E}B7_NP>6XmPu*+320rHh?Zazd}>ue-DtQg@cv9U zbb0%ugH^l2;l>{ToC5Lrz9=L_12~ci;v89-vd$m;%Liz@Z%UUoHY^#ufP4QDAR+a ziyyNuukuAC()^F|UXWFBV(_tcR7@gLfy-YLguklHr>jMbNv~n?jGSE;BoVnuEhf}h$nDq#V(p6S)gYj#SqvY-rJss#eS8e6n_GunO~ zUp}Ts%~Ao6*O^R|&QeZp=f7On2E%~&!z%bGaP(}g&>_0%?=}_ddlvxSt|$nF?@e#GSMy^V(!*gGVI-n4f43AE1NOy=$;YdRY`^TlD6P>`*AETOIb^LOzLp=6Pn8Mta zyZH5#w}=Zv-2bKe@Ke(b4sn$|<=A<}wpv6j2JW^E+2H_{{V8I2h?piMt^Vi9SmpNDEq_#5ze_uf6q}akhRsGC`Uy5gZrng- zWl4uru;He(PV)nF@l;>dI51WpKfx4kApa$HFnE+8e2hS>wNAY|vKtubIXv&9Bj0Fb zB^GO@9F=|Vl&ri?R3(y%-SO2X`dbI6!VN)Tp*^~LbSZ5u(tsO8sY|GR2fpa)l?=o9 z7V}Xk)9St)jilkm*r|x0meOfgZku;c4WDnDIEFCttYeOmla3v0_|2_e34h*~w0dz5P&(oX3YGOJcS*85Fj?ml6 z$o@(CXp1OPO9H2Fd2((MEFcFKz}*YG?kd9unvurN6s=1X#?uJ*4?zM!x~ZTaqMsIzc%AH~re*Q#kwj4k6x=zI z=Tui1@3J2aBoyK{G^w~DIRFa!5enj0Ir_b#LVyQbKE@bp0c(XBkrWl&WZ(AFAjv`} zbMv`XMV&-0)I!Kv-7fqQh*4U(R(WK%>T1a3W1!_kteB^*OdBJi`8g8J@2;(kToOyi zdSo&iEi`3I324Snxe^q95@X2=%LF&gx9e*mkiCOQKChFP&F=pOxE|nqxm(;o3%KoW zsG9GKx?o>pmmtb&R1Mw0+i|v`3KjC6PR1aR=>=-X)W*fD)}S4g&<<|@3!5l|508zW zq;ji)q~B71a())TU%)*17+%;^nIH^vG0MYDCliV_$I6f4l-Bhwk%N;`6?2N!%^jtX zIaVEr`sLI)PK-ACzX0aHIZ7BbYB0M&-^eFAv9P#m%aheShc! zoDdHtmY<=rywva!c#e^up?WplxNsX3MbRSucKoS98QJcUvL2R*Kz99kJ!x(3hZq{Z zn7N}^r_`9@Fo&JC^vLUejST+)7MKqM8O>yAX8wQ4BJR^IX{`#cLF>{W zZ|5XOB@r{c$jOY;VKDSVTe&lATCxg*VSp|H*W+;ON(>#ncE_CA5dJ2*l^?l1XDLHR zBuvmp<1QC!ZsP{tG`eG?u<+9wSCnyJVJ^7dLbvfJhRxnr<3ed|LyYyBUpO{+qYMd3 zWHf<{&#aP>2eQ#1^I`TeY_1xa$&zS&$~>Xua-FqWphDYdY4Uh&>5Ubjq3{f!I6h5L zrn62*LyZPAUcZnM#r@RwaqBDDXi75-J#GT?<|*S-R%*rV{GXB0*C_FD8(0|kgrv{c z2rZSFw%e21CnP3g!}O6$`79@MKViT)s#CV#PKidOUpLa~Idt$V_>aghS$SsV8d#Bo Jme$2@{{^}B-iH7H diff --git a/fmpp/lib/test/junit.jar b/fmpp/lib/test/junit.jar deleted file mode 100644 index c8f711d050eff209321f799d85ebb3bbe305d481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120640 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 A>i_@% diff --git a/fmpp/package.json b/fmpp/package.json deleted file mode 100644 index 964bf35..0000000 --- a/fmpp/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "fmpp", - "version": "0.0.0", - "description": "FreeMarker-based file PreProcessor", - "repository": { - "type": "git", - "url": "https://github.com/freemarker/fmpp" - }, - "homepage": "http://fmpp.sourceforge.net", - "dependencies": { - "gulp": "^3.8.9", - "gulp-autoprefixer": "^1.0.1", - "gulp-less": "^1.3.6", - "gulp-minify-css": "^0.3.11", - "gulp-rename": "^1.2.0" - } -} diff --git a/fmpp/src/docs/LICENSE_ANT.txt b/fmpp/src/docs/LICENSE_ANT.txt deleted file mode 100644 index b279c7a..0000000 --- a/fmpp/src/docs/LICENSE_ANT.txt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 2000-2002 The Apache Software Foundation. All - * rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Ant" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see . - * - */ diff --git a/fmpp/src/docs/LICENSE_FREEMARKER.txt b/fmpp/src/docs/LICENSE_FREEMARKER.txt deleted file mode 100644 index 2ac874b..0000000 --- a/fmpp/src/docs/LICENSE_FREEMARKER.txt +++ /dev/null @@ -1,49 +0,0 @@ -Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -============================================================================== -END LICENSE - - -FreeMarker subcomponents with different copyright owners --------------------------------------------------------- - -FreeMarker, both in its source code and binary form (freemarker.jar) -includes a number of files that are licensed by the Apache Software -Foundation under the Apache License, Version 2.0. This is the same -license as the license of FreeMaker, but the copyright owner is the -Apache Software Foundation. These files are: - - freemarker/ext/jsp/web-app_2_2.dtd - freemarker/ext/jsp/web-app_2_3.dtd - freemarker/ext/jsp/web-app_2_4.xsd - freemarker/ext/jsp/web-app_2_5.xsd - freemarker/ext/jsp/web-jsptaglibrary_1_1.dtd - freemarker/ext/jsp/web-jsptaglibrary_1_2.dtd - freemarker/ext/jsp/web-jsptaglibrary_2_0.xsd - freemarker/ext/jsp/web-jsptaglibrary_2_1.xsd - - -Historical notes ----------------- - -FreeMarker 1.x was released under the LGPL license. Later, by -community consensus, we have switched over to a BSD-style license. As -of FreeMarker 2.2pre1, the original author, Benjamin Geer, has -relinquished the copyright in behalf of Visigoth Software Society. - -With FreeMarker 2.3.21 the license has changed to Apache License, -Version 2.0, and the owner has changed from Visigoth Software Society -to three of the FreeMarker 2.X developers, Attila Szegedi, Daniel -Dekany, and Jonathan Revusky. diff --git a/fmpp/src/docs/LICENSE_RESOLVER.txt b/fmpp/src/docs/LICENSE_RESOLVER.txt deleted file mode 100644 index b916c3e..0000000 --- a/fmpp/src/docs/LICENSE_RESOLVER.txt +++ /dev/null @@ -1,14 +0,0 @@ -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/fmpp/src/docs/ant.html b/fmpp/src/docs/ant.html deleted file mode 100644 index 653394a..0000000 --- a/fmpp/src/docs/ant.html +++ /dev/null @@ -1,203 +0,0 @@ -<@page title="The Ant Task" keywords="ant, ant task"> - -<@sect title="Description"> - -

    If you need the FMPP Ant task in a project xml (<@c>build.xml), use the <@c>taskdef core task:

    - -<@prg> - -

    Then you can use the <@c><fmpp <@r>...> task further down. You may remember the 4th step of <@a href="qtour.html">Quick Tour. This is an Ant equivalent:

    - -<@prg><#noparse> - - - - - - - - - -

    Almost all parameters of the Ant task correspond to the <@a href="settings.html">FMPP settings. If the setting value is of scalar type (as string, boolean, number) then just enter the value simply with Ant-ish syntax, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then use <@a href="tdd.html">TDD syntax for it. For hash settings the value is <@a href="tdd.html#modes">hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted, as with <@s>data above.

    - -

    The <@a href="configfile.html#configurationBase">configuration base for the setting values given with Ant parameters is the Ant project base directory. That is, if you enter <@c>sourceRoot="src", then <@c>src is interpreted relatively to the project base directory.

    - -

    There is no parameter that directly corresponds to the <@s>sources setting. The sources are chosen with nested <@c><fileset>-style parameters and nested elements (as <@c>include and <@c>exclude). However, if you use the <@s>outputFile setting, you can't use <@c><fileset>-style stuff, and <@s>sources will be specified with the <@c>sourceFile parameter. - -

    Alternatively, the <@s>data, <@s>localData, <@s>borders, <@s>modes, <@s>turns, <@s>xmlRenderings and <@s>freemarkerLinks settings can be specified with nested elements instead of parameters. For example, this is equivalent with the above example:

    - -<@prg><#noparse> - - - - - - - tdd(data/style.tdd) - birds: csv(data/birds.csv) - - - - - - -

    This can be useful, if the setting value is long. The content of the element can be a CDATA section, which is useful if the setting value contains HTML or XML fragments. Unlike with attributes, Ant property interpolations (<@c>$${"{foo}"}) in the text are not expanded, unless you force that with the <@c>expandProperties attribute of the element (<@c><data expandProperties="yes"><@r>...).

    - -

    About the support and interpretation of FMPP settings:

    -
      -
    • The values of settings <@s>ignoreCvsFiles, <@s>ignoreSvnFiles and <@s>ignoreTemporaryFiles are always set to <@c>false, and there is no Ant task parameter for them. This is so that they don't interfere with Ant's standard <@c>defaultExcludes parameter.
    • -
    • Settings <@s>echoFormat, <@s>printStackTrace, <@s>snip and <@s>columns are ignored, and there is no Ant task parameter for them.
    • -
    • The <@s>quiet setting implements only grades <@c>true and <@c>false. <@c>reallyQuiet is the same as <@c>true.
    • -
    • All <@a href="settings.html#logging">logging related settings are supported.
    • -
    - -

    To access the Ant properties and other Ant specific data in the templates, you can use data loaders such as <@c>antProperty(), <@c>antProperties(), <@c>antProject() and <@c>antTask(). Read the <@a href="dataloader.html">chapter about data loaders for more details.

    - - - - -<@sect title="Parameters"> - -

    The FMPP task accepts the following parameters:

    -
      -
    • <@a href="settings.html">All FMPP settings except <@s>sources, <@s>ignoreCvsFiles, <@s>ignoreSvnFiles, <@s>ignoreTemporaryFiles, <@s>echoFormat, <@s>printStackTrace, <@s>snip and <@s>columns. If the setting value is of scalar type (as string, boolean, number) then just enter the value simply with Ant-ish syntax, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then use TDD syntax for it. For hash settings the value is hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted. The <@a href="configfile.html#configurationBase">configuration base for the setting values is the Ant project base directory.
    • - -
    • To follow the Ant conventions, <@c>srcdir and <@c>destdir attribute names can be optionally used instead of <@c>sourceRoot and <@c>outputRoot attribute names. These are just alias names.
    • - -
    • Configuration file handling: -
        -
      • <@c>configuration: Loads a <@a href="configfile.html">configuration file. The setting values given with the parameters has higher precedence.
      • - -
      • <@c>configurationBase: Emulates that <@s>configurationBase meta setting is present in configuration file with the given value.
      • - -
      • <@c>inheritConfiguration: Emulates that <@s>inheritConfiguration meta setting is present in configuration file with the given value.
      • -
      -
    • - -
    • Ant <@c><fileset>-style attributes (see the Ant documentation for more details). Used for specifing the value of the <@s>sources setting: -
        -
      • <@c>dir: The directory that the patterns are relative to. If this attribute is omitted, then the FMPP source root will be used as the base. Note that regardless of the value of this attribute, all source files must be inside the source root. -
      • <@c>casesensitive: Sets case sensitivity of the file names. (Same as the FMPP setting) -
      • <@c>defaultexcludes: Indicates whether default excludes should be used or not (<@c>"yes" or <@c>"no"); default excludes are used when omitted. -
      • <@c>excludes: comma- or space-separated list of patterns of files that must be excluded; no files (except default excludes) are excluded when omitted. -
      • <@c>excludesfile: the name of a file; each line of this file is taken to be an exclude pattern. -
      • <@c>followsymlinks: Shall symbolic links be followed? Defaults to true. -
      • <@c>includes: Comma- or space-separated list of patterns of files that must be included; all files are included when omitted. Note that be default all files of the source root directory are included. -
      • <@c>includesfile: The name of a file; each line of this file is taken to be an include pattern. -
      -
    • - -
    • <@c>sourceFile: It can be used only if the <@s>outputFile setting is specified. It specifies the value of the <@s>sources setting, as a simple string (not a comma separated list) that specifies the path of a single file. <@c><fileset>-style attributes/elements will be ignored.
    • - -
    • <@c>antTaskFailOnError: Specifies if the Ant task should fail if there were errors during the execution of the processing session. Defaults to <@c>true. It has nothing to do with the <@s>stopOnError setting. If this parameter is <@c>true, the Ant task will fail if there were any failed file processing during the processing session, even if it was skipped because <@s>stopOnError was <@c>true (so the session wasn't aborted). If this parameter is <@c>false, then the Ant task will be successful regardless of the failed file processings or other errors during the processing session, even if the processing session was aborted. But, it never suppresses errors occurred during the initialization of the FMPP engine (i.e. errors occurred before the processing session could be stated).
    • -
    - -

    Either the <@c>configuration parameter, or <@c>sourceRoot+<@c>outputRoot parameters, or <@c>sourceFile+<@c>outputFile parameters are required. All other parameters are optional. When you use <@c>configuration, any Ant task parameters can become optional, when the value of the coressponding settings are given in the configuration file.

    - -

    <@e>Attention! When you specify the <@s>sources setting in a configuration file, its value will be added to the set of files and directories that the Ant task itself selects, which is, following the Ant tradition, by default all files and directories inside the source root. Thus, usually you will want to exclude all files in the Ant task, so only those specified in the configuration file will remain: -<@prg> - - - - - - -<@sect title="Nested elements"> - -

    The FMPP task accepts the following nested elements: -

      -
    • Elements for attribute substitution: Using these elements is the same as if you were use the attributes (parameters) with the same name, and with the same value as the nested text (or CDATA section) of the elements. Ant property values (<@c>$${"{foo}"}) are not expanded by default, but you can override this with a <@c>expandProperties="yes" attribute. Note that you etiher give a certain setting with attribute, or with element, but not both. -
        -
      • <@c>data -
      • <@c>localData -
      • <@c>borders -
      • <@c>modes -
      • <@c>turns -
      • <@c>xmlRenderings -
      • <@c>freemarkerLinks -
      -
    • <@c><fileset>-style elements (see the Ant documentation for more details): -
        -
      • <@c>patternset -
      • <@c>include: Note that be default all files inside the source root directory are included. -
      • <@c>exclude -
      • <@c>includesfile -
      • <@c>excludesfile -
      -
    - - - - -<@sect title="Examples"> - -

    Run processing session with the settings stored in <@c><@r><projectBaseDir>/config.fmpp (or <@c>fmpp.cfg):

    -<@prg><#noparse> - - - -

    As the previous, but override <@s>outputEncoding:

    -<@prg><#noparse> - - - -

    Processes all files in <@c>src/www and stores the output in <@c>build/www:

    -<@prg><#noparse> - - - -

    Same as the previous, but processes files with extension <@c>ftl only:

    -<@prg><#noparse> - - - -

    Same as the previous:

    -<@prg><#noparse> - - - - - -

    Run processing session with the settings stored in <@c><@r><projectBaseDir>/src/wwwconfig.fmpp, but process files with extension <@c>ftl only:

    -<@prg><#noparse> - - - -

    Processes a single file:

    -<@prg><#noparse> - - - -

    Exposes Ant properties <@c>foo, <@c>bar and <@c>baaz for the templates:

    -<@prg><#noparse> - - - -

    Just to show something more complex...:

    -<@prg><#noparse> - - ', '', **/*.ftl) - ]]> - - bgColor: white - fgColor: black - antProps: antProperties() - - - - - - - diff --git a/fmpp/src/docs/bsh.html b/fmpp/src/docs/bsh.html deleted file mode 100644 index c4b8410..0000000 --- a/fmpp/src/docs/bsh.html +++ /dev/null @@ -1,12 +0,0 @@ -<@page title="BeanShell language" keywords="BSH, BeanShell"> - -
    - -

    In FMPP, BeanShell is used for: -

      -
    • Creating Java objects to be used in setting values. For example when the <@s>data setting used together with the <@c>eval data loader. -
    • Pre-processing data for individual templates. See the <@s>localData setting and its <@c>bsh function. -
    • Accessing Java classes and objects from FTL templates, using the <@c>pp.loadData directive with the <@c>eval data loader. -
    - - diff --git a/fmpp/src/docs/checklinks_T3.ftl b/fmpp/src/docs/checklinks_T3.ftl deleted file mode 100644 index ffe9419..0000000 --- a/fmpp/src/docs/checklinks_T3.ftl +++ /dev/null @@ -1,13 +0,0 @@ -<@pp.dropOutputFile/> - -<#list pp.s.hrefs as href> - <#if !pp.outputFileExists(href.file)> - <@pp.warning message='Broken link "${href.href}" in "${href.source}": target file not found.' /> - <#else> - <#if href.anchor != '' && !href.file?starts_with('freemarker/') && !href.file?starts_with('api/')> - <#if !pp.s.anchors[href.file + '#' + href.anchor]??> - <@pp.warning message='Broken link "${href.href}" in "${href.source}": target anchor not found in the target file.' /> - - - - \ No newline at end of file diff --git a/fmpp/src/docs/commandline.html b/fmpp/src/docs/commandline.html deleted file mode 100644 index fd98f48..0000000 --- a/fmpp/src/docs/commandline.html +++ /dev/null @@ -1,378 +0,0 @@ -<@page title="The Command-line Tool" keywords="command-line tool"> - -<@sect title="Basic usage" anchor="cmdln_basics"> - -

    FMPP can work in two modes: as a recursive directory processor, or as single file processor.

    - -

    When you're using it as recursive directory processor, it needs a source root directory and an output root directory. It processes all files inside the source root (including the files in its subdirectories), and writes the processed files into the output root directory with similar path as in the source root (that is, the output of <@c><@r><source-root>/foo/bar.txt will be <@c><@r><output-root>/foo/bar.txt. If <@c>/home/me/sample-project/src is the source root and <@c>/home/me/sample-project/out is the output root, then you issue:

    - -<@prg>fmpp -S /home/me/sample-project/src -O /home/me/sample-project/out - -

    It's possible to tell FMPP to process only certain files and/or directories of the source root directory:

    - -<@prg>fmpp -S /home/me/sample-project/src -O /home/me/sample-project/out index.html foo/bar.txt somedir - -

    Note that these paths are interpreted relatively to the source root directory, not to the current working directory.

    - -

    When you use FMPP as single file processor, you specify a single input file, and then an output file with the <@c>-o option. It's the <@c>-o option is what triggers single file mode.

    - -<@prg>fmpp /home/me/file-to-process.txt -o /home/me/processed-file.txt - -

    In single file mode, the source root and output root directory defaults to the directory of source and output files respectively. (It has significance for example if the source file wants to include another file), but you can override them with the <@c>-S and <@c>-O switches. The source file and output file path is always interpreted relatively to the current working directory.

    - -

    It's often more convenient and manageable to use a project configuration file instead of entering everything as command-line arguments. For example, create file <@c>config.fmpp with this content:

    - -<@prg> -sourceRoot: src -outputRoot: out -logFile: fmpp.log -modes: [ ignore(tmp/), copy(**/*.dwg, bin/) ] -data: { - contact: me@example.com - clients: csv(data/clients.csv) -} - - -

    then use it as:

    - -<@prg>fmpp -C /home/me/sample-project/config.fmpp - -

    or since <@c>config.fmpp is the default configuration file name, you can simply issue:

    - -<@prg>fmpp -C /home/me/sample-project - -

    or if you are in the same directory as <@c>config.fmpp then just issue:

    - -<@prg>fmpp - -

    Note that paths in the configuration file are resolved relatively to the configuration file's directory, so it doesn't mater where do you invoke it from. Also note that you can override the settings stored in the configuration file with the command line:

    - -<@prg>fmpp -C /home/me/sample-project/config.fmpp -O other/destination - -

    Much of what should be known about FMPP is not specific to its command line interface, so look around in the Table of Contents for more information!

    - - - - -<@sect title="Command-line argument syntax primer" anchor="cmdln_syntax_primer"> - -

    This section is for users who are not too familiar with using the command-line. No FMPP specific information can be found here, so you may <@a href="#fmpp_cmdline">skip to the next section.

    - -

    The exact command-line syntax depends on what shell do you use (sh, csh, DOS shell, etc.), because the shell is responsible to split the command-line to an executable name and a list of arguments. FMPP just gets the list from the shell.

    - -

    Most shells will parse this command-line:

    - -<@prg>test -f t 1.txt 2.txt - -

    as the executable name is <@c>test, and the list of arguments is:

    - -
      -
    1. <@c>-f -
    2. <@c>t -
    3. <@c>1.txt -
    4. <@c>2.txt -
    - -

    As you may guess, the arguments are delimited by the spaces. If you want to put spaces into the value of arguments, in most shells you should use quotation marks:

    - -<@prg>test -f t -D "x:1, y:2" - -

    Here, the list of arguments will be:

    - -
      -
    1. <@c>-f -
    2. <@c>t -
    3. <@c>-D -
    4. <@c>x:1, y:2 -
    - -

    The shell has removed the quotation marks. Thus, command-line tools like FMPP will not know that there were quotation marks, as they just gets the above list from the shell.

    - -

    With shells as sh, you can use apostrophe-quotes (<@c>') instead of quotation marks. In Windows/DOS shell you can use quotation marks (<@c>") only.

    - -

    You have to quote the argument if you use characters that are reserved by the shell for other purposes. For example <@c>> and <@c>| is reserved in most shells. <@c>&, <@c>; and <@c>( is reserved in sh. Also, if you use an UN*X shell, sometimes you need to quote arguments that contain <@c>*, <@c>? or <@c>~, because otherwise the shell interprets the argument as a path, and replaces that with the list of matching files.

    - -

    Most shells understand partially quoted arguments. For example:

    - -<@prg>test -D"x:1, y:2" - -

    will be interpreted as:

    - -
      -
    1. <@c>-Dx:1, y:2 -
    - -

    A tricky situation is when you want to use quotation marks in an argument value. To prevent this situations use apostrophe-quotes instead of plain quotes and vice versa. For example:

    - -<@prg>test -D"x:'red led', y:2" - -

    or (will not work in Windows/DOS shell!):

    - -<@prg>test -D'x:"red led", y:2' - - - - -<@sect title="FMPP command-line argument syntax" anchor="fmpp_cmdline"> - -

    The FMPP command-line tool uses similar argument syntax to usual UN*X command-line tools, such as <@c>ls. UN*X users should be able to use the tool even without reading this section.

    - -

    This is a possible FMPP command-line:

    - -<@prg>fmpp -C mycfg.fmpp -q --case-sensitive products index.html - -

    The FMPP command-line tool interprets command-line arguments as either:

    -
      -
    • Option, as <@c>-q, <@c>--case-sensitive and <@c>-C mycfg.fmpp -
    • Non-option, as <@c>products and <@c>index.html -
    - -

    An option always starts with dash (<@c>-), or with double dash. (<@c>--), followed by the name of the option (e.g. <@c>q, <@c>C, <@c>case-sensitive). If the option requires parameter, then it is followed by the parameter to the option (as <@c>mycfg.fmpp in <@c>-C mycfg.fmpp), which counts as the part of the option, not as non-option.

    - -

    If the option uses single dash, then the name of the option is exactly 1 character long; this is called short form. If the option uses double dash, then the name can be arbitrary long; this is called long form. All options have long form, and many options have both long and short form versions, which are equivalent (for example <@c>-q and <@c>--quiet). Short form options can be grouped together, for example you can write
    <@c>-qxs
    instead of
    <@c>-q -x -s

    - -

    Some options require a parameter. To demonstrate the syntactical rules with examples, here are the valid ways to give <@c>cp852 as parameter to option <@c>-E alias <@c>--source-encoding:

    - -
      -
    • <@c>-E cp852: here the parameter was the next argument after the option -
    • <@c>-Ecp852: here I have utilized that a short option name is always 1 character long, and thus, since <@c>-E require parameter, the rest of this argument will be interpreted as the parameter of the option. (Note, that because if this, grouping (as <@c>-qxs) will not work if an option in the group, other than the very last option, requires parameter.) The next argument of the command-line will not be interpreted as parameter to <@c>-E. -
    • <@c>-E=cp852: This is similar to the latest, but the option name and parameter value is separated with <@c>= -
    • <@c>--source-encoding cp852 -
    • <@c>--source-encoding=cp852 -
    - -

    I didn't show the combinations like <@c>-E="cp852", as the usage of quotation marks is shell dependent. See <@a href="#cmdln_syntax_primer">the section about using the command-line for more information.

    - -

    The order in which options occur in the command-line argument list is not significant.

    - -

    Options are case sensitive. This means that <@c>-c and <@c>-C are not the same.

    - -

    Any argument that does not start with dash and is not directly after an option that needs parameter, is a non-option. In FMPP, non-options are used to list the name of the files or directories that you want to process; see more about this later. The position of a non-option in the argument list relatively to the options is not significant. That is, these command-line argument lists are equivalent:

    - -
      -
    • <@c>-C mycfg.fmpp -q products index.html -
    • <@c>products index.html -C mycfg.fmpp -q -
    • <@c>products -C mycfg.fmpp index.html -q -
    - -

    Sometimes it happens that a non-option should start with dash (for example, because the name of the file you want to refer to starts with dash). In this case you can use a special character sequence, <@c>-- followed by no option name, to indicate that all subsequent arguments are non-options:

    - -<@prg> -fmpp -Cmycfg.fmpp -- -this-is-a-non-option - - - - - -<@sect title="Invoking the command-line tool"> - -

    The command-line tool can be invoked with the <@c>fmpp shell script (<@fmppPath path="bin/fmpp" /> or <@fmppPath path="bin/fmpp.bat" />), assuming you have <@a href="installing.html#commandLineTool">installed it properly.

    - -

    When you invoke this tool, it will immediately run a processing session, with the settings you have set with its arguments (see later how), and then terminates. (With some command-line options, however, it will do something else, as with <@c>-h it just prints help.)

    - - - - -<@sect title="Specifying settings in the command-line"> - -

    Most command-line options specify <@a href="settings.html">FMPP settings. The option name is the name of the setting, but with lower case dashed form (as <@c>source-root) instead of the usual mixed case form (as <@c>sourceRoot). The value of the setting is given as the parameter of the option. The <@a href="configfile.html#configurationBase">configuration base for the values is the current working directory (i.e. the directory you are in).

    - -

    Example: Runs a processing session with <@s>sourceRoot set to <@c>src and <@s>outputRoot set to <@c>out (so this will process all files in the <@c>src directory, and store the output in the <@c>out directory):

    - -<@prg>fmpp --source-root src --output-root out - -

    For the most frequently used settings there is short option name too. For example, this is equivalent with the previous example:

    - -<@prg>fmpp -S src -O out - -

    If the setting value is of scalar type (as string, boolean, number) then just enter the value simply as is, not with TDD syntax. If the setting value is of more tricky type, as hash or sequence, then you use TDD syntax for it. For hash settings the value is a <@a href="tdd.html#modes">hash mode TDD, and for sequence setting it is sequence mode TDD, so the brackets should be omitted. For example:

    - -<@prg>fmpp -S src -O out -D "online:false, tdd(data/style.tdd)" --replaceExtensions "ftl, html" - -

    Note that the quotation marks were needed only for the command-line parser of the shell (see earlier on this page), so they are not visible for FMPP.

    - -

    Boolean settings (and <@s>quiet) are specified with parameterless options:

    - - - - - - - - - - - - - - - - - - - - - - - -
    Command-line option - Meaning -
    Setting name - Value -
    <@c>-s, <@c>--stop-on-error - <@s>stopOnError - <@c>true -
    <@c>-c, <@c>--continue-on-error - <@s>stopOnError - <@c>false -
    <@c>--case-sensitive - <@s>caseSensitive - <@c>true -
    <@c>--ignore-case - <@s>caseSensitive - <@c>false -
    <@c>--ignore-cvs-files - <@s>ignoreCvsFiles - <@c>true -
    <@c>--dont-ignore-cvs-files - <@s>ignoreCvsFiles - <@c>false -
    <@c>--ignore-svn-files - <@s>ignoreSvnFiles - <@c>true -
    <@c>--dont-ignore-svn-files - <@s>ignoreSvnFiles - <@c>false -
    <@c>--ignore-temporary-files - <@s>ignoreTemporaryFiles - <@c>true -
    <@c>--dont-ignore-temporary-files - <@s>ignoreTemporaryFiles - <@c>false -
    <@c>--print-stack-trace - <@s>printStackTrace - <@c>true -
    <@c>--dont-print-stack-trace - <@s>printStackTrace - <@c>false -
    <@c>-x, <@c>--expert - <@s>expert - <@c>true -
    <@c>--not-expert - <@s>expert - <@c>false -
    <@c>--append-log-file - <@s>appendLogFile - <@c>true -
    <@c>--dont-append-log-file - <@s>appendLogFile - <@c>false -
    <@c>-q, <@c>--quiet - <@s>quiet - <@c>true -
    <@c>-v, <@c>--verbose - <@s>quiet - <@c>false -
    <@c>-Q, <@c>--really-quiet - <@s>quiet - <@c>reallyQuiet -
    - -

    Example:

    - -<@prg>fmpp -S src -O out --dont-ignore-cvs-files -cqx - -

    where the last few options mean: <@s>ignoreCvsFiles is <@c>false, <@s>stopOnError is <@c>false, <@s>quiet is <@c>true, <@s>expert is <@c>true.

    - -

    The value of the <@s>sources setting can be given as the non-option arguments to the tool. For example, to process only files <@c>index.html and directory <@c>products of the source root:

    - -<@prg>fmpp -S src -O out index.html products - -

    Notes for Windows users:

    -
      -
    • In paths you can optionally use slash (<@c>/) instead of backslash (<@c>\) anywhere.
    • -
    • You can't use <@c>* and <@c>? in paths (except in settings that explicitly want <@a href="pathpattern.html">path patterns, e.g. <@s>modes)
    • -
    - - - - -<@sect title="Using configuration files"> - -

    With option <@c>--configuration or <@c>-C you can load a configuration file. As you may know it <@a href="configfile.html">from the chapter about configuration files, it is enough to give the directory of the configuration file, if the file uses one of the standard names. Example:

    - -<@prg>fmpp -C works/project1 - -

    If you don't use option <@c>--configuration/<@c>-C, <@c>fmpp will look for a configuration file in the current working directory, and if it finds one with standard name, it will load that automatically. To prevent this, use <@c>--configuration/<@c>-C with <@c>none parameter (as <@c>-C none).

    - - -

    Settings loaded from the configuration file have lower priority than settings given as command-line arguments. For example, here you add an extra variable to the <@s>data specified in the configuration file, or if variable <@c>online was already created there then replace its value:

    - -<@prg>fmpp -C works/project1 -D online:true - -

    Options <@c>configurationBase and <@c>inheritConfiguration can be used to emulate that settings <@s>configurationBase and <@s>inheritConfiguration are present with the given value in the configuration file.

    - - - - -<@sect title="Global options" anchor="fmpprc"> - -

    The default of some settings that can't influence the output files can be set in a configuration file called <@c>.fmpprc. This file is searched in these directories, in this order:

    -
      -
    1. In your home directory.
    2. -
    3. On Windows, in the directory pointed by the <@c>HOME environment variable.
    4. -
    5. In the directory pointed by the <@c>FMPP_HOME environment variable. This is usually automatically set to the directory where you have installed FMPP.
    6. -
    - -

    Only the first <@c>.fmpprc found will be loaded.

    - -

    The settings you can set in the <@c>.fmpprc are:

    -
      -
    • <@s>appendLogFile
    • -
    • <@s>columns
    • -
    • <@s>echoFormat
    • -
    • <@s>printStackTrace -
    • <@s>quiet
    • -
    • <@s>snip: Deprecated, now just an inverted alias of <@s>printStackTrace
    • -
    - - - - -<@sect title="Supported front-end dependent settings"> - -

    All <@a href="settings.html#logging">logging related settings are supported.

    - -

    All recommended <@s>echoFormat-s are supported, but <@c>verbose is the same as <@c>normal. It depends on the terminal implementation you use, but <@c>terse echo format can substantially speed up the processing session if you have many files.

    - -

    All <@s>quiet values are supported.

    - - - - -<@sect title="List of all options"> - -

    The complete list of command-line options with brief description is included further below in the output of <@c>fmpp -h. -Almost all options correspond to FMPP settings; see the <@a href="settings.html">complete descriptions of FMPP settings here.

    - -
    -${pp.loadData('eval', '
    -    StringWriter sw = new StringWriter();
    -    PrintWriter pw = new PrintWriter(sw);
    -    
    -    r = fmpp.tools.CommandLine.execute(
    -        new String[]{"-h", "--columns", "110"},
    -        pw,
    -        new PrintWriter(fmpp.util.NullWriter.INSTANCE));
    -    if (r != 0) {
    -        throw new Exception("CommandLine.execute exited with code " + r);
    -    }
    -    
    -    pw.close();
    -    return sw.toString();
    -')}
    -
    - - - - diff --git a/fmpp/src/docs/configfile.html b/fmpp/src/docs/configfile.html deleted file mode 100644 index 5b95fba..0000000 --- a/fmpp/src/docs/configfile.html +++ /dev/null @@ -1,106 +0,0 @@ -<@page title="Configuration Files" keywords="configuration file"> - -<@sect title="Basics"> - -

    Configuration files are text files that store setting values. They can use two syntaxes (two formats):

    -
      -
    • <@a href="tdd.html">TDD: This is the preferred format.
    • -
    • <@a href="properties.html">Java "Properties": This is mostly supported for backward compatibility with the FMPP 0.8.X series.
    • -
    - -

    The syntax that a configuration file uses is detected with the file extension. For "properties" configuration files, the file extension must be <@c>cfg or <@c>properties. For TDD files, the preferred file extension is <@c>fmpp, but it can be anything but <@c>cfg and <@c>properties.

    - -

    When you want to load a configuration file, you specify the path of the file for the front-end somehow (read <@a href='frontends.html'>the documentation of the front-end). But if the configuration file name is one of these standard names:

    -
      -
    • <@c>config.fmpp
    • -
    • <@c>fmpp.cfg
    • -
    - -

    then it is enough to give the path of the directory that contains the configuration file. (<@c>config.fmpp has higher priority if both file is present.)

    - - - - -<@sect title="The configuration base" anchor="configurationBase"> - -

    The configuration base is the directory used as base for resolving relative <@a href="overview.html#realPath">real paths in setting values. Be default, the configuration base is the directory that contains the configuration file. For example, if <@c>/home/me/project1/config.fmpp contains <@c>sourceRoot: src, then the <@s>sourceRoot will be <@c>/home/me/project1/src.

    - -

    The configuration base can be changed with the <@s>configurationBase meta setting. For example, if in the previous example <@c>config.fmpp contains <@c>configurationBase: ../project2, then the <@s>sourceRoot will be <@c>/home/me/project2/src. The <@s>configurationBase setting applies only for the setting values specified in the same file it is stored in.

    - -

    Not all relative paths in settings are resolved relatively to the <@s>configurationBase. Relative <@a href="overview.html#virtualPath">virtual paths, for example, are relative to the <@s>sourceRoot or <@s>outputRoot. Relative paths of data files passed to data loaders are relative to the <@s>dataRoot.

    - -

    If the setting value comes not from a configuration file (such as from a command-line argument), then the front-end specifies what the configuration base is for that setting value (see the documentation of the front-end).

    - - - - -<@sect title="Configuration inheritance" anchor="inheritance"> - -

    A configuration file can inherit setting values from another configuration file, with the <@s>inheritConfiguration meta setting. When the FMPP core loads a configuration file, and it finds <@s>inheritConfiguration setting in it, it will automatically load that configuration file too, and then merge its settings with the settings loaded from the inheriting (the first) configuration file. The settings stored in the inheriting configuration file have higher priority than the settings stored in the inherited configuration file. Thus, if both file contains the same setting, then the value stored in the inheriting file will be used, or it will be merged with the other value if the setting supports merging.

    - -

    The above description is applicable recursively. That is, an inherited configuration file can inherit another configuration file, and that can inherit yet another configuration file, and so on.

    - -

    <@a href="settings.html#metaSettings">Meta settings (as <@s>inheritConfiguration and <@s>configurationBase) are never inherited. They influence only the file where they are actually present.

    - -

    A possible usage of configuration inheritance is to customize a common configuration file. See: <@example path='inherit_config' />.

    - - - - -<@sect title="Configuration files with TDD syntax"> - -

    These files start in TDD hash mode. For example:

    - -<@prg> -sourceRoot: src -outputRoot: out -data: {tdd(data/style.tdd), birds:csv(data/birds.csv)} -removeExtensions: [ftl, t2] -datetimeFormat: "MMM d, yyyy hh:mm a zzz" -caseSensitive - - -

    According the TDD syntax, values of type sequence (as <@s>removeExtensions) was put into square brackets. However, for sequence settings, if the sequence would contain exactly 1 element, then you can just give that element directly:

    - -<@prg> -removeExtensions: ftl - - -

    and the value will be automatically converted to a sequence that contains the a single string <@c>ftl, as it is known that <@s>removeExtensions must be a sequence. This is a feature of the setting handling mechanism, not TDD, so don't try to use this trick elsewhere.

    - -

    TDD configuration files always use ISO-8859-1 encoding, if there is no other encoding suggested in the file with <@a href="tdd.html#encoding">TDD's encoding comment.

    - -

    For more information about TDD, please read <@a href="tdd.html">the chapter about TDD.

    - - - - -<@sect title='Configuration files with "properties" syntax'> - -

    <@e>Attention: "properties" configuration files must use <@c>cfg or <@c>properties file extension.

    - -

    This is the previous example configuration file with "properties" format:

    - -<@prg> -sourceRoot = src -outputRoot = out -data = tdd(data/style.tdd), birds:csv(data/birds.csv) -removeExtensions = ftl, t2 -datetimeFormat = MMM d, yyyy hh:mm a zzz -caseSensitive - - -

    The differences to TDD configuration files are:

    -
      -
    • It uses <@a href="properties.html">"properties" syntax...
    • -
    • The values do not use TDD syntax, except for composite types as hashes and sequences. For example, the value of <@s>datetimeFormat is not quoted (in TDD it was, as the string contains spaces and coma), it is just entered directly.
    • -
    • The <@c>{ and <@c>} for the <@s>data hash and the <@c>[ and <@c>] for the <@s>removeExtensions sequence is omitted. This is because the value of a hash setting is parsed as hash mode TDD, and the value of a sequence setting is parsed as sequence mode TDD, so the brackets are implied.
    • -
    • For boolean settings, empty-string is considered as <@c>true (see the line that sets <@s>caseSensitive).
    • -
    • Setting names can be written with lower case dashed form (as <@s check=false>output-root) instead of mixed case (as <@s>outputRoot). This is for backward compatibility with FMPP 0.8.X, where configuration files were use to store options to the command-line tool. The two forms can be used mixed in the same configuration file.
    • -
    - -

    Otherwise "properties" configuration files work in the same way as TDD configuration files. For example, they can inherit an other configuration file. It is not a problem if a "properties" configuration file inherits TDD configuration file or the opposite.

    - - - - diff --git a/fmpp/src/docs/dataloader.html b/fmpp/src/docs/dataloader.html deleted file mode 100644 index dc4d1e3..0000000 --- a/fmpp/src/docs/dataloader.html +++ /dev/null @@ -1,604 +0,0 @@ -<@page title="Data Loaders" keywords="data loader"> - -<@sect title="Introduction"> - -

    Data loaders are Java objects that load data from certain type of data source, such as a CSV file or MySQL data-base, and expose the data as variables for the templates. For example, a data loader was invoked in the <@a href="qtour.html">Quick Tour when you have written <@c>csv(data/birds.csv).

    - -

    Data loaders are typically invoked: -

      -
    • ... by <@a href="tdd.html">TDD functions used in the <@s>data setting -
    • ... by TDD functions used in the <@s>localData setting -
    • ... by the <@a href="pphash.html#key_loadData">pp.loadData method used in FreeMarker templates -
    - - - - -<@sect title="Predefined data loaders"> - -

    Data loaders that load data directly from files will want you to give the path of the file as parameter. There you have to give <@a href="overview.html#realPath">real path. If you give a relative path, then it will be interpreted relatively to the <@s>dataRoot, which defaults to the <@s>sourceRoot if you didn't specified it. The data files can be outside the <@s>dataRoot directory; it is used only as a base directory.

    - -<@note>I have not written a database/SQL/JDBC data loader yet... Of coruse, you can write a such data loader yourself. Contributions are welcome! - -<@dataLoader name="csv"> - <@param name="path" type="string">The path of the CSV file. - <@param name="options" type="hash" optional=true>The list of valid options: -
      -
    • <@c>separator: The character that separates the columns. Defaults to <@c>";". It can be any character. It also understands the string <@c>"tab", which means that the separtor character will be the tab character.
    • - -
    • <@c>encoding: The charset used for reading CSV file. Defaults to the value of the <@s>sourceEncoding setting.
    • - -
    • <@c>trimCells: Specifies if all cells will be trimmed (boolean). Trimming means the removal of all leading and trailing white-space. Defaults to no trimming (in which case only header cells are trimmed). <@e>For tables directly entered by humans (like in Excel) it is strongly recommended to turn this on. - -
    • <@c>decimalSeparator: Alternative character used for the decimal dot in the CSV files. The dot will be always assumed as decimal separator, except if <@c>groupingSeparator is set to dot. Note that this option has significance only if you use <@c>:n (or <@c>:number) in the headers, so the data loader has to interpret the text as numbers.
    • - -
    • <@c>groupingSeparator: The character used for grouping symbol in the CSV file (as the coma in $20,000,000). Be default, grouping is not allowed. Note that this option has significance only if you use <@c>:n (or <@c>:number) in the headers.
    • - -
    • <@c>altTrue: Alternative word interpreted as boolean true. Note that this option has significance only if you use <@c>:b (or <@c>:boolean) in the headers, so the data loader has to parse the text as booleans.
    • - -
    • <@c>altFalse: Alternative word interpreted as boolean false. Note that this option has significance only if you use <@c>:b (or <@c>:boolean) in the headers.
    • - -
    • <@c>emptyValue: A string or a sequence of strings which define the values that are equal to an empty cell. For example, if this is <@c>["-", "N/A"], then cells whose content is a minus sign or N/A will look like they were left empty. The comparison is case-sensitive. The header row is not affected by this option. - -
    • <@c>dateFormat: The pattern used for parsing date-only values. Note that this option has significance only if you use <@c>:d (or <@c>:date) in the headers.
    • - -
    • <@c>timeFormat: The pattern used for parsing time-only values. Note that this option has significance only if you use <@c>:t (or <@c>:time) in the headers.
    • - -
    • <@c>dateTimeFormat: The pattern used for parsing date-time values. Note that this option has significance only if you use <@c>:dt (or <@c>:dateTime) in the headers.
    • - -
    • <@c>normalizeHeaders: Specifies if the header names coming from the file will be normalized - or should be left as is (boolean). Normalization means: -
        -
      1. Remove the part between the first <@c>"(" and last - <@c>")", before the header is parsed for column type - identifier (like <@c>":n"; column type identifiers are discussed somewhere later). -
      2. After the type identifier was extracted and removed, the cell value is trimmed. (Note that this happens even if this option is off.) -
      3. Then it's converted to lower case. -
      4. Then the following characters are replaced with <@c>"_": - space, comma, semicolon, colon.
      5. Then all <@c>"__" - and <@c>"___" and so on is replaced with a single - <@c>"_". -
      - For example, <@c>"Price, old (category: A, B, F): n" will be normailzed to <@c>"price_old", and the column type identifier will be <@c>n. -
    • - -
    • <@c>headers: Use this if the CSV file has no header row, that is, if the first row doesn't store column names. The option value must be a sequence of strings. Each item in the sequence corresponds to a cell value of the imaginary (actually missing) header row, and will be parsed on the same way as a real header row would be.
    • - -
    • <@c>replaceHeaders: Use this if the CSV file does have a header row, but you don't like/trust the content of it. The rules are the same as with the <@c>header option, except of course that it replaces the existing header row.
    • -
    - - -

    Examples (with TDD syntax):

    -
      -
    • <@c>csv(data/foo.txt) -
    • <@c>csv(data/foo.txt, {separator:tab, encoding:UTF-8}) -
    • <@c>csv(data/foo.txt, {separator:',', encoding:ISO-8859-2, headers:[name, size:n, lastModified:dt]}) -
    - -

    The <@c>csv data loader parses CSV (Column Separated Values) file, or other file of similar formats (as tab divided text, comma separated values), and returns it as a sequence. The sequence is the list of the table rows, and each row is a hash, where you can access the cells with the column name. The column names (headers) are stored in the first row of the CSV file (unless you use the <@c>headers option), so this row is not part of the result sequence.

    - -

    For example, if this is the CSV file:

    - -<@prg> -name;color;price -rose;red;10 -rose;yellow;15 -tulip;white;6 - - -

    and you load it into the variable <@c>flowers, then you can print it as:

    - -<@prg><#noparse> - -<#list flowers as flower> -
    ${flower.name}${flower.color}${flower.price} - -
    - - -

    and the output will be:

    - -<@prg><#noparse> - -
    rosered10 -
    roseyellow15 -
    tulipwhite6 -
    - - -

    The rows are not only hashes, but also sequences, so instead of the column name you can use the 0 based column index. Thus the above template could be written like this as well, just it is less readable:

    - -<@prg><#noparse> - -<#list flowers as flower> -
    ${flower[0]}${flower[1]}${flower[2]} - -
    - - -

    and actually then it would be simpler to write:

    - -<@prg><#noparse> - -<#list flowers as flower> - <#list flower as cell>
    ${cell} - -
    - - -

    The values (cells) in the CSV file will be always exposed as string variables, unless you specify a different type in the header cells directly. To specify the type, type a colon after the column name, and a type identifier. The type identifier can be: <@c>n (or <@c>number) or <@c>b (or <@c>boolean) or <@c>d (or <@c>date) or <@c>t (or <@c>time) or <@c>dt (or <@c>dateTime) or <@c>s (or <@c>string). For example, if you want to expose the price column as number, and not as string (so you can do arithmetic with it, or use the number formatting facilities), then the CSV file would be:

    - -<@prg> -name;color;price:n -rose;red;10 -rose;yellow;15 -tulip;white;6 - - -

    Numerical values must use dot (<@c>.) as decimal separator, and no grouping, unless you change these with the <@c>decimalSeparator and/or <@c>groupingSeparator options.

    - -

    Boolean values must be one of <@c>true, <@c>yes, <@c>y, <@c>1, <@c>false, <@c>no, <@c>n, <@c>0, or the words defined be the <@c>altTrue and <@c>altFalse options. Upper- and lower-case letters are not distinguished.

    - -

    Date, time and date-time values use common SQL format with optional time zone, as <@c>"2003-06-25", <@c>"22:30:08", <@c>"2003-06-25 10:30:08 PM", <@c>"2003-06-25 10:30:08 PM GMT+02:00". But if you use option <@c>dateFormat, <@c>timeFormat, or <@c>datetimeFormat, then that format has to be used for dates, times, and date-times respectively. If the time zone is not given in a value, the value of the <@s>timeZone setting is used.

    - -

    The variable returned by the <@c>csv data loader is not only a sequence, but also a hash at the same time, that contains one key: <@c>headers. This is a sequence that stores the column names.

    - -<@prg><#noparse> -<#list flowers.headers as h> -- ${h} - - - -

    will print:

    - -<@prg> -- name -- color -- price - - -

    Note that only the name of the column is returned, not the type identifier stuff (as <@c>:n).

    - - - -<@dataLoader name="json"> - <@param name="path" type="string">The path of the JSON file. - <@param name="charset" type="string" optional=true>The charset used for reading the JSON file. Defaults to the <@s>sourceEncoding setting. - -

    Examples (with TDD syntax):

    -
      -
    • <@c>json(data/foo.json) -
    • <@c>json(data/foo.json, UTF-8) -
    - -

    This data loader parses a JSON file. The JSON file must contain a single top-level JSON value of any type, like a JSON array, or a JSON object, or a JSON string, etc. Example file content (this contains a JSON array on the top-level):

    - -<@prg> -[ - { - "name": "Jean Test", - "maidenName": "Jean Test", - "age": 20, - "skills": [ "HTML", "CSS" ], - "testResults": { "a": 10.5, "b": 20, "c": 30 }, - "decided": true - }, - { - "name": "José Test", - "maidenName": null, - "age": 30, - "skills": [ "Ruby", "C++", "Cuda" ], - "testResults": { "a": 20, "b": 30, "c": 40 }, - "decided": false - } -] - - -

    Assuming you have loaded the above JSON into the <@c>applicants variable, you could print the name and age of all applicants, and print their skills in nested listing like this:

    - -<@prg><#noparse> -<#list applicants as applicant> - ${applicant.name} (age: ${applicant.age}) - <#list applicant.skills as skill> - - ${skill} - - - - -

    That is, JSON arrays will be FTL (FreeMarker Template Language) sequences, JSON objects will be FTL hashes, JSON strings will be FTL strings, JSON numbers will be FTL numbers, JSON boolean will be FTL boolean. JSON null-s will be FTL undefined variables (Java <@c>null-s), so for <@c>applicants[1].maindenName FreeMarker would give an undefined variable error, and you need to write something like <@c>applicants[1].maindenName!'N/A' instead.

    - -

    The loaded JSON will also act as an FTL node tree (and advanced FreeMarker feature), similarly to an XML. This means, among others, that you can get the parent of a value. The parent of a value is its containing array or object:

    - -<@prg><#noparse> -<#-- We just pick some skill for the example below: --> -<#assign skill = applicants[0].skills[0]> -<#-- Now let's say we only have the skill variable, and we don't know - how was it get. We can still get whose skill it was: --> -${skill} is the skill of ${skill?parent?parent.name}, -<#-- skill?parent is the array, the parent of that is the JSON object --> - - -

    More details about the node nature:

    -
      -
    • The <@c>?node_type of a value will be the name of the JSON type, like <@c>"string", <@c>"array", <@c>"object", etc.
    • -
    • If a value is the right-side of a key-value pair in a JSON object, its <@c>?node_name will be the value of the key (like <@c>"name", <@c>"age", etc.). Otherwise, it will be <@c>"unnamed" + capital node type, like <@c>"unnamedString".
    • -
    • When traversing the tree with <@c><#visit <@r>...>/<@c><#recurse>, or using <@c>?children, JSON <@c>null-s will appear as existing nodes with <@c>?node_type <@c>"null" and no FTL type other than node (thus they are unprintable, uncomparable, unlistable, etc.).
    • -
    - -

    See <@fma>the FreeMarker Manual for more about nodes and the related directives and built-ins!

    - - - - -<@dataLoader name="text"> - <@param name="path" type="string">The path of the text file. - <@param name="charset" type="string" optional=true>The charset used for reading text file. Defaults to the <@s>sourceEncoding setting. - -

    Examples (with TDD syntax):

    -
      -
    • <@c>text(C:/autoexec.bat) -
    • <@c>text(C:/autoexec.bat, CP850) -
    - -

    This data loader loads a plain text file, and returns that as a string.

    - - -<@dataLoader name="slicedText"> - <@param name="path" type="string">The path of the text file. - <@param name="options" type="hash" optional=true>The list of valid options: -
      -
    • <@c>separator: The string that slices the text file into items, that is, the string between two adjoining items. It defaults to <@c>"\n", so each line of the text will be an item. Examples: If you want the items to be separated with empty lines, then you should write <@c>"\n\n" (this is what is between two items if you imagine it). Of course in this case the items can contain single line-breaks (but not multiple consequent line breaks), not like in the default case. If you want to separate the items with a <@c>"---" that is considered as separator only if it's alone in a line (not in the middle of a line) then the separator should be <@c>"\n---\n". If you simply want to separate the items with semicolon then the separator should be <@c>";" (in this case you certainly want to use the <@c>trim option described below). There is some "magic" involved in the handling of line-breaks: 1.: no mater if you are using UN*X, DOS/Windows or Mac line-breaks in the <@c>separator option and in the text file, they will be considered to be equal, 2.: when the text file is searched for a multi-line separator string, those evil invisible extra spaces and tabs at the end of the lines will be tolerated.
    • -
    • <@c>trim: If it's <@c>true, then each item will be trimmed individually, that is, the leading and trailing white space will be removed from them. Defaults to <@c>false.
    • -
    • <@c>dropEmptyLastItem: If it's <@c>true then the last item will be removed from the result if it's a 0 length string (after trimming, if the <@c>trim option is <@c>true). Defaults to <@c>true, so if the text file ends with a separator or the text file is empty, you will not get a needless empty item.
    • -
    • <@c>encoding: The charset used for reading text file. Defaults to the value of the <@s>sourceEncoding setting.
    • -
    - - -

    Examples (with TDD syntax):

    -
      -
    • <@c>slicedText(data/foo.txt)
    • -
    • <@c>slicedText(data/foo.txt, {separator:\n---\n, encoding:UTF-8})
    • -
    • <@c>slicedText(data/foo.txt, {separator:';', trim})
    • -
    - -

    This data loader loads a text file and slices it to items (strings) by cutting out all occurences of the separator string specified with the <@c>separator option. The result is a sequence of strings.

    - -

    For example, if this is the <@c>data/stuff.txt file:

    -<@prg> -This is the first item. - -Still the first item... - ---8<-- - -The items are separated with this: ---8<-- -just don't forget to surround it with -empty lines. - ---8<-- - -This is the last item. - - -

    and it's loaded in the configuration file like: - -<@prg> -data: { - stuff: slicedText(data/stuff.txt, {separator:"\n\n--8<--\n\n"}) -} -<#-- " --> - -

    then the output of this template file

    - -<@prg><#noparse> -<#escape x as x?html> - -<#list stuff as i> -
    -${i}
    -
    - - - - - -

    will be this:

    - -<@prg> - -
    -This is the first item.
    -
    -Still the first item...
    -
    -
    -The items are separated with this:
    ---8<--
    -just don't forget to surround it with
    -empty lines.
    -
    -
    -This is the last item.
    -
    - - - -

    Note the double <@c>\n-s in the separator that causes the data loader to treat <@c>"–8<--" as separator only if it is surrounded with empty lines.

    - - - -<@dataLoader name="tdd"> - <@param name="path" type="string">The path of the TDD file. - <@param name="charset" type="string" optional=true>The charset used for reading TDD file. Defaults to the <@s>sourceEncoding setting. - -

    Examples (with TDD syntax):

    -
      -
    • <@c>tdd(data/foo.tdd) -
    • <@c>tdd(data/foo.tdd, ISO-8859-5) -
    - -

    This data loader parses a <@a href="tdd.html">TDD file. The loaded TDD is interpreted in <@a href="tdd.html#modes">hash mode, and TDD functions will invoke data loaders, exactly like with the <@s>data setting.

    - -

    See <@example 'tdd' /> for a concrete example.

    - - - -<@dataLoader name="tddSequence"> - <@param name="path" type="string">The path of the TDD file. - <@param name="charset" type="string" optional=true>The charset used for reading TDD file. Defaults to the <@s>sourceEncoding setting. - -

    This is like the <@a href="#key_tdd"><@c>tdd dataloader, except that it interprets the file as a <@a href="tdd.html">TDD sequence (TDD "sequence mode"), rather than as a TDD hash. So the result will be a sequence (a list), not a hash.

    - - -<@dataLoader name="properties"> - <@param name="path" type="string">The path of the "properties" file. - -

    Loads a <@a href="properties.html">"properties" file. The result is a hash.

    - - - -<@dataLoader name="xml"> - <@param name="path" type="string">The path of the XML file. - <@param name="options" type="hash" optional=true>Options. See later... - - <@note>Sometimes XML files are rather source files (as the HTML-s and the JPG in the <@a href="qtour.html">Quick Tour) than data files (as <@c>data/birds.tdd in the Quick Tour), just you need to invoke a template to render them to their final form (e.g. to HTML pages). If this is the case, you should use <@c>renderXml processing mode (<@a href="settings.html#key_modes">see here...), not XML data loader. An example that uses this approach is <@example 'xml_rendering' />. - -

    Loads an XML file. This uses the built-in XML wrapper of FreeMarker 2.3 and later; please read <@fma href="xgui.html">FreeMarker Manual/XML Processing Guide for more information about the usage of the returned variable.

    - -

    Notes:

    -
      -
    • Comment nodes will be removed by default (see option <@c>removeComments below). -
    • Processing instruction well be keep by default (see option <@c>removePIs below). -
    • CDATA sections count as plain text nodes. -
    • There are no adjacent text nodes in the node tree; adjacent text nodes will be joined. -
    - -

    The example <@example 'xml_try'/> is a good tool to understand this data loader and its options.

    - -

    Options:

    -
      -
    • <@c>removeComments: Optional, defaults to <@c>true: Specifies if XML comment nodes will be removed from the node tree. - -
    • <@c>removePIs: Optional, defaults to <@c>false: Specifies if XML processing instruction nodes will be removed from the node tree. - -
    • <@c>validate: Optional, defaults to the value of the <@s>validateXml setting: Specifies if the XML file should be validated (checked agains the DTD). If it's true, and the XML is not valid, then the data loading fails. - -
    • <@c>namespaceAware: Optional, defaults to <@c>true: Specifies if the XML parsing should be XML name-space aware or not. If the parsing is not name-space aware, colons in element and attribute names will not be considered as name-space prefix delimiters, so the "local name" of the node will contain the colon and the name-space prefix before that. - -
    • <@c>xincludeAware: Optional, defaults to <@c>false: Basically, it specifies whether the XML parsing should replace the XInclude-s with the included content. For most practical purposes you should set it to <@c>true (but due to backward-compatibility issues it defaults to <@c>false). Note that for setting this successfully to <@c>true you need at least Java 5. - -
    • <@c>xmlns: Optional. This is a hash that maps prefixes to XML name-space URI-s. The prefixes can be used in the other options. This option has no impact outside the XML data loader invocation, so the prefixes will not be available in the templates. The XML name-space for prefixless elements (with other words, the default name-space) is "no name-space" initially, but it can be changed by assigning name-space URI to the reserved prefix <@c>D (similar as if you use <@c>xmlns="<@r>..." in an XML document). - -
    • <@c>index: Adds attributes to element nodes, that can be helpful when later you process the XML with the templates. We say on this, that you index the elements. Well, it's hard to explain... :) Look at the output of example <@example 'xml_try'/>; the <@c>id attributes were added by this option, they are not present in the XML file. Also you can easily try other aspects of indexing with that example. The value of this option is a hash that contains the indexing options, or a sequence of hashes if you want to do more indexing successively. The hash accepts these subvariables (sub-options): - -
        -
      • <@c>element: Required. The name of the XML element or elements to index. If this is a string, then it selects a single element only. If this is a sequence, then it must be the sequence of element names that it selects. To use name-space prefixes, see option <@c>xmlns. - -
      • <@c>attribute: Optional, defaults to <@c>id. This is the name of the XML attribute that will be added to the indexed elements (the indexed elements are the elements selected by the sub-option <@c>element). If the element has this attribute already, then the original value of the attribute will be kept. To use name-space prefixes, see option <@c>xmlns. - -
      • <@c>numbering: Optional, defaults to <@c>sequential: The rule for the numbering of the indexed elements. The number is used in the attribute values; see option <@c>value. This must be one of the following strings: -
          -
        • <@c>sequential: The number for the first indexed element is 1, for the second indexed element is 2, etc. The element numbering is done in the "document order", that is, in the order in which the first character of the XML representation of each node occurs (after expansion of general entities). -
        • <@c>hierarchical: Similar to sequential numbering, but, for example, if we have an indexed element that got number <@c>2, then indexed elements nested into this element will get numbers <@c>2_1, <@c>2_2, <@c>2_3, etc. The indexed elements that are nested into the element numbered as <@c>2_1, will get numbers <@c>2_1_1, <@c>2_1_2, <@c>2_1_3, etc. For example, look at the output file names in <@example 'xml_rendering'/>; they are generated with the hierarchical indexing of the <@c>part and <@c>chapter elements. Or use <@example 'xml_try'/> to try it. -
        - -
      • <@c>value: Optional, defaults to <@c>'ppi_%n': A string that describes the format of index values. All character will go directly into the value, except that <@c>% is used for place holders. The valid place holders are: -
          -
        • <@c>'%n': This will be replaced with the value generated based on the value of option <@c>numbering. -
        • <@c>'%e': This will be replaced with the name (local, prefixless name) of the element -
        • <@c>'%%': This will be replaced with a single <@c>%. -
        -
      -
    - - - -<@dataLoader name="eval"> - <@param name="expression" type="string">Expression in BeansShell language. - <@param name="variables" type="hash" optional=true>Values that will be visible for the expression as variables. - -

    Evaluates a BeanShell expression, or runs a more complex BeanShell script and uses its <@c>return-ed value.

    -

    You can use the predefined variable <@c>engine to access the current FMPP engine instance.

    - -

    Examples (with TDD syntax):

    -
      -
    • <@c>eval('System.getProperties()') -
    • <@c>eval('fmpp.Engine.getVersionNumber()') -
    • <@c>eval('
      -     f = engine.getSourceRoot().getParentFile();
      -     if (f == null) {
      -         return new String[]{};
      -     } else {
      -         return f.list();
      -     }
      - ') -
    • In a configuration file:
      - <@c>width: 100 -
      height: 50 -
      area: eval('a * b', {a:get(width), b:get(height)}) -
    - - - -<@dataLoader name="htmlUtils"> -

    The returned hash contains custom directives that help HTML template development.

    - -

    Currently it contains only 1 directive: <@c>img. This is used as HTML <@c>img element, but the <@c>width and <@c>height attributes are calculated automatically (unless these attributes are specified in the template). Also, the processing will stop with error, if the image file pointed by the <@c>src attribute is missing.

    - -

    Example: If you have loaded the hash into the <@c>html variable, then you can do this in a template:

    - -<@prg><#noparse> -<@html.img src="falcon.png" alt="Falcon" /> - - -

    and the output will be something like this (depending on the concrete dimensions of the image):

    - -<@prg><#noparse> -Falcon - - -

    See also the example in <@example 'img_dims' />.

    - -

    Directive <@c>img accepts any extra parameters (attributes). The extra parameters will be printed as the attributes of the HTML <@c>img element. - - - - -<@dataLoader name="xhtmlUtils"> - -

    This is the same as <@c>htmlUtils, but it is for XHTML output.

    - - - - -<@dataLoader name="now"> - <@param name="options" type="hash" optional=true>The supported options are: -
      -
    • <@c>locale: The locale (language) used for displaying the date. It defaults to the "locale" setting of the FMPP engine. The value of the option is a usual java locale strings, such as <@c>en_GB, <@c>fr, <@c>ar_SA, ...etc. To see the complete list of locale codes, call the command line FMPP tool:
      <@c>fmpp --print-locales -
    • <@c>date: The format of the date (year, month, day) part of the date: <@c>short, <@c>medium, <@c>long, <@c>default. The exact meaning of these formats are locale dependent, and it is defined by the Java platform implementation. You can't use this option together with the <@c>pattern option. -
    • <@c>time: The format of the time (hour, minute, second, millisecond) part of the date: <@c>short, <@c>medium, <@c>long, <@c>default. The exact meaning of these formats are locale dependent, and it is defined by the Java platform implementation. You can't use this option together with the <@c>pattern option. -
    • <@c>pattern: A pattern that specifies the formatting of the date. -
    • <@c>zone: The time zone you would like to use ford displaying the date. Defaults to the "time zone" FMPP engine setting. The zone is given with a string, for example: <@c>GMT, <@c>GMT+02, <@c>GMT-02 or <@c>GMT+02:30. -
    - - -

    Note: FreeMarker now has a <@c>.now variable, so you don't need this data loader any more. You can print the current date and time with <@c>${'$'}{.now} (or <@c>${'$'}{.now?date} or <@c>${'$'}{.now?time}), and the format and zone is specified by the global <@s>datetimeFormat (or <@s>dateFormat or <@s>timeFormat) and <@s>timeZone FMPP settings.

    - -

    Examples (with TDD syntax): -

      -
    • <@c>now() -
    • <@c>now({pattern:"EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'"}) -
      This will print something like: Tuesday, April 08, 2003, 09:24:44 PM (GMT+02) -
    • <@c>now({date:short, time:short, zone:GMT}) -
    - -

    This data loader loads the current date and time from the system clock, and produces a string from it. Since FreeMarker has introduced native date/time value support, it is maybe better to use <@a href="pphash.html#key_sessionStart"><@c>pp.sessionStart or <@a href="pphash.html#key_now"><@c>pp.now instead of this data loader.

    - - -<@dataLoader name="get"> - <@param name="varName" type="string">The name of the variable. - <@param name="subVarName" type="string" optional=true>The name of the sub-variable. - <@param name="subSubVarName" type="string" optional=true>...etc. You can specify any number of parameters. - -

    This data loader returns the value of a variable that was already put into the <@s>data hash. For example:

    - -<@prg> -data: { - a: 123 - b: get(a) -} - - -

    Here the value of <@c>b will be the same as the value of <@c>a, which is <@c>123. You can retrieve the value of subvariables with additional parameters:

    - -<@prg> -data: { - a: { - x: 123 - y: { - q:234 - } - } - b: get(a, x) - c: get(a, y, q) -} - - -

    Here <@c>b will be <@c>123, <@c>c will be <@c>234.

    - -

    The <@c>get data loader was introduced so that data loaders can get the values loaded by other data loaders previously. For example:

    - -<@prg> -data: { - doc: xml(data/foo.xml) - index: com.example.MyIndexBuilderDataLoader(get(doc)) -} - - -

    The <@c>get data loader sees the variables that were already put into the hash in the same enclosing <@s>data/<@s>localData hash TDD expression where it is called, but it doesn't see values that are put into the data model elsewhere, as in other (inherited or inheriting) configuration files. However, if you use <@c>get in the <@s>localData setting, it will also see the session level data (see <@s>data).

    - - - -<@dataLoader name="antProperty"> - <@param name="properyName" type="string">The name of the Ant property. - <@param name="defaultValue" type="any" optional=true>The value returned if the Ant property does not exist. - -

    This data loader returns the value of an Ant property. If no Ant property with the given name exists, it will return nothing (i.e. will not add new variable to the shared data model), or it will return the value of the second parameter if you use that. - -

    The values of Ant properties are strings. But sometimes you want to see a property as numerical variable, or as boolean variable, etc. If the property name you give as data loader parameter ends with <@c>?n, then the string will be converted to number variable, and the <@c>?n itself will not count as the part of the actual property name. The complete list of postfixes:

    -
      -
    • <@c>?n: Convert to number. The string value must follow Java language number format, that is, the decimal separator is always dot (<@c>.).
    • -
    • <@c>?b: Convert to boolean. Valid values are: <@c>true, <@c>false, <@c>yes, <@c>no, <@c>y, <@c>n, <@c>0, <@c>1. Upper- and lowercase letters are considered as equivalent.
    • -
    • <@c>?d: Convert to date. Use common SQL format with optional time zone, as <@c>"2003-06-25 GMT". If the time zone is omitted, the value of the <@s>timeZone setting is used.
    • -
    • <@c>?t: Convert to time. Use common SQL format with optional time zone, as <@c>"22:05:30 GMT-02:00". The usage of AM/PM is also supported, e.g. <@c>"10:05:30 PM". If the time zone is omitted, then the value of the <@s>timeZone setting is used.
    • -
    • <@c>?dt: Convert to date-time. The date and time format is the same as with <@c>?d and <@c>?t, e.g. <@c>"2003-06-25 10:05:30 PM GMT".
    • -
    • <@c>?s: Keep the property as string. This can be useful if the actual property name ends with a prefix, so you must protect it against misinterpretation: <@c>foo?t?s.
    • -
    - -

    To see a concrete example, look at <@example 'ant2' />.

    - -

    This data loader will work only if you execute FMPP as Ant task.

    - - - -<@dataLoader name="antProperites"> - <@param name="properyName1" type="string" optional=true>The name of an Ant property to expose. - <@param name="properyName2" type="string" optional=true>The name of another Ant property to expose. - <@param name="properyNameN" type="string" optional=true>...etc. You can specify any number of Ant parameters. - -

    Returns the set of all Ant properties, or the set of selected ant properties, as a hash. - -

    If you use this data loader without parameters, then it returns the hash of <@e>all Ant properties. To see a concrete example, look at <@example 'ant' />.

    - -

    You can also give the name of properties to expose as parameters. For example if you want to put only the Ant properties <@c>foo and <@c>bar into the shared data model, then you write: <@c>antProperties(foo, bar). Parameters that refer to not existing Ant properties will be silently ignored. The same postfixes (as <@c>?n) are supported as with <@a href="#key_antProperty"><@c>antProperty.

    - -

    To see a concrete example, look at <@example 'ant2' />.

    - -

    This data loader will work only if you execute FMPP as Ant task.

    - - - -<@dataLoader name="antProject"> -

    Returns the current Ant project object (<@c>org.apache.tools.ant.Project). See the example in <@example 'ant' />.

    -

    This data loader will work only if you execute FMPP as Ant task.

    - - - -<@dataLoader name="antTask"> -

    Returns the current Ant task object (<@c>org.apache.tools.ant.Task). See the example in <@example 'ant' />.

    -

    This data loader will work only if you execute FMPP as Ant task.

    - - - - - -<@sect title="Custom data loaders"> - -

    If you want to write custom data loader, you have to write a Java class that implements the <@c>fmpp.tdd.DataLoader interface (see in the <@a href="api/index.html">API documentation). Then, if the class is available in the class path, or if you drop its jar into the <@c>lib directory of the FMPP installation, you can call it similarly as a predefined data loader, just you use the full-qualified class name as the data loader name. For example:
    <@c>com.example.fmpp.SQLDataLoader("SELECT * FROM products").

    - -

    <@e>If you have written a data loader that can be useful for other FMPP users, I will be happy to make it available on the FMPP home page for download. So if you want to contribute with your data loader, drop me a mail (<@myEmail />) or write to the mailing list. Thank you!

    - - - - diff --git a/fmpp/src/docs/examples/README.txt b/fmpp/src/docs/examples/README.txt deleted file mode 100644 index e36930f..0000000 --- a/fmpp/src/docs/examples/README.txt +++ /dev/null @@ -1,95 +0,0 @@ -FMPP Examples -============= - -How to try them ---------------- - -To run the examples, the command-line FMPP tool must be installed (see -the FMPP Manual). Then, go to the directory of the example, and simply -issue the fmpp command there. Or, you can run the example without -entering into its directory with: fmpp -C the/example/directory - -The above does not apply for the Ant examples (their name starts with -"ant"). To run those, FMPP must be installed for Ant (see the FMPP -Manual). Then, go to the directory of the example, and simply issue the -ant command there. Or, you can run the example without -entering into its directory with: ant -f the/example/directory/build.xml - -The output will be created in the out subdirectory of the example. - -The build.xml in this directory: if you run it with Ant, it will run all -examples. In this case, the command-line FMPP tool need not be -installed. - - -List of examples ----------------- - -qtour_step... The examples used in the Manual/Quick Tour chapter. - 1 - The idea of bulk processing - 2 - Data loading basics. Interpolations. - 3 - Data loading from multiple sources. Directives. - 4 - Multiple output files from single source file - -capture Generates Table of Contents on the top of the page - based on the headers used further down, using - block assignments to resolve the x-dependency. - -border Uses headers and footers to automate including, - interpolation escaping, and to convert *.c files - to HTML files. - -session Demonstrates session variables and turns with the - generation of an index page that contains links to - the other generated pages. - -img_dims Shows HTML with calculated image dimensions. - -csv Detects the columns of a CSV file. - Uses typed columns (numerical colum, boolean column). - -check_links Uses a macro instead of HTML that sends - warning if the link is broken. - -tdd Loads data model from a tdd file. - -xml XML data loader basics. - If you use earlier J2SE version than 1.4, the you have - to install some JAXP 1.2+ implementation. Say, Crimson. - -xml2 Product catalog that uses two related XML-s as data source. - FreeMarker requires XPath support for this example; see the - FMPP Manual/Installing for more information about XPath - availability. - -xml_try You can play with xml data loader options here, and examine - XML wrapping in general: It displays the resulting node - tree. - -xml_validating Demonstrates the usage of OASIS catalogs (public ID - resolution), validation, and the usage of XML name spaces - through the processing of an XHTML document. - -xml_rendering Renders XML source files to HTML-s, using "renderXml" - processing mode. Also demonstrates features as indexing, - declarative XML processing, XPath expressions. - -eval Demonstrates eval (BeanShell) data loader. - -inherit_config Demonstrates the usage of configuration inheritance. - -local_data Demonstrates the usage of the localData setting. - -ant Uses FMPP as Ant task: Basics. - You can't use the command-line tool here. - -ant2 Uses FMPP as Ant task: More property data loaders. - You can't use the command-line tool here. - -ant3 Uses FMPP as Ant task: Executes qtour_step4 with - changed text color. - -multipage_list Lists a sequence on multiple pages, like a Google search - result. Demonstrates the usage of BeanShell calculated local - data to prevent template overcomplication. Kinf of MVC style - separation. \ No newline at end of file diff --git a/fmpp/src/docs/examples/ant/build.xml b/fmpp/src/docs/examples/ant/build.xml deleted file mode 100644 index 9bf9c8a..0000000 --- a/fmpp/src/docs/examples/ant/build.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/ant/src/test.txt b/fmpp/src/docs/examples/ant/src/test.txt deleted file mode 100644 index b15806d..0000000 --- a/fmpp/src/docs/examples/ant/src/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -Hello property: ${hello} -Basedir property: ${basedir} -Project name: ${proj.name} -Target name: ${task.target.name} -${true} \ No newline at end of file diff --git a/fmpp/src/docs/examples/ant2/build.xml b/fmpp/src/docs/examples/ant2/build.xml deleted file mode 100644 index d184e7c..0000000 --- a/fmpp/src/docs/examples/ant2/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - antProperties(p1, p2, x?n, test?b, time?t, thisWillBeIgnored) - wombat1: antProperty(p3) - wombat2: antProperty(p4) - wombat3: antProperty(p4, 'P4?') - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/ant2/src/test.txt b/fmpp/src/docs/examples/ant2/src/test.txt deleted file mode 100644 index 90bf9da..0000000 --- a/fmpp/src/docs/examples/ant2/src/test.txt +++ /dev/null @@ -1,10 +0,0 @@ -p1: ${p1!"not found"} -p2: ${p2!"not found"} -p3: ${p3!"not found"} -wombat1: ${wombat1!"not found"} -wombat2: ${wombat2!"not found"} -wombat3: ${wombat3!"not found"} - -x + 1: ${x + 1} -<#if test>It's a test.<#else>It's not a test. -time: ${time} \ No newline at end of file diff --git a/fmpp/src/docs/examples/ant3/build.xml b/fmpp/src/docs/examples/ant3/build.xml deleted file mode 100644 index dc1998b..0000000 --- a/fmpp/src/docs/examples/ant3/build.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/border/config.fmpp b/fmpp/src/docs/examples/border/config.fmpp deleted file mode 100644 index c657f57..0000000 --- a/fmpp/src/docs/examples/border/config.fmpp +++ /dev/null @@ -1,15 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -borders: [ - border( - "<#include '/include/test.ftl'><#escape x as x?html>" - "" - *.html - ) - border( - "<@pp.renameOutputFile name=pp.outputFileName+'.html'/>
    <@html_escape><#noparse>"
    -        "
    " - *.c - ) -] \ No newline at end of file diff --git a/fmpp/src/docs/examples/border/src/include/ignoredir.fmpp b/fmpp/src/docs/examples/border/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/border/src/include/test.ftl b/fmpp/src/docs/examples/border/src/include/test.ftl deleted file mode 100644 index bb86337..0000000 --- a/fmpp/src/docs/examples/border/src/include/test.ftl +++ /dev/null @@ -1 +0,0 @@ -<#assign test = "Hello"> \ No newline at end of file diff --git a/fmpp/src/docs/examples/border/src/test.c b/fmpp/src/docs/examples/border/src/test.c deleted file mode 100644 index dd6d393..0000000 --- a/fmpp/src/docs/examples/border/src/test.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include "futil_i.h" - -zxz_ec_t -zxz_f_child_path_can_match(zxz_bool_t *pbMatches, - const char *sPath, const char *sPattern) -{ - zxz_ec_t ec; - int i; - char *sNew = NULL; - - i = strlen(sPath); - if (i != 0 && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR_CHR - && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR2_CHR) { - sNew = malloc(i+2); /* <-- +sNew */ - strcpy(sNew, sPath); - sNew[i] = ZXZ_CFGM_PATH_SEPARATOR_CHR; - sNew[i+1] = '\0'; - sPath = sNew; - } - ec = zxz_f_path_matches_ex(pbMatches, sPath, sPattern, FALSE, 1); - free(sNew); /* <-- -sNew */ - return ec; -} diff --git a/fmpp/src/docs/examples/border/src/test.html b/fmpp/src/docs/examples/border/src/test.html deleted file mode 100644 index 975bb9f..0000000 --- a/fmpp/src/docs/examples/border/src/test.html +++ /dev/null @@ -1,3 +0,0 @@ -${test} -

    ${"a < b & c"} -

    A C program \ No newline at end of file diff --git a/fmpp/src/docs/examples/build.xml b/fmpp/src/docs/examples/build.xml deleted file mode 100644 index 5d7bfa2..0000000 --- a/fmpp/src/docs/examples/build.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/capture/config.fmpp b/fmpp/src/docs/examples/capture/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/src/docs/examples/capture/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/docs/examples/capture/src/include/ignoredir.fmpp b/fmpp/src/docs/examples/capture/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/capture/src/include/page.ftl b/fmpp/src/docs/examples/capture/src/include/page.ftl deleted file mode 100644 index 87c7d11..0000000 --- a/fmpp/src/docs/examples/capture/src/include/page.ftl +++ /dev/null @@ -1,24 +0,0 @@ -<#assign h1Counter = 0> -<#assign contents = pp.newWritableSequence()> - -<#macro h1> - <#local title><#nested> - <#assign h1Counter = h1Counter + 1> - <@pp.add seq=contents value={"anchor":h1Counter, "title":title} /> - -

    ${title}

    - - -<#macro page> - <#local output> - <#nested> - - Contents: - -
    - ${output} - \ No newline at end of file diff --git a/fmpp/src/docs/examples/capture/src/test.html b/fmpp/src/docs/examples/capture/src/test.html deleted file mode 100644 index af44b9d..0000000 --- a/fmpp/src/docs/examples/capture/src/test.html +++ /dev/null @@ -1,100 +0,0 @@ -<#include "/include/page.ftl"> -<@page> - -<@h1>Foo - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -<@h1>Bar - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -<@h1>Baaz - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

    Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/check_links/config.fmpp b/fmpp/src/docs/examples/check_links/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/src/docs/examples/check_links/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/docs/examples/check_links/src/good_target.html b/fmpp/src/docs/examples/check_links/src/good_target.html deleted file mode 100644 index 2f9031f..0000000 --- a/fmpp/src/docs/examples/check_links/src/good_target.html +++ /dev/null @@ -1 +0,0 @@ -Hi! \ No newline at end of file diff --git a/fmpp/src/docs/examples/check_links/src/include/a.ftl b/fmpp/src/docs/examples/check_links/src/include/a.ftl deleted file mode 100644 index 2a07d93..0000000 --- a/fmpp/src/docs/examples/check_links/src/include/a.ftl +++ /dev/null @@ -1,13 +0,0 @@ -<#macro a href> - <#-- remove anchor link ending --> - <#local x = href?index_of('#')> - <#if x != -1> - <#local href = href?substring(0, x)> - - <#-- check existence --> - <#if !pp.sourceFileExists(href)> - <@pp.warning message="Broken link in " + pp.sourceFile + ": " + href /> - - <#-- print HTML --> - <#nested><#t> - \ No newline at end of file diff --git a/fmpp/src/docs/examples/check_links/src/include/ignoredir.fmpp b/fmpp/src/docs/examples/check_links/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/check_links/src/index.html b/fmpp/src/docs/examples/check_links/src/index.html deleted file mode 100644 index 7fafe7f..0000000 --- a/fmpp/src/docs/examples/check_links/src/index.html +++ /dev/null @@ -1,3 +0,0 @@ -<#include "/include/a.ftl"> -

    <@a href="good_target.html">Working link -

    <@a href="bad_target.html">Broken link \ No newline at end of file diff --git a/fmpp/src/docs/examples/csv/config.fmpp b/fmpp/src/docs/examples/csv/config.fmpp deleted file mode 100644 index 94e53b0..0000000 --- a/fmpp/src/docs/examples/csv/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {csv: csv(data/test.csv)} \ No newline at end of file diff --git a/fmpp/src/docs/examples/csv/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/csv/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/csv/src/data/test.csv b/fmpp/src/docs/examples/csv/src/data/test.csv deleted file mode 100644 index a17bb9e..0000000 --- a/fmpp/src/docs/examples/csv/src/data/test.csv +++ /dev/null @@ -1,5 +0,0 @@ -name;protected:b;price:n;entered:dt -arctic-tern;yes;10000;2003-01-25 03:10:06 -house-sparrow;no;50;2003-02-15 01:20:30 PM -hoachim;yes;; -sakeret;yes;200000;2002-12-18 20:45:00 \ No newline at end of file diff --git a/fmpp/src/docs/examples/csv/src/test.html b/fmpp/src/docs/examples/csv/src/test.html deleted file mode 100644 index bfe6d97..0000000 --- a/fmpp/src/docs/examples/csv/src/test.html +++ /dev/null @@ -1,8 +0,0 @@ -<#setting number_format=",##0.00"> -<#setting datetime_format="MMM dd, yyyy hh:mm:ss a"> - - <#list csv.headers as h><#list csv.headers as h>
    ${h} -<#list csv as row> -
    ${(row[h]!"N/A")?string} - -
    \ No newline at end of file diff --git a/fmpp/src/docs/examples/eval/config.fmpp b/fmpp/src/docs/examples/eval/config.fmpp deleted file mode 100644 index 122ca80..0000000 --- a/fmpp/src/docs/examples/eval/config.fmpp +++ /dev/null @@ -1,7 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - props: eval('System.getProperties()') - exampleDir: eval('engine.getSourceRoot().getParentFile().getParentFile().list()') -} \ No newline at end of file diff --git a/fmpp/src/docs/examples/eval/src/test.html b/fmpp/src/docs/examples/eval/src/test.html deleted file mode 100644 index defa5ae..0000000 --- a/fmpp/src/docs/examples/eval/src/test.html +++ /dev/null @@ -1,17 +0,0 @@ -<#escape x as x?html> - -

    System properties: -

      -<#list props?keys?sort as k> -
    • ${k} = ${props[k]} - -
    - -

    Example dir: -

      -<#list exampleDir?sort as f> -
    • ${f} - -
    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/ignoredir.fmpp b/fmpp/src/docs/examples/ignoredir.fmpp deleted file mode 100644 index 7562186..0000000 --- a/fmpp/src/docs/examples/ignoredir.fmpp +++ /dev/null @@ -1 +0,0 @@ -Not copied as part of the FMPP documentation generation. \ No newline at end of file diff --git a/fmpp/src/docs/examples/img_dims/config.fmpp b/fmpp/src/docs/examples/img_dims/config.fmpp deleted file mode 100644 index 8bb1c12..0000000 --- a/fmpp/src/docs/examples/img_dims/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {h:htmlUtils()} \ No newline at end of file diff --git a/fmpp/src/docs/examples/img_dims/src/falcon.png b/fmpp/src/docs/examples/img_dims/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 zcmV-f6Q=BmP)^VKz80DJCu>AQ}-A7(zfWdSqUjkbsJYZ@R*Q%)G9y zmWeGNAAxLcG$<}rQcO%gKQT2ib9#ZLwY@w(LqbYVc6m}FBQ0oENiQxQQfN_3Qa>p( zFD^JlU3OE~M5w%7m912dpG?R6BGLc=5*A5B zK~#9!U0DfxqD-@GKpG9=pwNI2*O-V~LdGSTtj_=cQ{Oq&WZwJSiVGU;)3u$dYSrd& zIBpi{PZ-jn-WJ z>5CtrL9f;btuem7WbYs1rjJh%3t}%sm)0HD8Sk=V+!dZ6@_^TPpX+m(cJb@C`1fiJ zMAgJ>*UxXOoP6Z_`X7e%^~a}pg91&S+KX1i6d&^CU;jnU|M9N4r(N*JIec~fXjc#z z3u52;XhGnne-Q27zCZtqPiqyck9EvdRuZlL(h=f`Co$8{$^v2cuhur62ttp-6Ibif z>%S<)`eOJ`M(7n=eEN_zpbA#QZm#n3>7Os&+x5A70YMV9_WH8^<|lr%`6bo{f;Aa( z4Icj$|HyC{0pr)__fJNA{1c1uw0;zyY}OV~0-%MF++|>XTE~mX>c8S4{^Hn$ctaO& zFxO$c>-AH-@Y(wQ=_k6VfS8N7^=9*vh3_Aq?Xpnhv&H!3##qw@2KFD}K8!rijeuw^ zX?OJb**aVT^+(ipE6KR|Pac1=K=dHU=f|hp+Q%ct&`YAk6PUzO za@lU{bqjJhv?%|Akve?}f(rm5Kn>R&y1+>iuPBOyFmMe$_Wdu81!ess>T)?YB;Xnx zd^`f>V9h3>@J^kGfIZ_zp{2OEuYF(czV9U7ko)=k=M0O2zG3z9j|_xPHRhAfYB$aoQKBBz>)nQVJ#;+}_@D^S8p}x7N@5{SHg2S9rcTT~5ue zu6N=besX){^V9u(97k9OW=RI{1_F4{hjGlC%1J? z6V>&8-yC0G&&_Txjt2slKM{!_HT*)&c80d{`qM1!L2hn(X`W`rcu}PBqmvpbWPrV`+mPBdr{n3=G*}moKUg~nQVoHJ0J3;l#rHt*`f2Z`RMqn4=Fju<^WC3G zH!UkuQYxdWstnCwFc|i;DPW?N7JcT`re`APSXbm@x?ZQ$|7!zidGp_4agrxitHF z*Fcko2(T8FIBW^w#4W~sJnj@7fV};=`BOeWZ=EqvCRV6Xo{Kt}Ny8{v4C4g) z)OEY$p80qSJ#-$%Z*N$h zYC!UwATU~`t2{8-Vqv0zI7KLae>gCB7YYvFA+Dgpe0M(2AAVayEvx(A)I(S5x%2RL zN02{&dw5{nmiZkqQlt)W0M_l6#!PjVB;j;XGwaEa`@Mkd00QIfaRrdw+#d^wJdELS zrK)G>!tlD82nOQ0Dxtu#o8phUv={=KP*nvY*e3F+59@ z-?%}OXE4|E+gtJWTp_j~Z*R}g!wT(nw`?!+CGKS!A}_O=DQRo%5qWHWe*i~U+3ZQs(mv@;Y*uG7cJEB-rWr8%SbXW5_u00 z2kX2c8Cn@*T@;hIw+i`C-901ouw&*3cFtvObmb`o*MT-!&@F=yu1A@LZw{=5dtqT{ zbh^9(1p6)To)NV_C=UdAdsEM)M3byYDFexN@}ykIyMWK~42lNfw%L=6Q856vrccPh zVzmVlc-gHGv@}1FkRosjq>>;)V!%YmJyn5;wNSBA89)N@zl1ezw{1Q`4<@}rA!&$l zJ|E97_}FCmti%BYu*N_k0vNYqN{~lN)X6D|ASPP>>q|hgSW1pdN<2KEMJbqzlWxxXf$bX-IyKOP2qjIUa#hMvaDGmnNmH=F zXf|84su1R+V7${SF<)O7VQ-R`%j(T39ET5u(?NnW;9$nmR9Uvr$-qm9f_4IR7~PVl z#r!I_nUV|T%);sRB5pyUKOPnOMqs?~{u1_jVLn*~<$`gro3B=mtMW+~=|~;(YN32# zK^At;9S#QGpzmqrE7O{5S>^zl^#Z-!qBq&HA~stkh4FMI#>=ADTR?Dym*+VsbMEMT z)I(LAOnQ@vLUs2da7QxDR1&%Dz0tHLg;yv6St3c&bTsPq;Cgnyr^^|SN>Y6XKE41X z=q+};7b~`T0XgTr9uU|{++dl|L9;!KT}OG*fE^iHy}tI1CCYq>W+NRQQ04p*P${C&hC3nW`GO#n9z9bUO%zN(E(est_Xk54ePmT) zea{aW!js8t2G_q{z`Gzxby&mn3kx$}K_jsheR7hXi3I?DX;B0wM{k9lK*VBnZ>gM!v#A6A zs^pddCHBfu4kAW`rQrZgD`vL?i`JU^2Mmmd>1W$ul0fap-|4W~i@WHWl`{_rLsjx1 z$PH4wqPYsdRNw-<4*UqMK{u#?(aphMgIb1%{a&H{-fU`;B{;bT!<-}z_9squP_;RW z{~br8nVisSIUts%Kwy=nAAwOyVNFx!rSGY{SB|=QFYN~5U|SR7a8P@yRCAU)a8cHn zz5SP%lidxRH5hO>$a(@Z=>`5`fl(oHz?Wz?P)$m7`5EfG290)mc@LaCGYe@^nw?@{ zvD7bZ>J|eeF>GM4+1T$fVGQ~lw{(Tzq%z%!=GF^0(m|>4eo4m|60!kN_JVG@$ii^3 zoA2pbC9J}pqB*vLq73+2+CS)WSU=rjYEKFdx;a6hiOMwi-Bg9^7D{=ZZ%h$ke1vDx zpxaAlNZD|@sOxu|3q>GVxiSstvw5P%Sz>6?da}`l#VpO2Ztnf?t zMxn2Ff#B<+fHHvuSDnT!fji=J8dC%R;a~uh+Xcia@;u0#*!0vJB9g zW|dRqUG3?zL~=qS4b(ErOqPxUBy51Hg19+13XKY=k_`(yfp7+^yu6-Q94uQ5@O=~y zy~uGfW>XcSEYX#q=;{Ihu2%u2KwV)^oaqpJpJ$n8!Vs-JL0-gAoKCPNrf#XlE8Aic zW3yiPnC!qGgRf@(R7H<5VS8$x%~)fqqE~ zNV7*vWEuF<$iXcWaW4%yBYCHtPAAX2d)MKylPeap7!ziAfx9VzQaXMaV3t?N{VWZz z5%d>^PLYIAGWs$G7)sdq4+wcnql++sap6@L7;fRkZlo+qS>*<{GHf+eQ28Ji&`Sjk z;E--_S%#?zQB-I!3_<(7ZH2cq*Fm0SOh)ZSLxeE#qA{ccW^%{l!mIL>B?Ik|j|>k` zko_ed5qv7h18IyRA@Y}GsZkr@SrOm z!)!W5MF*=Rco&YzE6`Yghfb$}@t{XQkX{~)Mz9x3)n2u~I5bB%dP`IBwA*ob*5RX9 zEluA;J?i*{ANgYxCRd}rYh+=h5z)}nWbBAd(Gl8*&)E*MYz66TiF~YAYek6Tc2nB{ zUQBh1FN60Wold2bqB90PIX(->xD%^*>@slSsK~2OyTD@TPfdZ21+y2FK+@xBl%})p zY_Ypu>u6ajOQve z4W(C9!-eD|5~A=!na^y~&8}c8_-yuTd}x5&Mz)SzUg3Sg+@$9K;nq^%x8mk#b$9 z@@49Fil}nqNL+#qAS;YhEd%TZ?Khf)Rm4^C>||0Zi%}Z``R_ebCw|C4xmf{`bvWl`z1JLVgV-I9{iJs z=xWvB=hvnU+PsB$n>m7l-XD0=j5JY3ag1Kh?ZhrBZj5wP=pPC&Jxjb{0j@YW$aIr; zr9Sr<#3SQI3&$P&_+*1boL801W)*l&XPEtU7NpPv-i}cgQB~YhkK=Ldg4i7otr7O1 zK=mch56I44o*xio0-ul40Z;ewJ=HQ*J=Zd4DrWB@TSWaSyqRU0qdSZ!f*=)3HRb`8 zkA~69W&jDY5V^;p)DDc@k(D$br95+uU482+G9iV7pdg^(z$`e#2m)(mXsA0#ZMW0$ zF-WRP$*EyfmL3|F0E7-@W$vBWx(pd1?-2(PWJy2E ziU{@_D=@uVA?s0;c>D=_f#-+5oOfE@rMoRguQ!{8uyxkW6S&fKRX`VO0iYIa1E@)6 zre+#t*o$AH$*sU!9)bul<;O93U)_O&$C8B$f=ouzi`$+&Me_)2V(dbWX*bD9wpu(< z3|*DN0DwWif$SRgF&BW2hDiohQ~UmUKkBS zWq+bjhK|)i4qd2DmL)@;lqYHGyC$gg5Ur>IooJSp@i<~7^guIU0iDlywqkLR>S>D7 z6<`1_^JV6TA)-q>0-ADNA0ssWACzI3h9*qnVG@~906u3@W53ExJP;)6V+?NArNUQ? z@40AwvMfxc=T8|nWxl|e#0t<$(cZg?;vp&rJo7gn$M}z*a zcsNRu)cDBA+;~YAgebt67G2W;5p!{All calcualted: -<@h.img src="falcon.png" alt="Falcon" /> - -

    Width calculated: -<@h.img src="falcon.png" alt="Falcon" height=20/> - - -

    Height calculated: -<@h.img src="falcon.png" alt="Falcon" width=20/> - -

    Nothing calculated: -<@h.img src="falcon.png" alt="Falcon" height="20" width="20"/> diff --git a/fmpp/src/docs/examples/inherit_config/README.txt b/fmpp/src/docs/examples/inherit_config/README.txt deleted file mode 100644 index 605ed9d..0000000 --- a/fmpp/src/docs/examples/inherit_config/README.txt +++ /dev/null @@ -1,14 +0,0 @@ -This example shows how to "customize" another configuration file, that -is, how to make configuration variations without actually editing or -copy/pasting the common configuration file. - -In this example, config_red.fmpp and config_dark.fmpp executes a -slightly modified version of config.fmpp. To try them type: - - fmpp -C config_red.fmpp - -and - - fmpp -C config_dark.fmpp - -respectively. \ No newline at end of file diff --git a/fmpp/src/docs/examples/inherit_config/config.fmpp b/fmpp/src/docs/examples/inherit_config/config.fmpp deleted file mode 100644 index 6830455..0000000 --- a/fmpp/src/docs/examples/inherit_config/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {backgroundColor:#C0C0FF, textColor:blue} \ No newline at end of file diff --git a/fmpp/src/docs/examples/inherit_config/config_dark.fmpp b/fmpp/src/docs/examples/inherit_config/config_dark.fmpp deleted file mode 100644 index 00fbceb..0000000 --- a/fmpp/src/docs/examples/inherit_config/config_dark.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -inheritConfiguration: config.fmpp -data: {backgroundColor:black} \ No newline at end of file diff --git a/fmpp/src/docs/examples/inherit_config/config_red.fmpp b/fmpp/src/docs/examples/inherit_config/config_red.fmpp deleted file mode 100644 index 8842538..0000000 --- a/fmpp/src/docs/examples/inherit_config/config_red.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -inheritConfiguration: config.fmpp -data: {textColor:red} \ No newline at end of file diff --git a/fmpp/src/docs/examples/inherit_config/src/index.html b/fmpp/src/docs/examples/inherit_config/src/index.html deleted file mode 100644 index 9205087..0000000 --- a/fmpp/src/docs/examples/inherit_config/src/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    Test. - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/config.fmpp b/fmpp/src/docs/examples/local_data/config.fmpp deleted file mode 100644 index 638d145..0000000 --- a/fmpp/src/docs/examples/local_data/config.fmpp +++ /dev/null @@ -1,29 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp - -modes: ignore(**/*.bsh) - -data: { - bgColor: green - author: Anonymous -} - -localData: [ - # Run the attached BeanShell script for HTML-s, if there is one available. - case(**/*.htm, **/*.html, bsh({ignoreMissing})) - - # Independently of the above, - # set "bgColor" to "yellow" when processing the files of the "sub" folder: - # except for the files in "sun/sky/**", where use "blue". - # But, never override the "bgColor" if the file name starts with "foo" - layer() - case(**/foo*, {}) - case(sub/sky/**, {bgColor: blue}) - case(sub/**, sub2/**, {bgColor: yellow}) - - # Independently of all above, set the "author"... - layer() - case(**/*_j.*, {author: Joe}) - case(**/*_a.*, {author: Amy}) -] \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/index.html b/fmpp/src/docs/examples/local_data/src/index.html deleted file mode 100644 index 05f62c1..0000000 --- a/fmpp/src/docs/examples/local_data/src/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - -

    Test

    -

    Other pages: -

    - -

    Here it is the config file used: -
    -
    ${pp.loadData('text', '../config.fmpp')?html}
    -
    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/1.html b/fmpp/src/docs/examples/local_data/src/sub/1.html deleted file mode 100644 index 32f023d..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/1.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

    1

    -

    Author: ${author} -

    x: ${x} -

    y: ${y} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/1.html.bsh b/fmpp/src/docs/examples/local_data/src/sub/1.html.bsh deleted file mode 100644 index 14c8e0f..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/1.html.bsh +++ /dev/null @@ -1,4 +0,0 @@ -res = new HashMap(); -res.put("x", "Just for test: " + templateEnvironment.getData("author")); -res.put("y", "Blah for 1..."); -return res; \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/2.html b/fmpp/src/docs/examples/local_data/src/sub/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    2

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/3_j.html b/fmpp/src/docs/examples/local_data/src/sub/3_j.html deleted file mode 100644 index b89c36c..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/3_j.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

    3_j

    -

    Author: ${author} -

    x: ${x} -

    y: ${y} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/3_j.html.bsh b/fmpp/src/docs/examples/local_data/src/sub/3_j.html.bsh deleted file mode 100644 index cb052d2..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/3_j.html.bsh +++ /dev/null @@ -1,4 +0,0 @@ -res = new HashMap(); -res.put("x", "Just for test: " + templateEnvironment.getData("author")); -res.put("y", "Blah for 3_j..."); -return res; \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/food.html b/fmpp/src/docs/examples/local_data/src/sub/food.html deleted file mode 100644 index e817607..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/food.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    Food

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/sky/1.html b/fmpp/src/docs/examples/local_data/src/sub/sky/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/sky/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    1

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/sky/2.html b/fmpp/src/docs/examples/local_data/src/sub/sky/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/sky/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    2

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/sky/3_a.html b/fmpp/src/docs/examples/local_data/src/sub/sky/3_a.html deleted file mode 100644 index 6734b3f..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/sky/3_a.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    3_a

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/subsub/1.html b/fmpp/src/docs/examples/local_data/src/sub/subsub/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/subsub/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    1

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub/subsub/2.html b/fmpp/src/docs/examples/local_data/src/sub/subsub/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub/subsub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    2

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub2/1.html b/fmpp/src/docs/examples/local_data/src/sub2/1.html deleted file mode 100644 index 960b8d4..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub2/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    1

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/local_data/src/sub2/2.html b/fmpp/src/docs/examples/local_data/src/sub2/2.html deleted file mode 100644 index cd7fba9..0000000 --- a/fmpp/src/docs/examples/local_data/src/sub2/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

    2

    -

    Author: ${author} - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/multipage_list/config.fmpp b/fmpp/src/docs/examples/multipage_list/config.fmpp deleted file mode 100644 index ea19e9d..0000000 --- a/fmpp/src/docs/examples/multipage_list/config.fmpp +++ /dev/null @@ -1,35 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - foos: [ - {name:"qweqwe", url:"http://qweqwe.com"} - {name:"asdasd", url:"http://asdasd.com"} - {name:"cvbcvbcv", url:"http://cvbcvbcvb.com"} - {name:"iopiopi", url:"http://iopiopo.com"} - {name:"bmbnmbm", url:"http://bnmnbmb.com"} - {name:"uiouioui", url:"http://uiouiouio.com"} - {name:"bvnbvnbv", url:"http://bvnbvnbvnbv.com"} - {name:"hghjghjghjg", url:"http://hghjghjghjg.com"} - {name:"werwer", url:"http://werwerr.com"} - {name:"mnmbnbm", url:"http://mbnmbnmb.com"} - {name:"gfhfghgfgfh", url:"http://fghgfhgfhg.com"} - {name:"asdasas", url:"http://asdasdasd.com"} - {name:"yuuiyiyu", url:"http://yuiyuiyui.com"} - {name:"rtytryytr", url:"http://rttryytr.com"} - {name:"kjhkjhk", url:"http://khjkhjkhjk.com"} - {name:"rrrrr", url:"http://rrrrr.com"} - {name:"ddfdgfgf", url:"http://ddffdg.com"} - {name:"jhjhhgjh", url:"http://jghjjhj.com"} - {name:"zzzzzzzz", url:"http://zzzzzzzz.com"} - {name:"zxzxxzzx", url:"http://zzxzxzxzx.com"} - {name:"cvvcvvcv", url:"http://ccvvcvcvcv.com"} - {name:"bnvvbnvb", url:"http://vbnvbnnvbnb.com"} - {name:"asdsadasd", url:"http://asdasdasd.com"} - {name:"vvvvvv", url:"http://vvvvvvv.com"} - {name:"ssssss", url:"http://sssss.com"} - {name:"qqqqqqq", url:"http://qqqqqq.com"} - {name:"xxxxxxx", url:"http://xxxxx.com"} - {name:"vvvvv", url:"http://vvvvv.com"} - {name:"aaaaaaa", url:"http://aaaaaaaa.com"} - ] -} diff --git a/fmpp/src/docs/examples/multipage_list/src/result.html b/fmpp/src/docs/examples/multipage_list/src/result.html deleted file mode 100644 index 8c371fc..0000000 --- a/fmpp/src/docs/examples/multipage_list/src/result.html +++ /dev/null @@ -1,56 +0,0 @@ -<#escape x as x?html> -<@pp.dropOutputFile /> -<#assign pages = foos?chunk(5)> -<#assign entryIndex = 0> -<#list pages as page> - <@pp.changeOutputFile name="result${page_index+1}.html" /> - - - Results - page ${page_index+1} of ${pages?size} - - -

    Results

    - - <#list page as entry> - <#assign entryIndex = entryIndex + 1> -

    ${entryIndex}. ${entry.name?cap_first}: ${entry.url} - - -


    - Pages:   - <#if page_index != 0> - <<  - <#else> - <<  - - <#list 0..pages?size-1 as i> - <#if i != page_index> - ${i+1} - <#else> - ${i+1} - - <#if i_has_next>| - - <#if page_index != pages?size-1> -  >> - <#else> -  >> - - - - - -<#if pages?size == 0> - <@pp.changeOutputFile name="result1.html" /> - - - Results - No foos - - -

    Results

    -

    Sorry, no foos available.

    - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step1/config.fmpp b/fmpp/src/docs/examples/qtour_step1/config.fmpp deleted file mode 100644 index 1a65d4c..0000000 --- a/fmpp/src/docs/examples/qtour_step1/config.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -sourceRoot: src -outputRoot: out \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step1/src/falcon.png b/fmpp/src/docs/examples/qtour_step1/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

    Index

    -

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step1/src/subdir/something.html b/fmpp/src/docs/examples/qtour_step1/src/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/src/docs/examples/qtour_step1/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

    Something else

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step2/config.fmpp b/fmpp/src/docs/examples/qtour_step2/config.fmpp deleted file mode 100644 index d9978be..0000000 --- a/fmpp/src/docs/examples/qtour_step2/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -data: tdd(data/style.tdd) \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step2/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/qtour_step2/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/qtour_step2/src/data/style.tdd b/fmpp/src/docs/examples/qtour_step2/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/src/docs/examples/qtour_step2/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step2/src/falcon.png b/fmpp/src/docs/examples/qtour_step2/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

    Index

    -

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step2/src/subdir/something.html b/fmpp/src/docs/examples/qtour_step2/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/src/docs/examples/qtour_step2/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

    Something else

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step3/config.fmpp b/fmpp/src/docs/examples/qtour_step3/config.fmpp deleted file mode 100644 index 0957840..0000000 --- a/fmpp/src/docs/examples/qtour_step3/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step3/src/data/birds.csv b/fmpp/src/docs/examples/qtour_step3/src/data/birds.csv deleted file mode 100644 index 3105e8c..0000000 --- a/fmpp/src/docs/examples/qtour_step3/src/data/birds.csv +++ /dev/null @@ -1,4 +0,0 @@ -name;description;favoriteFood -arctic-tern;Flies very long distances all years.;sardine -house-sparrow;Don't you say you don't know it...;sunflower -sakeret;Great hunter of the sky.;pigeon \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step3/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/qtour_step3/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/qtour_step3/src/data/style.tdd b/fmpp/src/docs/examples/qtour_step3/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/src/docs/examples/qtour_step3/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step3/src/falcon.png b/fmpp/src/docs/examples/qtour_step3/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

    Index

    -

    Birds: -

      - <#list birds as bird> -
    • ${bird.name?cap_first}: ${bird.description} - Favorite food: ${bird.favoriteFood} - -
    -
    -

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step3/src/subdir/something.html b/fmpp/src/docs/examples/qtour_step3/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/src/docs/examples/qtour_step3/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

    Something else

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/config.fmpp b/fmpp/src/docs/examples/qtour_step4/config.fmpp deleted file mode 100644 index 0957840..0000000 --- a/fmpp/src/docs/examples/qtour_step4/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/src/bird.html b/fmpp/src/docs/examples/qtour_step4/src/bird.html deleted file mode 100644 index 670719a..0000000 --- a/fmpp/src/docs/examples/qtour_step4/src/bird.html +++ /dev/null @@ -1,16 +0,0 @@ -<@pp.dropOutputFile /> -<#list birds as bird> -<@pp.changeOutputFile name=bird.name+".html" /> - - - ${bird.name?cap_first} - - -

    ${bird.name?cap_first}

    - -

    ${bird.description}

    - -

    Favorite food: ${bird.favoriteFood}

    - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/src/data/birds.csv b/fmpp/src/docs/examples/qtour_step4/src/data/birds.csv deleted file mode 100644 index 3105e8c..0000000 --- a/fmpp/src/docs/examples/qtour_step4/src/data/birds.csv +++ /dev/null @@ -1,4 +0,0 @@ -name;description;favoriteFood -arctic-tern;Flies very long distances all years.;sardine -house-sparrow;Don't you say you don't know it...;sunflower -sakeret;Great hunter of the sky.;pigeon \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/qtour_step4/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/qtour_step4/src/data/style.tdd b/fmpp/src/docs/examples/qtour_step4/src/data/style.tdd deleted file mode 100644 index 2151f44..0000000 --- a/fmpp/src/docs/examples/qtour_step4/src/data/style.tdd +++ /dev/null @@ -1,2 +0,0 @@ -bgColor: #FFFFE0 -textColor: #000000 \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/src/falcon.png b/fmpp/src/docs/examples/qtour_step4/src/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

    Index

    -

    Birds: -

    -
    -

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/qtour_step4/src/subdir/something.html b/fmpp/src/docs/examples/qtour_step4/src/subdir/something.html deleted file mode 100644 index a1949bc..0000000 --- a/fmpp/src/docs/examples/qtour_step4/src/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

    Something else

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/config.fmpp b/fmpp/src/docs/examples/session/config.fmpp deleted file mode 100644 index 013c036..0000000 --- a/fmpp/src/docs/examples/session/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -turns: turn(2, index.html) \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/01_foo.html b/fmpp/src/docs/examples/session/src/01_foo.html deleted file mode 100644 index 078bb05..0000000 --- a/fmpp/src/docs/examples/session/src/01_foo.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Foo"> - -

    Blah blah blah - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/02_bar.html b/fmpp/src/docs/examples/session/src/02_bar.html deleted file mode 100644 index d7f4607..0000000 --- a/fmpp/src/docs/examples/session/src/02_bar.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Bar"> - -

    Blah blah blah - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/03_baaz.html b/fmpp/src/docs/examples/session/src/03_baaz.html deleted file mode 100644 index d942675..0000000 --- a/fmpp/src/docs/examples/session/src/03_baaz.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Baaz"> - -

    Blah blah blah - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/04_wombat.html b/fmpp/src/docs/examples/session/src/04_wombat.html deleted file mode 100644 index 81b1ae6..0000000 --- a/fmpp/src/docs/examples/session/src/04_wombat.html +++ /dev/null @@ -1,6 +0,0 @@ -<#include "/include/page.ftl"> -<@page title="Wombat"> - -

    Blah blah blah - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/include/ignoredir.fmpp b/fmpp/src/docs/examples/session/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/session/src/include/page.ftl b/fmpp/src/docs/examples/session/src/include/page.ftl deleted file mode 100644 index 25fdcfb..0000000 --- a/fmpp/src/docs/examples/session/src/include/page.ftl +++ /dev/null @@ -1,17 +0,0 @@ -<#escape x as x?html> - -<#macro page title> - <#if !pp.s.contents??> - <@pp.set hash=pp.s key="contents" value=pp.newWritableSequence() /> - - <@pp.add seq=pp.s.contents value={"link":pp.outputFile, "title":title} /> - - ${title} - - -

    ${title}

    - <#nested> - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/session/src/index.html b/fmpp/src/docs/examples/session/src/index.html deleted file mode 100644 index e9c3c5a..0000000 --- a/fmpp/src/docs/examples/session/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ -<#escape x as x?html> - -Index - -

    Index

    - <#assign pages = pp.s.contents?sort_by("link")> - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/tdd/config.fmpp b/fmpp/src/docs/examples/tdd/config.fmpp deleted file mode 100644 index 1fb8ea0..0000000 --- a/fmpp/src/docs/examples/tdd/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: tdd(data/test.tdd) \ No newline at end of file diff --git a/fmpp/src/docs/examples/tdd/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/tdd/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/tdd/src/data/test.tdd b/fmpp/src/docs/examples/tdd/src/data/test.tdd deleted file mode 100644 index ffefb40..0000000 --- a/fmpp/src/docs/examples/tdd/src/data/test.tdd +++ /dev/null @@ -1,7 +0,0 @@ -user:"Big Joe", -tall -animals:[ - {name:"white mouse", price:30}, - {name:"black mouse", price:25}, - {name:"green mouse", price:150} -] \ No newline at end of file diff --git a/fmpp/src/docs/examples/tdd/src/index.html b/fmpp/src/docs/examples/tdd/src/index.html deleted file mode 100644 index 4e8efb2..0000000 --- a/fmpp/src/docs/examples/tdd/src/index.html +++ /dev/null @@ -1,10 +0,0 @@ -

    Hello ${user}!

    - -

    Our offers: -

      - <#list animals as animal> -
    • ${animal.name?cap_first} for ${animal.price} credits - -
    - -

    Note that we know that you are <#if !tall>not tall, ${user}.

    \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml/config.fmpp b/fmpp/src/docs/examples/xml/config.fmpp deleted file mode 100644 index a095251..0000000 --- a/fmpp/src/docs/examples/xml/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: {doc: xml(data/test.xml)} \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/xml/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/xml/src/data/test.xml b/fmpp/src/docs/examples/xml/src/data/test.xml deleted file mode 100644 index 4375656..0000000 --- a/fmpp/src/docs/examples/xml/src/data/test.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - Preface blah blah... - And preface blah blah... - - - Blah blah blah... - And blah blah blah... - - - Foo blah blah... - And foo blah blah... - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml/src/test.html b/fmpp/src/docs/examples/xml/src/test.html deleted file mode 100644 index 66b913c..0000000 --- a/fmpp/src/docs/examples/xml/src/test.html +++ /dev/null @@ -1,7 +0,0 @@ -

    ${doc.book.@title}

    -<#list doc.book.chapter as ch> -

    ${ch.@title}

    - <#list ch.para as p> -

    ${p}

    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml2/config.fmpp b/fmpp/src/docs/examples/xml2/config.fmpp deleted file mode 100644 index fa29ced..0000000 --- a/fmpp/src/docs/examples/xml2/config.fmpp +++ /dev/null @@ -1,7 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - prodXml: xml(data/products.xml, {index: {element: product, value: '%n'}}) - manuXml: xml(data/manufacturers.xml) -} \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml2/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/xml2/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/xml2/src/data/manufacturers.xml b/fmpp/src/docs/examples/xml2/src/data/manufacturers.xml deleted file mode 100644 index d1db011..0000000 --- a/fmpp/src/docs/examples/xml2/src/data/manufacturers.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - Foo Incorporated -
    3 Traktor Road, Budapest, 1234, Hungary
    - 45-456-7461 - http://www.foo.hu/ -
    - - Acmee Incorporated -
    5 Kili Street, Tarawa, Kiribati
    - http://www.acmee.com/ - bounche@acmee.com -
    - - Batman International -
    77 Cash Square, Palo Alto, California 94531, U.S.A
    - 07-798-456-985 - http://www.batmaninternational.com/ - devnul@batmaninternational.com -
    -
    \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml2/src/data/products.xml b/fmpp/src/docs/examples/xml2/src/data/products.xml deleted file mode 100644 index a389a11..0000000 --- a/fmpp/src/docs/examples/xml2/src/data/products.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - K8 Widget - 500 - Foo Incorporated - This is a standard widget with highly durable thingamy. - - - Giant/S2 Widget - 2500 - Acmee Incorporated - This is an extra-large widget. - - - Micro Widget - 800 - Acmee Incorporated - This widget can even fit into your suitcase. - - - CXC Widget - 350 - Batman International - I have no idea... this is just a stupid example, OK? - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml2/src/index.html b/fmpp/src/docs/examples/xml2/src/index.html deleted file mode 100644 index 1953250..0000000 --- a/fmpp/src/docs/examples/xml2/src/index.html +++ /dev/null @@ -1,19 +0,0 @@ -<#escape x as x?html> - - - Product Catalog - - - -

    Product Catalog

    - -

    The available products are: - -

      -<#list prodXml.products.product?sort_by('name') as p> -
    • ${p.name} - -
    - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml2/src/product.html b/fmpp/src/docs/examples/xml2/src/product.html deleted file mode 100644 index b40cf35..0000000 --- a/fmpp/src/docs/examples/xml2/src/product.html +++ /dev/null @@ -1,36 +0,0 @@ -<@pp.dropOutputFile /> -<#list prodXml.products.product as p> -<@pp.changeOutputFile name="product_${p.@id}.html" /> -<#escape x as x?html> - - - ${p.name} - - - -

    ${p.name}

    - -

    Price: $${p.price} - -

    Description: -
    ${p.description} -

    - -

    Manufacturer: -
    Name: ${p.manufacturer} -<#assign m = manuXml.manufacturers['manufacturer[name="${p.manufacturer}"]']> -<#if m?has_content> - <#if m.address?has_content>
    Address: ${m.address} - <#if m.phone?has_content>
    Phone: ${m.phone} - <#if m.homepage?has_content>
    Homepage: ${m.homepage} - <#if m.email?has_content>
    Email: ${m.email} -<#else> - <@pp.warning message="Referenced manufacturer not found: ${p.manufacturer}" /> - - -


    -Back... - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/config.fmpp b/fmpp/src/docs/examples/xml_rendering/config.fmpp deleted file mode 100644 index 21fc6ef..0000000 --- a/fmpp/src/docs/examples/xml_rendering/config.fmpp +++ /dev/null @@ -1,19 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -xmlRenderings: [ - { - ifDocumentElementIs: product - template: renderer/product.html - } - { - ifDocumentElementIs: book - template: renderer/book.html - index: { - element: [part, chapter] - attribute: ppFile - numbering: hierarchical - value: '%e_%n.html' - } - } -] \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/bigwidget.xml b/fmpp/src/docs/examples/xml_rendering/src/bigwidget.xml deleted file mode 100644 index 72b8a0d..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/bigwidget.xml +++ /dev/null @@ -1,8 +0,0 @@ - - big widget - $15 - - This is an extra large widget, manufactured with a technology - developed by the NASA. - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/example1.xml b/fmpp/src/docs/examples/xml_rendering/src/example1.xml deleted file mode 100644 index f37601d..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/example1.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - -

    This is an example "book" that demonstrates FreeMarker and FMPP.

    -
    - - - -

    A paragraph with emphasized and marked sections.

    - - A quotation with emphasized and marked sections. - -

    A emphasized section with a marked section in it.

    -
    - - -

    Blah...

    -

    Blah blah...

    -
    -
    - - -

    Blah blah blah...

    -

    Blah blah blah blah...

    -
    - - -

    Blah blah blah blah blah...

    -

    Blah blah blah blah blah blah...

    -
    - - -

    Blah blah blah blah blah blah blah...

    -

    Blah blah blah blah blah blah blah blah...

    -
    -
    -
    \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/example2.xml b/fmpp/src/docs/examples/xml_rendering/src/example2.xml deleted file mode 100644 index d63a0b9..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/example2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - -

    Yet another example book.

    -
    - - - -

    So you have seen that you can have more books...

    -
    -
    -
    \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/index.html b/fmpp/src/docs/examples/xml_rendering/src/index.html deleted file mode 100644 index 8154588..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - XML rendering example - - -

    XML rendering example

    -

    The "books": -

    -

    The "products": -

    - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/normalwidget.xml b/fmpp/src/docs/examples/xml_rendering/src/normalwidget.xml deleted file mode 100644 index fcb0753..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/normalwidget.xml +++ /dev/null @@ -1,7 +0,0 @@ - - normal widget - $5 - - This is a standard widget, with great quality pink painting. - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/renderer/book.html b/fmpp/src/docs/examples/xml_rendering/src/renderer/book.html deleted file mode 100644 index 8c155ae..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/renderer/book.html +++ /dev/null @@ -1,155 +0,0 @@ -<#-- -Renders a "book" XML to multiple HTML files. -This is a rather complex stuff... check the product.html first. ---> -<#escape x as x?html> -<@pp.dropOutputFile /> - -<#-- Calculating the prefix of output file names --> -<#assign prefix = pp.sourceFileName> -<#assign prefix = prefix?substring(0, prefix?last_index_of('.'))> -<#assign prefix = prefix + '_'> - -<#-- Calculate the ordered list of HTML pages, used for the nav. bar. --> -<#assign pages = pp.doc["//*[@ppFile != '']"]> - -<#-- Render the HTML pages --> -<#recurse pp.doc> - - -<#-- - *********************************************************************************** - Node handlers - *********************************************************************************** ---> - -<#macro book> - <@pp.nestOutputFile name="${prefix}index.html"> - <@Html title="${.node.@title}"> -

    Table of Contents

    -
      - <#list .node.part as part> -
    • ${part.@title} - <#local cs = part.chapter> - <#if cs?has_content> - - - -
    - <#recurse> - - - - -<#macro part> - <@pp.nestOutputFile name=prefix+.node.@ppFile> - <@Html title="${.node.@title}"> - <#local cs = .node.chapter> - <#if cs?has_content> -

    Part Contents

    - - - <#recurse> - - - - -<#macro chapter> - <@pp.nestOutputFile name=prefix+.node.@ppFile> - <@Html title="${.node.@title}"> - <#recurse> - - - - -<#macro p> -

    <#recurse>

    - - -<#macro quote> -
    <#recurse>
    - - -<#macro e> - <#recurse><#t> - - -<#macro mark> - <#recurse><#t> - - -<#macro @text> - ${.node}<#t> - - - -<#-- - *********************************************************************************** - Other macros - *********************************************************************************** ---> - -<#macro Html title> - - - ${title} - - - <@NavBar /> -
    -

    ${title}

    - <#nested> -
    - <@NavBar /> - - - - -<#macro NavBar> - <#local nodeName = .node?node_name> - <#if nodeName == 'book'> - Prev | Up | Next | ToC | Home - <#else> - <#local ppFile = .node.@ppFile> - <#local max = pages?size - 1> - <#list 0..max as i> - <#if pages[i].@ppFile == ppFile> - <#local idx = i> - <#break> - - - <#if idx != 0> - Prev<#t> - <#else> - Prev<#t> - - | - <#list .node?ancestors as a> - <#if a.@ppFile[0]??> - Up<#t> - <#break> - <#elseif a?node_name == 'book'> - Up<#t> - <#break> - - - | - <#if idx != max> - Next - <#else> - Next<#t> - - | - ToC | Home - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp b/fmpp/src/docs/examples/xml_rendering/src/renderer/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/xml_rendering/src/renderer/product.html b/fmpp/src/docs/examples/xml_rendering/src/renderer/product.html deleted file mode 100644 index 832fb06..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/renderer/product.html +++ /dev/null @@ -1,20 +0,0 @@ -<#-- -Renders a "product" XML to a HTML files. ---> -<#escape x as x?html> -<@pp.renameOutputFile extension="html" /> -<#assign prod = pp.doc.product> - - - Product: ${prod.name?cap_first} - - -

    ${prod.name?cap_first}

    -

    Price: only ${prod.price} -

    Description:
    - ${prod.description} -


    - Back... - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_rendering/src/smallwidget.xml b/fmpp/src/docs/examples/xml_rendering/src/smallwidget.xml deleted file mode 100644 index d23985c..0000000 --- a/fmpp/src/docs/examples/xml_rendering/src/smallwidget.xml +++ /dev/null @@ -1,8 +0,0 @@ - - small widget - $10 - - Always wanted a small widget, but never found it? - Now, then this one is for You! - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_try/config.fmpp b/fmpp/src/docs/examples/xml_try/config.fmpp deleted file mode 100644 index 735bdd4..0000000 --- a/fmpp/src/docs/examples/xml_try/config.fmpp +++ /dev/null @@ -1,12 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - doc:xml( - data/test.xml - { - removeComments: false - index: {element: [part, chapter, para], value: '%n'} - } - ) -} \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_try/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/xml_try/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/xml_try/src/data/test.xml b/fmpp/src/docs/examples/xml_try/src/data/test.xml deleted file mode 100644 index 24836d7..0000000 --- a/fmpp/src/docs/examples/xml_try/src/data/test.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - A - - - - A - B - - - A - B - - - - - A - B - C - - - A - B - C - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_try/src/index.html b/fmpp/src/docs/examples/xml_try/src/index.html deleted file mode 100644 index 8b5883a..0000000 --- a/fmpp/src/docs/examples/xml_try/src/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - XML Tree Dump - - <@pp.setOutputEncoding encoding="UTF-8" /> - - - -

    XML Tree Dump

    - -<@dumpXml doc /> - -

    Legend: -

      -
    • <foo bar="123">: Element node -
    • "Blah blah": Text node -
    • <?foo bar ?>: Processing instruction node -
    • <!-- Blah blah -->: Comment node -
    • foo: Other node -
    - - - -<#function showXmlSource s> - <#return s?xml?xml?replace(" ", r" ")?replace('\n', '&#xA;')?replace('\r', '&#xD;')> - - -<#-- -Prints an XML node tree as colored HTML. ---> -<#macro dumpXml node> -
      - <@dumpXml_internal node /> -
    - - -<#macro dumpXml_internal node> - <#local type = node?node_type> - <#if type == 'element'> -

    From the BeanShell documentation: "BeanShell is a small, free, embeddable, Java source interpreter with object scripting language features, written in Java. BeanShell executes standard Java statements and expressions but also extends Java into the scripting domain with common scripting language conventions and syntax." So if you know Java programming language, and already used some scripting languages, you will find it quite easy to learn and use. For more information, please visit: http://www.beanshell.org/

    d15cGUM(GV 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

  • <<#rt> - <#if node?node_namespace?? && node?node_namespace != ''> - '${node?node_namespace}':<#t> - - ${node?node_name}<#t> - <#list node.@@ as att> - ${' '}<#t> - <#if att?node_namespace?? && att?node_namespace != ''> - '${att?node_namespace}':<#t> - - ${att?node_name}="${showXmlSource(att)}"<#t> - - ><#lt> - <#elseif type == 'text'> -
  • "${showXmlSource(node)}"<#lt> - <#elseif type == 'pi'> - <#local nodeName = node?node_name> -
  • <?${nodeName?substring(4)} ${showXmlSource(node)}?><#lt> - <#elseif type == 'comment'> -
  • <!-- ${node} --><#lt> - <#else> -
  • ${node?node_type}<#lt> - - <#if node?children?size != 0> -
      - <#list node?children as c> - <@dumpXml_internal c /><#t> - -
    - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_validating/config.fmpp b/fmpp/src/docs/examples/xml_validating/config.fmpp deleted file mode 100644 index 96ec9ec..0000000 --- a/fmpp/src/docs/examples/xml_validating/config.fmpp +++ /dev/null @@ -1,8 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - doc: xml(data/test.xhtml) -} -xmlCatalogFiles: dtds/catalog.xml -validateXml \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_validating/dtds/catalog.xml b/fmpp/src/docs/examples/xml_validating/dtds/catalog.xml deleted file mode 100644 index c180196..0000000 --- a/fmpp/src/docs/examples/xml_validating/dtds/catalog.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-lat1.ent b/fmpp/src/docs/examples/xml_validating/dtds/xhtml-lat1.ent deleted file mode 100644 index ffee223..0000000 --- a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-lat1.ent +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-special.ent b/fmpp/src/docs/examples/xml_validating/dtds/xhtml-special.ent deleted file mode 100644 index ca358b2..0000000 --- a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-special.ent +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-symbol.ent b/fmpp/src/docs/examples/xml_validating/dtds/xhtml-symbol.ent deleted file mode 100644 index 63c2abf..0000000 --- a/fmpp/src/docs/examples/xml_validating/dtds/xhtml-symbol.ent +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd b/fmpp/src/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd deleted file mode 100644 index 1b99c61..0000000 --- a/fmpp/src/docs/examples/xml_validating/dtds/xhtml1-transitional.dtd +++ /dev/null @@ -1,1201 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/docs/examples/xml_validating/src/data/ignoredir.fmpp b/fmpp/src/docs/examples/xml_validating/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/examples/xml_validating/src/data/test.xhtml b/fmpp/src/docs/examples/xml_validating/src/data/test.xhtml deleted file mode 100644 index f73cf96..0000000 --- a/fmpp/src/docs/examples/xml_validating/src/data/test.xhtml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Test - - - -

    Test

    -

    p1

    -

    p2

    -

    p3

    - - - \ No newline at end of file diff --git a/fmpp/src/docs/examples/xml_validating/src/test.txt b/fmpp/src/docs/examples/xml_validating/src/test.txt deleted file mode 100644 index be308fa..0000000 --- a/fmpp/src/docs/examples/xml_validating/src/test.txt +++ /dev/null @@ -1,16 +0,0 @@ -<#ftl ns_prefixes={'D':'http://www.w3.org/1999/xhtml'}> -<#-- Note: Prefix D is a reserver in FreeMarker, and stands for Default --> - -Title: -${doc.html.head.title} - -Paragraphs: -<#list doc.**.p as p> -- ${p} - - -Paragraphs where class is "foo": -<#-- Note that in XPath expressions you must use explicit prefix --> -<#list doc['//D:p[@class="foo"]'] as p> -- ${p} - \ No newline at end of file diff --git a/fmpp/src/docs/figures/fmpparch.png b/fmpp/src/docs/figures/fmpparch.png deleted file mode 100644 index fbfe283a30b8694ead62fe5e038dbb4964d110d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8093 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%0D_MCPyjH&DLGl>bM@}xZYRz0wWFF+J^vi zph@{(`(km}lT6~>)8oSdG;C56KfgiP?fg@S;qG}rP;=hvNoxuadGlq|`rB{eiZ^aZ zjIL5R$_4UO8p>9A%n1UAn0rC#OnRA^?q0)8)E2Lt^@z7yof8yB2>La@x@Z&|*#j&iceQ1(lC>lPfROc!zy&zg; zdzke)cE<3^GsN#kFwmLMixMR5P_p+JjA6eQc#Bz}4!n=~%3Z#)93Z-IYd>^J)=Xk! zH5SpFJ7NePoqG(+pmrd&uEiF{!)p#rTJ4K@&QzG*a%QvBRThr0aB|)^$^zsL$^Tn( zl&#)jf%#z4BpE{A#{xG(XSOiLy=-v(D{0=$8*KIMp$iMz=sU@Z8MqU04QOQ}Sg(2! zBUHws3>>VBmu(uSlGXlV#;*;@u8P2)AhcnWE~3_^BeGtj;C7iCv!w(9D6LIT3aZQD zaOR^PTIHSrA!p>r1I%zl&0<76V(X~vT@v8J*WT4uaC?!A`eu5kyYhvT zl;xxb67-JGGSZWYj0zvmMJvcUY#v}OmD38!0~xXHH~bZ<#lCdB2O_>8eQu!YlT`Qd zF^+o8chp4rdw&EsDPclX@;YXU-(@?;0GNrZzrtgVFAfJOceo^>A-NbpOY<1lcu^~2}7(jo&T$mWe zZdRyzNU1^>)KA3pRt;Yft?@nC_GNWp=j?0akn=%2bkZ+c-*MD6V;->an#(^)rp7~* zJtBtu;dhd&yYjmei4tiOvGar|%?YOt3HaFe<%wX); zHvjjaYN{)T{ImdnL=UbCHY>E%E26!S5 zTcBdLA9DdV<{vpVokI$yLUEmPSPMTh3@7SziLO=LG(&E}0)h}1qz9mXArJ`{f}jrz zhPN**dp(>w>tw-FK^+`RH;kqeoJIzcqs#*o&rBvGWE!A{YBFj$5Myfk394$JMD3Nh z#%NOt5c^sIvM=||oBV%U*zn`96KKE-!*!yrl|)I|WgQOhfar&YCA8>@FE9;(IFVH? z3a}4Y0Pwjhh+AY-dSFVs_(XaPv7-Tg^H-t|;+DhuV&SUvaRDbN?D2Qa;4TZWNux7m z%QgkxtaVaXk=y~TZ9$mHl)+;>c`X5Zj`Hhdk_$%s`{A1JafbudriV0T^8!kt3*R{Q z+NM_9b}@s;wRv|@5Pfij*xy5>K+;sQ0afzYmm z-;@K>k3O&U?q$+T_49c@9ZR*2dthLAv&TTV&k0E)&BHzH<(ey49NuMIKdSI$|0A$jJFcdP}Tc8 z1KeP;Q5Lg@(B-XRlqGP%Omn_d__(Kd@ZBADC@2_?F2$Zx9>$Yo6}d)t3YKG<<~(?Q zRY^)FDEnK(77cUIiRArL~|-d5)cLX(gl*ltjdX( zJDE-EMDl@B-3Yr1$_=iJ4X!#u!h=Y4an9BF&*e?Ds=WvY_c$g29OGcLnWJ@8bzA=Az znOGY>$4uzFq97}zC)Mv<#$peZtvgK!5pT4%R2+4PN{@yw!`?h^oc01QUSZsq4*Xa_ z?Ag~h5r3-~+YnSF474=4=csx!7tFJY2ZLTpWZx02>wuf_P1R)QT4l_rPwMB zn5pXpUrwW@m*L;qnOrFi(8 z2m1D&4SO4*A|73G^Zvh^2tWh+FiU+(8t_9 zSA2Kw5!S7JH`#y_gK45-e3^8l zdHxUc|H!KTjk%M(%S(NKS>I&~?(-Wbl+~L5TOxd?0Fs8FJ|*989mzrKW@kdo@@O`f bZwY>CGz6oSwj=I-4Dqzp_0(!rY{UNxl{7JZ diff --git a/fmpp/src/docs/figures/qtour_step1.png b/fmpp/src/docs/figures/qtour_step1.png deleted file mode 100644 index 7e37afa31129a401c3dbf2b538313df7b28b071f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3142 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 R2H^7!VsGnAePZpy|1Szr)HeVC diff --git a/fmpp/src/docs/figures/qtour_step1_src.png b/fmpp/src/docs/figures/qtour_step1_src.png deleted file mode 100644 index 14c11e8e36a9dc2243a4b1d6fd0f1321c879a4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1095 zcmV-N1i1T&P)WdKMZF*zV=VQwxUGB7YSATlyKGdVgmH6SZ6F)%PNHv?k;000McNliru z)BzO&2s#pt{ZIe^010qNS#tmYP9OjPP9OmmeVN_>000DMK}|sb0I`n?{9y$E003Z6 zOjJex|Nj600KmY&fPjGi|Nj7hfB*ph004l<$jIpE=={XQ=KuiqjEwN`@a;G_*x1*6%y;bGK9zz`GQTfcp;2CPC<+bm zq?9AfuC4K|Z#4ZZ#%Nx-g79jgx_f*FmUvNT9)AWFQH_Q0bZx8Wti;*Qw z1q^Pxv$%ZW7;&5=ahjx>1@vRCSPsaM%xiRhqi#M>l^u1$5?>G@P7nrhGz*YLyLUuL zR5vr-=7hPv=mvQQ`FQ`x;_}R0IjUah zy!-Km{rLIbG(~x)u0ZdDCt<8`os26!S?v3$XjvK(Ec(AmW}=q~fLssh;db|ZrHyII zir?A9j_!J=^C5bum%^pK=q63kGA!29yk4L!7PbLPe}IIlqBOqPRgV2wXuMRX`gCqt z3f_3RqPU9ashL~$i?BRnsVM3fa7?fFIk?~dE5qV z)fDs2qSsz|OVfBkmb}IYt~U8;tAsN@#$G^{SFy$I%hMNItox*U26J_+@WoMV8D?2k zRT=liQEb_n#aV3Wlv2o(>n2r|QD26OEi^ZwPxLdZDv$W$D7JJ{C{=(`L$V=@<;zg9 zrJpJ=KP-dAmVVk|;$=UUp<;_&N+Gd3x2m$3Wo@zLpJe%Oi!CpW>o0O&FTI73mC*nI N002ovPDHLkV1m+|^aua| diff --git a/fmpp/src/docs/figures/qtour_step2.png b/fmpp/src/docs/figures/qtour_step2.png deleted file mode 100644 index ec0d321cbff51b34b2bcca9fb065072f2988f6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6176 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°#Qz4fhax2kNC^4=Lnh(ubq*KQvYtk~V=~pPTSEbgK zEDs_b{EGDC*hb6&eynXY%hHi zugR>rLIxpWx69@+50;DY`NyP)+EE_<`chR78ueYxZl5~q4aOBjH?nl~VBnv1EAc6W zl(-m&VP0eSWL#vxB^hIXQ+@fo&Pvi@Xv8-G(a#@O`N}Z zbq!pF7KmH!{Y>L;qUY4Fob-CrQ?I;sCkO*;+^rxQ+y0lSI@f^#=gF~all_IoT_jWT z#-7Mj-IcH`Wf($Ty}9|)jr%ItrML>p_4-@@F%j8b&@ov8_xD(&R9_n3FU8?14r`RL z+fl7r36Q&4%83o$D_`VCLFuhR+siiT;Vx^&_QTsmt|!&&i%&xw3Z^i%XZ($80n|PW^KgMy6!SP;K`U)LJ}^PT5)M&t+0C#Jrl;=HM<| ziEMBW{Fdf_e=1cpSKul16|Uyz*9UT=8Xe7iR(Ygt(U=}Pu6*=7`)LH*lTv{MO2x0h zz+dI}RcvQNOPs?1%zMl-nE-fwY@F$ zv`Pw`+X21kT~}4}CYd6d+qzrk+F2{DY~L)k5Tds#cJ4b?pWB?q*-gFldW*YIBA#?GX2qz3JFShTqnXK z5bJpc!MspRj>$5Yq@V~l&)+sK;}4{E)sG_t8^7hPxDC>;f;~dE2B}C)mue!r)(sB4 z?L_9(aHA@LxXxFJejcphe6cCPl3WsdWgV4v(kJjRvHmb2^OJEUHM>3P%nLjY@1WIW zP751xxw1zzAK_`+YxT!(M>(@RH0rGR-tuu#8W+4EmfVjc&WWZ2ao7zpA<0bJb0&c zn4cQdr&vN#)58bjrri&HZ(Usb$IXOnu}fKc1>t)C%yRmC_Y(+@oW>@c=Tq**(OEZ+ z{}52S6pCHaFygrk|GS?@N_SE%hfcSHp|THtYW_ig$hNfuh?{i;sUtSnuC?P%&Fi}* zzDfv!jA>Olm2^Vh>+Z}~zeGF~`Hk;3+N7ejt%NXXef{&BY{#qeF;7wt=SIzNC(dzm z+NBIwDB?HL_s^C~n<#8&zMl1+hIeOD3^BnGIU^6p?!O6@6fSK-wFbQDs__#mzkztX z>7_b`#(o#cc8@gkl{dumZ-$Z7A?O@T1cxssVqcCzIhv3mTTikyaa&aZ? zqWgK8OL4d##g-s^L+M(wUve>GN&2t-dDx2)i-Mndv_emU`kABWpCfq;-37ho5|BTl zy3YI)Z`Jwpr;!l~bdG%K+p)4tRb3jEO2Mdx?j7f*=;QF*BaRhZs^qlrutm!6UXhz( za%v&fcvPWKa70H0yM4a2UxeY1)_wg038|c8Rfuf-vxxw&WjkLq8#DM6+g-{Fh10C~ zb%(Y0MbXjhLv`k>7T9Q;1=i?6x>~T`o3Dzas1OV5yeZte>ZM{;iN+#Q3dC*syl{cI z7IyBOs1M!{VOiKwL8%kRBa3yNJ0$RQLvqgVztQVOEWmk5Bk%=;u+9*YO%ks6|8_3c lLr7$BsF_>6Go9`Jz%-@(GBLg#RrJhUF{{XkSh1385 diff --git a/fmpp/src/docs/ftl.html b/fmpp/src/docs/ftl.html deleted file mode 100644 index 3af23aa..0000000 --- a/fmpp/src/docs/ftl.html +++ /dev/null @@ -1,5 +0,0 @@ -<@page title="FTL - FreeMarker Template Language" keywords="FTL"> - -

    This is the syntax used for the template files. Please read the <@fma href="dgui_template_overallstructure.html">FreeMarker Manual about this.

    - - diff --git a/fmpp/src/docs/include/ignoredir.fmpp b/fmpp/src/docs/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/include/page.ftl b/fmpp/src/docs/include/page.ftl deleted file mode 100644 index 349061a..0000000 --- a/fmpp/src/docs/include/page.ftl +++ /dev/null @@ -1,331 +0,0 @@ -<@pp.ignoreOutput> - -<#-- -"page" macro and its private helpers. ---> - -<#escape x as x?html> - -<#macro page title keywords toc=true> - <#assign P_sectLevel = 0> - <#assign P_sectId = 0> - <#assign P_sects = pp.newWritableSequence()> - <#assign P_index = pp.newWritableSequence()> - <#assign P_settings_in_context = pp.newWritableSequence()> - - <#local navCtx = page_buildNavigationContext(title)> - - <@pp.restartOutputFile /> - <#compress> - - - - - - - - <#if !navCtx.isTheIndexPage> - ${title} - FMPP - - <#else> - - - FMPP: Text file preprocessor (HTML preprocessor) - - - - - - - - <#-- @todo: move seo tags to separate macro --> - <#local baseUrl = "http://fmpp.sourceforge.net"><#-- @todo: this should come from build settings --> - - - - <#if navCtx.prevLink?has_content> - - - <#if navCtx.nextLink?has_content> - - - - - - - - - - - - - <@page_header navCtx=navCtx title=title /> - -
    -
    - -

    ${title}

    - - <#local needHr = false> - <#if toc> - <#local content> - <#nested> - -
    - <#if (P_index?size != 0 || P_sects?size != 0 || needHr)> -
    - <#if P_sects?size != 0> - <@.namespace.toc title="Page contents"> - <#list P_sects as sect> - <@toci href="#" + sect.id title=sect.title/> - - - <#local needHr = true> - - <#if P_index?size != 0> -

    Alphabetical index of keys:

    -
      - <#list P_index?sort_by("title") as e> -
    • ${e.title} - -
    - <#local needHr = true> - - <#if needHr> - <#--><@hr/>--> - -
    - -
    - <#noescape>${content} -
    -
    - <#else> -
    - <#nested> -
    - - <#compress> -
    -
    - - - - - - <#assign P_reportBugPrinted = false> - - - -<#--- - @param navCtx - @param title ---> -<#macro page_header navCtx title> - <#compress> - - - - - -<#macro page_pagers navCtx bugReportingIcon=true> - <#if navCtx.showPagerButtons || !navCtx.isTheIndexPage || (bugReportingIcon && !P_reportBugPrinted?default(false))> - - - - -<#macro page_breadcrumbs navCtx> - <#if navCtx.page_breadcrumbs?size == 0> - <#stop "Couldn't find page_breadcrumbs path to: " + pp.outputFileName> - - <#t> - - -<#function page_getBreadcrumbsTo targetFile cur=manualFiles parentPath=[]> - <#if !cur?is_sequence> <#-- leaf node --> - <#if cur == targetFile> - <#return parentPath + [ { 'file': cur, 'title': pp.s.manualFileTitles[cur] } ]> - <#else> - <#-- Not found under cur: --> - <#return []> - - <#elseif cur[0].file == targetFile> <#-- non-leaf node == target --> - <#return parentPath + [ cur[0] ]> - - - <#list cur[1..] as child> - <#local path = page_getBreadcrumbsTo(targetFile, child, parentPath + [ cur[0] ])> - <#if path?size != 0> - <#-- Found it: --> - <#return path> - - - <#-- Not found under cur: --> - <#return []> - - -<#function page_buildNavigationContext title> - <#local tocLink = ""> - <#local prevLink = ""> - <#local nextLink = ""> - - <#local showPagerButtons = false> - <#list flattenedManualFiles as f> - <#if pp.outputFile = f> - <#local showPagerButtons = true> - <#if !pp.s.manualFileTitles??> - <@pp.set hash=pp.s key="manualFileTitles" value=pp.newWritableHash()/> - - <@pp.set hash=pp.s.manualFileTitles key=f value=title/> - <#if f_index != 0> - <#local prevLink = pp.home + flattenedManualFiles[f_index - 1]> - - <#if f_has_next> - <#local nextLink = pp.home + flattenedManualFiles[f_index + 1]> - - <#local tocLink = pp.home + "manual.html"> - <#break> - - - - <#return { - 'isTheIndexPage': pp.outputFileName == "index.html", - 'isContentsPage': pp.outputFileName == "manual.html", - 'showPagerButtons': showPagerButtons, - 'tocLink': tocLink, - 'prevLink': prevLink, - 'nextLink': nextLink, - 'page_breadcrumbs': page_getBreadcrumbsTo(pp.outputFileName) - }> - - -<#macro page_social> - <#local socialLinks = [ - { - "url": "https://github.com/freemarker/fmpp", - "class": "github", - "title": "Github" - }, { - "url": "https://twitter.com/freemarker", - "class": "twitter", - "title": "Twitter" - } - ]> - - <#t> - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/include/site.ftl b/fmpp/src/docs/include/site.ftl deleted file mode 100644 index cbc3984..0000000 --- a/fmpp/src/docs/include/site.ftl +++ /dev/null @@ -1,343 +0,0 @@ -<@pp.ignoreOutput> -<#escape x as x?html> - -<#assign P_titleColor = "#000000"> -<#assign P_font = "Arial, sans-serif"> - -<#include "page.ftl"> - -<#macro figure src alt> - <#local label><#nested> - <#if label?length != 0> -

    - - <@html.img src="${pp.home}figures/${src}" alt=alt /><#t> - <#if label?length != 0> -
    <#lt> -
    Figure: <#noescape>${label} -

    - - - -<#macro sect title anchor=''> - <#assign P_sectLevel = P_sectLevel + 1> - <#assign P_sectId = P_sectId + 1> - <#if anchor = ''> - <#local anchor = "sect" + P_sectId> - - <#if P_sectLevel = 1> - <@pp.add seq=P_sects value={"title":title, "id":anchor} /> - <@.namespace.anchor anchor /> -

    <#rt> - <#if title?starts_with('ex:')> - <@title[3..(title?length-1)]?interpret /><#t> - <#else> - ${title}<#t> - -

    <#lt> - <#nested> - <@pp.clear seq=P_settings_in_context /> - <#elseif P_sectLevel = 2> - <@.namespace.anchor anchor /> -

    <#rt> - <#if title?starts_with('ex:')> - <@title[3..(title?length-1)]?interpret /><#t> - <#else> - ${title}<#t> - -

    <#lt> - <#nested> - <#else> - <#stop "@sect is nested too deeply."> - - <#assign P_sectLevel = P_sectLevel - 1> - - -<#macro anchor id> - <#if id != ''> - <#if !pp.s.anchors??> - <@pp.set hash=pp.s key="anchors" value=pp.newWritableHash() /> - - <@pp.set hash=pp.s.anchors key='${pp.outputFile}#${id}' value=true /> - <#lt> - - - -<#-- Draws a 100% width horizontal line with the given color. Do not use inside another table (IE 5)... --> -<#macro hr> -
    - - -<#macro c><#nested> - -<#macro r><#nested> - -<#macro e><#nested> - -<#macro note>

    Note: <#nested>

    - -<#macro s check=true> - <#local name> - <#nested> - - <#if check && !stdSettings[name]??> - <#stop 'This is not a standard setting: ${name} ' /> - - <#if check> - <#local link = true> - <#list P_settings_in_context as s> - <#if s = name> - <#local link = false> - <#break> - - - <#else> - <#local link = false> - - <#if link><#t> - ${name}<#t> - <#if link><#t> - - -<#macro prg escape=true> - <#local body><#nested> -
    <#t>
    -    <#if !escape>
    -      <#noescape>${body?chop_linebreak}<#t>
    -    <#else>
    -      ${body?chop_linebreak}<#t>
    -    
    -  
    <#t> - - -<#macro toc title=''> - <#if title != ''> -

    ${title}

    - -
      - <#nested> -
    -
    - - -<#macro toci href title> - <#if href=''> -
  • ${title}<#nested>
  • - <#else> -
  • ${title}<#nested>
  • - - - -<#macro setting name type default merging clShort='' deprecated='' antAltAtt=''> - <#if !stdSettings[name]??> - <#stop 'No such standard setting exists: ${name}'> - - <@_index name /> - <@pp.add seq=P_settings_in_context value=name /> -

    - Name: ${name}
    - <#if deprecated?length != 0> - Deprecated! <@deprecated?interpret />
    - - Type: ${type}
    - Default: <#rt> - <#if default != ''> - <#if default?starts_with('ex:')> - <@default[3..(default?length - 1)]?interpret />
    <#lt> - <#else> - <@c>${default}
    <#lt> - - <#else> - No default value
    <#lt> - - <#if !(type?starts_with('string') || type?starts_with('integer') || type?starts_with('boolean'))> - <#if !(type?starts_with('sequence') || type?starts_with('hash'))> - <#stop "Unknown setting type: ${type}"> - - <#-- - Merging: ${merging?string('yes', 'no')}
    <#lt> - --> - <#if !merging> - <#stop "The \"Merging\" field was hidden because all collection-like types " - + "were merged till now. If it has changed, you have to review the " - + "documentation and this part of site.ftl. The problematic setting was: " - + name> - - - <#if clShort != ''> - Command-line short name: ${clShort}
    <#lt> - - <#if antAltAtt != ''> - Ant task attribute name alternative: ${antAltAtt}
    <#lt> - -

    - - -<#macro variable name type nestedContent=false result='' anchor='' deprecated=''> - <@_checkType type /> - <@_index name /> - <@sect title=name anchor=anchor> - <#if deprecated != ''> - Deprecated: <@deprecated?interpret />
    - - Type: ${type} - <#assign P_params = pp.newWritableSequence()> - <#local body><#nested> - <#if (type = 'directive' || type = 'method')> - <#if type="directive"> -
    Supports nested content: ${nestedContent?string("yes", "no")} - <#else> -
    Result type: ${result} - -
    Parameters: - <#if P_params?size != 0> - <#if type="directive"> -
      - <#list P_params as param> -
    • ${param.name}<#if param.default != ''>=${param.default}: - ${param.type}. - <#noescape>${param.desc} - -
    - <#else> -
      - <#list P_params as param> -
    1. ${param.name}: ${param.type}<#if param.optional>, optional. - <#noescape>${param.desc} - -
    - - <#else> - none - - - <#noescape>${body} - - - -<#macro dataLoader name> - <@_index name=name /> - <@sect title=name> - <#assign P_params = pp.newWritableSequence()> - <#local body><#nested> - Parameters: - <#if P_params?size != 0> -
      - <#list P_params as param> -
    1. ${param.name}: ${param.type}<#if param.optional>, optional. - <#noescape>${param.desc} - -
    - <#else> - none
    - - <#noescape>${body} - - - -<#macro param name type optional=false default=''> - <#local body><#nested> - <@pp.add seq=P_params value={ - "name":name, "type":type, "desc":body, <#-- common --> - "optional":optional, <#-- methods only --> - "default":default} <#-- directives only --> - /> - - -<#macro _index name> - <#if !P_indexId??> - <#assign P_indexId = 1> - <#else> - <#assign P_indexId = P_indexId + 1> - - <#assign id = "key_" + name?replace(' ', '_')?replace('.', '_')> - <@pp.add seq=P_index value={"id":id, "title":name}/> - <@anchor id /> - - -<#macro _checkType type> - <#if !(type = 'directive' || type = 'method' || type = 'string' || type = 'number' || type='boolean' - || type = 'hash' || type = 'sequence' || type = 'writable hash' || type = 'writable sequence' - || type = 'date' || type = 'date (date only)' || type = 'date (time only)' - || type = 'date (date+time)' - || type = 'any' || type = 'node') - > - <#stop 'Bad variable type: ' + type> - - - -<#macro a href rel=""> - rel="${rel}"><#nested><#t> - <#if !pp.s.hrefs??> - <@pp.set hash=pp.s key="hrefs" value=pp.newWritableSequence()/> - - <#local x = href?index_of('#')> - <#if x != -1> - <#if x != 0> - <#local file = href[0..x-1]> - <#else> - <#local file = ''> - - <#local anchor = href[(x+1)..(href?length - 1)]> - <#if file?length = 0> - <#local file = pp.outputFileName> - - <#else> - <#local file = href> - <#local anchor = ''> - - <@pp.add - seq=pp.s.hrefs - value={"source":pp.sourceFile, "href":href, "file":pp.outputRootRelativePath(file), "anchor":anchor} - /> - - -<#macro reportBugs> -
    -

    Please report bugs you find! Any programming, documentation content or grammatical mistakes (even minor typos). Thank you!

    -

    Use the bug reporting Web page,
    - or e-mail: <@myEmail />

    - -

    Please report FreeMarker bugs at the FreeMarker bug reporting Web page, not for me. If you are not sure if you have found a FreeMarker or FMPP bug, just report it as an FMPP bug.

    -
    - - <#assign P_reportBugPrinted = true> - - -<#macro myEmail plainText=false> - <#if plainText> - ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)<#t> - <#else> - ddekanyREMOVETHIS@freemail.hu (delete the "REMOVETHIS"!)<#t> - - - -<#macro fmppPath path=''> - <@c><@r><FMPP><#if path != ''>/${path}<#t> - - -<#macro example path=''> - <#if path != ''> - <@fmppPath path="docs/examples/${path}" /> - <#else> - <@fmppPath path="docs/examples" /> - - - -<#macro nbc>Warning! Incompatible change! - -<#macro nbca>Warning! Incompatible Java API change! - -<#macro attc>Attention! - -<#macro url href rel=""> rel="${rel}">${href} - -<#macro fma href=''> - <#if href = ''> - <#local href='index.html'> - - <@a href="${pp.home}freemarker/${href}" rel="nofollow"><#nested><#t> - - - - \ No newline at end of file diff --git a/fmpp/src/docs/index.html b/fmpp/src/docs/index.html deleted file mode 100644 index 3d9c5c4..0000000 --- a/fmpp/src/docs/index.html +++ /dev/null @@ -1,134 +0,0 @@ -<@page title="FMPP - FreeMarker-based file PreProcessor" keywords="homepage"> - -<@sect title="What is FMPP?"> -

    FMPP is a general-purpose text file preprocessing tool that uses FreeMarker templates. It process entire directories recursively. It can be used for generating complete static websites, source code, configuration files, etc. It can insert data from sources like CSV, XML, and JSON into the generated files. (You can add new kind of data sources in Java.) <@a href="qtour.html">See the Tutorial for a more concrete introduction.

    - -

    FMPP can be used with UN*X-style command-line interface, or as Ant task, or can be embedded into your application using its Java API.

    - -

    FMPP was written in Java, thus it runs on all modern platforms (Windows, "Linux", OS X, etc.).

    - -

    FMPP is Free software under Apache License 2.0. <@a href="license.html">See license...

    - - <@sect title="Features"> -

    A quick list of FMPP capabilities:

    -
      -
    • FreeMarker as the preprocessor language: -
        -
      • All the usual template constructs, such as include, if/else/elseif, loop.
      • -
      • Macros with named arguments and nested content (body).
      • -
      • Variables (global, or local for a macro call)
      • -
      • Complex expressions using string, arithmetical and logical operations.
      • - Extensible with custom functions. -
      • Automatic and manual escaping (HTML, XML, custom function)
      • -
      • Transforming (filtering) blocks of output; extensible with custom transformations in Java.
      • -
      • Capturing block of output into a variable.
      • -
      • Charset aware, internally uses UNICODE.
      • -
      • Number and date/time formatting with masks (patterns). Locale sensitive formatting.
      • -
      -
    • -
    • Bulk file processing: -
        -
      • Process entire directories recursively.
      • -
      • Different file processing mode can be chosen for each file, based on path patterns (as file extension): execute file as template, or parse it as XML and then render it to output with a template, or binary-copy it, or ignore it.
      • -
      • Can ignore bad source files and log the error message into a text file.
      • -
      • Can guarantee that certain files will be processed later than others.
      • -
      -
    • -
    • You can expose data from arbitrary data sources be writing extensions in Java. - Currently out-of-the-box supported data sources: -
        -
      • XML file
      • -
      • CSV and tab-separated text file
      • -
      • JSON file
      • -
      • Java "properties" file
      • -
      • Ant properties, Ant project and target information
      • -
      • System clock
      • -
      • Plain text file
      • -
      -
    • -
    • Other highlighted features: -
        -
      • Output splitting: a single source file can generate multiple output files (including 0 output files).
      • -
      • Automatic file inclusion, automatic escaping, and whatnot that can be done with automatically inserted headers and footers, chosen based on path patterns.
      • -
      • Generate HTML <img>-s with calculated width and height.
      • -
      • Calculate the relative path to the home directory, or to any other file.
      • -
      • Rendering (transforming) XML files with FreeMarker templates. (Similar to the typical XSLT usage pattern.)
      • -
      • Query the size/existence of source files.
      • -
      • Query output encoding (charset).
      • -
      • URL-escaping (with the actual output charset).
      • -
      -
    • -
    - - - - -<@sect title="Documentation"> - <#if online> -

    This on-line documentation is for FMPP version ${pp.version} + FreeMarker ${pp.freemarkerVersion}. - The full documentation of the version you are using can be found in the <@c>docs directory of the installed FMPP.

    - -
      -
    • <@a href="manual.html"><@e>FMPP Manual
    • -
    • <@a href="api/index.html">FMPP Java API
    • -
    • <@fma>FreeMarker Manual
    • -
    • <@fma href="api/index.html">FreeMarker Java API
    • -
    - - -<@sect title="Download"> -<#if online> - <#macro downloadLink fileName> - <#t> - ${fileName}<#t> - <#local rfile=basedir + pp.slash + "build/dist" + pp.slash + fileName /> - <#if pp.realFileExists(rfile)> - (${(pp.realFileSize(rfile)/1024/1024)?string("#0.0")} M) - <#else> - <#stop 'File to download missing: ${rfile}'> - - - -

    The latest released version is FMPP ${pp.version} (comes with FreeMarker ${pp.freemarkerVersion}, but <@a href="installing.html#updatingFreeMarker">you can replace it with a later version).

    - -

    Downloads include "binaries", all documentation, and source code.

    - -
      <#t> -
    • <@downloadLink "fmpp_" + pp.version + ".tar.gz" />
    • <#t> -
    • or <@downloadLink "fmpp_" + pp.version + ".zip" />
    • <#t> -
    <#t> - -

    Installation instructions are <@a href="installing.html">here, in the Manual.

    - -

    FMPP is a Java application so it requires Java to be installed on your machine (version 1.4 or later).

    - -

    The FMPP Ant task (ignore if you don't know what Ant is) requires Ant 1.5.1 or later.

    - -

    <@a href="versions.html">Change log (version history)...

    -<#else> -

    To download the latest release, please visit the FMPP homepage: <@url href="http://fmpp.sourceforge.net/" />

    - - -

    For <@e>text editor and IDE plug-ins and other FreeMarker template-related tools, please visit the FreeMarker homepage: http://freemarker.org/ (mirror: http://freemarker.sourceforge.net/)

    - - -<@sect title="Contact"> - -

    Ask for <@e>help or provide suggestions:

    -
      -
    • on the mailing list (The preferred way. Low traffic.):
    • -
        -
      • Subscribe/unsubscribe: <@url href="http://lists.sourceforge.net/mailman/listinfo/fmpp-open" />
      • -
      • News group interface: <@url href="nntp://news.gmane.org/gmane.comp.text.fmpp" />
      • -
      • Web interface (read only): <@url href="http://news.gmane.org/thread.php?group=gmane.comp.text.fmpp" />
      • -
      - -
    • on the SourceForge.net Web forum: <@url href="http://sourceforge.net/forum/forum.php?forum_id=254571" />
    • -
    • with private e-mail: <@myEmail />
    • -
    - - <@reportBugs /> - - - - \ No newline at end of file diff --git a/fmpp/src/docs/installing.html b/fmpp/src/docs/installing.html deleted file mode 100644 index f7a5e97..0000000 --- a/fmpp/src/docs/installing.html +++ /dev/null @@ -1,84 +0,0 @@ -<@page title="Installing" keywords="installing, install, setup"> - -<@sect title="Warning!"> -

    Please understand that FMPP, as a bulk file processor, may generates high amount of output files, and <@e>overwrites all files with the same names as the names of output files without warning. It's a practical decision comes from the usage pattern of the tool. So watch where will the output files go.

    - -

    Also note that, according <@a href="license.html">the license, the author does not take responsibly if the usage of FMPP causes harm for you somehow.

    - - -<@sect title="Pre-requirements"> -
      -
    • Java must be installed on your machine (version 1.4 or later). Note that Java is available for free, and on various platforms (Windows, OS X, "Linux", etc.), so FMPP works on many platforms. -
    • If you want to use the FMPP Ant task, you need Ant 1.5.1 or later. If you don't know what's Ant then don't worry, you will not need it. -
    - - -<@sect title="Extracting"> -

    Extract the downloaded archive file (<@c>fmpp_<@r>X.<@r>X.<@r>X.tar.gz or <@c>fmpp_<@r>X.<@r>X.<@r>X.zip) into the directory where you prefer to store FMPP. For Windows users it is typically <@c>C:\fmpp or <@c>C:\Program Files\fmpp, for UN*X users it is typically <@c>~/opt/fmpp or <@c>/opt/fmpp or <@c>/usr/lib/fmpp (where <@c>fmpp is the extracted <@c>fmpp_<@r>X.<@r>X.<@r>X directory after renaming). From now on I will refer to this directory as <@c><@r><FMPP_HOME>.

    - -

    - - - -<@sect title="Setup the command-line tool" anchor="commandLineTool"> - -<@sect title="On Windows"> -

    The steps are:

    -
      -
    1. Extract the downloaded archive file (<@c>fmpp_${pp.version}.tar.gz or <@c>fmpp_${pp.version}.zip) into <@c>C:\Program Files\fmpp (note that "Program Files" may be shown in a localized form, like "Programme") or <@c>C:\fmpp or wherever you prefer to. From now on I will refer to this directory as <@c><@r><FMPP_HOME>
    2. -
    3. For convenience, add <@c><@r><FMPP_HOME>/bin to the <@c>PATH environment variable. (How? Google: set path windows)
    4. -
    5. Check if <@c>fmpp.bat isn't present in <@c>C:\Windows (or in another directory in the <@c>PATH) from an earlier installation. Delete it if it does.
    6. -
    7. Check if the <@c>JAVA_HOME environment variable is set correctly (should point to your Java installation directory, not its <@c>bin subdirectory), or else that the intended version of the <@c>java executable is in the <@c>PATH.
    8. -
    9. To check that everything works, open a command line window and issue: <@c>fmpp --version
    10. -
    - -

    Note: Because of the limitations of <@c>.bat files, you may get error messages as "The input line is too long". To solve this, install FMPP in a more "shallow" directory, so that the path to the FMPP related files will be shorter.

    - - - -<@sect title="On UN*X (Linux, FreeBSD, OS X, etc.)"> -

    The steps are:

    -
      -
    1. Extract the downloaded archive file (<@c>fmpp_${pp.version}.tar.gz or <@c>fmpp_${pp.version}.zip) into the <@c>/usr/lib/fmpp or <@c>/opt/fmpp directory (conventions vary by distribution), or wherever you prefer to. From now on I will refer to this directory as <@c><@r><FMPP_HOME>. -
    2. -
    3. For convenience, create a soft link somewhere in the <@c>PATH, like <@c>sudo ln -s <@r><FMPP_HOME>/bin/fmpp /usr/bin/fmpp.
    4. -
    5. Issue <@c>which fmpp to see if it's not shadowed by an earlier installation elsewhere.
    6. -
    7. Check if the intended version of the <@c>java executable is in the <@c>PATH, or else that the <@c>JAVA_HOME environment variable is set correctly (should point to your Java installation directory, not its <@c>bin subdirectory).
    8. -
    9. To check that everything works, open a command line window and issue: <@c>fmpp --version
    10. -
    - - -<@sect title="Notes"> -
      -
    • If there's a <@c>FMPP_HOME environment variable, it <@c><@r><FMPP_HOME>\bin\fmpp.bat and <@c><@r><FMPP_HOME>\bin\fmpp will use that directory instead of its own grandparent directory.
    • -
    • You can run FMPP without the provided shell scripts directly with the <@c>java command, like <@c>java -jar <@r><FMPP_HOME>/lib/fmpp.jar. (You can also put all required jar-s and class directories into the <@c>CLASSPATH and then issue <@c>java fmpp.tools.CommandLine.) Note though that you will lose console width detection with these approaches.
    • -
    • You can move the jars into the <@c>lib subdirectory of Ant (if you want to use the Ant task anyway). If you do this, the command line tool need Ant be installed on a "standard" location (like <@c>C:\Program Files\ant), or <@c>ANT_HOME must be correctly set.
    • -
    - - - - - -<@sect title="Setup the Ant task"> - -

    If you want to use FMPP as Ant task, copy the required jar files from <@c><@r><FMPP_HOME>/lib into the <@c>lib directory of your Ant installation (issuing <@c>ant install from <@c><@r><FMPP_HOME> will do this for you), or ensure that the jars are in the <@c>CLASSPATH environment variable. Then, whenever you need the FMPP task in a project, add this line to your <@c>build.xml:

    - -<@prg> - -

    And then you can use the <@c><fmpp <@r>...> task. - - - -<@sect title="Installing optional parts and custom extensions"> - -

    For the command-line tool, simply drop the jar file that contains the required classes into the <@c><@r><FMPP_HOME>/lib directory (or, into the Ant <@c>lib directory, if you store <@c>fmpp.jar there only). For the Ant task, either ensure that the required jars are in the <@c>CLASSPATH, or drop the jars into the <@c>lib directory of your Ant installation.

    - - - -<@sect title="Updating FreeMarker" anchor="updatingFreeMarker"> - -

    You can replace the included FreeMarker version with a later version. Download the latest backward compatible FreeMarker release, and overwrite <@c><@r><FMPP_HOME>/lib/freemarker.jar with the <@c>freemarker.jar of the FreeMarker release. (Of course, if you are using the FMPP Ant task, you may need to replace the <@c>freemarker.jar in the <@c>lib directory of the Ant installation too.)

    - - - - \ No newline at end of file diff --git a/fmpp/src/docs/license.html b/fmpp/src/docs/license.html deleted file mode 100644 index e47a362..0000000 --- a/fmpp/src/docs/license.html +++ /dev/null @@ -1,3 +0,0 @@ -<@page title="License" keywords="licence"> -
    ${license?chop_linebreak}
    - diff --git a/fmpp/src/docs/manualtocs_T2.html b/fmpp/src/docs/manualtocs_T2.html deleted file mode 100644 index 6693b36..0000000 --- a/fmpp/src/docs/manualtocs_T2.html +++ /dev/null @@ -1,47 +0,0 @@ -<#-- Generates the Table of Contents pages for the FMPP Manual --> - -<@pp.dropOutputFile/> - -<@generateTocPage manualFiles, true /> - -<#macro generateTocPage seq, mainToc=false> - <#local tocDesc = seq[0]> - <@pp.nestOutputFile name=pp.home+tocDesc.file> - <@page title=tocDesc.title keywords=tocDesc.keywords?if_exists> - <#if tocDesc.preToc??> - <@tocDesc.preToc?interpret /> - - <#if mainToc> - <@recursiveToc seq[1..], 'Table of Contents' /> - <#else> - <@recursiveToc seq[1..], 'Chapter Contents' /> - - <#if tocDesc.postToc??> - <@tocDesc.postToc?interpret /> - - - - - <#list seq as subseq> - <#if subseq?is_sequence> - <@generateTocPage subseq /> - - - - -<#macro recursiveToc seq title=''> - <@toc title> - <#list seq as f> - <#if f?is_sequence> - <@toci href=pp.home+f[0].file title=f[0].title> - <@recursiveToc f[1..f?size - 1] /> - - <#else> - <#if !pp.s.manualFileTitles[f]??> - <#stop "Missing file or file didn't used <@page>: ${f}"> - - <@toci href=pp.home+f title=pp.s.manualFileTitles[f] /> - - - - diff --git a/fmpp/src/docs/overview.html b/fmpp/src/docs/overview.html deleted file mode 100644 index dc56460..0000000 --- a/fmpp/src/docs/overview.html +++ /dev/null @@ -1,111 +0,0 @@ -<@page title="Concepts and Terminology" keywords="overview"> - -

    Read the <@a href="qtour.html">Tutorial before this, otherwise you won't understand this chapter.

    - - -<@sect title="FMPP core and front-ends"> - -

    FMPP consist of the FMPP core, and the front-ends wrapping that. Front-ends provide interface by which you can communicate with the FMPP core. For example the command-line tool (that we have used previously) is a front-end that provides command-line interface. The FMPP Ant task is another front-end that provides Ant task interface. A graphical front-end could be written too. But whatever front-end you use, you (indirectly) use the FMPP core. So most of the documentation is about the FMPP core, which basically encapsulates all abilities of FMPP.

    - -

    Note that the FMPP core wraps FreeMarker, the template engine.

    - -

    For more info see <@a href="writefrontend.html">the chapter about writing front-ends.

    - - - - -<@sect title="Settings" anchor="settings"> - -

    Settings are variables that describe for the FMPP core what and how to do. Examples of settings you have already met: <@s>sourceRoot, <@s>outputRoot, <@s>data. Front-ends basically do nothing else, just set the settings of the core, and then "trigger" the core to do the job. So if you know <@a href='settings.html'>all settings, then basically you know everything FMPP can do.

    - -

    It's a good practice to store the settings of your project in <@a href='configfile.html'>configuration files (as <@c>config.fmpp was). As the FMPP core understand them, you can use them with all front-ends. Configuration files use a simple FMPP specific language, <@a href='tdd.html'>TDD.

    - - - - -<@sect title="File processing and related terms"> - -

    <@e>Processing a file is the act of the generation of the output file (or files) based on a source file. This may means the execution of the file as FreeMarker template, or binary-copying the file, processing the file as XML, or, in extreme case, create no output the file (say, for a <@c>.bak file). The path of the output file relatively to the <@s>outputRoot will be the same as the path of the corresponding source file relatively to the <@s>sourceRoot (at least initially; the template can change the output file path on-the-fly).

    - -

    Term <@e>processing mode refers to how a certain file is processed. In the Quick Tour, the HTML files were processed in "execute" mode, and the image file was processed in "copy" mode. You can find all details about processing modes <@a href='settings.html#processingMode'>here.

    - -

    <@e>Processing session: This is the course of batch processing the (selected) files of the source directory. For example, all <@c>fmpp call in the Quick Tour did a processing session.

    - -

    Strictly speaking, FMPP only processes files, not directories. It looks for source files in the sub-directories of the source root directory recursively, and when an output file has to be created, its missing parent directories will be created automatically. Any setting that deals with processing things is applicable only to files, not to directories (with some exceptions, like <@s>alwaysCreateDirectories).

    - -

    FMPP doesn't use the term "processing" for data files like <@c>data/style.tdd or <@c>data/birds.csv was in the tutorial. A data file isn't processed like a template file (or an image file), it does not produce output file itself. Instead, it can be loaded into a variable for later usage in templates.

    - - - - -<@sect title="Data, data loader" anchor="data"> - -

    In FMPP context <@e>data means data coming from data sources as XML file, CSV file, MySQL database, etc. In the Quick Tour, <@c>data/style.tdd and <@c>data/birds.csv are data files. Files that are processed to produce output files, as the HTML-s and the image are not data files.

    - -

    The FreeMarker templates see the "data" as variables. This set of variables is called <@e>the data model with FreeMarker terminology. The data model is shared, visible for all templates. During output generation the template may creates new variables for temporary calculations, but those variables are not part of the data model, and will gone when the template execution is finished. Templates can't modify the data model, so all templates get the same data model, which was filled with the <@s>data setting at the very beginning of the processing session.

    - -

    <@e>Data loaders are objects that load and interpret data from certain type of data source, so FMPP can expose the data as variables for the templates. For example, in the Quick Tour we have used data loader <@c>csv that interprets CSV files. When the data source is file based, you use paths as data <@c>data/birds.csv. Relative paths are relative to the directory dictated by the <@s>dataRoot setting, which is be default the same as <@s>sourceRoot. Data loaders are described in more details <@a href="dataloader.html">here.

    - - - - -<@sect title="The pp hash"> - -

    The data model always contains a <@a href="#hash">hash with name <@c>pp (stands for PreProcessor). This hash contains directives and methods and other variables that templates can use to control output generation, do path calculations, and do various other FMPP specific operations. You can find the description of the <@c>pp hash <@a href="pphash.html">here.

    - - - - -<@sect title="Virtual paths" anchor="virtualPath"> - -

    FMPP works with 3 file systems: the real file system, and 2 virtual file systems:

    -
      -
    • <@e>source file system: The root directory of this file system is the <@s>sourceRoot directory. Template files usually see this file system, as when they <@c><#include <@r>...> other template files. All files that FMPP processes must be inside this file system, thus inside the source root directory.
    • - -
    • <@e>output file system: The root directory of this file system is the <@s>outputRoot directory. In templates, directives that control output file names and paths (as <@c><@pp.changeOutputFile <@r>...>) use this file system. It is guaranteed that all output files will be inside this file system, thus inside the output root directory.
    • -
    - -

    Most directives/methods in templates that require path parameters use one of the virtual file systems. These paths are called <@e>virtual paths. Virtual paths always use UN*X style format, so they always use slash (<@c>/), not back-slash (<@c>\). Absolute virtual paths (as <@c>/foo/bar) always start from the virtual file system root (not from the root of the real file-system). You can't leave this root, not even with tricky path as <@c>/... Relative virtual paths (as <@c>foo/bar or <@c>../foo/bar) are resolved relatively to:

    -
      -
    • If they are used in built-in FreeMarker directives (as <@c><#include <@r>...> or <@c><#import <@r>...>): the directory of the currently executing template.
    • -
    • If they are used in other directives to refer to source files: the directory of the currently processed source file.
    • -
    • If they are used in directives to refer to output files: the directory of the currently written output file.
    • -
    - -

    Note that the <@s>dataRoot setting (used by data loaders) just specifies a base directory, not a virtual file system root. So you can leave it with <@c>..-s.

    - - - - -<@sect title="Real paths" anchor="realPath"> - -

    Paths that navigate in the real file system (not in a <@a '#virtualPath'>virtual file systems) are called <@e>real paths. Real paths always use the native path format of the host operating system. However, Windows users can and should use slash (<@c>/) instead of backslash (<@c>\), to keep UN*X compliance, and to avoid escaping issues.

    - -

    Real paths are used in these cases:

    -
      -
    • For setting values that store a path (or paths), such as <@s>sourceRoot and <@s>outputRoot. Relative paths in these settings are resolved relatively to the, so called, <@e>configuration base (unless explicitly stated otherwise for a certain setting). If the setting value comes from a configuration file, then it is the directory that contains the configuration file (however, this can be overridden with the <@s>configurationBase setting). If the value comes from other source (such as from a command-line argument), then the front-end specifies what the configuration base is for that setting value (see the documentation of the front-end). - -
    • For data loaders that load files, as <@c>csv(data/birds.csv). If the path is relative, then it is relative to the <@s>dataRoot, which defaults to the <@s>sourceRoot. Note that the usage of <@c>/ instead of the native path separator (as backslash) is always allowed and recommended here. - -
    • As the parameter to some <@c>pp directives/methods that explicitly state this. -
    - -

    In other cases FMPP uses <@a href="#virtualPath">virtual paths. - - - - -<@sect title="Adopted FreeMarker type names"> - -

    FMPP adopts some of FreeMarker's terms regarding the type names, to decrease confusion:

    -
      -
    • String: text. -
    • Boolean: logical value. It can be <@c>true or <@c>false. -
    • Number: Number... maybe decimal, maybe whole. You often will also see term "integer", which means whole number. -
    • <@e>Sequence: You may know this with name list, or array, or vector. It is a list of values of any type. The items in the list are indexed with integers, starting from 0. -
    • <@anchor id="hash" /><@e>Hash: You may know this with name dictionary, or map, or associative array. This is a set of name-value pairs. The names are unique strings in the hash, so they identify the values associated with them. As it used to be said, they are "keys". -
    - - - - diff --git a/fmpp/src/docs/pathpattern.html b/fmpp/src/docs/pathpattern.html deleted file mode 100644 index 3325fb1..0000000 --- a/fmpp/src/docs/pathpattern.html +++ /dev/null @@ -1,18 +0,0 @@ -<@page title="Path Patterns" keywords="Path Pattern"> - -

    Probably you have already used commands like <@c>dir *.txt (or <@c>ls *.txt on UN*X). This lists all files in the current directory where the name of the file ends with <@c>.txt. The <@c>*.txt stuff is called a path pattern.

    - -

    With FMPP you also use path patterns to select certain files, say, in the <@s>modes setting, to tell FMPP which files to copy as is, and which files to execute as template. A path pattern looks like a path, but it can contain some special parts:

    -
      -
    • <@c>*: matches zero or more characers, except slash (<@c>/). For example <@c>a*c matches to <@c>abc, <@c>axyzc and <@c>ac, but not <@c>a/c. -
    • <@c>?: matches exactly one characer, except slash (<@c>/). For example <@c>a?c matches to <@c>abc, but not <@c>axyzc or <@c>ac or <@c>a/c. -
    • <@c>**: This matches zero or more directories of the path. For example <@c>a/**/c matches to <@c>a/b/c, <@c>a/b/xyz/c and <@c>a/c. Another example: <@c>**/*.gif matches to <@c>foo.gif, <@c>a/foo.gif and , <@c>a/b/foo.gif. Also, if you use <@c>** at the end of the pattern, then it match with all file names as well. Thus, <@c>foo/** will match all files inside <@c>foo, such as <@c>foo/bar.txt or <@c>foo/sub/bar.txt. Furthermore, if the pattern ends with <@c>/, then it is considered as shorthand for <@c>/**, so <@c>foo/ is the same as <@c>foo/**. -
    - -

    If your operating system use something else instead of <@c>/ (as <@c>\ on Windows), FMPP will internally convert the native paths to UN*X format, so do not worry about this. Just use slash in the patterns. (Or, in fact, you can even use the native "slash" in patterns, just it is not a good practice in general.)

    - -

    Note that pattern as <@c>*.gif will match only the GIF files in the current directory. If you want to match all GIF files of the subdirectories (and sub-subdirectories, etc.) as well, use <@c>**/*.gif. - -

    The meaning of "current directory" in FMPP depends on the concrete situation where you use the path. In most cases where you will use path patterns (as with the <@s>modes setting) it will be the source root directory. Also, the meaning of "root directory" is depends on where you use the path. That is, absolute path <@c>/foo.txt maybe means <@c>foo.txt in the source root directory (this is the typical), or in the output root directory, or in the real root directory of the file system, etc.

    - - diff --git a/fmpp/src/docs/pphash.html b/fmpp/src/docs/pphash.html deleted file mode 100644 index 90c5a4c..0000000 --- a/fmpp/src/docs/pphash.html +++ /dev/null @@ -1,549 +0,0 @@ -<@page title="The pp Hash" keywords="pp hash"> - -

    The pp hash is a variable that is always present in the data model. This contains the built-in, standard variables of FMPP.

    - -<@note>For more information about variable types, directives, etc. in general, please read the <@fma href="index.html">FreeMarker Manual. - -<@sect title="Information about the source"> - -<@variable name="sourceFile" type="string"> -

    The path of the current source file (includes the file name), relatively to the source root directory. It does not start with slash. Uses UN*X path format.

    - - - -<@variable name="sourceDirectory" type="string"> -

    The path of the directory of the current source file, relatively to the source root directory. It is finished with a slash, except if the directory is the source root directory itself, in which case the result is an empty (0 length) string. The result never starts with slash. Uses UN*X path format.

    - - -<@variable name="sourceFileName" type="string"> -

    The filename of the current source file.

    - - -<@variable name="sourceEncoding" type="string"> -

    The encoding (charset) of the source file, e.g. <@c>ISO-8859-1. It is always a concrete charset name, never <@c>host.

    - - -<@variable name="sourceRoot" type="string"> -

    The absolute real path of the source root directory, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - -<@variable name="realSource" type="string"> -

    The absolute real path of the current source file. As it is a real path, it uses the native path format.

    - - -<@variable name="realSourceDirectory" type="string"> -

    The absolute real path of the directory of the current source file, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - - -<@sect title="Information about the output"> - -

    Note that as the output file name and directory, and the output encoding can be changed during the execution of template, the value of these variables can change during the execution of the template, to reflect the current situation.

    - -<@variable name="outputFile" type="string"> -

    The path of the current output file (includes the file name), relatively to the output root directory. It does not start with slash. Uses UN*X path format.

    - - -<@variable name="outputDirectory" type="string"> -

    The path of the directory of the current output file, relatively to the output root directory. It is finished with a slash, except if the directory is the output root directory itself, in which case the result is an empty (0 length) string. The result never starts with slash. Uses UN*X path format.

    - - -<@variable name="outputFileName" type="string"> -

    The filename of the current output file.

    - - -<@variable name="outputEncoding" type="string"> -

    The encoding (charset) of the output file, e.g. <@c>ISO-8859-1. It is always a concrete charset name, never <@c>host or <@c>source.

    - - -<@variable name="outputRoot" type="string"> -

    The absolute real path of the output root directory, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - -<@variable name="realOutput" type="string"> -

    The absolute real path of the current output file. As it is a real path, it uses the native path format.

    - - -<@variable name="realOutputDirectory" type="string"> -

    The absolute real path of the directory of the current output file, finished with a "native slash" (i.e. maybe a backslash). As it is a real path, it uses the native path format.

    - - - - - -<@sect title="Changing the output file"> - -<@variable name="changeOutputFile" type="directive"> - <@param name="name" type="string"> - The new <@a href="overview.html#virtualPath">virtual path of the output file. The path can point into a different directory than the directory of the current output file. - - <@param name="append" type="boolean" default="false"> - If this is true, then if a file with the same name as the name of the new output file already exists, it will be continued, rather then overwritten. If the file does not already exist, then this parameter has no effect. - - -

    Closes the current output file, and starts a new output file with the new name. All further output goes into the new file. If the name of the new output file is the same as the current output file, then nothing happens.

    - -

    A word of warning: Don't forget that the path that you specifiy is interpreted relatively to the <@e>current output file. So using a relative path like <@c>products/${'$'}{productName}.html ( instead of an absolute path like <@c>/shop/products/${'$'}{productName}.html) inside a loop is most certainly not what you want, because then 2nd product will go into the <@c>/shop/products/products/${'$'}{productName}.html directory, the 3rd into <@c>/shop/products/products/products/${'$'}{productName}.html, and so on. Of course this problem doesn't occur if the relative path is just a file name, like <@c>${'$'}{productName}.html.

    - - -<@variable name="renameOutputFile" type="directive"> - <@param name="name" type="string" optional=true> - The new <@a href="overview.html#virtualPath">virtual path of the output file. The path can point into a different directory than the directory of the current output file. - - <@param name="extension" type="string" optional=true> - Replaces the extension (the part after the last dot in the file name) of the current output file, with the value of this parameter. If the file name has no extension (there is no dot in it), then a dot and the new extension is added to the end of the file name. (The parameter value should never contain the starting dot.) - - -

    Changes the name of the current output file, or moves the output file if neccessary. If a file with the same name already exists, this will overwrite that file without warning. If the new name is the same as the name of the current output file, then nothing happens.

    - -

    Either the <@c>name or the <@c>extension parameter must be specified. You can't use both together. - - -<@variable name="dropOutputFile" type="directive"> -

    Deletes the current output file, and drops all further output that would go into this file. Call this directive at the beginning of templates that need to be processed, but you don't want any output files from them. (Of course, you can call this directive even at the end of the template, just that's slower...)

    -

    Note that this directive can be neutralized with directive <@c>pp.restartOutputFile.

    - - -<@variable name="restartOutputFile" type="directive"> -

    Empties the current output file (but doesn't delete the file). The next character sent to the output will be the first character of the output file. Also, the charset of the output file can be safely set, exactly like if you were at the beginning of the output file creation.

    -

    Note that this directive neutralizes the effect of directive <@c>pp.dropOutputFile.

    - - -<@variable name="nestOutputFile" type="directive" nestedContent=true> - <@param name="name" type="string"> - The new <@a href="overview.html#virtualPath">virtual path (includes the file name) of the output file. The path can point into a different directory than the directory of the current output file. - - <@param name="append" type="boolean" default="false"> - If this is true, then if a file with the same name as the name of the new output file already exists, it will be continued, rather then overwritten. If the file does not already exist, then this parameter has no effect. - - -

    This is similar to <@c>changeOutputFile, but it writes only the content generated in its nested content into the new file, and then it restores things, so the output will go into the same output file as before the calling of the directive. For example:

    - - <@prg><#noparse> -The 1st line of the original file. -<@pp.nestOutputFile name="new.txt"> - The 1st line of new.txt. - -The 2nd line of the original file. -<@pp.nestOutputFile name="new.txt" append=true> - The 2nd line of new.txt. - -The 3rd line of the original file. - - -

    A file can be nested into itself. For example:

    - - <@prg><#noparse> -<@pp.nestOutputFile name='1.txt'> - The 1st line of 1.txt - <@pp.nestOutputFile name='2.txt'> - The 1st line of 2.txt - <@pp.nestOutputFile name='1.txt'> - The 2nd line of 1.txt - - The 2nd line of 2.txt - - The 3rd line of 1.txt - - - -

    Note that <@c>append=true was not needed for adding the 2nd line to the <@c>1.txt, since the directive just switched back to the already opened <@c>1.txt.

    - - - -<@variable name="setOutputEncoding" type="directive"> - <@param name="encoding" type="string"> - The name of the charset, e.g. <@c>ISO-8859-2. It understands the special values <@c>source and <@c>host. - - -

    Sets the encoding of the output. This will die with error if the output file is already partially written to the disk. Thus, if you want to change the output encoding, do it as early as possible. FMPP buffers the output for the output file in the memory until the buffer size reaches 160 characters, but after that it starts to flush the buffer to the disk. Also, directives that change the current output file may flush the buffer. When you start a new file (say, with <@c>changeOutputFile), it starts a new buffer in the memory, so you can set the encoding of the new file.

    - - - - - -<@sect title="Utilities for paths"> - -<@variable name="pathTo" type="method" result="string"> - <@param name="destination" type="string"> - The <@a href="overview.html#virtualPath">virtual path in the output file system to the destination file or directory. The destination file or directory need not exist. - - -

    This method returns the relative virtual path that leads from the directory of the current output file, to the destination file or directory. For example, if you want to create a link that points to <@c><@r><outputroot>/products/index.html, then you can write:

    - - <@prg><#noparse> -Product index - - -

    and the link will always point to that file, does not mater where the file that contains the above link is.

    - -

    The returned path never starts with <@c>/; it is always a relative path.

    - -

    If the destination path is finished with slash, then, and only then, the resulting path will be also finished with slash, except if the only character in the result would be that slash, in which case the result will be an empty (0 length) string instead.

    - - - -<@variable name="home" type="string"> -

    Same as what <@c>pp.pathTo('/') would return. That is, the virtual path to the output root directory, from the current output file. It is finished with a slash, except if the current output file is directly in the output root directory, in which case the result is an empty (0 length) string. The result never starts with slash. So the possible values are something like: <@c>../../

    - -

    Example: The <@c>src will always point to the file in the <@c>img directory of the output root, does not mater if you move the HTML file in the directory hierarchy:

    - - <@prg><#noparse> -Logo - - - -<@variable name="outputRootRelativePath" type="method" result="string"> - <@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual output path to convert. The output file pointed by the path need not exist. - -

    Converts a virtual output path to a virtual output path that is relative to the output root directory. The resulting path will not start with slash.

    - - -<@variable name="sourceRootRelativePath" type="method" result="string"> - <@param name="file path" type="string"> - Same as the parameter of <@a href="#key_outputRootRelativePath">outputRootRelativePath, but it uses the the source file system. - -

    Same as <@a href="#key_outputRootRelativePath">outputRootRelativePath, but it uses the source root directory and the current source file respectively.

    - - -<@variable name="sourcePathTo" type="method" result="string"> - <@param name="destination" type="string"> - Same as the parameter of <@a href="#key_pathTo">pathTo, but it uses the source file system. - -

    Same as <@a href="#key_pathTo">pathTo, but it uses the source root directory and the current source file respectively.

    - - -<@variable name="slash" type="string"> -

    The platform dependent slash character used in native paths. This will be backslash (<@c>\) on Windows.

    - - -<@variable name="urlEnc" type="method" result="string"> - <@param name="string to encode" type="string"> - The string to encode. - - -

    <@e>Deprecated: use the <@c>url built-in of FreeMarker instead. For example: <@c><#noparse>${"a+b/c"?url}.

    - -

    Encodes a string with URL encoding. For example the result of <@c>pp.urlEnc("a+b/c") will be <@c>a%2Bb%2Fc, if the output charset is an US-ASCII based charset.

    - - -<@variable name="urlPathEnc" type="method" result="string"> - <@param name="string to encode" type="string"> - The string to encode. - - -

    Same as FreeMarker's <@c>url built-in (<@c>?url), except that it does not encode slash characters. For example the result of <@c>pp.urlPathEnc("new products/bálna.html") will be <@c>new%20products/b%E1lna.html, if the output charset is ISO-8859-1.

    - - - - - -<@sect title="Utilities for files"> - -<@variable name="sourceFileSize" type="method" result="number"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the source file system. - - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - -<@variable name="sourceFileLastModified" type="method" result="date (date+time)"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the source file system. - - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - -<@variable name="sourceFileExists" type="method" result="boolean"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the source file system. - - -

    Tells if the file exists or not.

    - - -<@variable name="outputFileSize" type="method" result="number"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the output file system. - - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - -<@variable name="outputFileLastModified" type="method" result="date (date+time)"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the output file system. - - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - -<@variable name="outputFileExists" type="method" result="boolean"> -<@param name="file path" type="string"> - The <@a href="overview.html#virtualPath">virtual path of the file in the output file system. - - -

    Tells if the file exists or not.

    - - -<@variable name="realFileSize" type="method" result="number"> -<@param name="file path" type="string"> - The real path (native path) of the file. The file can be outside all root directories. FMPP passes the resolving of relative paths to the host OS, so it is not defined by FMPP what the end result will be. In general, it is better to use absolute paths here.
    - <@e>Windows users: According to the syntactical rules of FTL, you must use double backslashes in string literals: <@c>"C:\\work\\foo\\bar.txt", or use raw strings: <@c>r"C:\work\foo\bar.txt". Also, according to the Windows API rules, you can simply use slash: <@c>"C:/work/foo/bar.txt", which is probably the best solution. - - -

    Returns the size of the file in bytes. If the file does not exist, it returns 0.

    - - -<@variable name="realFileLastModified" type="method" result="date (date+time)"> -<@param name="file path" type="string"> - The real path (native path) of the file. The rules are the same as with <@a href="#key_realFileSize">realFileSize. - - -

    Tells the last modification date+time of file. If the file does not exist, it raises an error.

    - - -<@variable name="realFileExists" type="method" result="boolean"> -<@param name="file path" type="string"> - The real path (native path) of the file. The rules are the same as with <@a href="#key_realFileSize">realFileSize. - - -

    Tells if the file exists or not.

    - - - - - - -<@sect title="Writable hashes and sequences"> - -

    Writable sequences and hashes are an FMPP specific extension to FreeMarker, as FreeMarker does not support the modification of sequences and hashes. (This has good reasons in the on-the-fly dynamic page generation segment that FreeMarker mostly targets, but it can be a problem in extreme FreeMarker applications as FMPP.) To read the variables of these sequences and hashes, you can use the same expressions as with plain sequences and hashes. But, to modify the contents of them, you have to use the directives described below, since predefined directives as <@c><#assign <@r>...> can't modify subvariables. Unfortunately, sequence addition, sub-sequence operator (like <@c>seq[5..10]) and <@c>?reverse do not copy the original sequence, just wraps it (for efficiency), so the resulting sequence will change if the original sequence is changed later (this is basically an abnormal aliasing effect). The same problem exists with the result of hash addition; it just wraps the two hashes, so the resulting hash will magically change if you modify the hashes you have added earlier. As a work-around, after you did the above problematic operations, either be sure you will not modify the objects that were used as input, or create a copy of the result like: <@c><#assign b = pp.newWritableSequence(a[5..10])> and <@c><#assign c = pp.newWritableHash(hashA + hashB)>). Of course this is easy to miss... so rather try to build the data model so you will not need to modify collections. Keeping templates simple and moving complex calculations out to custom <@a href='dataloader.html'>data loaders or BeanShell scripts (see the <@c>bsh function of <@s>localData <@a href='settings.html#data'>here...) is advisable anyway.

    - -

    Note that only the sequences that were made with the <@c>newWritableSequence method are writable. Also, only the hashes that were made with the <@c>newWritableHash method are writable. You can't modify plain sequences or hashes with the below directives.

    - -

    Also note that writable sequences and hashes suffer from the effect called aliasing (that most programmers will find natural). This effect, explained with an example, looks like this:

    - -<@prg><#noparse> -<#assign a = pp.newWritableSequence()> -<@pp.add seq=a value="red" /> -<#assign b = a> -<@pp.add seq=b value="green" /> -a: <#list a as i>${i} -b: <#list b as i>${i} - - -

    Here the output will be:

    - -<@prg> -a: red green -b: red green - - -

    That is, FreeMarker variables just store a reference (pointer) to the sequence or hash, not the sequence or hash itself. So both <@c>a and <@c>b points to the same single sequence object, which floats somewhere in the memory. This fact becomes significant because you modify that object, otherwise you wouldn't notice it. To create individual copies, use <@a href="#key_newWritableSequence"><@c>newWritableSequence or <@a href="#key_newWritableHash"><@c>newWritableHash, for example:.

    - -<@prg><#noparse> -<#assign a = pp.newWritableSequence()> -<@pp.add seq=a value="red" /> -<#assign b = pp.newWritableSequence(a)> -<@pp.add seq=b value="green" /> -a: <#list a as i>${i} -b: <#list b as i>${i} - - -

    Here <@c>b is a new sequence whose initial content is the same as the content of <@c>a. Thus, the output will be:

    - -<@prg> -a: red -b: red green - - -<@variable name="newWritableSequence" type="method" result="writable sequence"> -<@param name="initial content" optional=true type="sequence" /> -

    Creates a new empty writable sequence. However, if called with parameter then adds the items in the parameter sequence to this new sequence (known as "shallow copy" among programmers). Example:

    - -<@prg><#noparse> -<#assign a = pp.newWritableSequence()> -<#assign b = pp.newWritableSequence(['red', 'green', 'blue'])> -${a?size} -${b?size} - - -

    The output will be:

    - -<@prg><#noparse> -0 -3 - - - - -<@variable name="newWritableHash" type="method" result="writable hash"> -<@param name="initial content" optional=true type="hash" /> -

    Creates a new empty writable hash. However, if called with parameter then adds the items in the parameter hash to this new hash (known as "shallow copy" among programmers). Example:

    - -<@prg><#noparse> -<#assign a = pp.newWritableHash()> -<#assign b = pp.newWritableHash({'red':'FE0000', 'green':'10F000', 'blue':'0007FF'})> -${a?size} -${b?size} - - -

    The output will be:

    - -<@prg><#noparse> -0 -3 - - - -<@variable name="copyWritable" type="method" result="writable hash or writable sequence" deprecated='Use <@a href="#key_newWritableSequence"><@c>newWritableSequence and <@a href="#key_newWritableHash"><@c>newWritableHash instead.'> -

    Copies a writable hash or sequence. (It is used to prevent aliasing effect. The result is a "shallow copy" of the original hash or sequence.)

    - - -<@variable name="add" type="directive"> - <@param name="seq" type="writable sequence">The sequence to modify. - <@param name="index" type="number" default="seq?size">The index where you want to insert the subvariable into the sequence. The index of the first subvariable is 0. - <@param name="value" type="any">The new value of the subvariable. - -

    Inserts a new subvariable into the sequence, at the specified index. Shifts the subvariable currently at that position (if any) and any subsequent subvariables to the right (adds one to their indices). If you do not use the <@c>index parameter, or if its value is 1 higher than the index of the last subvariable, then it appends the new subvariable at the end of the sequence.

    - - -<@variable name="set" type="directive"> - <@param name="seq" type="writable sequence">The sequence to modify. - <@param name="index" type="number">The index of subvariable to set. The index of the first subvariable is 0. - <@param name="hash" type="writable hash">The hash to modify. - <@param name="key" type="string">The name of the subvariable that you want to add to the hash, or that you want to replace. - <@param name="value" type="any">The value of the new subvariable. - -

    This can be used for two purposes, depending on if you use the <@c>seq or the <@c>hash parameter:

    -
      -
    • For sequences: Sets an already existing subvariable of the sequence or hash. The index must be the index of an existing subvariable, or an error will occur. - -
    • For hashes: Adds a new subvariable to the hash with the name specified with the <@c>key parameter, or replaces the subvariable with the same name if that already exists. -
    - - - -<@variable name="remove" type="directive"> - <@param name="seq" type="writable sequence">The sequence to modify. - <@param name="index" type="number">The index of the subvariable to remove. - <@param name="hash" type="writable hash">The hash to modify. - <@param name="key" type="string">The name of the subvariable that you want to remove from the hash. - -

    This can be used for two purposes, depending on if you use the <@c>seq or the <@c>hash parameter:

    -
      -
    • For sequences: Removes the subvariable on the specified index, and shifts any subsequent subvariables to the left (subtracts one from their indices). The <@c>index must denote an existing subvariable, or an error will be raised. - -
    • For hashes: Removes the subvariable with the name specified with the <@c>key parameter, or does nothing if no such subvariable exists. -
    - - -<@variable name="clear" type="directive"> - <@param name="seq" type="writable sequence">The sequence to clear. - <@param name="hash" type="writable hash">The hash to clear. - -

    Removes all subvariables of the sequence or hash.

    - - - - - -<@sect title="Miscellaneous"> - -<@variable name="warning" type="directive"> - <@param name="message" type="string">The warning message. - -

    Issues a warning message. It depends on the concrete front-end in use and the settings, but usually the message will be displayed on the screen and/or will be added to the log file. The processing will not stop if you issue a warning. To stop processing with error message you should use <@c><#stop "<@r>message">.

    - - -<@variable name="ignoreOutput" type="directive" nestedContent=true> -

    All text generated inside the nested content of this directive will be thrown away.

    - - -<@variable name="locale" type="string"> -

    The currently used locale in the usual format. For example: <@c>ar_SA, <@c>ar_IQ, <@c>en_US, <@c>en_UK, <@c>es_ES, ...etc. - - -<@variable name="loadData" type="method" result="any" anchor="loadData"> - <@param name="loader name" type="string"> - The name of the data loader. - - <@param name="arguments..." type="any"> - The arguments to the data loader. These are 0 or more arguments. - - -

    Loads data using <@a href="dataloader.html">data loaders, and returns the loaded data as the result of the method call. For example this:

    - - <@prg><#noparse> -<#assign foo = pp.loadData('csv', 'foo.txt', {'separator':',', 'encoding':'UTF-8'})> - - -

    does something similar as when you use the below in an FMPP configuration file:

    - - <@prg> -data: {foo:csv(foo.txt, {separator:',', encoding:UTF-8})} - - -

    The difference is that with the <@c>pp.loadData, you load the data on demand, and into a temporary variable that will be available only for a single template processing.

    - -

    The <@c>get data loader can't be invoked with this method. - - -<@variable name="now" type="date (date+time)"> -

    Returns the current date and time.

    - -

    For example this:

    - - <@prg><#noparse> -Current date and time: ${pp.now} -Current time: ${pp.now?time} -Current date: ${pp.now?date} -Current day of week: ${pp.now?string("EEEE")} -<#setting datetime_format="yyyy-MM-dd HH:mm:ss zzzz"> -Current date and time: ${pp.now} - - -

    will output something like this:

    - - <@prg> -Current date and time: Apr 12, 2003 5:28:50 PM -Current time: 5:28:50 PM -Current date: Apr 12, 2003 -Current day of week: Saturday -Current date and time: 2003-04-12 17:28:50 Central European Summer Time - - -

    For more information about using date/time values, please read the <@fma>FreeMarker Manual.

    - - -<@variable name="sessionStart" type="date (date+time)"> -

    Returns the date and time of the processing session starting.

    - - -<@variable name="s" type="writable hash"> -

    Stands for "shared". This is a writable hash that keeps its content during the whole processing session. That is, if you add a subvariable to it during the execution of a template, then that subvariable will be visible for all templates processed later in the same session. An example of the usage of <@c>pp.s can be found in <@example 'session' />

    - - -<@variable name="doc" type="node"> -

    This variable exists only while an XML file is processed in <@c>renderXml processing mode (see the documentation of the <@s>modes setting). This variable stores the source file (the XML file) as a node variable that corresponds to the W3C DOM document object.

    - -

    An example that uses <@c>renderXml processing mode and <@c>pp.doc is <@example 'xml_rendering' />

    - - -<@variable name="version" type="string"> -

    This is the version number of the FMPP engine.

    - - -<@variable name="freemarkerVersion" type="string"> -

    This is the version number of the FreeMarker the FMPP engine currently uses.

    - - - - - - diff --git a/fmpp/src/docs/properties.html b/fmpp/src/docs/properties.html deleted file mode 100644 index 6fc86ee..0000000 --- a/fmpp/src/docs/properties.html +++ /dev/null @@ -1,64 +0,0 @@ -<@page title='"Properties" Files' keywords="properties"> - -

    This is a standard format widely used in the Java world to specify set of name-value pairs, where all name is unique (a key).

    - -

    Name-value pairs are specified with <@c><@r>name=<@r>value format, and each such pair is in its own line. For example:

    - -<@prg> -bgColor=blue -textColor=white -copyright=Copyright (c) 2003, Big Joe All rights reserved. - - -

    If the last character on the line is backslash (<@c>\), then the next line is treated as a continuation of the current line; the <@c>\ and line break are simply discarded, and any leading whitespace (space, tab, etc.) characters on the continuation line are also discarded and are not part of the value. It is useful if the line would be too long for conveniently reading/editing it:

    - -<@prg> -copyright=Copyright (c) 2003, \ - Big Joe \ - All rights reserved. - - -

    Note that if you accidentally put a space after the <@c>\, then it will not work.

    - -

    In the name or value, Java language escape sequences <@c>\t, <@c>\n, <@c>\r, <@c>\f, <@c>\\, <@c>\", <@c>\', and <@c>\u<@r>xxxx are recognized and converted to single characters. Any other escape sequence will be converted to the character after the backlash (e.g. <@c>\x will be converted to <@c>x). Note that because of the special meaning of backslash, to put a backslash into the name or value, you have to write two backslashes (<@c>\\).

    - -<@prg> -aNativeWindowsPath=C:\\My Documents\\test -someText=First line\nSecond line\nThrid line - - -

    Whitespace is ignored after and before the <@c>=, so you can write:

    - -<@prg> -bgColor = blue -textColor = white - - -

    Alternatively, you can use colon or just whitespace to separate the name and value:

    - -<@prg> -bgColor: blue -textColor white - - -

    Thus, if the name contains <@c>=, <@c>: or whitespace, it must be escaped:

    - -<@prg> -this\ is\ the\ name = something -C\: = /mnt/win - - -

    Empty lines of the file, and the lines that start with <@c># or <@c>!, will be ignored. This can be used for commenting:

    - -<@prg> -# colors -bgColor=blue -textColor=white - -# other text -copyright=Copyright (c) 2003, Big Joe All rights reserved. - - -

    "properties" files always use ISO-8859-1 charset. If you have to enter a character that is not in the ISO-8859-1 repertoire, you have to use the <@c>\u<@r>xxxx escape (where <@c><@r>xxxx is the hexadecimal UCS code of the character).

    - - diff --git a/fmpp/src/docs/qtour.html b/fmpp/src/docs/qtour.html deleted file mode 100644 index 9da7d7b..0000000 --- a/fmpp/src/docs/qtour.html +++ /dev/null @@ -1,158 +0,0 @@ -<@page title="Tutorial" keywords="tutorial"> - -

    This chapter is a quick, practical, but rough introduction to FMPP.

    - -<@sect title="Step 1: Process a directory"> - -

    The basic idea is that you have <@e>source root directory and an <@e>output root directory. The source root directory contains the files to process, and the output root directory will contain the processed files. Processing the file either means that FMPP will execute the file as FreeMarker template, or that it will copy the file as is (in the case of image files, archive files, etc.). (In fact there are other seldom used processing modes as well, like <@a href="settings.html#xmlRendering">XML rendering.)

    - -

    To see an example, go to the <@example 'qtour_step1' /> directory. Here we have a directory called <@c>src:

    - -

    <@figure src="qtour_step1_src.png" alt="Quick tour step 1 src" />

    - -

    Also, you will find <@c>config.fmpp in the <@c>qtour_step1 directory. This file contains the settings for FMPP, and now contains this:

    - -<@prg> -sourceRoot: src -outputRoot: out - - -

    If you issue <@c>fmpp command from the command-line while you are in the <@c>qtour_step1 directory, then FMPP will process the <@c>src directory and places the output into the <@c>out directory. On the console you will see something like:

    - -<@prg> -Note: Using the config.fmpp in the working directory. -- Executing: index.html -- Copying: falcon.png -- Executing: subdir\something.html - -*** DONE *** - -2 executed + 1 copied = 3 processed -0 failed, 0 warning(s) -Time elapsed: 0.234 seconds - - -

    and the newly created <@c>out directory will contain exactly the same files and subdirectories as <@c>src. - -

    <@figure src="qtour_step1.png" alt="Quick tour step 1 diagram" />

    - -

    The above messages suggest that the PNG file was copied, while the two HTML-s were executed:

    -
      -
    • "Copying" means that the file is copied as is, without changing even a bit compared to the original file (binary copy). -
    • "Executing" means that the file is interpreted by FreeMarker as template file, and the content of the output file is generated by FreeMarker. Template files are plain text files that can contain special parts, which are instructions to FreeMarker. Since in this first example the HTML files don't contain any such special parts, the output files will be identical to the original HTML-s. -
    - - - -<@sect title="Step 2: Pulling data from a data source"> - -

    If you look into the two HTML-s of <@c>qtour_step1/src, you see that both contains this line:

    - -<@prg> - -

    Assume you want to store these colors in a single centralized place, so if you change them, all pages will change. For this, you have to tell FMPP what <@e>data to expose for the templates. For now, tell FMPP to load data from a TDD file. A TDD file is a simple text file that stores name-value pairs. (It happens to be the same format that <@c>config.fmpp uses, but it's just accidental coincidence. You could load data from other type of data source in the same way.) If you go to the <@example 'qtour_step2'/> directory, you will find <@c>style.tdd in <@c>src/data that contains this:

    - -<@prg> -bgColor: #FFFFE0 -textColor: #000000 - - -

    Both line in both HTML-s has been changed to:

    - -<@prg><#noparse> - - - -

    The two <@c>${"$"}{<@r>...}-s are instructions to FreeMarker that insert the value of a variable. When I'm saying that FMPP exposes data for the templates, then it simply means that it creates variables for the templates, based on some data source. We tell FMPP to load data from <@c>data/style.tdd file before it starts to process the files, in the <@c>config.tdd of the <@c>qtour_step2 directory:

    - -<@prg> -sourceRoot: src -outputRoot: out -data: tdd(data/style.tdd) - - -

    If you issue an <@c>fmpp command in the <@c>qtour_step2 directory, and look into the result in the <@c>out directory, then you will see that the <@c>${"$"}{<@r>...}-s in the HTML files are replaced with the actual colors.

    - -

    <@figure src="qtour_step2.png" alt="Quick tour step 2 diagram" />

    - -

    It is important that the <@c>data directory was not copied into the output (the files in it were not "executed" or "copied"). This is because <@c>src/data contains a file with name <@c>ignoredir.fmpp, and the presence of this file instructs FMPP not to process the directory.

    - - - -<@sect title="Step 3: Even more data"> - -

    You can use any number of data sources, not only a single file. In <@example 'qtour_step3'/> I have added one more data source: <@c>data/birds.csv. CSV is a primitive format often used to exchange data among spread sheet applications and other applications. <@c>bird.csv stores a table with "name", "description" and "favoriteFood" columns. I want to use the content of this table in the generated HTML pages later, so let load this table into variable <@c>birds, in <@c>config.fmpp:

    - -<@prg> -sourceRoot: src -outputRoot: out -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} - - -

    Here FMPP creates variables for the templates from multiple data sources (<@c>data/style.tdd, <@c>data/birds.csv).

    - -

    The <@c>index.html now contains some new lines, that fetch the data form the CSV file via the <@c>birds variable, and print a list from it. The <@c><#<@r>...> tags are instructions to FreeMarker (see in the <@fma>FreeMarker Manual):

    - -<@prg><#noparse> -
      -<#list birds as bird> -
    • ${bird.name?cap_first}: ${bird.description} - Favorite food: ${bird.favoriteFood} - -
    - - -

    The output of the above template lines will be something like:

    - -<@prg> -
      -
    • Arctic-tern: Flies very long distances all years. - Favorite food: sardine -
    • House-sparrow: Don't you say you don't know it... - Favorite food: sunflower -
    • Sakeret: Great hunter of the sky. - Favorite food: pigeon -
    - - -

    Note that the template uses <@c>birds variable independently of the actual file format (CSV) behind it. You could replace the CSV with whatever data source that can be interpreted as table (as a database table) and the templates could be the same, only the <@c>config.fmpp has to be adjusted. (However, FMPP supports only a few data source types out of the box yet, so maybe you have to write/obtain extension Java classes for it.)

    - -

    You can find more information about data and data loading <@a href="overview.html#data">here.

    - - - -<@sect title="Step 4: Multiple output files from the same source file"> - -

    Let's say you want to create separate HTML pages for each birds, rather than listing all information about them on the index page, and you want only link to those pages on <@c>index.html. <@example 'qtour_step4'/> does this. The index page had trivial changes to generate the links. The interesting is that we have a new file, <@c>bird.html. This single file is the template for all bird pages, and will generate a separate HTML file for each birds:

    - -

    <@figure src="qtour_step4.png" alt="Quick tour step 4 diagram" />

    - -

    The <@c>bird.html looks as this:

    - -<@prg><#noparse> -<@pp.dropOutputFile /> -<#list birds as bird> -<@pp.changeOutputFile name=bird.name+".html" /> - - - ${bird.name?cap_first} - - -

    ${bird.name?cap_first}

    - -

    ${bird.description}

    - -

    Favorite food: ${bird.favoriteFood}

    - - - - - -

    The <@c><@<@r>...> tags are instructions to FreeMarker (see the <@fma>FreeMarker Manual). The <@a href='pphash.html'><@e>pp variable is defined by FMPP, and is always there, automatically. It stores the built-in variables of FMPP, e.g. directives as <@c>dropOutputFile above. <@c><@pp.dropOutputFile /> instructs FMPP to drop the current output file, so we will not have <@c>bird.html in the output directory. <@c><@pp.changeOutputFile <@r>.../> instructs FMPP to start a new output file with the given name. So <@c>bird.html will produce 3 output files (one output file for each row of the table): <@c>arctic-tern.html, <@c>house-sparrow.html, and <@c>sakeret.html.

    - - - - \ No newline at end of file diff --git a/fmpp/src/docs/reportbug.html b/fmpp/src/docs/reportbug.html deleted file mode 100644 index 8f8c534..0000000 --- a/fmpp/src/docs/reportbug.html +++ /dev/null @@ -1,4 +0,0 @@ -<@page title="Reporting bugs" keywords="bug, bugs, report"> -<@reportBugs /> -

    Back where you come from...

    - diff --git a/fmpp/src/docs/robots.txt b/fmpp/src/docs/robots.txt deleted file mode 100644 index ef7885c..0000000 --- a/fmpp/src/docs/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /freemarker \ No newline at end of file diff --git a/fmpp/src/docs/settings.html b/fmpp/src/docs/settings.html deleted file mode 100644 index b147348..0000000 --- a/fmpp/src/docs/settings.html +++ /dev/null @@ -1,916 +0,0 @@ -<@page title="Settings" keywords="settings, options, engine"> - -<@sect title="Things you must know about settings"> - -

    The basic definition of the "setting" term is <@a href="overview.html#settings">here... - - <@sect title="The common characteristics of settings"> - -

    The characteristics of a setting can be described with these attributes: -

      -
    • <@e>Name: The name of the setting. This name is used in configuration files. Also, front-ends used to use this or similar name for the setting in their user interface.
    • - -
    • <@e>Type: The type of the value, such as string, integer, boolean, sequence or hash. If you specify the values in a configuration file, then the TDD syntax clearly specifies what syntax to use for which types. For the front-end specific user interface, it depends on the concrete front-end how you face with types. But, if the front-end wants you to enter the value for a single setting as simple text, then you have to enter scalar values (string, integer and boolean) as is (without any TDD quotation), but you have to use TDD syntax for non-scalar types as sequences and hashes. For setting that are sequences, <@a href="tdd.html#modes">sequence mode TDD is used (i.e. no <@c>[ and <@c>] needed), and for setting that are hashes hash mode TDD is used (i.e. no <@c>{ and <@c>} needed).
    • - -
    • <@e>Default: If the value of the setting was not set, the processing session will use this value. If the setting has no default value that doesn't mean that you are required to specify a value for it.
    • -
    - -

    Notes:

    -
      -
    • Settings of type "string (path)" are <@a href="overview.html#realPath">real paths.
    • -
    • All settings are optional, unless explicitly noted otherwise.
    • -
    - - - - <@sect title="The merging of setting values"> - -

    Setting values can be specified in multiple layers. For example, it is possible that a setting is specified in the configuration file, and then again with a command-line argument of the command-line tool.

    - -

    Setting layers has a priority order, for example, the setting layer defined by the command-line arguments has higher priority than the setting layer defined by the configuration file. When the value of the same setting is specified in two layers, then the value that comes from the layer with higher priority overrides the setting value comes from the lower layer. If the type of the setting is not map or sequence, then this simply means that the value from the higher layer will be used, and the other value will be totally hidden. But if the setting type is sequence or hash, then the sequence values will be merged:

    -
      -
    • When sequences are merged, the two sequences are concatenated, and the sequence with the higher priority will start the new concatenated sequence.

    • - -
    • When hashes are merged, the union of the two hashes is constructed, and for clashing keys the values in the hash with higher priority will be used. The type of the value of the hash items is not considered when the merging happens, simply the item from the higher priority hash will be used in the resulting hash. Thus, hash merging is not "deep", becasue the value of clashing items with hash values are not merged. For example, if you merge <@c>{x:{v:1}, y:2} with <@c>{x:{w:2}}, then the result will be <@c>{x:{w:2}, y:2}, and not <@c>{x:{v:1, w:2}, y:2}.

    • -
    - -

    Logically, the rules described in this section can be applied for more than two layers of settings as well.

    - - - - - -<@sect title="Directories"> -<@setting name="sourceRoot" type="string (path)" default="" merging=false clShort="S" antAltAtt="srcdir" /> -<@setting name="outputRoot" type="string (path)" default="" merging=false clShort="O" antAltAtt="destdir" /> -<@setting name="dataRoot" type="string (path)" default="ex:the value of <@s\gsourceRoot -<@setting name="alwaysCreateDirectories" type="boolean" default="false" merging=false antAltAtt="alwaysCreateDirs" /> - -

    In the typical use case FMPP processes all files in the directory specified by <@s>sourceRoot, and writes the result into the directory specified by the <@s>outputRoot directory. These two root directories serve as the root directory of two virtual file systems that store the source files and the output files respectively. This means that all files that FMPP processes must be inside the source root directory (except data files - see later), and it is guaranteed that all output files will be inside the output root directory (as far as you do not by-pass FMPP intentionally with custom extensions). You can't leave the roots by moving upward with <@c>..-s. Also, when you refer to files or directories in the templates as the parameters of predefined directives, absolute paths like <@c>/example.html are interpreted relatively to the source or output root directories (except if the parameter deals with data files - see later).

    - -

    Note that both the source root and the output root must be defined before starting a processing session (but a front-end may assings a default value to them). Also, if you use the <@s>outputFile setting these two settings always have a default value.

    - -

    The directory specified by <@s>dataRoot is interesting for <@a href="dataloader.html">data loaders only. If a data loader gets a relative path, then it should interpret that relatively to the data root directory. If it gets an absolute path, it should interpret that as is. As you can see from this, data root directory does not try to mimic a file system root as the other two root directories. Data loaders can reach files outside the data root directory.

    - -

    By default, the data root is the same as the source root. This encourages the practice where you store the data files in the, say, <@c>data subdirectory of the source root, and then mark that directory with a <@c>ignoredir.fmpp file (file content is irrelevant), so FMPP will not process the content of the directory. Thus, you keep all input together: data sources, templates and static files (as images).

    - -

    By default, no empty subdirectories will be created in the output root directory. More precisely, directories are created only on demand, when actual output files have to be created in them, hence normally you don't have empty directories in the output. However, this behavior can be changed with <@c>alwaysCreateDirectories; with that setting set to <@c>true, each source directory will produce a corresponding output directory (unless it contains an <@c>ignoredir.fmpp file). Also, if a source directory contains a file named <@c>createdir.fmpp (file content is irrelevant) then the corresponding output directory will be created, regardless of the <@c>alwaysCreateDirectories setting (unless, again, <@c>ignoredir.fmpp is also present)

    - -

    It is possible to tell FMPP to process only certain files and directories of the source root, not all of them; see the <@s>sources setting.

    - - - -<@sect title="Source and output files"> -<@setting name="sources" type="sequence (of paths)" default="" merging=true /> -<@setting name="outputFile" type="string (path)" default="" clShort="o" merging=false /> - -

    Be default FMPP processes all files in the source root directory. But if you use the <@s>sources setting, FMPP will process only the files and/or directories listed there. Relative paths in this setting are resolved relatively to the source root directory, not to the configuration base (unless you use <@s>outputFile setting).

    - -

    If you use the <@s>outputFile setting, then FMPP switches to single file mode. In this mode, it will process only 1 files, and store its output in the file specified by the <@s>outputFile setting. You must use <@s>sources, and it must list exactly 1 file. If a relative path is given in the <@s>sources, it is resolved relatively to configuration base, not to the source root. If you didn't specified <@s>outputRoot or <@s>sourceRoot, it will default to the parent directory of the output file or source file respectively.

    - -

    The user interface of front-ends tend to require you to use some special way to specify the value <@s>sources setting. Please read the <@a href="frontends.html">documentation of the front-end you use about this. Note that configuration files are front-end independent, so there you always simply set <@s>sources be assigning value to the <@c>sources key.

    - - - -<@sect title="Text encoding issues"> -<@setting name="sourceEncoding" type="string" default="ISO-8859-1" clShort="E" merging=false /> -<@setting name="outputEncoding" type="string" default="source" merging=false /> -<@setting name="urlEscapingCharset" type="string" default="output" merging=false /> - -

    People use different encodings to store text in binary form, often referred as charsets. Examples of charsets are: <@c>ISO-8859-1, <@c>ISO-8859-2, <@c>CP852, <@c>CP1250, <@c>Shift_JIS, <@c>UTF-8. FMPP internally uses UNICODE everywhere, but when it has to read a text file or write a text file, it must deal with charsets to correctly decode/encode the text. -To read text files, FMPP uses the source encoding. This is be default ISO-8859-1. Also, a FreeMarker template has the ability to tell its own encoding with <@c><#ftl encoding="<@r>something">, and this overrides the source encoding for the individual template file.

    - -

    To write text files, FMPP uses the output encoding. This is be default holds the special value <@c>source, which means that FMPP will use the encoding of the source text file (template file). If you change the value of the setting to a concrete charset, such as UTF-8, then text files will be always written with that encoding. However, templates can set the encoding of the output file with <@c><@pp.setOutputEncoding encoding="<@r>something"/>, and this overrides the encoding dictated by the settings.

    - -

    The <@s>urlEscapingCharset specifes the name of the charset (encoding) used for URL escaping. It defaults to <@c>output, which means that the output encoding will be used for URL escaping. URL escaping happens for example when you use FreeMarker's <@c>url built-in (e.g. <@c><a href="foo.cgi?id=<#noparse>${id?url}">) or the <@a href="pphash.html#key_urlPathEnc"><@c>pp.urlPathEnc method.

    - -

    All of these settings understands the special charset <@c>host, which means the default encoding of the host operating system.

    - -

    The set of supported charsets (and their preciese names) depends on the Java platfrom implementation you run FMPP on.

    - - - - -<@sect title="Processing mode choosing" anchor="processingMode"> -<@setting name="modes" type="sequence (of function calls)" default="ex:empty" clShort="M" merging=true /> -<@setting name="ignoreCvsFiles" type="boolean" default="true" merging=false /> -<@setting name="ignoreSvnFiles" type="boolean" default="true" merging=false /> -<@setting name="ignoreTemporaryFiles" type="boolean" default="true" merging=false /> - -

    When FMPP has to process a file, it has to decide how to process that. That is, it has to choose a "processing mode" for the file. The processing mode can be one of:

    -
      -
    • execute: Execute the file as FreeMarker template (FTL) -
    • copy: Copy the file as is. Uses binary copy; charset does not mater here. -
    • renderXml: Parse the file as XML, and then render the XML document to output file(s) using a FreeMarker template. The template file is choosen for the XML file based on the <@s>xmlRenderings setting. For more information <@a href="settings.html#xmlRendering">read about XML rendering... -
    • ignore: Skip the file. -
    - -

    First, if the <@s>ignoreCvsFiles setting is true, and the file name is <@c>.cvsignore or matches <@c>.#?*, or the file is inside a sub-directory of the source root that is called <@c>CVS, then it chooses the "ignore" processing mode. Also, if the <@s>ignoreSvnFiles setting is true, and the file is inside a sub-directory of the source root that is called <@c>.svn, then it chooses the "ignore" processing mode (note that it doesn't ignore conflict files, i.e., <@c>*.mine and <@c>*.r<@r>number). Also, if <@s>ignoreTemporaryFiles setting is true, and the file name matches <@c>?*~ or <@c>~?* or <@c>#?*# or <@c>%?*% or <@c>_.?*, or the extension (the part after the last dot in the file name) after converting to lowercase matches <@c>bak or <@c>~* or <@c>*~ then it chooses the "ignore" processing mode. Note that the FMPP Ant task always sets these settings to <@c>false, so it does not interfere with the <@c>defaultExcludes parameter of Ant.

    - -

    Then, the processing mode is chosen with a sequence of <@a href="pathpattern.html">path patterns, which is defined by the <@s>modes setting. The first path pattern in the sequence that matches the <@a href="overview.html#virtualPath">virtual path of the file, chooses the processing mode. If no matching path were found, then FMPP chooses the processing mode automatically:

    -
      -
    • If the file extension after converting to lowercase is <@c>xml and the <@s>xmlRenderings is not an empty sequence, then it chooses the "renderXml" mode. -
    • If the file extension after converting to lowercase is one of: <#list [ - "jpg", "jpeg", "gif", "png", "swf", "bmp", "pcx", "tga", "tiff", - "ico", - "zip", "gz", "tgz", "jar", "ace", "bz", "bz2", "tar", "arj", - "rar", "lha", "cab", "lzh", "taz", "tz", "arc", - "exe", "com", "msi", "class", "dll", - "doc", "xls", "pdf", "ps", "chm", - "avi", "wav", "mp3", "mpeg", "mpg", "wma", "mov", "fli"]?sort as ext - ><@c>${ext}<#if ext_has_next>, , then it chooses the "copy" processing mode. -
    • Otherwise it chooses the "execute" processing mode. -
    -

    The <@s>modes setting is a list of TDD functions, where the function name is either <@c>execute, <@c>copy, <@c>renderXml, or <@c>ignore. The arguments to the functions are one or more path patterns of virtual paths in the source file system. For example this (in a configuration file):

    -<@prg> -modes: [ - ignore(**/tmp/) - copy(foo/**/*.html, foo/**/*.htm) - execute(**/*.html, **/*.htm, **/*.xhtml) - copy(**/*) -] - -

    will produce this processing mode chooser sequence:

    - -
    Path patternProcessing mode -
    <@c>**/tmp/ignore -
    <@c>foo/**/*.htmlcopy -
    <@c>foo/**/*.htmcopy -
    <@c>**/*.htmlexecute -
    <@c>**/*.htmexecute -
    <@c>**/*.xhtmlexecute -
    <@c>**/*copy -
    - -

    Note that processing modes are only applicable to files, not to directories. Say, you can't tell FMPP to ignore a directory, but to ignore all files in the directory (as <@c>**/tmp/ above). The end result will be that the directory will not be created, as it contains no output file.

    - - - - -<@sect title="Header and footer choosing"> -<@setting name="borders" type="sequence (of function calls)" default="ex:empty" merging=true /> - -

    With these settings you can insert a header before templates, and insert a footer after templates (templates = files processed in "execute" processing mode). The insertion of header and footer happens only in the memory of the computer, and does not modify the source files. This can be used to add common headers and footers to the templates without actually typing them again and again. Also, you can change the header/footer of many templates at once.

    - -

    The intent of headers and footers is not to show something at the top and bottom of pages. Rather it is to insert FTL directives that import or include commonly used macros, or to place the page inside a directive block, as <@c><#escape <@r>...><@r>...</#escape>. For concrete examples please see <@example 'border' />.

    - -<@note>Unfortunately the inserted header displace the error locations (column, row) in the error messages (I can't fix it in FMPP; FreeMarker improvements are needed to address this). However, if the header doesn't contain line-break, then this unwanted effect is limited to the first line of the template. So it's strongly recommended to not use line-break in headers. - -

    Footers and headers are chosen with similar mechanism to processing modes (see <@s>modes). There are two independent sequence of path-pattern to text entry mappings (so called "choosers"), one for choosing headers, and one for choosing footers. When FMPP loads a template file, it checks if the <@a href="overview.html#virtualPath">virtual path of the file matches to an entry in the header chooser sequence, and if so, it uses the header specified in the first such entry. Also, it does the same with the sequence of footers choosers, to choose a footer.

    - -

    There is a single setting to build both sequences at once: <@s>borders. You give a sequence of <@c>header, <@c> footer and <@c>border functions in it. The first argument to <@c>header and <@c> footer functions is the text of header and footer respectively, and the further arguments are the path patterns of virtual paths in the source file system. If you omit the path patterns, that's the same as if you give <@c>** (i.e. match all files). <@c>border is convenience function: <@c>border(<@r>a, <@r>b, <@r>paths...) is equivalent with <@c>header(<@r>a, <@r>paths...), footer(<@r>b, <@r>paths...). Example:

    -<@prg><#noparse> -header("<#import '/lib/css.ftl' as css>", **/*.css) -border("<#escape x as x?html>", "", **/*.html, **/*.htm) - -

    This build these sequences:

    -
      -
    • Header chooser sequence: - -
      Path patternHeader -
      <@c>**/*.css<@c><#import '/lib/css.ftl' as c> -
      <@c>**/*.html<@c><#escape x as x?html> -
      <@c>**/*.htm<@c><#escape x as x?html> -
      -
    • -
    • Footer chooser sequence: - -
      Path patternFooter -
      <@c>**/*.html<@c></#escape> -
      <@c>**/*.htm<@c></#escape> -
      -
    • -
    - -

    Only the first matching entry of the sequence is used for a file, the later entries are ignored. But sometimes you want to choose multiple headers/footers for the same file. In that case, you can define multiple independent sequences, so said, layers. Layers are separated with <@c>layer(). For example, modify the above example, so it imports <@c>/lib/common.ftl at the top for all files, without disabling the other headers/footers:

    - -<@prg><#noparse> -# The 1st (implicit) layer starts here -header("<#import '/lib/common.ftl' as c>", **/*.css, **/*.html, **/*.htm), -layer() -# The 2nd layer starts here -header("<#import '/lib/css.ftl' as css>", **/*.css), -border("<#escape x as x?html>", "", **/*.html, **/*.htm) - - -

    Here we have two independent header chooser sequences, so both CSS and HTLM files will import <@c>lib/common.ftl, and in additional CSS files will import <@c>lib/css.ftl, and HTML files will use an escape block. You can have any number of layers.

    - -

    A header chosen from an earlier layer will be used earlier in the template file than headers chosen from later layers. A footer chosen from an earlier layer will be used later in the template file than footers chosen from later layers. For example:

    - -<@prg> -borders: [ - border('L1(', ')L1') - layer() - border('L2{', '}L2') - layer() - border('L3[', ']L3') -] - - -

    If the content of a template file is <@c>content, its output will be:

    - -<@prg> -L1(L2{L3[content]L3}L2)L1 - - - - - -<@sect title="Output file name deduction"> -<@setting name="removeExtensions" type="sequence (of strings)" default="ex:empty" clShort="R" merging=true /> -<@setting name="removePostfixes" type="sequence (of strings)" default="ex:empty" merging=true /> -<@setting name="replaceExtensions" type="sequence (of strings)" default="ex:empty" merging=true /> - -

    Initially the name of the output file is the same as the name of the source file. These two settings allow you to change the output filename somewhat, be removing parts of source file name. - -

    The precise meaning of the settings:

    -
      -
    • <@s>removeExtensions: If the source file name ends with an exension in this sequence, then it will be removed from the output file name. For example, if <@c>t is in the sequence (note that there is no dot before the <@c>t), then the output file for <@c>example.html.t will be <@c>example.html. The extension to remove can contain dots (as <@c>tar.gz).
    • - -
    • <@s>removePostfixes: If the source file name before the first dot ends with a string in this sequence, then it will be removed from the output file name. For example, if <@c>_t is in the sequence, then the output file for <@c>example_t.html will be <@c>example.html. If the file name does not contains dot, then it still works: <@c>example_t will become to <@c>example.
    • - -
    • <@s>replaceExtensions: This sequence is used to replace the file extensions with another extensions. For example, if the sequence is this:
      - <@c>ftl, html, xftl, xml
      - then the <@c>ftl extension will be replaced with <@c>html (i.e. the output file name for source file <@c>foo.ftl will be <@c>foo.html), and the <@c>xftl extension will be replaced with <@c>xml. The 1st, 3rd, 5th, etc. sequence elements are the old extensions, and the 2nd, 4th, 6th, etc. sequence elements are the new extensions, so <@c>html extension will not be replaced with <@c>xftl. Also, only one extension replacement will occur for the same file name, so in the case of
      - <@c>x, y, y, z
      - <@c>x will not become to <@c>z.
    • - -
    -

    The settings are applied in the order as they appear above. Each setting is applied only once on the same file name. - -

    Note that output file name deduction is only apply to files, not to directories.

    - - - - -<@sect title="Skipping unchanged files"> -<@setting name="skipUnchanged" type='string' default="none" clShort="-U" merging=false /> - -

    This setting specifies that the processing of which source files can be skipped, if the source file was not modified after the last modification time of the output file. The value of setting can be one of:

    -
      -
    • <@c>none: Don't skip unchanged files. -
    • <@c>all: Skip all unmodified files. <@e>Warning! It has the problem that if the data that the template displays was changed, or a file that is <@c><#include <@r>...>-d or <@c><#import <@r>...>-d by the template was changed, it will not re-generate the output, since the template file itself was not changed. -
    • <@c>static: Skip only unmodified files that will be simply copied anyway (the files where the <@s>modes chooses "copy" processing mode). Process all other files. This is the recommended setting for most projects. -
    -

    If the output does not exist, the source file will be always processed.

    - -

    This feature will not work for templates that rename or drop the original output file during the template execution, since FMPP will believe in the next processing session that the output file for those files is missing, and thus it will process them again.

    - - - - -<@sect title="Turn choosing"> -<@setting name="turns" type="sequence (of function calls)" default="ex:empty sequence" merging=true /> - -

    When FMPP has to process multiple files in the same processing session (for example, when you process a whole directory), then the order in which the files will be processed, is undefined. This is a problem in certain use cases, where it must be ensured that certain files will be processed later than others. For example, if a page contains the alphabetic index of keywords occur in other pages, then that page must be processed for the last, because the information is collected during the processing of the other pages. This is what turns are about: to guarantee the order of the processing of files.

    - -

    The processing session is divided up into, so called, turns. Turns are identified with the turn number, which is simply the order of the turn. The session starts with turn 1, then comes turn 2, and then comes turn 3, ...etc. FMPP puts all files that will be processed into exactly one of the turns, based on the turn chooser sequence.

    - -

    The turn chooser sequence is a sequence of path-pattern -> turn-number pairs. For each source file, the <@a href="overview.html#virtualPath">virtual path of the source file is compared with these <@a href="pathpattern.html">path patterns, and the first pattern of the sequence that matches determines the turn in which the file will be processed. If there is no matching pattern in the sequence for the file, then the file will be processed in turn 1.

    - -

    For example, if <@c>config.fmpp contains this line: - -<@prg> -turns: [turn(3, main_idx.html), turn(2, **/*_idx.html)] - - -

    then all files where the file name ends with <@c>_idx.html will be processed in turn 2, except <@c>main_idx.html, which will be processed in turn 3. All other files will be processed in turn 1.

    - -

    There is no upper limit of the turn number (except a technically limit, somewhere near 2 thousand million). Simply, the last turn will be the turn with the highest number, which is mentioned in the turn chooser sequence, or 1, if the sequence is empty. The first turn is always the turn 1. It is not a problem if a turn contains no file processing.

    - -

    See <@example 'session' /> for a working example, or the FMPP task call in the <@c>build.xml.

    - - - - -<@sect title="Data model building" anchor="data"> -<@setting name="data" type="hash" default="" clShort="D" merging=true /> -<@setting name="localData" type="sequence" default=""merging=true /> -<@setting name="templateData" type="string (Java class name)" default="" merging=false deprecated="Use <@s\glocalData - -

    As you may <@fma href="dgui_quickstart_basics.html">know from the FreeMarker manual, FreeMarker generates the output by merging a template with a data model, and the data model is a hash variable, the root hash. With FMPP terminology, it is usually just referred as "the data". In FMPP, the population of the root hash happens in two places:

    -
      -
    1. Session level data: Once per processing session, at the very beginning of it (before any file processing is stared), the root hash is filled with variables based on the <@s>data setting. This is what happened in the <@a href="qtour.html">Quick Tour, when we have loaded the colors and the table of birds. These variables will be constant during the whole session, and visible for all templates. They must not be modified while the processing session is executing, even if you find a technical way to do that. Note that <@fma href='dgui_misc_var.html'>FreeMarker uses multiple variable layers, so you doesn't modify these variables with <@c><#assign <@r>...> or <@c><#global <@r>...>, just hide them for the time of the template execution, which is OK (the effect will not be visible for the files processed later). - -
    2. Local data (file processing level data): For each processed file, just before FMPP starts to proccess the file, some extra variables are put into the root hash that are specific for that file. These variables will be present in the root hash only while that file is being processed (hence "local data"), so the next file processing will start with the original session level data in the root hash again. The local data is built in three steps, in this order: -
        -
      1. Variables created based on the <@s>localData setting. (See details <@a href="#localData">later...) -
      2. Deprecated: User written Java object of class specified by <@s>templateData adds an arbitrary set of variables. This feature is deprecated and will be removed later. -
      3. The FMPP core adds the <@a href="pphash.html"><@c>pp hash. -
      - Variable added later will overwrite the variable of similar name added earlier. Also, variable that is local data will hide (seemingly overwrite) the variable of similar name that is session level data. -
    3. -
    - -

    From the view point of FreeMarker templates, variables that are part of the session level data and the part of the local data are not different. They are equal parts of the data model.

    - -<@sect title="ex:More about the <@s\gdata - -

    When you use <@a href="tdd.html">TDD syntax for defining the hash for <@s>data, TDD function calls are interpreted as <@a href="dataloader.html">data loader invocations. For reminder, here is the relevant part of <@c>config.fmpp from <@example path="qtour_step4" />:

    - -<@prg> -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} - - -

    TDD syntax makes it possible to enter values directly as well, without using data loaders. For example, you could directly enter the "birds" table with TDD (altoguh it is not too convenient): - -<@prg> -data: { - tdd(data/style.tdd) - birds: [ - { - name: arctic-tern - description: "Flies very long distances all years." - favoriteFood: sardine - } - { - name: house-sparrow - description: "Don't you say you don't know it..." - favoriteFood: sunflower - } - { - name: sakeret - description: "Great hunter of the sky." - favoriteFood: pigeon - } - ] -} - - <#-- more about data --> - -<@sect title="ex:More about the <@s\glocalData - -

    Let's start with a simple example. We have a variable <@c>bgColor in the session level data with value <@c>green. We want to override this with value <@c>yellow for the source files that are in directory <@c>sub (or in its subdirectories, ...etc.):

    - -<@prg> -data: { - bgColor: green -} - -localData: [ - case(sub/**, {bgColor: yellow}) -] - - -

    Complicate it a bit... now set the <@c>bgColor if the file is in directory <@c>sub or <@c>sub2:

    - -<@prg> -localData: [ - case(sub/**, sub2/**, {bgColor: yellow}) -] - - -

    Now do the same as earlier, except for files that are in directory <@c>sub/sky, where the <@c>bgColor is always <@c>blue:

    - -<@prg> -localData: [ - case(sub/sky/**, {bgColor: blue}) - case(sub/**, sub2/**, {bgColor: yellow}) -] - - -

    The rule is that the first <@c>case(<@r>...) where one of the path patterns matches the source file path, will specify the local data (given as the last parameter), and the further <@c>case(<@r>...)-s are ignored. There can be any number of <@c>case(<@r>...)-s listed (note that <@c>localData is a sequence), and a <@c>case(<@r>...) can have any number of path patterns (but 0).

    - -

    Tricky example: do the same as earlier, but don't override the color if the file name starts with <@c>foo:

    - -<@prg> -localData: [ - case(**/foo*, {}) - case(sub/sky/**, {bgColor: blue}) - case(sub/**, sub2/**, {bgColor: yellow}) -] - - -

    Assume you want to set variable <@c>author to <@c>Joe for all files where the file name contains <@c>_j., and to <@c>Amy for all files contains <@c>_a.. But, you want to do this independently of the <@c>bgColor business. In this case you have to use layers:

    - -<@prg> -localData: [ - # The 1st (implicit) layer starts here - case(**/foo*, {}) - case(sub/sky/**, {bgColor: blue}) - case(sub/**, sub2/**, {bgColor: yellow}) - layer() - # The 2nd layer starts here - case(**/*_j.*, {author: Joe}) - case(**/*_a.*, {author: Amy}) -] - - -

    The rule is that layers are separated with a <@c>layer() function call. You can have any number of layers. The <@c>case(<@r>...)-list of each layer will be searched for the first match independently. If more layers put the same variable into the data model, the higher layer (earlier layer) wins (hence "layers"). Layers are calculated starting with the lowest layer. Note that to ease setting merging, layers that doesn't contain any <@c>case(<@r>...)-s are removed automatically.

    - -

    The last parameter of the case can be:

    -
      -
    • Arbitrary TDD hash (as in the examples above). This behaves as the value of the <@s>data setting, so you can use any number of key-value pairs, and invoke data loaders. The value of hash is calculated at most once per processing session, when it is first needed. For the subsequent file processings where the same <@c>case(<@r>...) is choosen, the calculated value is reused, so the data loaders don't re-load the external resources. If the <@c>case(<@r>...) is never chosen during the session, the value of the TDD hash is not calculated at all.
    • - -
    • A TDD function call. The supported functions are: -
        -
      • <@c>bsh: Deduces the path of a BeanShell script file from the source file path, and executes that script to create local data. The path of the script file will be the same as the path of the source file, except that the file name part is modified according the options described later. The script must return a <@c>java.util.Map, which stores the variables (keys are the names of the variables, associated values are the values of the variables) that will be added to the local data. The following variables are accessible for the scripts: <@c>engine, the <@c>fmpp.Engine instance, and <@c>templateEnvironment, the <@c>fmpp.TemplateEnvironment instance. There is 1 parameter to this function (optional), a hash that can store the following options (each is optional): -
          -
        • <@c>ending: The string appended at the end of the source file name. Can't be 0 length string. It defaults to <@c>.bsh.
        • -
        • <@c>removeExtension: Sets if the extension from the source file name should be removed before appending the <@c>ending. The extension is the part after the last dot of the file name. The dot itself is also removed. Defaults to <@c>false.
        • -
        • <@c>ignoreMissing: Set if it will be ignored if no script file found for the source file (and the source file will be processed normally), rather than aborting the processing of the file with error. Defaults to <@c>false.
        • -
        • <@c>encoding: The encoding of the script files. If it is not set then the value of the <@s>sourceEncoding setting will be used.
        • -
        -
      • -
      -
    • - -
    • A string. In this case the string will be interpreted as BeanShell script that must evaluate to an object that implements <@c>fmpp.LocalDataBuilder. This let Java programmers to implement custom local data strategies. See <@a href="api/index.html">the API documentation for more information. (The predefined strategies above are also implemented with this interface internally.)
    • -
    - -

    Finally, let see an example of the usage of the <@c>bsh function: It will execute a BeanShell script file for each HTML to add local data. For example, the script file for source file <@c>foo/bar.html should be <@c>foo/bar.html.bsh. If there is no script for the HTML file, it will not consider that as an error.

    - -<@prg> -modes: ignore(**/*.bsh) -localData: [ - case(**/*.htm, **/*.html, bsh({ignoreMissing})) -] - - -

    A possible <@c>.bsh file, that adds local variables <@c>x and <@c>y:

    - -<@prg> -res = new HashMap(); -res.put("x", "Just for test: " + templateEnvironment.getData("author")); -res.put("y", "Blah..."); -return res; - - -

    For a working example see <@example 'local_data' />.

    - - <#-- more about localData --> - - - - -<@sect title="Locale"> -<@setting name="locale" type="string (locale)" default="en_US" clShort="A" merging=false /> - -

    Set the locale (language, country) used in templates. It has significance because different countries write numbers differently, sort text differently, etc.

    - -

    The value is a string which consist of a language code (lowercase two-letter ISO-639 code) plus optional county code (uppercase two-letter ISO-3166 code) separated from the language code with underscore, and if we have specified the country then an optional variant code (not standardized) separated from the country with underscore. Examples of valid values: <@c>en, <@c>en_US, <@c>en_US_MAC. FreeMarker will try to use the most specific available locale, so if you specify <@c>en_US_MAC but that is not known, then it will try <@c>en_US, and then <@c>en, and then the default locale of the computer.

    - -

    Also, the special value <@c>host can be used to ask FMPP to use the default locale of the host operating system. However, for most applications it is not recommended to depend on the host locale, since then the output will depend on where you run the generation (and not on what people will use the output).

    - -

    If you don't know what your locale string would be, use the <@c>--print-locales option of the command-line tool. Note that unfortunately, the codes printed here are far the superset of locales that Sun's Java platform implementation actually correctly handles.

    - -

    Note that the initial value of the setting is <@c>en_US, because it is the locale that formats things similarly as a programmer would expect.

    - - - - -<@sect title="Number format"> -<@setting name="numberFormat" type="string" default="0.############" merging=false /> - -

    This specifies the default format of numbers when FreeMarker has to convert numbers to strings. For example, if you change this setting to <@c>0.00 then:

    - -<@prg><#noparse>${1}, ${1.1}, ${1.245} - -

    will print (if the locale setting is <@c>en_US):

    - -<@prg>1.00, 1.10, 1.25 - -

    Note that you can override the effect of this setting in the templates with <@c><#setting number_format="<@r>something">, also you can override this for each interpolations with <@c>?string("<@r>something").

    - -

    The syntax and semantic of the format string is as <@c>java.text.DecimalFormat defines it. For convenience I quote a part from the documentation of <@c>java.text.DecimalFormat:

    - - -

    Pattern Syntax -

    - pattern     := pos_pattern{';' neg_pattern}
    - pos_pattern := {prefix}number{suffix}
    - neg_pattern := {prefix}number{suffix}
    - number      := integer{'.' fraction}{exponent}
    - prefix      := '\u0000'..'\uFFFD' - special_characters
    - suffix      := '\u0000'..'\uFFFD' - special_characters
    - integer     := min_int | '#' | '#' integer | '#' ',' integer
    - min_int     := '0' | '0' min_int | '0' ',' min_int
    - fraction    := '0'* '#'*
    - exponent    := 'E' '0' '0'*
    -  
    - Notation:
    -   X*       0 or more instances of X
    -   { X }    0 or 1 instances of X
    -   X | Y    either X or Y
    -   X..Y     any character from X up to Y, inclusive
    -   S - T    characters in S, except those in T
    - 
    - -

    Special Pattern Characters - -

    Many characters in a pattern are taken literally; they are matched during - parsing and output unchanged during formatting. Special characters, on the - other hand, stand for other characters, strings, or classes of characters. - They must be quoted, unless noted otherwise, if they are to appear in the - prefix or suffix as literals. - -

    The characters listed here are used in non-localized patterns. Localized - patterns use the corresponding characters taken from this formatter's - DecimalFormatSymbols object instead, and these characters lose - their special status. Two exceptions are the currency sign and quote, which - are not localized. - -

    - - - - - - - - - - - -
    SymbolLocationLocalized?Meaning
    0NumberYDigit -
    #NumberYDigit, zero shows as absent
    .NumberYDecimal separator or monetary decimal separator
    -NumberYMinus sign
    ,NumberYGrouping separator
    ENumberY - Separates mantissa and exponent in scientific notation. - Need not be quoted in prefix or suffix.
    ;Subpattern boundaryY - Separates positive and negative subpatterns
    %Prefix or suffixYMultiply by 100 and show as percentage
    \u2030Prefix or suffixY - Multiply by 1000 and show as per mille
    ¤
    (\u00A4)
    Prefix or suffixN - Currency sign, replaced by currency symbol. If - doubled, replaced by international currency symbol. - If present in a pattern, the monetary decimal separator - is used instead of the decimal separator.
    'Prefix or suffixN - Used to quote special characters in a prefix or suffix, - for example, "'#'#" formats 123 to - "#123". To create a single quote - itself, use two in a row: "# o''clock".
    - - - - -<@sect title="Boolean format"> -<@setting name="booleanFormat" type="string" default="true,false" merging=false /> - -

    This setting specifies how boolean values will be converted to text or from text inside FreeMarker templates (not in <@a href="dataloader.html">data loaders). Note that by default doing something like <@c>${'$'}{myBoolean} is an error, because FreeMarker denies using <@c>"true,false" for implicit boolean to text conversion; write <@c>${'$'}{myBoolean?c} where you want <@c>true and <@c>false as is in the output.

    - -

    This setting directly correspond to the FreeMarker setting with similar name, so find the full documentation there: -<@fma "ref_directive_setting.html#topic_date_format_settings">FreeMarker settings.

    - -

    Example: <@c>"Yes,No" means that <@c>${'$'}{myBoolean?c} will print <@c>Yes or <@c>No. - - - - -<@sect title="Date/time format"> -<@setting name="dateFormat" type="string" default="" merging=false /> -<@setting name="timeFormat" type="string" default="" merging=false /> -<@setting name="datetimeFormat" type="string" default="" merging=false /> -<@setting name="timeZone" type="string" default="" merging=false /> -<@setting name="sqlDateAndTimeTimeZone" type="string" default="" merging=false /> - -

    These settings specify how date/time/date-time values will be converted to text or from text inside FreeMarker templates (not in <@a href="dataloader.html">data loaders, unless said otherwise).

    - -

    These settings directly correspond to the FreeMarker settings with similar name, so find their full documentation there: -<@fma "ref_directive_setting.html#topic_date_format_settings">FreeMarker settings.

    - -

    Examples of <@s>datetimeFormat-s: <@c>"dd.MM.yyyy HH:mm:ss" (where <@c>HH means 0-23 hours) or <@c>"MM/dd/yyyy hh:mm:ss a" (where <@c>a means AM or PM, if the current language is English), <@c>"iso" (ISO 8601:2004 format), <@c>"xs" (XML Schema format). - -

    Examples of <@s>timeZone-s: <@c>"GMT", <@c>"GMT+2", <@c>"GMT-1:30", <@c>"CET", <@c>"PST", <@c>"America/Los_Angeles", <@c>"JVM default" - -

    When a format setting isn't set, the default format of the current locale (country) will be used, which are specified by the Java installation you run FMPP on. If the <@s>timeZone isn't set, the time zone of the host computer will be used (specified by the Operating System).

    - - - -<@sect title="Handling errors"> -<@setting name="stopOnError" type="boolean" default="true" clShort="s, c" merging=false /> - -

    Be default when FMPP encounters problem during the processing of a source file, it terminates the whole processing session with the error. It can be annoying if you have many bad files, because you have to restart the whole session and wait until the session reaches another bungled template (or other kind of problematic source file), again and again, until you have fixed all of them. If you change this setting to <@c>false, FMPP will not stop on the errors, just skips the problematic source file and continues the processing session with the next source file. You should use <@s>logFile together in this case, so you can later digest all problems occured during the processing session.

    - -

    Note that this settings will only suppress errors that occur during the processing of source files. It will not suppress errors like, for example, bad data files (unless it's loaded in a template with <@c>pp.data) or invalid setting values.

    - - - - -<@sect title="Expert mode"> -<@setting name="expert" type="boolean" default="false" clShort="x" merging=false /> - -

    This setting is to enable suspicious situations, when the engine or the tool suspects that you have miss-configured something, and thus an accidental data loss can happen. It is recommended to leave this setting false, until it actually blocks something that you want to do.

    - -

    Please note that overwriting a file in general is a normal situation for FMPP; no expert mode required to do that.

    - - - -<@sect title="Case sensitive path comparison"> -<@setting name="caseSensitive" type="boolean" default="false" merging=false /> - -

    This setting tells if FMPP should differentiate upper- and lower-case letters when it compares paths for equality, or when it matches paths to path patterns. Regardless of this setting, FMPP always tries to keep the case of file names (i.e. the output of <@c>Foo.txt will be <@c>Foo.txt, and not <@c>foo.txt or <@c>FOO.TXT), as far as the host operating system does not prevent this.

    - - - -<@sect title="Logging" anchor="logging"> -<@setting name="logFile" type="string (path)" default="" clShort="L" merging=false /> -<@setting name="appendLogFile" type="boolean" default="" merging=false /> - -

    If these settings are supported or not, depends on the front-end you use. If a setting is not supported, the front-end must silently ignore it.

    - -

    If the <@s>logFile setting is set, the front-end should record information about the processing session into the file, such as the warning messages and errors occurred.

    - -

    If <@s>appendLogFile is <@c>false, then already existing log file (possibly left from the previous processing session) is deleted and restarted. This is the recommended default behavior, however a front-end may chooses something different. If <@s>appendLogFile is <@c>true, then old log file should be continued.

    - -

    Please read the documentation of <@a href="frontends.html">the front-end you use for the precise behavior of these settings.

    - - - - -<@sect title="Showing the progress and other messages"> -<@setting name="quiet" type="string" default="" clShort="q, v, Q" merging=false /> -<@setting name="echoFormat" type="string" default="" clShort="F" merging=false /> -<@setting name="columns" type="integer" default="" merging=false /> -<@setting name="printStackTrace" type="boolean" default="false" merging=false /> -<@setting name="snip" type="boolean" default="true" merging=false /> - -

    If these settings are supported or not, depends on the front-end you use. If a setting is not supported, the front-end must silently ignore it.

    - -

    The <@s>quiet setting tells the front-end if how much should it show the progress of the processing session on the screen. The accepted values are <@c>true, <@c>false (of type string or boolean), and <@c>reallyQuiet. Also, empty string is equivalent with <@c>true. (Values <@c>-1, <@c>0, <@c>1 are also supported for backward compatibility.) The precise meaning of values is front-end specific.

    - -

    The <@s>echoFormat setting specifies how to display the progress of the processing session on the screen. The meaning of values and the set of understood values are front-end specific, but values <@c>verbose, <@c>normal, <@c>terse and <@c>quiet should be understood, also the shorthands of them: <@c>v, <@c>n, <@c>t and <@c>q. The front-end must not stop with error if it doesn't understand the value that comes from a configuration file.

    - -

    The <@s>columns setting specifies the number of columns on the console (terminal), which is used for text wrapping. This is only applicable if you are using a command line interface for FMPP (or something similar). If you are using the provided shell script to invoke the command line interface, that will try to auto-detect the actual value (since 0.9.15), so you shouldn't set this setting, unless the auto-detection gives incorrect result.

    - -

    The <@s>printStackTrace setting specifies if the front-end should print stack trace to the screen on error, or a terser error description. <@s>snip is deprecated, and now it's just the inverted alias of <@s>printStackTrace.

    - -

    Please read the documentation of <@a href="frontends.html">the front-end you use for the precise behavior of these settings.

    - - - -<@sect title="Meta settings" anchor="metaSettings"> -<@setting name="configurationBase" type="string (path)" default="" merging=false /> -<@setting name="inheritConfiguration" type="string (path)" default="" merging=false /> - -

    These settings influence the interpretation of the configuration file they are stored in. Although front-ends may support the specification of these settings outside configuration files, with the front-end specific interface, the meta setting specified in this way is used to emulate that the setting is present in the configuration file the front-end loads.

    - -

    The <@s>configurationBase setting sets the <@a href="configfile.html#configurationBase">configuration base for the setting values stored in the same configuration file. If the <@s>configurationBase itself is a relative path, then it is resolved relatively to the directory of the configuration file.

    - -

    If <@s>inheritConfiguration is present in a configuration file, then the configuration will <@a href="configfile.html#inheritance">inherit the configuration file pointed by the value of this setting. If <@s>inheritConfiguration is a relative path, then it is resolved relatively to the configuration base, which is already overridden by <@s>configurationBase if that's persent in the configuration file.

    - - - - -<@sect title="XML related settings" anchor="xml"> - -<@setting name="xmlCatalogFiles" type="sequence (of paths)" default="" merging=true /> -<@setting name="xmlCatalogPrefer" type="string" default="public" merging=false /> -<@setting name="validateXml" type="boolean" default="false" merging=false /> -<@setting name="xpathEngine" type="string" default="dontSet" merging=false /> -<@setting name="xmlRenderings" type="sequence (of hashes)" default="ex:empty" merging=true /> - -<@sect title="Catalogs"> - -

    Catalog files are (primarily) used to map public identifiers (and system identifiers) to local files. For example, you want to load an XML file that starts with this:

    - -<@prg> - - - - -

    Whenever you try to load this XML file, the XML parser will need the DTD requested by the DOCTYPE, so it will try to download it from <@c>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd (and all other files the DTD will refer to), which is obviously a bad joke. The standard solution is that you obtain the DTD file (and the further files it refers to) and store it locally on your computer, and also you write a catalog file that maps public identifiers (as <@c>-//W3C//DTD XHTML 1.0 Transitional//EN) to the local paths of the files. Then, you have to specify the catalog file(s) for FMPP with the <@s>xmlCatalogFiles setting.

    - -

    FMPP supports the "widely known" catalog formats: OASIS plain text TR9401 catalog files, OASIS XML Catalogs, and XCatalogs. Delegate entries are supported. Don't panic if you can't undestand a word of it! :) Just look at <@example 'xml_validating' />. For most people it's enough to know (copy-paste...) what (s)he sees there. If you still need more information, please visit the Web page of the OASIS Entity Resolution Technical Committee: http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=entity.

    - -

    The meaning of <@s>xmlCatalogPrefer should be clean if you are familiar with OASIS catalogs. If you are not, just left it unchanged. The allowed values of this setting are <@c>system, <@c>public, and <@c>globalDefault.

    - -

    Both catalog related settings has a global (Java virtual machine level) default. Please find the documentation of <@c>org.apache.xml.resolver package on the Internet about this. In the case of <@s>xmlCatalogFiles, the global default will be appended at the end of the list of catalog files. In the case of <@s>xmlCatalogPrefer, the global default is used when the value of the setting is <@c>globalDefault. Attention! If you don't use the <@s>xmlCatalogFiles FMPP setting, then the catalog feature is disabled, so you must specify this setting (even an empty sequence) to use the global defaults.

    - - - - -<@sect title="Validation"> - -

    The <@s>validateXml setting specifies if, by default, XML files are validated (i.e. checked against the DTD) or not. With "by default" I mean that this can be overridden for individual files, as with the <@c>validate option of the <@a href="dataloader.html#key_xml">xml data loader.

    - - - - -<@sect title="XPath engine"> - -

    The <@s>xpathEngine setting specifies which XPath engine will FreeMarker use when you access XML data (see <@a href="dataloader.html#key_xml">XML dataloader). This setting accepts these values:

    - -
      -
    • <@c>jaxen: Use Jaxen. For this to work, you need to obtain <@c>jaxen.jar (1.1-beta-8 or later!), and make it accessible for FMPP (e.g. copy it into the <@c>lib directory of the FMPP installation, or if you use FMPP as Ant task, then into the <@c>lib directory of Ant). Jaxen provides richer set of capabilities for FreeMarker templates than Xalan.
    • -
    • <@c>xalan: Use Apache Xalan. Xalan is accessible for sure if you are using Sun J2SE 1.4, but not in 1.5.
    • -
    • <@c>default: Let FreeMarker choose the XPath engine it prefers. In FreeMarker 2.3 it will be Xalan (if available).
    • -
    • <@c>dontSet: Don't set what XPath engine will be used. For most users it is the same as <@c>default (see below). This is the default value of the setting.
    • -
    • All other values are interpreted as the full-qualified class name of an XPath engine adapter class, that is, a <@c>freemarker.ext.dom.XPathSupport implementation.
    • -
    - -

    If you embed FMPP into your application, then you have to know that XPath engine choosing is a VM level setting (static field) of FreeMarker. Whenever you execute a processing session, FMPP will aggressively set this FreeMarker setting according the <@s>xpathEngine FMPP setting. Thus, if you don't want FMPP to interfere with other FreeMarker dependent components in the same VM, you should keep value <@c>dontSet.

    - - - -<@sect title="XML rendering" anchor="xmlRendering"> - -

    XML rendering is similar to the typical XSLT usage pattern, if you know that. The source file, for which <@c>renderXml processing mode is choosen (see the <@s>modes setting), will be parsed as XML file. Then, this XML document will be rendered to one or more output files with a FreeMarker template, which is choosen based on the value of the <@s>xmlRenderings setting. The template gets the XML documents with the <@a href="pphash.html#key_doc"><@c>pp.doc variable. Since the template shouldn't be executed in itself, it should be an ignored file (for example it should be stored in a directory that has an <@c>ignoredir.fmpp file). - -

    For an example of this pattern check <@example 'xml_rendering'/>.

    - -<@note>Sometimes you rather want to handle XML files as data than as source files. In this case use <@s>data, <@s>localData, or <@a href="pphash.html#key_loadData"><@c>pp.loadData with the <@a href="dataloader.html#key_xml">XML data loader, not XML rendering. - -

    The <@s>xmlRenderings setting stores a sequence of XML rendering configurations. An XML rendering configuration is a hash that stores the options of an XML rendering. The options are:

    - -
      -
    • Options specify which XML files should be processed with the configuration: -
        -
      • <@c>IfSourceIs: Optional, defaults to an empty sequence. This option is a sequence of path patterns (strings), or a single path pattern. FMPP will not render the XML file with this configuration if its source root relative virtual path does not match a pattern in this sequence. If this sequence is empty, FMPP will not consider this condition, that is, it will not exclude any XML files because of their path.
      • - -
      • <@c>ifDocumentElementIs: Optional, defaults to an empty sequence. This option is a sequence of element names (strings), or a single element name. FMPP will not render the XML file with this configuration if this sequence doesn't contain the document element (the root element) of the XML file. If this sequence is empty, FMPP will not consider this condition, that is, it will not exclude any XML files because of their document element. The element names can use name-space prefixes. The prefixes and the default name-space of elements can be specified with the <@c>xmlns option of the configuration.
      • -
      -
    • - -
    • Options specify how to load the XML file. These are exactly the same as the options of the <@a href="dataloader.html#key_xml">XML data loader (<@c>xmlns, <@c>index, ...etc.), except that <@c>false value for <@c>namespaceAware is not allowed.
    • - -
    • Options for java programmers, to build extra local data based on the loaded XML file. -
        -
      • <@c>localDataBuilder: Optional, defaults to an empty sequence. This is a sequence of strings, or a single string. Each string will be evaluated as BeanShell script (once per <@c>Settings.execute()), which must return an <@c>fmpp.LocalDataBuilder. The aim of these data builders is to do the complex or resource eager parts of the XML processing that you don't want to do in FTL, and expose the results as local data. The data loaders can get the loaded XML document with <@c>templateEnvironment.getXmlDocument(), or <@c>templateEnvironment.getWrappedXmlDocument(). These data builders will be invoked after the application of the <@s>localData setting, and can replace earlier added local variables. They will be executed in the same order as they appear in the sequence.
      • -
      -
    • - -
    • Options specify how to render the XML document to output file: -
        -
      • <@c>template: Required if <@c>copy is <@c>false. This is the source root relative virtual path of a FreeMarker template, which will be invoked to render the output. (The template file itself should be an ignored file, as it doesn't produce output alone.) The template can access the XML document with the <@a href="pphash.html#key_doc"><@c>pp.doc variable.
      • - -
      • <@c>copy: Required if <@c>template is not specified, defaults to <@c>false. This is a boolean value. If it is <@c>true, then the XML document will be copied to the output file (exact copy). In this case the <@c>template option can't be used.
      • -
      -
    • -
    - -

    Example:

    - -<@prg><#noparse> -xmlRenderings: [ - { - ifDocumentElementIs: product - template: renderer/product.html - xmlns: {D: http://example.com/xmlns/products} - } - { - ifDocumentElementIs: book - template: renderer/book.html - index: { - element: [part, chapter] - attribute: ppFile - numbering: hierarchical - value: '%e_%n.html' - } - } -] - - -

    When <@c>renderXml processing mode is chosen for a source file (see <@s>modes), then the first matching XML rendering configuration of the sequence will be used. A configuration is matching if nor the <@c>ifSourceIs, nor the <@c>ifDocumentElementIs option excludes the XML file. (Thus, if a configuration doesn't use any of the <@c>if<@r>... options, it will be used for all source files, unless an earlier configuration matches the source file too.)

    - - - - - - -<@sect title="FreeMarker links (external includes)"> -<@setting name="freemarkerLinks" type="hash (of sequence of paths)" default="" merging=true /> - -

    FreeMarker links is a dirty hack to satisfy a frequent demand: <@c><#include ...>/<@c><#import ...> files that are outside the source root directory, as common FTL macro libraries used in multiple projects.

    - -

    Assume you store your commonly used FreeMarker includes in the <@c>c:\user\freemarker\include directory. But, this directory is outside the <@s>sourceRoot, so you can't reach it with <@c><#include ...>/<@c><#import ...>. To solve this, add this to the FMPP configuration file:

    - -<@prg><#noparse> -freemarkerLinks: { - inc: c:/user/freemarker/include -} - - -

    Now you can include files of that external directory like this:

    - -<@prg><#noparse> -<#include "/@inc/foo.ftl"> - - -

    Here, FreeMarker will actually read <@c>c:\user\freemarker\include\foo.ftl. The seeming <@c>@inc entry in the source root directory (seeming, as there is no such file or directory there in reality) acts as an alias, a transparent link to <@c>c:\user\freemarker\include. (Note that in the configuration file I have used <@a 'overview.html#realPath'>slash instead of backslash for convenience.)

    - -

    It is important that link entries (as <@c>@inc above) are visible only for the predefined FreeMarker directives that use template paths (in FreeMarker 2.3, these are <@c><#include ...> and <@c><#import ...>), or for user defined directives that internally use those predefined directives. They are not visible for anything else. Thus, they are not visible for the functions and directives of the <@c>pp hash, nor FMPP will try to process the <@c>@inc directory (since it doesn't see it at all).

    - -

    As you have seen, a link is defined by associating a name (<@c>inc in the last example, but you can use anything else you prefer) with a path. You can have more links with different names. The link is visible in the source root (never in its subdirectories) as a directory (or file) of name <@c>@<@r>name (where <@c><@r>name is the link name). Regarding the associated path, the rules are the same as with <@s>sourceRoot, <@s>outputRoot, ...etc: it is a <@a 'overview.html#realPath'>real path, so if it is relative, then it will be interpreted relatively to the <@a 'overview.html#realPath'>configuration base.

    - -

    For example, assume, that you also have project specific include files, and you store them outside the source root (because you have multiple source roots in your project), in the <@c>include subdirectory of the same directory, where you stores the FMPP configuration files for your project. Use this in the FMPP configuration file:

    - -<@prg><#noparse> -freemarkerLinks: { - inc: /home/joe/freemarker/include - projInc: include -} - - -

    Note that the path associated with <@c>projInc is a relative path, so it will be resolved relatively to the directory of the configuration file (unless you have overridden the configuration base, of course...). Now you can do things like this:

    - -<@prg><#noparse> -<#include "/@projInc/header.html"> -<#include "/@inc/foo.ftl"> -<#import "/@projInc/forms.ftl" as f> - - -

    If the configuration file that contains the above is <@c>/home/joe/projects/foo/cfg3.fmpp, then <@c><#include '/@projInc/header.html'> will read <@c>/home/joe/projects/foo/include/header.html.

    - -

    In the generic case, a FreeMarker link is associated with a list of paths. For example:

    - -<@prg><#noparse> -freemarkerLinks: { - inc: [/home/joe/freemarker/include, /home/kate/freemarker/include] -} - - -

    When you use <@c><#include '/@inc/foo.ftl'> in a template, then FMPP will check if <@c>/home/joe/freemarker/include/foo.ftl exist, and if not, it will try <@c>/home/kate/freemarker/include/foo.ftl.

    - -

    Files that are really in the source root directory have priority over files that are accessible through FreeMarker links. For example, if you invoke <@c><#include '/@inc/foo.ftl'>, and the source root directory has a subdirectory called <@c>@inc, and that subdirectory has a file called <@c>foo.ftl, then that file will be used, without considering that the <@c>@inc in the path possibly refers to a FreeMarker link. If a subdirectory called <@c>@inc exists, but it doesn't contain <@c>foo.ftl, then the <@c>inc link will be used.

    - -

    A FreeMarker link can point to files as well, not only to directories. For example:

    - -<@prg><#noparse> -freemarkerLinks: { - footer: /home/joe/footers/gpl.html -} - - -

    and then in a template you can do this:

    - -<@prg><#noparse> -<#include "@footer"> - - -

    The merging of the <@s>freemarkerLinks settings is differs a bit from the merging of other hash settings: when the two hashes to merge contains the same key (i.e. the same link name), then the lists of paths for that key will be concatenated. For example, if <@c>common.fmpp is:

    - -<@prg><#noparse> -freemarkerLinks: { - a: c:/user/fm/libs1 - b: [inc1, inc2] -} - - -

    and <@c>config.fmpp is:

    - -<@prg><#noparse> -inheritConfiguration: common.fmpp -... -freemarkerLinks: { - a: c:/user/fm/libs2 - b: [inc3, inc4] - c: foo -} -... - - -

    then the resulting setting value is equivalent with:

    - -<@prg><#noparse> -freemarkerLinks: { - a: [c:/user/fm/libs2, c:/user/fm/libs1] - b: [inc3, inc4, inc1, inc2] - c: foo -} - - -

    Note that the name of the links doesn't start with <@c>@; the <@c>@ is used only to refer to the links. To protect users from mistakes regarding this, it is not allowed to start a link name with <@c>@.

    - - - - -<@sect title='Activating fixes' anchor="freemarkerIncompatibleImprovements"> -<@setting name="freemarkerIncompatibleImprovements" type="string (version number)" default="" merging=false /> - -

    Enables the FreeMarker fixes/improvements that are not 100% backward compatible, and were implemented in the FreeMarker version given in this setting. In older projects using the highest available <@c>2.3.<@r>x is usually a good compromise. New projects should use the maximum, which is the version of the FreeMarker used. If this setting is not set then FreeMarker chooses the this version itself, which as of this writing will be <@c>2.3.0.

    - -

    See <@a href="freemarker/api/freemarker/template/Configuration.html#Configuration-freemarker.template.Version-"><@c>Configuration(Version) in the FreeMarker API for what fixes/improvements are activated.

    - -

    The format of the setting value is <@c><@r>major.<@r>minor.<@r>micro, where each part is a positive integer without padding 0-s

    - - - - -<@sect title="Object wrapping" anchor="objectWrapping"> -<@setting name="objectWrapper" type="string (BeanShell expression)" default='"b = new BeansWrapperBuilder(freemarkerIncompatibleImprovements); b.setSimpleMapWrapper(true); return b.build();"' merging=false /> - -

    The <@s>objectWrapper setting is for FreeMarker "experts" who want to use a customized <@c>ObjectWrapper. The value of the setting is a BeanShell expression that must result in an object whose class extends the <@c>freemarker.ext.beans.BeansWrapper class. The value can be a simple expression like <@c>"new com.example.MyWrapper()", or multiple instructions ending with a <@c>return statement.

    - -

    The <@c>freemarker.template.ObjectWrapper, <@c>freemarker.ext.beans.BeansWrapper, and <@c>freemarker.ext.beans.BeansWrapperBuilder classes are automatically imported, so you don't have to use full-qualified class name for them. Also, a non-<@c>null <@c>freemarkerIncompatibleImprovements value is exposed, which corresponds to the effective value of the similarly named FMPP setting.

    - -

    The <@c>ObjectWrapper is created before other setting values (or the <@c>fmpp.Engine instance for that mater), so the BeanShell expression has no access to any setting values, except to <@s>freemarkerIncompatibleImprovements, as it was shown.

    - -

    A subtle detail regarding the default value: The default value shown is actually only used when <@s>freemarkerIncompatibleImprovements is at least <@c>2.3.21. Otherwise the default is created directly with old-style <@c>new BeansWrapper(). See the FreeMarker API for the otherwise very subtle difference.

    - - - - -<@sect title="Template syntax" anchor="templateSyntax"> -<@setting name="tagSyntax" type="string" default='ex:<@c>angleBracket with FreeMarker 2.3.x, <@c>autoDetect with later versions' merging=false /> - -

    The <@s>tagSyntax setting determines the syntax of the templates (angle bracket syntax like <@c><#include "foo"> VS square bracket syntax like <@c>[#include "foo"]) that has no <@c>ftl directive in it. If the template uses <@c>ftl directive (like it starts with <@c><#ftl> or <@c>[#ftl]), then the syntax of the <@c>ftl tag determines the syntax of the template, and the <@s>tagSyntax setting is ignored.

    - -

    The possible values of this setting are <@c>angleBracket, <@c>squareBracket and <@c>autoDetect. The recommended value is <@c>autoDetect, which will auto-detect the syntax of each template independently, by choosing the syntax of the first FreeMarker tag in the template. For example when it finds a <@c>[@ in the template, it will choose square bracket syntax.

    - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/style/README-BUILD.txt b/fmpp/src/docs/style/README-BUILD.txt deleted file mode 100644 index 04118f5..0000000 --- a/fmpp/src/docs/style/README-BUILD.txt +++ /dev/null @@ -1,6 +0,0 @@ -You should store all files that are about the visual design here, such as -images that aren't part of the content (i.e, that aren't figures), fonts, -style sheets, and js that controls the UI. - -For style sheets use LESS instead of CSS. The *.less files are converted -to CSS by the Ant build according to "gulpfile.js". \ No newline at end of file diff --git a/fmpp/src/docs/style/fmpptitle.png b/fmpp/src/docs/style/fmpptitle.png deleted file mode 100644 index e372167cc6c98de62d84f1275639b18fda9dd744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 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 qHD+Rrs^>4TU0000)@Mlo diff --git a/fmpp/src/docs/style/fonts/README-BUILD.txt b/fmpp/src/docs/style/fonts/README-BUILD.txt deleted file mode 100644 index d727801..0000000 --- a/fmpp/src/docs/style/fonts/README-BUILD.txt +++ /dev/null @@ -1,5 +0,0 @@ -These "icomoon" fonts were generated with https://icomoon.io/app/, from a -selection from the Entypo font (http://www.entypo.com/). - -"selection.json" stores the IcoMoon App selection, and is only stored here -for reproducibility. It's not used for anything. \ No newline at end of file diff --git a/fmpp/src/docs/style/fonts/icomoon.eot b/fmpp/src/docs/style/fonts/icomoon.eot deleted file mode 100644 index d360616eff01f0e64740d89b9a553f61a790992c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2776 zcma(TTWB2D^_;mgcOG{h`~i9`OUcc2`?Fs%1eU%Os7BojNTQjb%xe1eWAP zYH@HKi;}uv3N`(S4Jo9xX-No%reOM!fD-iKKoU$TxKJ7zQbeK9HXrSW6R&#i%sQ5g z3q3P;&STEG_uO;Nef-e^s8K^uU^^gOMk#sv$acBZjp4|J+7}Q118`v;reFycs4c-F zDY$SHW?&Y+2d7~YUL;8f$4T-cER(L(DZ&8sLVu+Dur&$gfC5&5LI2@neS_}LSe+#A zP&+ZTFnI=M-~J&fwG%%vJGp#@aDw==gpJwLFP&2UdFdy_uLAJZxtYmnRa^Tm{i5G6 zG)DscJ@zs2Un9PAZeitYH?T7C6U5g}FHKGIUmDcEahdq`g~_vLAO+Wme~b9y;^e~2 zbJ<`0gZK|=j3>`5Ew7ND1eP!V15*Jng9e~nRY(JV8e{xBRMC`rTL8)J?Qj5KL$I|? zde|Be_f_zvUQvFc#K{qT8dpZj2NlK%yEH`wILV3|xS?-|&3l`hBqzHK*ibjjh{w&( za%xV=VaqyFXnhcnEWD`KSfl_n_R2y2ZBZgHsOT=z zTfh#?bYQhKIMmpWBRJGezk66ENsrdWKDjo1;y2e7s*o{UFq55nDoOKSCiGq%X);#Q}$kS#_%o6HwbGAbH#B*Rg>PW z+rJl%%J8^wnW7o^F1}_EG^Y)hYrMH`dK%|A++62e^GqBjp&M1DLeZ_VO^R7NJWeqy zksIVidTWdt=_p1O87FeIRF)CzBcBQF#>hYhnce>KM9Nn+#9gRqJWR5Esep5pSkzQM zRaR`n^hNW!$l7*bbQpncXRTk0v|(82u_>XPGITv9npG>U>ju$j3qKMmqF*pPPM~Ry z-eEYJrWraHH|x!GLrE zRIqsk=kOI)Sa1Gy9gjviA#`22q5OyH2dGL0q96pmjELSZzm;g}_1e&goI7Evpz2_l z!JCOYs;)$!t9KGcAnedEO~YDSGYO2)7J;E`BtBIwO%oaynr3Q$Nyr=-zOVvu>lW3B zNSlUX>e3gL>f-C{4x4~B_zwISUMG*DNC#1Ew929;Gf^QY2=$PMae^W}q6f%r9%iDd zZ<+1GYB*TkhYcd)%8I(^c`!5TES^-ge{g`_!67-pEs?0O|K*2r&22MHAxyK)m6T;k z>Tim|Si)PK7x`qeGo9{CCi7x`)k`p@uvFeM#mNJsFX#2Nuyd}Pvqf6ZzdU;2q%f^~ zviW`G(D}aJI@fvNW=6WYp6x~KeYUG>B;!$Dc)hpp{Gsa)27BNDUh-_Glunl&+as!+ zPM3)Km%gV^c&fWR&Qt{zdQ~=F?tZFJ*rWTq+p>+~rB^#E4x&@(eDzYXk!{=U-}~GN z!((H~lIP`}z%>jvaPpp4N{$^1LkA0w8b;RTPI!j$_cYMiKG zMv|T_$!baZ{Wy0rk7Zujg*{Y+@$!t6w@Koh4r4tYi`{W{xNf`W<%CFTZa(1^lTI;} z>Iohj%kAhuS_Z=}R0qFZ(M^@9ju6GPoe{#fGC{Dn#2wBZoeEVoRkM<5+gr>w3LT?m zE;zl#v99iCc3%8w?8$M;njKoo=iF3Pj%Mh(g#>Lp++=P@1zpJH4nC&Y8n-wr`y?@y%yze5N?Oi&cUo<4kd{RBB=WgL5lC*xa% z9Q%My&yW}{*MW!WDjNzj;ZVF^>Fn)4{ia@Dee?NuW+$$!)@rZ)Rz;=?L;3T!CPqga z=gapBIDcV(XXiMoTrh@ov_%IFz!$X(N1peF{|!Qws}XLmy!+)=OgrX0@$%G*f$Zej zDHpB;wt2s&h?O7bD~bqdMw$w>8a1SLj@nf^!H*K&*=p6u#-ek!16JU7*hYKletbol zW5w6yrp9dP^o yZ<_&(MK{0|DAEmahVFv$UN}jCoq=hRorIU@dnme5exr4x?3J;L?pTs|H2fD6|7olM diff --git a/fmpp/src/docs/style/fonts/icomoon.svg b/fmpp/src/docs/style/fonts/icomoon.svg deleted file mode 100644 index b8aa80b..0000000 --- a/fmpp/src/docs/style/fonts/icomoon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fmpp/src/docs/style/fonts/icomoon.ttf b/fmpp/src/docs/style/fonts/icomoon.ttf deleted file mode 100644 index bd33c028b170ba0bedeb4d61e3ebc1469ef1c53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2612 zcmaJ@Yit}>6+UO~%$>)b$Ii}Uy&JFhEM3EwXw33VbBS>u(A*B33AP~qxLIU~&euQStxicHG zkqT$$&Uwte=Y02^GjkUZ00e9SgW;2>heqA+vIbe+rg3(Db?zc8z4Z+M>?VD7X>Q{p z@eJvgh#N~6UOKP*{o1!l-vZ!U%Zqahse`t_@<2BN|SLZHWge=@7{imdt*XC9iKcD~6-$;LtVmxzkePfew5?P^q z4on4n4Kx7dhC(yoJ1NJ%LLE&xuY-_aKS{>`b_LtsqaWJ_(m>|o5tS1`p}UM2(p^3c zL4_IOE^Sc(PPXzc?&`Z@@8RAa*$LGy?5ewFqT}A53Ti zYCiq6KKA>Y3%Bp6TshGC;DEx_JGU2Zny#iY*3E3wj4bvkD>6-+RHmw)`I|R?`6gQQ z%dK5yY-5A5t81EXS+Vs!E6a5vo+UB1EMLPD$XgE{Jdj&PLO8I3Z>4wib=hvO9U?%w;ga8!n8gv%7oz<2NsgQ&G& zxLo6{9n;e|$BEVs=bC5Y1R33=D-}XgXM2>hZg`qtRR{*52s(4r43ZqxWS$6Ur7ANv zM3{*k#AJa?GQ0QD*=(q4hzC&9cg^cazC=dB-$ zz%VTI*t}5A8@iqqt-2NHx@{5MYi8Rg8dkja@G(+csb(K=J0oNuOcFrqmTD%iS?%lIlQ?X>>9gQt?35WA(^ zR{ll(1JorWNfM$^W<(#B_gb>`#@P6z+&gjVp!#T>!#kP#s;(rYtM@ZTB<$EQO~cyW zHi?Yb7LlRsX8x#JnkFJp1eeep?lpUpxSdan=tQnzxRF!zyox`4I*uJI zeOwsXm;2#4s^6!9&IWp~WeX*lZKiTZrKmI!DIaoE zRXLim>y|R~;o&B8V`}J9p>X^u&DOZZS*ft^_#vyywhK;vC<-apj4_kG8MVoLzNRBX zNyXu8HVS)$5Trz9A?$^dCwI;gAS>tC`#hQ7IuzKi==6+9;qpE3FsQTfI2Vtn-z%NH z_1m8{8e2bk;q9f_>sw=EZ~R=$!3=P51?N(YN#{zN##+kR3}RIPimZ$VW&z!?+;7ev**R z=tsL#NIu@SGm?ATvP$yj+OkG@b=xur9Y))-Md#MMJik?wEYfExr#@3T^_j}4&s0u* zrZT6shudpYpDW~d9ad?q!y24{MfeJAz)GT(VFU(Yn6!>LEA#8C>+5Sz8sQWzT!OE{ y1(+iTPb`4x#Mvg4X~rT2ks;x)aIB;6&F z`y}e`u=kf%HeMjz4@s7>H3ooH&#%o%yWf!9Ba#2Wcx7ew1@deBi{x^QX}G>RyRraa z=E(OG50!&n-j`8L)X)yUAF>VH;4}`d{3l_f8Ovofu=cn zuir3dF2Du0$V$|G(BG{1l_ugYF14?=zjk38d$!v*$>ti_d_A$jkZeL! zuzeMm@DeL+xBs+_C*qnAxuM)t{z?4<)Fq>F62gqkh(036TD3MVTI!MZR!yb zn1*5MG8UEk;uGvHI}JJb0(=9$M-j!D4&&bFv_(T!qDDaw8Kel40>yU3k5bq?%En#a znRW>4(OCTuwunhOD_&yo;m&BWWK;E#u~B-)#^naPGErmyEe_?nn=?%zOf%<7&ax!; zXGLKwVdEeu3NB0pch}7I&xN+R?%;N zMLBkHc&N#B9=h4d{{Cl%5Qm=W@1M+iR2SYH8oqe!#zSWh1Hdbu?NoxG>ewD})gY)4 z_jmn3sr2MPb%v=5D)gvqraJIssdPZk?9b&}mYaxXkh^?M5F+^6qawosheR>F5xib@kweq+sG zSFt*pkxWuMS;s1`?ZZK8!sPRejUUk@HJ!j_;)~sN_PB13=M{wTHMf}Z%Dz)hrw7Bw zrVD#|kv@Zo=j&siuj!`BR7Z$%U}uHMSlKWAjcVn|@-3s%A%)@&Pwhm7^KCZYf0v4>y?`QA3vsg`m@+*7&(nB6~YD~5?&y@MmP8gqI)}7kLOr)-}b@={1kI^mLA4S$~?=k zBe4euzTa{AAd+r3F38hQ0@5A*V0Q}fM>~2(d|!uGiT_N8*C?-Uhv%TfSckXhW}TDw zw`!6`u9@)3nhBq*nefS)37@Q)@SNrz?95HpT&8u`V1;lER^b#Zz?WbhmSd?5qc8*` zBz4&=&#kSjt*t()gcCGz5xxxPVU`wnWCBdbi)}!eEEdR#bTLbbU4VJgorM=^JQln7 QR40rfnLGK9=YPO|0JV=@^Z)<= diff --git a/fmpp/src/docs/style/fonts/selection.json b/fmpp/src/docs/style/fonts/selection.json deleted file mode 100644 index 28b2b2d..0000000 --- a/fmpp/src/docs/style/fonts/selection.json +++ /dev/null @@ -1,257 +0,0 @@ -{ - "IcoMoonType": "selection", - "icons": [ - { - "icon": { - "paths": [ - "M961.024 527.36l-410.829-411.187c-20.992-21.811-55.347-21.811-76.339 0l-410.88 411.187c-21.043 21.76-13.21 39.629 17.408 39.629h85.658v315.802c0 22.784 0.973 41.421 42.189 41.421h199.424v-316.826h208.64v316.826h209.357c31.437 0 32.307-18.586 32.307-41.421v-315.802h85.606c30.566 0 38.451-17.818 17.459-39.629z" - ], - "attrs": [], - "tags": [ - "house", - "home", - "building" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 34, - "order": 1, - "prevSize": 20, - "code": 58881, - "name": "house", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 34 - }, - { - "icon": { - "paths": [ - "M946.483 239.616c-584.090 233.83-347.494-395.52-800.512-64.205l-94.771 33.997 187.699 737.792h103.373l-91.904-361.37c404.173-338.842 240.538 369.203 718.643-325.478 11.11-16.128-3.738-28.262-22.528-20.736z" - ], - "attrs": [], - "tags": [ - "flag", - "report" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 41, - "order": 12, - "prevSize": 20, - "code": 58891, - "name": "flag", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 41 - }, - { - "icon": { - "paths": [ - "M976.384 358.4h-928.768c-47.104 0-49.51 22.938-46.899 50.995l42.24 461.21c2.56 28.058 9.216 50.995 56.269 50.995h825.6c48.026 0 53.709-22.938 56.269-50.995l42.24-461.21c2.509-28.058 0.205-50.995-46.95-50.995zM942.285 245.76c-5.632-22.528-33.536-40.96-61.901-40.96h-348.877c-28.416 0-68.045-16.23-88.166-36.147l-30.515-30.106c-20.070-19.917-59.75-36.147-88.115-36.147h-166.707c-28.365 0-54.17 22.886-57.293 50.893l-14.95 133.427h866.867l-10.342-40.96z" - ], - "attrs": [], - "tags": [ - "folder", - "category", - "directory" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 159, - "order": 5, - "prevSize": 20, - "code": 58884, - "name": "folder", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 159 - }, - { - "icon": { - "paths": [ - "M990.208 693.453l-163.021-109.67h-100.506l174.080 133.53h-181.504c-5.222 0-9.882 2.662-12.288 6.81l-41.779 114.432-306.381-0-41.83-114.432c-2.304-4.147-7.066-6.81-12.288-6.81h-181.453l174.131-133.53h-100.557l-162.97 109.67c-24.269 14.49-38.758 47.923-32.256 74.189l28.723 157.389c6.502 26.317 35.379 47.872 64.051 47.872h835.226c28.774 0 57.6-21.555 64.102-47.872l28.723-157.389c6.605-26.317-7.936-59.699-32.205-74.189zM778.291 364.646h-169.011v-262.144h-194.56v262.144h-168.96l266.24 249.856 266.291-249.856z" - ], - "attrs": [], - "tags": [ - "download", - "archive", - "store", - "save" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 163, - "order": 13, - "prevSize": 20, - "code": 58880, - "name": "download" - }, - "setIdx": 0, - "iconIdx": 163 - }, - { - "icon": { - "paths": [ - "M511.232 849.92v-195.994l359.27 0.051v-284.262h-359.27v-195.635l-388.25 337.971z" - ], - "attrs": [], - "tags": [ - "arrow-left", - "left", - "previous" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 193, - "order": 3, - "prevSize": 20, - "code": 58885, - "name": "arrow-left", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 193 - }, - { - "icon": { - "paths": [ - "M512.768 174.080v195.994l-359.27-0.051v284.262h359.27v195.635l388.25-337.971z" - ], - "attrs": [], - "tags": [ - "arrow-right", - "right", - "next" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 196, - "order": 4, - "prevSize": 20, - "code": 58886, - "name": "arrow-right", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 196 - }, - { - "icon": { - "paths": [ - "M438.426 231.219c21.402 20.89 230.502 240.435 230.502 240.435 11.469 11.162 17.152 25.754 17.152 40.346s-5.683 29.184-17.152 40.346c0 0-209.101 219.546-230.502 240.384-21.402 20.89-59.853 22.323-82.739 0-22.835-22.272-24.627-53.35 0-80.64l191.898-200.090-191.846-200.090c-24.627-27.341-22.835-58.419 0-80.691 22.835-22.272 61.338-20.89 82.688-0z" - ], - "attrs": [], - "tags": [ - "arrow-right", - "right", - "next" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 208, - "order": 10, - "prevSize": 20, - "code": 58887, - "name": "arrow-right2", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 208 - }, - { - "icon": { - "paths": [ - "M674.816 579.072c-36.762 0-66.56 41.267-66.56 92.109 0 50.893 29.798 92.16 66.56 92.16s66.56-41.267 66.56-92.16c-0.051-50.893-29.85-92.109-66.56-92.109zM906.547 339.251c7.578-18.688 7.936-124.928-32.461-226.611 0 0-92.774 10.138-233.062 106.445-29.44-8.141-79.258-12.186-129.024-12.186-49.818 0-99.584 4.096-129.075 12.186-140.237-96.307-232.96-106.445-232.96-106.445-40.397 101.683-40.090 207.923-32.461 226.611-47.514 51.61-76.544 113.562-76.544 198.195 0 367.923 305.254 373.811 382.31 373.811 17.459 0 52.173 0.051 88.781 0.102 36.608-0.051 71.322-0.102 88.678-0.102 77.107 0 382.31-5.888 382.31-373.811 0-84.634-28.979-146.586-76.493-198.195zM513.434 866.048h-2.816c-193.126 0-343.552-23.040-343.552-210.739 0-44.954 15.923-86.682 53.555-121.293 62.925-57.702 169.267-27.136 289.997-27.136 0.461 0 0.973 0 1.434-0.051 0.512 0 0.973 0.051 1.382 0.051 120.73 0 227.123-30.566 289.997 27.136 37.632 34.611 53.504 76.339 53.504 121.293 0 187.699-150.323 210.739-343.501 210.739zM349.235 579.072c-36.762 0-66.56 41.267-66.56 92.109 0 50.893 29.798 92.16 66.56 92.16s66.56-41.267 66.56-92.16c0-50.893-29.798-92.109-66.56-92.109z" - ], - "attrs": [], - "tags": [ - "github", - "social" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 238, - "order": 7, - "prevSize": 20, - "code": 58889, - "name": "github", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 238 - }, - { - "icon": { - "paths": [ - "M983.040 219.802c-34.714 15.411-71.936 25.754-111.053 30.464 39.936-23.91 70.605-61.798 84.992-106.906-37.325 22.118-78.694 38.246-122.675 46.899-35.277-37.581-85.504-61.030-141.107-61.030-106.752 0-193.28 86.528-193.28 193.229 0 15.155 1.69 29.901 5.018 44.032-160.614-8.038-303.053-84.992-398.336-201.933-16.691 28.518-26.266 61.747-26.266 97.178 0 67.072 34.15 126.208 86.016 160.87-31.693-1.024-61.491-9.677-87.552-24.166 0 0.819 0 1.587 0 2.406 0 93.645 66.662 171.725 155.034 189.542-16.179 4.403-33.28 6.758-50.944 6.758-12.442 0-24.525-1.178-36.352-3.43 24.576 76.8 96 132.659 180.531 134.195-66.15 51.866-149.453 82.739-240.026 82.739-15.616 0-30.976-0.922-46.080-2.714 85.504 54.835 187.085 86.835 296.294 86.835 355.482 0 549.888-294.502 549.888-549.939 0-8.346-0.154-16.691-0.563-24.986 37.786-27.238 70.502-61.286 96.461-100.045z" - ], - "attrs": [], - "tags": [ - "twitter", - "social" - ], - "grid": 20 - }, - "attrs": [], - "properties": { - "id": 244, - "order": 8, - "prevSize": 20, - "code": 58890, - "name": "twitter", - "ligatures": "" - }, - "setIdx": 0, - "iconIdx": 244 - } - ], - "height": 1024, - "metadata": { - "name": "icomoon" - }, - "preferences": { - "showGlyphs": true, - "showQuickUse": true, - "showQuickUse2": true, - "showSVGs": true, - "fontPref": { - "prefix": "icon-", - "metadata": { - "fontFamily": "icomoon" - }, - "metrics": { - "emSize": 1024, - "baseline": 6.25, - "whitespace": 50 - } - }, - "imagePref": { - "prefix": "icon-", - "png": true, - "useClassSelector": true, - "classSelector": ".icon" - }, - "historySize": 100, - "showCodes": true, - "search": "" - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/header-footer-background.png b/fmpp/src/docs/style/header-footer-background.png deleted file mode 100644 index 0f65d7a472841dc1e2b50fb14ed0750eb6118a3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3827 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 b0X@*KZ^VlT3oSo is still used -pre { - font-size: @font-size-base - 1; - font-family: @font-family-monospace; - -webkit-font-smoothing: antialiased; -} - -tt, -code { - background-color: @bg-gray; - border-radius: 4px; - padding: 1px 3px; - color: #6D180B; - word-break: break-all; - - a { - color: #c00; - } -} - -pre { - display: block; - padding: 9px; - margin: 0 0 9px; - - word-break: normal; - word-wrap: break-word; - white-space: pre; - - background-color: @bg-gray; - line-height: 1.42857143; - border: 1px solid @border-gray; - border-radius: 4px; -} - -img { - border: 0; - vertical-align: middle; -} - -// tables -table { - border: 0; - border-collapse: collapse; -} - -td, -th { - padding: 0; -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/components/breadcrumbs.less b/fmpp/src/docs/style/lib/components/breadcrumbs.less deleted file mode 100644 index cf730e9..0000000 --- a/fmpp/src/docs/style/lib/components/breadcrumbs.less +++ /dev/null @@ -1,37 +0,0 @@ -.breadcrumbs { - list-style-type: none; - margin: 12px 0 0 0; - padding: 0; - font-size: @font-size-small; - - .desktop-and-old-ie({ - font-size: @font-size-base; - }); - - - li { - display: inline-block; - vertical-align: middle; - - &:last-child { - a { - color: @text-color; - } - } - - } - - .icon { - display: inline-block; - margin: 0 3px; - position: relative; - top: 1px; - width: 12px; - height: 12px; - - .desktop-and-old-ie({ - width: 14px; - height: 14px; - }); - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/components/download-options.less b/fmpp/src/docs/style/lib/components/download-options.less deleted file mode 100644 index 9153c95..0000000 --- a/fmpp/src/docs/style/lib/components/download-options.less +++ /dev/null @@ -1,25 +0,0 @@ -ul.download-options { - - list-style-type: none; - padding-left: 0; - margin-left: 0; - - li { - padding-left: 2em; - margin-left: 0; - - &:before { - .icon(); - display: inline-block; - position: relative; - top: 1px; - margin-right: 7px; - width: 14px; - height: 14px; - } - - &:extend(.icon-download all); - - } - -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/components/pagers.less b/fmpp/src/docs/style/lib/components/pagers.less deleted file mode 100644 index 3818682..0000000 --- a/fmpp/src/docs/style/lib/components/pagers.less +++ /dev/null @@ -1,70 +0,0 @@ -.pagers { - - list-style-type: none; - margin: 0; - - .ie89 & { - background-color: @bg-gray; - } - - background-color: rgba(255, 255, 255, 0.5); - padding: 9px 18px 6px; - border: 1px solid @border-gray; - border-radius: 4px; - - li { - display: inline-block; - color: @text-gray; - padding: 0 6px; - font-size: 12px; - - a { - display: block; - - &:hover, - &:focus { - text-decoration: none; - color: @text-color; - } - } - } - - .pager-icon { - &:before { - .icon(); - display: block; - font-size: @font-size-large; - text-align: center; - margin-bottom: 1px; - } - - &.previous { - &:extend(.icon-arrow-left all); - - &:before { - text-align: left; - } - } - - &.next { - margin-right: 12px; - &:extend(.icon-arrow-right all); - - &:before { - text-align: right; - } - } - - &.contents { - &:extend(.icon-folder all); - } - - &.home { - &:extend(.icon-house all); - } - - &.report-bug { - &:extend(.icon-flag all); - } - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/components/report-bugs.less b/fmpp/src/docs/style/lib/components/report-bugs.less deleted file mode 100644 index d7e0f25..0000000 --- a/fmpp/src/docs/style/lib/components/report-bugs.less +++ /dev/null @@ -1,23 +0,0 @@ - -.report-bugs { - - .strong { - color: @text-warning; - font-size: 16px; - padding-left: 19px; - - &:before { - .icon(); - position: relative; - top: 1px; - display: inline-block; - width: 16px; - height: 16px; - margin-right: 3px; - margin-left: -19px; // icon width + margin-right - } - - &:extend(.icon-flag all); - } -} - diff --git a/fmpp/src/docs/style/lib/components/social-icons.less b/fmpp/src/docs/style/lib/components/social-icons.less deleted file mode 100644 index 8380e30..0000000 --- a/fmpp/src/docs/style/lib/components/social-icons.less +++ /dev/null @@ -1,50 +0,0 @@ -.social-icons { - margin: 0 0 12px; - padding: 0; - - list-style-type: none; - - text-align: center; - - // hide in print view - @media print { - display: none; - } - - li { - display: inline-block; - - &:last-child a { - padding-right: 0; - } - - a { - display: block; - padding: 3px 6px; - - &:before { - .icon(); - margin-right: 3px; - display: inline-block; - width: 15px; - height: 14px; - position: relative; - top: 1px; - } - - &.twitter { - &:extend(.icon-twitter all); - } - - &.github { - &:extend(.icon-github all); - } - - &:hover { - text-decoration: none; - color: @text-color; - } - - } - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/components/table-of-contents.less b/fmpp/src/docs/style/lib/components/table-of-contents.less deleted file mode 100644 index a7d0a7d..0000000 --- a/fmpp/src/docs/style/lib/components/table-of-contents.less +++ /dev/null @@ -1,40 +0,0 @@ -.toc-header { - font-size: @font-size-large; - margin: 0 0 1em; - - &.alphabetical-index { - margin-top: 1em; - } -} - - -.content-left, -.content-right { - .clearfix(); - - > .table-of-contents { - float: left; - margin: 0 0 0 15px; - padding: 0 0 0 15px; - - border-left: 3px solid #7FBB7F; - list-style-type: none; - min-width: 30%; - - ul { - border: 0; - list-style-type: disc; - float: none; - } - - a { - display: block; - - &:visited { - //color: @link-visited - } - } - } -} - - diff --git a/fmpp/src/docs/style/lib/icons.less b/fmpp/src/docs/style/lib/icons.less deleted file mode 100644 index d81a370..0000000 --- a/fmpp/src/docs/style/lib/icons.less +++ /dev/null @@ -1,55 +0,0 @@ -@font-face { - font-family: 'icomoon'; - src: url('@{icon-font-path}/icomoon.eot?-20325k'); - src: url('@{icon-font-path}/icomoon.eot?#iefix-20325k') format('embedded-opentype'), - url('@{icon-font-path}/icomoon.woff?-20325k') format('woff'), - url('@{icon-font-path}/icomoon.ttf?-20325k') format('truetype'), - url('@{icon-font-path}/icomoon.svg?-20325k#icomoon') format('svg'); - font-weight: normal; - font-style: normal; -} - -.icon { - font-family: 'icomoon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - font-size: inherit; - text-rendering: auto; - - // Better Font Rendering =========== - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-house:before { - content: "\e601"; -} -.icon-flag:before { - content: "\e60b"; -} -.icon-folder:before { - content: "\e604"; -} -.icon-download:before { - content: "\e600"; -} -.icon-arrow-left:before { - content: "\e605"; -} -.icon-arrow-right:before { - content: "\e606"; -} -.icon-arrow-right2:before { - content: "\e607"; -} -.icon-github:before { - content: "\e609"; -} -.icon-twitter:before { - content: "\e60a"; -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/ignoredir.fmpp b/fmpp/src/docs/style/lib/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/docs/style/lib/layout/content.less b/fmpp/src/docs/style/lib/layout/content.less deleted file mode 100644 index dfeeffd..0000000 --- a/fmpp/src/docs/style/lib/layout/content.less +++ /dev/null @@ -1,12 +0,0 @@ -.page-wrapper { - padding-top: 12px; - padding-bottom: 24px; - background-color: #FFF; - min-height: 300px; -} - -.content-right { - a { - word-break: break-word; - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/layout/footer.less b/fmpp/src/docs/style/lib/layout/footer.less deleted file mode 100644 index 333e9e1..0000000 --- a/fmpp/src/docs/style/lib/layout/footer.less +++ /dev/null @@ -1,63 +0,0 @@ -.site-footer { - padding-top: 24px; - padding-bottom: 24px; - border-top: 1px solid @border-gray; - - .footer-inner { - - @media (min-width: @screen-sm-min) { - display: flex; - justify-content: space-between; - flex-wrap: wrap; - align-items: flex-start; - } - - .ie89 & { - display: block; - .clearfix(); - } - - .footer-left { - .ie89 & { - float: left; - } - } - - .footer-right { - .ie89 & { - float: right; - } - } - } - - .pagers { - text-align: center; - margin-bottom: 12px; - - li:last-child a { - margin-left: 12px; - } - } - - .generated { - text-align: center; - - .desktop-and-old-ie({ - text-align: right; - }); - } - - .external-links { - margin-top: 15px; - text-align: center; - - .desktop-and-old-ie({ - text-align: right; - }); - - a { - display: inline-block; - margin-left: 9px; - } - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/layout/header.less b/fmpp/src/docs/style/lib/layout/header.less deleted file mode 100644 index 21956e3..0000000 --- a/fmpp/src/docs/style/lib/layout/header.less +++ /dev/null @@ -1,89 +0,0 @@ -.site-header { - border-bottom: 1px solid @border-gray; - - .logo { - display: block; - } - - .home-site-header { - text-align: center; - padding-top: 24px; - - .social-icons { - - background-color: rgba(255, 255, 255, 0.5); - padding: 3px 6px; - border: 1px solid @border-gray; - border-radius: 4px; - width: 200px; - margin: 12px auto; - } - - .logo { - margin-bottom: 12px; - - img { - width: 243px; - height: 70px; - margin: 0 auto; - } - } - } - - .inner-site-header { - padding-top: 12px; - padding-bottom: 12px; - - @media (min-width: @screen-sm-min) { - display: flex; - justify-content: space-between; - align-items: flex-end; - flex-wrap: wrap; - } - - .ie89 & { - display: block; - .clearfix(); - height: 92px; - } - - .header-left { - .ie89 & { - float: left; - width: 600px; - - .breadcrumbs { - width: 600px; - } - } - } - - .header-right { - text-align: center; - margin-top: 18px; - - .ie89 & { - margin-top: 0; - float: right; - .clearfix(); - - nav { - .clearfix(); - } - - .pagers { - height: 55px; - width: 250px; - margin-top: 10px; - } - } - } - - .logo { - img { - width: 121px; - height: 35px; - } - } - } -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/mixins.less b/fmpp/src/docs/style/lib/mixins.less deleted file mode 100644 index 45797c5..0000000 --- a/fmpp/src/docs/style/lib/mixins.less +++ /dev/null @@ -1,29 +0,0 @@ -.clearfix() { - &:before, - &:after { - content: " "; - display: table; - } - &:after { - clear: both; - } -} - -.desktop-and-old-ie(@rules) { - - .ie89 & { - @rules(); - } - - @media (min-width: @screen-sm-min) { - @rules(); - } - -} - - -.list-unstyled() { - margin: 0; - padding: 0; - list-style-type: none; -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/utilities.less b/fmpp/src/docs/style/lib/utilities.less deleted file mode 100644 index c7487a7..0000000 --- a/fmpp/src/docs/style/lib/utilities.less +++ /dev/null @@ -1,33 +0,0 @@ -// determines the max-width of the site at various resolutions -.site-width { - margin-left: auto; - margin-right: auto; - - padding-left: @gutter-width; - padding-right: @gutter-width; - - .ie89 & { - width: @container-md; - } - - @media (min-width: @screen-sm-min) { - width: @container-sm; - } - - @media (min-width: @screen-md-min) { - width: @container-md; - } - - @media (min-width: @screen-lg-min) { - width: @container-lg; - } -} - - -.warning { - color: @text-warning; -} - -.clear { - .clearfix(); -} \ No newline at end of file diff --git a/fmpp/src/docs/style/lib/variables.less b/fmpp/src/docs/style/lib/variables.less deleted file mode 100644 index 1cffbd6..0000000 --- a/fmpp/src/docs/style/lib/variables.less +++ /dev/null @@ -1,48 +0,0 @@ -@icon-font-path: "fonts"; - -// font sizes -@font-size-small: 12px; -@font-size-base: 14px; -@font-size-large: 18px; - -// line height -@line-height-base: 1.428571429; // 20/14 -@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px - -// text colors -@text-color: #333; -@text-warning: #c00; -@text-gray: #999; - -@link-color: #168316; -@link-hover-color: @link-color; -@link-visited: #800080; //for table of contents - -// font families -@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; -@font-family-serif: Georgia, "Times New Roman", Times, serif; -@font-family-monospace: "Droid Sans Mono", Courier, Monaco, Consolas, monospace; -@font-family-base: @font-family-sans-serif; - -// borders -@border-gray: #ddd; - -// bgs -@bg-gray: #f9f9f9; - -// gutter -@gutter-width: 24px; - -// breakpoints -@screen-sm-min: 768px; -@screen-md-min: 992px; -@screen-lg-min: 1200px; - -@screen-xs-max: (@screen-sm-min - 1); -@screen-sm-max: (@screen-md-min - 1); -@screen-md-max: (@screen-lg-min - 1); - -// container widths -@container-sm: @screen-sm-min - (@gutter-width * 2); -@container-md: @screen-md-min - (@gutter-width * 2); -@container-lg: @screen-lg-min - (@gutter-width * 2); \ No newline at end of file diff --git a/fmpp/src/docs/style/main.less b/fmpp/src/docs/style/main.less deleted file mode 100644 index 222c1fa..0000000 --- a/fmpp/src/docs/style/main.less +++ /dev/null @@ -1,22 +0,0 @@ -@import (reference) "lib/variables.less"; -@import (reference) "lib/mixins.less"; - -// base styles for elements -@import "lib/base.less"; - -// page structure -@import "lib/layout/header.less"; -@import "lib/layout/content.less"; -@import "lib/layout/footer.less"; - -// components -@import "lib/components/breadcrumbs.less"; -@import "lib/components/pagers.less"; -@import "lib/components/report-bugs.less"; -@import "lib/components/table-of-contents.less"; -@import "lib/components/social-icons.less"; -@import "lib/components/download-options.less"; - -// generic utilities -@import "lib/utilities.less"; -@import "lib/icons.less"; \ No newline at end of file diff --git a/fmpp/src/docs/style/none.gif b/fmpp/src/docs/style/none.gif deleted file mode 100644 index f191b280ce91e6cb8c387735c10ef9bc5da6c83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 ocmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl(S^Yp0J!f4_W%F@ diff --git a/fmpp/src/docs/style/poweredby_sq_simple.png b/fmpp/src/docs/style/poweredby_sq_simple.png deleted file mode 100644 index c9422699de2220e84b55bd23a4cb4246cd10ebf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 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 q`9T3d0I@*AV>BQD0t^5EplX~|`sPId0000 - -<@sect title="Basics"> - -

    TDD is a very simple expression language created for defining hierarchical data (hashes, sequences) with plain text. It is mostly used for configuring FMPP. For example, <@a href="configfile.html">configuration files use TDD syntax.

    - -

    TDD syntax is identical to the syntax of literals in FTL (FreeMarker Template Language). For example, this data structure:

    - -
    -(root)
    - |
    - +- user = "Big Joe"
    - |
    - +- tall = true
    - |
    - +- animals
    -     |
    -     +- (1st)
    -     |   |
    -     |   +- name = "white mouse"
    -     |   |
    -     |   +- price = 30
    -     |
    -     +- (2nd)
    -     |   |
    -     |   +- name = "black mouse"
    -     |   |
    -     |   +- price = 25
    -     |
    -     +- (3rd)
    -         |
    -         +- name = "green mouse"
    -         |
    -         +- price = 150
    -
    - -

    could be described with this TDD expression:

    - -<@prg> -{ - "user": "Big Joe", - "tall": true, - "animals": [ - {"name": "white mouse", "price": 30}, - {"name": "black mouse", "price": 25}, - {"name": "green mouse", "price": 150} - ] -} - - -

    which is also a legal FTL expression. Please read <@fma href="dgui_template_exp.html#dgui_template_exp_direct" >the FreeMarker Manual about "Specify values directly" if you are not familiar with them. TDD doesn't support any other FTL operators (as variables, built-ins, interpolations, etc.), only the "Specify values directly" part of FTL.

    - -

    TDD syntax allows terser expressions than FTL because of these additional syntactical rules:

    -
      -
    • Strings need not be quoted if they doesn't look like a legal boolean or number value, and they don't contain: -
        -
      • white-space: space, tab, line-break, etc.
      • -
      • Quotation marks or apostrophe-quote: <@c>", <@c>'
      • -
      • Separator-like chars: comma (<@c>,), semicolon (<@c>;). Colon (<@c>:) is allowed without quoting the string if the string is not a key in a hash.
      • -
      • Bracket-like chars: <@c>(, <@c>), <@c>[, <@c>], <@c>{, <@c>}, <@c><, <@c>>
      • -
      • Equals sign (<@c>=)
      • -
      • Plus sign (<@c>+)
      • -
      -
    • -
    • Line-break can be used instead of comma (<@c>,). That is, in practice, you can omit commas that would be at the end of the lines.
    • -
    • If in a hash the value is missing from a key:value pair, then the value defaults to boolean <@c>true. -
    - -

    Utilizing these rules, the example TDD expression can be written as:

    - -<@prg> -{ - user: "Big Joe" - tall - animals: [ - {name: "white mouse", price: 30} - {name: "black mouse", price: 25} - {name: "green mouse", price: 150} - ] -} - - -

    Back to the strings... Examples of legal unquoted strings:

    -
      -
    • <@c>**/foo-bar/baz.txt
    • -
    • <@c>C:\windows\system32
    • -
    • <@c>25%
    • -
    • <@c>#FF80FF
    • -
    • <@c>?!
    • -
    • <@c>7.txt
    • -
    • <@c>1-2
    • -
    • <@c>True
    • -
    -

    Examples of strings where quotation had to be used:

    -
      -
    • <@c>"contains space"
    • -
    • <@c>"a'b"
    • -
    • <@c>"(c)"
    • -
    • <@c>"<head>"
    • -
    • <@c>"7"
    • -
    • <@c>"true"
    • -
    - -

    TDD supports an escape sequence that FTL doesn't: backslash at the end of the line. It is used to break strings into multiple lines in the TDD, without actually introducing line-breaks and indentation in the value of the string. For example here:

    - -<@prg> -{ - text: 'This is \ - a single \ - line.' -} - - -

    the value of <@c>text will be the same as with: - -<@prg> -{ - text: 'This is a single line.' -} - - -

    The exact rule is that if backslash is followed by a line-break (extra horizontal white-space is allowed between the backslash and the line-break), then all characters after the backslash will be removed until the first non-white-space character is reached, or a 2nd line-break is reached.

    - - - - -<@sect title="Interpretation modes" anchor="modes"> - -

    A text can be interpreted as TDD either in:

    -
      -
    • Single expression mode: this is the basic case.
    • -
    • Hash mode: The text is assumed to describe the name:value pair list of a hash.
    • -
    • Sequence mode: The text is assumed to describe the value list of a sequence.
    • -
    - -

    An example of hash mode are <@a href="configfile.html">configuration files. There you enter the settings as if you were already between <@c>{ and <@c>}:

    - -<@prg> -sourceRoot: src -outputRoot: out - - -

    and this will evaluate to a hash. In single expression mode, you could describe the same value with this:

    - -<@prg> -{ - sourceRoot: src - outputRoot: out -} - - -

    An example of sequence mode is when you specify the <@s>removeExtensions setting with command-line argument to the <@a href="commandline.html">command-line tool or as Ant task parameter. For example, when you enter this in the command-line:

    - -<@prg> -fmpp -S src -O out --removeExtensions "foo, bar, baaz" - - -

    Don't be confused on the quotation marks here, those are required by the command-line parser of the OS shell, it has nothing to do with TDD. What FMPP gets don't contain the quotation marks, only the text between them. So the TDD expression we are talking about is:

    - -<@prg> -foo, bar, baaz - - -

    The same value could be described in single expression mode as:

    - -<@prg> -[foo, bar, baaz] - - -

    When to use single expression mode, and when hash mode, and when sequence mode? Hash mode or sequence mode is used when you specify the value of something as discrete text (that is, not as the part of a larger, enclosing TDD expression), and it is known that the value must be hash or sequence respectively. For example, in the <@c>--removeExtensions example above, the TDD expression is given in an independent text fragment, and it is known that the <@s>removeExtensions setting is a sequence. Compare it with the case, when you specify the same setting value in a configuration file:

    - -<@prg> -removeExtensions: [foo, bar, baaz] - - -

    Here, the value is not a discrete text, because it is a fragment of a larger TDD expression (which is, by the way, a hash mode expression). Thus, the value must be specified in single expression mode, regardless that we know that it should be a sequence. Because, if you were allowed to write:

    - -<@prg> -removeExtensions: foo, bar, baaz - - -

    then there would be an ambiguity, as it could be also interpreted as:

    - -<@prg> -removeExtensions: foo -bar: true -baaz: true - - -

    (Since, if the value is missing from a key:value pair, then the value defaults to boolean <@c>true, and comma can be replaced with line-break) So be sure you don't forget the brackets in configuration files.

    - - - - -<@sect title="Hash addition" anchor="hashAddition"> - -

    TDD allows you to put hash value directly into another hash value, without specifying key for it. For example:

    - -<@prg> -{a: A, b: B, {c: C, d: D}} - - -

    In this case, when the TDD interpretation passes the <@c>{c: C, d: D}, it will add all key:value pairs of it to the enclosing hash. So the final result hash will contain these key:value pairs: <@c>a: A, <@c>b: B, <@c>c: C, <@c>d: D.

    - -

    When the hash is added to its parent, it may overwrite keys in that. For example:

    - -<@prg> -{a: A1, b: B1, c:C1, {b: B2, c: C2}, {c: C3}} - - -

    will result in a hash that contains these key:value pairs: <@c>a:A1, <@c>b:B2, <@c>c:C3.

    - -

    You may wonder what is this all good for. Hash additions are useful with data loaders that return hashes. Read on...

    - - - - -<@sect title="TDD functions"> - -

    TDD has a construct called TDD function that is identical to FTL method calls. The meaning of TDD functions depends on which <@a href="overview.html#settings">setting do you use them in. For example, when you use TDD with the <@s>data setting, then they are used to invoke data loaders, and their return value is the loaded data. A part form the configuration used in the <@a href="qtour.html">Quick Tour:

    - -<@prg> -data: { - tdd(data/style.tdd) - birds: csv(data/birds.csv) -} - - -

    The first function call (<@c>tdd(<@r>...)) returns the a hash that was built by interpreting the <@c>data/style.tdd file. There is no key given for it (like <@c>someKey: tdd(<@r>...)), so its key:value pairs will be added directly to the <@s>data hash (<@a href="#hashAddition">hash addition). The second call (<@c>csv(<@r>...)) returns a sequence, which will be stored with key <@c>birds in the <@s>data hash.

    - -

    Another example of the usage TDD functions is when method calls are used with the <@s>modes setting. A fragment from a possible configuration file:

    - -<@prg> -modes: [copy(**/*.html, **/*.htm), ignore(tmp/)] - - -

    In this use case, you are not interested what kind of values do the function calls return. You just use the function calls for describing groups. It's the internal business of the FMPP core what the function calls return to solve this task.

    - -

    There is no restriction regarding the type of the value a TDD function returns. You may thought that TDD knows only these types: string, number, boolean, hash, sequence. These are the types for which you can specify values directly, but a sequence or a hash can store any type of Java objects as values, not only these. So any type of object can get into hashes or sequences as the return value of TDD function.

    - - - - -<@sect title="Comments"> - -

    TDD knows 2 types of comments:

    -
      -
    • FTL comment: These are delimited with <@c><#-- and <@c>-->, and can span multiple lines. They can be inserted everywhere where optional white-space could be inserted. FTL comments can't be nested into another FTL comment.
    • - -
    • Shell-script/"properties" style comment: These are lines starting with <@c>#, optionally preceded with white-space. The comment spreads until the end of the line. This comment can be inserted everywhere where optional line-break could be inserted.
    • -
    - -

    Comments will not work inside quoted strings, nor nested inside comments. That is, they will count as normal text in these places.

    - -

    Example:

    - -<@prg><#noparse> -# This is a test. -# Now "a" will be 1 -a: 1 <#-- now "a" is 1 --> -b <#-- this was the key --> : <#-- now comes the value --> 2 - # Comments can be indented. -<#-- - FTL-style comment - can span over multiple lines. ---> - - - - -<@sect title="Character encoding issues" anchor="encoding"> - -

    If you load TDD from a file, then FMPP have to use an encoding (charset) to interpret the bytes as text. The default of this encoding depends on how do you load the TDD file:

    -
      -
    • If it is a configuration file: <@c>ISO-8859-1 is used.
    • -
    • If it is loaded with <@c>tdd data loader as <@c>tdd(<@r>fileName): <@s>sourceEncoding is used.
    • -
    • If it is loaded with data loader <@c>tdd as <@c>tdd(<@r>fileName, <@r>encoding): the encoding suggested by the 2nd parameter is used.
    • -
    - -

    A TDD file can specify its own encoding with a special comment, in which case the default of the encoding (see above) is ignored. For example this TDD file will be always interpreted with UTF-8 encoding, doesn't mater how you load it:

    - -<@prg> -# encoding: UTF-8 -some: tdd -comes: here - - -

    The encoding comment must be the very first line of the TDD file. FTL-style comment can't be used for this purpose. Extra white-space, or no white-space is OK between the <@c># and <@c>encoding, also extra white-space can be present around the colon. Word <@c>charset can be used instead of <@c>encoding. The words are not case sensitive.

    - -

    The encoding comment works only if the file can be correctly interpreted as US-ASCII until the end of the encoding name. So it will not work for UTF-16, UCS-2, UCS-4, and with EBCDIC based charsets. Note that an UTF-8 BOM at the begining of the file is automatically ignored.

    - - - - diff --git a/fmpp/src/docs/tips.html b/fmpp/src/docs/tips.html deleted file mode 100644 index d50efb3..0000000 --- a/fmpp/src/docs/tips.html +++ /dev/null @@ -1,34 +0,0 @@ -<@page title="Tips and Best Practices" keywords="tips, best practices"> - -<@sect title="Finding out the reasons of errors"> - -

    Use a log file (see: <@s>logFile) as that will contain the full error stack trace. Also, if you are really lost, you may use temporary <@c>pp.warning-s as a poor man's debugger: you can see if a certain line in the template is reached, also you can print the current values of variables.

    - - - - -<@sect title="Speeding up processing when you have many files"> - -

    Some tricks:

    -
      -
    • Try to use <@s>skipUnchanged setting. For most applications you can safely use it with the <@c>static value, and it speeds up things a lot if you have many images or other static files. - -
    • Try to set the <@s>quiet setting to <@c>true or <@c>reallyQuiet, or set <@s>echoFormat to <@c>terse for the command-line tool. Surprising enough, some terminals scrolls screen slowly, so FMPP has to wait until it can print the next line to the screen. - -
    • Process only the files/directories that actually need reprocessing. You don't have to process the whole source root directory; you can select the set of files and directories that you want to process inside the source root, with the <@s>sources setting. -
    - - - -<@sect title="Avoid too much programming logic in templates"> -

    FTL (FreeMarker Template Language) is not a general purpose programming language, just a template language. Implementing complex programming logic in it is cumbersome, and defeats the original purpose of templates: to be simple, almost the same as the output. To avoid this, pair BeanShell scripts with the problematic templates, and do the complex calculations in the script file, and then pass the results to the template for displaying. BeanShell is good in calculating data (and in whatever complex algorithms), FTL is good in displaying data. So you use the adequate languages for the subtasks. This can be implemented with the <@s>localData setting and its <@c>bsh function.

    - - -<@sect title="Showing information about something that will be generated further down"> - -

    For example, you have to show a Table of Contents at the top of the page, but the list of headings is not known until the page generation reaches the bottom of the page. In this case, generate the section that contains the headings first, but capture the output in a variable with an assignment directive (as <@c><#assign <@r>var><@r>...</#assign>). Then print the top of the page, and then the captured output. Check <@example 'capture' /> to see a working example.

    - - - - - diff --git a/fmpp/src/docs/versions.html b/fmpp/src/docs/versions.html deleted file mode 100644 index ae66513..0000000 --- a/fmpp/src/docs/versions.html +++ /dev/null @@ -1,733 +0,0 @@ -<@page title="Version History" keywords="verions, version history"> - -<@sect title="0.9.15"> -

    Date of release: 2014-11-05

    -

    Bug fixes:

    -
      -
    • Fixed an oversight where an <@c>Engine static field was accidentally initialized in a non-static initializer, causing problems in multi-threaded environment.
    • -
    • Removed version ranges from Maven dependencies, replacing them with concrete version numbers.
    • -
    • Log files now don't contain the stack trace twice when the processing session is aborted by a file processing error.
    • -
    • Setting values with integer type haven't understood <@c>+ prefix, like in <@c>+1.
    • -
    - -

    New features, improvements:

    -
      -
    • Added <@a href="dataloader.html#key_json">JSON data loader. -
    • - Exposed relevant FreeMarker settings added since 2.3.15: -
        -
      • <@s>freemarkerIncompatibleImprovements (also exposed to <@s>objectWrapper scripts as a global variable with the same name)
      • -
      • <@s>booleanFormat
      • -
      • <@s>sqlDateAndTimeTimeZone
      • -
      -
    • -
    • The command line tool doesn't "snip" (<@c>--8<--) error messages any more, instead, by default, it prints a cause message chain instead of a stack trace on error. This is especially useful as newer FreeMarker versions tend to give more detailed error messages that shouldn't be cut off. Stack traces can be asked with the new <@s>printStackTrace setting. The <@s>snip setting is now deprecated, and is only an inverted alias to <@s>printStackTrace.
    • -
    • Improved console error output quality in general.
    • -
    • The command line tool now detects the actual number of console (terminal) columns and wraps lines accordingly. Earlier it has used 80 columns. This only works if you invoke FMPP with the provided shell script (<@c>bin/fmpp or <@c>bin/fmpp.bat). Also, it won't work if you have explicitly set the <@s>columns setting (like in <@c>~/.fmpprc) as then that will take precedence.
    • -
    • Better <@c>java location detection in the UN*X shell script (<@c>bin/fmpp) -
    • FMPP license has been changed from BSD to Apache License 2.0. The copyright owner has been changed to be the same as the owners of FreeMarker. The two projects now share the same license and Contributor License Agreement.
    • -
    • - The dependencies of FMPP has been updated/changed: -
        -
      • <@attc/> The minimum required Java version has been increased from 1.2 to 1.4.
      • -
      • <@attc/> The minimum required FreeMarker version has been increased from 2.3.15 to 2.3.21.
      • -
      • Removed Oro dependency (<@c>lib/oro.jar) as regular expression support is included in Java 1.4.
      • -
      • Updated FreeMarker dependency from 2.3.15 to 2.3.21 (<@c>lib/freemarker.jar and FreeMarker Manual).
      • -
      • Updated <@c>ImageInfo to version 1.9. It isn't included in <@c>fmpp.jar any more, instead it's a regular dependency (<@c>lib/imageinfo.jar).
      • -
      • Updated <@c>xml-resolver.jar dependency from 1.1 to version 1.2 (note that thus its license changes from Apache License 1.1 to Apache License 2.0)
      • -
      -
    • -
    • Added new constructor, <@c>Engine(BeansWrapper beansWrapper, Version fmIncompImprovements), deprecated the earlier <@c>Version-less overload.
    • -
    • Removed long deprecated method: <@c>Settings.execute(Engine eng). -
    • The project source code was moved from SourceForge.net to GitHub: <@url href="https://github.com/freemarker/fmpp" />.
    • -
    • Overall source code structure and Ant build improvements.
    • -
    • Updated Web site and documentation design, also cleaned up the content a bit.
    • -
    - - - -<@sect title="0.9.14"> -

    Date of release: 2009-03-15

    - -

    Bug fixes:

    -
      -
    • Fixing bug that caused <@s>skipUnchanged to skip a file when the destination was newer than the source. Now it only skips files when the modification date of the source and destination files are exactly the same.
    • -
    • Fixing some TDD parser crashes occurring when parsing invalid TDD.
    • -
    • Preventing obviously useless traversing inside SVN and CVS directories.
    • -
    • Fixed some typos in the documentation.
    • -
    - -

    New features, improvements:

    -
      -
    • FMPP now can create empty directories using one of the two new features (reminder: FMPP creates output directories on-demand before an actual output file is created in them, hence usually it doesn't create empty directories): -
        -
      • If a directory file contains a file named <@c>createdir.fmpp then that will ensure that the containing directory will exist in the output as well. The <@c>createdir.fmpp file itself will not appear in the output, it's only a marker. -
      • New setting, <@s>alwaysCreateDirectories: If this is set to <@c>true, all processed directories will produce a corresponding output directory, even when that directory will be empty. -
      - -
    • The <@a href="dataloader.html#key_xml">XML data loader now supports XInclude-s by setting its <@c>xincludeAware option to <@c>true. - -
    • To follow the Ant conventions, now <@s>sourceRoot can alternatively be specified with the <@c>srcdir attribute, and <@s>outputRoot with the <@c>destdir attribute of the Ant task. - -
    • API: New JavaBean propery in <@c>fmpp.Engine and <@c>fmpp.setting.Settings: <@c>dontTraverseDirectories. It should be set to <@c>true by front-ends that explicitly specify the list of all source files and source directories, rather than expecting the <@c>Engine to discover them. Till now such front-ends only specified the list of files, so this property wasn't needed. However, to support the new <@c>alwaysCreateDirectories setting, now the list of directories should be passed as well, and hence the need for this new property.
    • - -
    • Updated <@c>freemarker.jar and the included FreeMarker Manual to 2.3.15.
    • -
    - - -<@sect title="0.9.13"> -

    Date of release: 2007-12-16

    - -

    Bug fixes:

    -
      -
    • The <@s>skipUnchanged setting haven't had any effect since 0.9.10. Now it works again.
    • - -
    • When detecting the dimensions of certain image files, new lines were printed to the standard output (i.e., to the console).
    • - -
    • The <@c>slicedText data loader has ignored the <@c>encoding parameter.
    • - -
    • <@nbc/> The <@c>csv, <@c>text and <@c>slicedText data loaders didn't skipped the BOM (byte order mark) character at the beginning of the file. This was a problem as the Windows Notepad inserts a BOM there when it saves with UTF-8 encoding. This fix is not 100% backward compatible, as someone may indeed wanted to have that BOM.
    • - -
    • API: The <@c>fmpp.dataloaders.AbstractTextDataLoader ignored the encoding returned by the <@c>parseExtraArguments method.
    • - -
    • API: The <@c>fmpp.dataloaders.AbstractTextDataLoader didn't removed the BOM character from the beginning of files.
    • -
    - -

    New features, improvements:

    -
      -
    • The <@c>csv data loader has a few new options: <@c>normalizeHeaders, <@c>trimCells, and <@c>emptyValue. <@a href="dataloader.html#key_csv">More details...
    • - -
    • <@nbc /> New setting: <@s>ignoreSvnFiles. This will ignore directories with name <@c>.svn inside the source root directory. This setting is by default on (<@c>true), so it's theoretically not backward compatible.
    • - -
    • API: <@c>DataLoaderUtil.getStringArrayArgument and <@c>getStringArrayOption now have an overload with <@c>allowString argument, so that a single item can be easily treated as an array of length 1.
    • - -
    • Updated <@c>freemarker.jar and the included FreeMarker Manual to 2.3.11.
    • - -
    • The project has switched from CVS to SVN. The CVS repository is not used anymore.
    • -
    - - - -<@sect title="0.9.12"> -

    Date of release: 2007-04-27

    - -

    Bug fixes:

    -
      -
    • <@nbc /> In TDD files value types were incorrectly forced to string if they were inside an explicitly defined hash (i.e. inside <@c>{ and <@c>}). Like <@c>{x: 1, y: false} was interpreted as <@c>{x: "1", y: "false"}, that is, both values were strings. From now it is interpreted correctly, so with the above example <@c>x will be the number <@c>1 and <@c>y will be the boolean <@c>false.
    • -
    - -

    New features, improvements:

    -
      -
    • New data loader: <@c>tddSequence for loading a TDD file as a TDD sequence (i.e. list) rather than as a TDD hash (i.e. map). <@a href="dataloader.html#key_tddSequence">More... -
    • Updated <@c>freemarker.jar to 2.3.10, and <@c>bhs.jar (BeanShell) to 2.0b4 in the distribution pack. -
    - - - -<@sect title="0.9.11"> -

    Date of release: 2006-03-15

    - -

    New features, improvements:

    -
      -
    • New setting: <@s>tagSyntax. This let you access this new setting of FreeMaker 2.3.5. - -
    • For nightly FMPP builds the build date is now logged in additional to the version number. - -
    • Updated <@c>freemarker.jar to 2.3.6, and <@c>bhs.jar (BeanShell) to 2.0b1.1 in the distribution pack. -
    - -

    Bug fixes:

    -
      -
    • The Ant task have processed all files of the source root directory if the number of selected file was 0.
    • - -
    • <@nbc /> When <@s>sources was set to any empty list in a configuration file, the whole source root directory was processed in certain cases. From now it will process no files in that case. If you want to process the whole source root directory, don't specify the <@s>sources setting at all. - -
    • <@nbca /> The <@c>Settings class was badly assumed that the whole source root directory has to be processed if the <@s>sources setting was an empty list. This was incorrect, as in that case simply 0 files should be processed, and processing the whole source directory should occur only if the <@s>sources setting was not set at all (it's <@c>null when you get it). So, if you want the whole source root directory to be processed, don't set the <@s>sources setting at all. If it is already set, you can "unset" it with <@c>settings.remove(Settings.NAME_SOURCES).
    • - -
    • The Ant task didn't logged setting errors into the log file.
    • - -
    • The test suite now works with JDK 1.5, if you add <@c>xpathSupport.lib to the <@c>build.properties. - -
    - - - - -<@sect title="0.9.10"> -

    Date of release: 2005-10-23

    - -

    New features, improvements:

    -
      -
    • The <@a href="pphash.html#key_newWritableSequence"><@c>pp.newWritableSequence and <@a href="pphash.html#key_newWritableHash"><@c>pp.newWritableHash methods now have an optional parameter, which is the sequence or hash whose items are added to the new writable sequence or hash. This makes <@a href="pphash.html#key_newWritableHash"><@c>pp.copyWritable deprecated, which was not able to create writable sequences/hashes based on non-writable ones.
    • - -
    • New setting: <@s>objectWrapper. This let FreeMarker "experts" to create and fully configure the <@c>freemarker.template.ObjectWrapper object that FMPP will use.
    • - -
    • Java API: a new <@c>fmpp.Engine constructor now let you specify the <@c>freemarker.template.ObjectWrapper to use.
    • - -
    • FreeMarker 2.3.4 is included in the distribution. Note the new feature of FreeMarket that let you use <@c>[#<@r>...], <@c>[@<@r>...], etc instead of <@c><#<@r>...>, <@c><@<@r>...>, etc if you start the template with <@c>[#ftl].
    • - -
    • <@example 'multipage_list' /> was updated to use <@c><@r>sequence?chunk(<@r>pageSize), instead of complex BeanShell script that was needed before FreeMarker 2.3.3.
    • - -
    • Manual improvements.
    • -
    - -

    Bug fixes:

    -
      -
    • On Windows, <@c>fmpp.bat has sometimes build the <@c>CLASSPATH badly that ruined the command line call to java.exe and caused it to die with a strange <@c>ClassNotFoundError.
    • - -
    • When a file is copied in "copy" processing mode, FMPP now sets the last modification time of the destination file to the last modification time of the source file.
    • - -
    • <@nbca/> The FMPP engine has used and modified the shared - <@c>freemarker.template.ObjectWrapper.BEANS_WRAPPER object, which is dangerous. From now by default it uses its own <@c>ObjectWrapper instance. If you have utilized that it uses the shared <@c>ObjectWrapper.BEANS_WRAPPER object (not recommended!), then for 100% backward compatibility you have to use the <@s>objectWrapper setting with this value:
      - <@c>"ow = ObjectWrapper.BEANS_WRAPPER; ow.setSimpleMapWrapper(true); return ow;"
      - (or if you don't use FMPP settings, do this in Java where you create the engine object: <@c>ObjectWrapper ow = ObjectWrapper.BEANS_WRAPPER; ow.setSimpleMapWrapper(true); Engine eng = new Engine(ObjectWrapper.BEANS_WRAPPER);)
    • -
    - - - -<@sect title="0.9.9"> -

    Date of release: 2005-04-12

    - -

    New features, improvements:

    -
      -
    • The <@a href="dataloader.html#key_csv">csv data loader was improved: -
        -
      • With the new <@c>headers option you can specify the header row for a CSV file that doesn't actually have a header row.
      • -
      • With the new <@c>replaceHeaders option you can override the header row of a CSV file.
      • -
      • The values returned for the rows are now not only hashes but also the sequences of the cells. -
      -
    • New data loader: <@c>slicedText for loading a text file as a sequence of strings. <@a href="dataloader.html#key_slicedText">More... -
    • Java API: New class: <@c>fmpp.dataloaders.AbstractTextDataLoader, to ease the creation of custom text file data loaders for Java programmers.
    • -
    • Java API: New <@c>StringUtil methods: <@c>normalizeNewliens, <@c>split with trimming.
    • -
    • <@nbc/>The <@c>+ operator in TDD files and configuration files is not allowed anymore. This operator was used for adding hashes prior 0.9.0. Since 0.9.0 the preferred (and now required) way of adding hashes is different. For example, assuming that your configuration file is in <@a href="properties.html">"properties" format (that is, the extension of the FMPP configuration file is <@c>cfg or <@c>properties), instead of this:
      - <@c>data={a:1, b:2} + properties(data/style.properties) + birds:csv(data/birds.csv)
      - your should write this:
      - <@c>data=a:1, b:2, tdd(data/style.tdd), birds:csv(data/birds.csv)
      - <@a href="tdd.html#hashAddition">More information on hash addition...
    • -
    - -

    Bug fixes:

    -
      -
    • The <@c>csv data loader has incorrectly interpreted <@c>"\n\r" as a single line-break. -
    • Fixed some mistakes in the Manual and in the JavaDocs. -
    - - -<@sect title="0.9.8"> -

    Date of release: 2005-01-28

    - -

    New features, improvements:

    -
      -
    • FreeMarker 2.3.2mod (a stable nightly build after 2.3.2) is included. -
    • FMPP was updated to enable the new output encoding and URL escaping related features of FreeMarker 2.3.1. (The usage of 2.3.2mod is recommended because of a bug fix.) -
    • New setting: <@s>urlEscapingCharset -
    • Java API: added static final fields to <@c>Engine for reserved engine parameter (setting) value strings: <@c>PARAMETER_VALUE_SOURCE, <@c>PARAMETER_VALUE_HOST, <@c>PARAMETER_VALUE_OUTPUT. Also added the similar missing static fields to the <@c>Settings class. -
    - -

    Bug fixes:

    -
      -
    • The reserved <@c>"host" output encoding value was not resolved in some rare cases. -
    • The the <@c>pp.urlEnc/<@c>pp.urlPathEnc functions and the <@c>fmpp.util.StringUtil.urlEnc(...)/<@c>urlPathEnc(...) methods were malfunctioned with a few charsets, for example with UTF-16, UTF-7, and EBCDIC based charsets. -
    • <@nbca/>The documentation of <@c>fmpp.ProgressListener.notifyProgressEvent(<@r>...) forgot to mention regarding the <@c>event parameter that: "As new event types can be introduced with new FMPP versions (even if it happens very seldom), a progress listener implementation should survive events that it does not understand. That is, it must not stop with an error, but it should silently ignore the event." Note that there is no new event type in this version.
    • -
    • Many fixes in the Manual and in the the API JavaDocs.
    • -
    • <@nbca/>The <@c>fmpp.util.NullWriter and <@c>fmpp.util.NullOutputStream classes has no public constructor anymore. Use their static <@c>INSTANCE field to get the singleton.
    • -
    • Fixed test-suite bugs: Windows vs UN*X vs Mac line-breaks, class-path problem in the <@c>build.xml.
    • -
    - - -<@sect title="0.9.7"> -

    Date of release: 2004-03-01

    - -

    New features, improvements:

    -
      -
    • New setting: <@s>freemarkerLinks. This is a dirty hack to satisfy a frequent demand: <@c><#include <@r>...>/<@c><#import <@r>...> files that are outside the source root directory (as FTL macro libraries used by more projects).
    • -
    • Later nightly FreeMarker 2.3 build is included.
    • -
    - -

    Bug fixes:

    -
      -
    • <@nbc/>From now, native separators (as backslash under Windows) are not tolerated in the paths used in <@c><#import <@r>...> and <@c><#include <@r>...> directives. You must use <@c>/ there.
    • -
    • Fixes in the Manual and in the the API JavaDocs.
    • -
    - - -<@sect title="0.9.6"> -

    Date of release: 2004-01-20

    - -

    New features, improvements:

    -
      -
    • New processing mode: <@c>renderXml. When a source file is processed in this mode, it's parsed as XML, and then the parsed XML document is rendered to output file(s) by a FreeMarker template, which is chosen based on the path or the document element of the XML document. -
        -
      • New setting: <@s>xmlRenderings. <@a href="settings.html#xmlRendering">More info...
      • -
      • New <@c>pp variable: <@c>pp.doc. <@a href="pphash.html#key_doc">More info...
      • -
      • Java API: New class: <@c>fmpp.XmlRenderingConfiguration. New <@c>fmpp.Engine.PMODE_<@r>... constant: <@c>PMODE_RENDER_XML. New <@c>Engine methods to add/clean XML rendering configurations.
      • -
      -
    • - -
    • When template execution dies with error, and it didn't generated any output yet, nor it flushed the output explicitly or by changing output file, then no 0 length output file will be generated.
    • - -
    • New target in the <@c>build.xml, <@c>qinstall. It's the same as <@c>install, but assumes <@c>y for all questions.
    • - -
    • Added figures to the <@a href="qtour.html">Quick Tour chapter.
    • - -
    • Java API: Added a new utility method to <@c>Engine: <@c>static String getProgressListenerEventName(int event)
    • -
    - - - -<@sect title="0.9.5"> -

    Date of release: 2004-01-14

    - -

    New features, improvements:

    -
      -
    • Java API: Improvements to the <@c>Settings class: -
        -
      • The API of this class is now as stable as other FMPP API-s, so it is not marked as experimental anymore.
      • -
      • The <@c>execute(Engine) method is now deprecated, and will be soon removed. Use <@c>execute() instead. If you use <@c>Settings, then don't create <@c>Engine objects manually anymore, just use the <@c>Settings object alone. See an example <@a href="writefrontend.html">here...
      • -
      • Methods have been added to deal with progress listeners and engine attributes.
      • -
      -
    • - -
    • Java API: some convenience methods has been added: <@c>Settings.set(String, boolean), <@c>Settings.set(String, int), <@c>Settings.setDefault(String, boolean), <@c>Settings.setDefault(String, int), <@c>Engine.isXmlSupportAvailable(), <@c>TddHashLocalDataLoader(String)
    • - -
    • More API documentation.
    • - -
    • More reliable and helpful <@c>install Ant target.
    • - -
    • Terminology change: To prevent confusion, the settings of the <@c>fmpp.Engine object (known be people who use FMPP at Java API level) are now called "engine parameters", as the "settings" term is already used since version 0.9.0 for the high level settings seen by usual front-end users.
    • - -
    • Many grammatical mistakes have been fixed in the documentation. Other minor improvements in the Manual.
    • -
    - -

    Bug fixes:

    -
      -
    • A later nightly FreeMarker 2.3 build is included, that fixes various bugs with XML related keys <@c>@@markup, <@c>@@nested_markup, <@c>@@start_tag, and <@c>@@attributes_markup. This is mostly important for people who uses data of XHTML format for generating (X)HTML pages.
    • -
    - - - -<@sect title="0.9.4"> -

    Date of release: 2004-01-03

    - -

    New features, improvements:

    -
      -
    • New setting: <@s>localData -
        -
      • Till now, all source files (all templates) have started with the same data model, the one you have specified with the <@s>data setting. With the new <@s>localData setting you can add variables to, and override the variables of the common data model, for groups of source files selected by path patterns.
      • -
      • This feature also let you attach a BeanShell script to a template, that can done some complex calculations before template execution, and put the results into the data model for the individual template.
      • -
      • The <@s>templateData setting is now deprecated.
      • -
      • Java API changes: New interface <@c>fmpp.LocalDataBuilder, deprecates <@c>fmpp.TemplateDataModelBuilder.
      • -
      -
    • - -
    • The <@s>borders setting supports multiple layers. That is, multiple borders can be used at once for the same file. - -
    • In <@c><@pp.renameOutputFile <@r>... /> you can use the <@c>extension parameter instead of <@c>name, to change only the extension of the output file. - -
    • Java API: <@c>TemplateEnvironment has new methods, most importantly <@c>static TemplateEnvironment getCurrentInstance() for accessing the current template environment in FreeMarker transforms/methods.
    • - -
    • Java API: New methods to <@c>Engine: <@c>Object getData(name) (returns unwrapped original values), <@c>Object removeData(name), <@c>cleatData() (deprecates misnamed <@c>clearSharedVariables()).
    • - -
    • Java API: Engine attribute that implements <@c>ProgressListener get notifications about engine events.
    • - -
    • Java API: <@c>fmpp.tdd.FunctionCall has public constructor now.
    • - -
    • <@nbca /><@c>Engine.getData(<@r>...) doesn't throw <@c>TemplateModelException anymore, because data wrapping is now deferred until the session execution.
    • - -
    • <@nbca />Synchronization was removed from <@c>Engine. It did the same as if you synchronize on the <@c>Engine instance and call the methods anyway...
    • - -
    • <@nbca /><@c>ProgressListener.notifyProgressEvent(<@r>...) is now allowed to throw <@c>Exception. - -
    • More API documentation.
    • -
    - -

    Bug fixes:

    -
      -
    • <@c><@pp.renameOutputFile <@r>... /> has malfunctioned when the buffer was already flushed.
    • - -
    • Minor documentation fixes.
    • - -
    • 3rd party libraries BeanShell and ORO were upgraded. The upgrades fix a few bugs.
    • - -
    • <@nbca />Package <@c>fmpp.listeners were renamed to <@c>fmpp.progresslisteners. - -
    • <@nbca /><@c>Engine.removeAttribue was renamed to <@c>Engine.removeAttribute. -
    - - - -<@sect title="0.9.3"> -

    Date of release: 2003-12-22

    - -

    New features, improvements:

    -
      -
    • In FreeMarker 2.3: The quotations in FreeMarker error messages are now terser and thus easier to read.
    • - -
    • Various really missing XML related features added (<@a href="settings.html#xml">Detailed information...): -
        -
      • New settings: <@s>xmlCatalogFiles, <@s>xmlCatalogPrefer. With these settings you can setup the OASIS catalogs that will be used for resolving entities in XML files. (See <@example 'xml_validating' />)
      • - -
      • New option to the xml data loader: <@c>validate. This specifies if the XML file will be checked for validity.
      • - -
      • New setting: <@s>validateXml. This specifies if by default XML files will be checked for validity.
      • - -
      • New setting: <@s>xpathEngine. With this setting you can set if you want to use Jaxen or Xalan for XPath-s.
      • -
      -
    • -
    - -

    Bug fixes:

    -
      -
    • In FreeMarker 2.3: A bug that caused template processing to fail with <@c>NullPointerException on low memory conditions is now fixed. A bug in Jaxen XPath support that caused <@c>NullPointerException-s has been fixed. Etc.
    • - -
    • <@nbca/><@c>Engine.process doesn't throw sly unchecked <@c>fmpp.IllegalConfigurationException-s anymore. Also, <@c>fmpp.IllegalConfigurationException is not public from now; it wasn't mentioned in other public API-s anyway.
    • - -
    • FMPP has died with internal error if somebody tried to use XML related features, and XML support was not available.
    • - -
    • Minor documentation fixes.
    • -
    - - -<@sect title="0.9.2"> -

    Date of release: 2003-11-12

    - -

    Bug fixes:

    -
      -
    • <@nbc/> Only Windows users (and the users of other operation systems where paths use something else instead of slash) are affected by this fix. Relative paths in <@c><#include <@r>...> and <@c><#import <@r>...> were badly interpreted relatively to the <@s>sourceRoot. Now they are correctly interpreted relatively to the directory of the template file. This bug fix is not backward compatible, if you have accidentally utilized the bad behavior. For example, you have included <@c><@r><sourceRoot>/includes/foo.ftl in a template file which is in not directly in the <@s>sourceRoot like this: <@c><#include "includes/foo.ftl">. Now you should replace it with: <@c><#include "/includes/foo.ftl">.
    • - -
    • Minor documentation fixes.
    • -
    - - -<@sect title="0.9.1"> -

    Date of release: 2003-11-09

    - -

    New features, improvements:

    -
      -
    • <@nbc/>Data loader <@c>antProperty and <@c>antProperties now can convert the property values to numerical, boolean, or data/time/date-time variables. For example, to expose property <@c>x as numerical variable, use <@c>antProperty(x?n) instead of <@c>antProperty(x). This causes backward compatibility problem only if you have Ant property names that ends with one of these: <@c>?n, <@c>?b, <@c>?d, <@c>?t, <@c>?dt, <@c>?s, and you have specified their name as parameter to these data loaders. In this case, append <@c>?s at the end of the parameters. <@a href="dataloader.html#key_antProperty">More info...
    • - -
    • Data loader <@c>csv now supports columns of type date, time, and date-time. <@a href="dataloader.html#key_csv">More info...
    • - -
    • Later nightly build of FreeMarker 2.3 is included, that introduces new built-ins: <@c>j_string, <@c>js_string. These can be used to escape text with Java language or JavaScript string literal escaping rules. Also it contains some minor bug fixes.
    • - -
    • The text hard-wrapper (used by the command-line tool) has some fixes and improvements.
    • - -
    • Added a chapter about writing new front-ends. <@a href="writefrontend.html">Here...
    • - -
    • A few minor fixes in the documentation and in the examples.
    • -
    - -

    Bug fixes:

    -
      -
    • The <@s>expert setting worked inverted with the Ant task when it decided if you are allowed to use the project base directory as <@s>outputRoot.
    • - -
    • The <@c>install target of <@c>build.xml didn't stopped nicely if the <@c>ANT_HOME was not set.
    • -
    - - -<@sect title="0.9.0"> -

    Date of release: 2003-10-30 - -

    New features, improvements: -

      -
    • <@nbc/>The default configuration file format is TDD from now, instead of "Java properties" (to decrease the number of syntaxes user has to use). Files with extension <@c>cfg or <@c>properties are automatically interpreted as "Java properties" file, so the old <@c>fmpp.cfg-s will still work. But if your old configuration file doesn't use extension <@c>cfg or <@c>properties, then you have to rename it now. Also, note that the default file name for the new (TDD) configuration files is <@c>config.fmpp, which has priority over <@c>fmpp.cfg when both present in the same directory. <@a href="configfile.html">More info... - -
    • TDD was substantially revisited. -
        -
      • The TDD syntax has several improvements and also conceptual changes. The revisited TDD is backward compatible with the old. However, I will remove hash unions later, so <@c>+ will be available for other purposes. To prepare for this future change, just replace <@c>+ characters with comma (<@c>,) in your hash unions. <@a href="tdd.html">See the chapter about the new TDD... -
          -
        • All FTL string literal features are supported. Escapes, raw strings...
        • -
        • With a new escape sequence, strings can be broken into multiple lines visually, without affecting their value.
        • -
        • Much more character is allowed in unquoted strings.
        • -
        • FTL comments and single line <@c># comments are supported. -
        • TDD files can specify their own encoding (charset) with a special comment in their first line. -
        • Line-break can be used instead of comma to separate items in listings. -
        • The hash union concept was gone. Instead, you can put hashes directly into the enclosing hash. -
        • In hashes the value can be omitted from the key:value pair, in which case it defaults to <@c>true. -
        -
      • - -
      • TDD error messages show the error location (line, column, file) and quote the problematic line.
      • - -
      • TDD now uses term "TDD function" instead of "TDD directive".
      • - -
      • <@nbca/><@c>fmpp.tdd.TddParser was gone, and <@c>fmpp.tdd.Interpreter was introduced instead, which has different API.
      • -
      -
    • - -
    • The FMPP Ant task now can load the settings from configuration files, with the new attribute <@c>configuration. Thus, now you can store the settings in a single place if you use FMPP both as command-line tool and Ant task. Look at <@example "build.xml"/> and <@example "ant3"/> to see applications. - -
    • New setting: <@c>inheritConfiguration. It is used for "customizing" an existing configuration by overriding some settings in it. See <@example "inherit_cfg" />. <@a href="configfile.html#inheritance">More info... - -
    • <@nbc/>Setting <@c>sources now uses TDD sequence syntax. Thus, you can't separate the files with <@c>: or <@c>; anymore, but with comma (<@c>,). According to TDD syntax, quote file names that contain problematic characters, e.g.:
      - <@c>no/problem/with.it, "but quote this.txt",
      - C:\windows\path, r"C:\quote this win\path"
    • - -
    • Error message creation mechanism was changed. The messages are now more "stupid mechanical", but there is far less chance that some helpful detail is accidentally left out. - -
    • The default values of a few settings of the command-line tool can be customized with <@c>.fmpprc file placed into the user home directory or into the FMPP home directory. <@a href="commandline.html#fmpprc">More info... - -
    • The <@c>get data loader function returns the values of other variables in the data model. This can be used to pass previously loaded data to other data loaders as parameters, for example:
      - <@c>data: {doc:xml(data/foo.xml), index:com.example.IndexBuilderDataLoader(get(doc))}. <@a href="dataloader.html#key_get">More information... - -
    • Data loader <@c>eval has an optional 2nd parameter, the hash of variables that will be available when the BeansScript is evaluated. For example:
      - <@c>data: eval('<@r>...', {foo:properties(foo.properties), items:get(items)})
      - <@a href="dataloader.html#key_eval">More info.... - -
    • With the new <@s>appendLogFile setting you can specify that the log file is continued, rather than restarted for each processing session. - -
    • <@nbc/>The <@c>fmpp file extension is now reserved for the purposes of FMPP. Files with this extension are never processed (they are ignored). If you had to process files of this extension, protect them using double extension as <@c>test.fmpp.keepme, and then add the extra extension (<@c>keepme in this case) to the <@s>removeExtensions setting. - -
    • The <@s>quiet setting now accepts values <@c>true, <@c>false, and <@c>reallyQuiet. Integer values are supported for backward compatibility only. - -
    • These settings were renamed: <@s false>removePostfix to <@s>removePostfixes, <@s false>removeExtension to <@s>removeExtensions, <@s false>replaceExtension to <@s>replaceExtensions. This change is backward compatible, because the old names are internally translated. - -
    • New FMPP Ant task attribute: <@c>antTaskFailOnError. This tells if the FMPP Ant task should abort the Ant project with error if there were errors during the FMPP processing session. - -
    • <@c>Engine.process(File src, File out) now modifies <@c>null <@s>sourceRoot and/or <@s>outputRoot settings for the time of the method call to the parent directories of the source and output files respectively. - -
    • FMPP build information (build date) can be queried with the new method, <@c>Engine.getBuildInfo. Also now the command-line tool prints it with <@c>--version. - -
    • Improvements to the command-line help, such as new command-line option <@c>--long-help. - -
    • <@nbca/><@c>Engine.process doesn't throw <@c>IOException anymore, only <@c>ProcessingException. - -
    • <@nbca/>The built-in <@c>DataLoader implementations were moved into new package <@c>tdd.dataloaders. - -
    • <@nbca/><@c>tdd.util.StringUtil.excToStr(Throwable) was removed. - -
    • Revisited documentation and site generator. - -
    • Now mode x is set for <@c>bin/* in the tar file. - -
    • Added test suite. (But more test cases should be added...) -
    - -

    Bug fixes: -

      -
    • <@c>fmpp.bat was stopped with error if it didn't find Ant! AAARGH! - -
    • A later nightly build of the uncompleted FreeMarker 2.3 is included. This fixes a FreeMarker bug that has caused the first empty line of the template files ignored, when the template has started with empty line. - -
    • <@nbc/>The FMPP Ant task didn't aborted the Ant project when <@c>stopOnError="false", and the were skipped failed processing. Now it does. Note that the old behavior can be emulated using <@c>antTaskFailOnError="false". - -
    • <@c>pp.locale didn't followed the locale changes made at template execution time with <@c><#setting locale=<@r>...>.
    • - -
    • Various other little fixes here and there... But don't be sad. Many exciting new bugs has been added during the refactorings... ;) -
    - - -<@sect title="0.8.12"> -

    Date of release: 2003-09-30 -

    New features, improvements: -

      -
    • <@nbc/>A later nightly build of the uncompleted FreeMarker 2.3 is included. Unfortunately it contains some incompatible changes (Sorry... :( I will not risk nightly FreeMarker builds anymore after 2.3 is out...): -
        -
      • White-space stripping is now more aggressive as before: it always removes leading and trailing white-space if the line only contains FTL tags. (Earlier the white-space was not removed if the tag was <@c><#include ...> or user-defined directive tag with empty directive syntax as <@c><@myMacro/> (or its equivalents: <@c><@myMacro></@myMacro> and <@c><@myMacro></@>). Now white-space is removed in these cases as well.) Also, top-level white-space that separates macro definitions and/or assignments is now ignored. <@fma href="dgui_misc_whitespace.html#dgui_misc_whitespace_stripping">More information... -
      • The return value of <@c>freemarker.template.TemplateMethodModel.exec(...) is <@c>Object, not <@c>TemplateModel. -
      -
    • New <@c>pp variable: <@c>freemarkerVersion. Also, new <@c>fmpp.Engine method: <@c>fmpp.Engine.getFreeMarkerVersionNumber(). Also, FreeMarker version number is printed together with FMPP version number everywhere. -
    • <@nbca/>API change: <@c>fmpp.Engine.getVersionNumber() does not throw checked exceptions anymore. -
    • New <@c>pp directive: <@c>pp.restartOutputFile. This directive empties the output file, but does not delete the file or discards the further output as <@c>pp.dropOutputFile does.
    • -
    • <@nbc/>New setting: "ignore temporary files". This filters out certain typical temporary/backup files (that is, it chooses ignore processing mode for them), unless you explicitly set this setting to false. The old <@c>.bak and <@c>~* filter mechanism was removed. Note that this all does not affect the FMPP Ant task. <@a href="settings.html#processingMode">More information... -
    -

    Bug fixes: -

      -
    • With setting "borders", using headers with a template that contains <@c><#ftl <@r>...> resulted on illegal FreeMarker template, as nothing can precede the <@c>ftl directive. Now the header is intelligently moved after the <@c>ftl directive. -
    • The documentation of <@c>pp.set and <@c>pp.add was totally confused. -
    • The engine was unable to return the FMPP version number sometimes due class loader issues. -
    • <@nbc/>Setting "ignore CVS files" had lower priority than the processing mode chooser list. Now it has higher priority. -
    • <@nbc/>Setting "ignore CVS files" didn't ignored <@c>.#?* files. Now it does. -
    - - -<@sect title="0.8.11"> -

    Date of release: 2003-08-11 -

    New features, improvements: -

      -
    • <@nbc/>A later nighly build of the uncompleted FreeMarker 2.3 is included. Most importantly, its XML handling is now much better, but unfortunately has incompatible changes: -
        -
      • Attribute queries such as <@c>foo.@bar now return sequences (similarly to child element queries and XPath queries), not single nodes. Because of the rule with node sequences of size 1, it is still good to write <@c><#noparse>${foo.@bar}, but built-ins such as <@c>?exists, <@c>?if_exists or <@c>?default don't work as before. For example, instead of <@c>foo.@bar?default('black'), you now have to write <@c>foo.@bar[0]?default('black'). So if you have used existence built-ins with attributes, you have to find those occurrences in the templates and add that <@c>[0].
      • - -
      • XML name-space handling has been totally reworked and is absolutely incompatible with the old stuff. Don't worry about this if none of your XML input documents use <@c>xmlns.
      • - -
      • Special-keys <@c>@@ and <@c>@* now return a sequence of attribute nodes instead of the hash of them.
      • -
      -
    • The <@c>xml data loader has a new boolean option: <@c>namespaceAware. If this is set to <@c>false, you can load XML files with the logic as XML has worked before the introduction of name-spaces. -
    • Minor fixes/improvements in the manual. -
    -

    Bug fixes: -

      -
    • The FMPP Ant task stopped with error if you have used nested elements and you have executed multiple "top-level" tasks with the same ant invocation. -
    • The snip function of the command-line tool has snipped the text-flood too late sometimes. -
    - - -<@sect title="0.8.10"> -

    Date of release: 2003-07-03 -

    New features, improvements: -

      -
    • <@nbc/>This release uses a nightly build of the uncompleted FreeMarker 2.3. FreeMarker 2.3 adds several important new features to 2.2.x, but it is not fully backward compatible. Do not forget to read the <@fma href="versions_2_3.html">list of uncompatible changes in the FreeMarker Manual! -
    • <@c>antProperties improved: You can give the names of Ant properties you want to expose, as parameters. So if you want to expose only properties <@c>foo and <@c>bar, then just write <@c>antProperties(foo, bar). <@a href="dataloader.html#key_antProperites">More info... -
    • New data loader <@c>antProperty, to expose the value of a single Ant property. <@a href="dataloader.html#key_antProperty">More info... -
    • New data loader <@c>xml, which uses the new XML wrapper of FreeMarker. It replaces the old <@c>xmlInfoset data loader, which is kept only for backward compatibility. <@a href="dataloader.html#key_xml">More info... -
    • Some code clean-up (as removing a few unused variables). -
    • From now, <@c>freemarker.jar will be checked in to the CVS repository. -
    -

    Bug fixes: -

      -
    • <@nbca/> In <@c>fmpp.util.FreemarkerUtil, <@c>FtlVarToCoreJavaObject is now renamed to <@c>ftlVarToCoreJavaObject -
    - - -<@sect title="0.8.9"> -

    Date of release: 2003-05-02 -

    New features, improvements: -

      -
    • Better error messages: FMPP tools now tend to show the whole cause chain, rather than just the top-level exception. -
    • New data loader: <@c>text. This loads a plain text file into a string variable. -
    • New pp variable to retrieve the FMPP Engine version number: <@c>pp.version -
    • Easier to build: -
        -
      • Task for getting the latest nightly FMPP. -
      • Fixed the class loading issues of the "docs" task, so the default target is now "build". -
      -
    • The distribution now works with JDK 1.2.2 -
    • Minor additions to the Manual. -
    -

    Bug fixes: -

      -
    • The Ant build was not working without <@c>build.properties. -
    • The localized lookup feature of FreeMarker was not disabled, and it could cause confusing effects. -
    • The log file didn't stored the source file path for errors that was logged before the "END OF PROCESSING SESSION" message. -
    - - -<@sect title="0.8.8"> -

    Date of release: 2003-04-29 -

    New features, improvements: -

      -
    • Rewritten <@c>fmpp.bat; it is now more flexible. -
    • More documentation. No more "Under Construction" logo. -
    • New <@c>pp hash methods: <@c>outputFileLastModified, <@c>sourceFileLastModified, <@c>realFileLastModified -
    -

    Bug fixes: -

      -
    • Predefined data loader <@c>now didn't used the "time zone" FMPP engine setting. -
    • The "turns" setting was missing from the Manual. -
    • Fixing some typos in the error messages and in the documentation. -
    - - -<@sect title="0.8.7"> -

    Date of release: 2003-04-12 -

    New features, improvements: -

      -
    • New date/time related settings of FreeMarker 2.2.1 are exposed now: date format, time format, datetime format, time zone -
    • Date/time related <@c>pp variables: <@c>now, <@c>sessionStart. -
    • Final version of FreeMarker 2.2.1 is included. -
    -

    Bug fixes: -

      -
    • The classpath in <@c>fmpp.jar didn't included <@c>bsh.jar. -
    - - -<@sect title="0.8.6"> -

    Date of release: 2003-04-06 -

    New features, improvements: -

      -
    • New pp method: <@c>pp.loadData(<@r>dataLoaderName, <@r>args...). This can be used to load data into a variable in templates, with the same data loaders as with the "data" setting. <@a href="pphash.html#loadData">More information... -
    • New <@c>Engine method: <@c>TemplateModel wrap(Object obj) -
    • Newer nightly build of FreeMarker is included (2.2.1). -
    -

    Bug fixes: -

      -
    • <@nbca/><@c>DataLoader.load(engine, args) now uses <@c>List instead of <@c>ArrayList for the <@c>args. -
    • The <@c>install target of <@c>build.xml forgot to copy <@c>bsh.jar. -
    • Minor fixes in the documentation. -
    - - -<@sect title="0.8.5"> -

    Date of release: 2003-03-23 -

    New features, improvements: -

      -
    • New built-in data loader directive: <@c>eval(<@r>JavaExpression) -
    -

    Bug fixes: -

      -
    • Fixes in the documentation. -
    - - -<@sect title="0.8.4"> -

    Date of release: 2003-03-21 -

    New features, improvements: -

      -
    • More documentation. Especially in the <@a href="commandline.html">documentation of the command-line tool. -
    • New setting: replace extension -
    • <@nbc/>If the option <@c>remove-extension or <@c>remove-postfix is specified both in the configuration file and in the command-line, then the two option parameter values will be merged. -
    • Newer nightly build of FreeMarker 2.2 is included. -
    -

    Bug fixes: -

      -
    • The output file name deduction was applied twice in certain situations. -
    - - -<@sect title="0.8.3"> -

    Date of release: 2003-03-16 -

    New features, improvements: -

      -
    • <@c>bin/fmpp and <@c>bin\fmpp.bat now can load the FMPP realted jars from the <@c>ANT_HOME. -
    • Added <@c>install target to <@c>build.xml that copies the jars to the <@c>ANT_HOME.
    • -
    • More detailed installing instructions.
    • -
    -

    Bug fixes: -

      -
    • <@c>fmpp.FileUtil.compressPath has died with <@c>IndexOutOfBounds in rare cases. -
    • <@c>rar was missing from the list of static file extensions. -
    - - -<@sect title="0.8.2"> -

    Date of release: 2003-03-13 -

    New features, improvements: -

      -
    • Block assignments instead of <@c>@capture. For example, instead of <@c><@capture local="foo"><@r>...</@capture> you can write <@c><#local foo><@r>...</#local>. -
    • New pp methods to calculate relative paths: <@c><@a href="pphash.html#key_pathTo">pathTo and <@c><@a href="pphash.html#key_sourcePathTo">sourcePathTo.
    • -
    • <@c>fmpp.FileUtil.getRelativePath does no require anymore that the starting point is an ascendent directory of the destination. -
    • Newer nightly build of FreeMarker 2.2 is included (supports block assignments + bug fixes). -
    -

    Bug fixes: -

      -
    • <@c>fmpp.FileUtil.getRelativePath has returned bad results in some rare situations. -
    - - -<@sect title="0.8.1"> -

    Date of release: 2003-03-10 -

    New features, improvements: -

      -
    • Added "ignore CVS files" setting. -
    • Added <@c>xml_infoset example. -
    • Simplified build process. -
    • Some minor fixes in the html-s and txt-s. -
    • Newer nightly build of FreeMarker 2.2 is included. -
    • <@nbc/><@c>?chop was renamed to <@c>?chop_linebreak (due the changes in the FreeMarker 2.2 CVS head) -
    • <@nbc/>CVS files (<@c>**/.cvsignore and <@c>**/CVS/) in the source directory will be ignored by default. -
    -

    Bug fixes: -

      -
    • The <@c>Manifest.mf in <@c>fmpp.jar was empty. -
    • Last-generated date was incorrect on the HTML pages. -
    - - -<@sect title="0.8.0"> -

    Date of release: 2003-03-05 -

    The initial Sourceforge release. - - - diff --git a/fmpp/src/docs/writefrontend.html b/fmpp/src/docs/writefrontend.html deleted file mode 100644 index 61a1a4c..0000000 --- a/fmpp/src/docs/writefrontend.html +++ /dev/null @@ -1,71 +0,0 @@ -<@page title="Writing New Front-ends" keywords="front-end, front-ends, custom, write, embed"> - -<@note>I'm talking about writing front-ends here, but of course the same technique can be used to embed FMPP into your application that you couldn't call a front-end. - -

    The low-level method is to create an <@c>fmpp.Engine object, and then set it up with its methods, and then call its <@c>process(<@r>...) method to execute a processing session. The API of this object reflects the internal architecture of FMPP. Higher-level concepts as <@a href="settings.html">settings or <@a href="configfile.html">configuration files doesn't exist on this level. So I don't recommend you to work with <@c>fmpp.Engine objects directly.

    - -

    The high-level method is to create an <@c>fmpp.setting.Settings object, and fill it with the setting values. This object can load configuration files, and its API uses a higher level approach in general. This is the object where <@a href="settings.html">FMPP settings are implemented. After you set the setting values (and also you have added progress listeners and engine attributes you wanted), invoke <@c>Settings.execute() to execute a processing session.

    - -<@figure src="fmpparch.png" alt="FMPP architecture"> - The components involved in typical FMPP usage. Red arrow shows direct method invocation (or constructor invocation, or static field access) between the components. The arrow points from the caller towards the called. Dashed lines indicate unimportant or occasional access. - - -

    Note that some settings are not implemented by <@c>Settings (as <@s>echoFormat, <@s>logFile, ...etc.), and should be implemented by the front-end.

    - -

    For more information, please see <@a href="api/index.html">the API documentation. Also, you can look into the source code of <@c>fmpp.tools.CommandLine and <@c>fmpp.tools.AntTask.

    - -

    Example: Below is the source code of a very simple command-line front-end. It accepts one argument, the name of the configuration file to use. If that's omitted, it tries to load a configuration file from the current directory.

    - -<@prg> -package fmpp.testsuite; - -import java.io.File; - -import fmpp.ProcessingException; -import fmpp.progresslisteners.ConsoleProgressListener; -import fmpp.setting.SettingException; -import fmpp.setting.Settings; -import fmpp.util.MiscUtil; -import freemarker.log.Logger; - -public class AdhocFrontEnd { - public static void main(String[] args) { - // Parse command-line args - File cfgFile = null; - if (args.length == 0) { - cfgFile = new File("."); // load the cfg. of the the current dir. - } else if (args.length == 1) { - cfgFile = new File(args[0]); - } else { - System.err.println( - "Usage: java AdhocFrontEnd [configuration-file]"); - System.exit(-1); - } - - // Shut FreeMarker logger up - try { - Logger.selectLoggerLibrary(Logger.LIBRARY_NONE); - } catch (ClassNotFoundException e) { - throw new RuntimeException( - "Failed to disable FreeMarker logging."); - } - - // Now comes the meat... - try { - Settings ss = new Settings(new File(".")); - ss.load(cfgFile); - ss.addProgressListener(new ConsoleProgressListener()); - ss.execute(); - System.out.println("Done."); - } catch (SettingException e) { - System.err.println(MiscUtil.causeMessages(e)); - System.exit(-2); - } catch (ProcessingException e) { - System.err.println(MiscUtil.causeMessages(e)); - System.exit(-3); - } - } -} - - - diff --git a/fmpp/src/main/java/fmpp/DataModelBuildingException.java b/fmpp/src/main/java/fmpp/DataModelBuildingException.java deleted file mode 100644 index 113f91f..0000000 --- a/fmpp/src/main/java/fmpp/DataModelBuildingException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import fmpp.util.ExceptionCC; - -/** - * Error while trying to build the data-model for a template. - * Usually you meet this exception as the root cause of a - * {@link ProcessingException} - */ -public class DataModelBuildingException extends ExceptionCC { - - public DataModelBuildingException(Throwable cause) { - super(cause); - } - - public DataModelBuildingException(String message) { - super(message); - } - - public DataModelBuildingException(String message, Throwable cause) { - super(message, cause); - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/Engine.java b/fmpp/src/main/java/fmpp/Engine.java deleted file mode 100644 index f8cdaaf..0000000 --- a/fmpp/src/main/java/fmpp/Engine.java +++ /dev/null @@ -1,3161 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TimeZone; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import fmpp.util.BorderedReader; -import fmpp.util.BugException; -import fmpp.util.ExceptionCC; -import fmpp.util.FileUtil; -import fmpp.util.InstallationException; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; -import freemarker.ext.beans.BeansWrapper; -import freemarker.ext.beans.BeansWrapperBuilder; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.TemplateExceptionHandler; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNodeModel; -import freemarker.template.Version; - -/** - * The bare-bone, low-level preprocessor engine. Since FMPP 0.9.0 you should - * rather use a {@link fmpp.setting.Settings} object instead of directly using - * this class. - * - *

    {@link Engine fmpp.Engine} vs {@link fmpp.setting.Settings}: - * The design of the {@link Engine} object API is driven by the internal - * architecture of FMPP system. It doesn't consider front-ends, doesn't know - * configuration files or similar high-level stuff. {@code Settings} - * wraps the Engine object, and implements end-user (front-end) centric - * concepts, as the settings and configuration files described in the FMPP - * Manual. The API of {@link Engine} is more natural and convenient - * than the API of a {@code Map}-like object as a - * {@code Settings} object. But {@code Settings} are far easier - * to use if you want FMPP behave as described in the FMPP Manual from the - * viewpoint of end-user. In principle, if FMPP is used embedded in a way - * that the end-user will never face FMPP (doesn't use the FMPP Manual, - * etc.), using the {@link Engine} object directly can be a good - * solution. But, since the Java programmers get know FMPP through the - * higher-level concepts (they try it with the command-line tool, etc.), I - * say, just use {@code Settings} always. The resource usage overhead - * is negligible, and all capabilities of the {@link Engine} will be - * available, plus some extra features (as configuration files). So basically, - * the introduction of {@code Settings} has degraded {@link Engine} to - * an internally used object. - * - *

    Engine parameters: - * Engine parameters are very similar to "settings" discussed in the - * FMPP Manual. You will usually find trivial one-to-one correspondence between - * settings and engine parameters, but not always. Settings use the - * front-end/end-user's viewpoint, and are mostly built on the top of engine - * parameters, while engine parameters use FMPP system implementation driven - * approach. - *
    The value of engine parameters can't be set while a processing session is - * executing. An attempt to do so will result in - * {@link java.lang.IllegalStateException}. Thus, for example, you can't change - * an engine parameter from an executing template. Also, you should not change - * the objects stored as "data" (i.e. the variables that are visible for all - * templates) while the processing session is executing, even though it's not - * prevented technically (because it can't be...). - * - *

    Life-cycle: The engine object can be used for multiple processing - * sessions. However, the typical usage is that it is used - * only for a single processing session. The state of the engine object possibly - * changes during sessions because of the engine attributes (see - * {@link #setAttribute(String, Object)}), and because plugged long-lived - * objects as local data builders and progress listeners can maintain state - * through multiple sessions. These objects should behave so that the output - * files of a session is not influenced by earlier sessions. - */ -public class Engine { - - /** Processing mode: N/A */ - public static final int PMODE_NONE = 0; - - /** Processing mode: Execute the file as template */ - public static final int PMODE_EXECUTE = 1; - - /** Processing mode: Copy the file as-is (binary copy). */ - public static final int PMODE_COPY = 2; - - /** Processing mode: Ignore the file. */ - public static final int PMODE_IGNORE = 3; - - /** Processing mode: Render XML with an FTL template. */ - public static final int PMODE_RENDER_XML = 4; - - /** Used with the "skipUnchnaged" engine parameter: never skip files */ - public static final int SKIP_NONE = 0; - - /** - * Used with the "skipUnchanged" engine parameter: skip unchanged static - * files - */ - public static final int SKIP_STATIC = 1; - - /** - * Used with the "skipUnchanged" engine parameter: skip all unchanged - * files - */ - public static final int SKIP_ALL = 2; - - /** - * A commonly used reserved parameter value: {@code "source"}. - */ - public static final String PARAMETER_VALUE_SOURCE = "source"; - - /** - * A commonly used reserved parameter value: {@code "source"}. - */ - public static final String PARAMETER_VALUE_OUTPUT = "output"; - - /** - * A commonly used reserved parameter value: {@code "host"}. - */ - public static final String PARAMETER_VALUE_HOST = "host"; - - /** - * Used as the value of the "xmlEngine" engine parameter: keep the current - * JVM level setting. - */ - public static final String XPATH_ENGINE_DONT_SET = "dontSet"; - - /** - * Used as the value of the "xmlEngine" engine parameter: Let FreeMarker - * choose. - */ - public static final String XPATH_ENGINE_DEFAULT = "default"; - - /** - * Used as the value of the "xmlEngine" engine parameter: Force the usage - * of Xalan. - */ - public static final String XPATH_ENGINE_XALAN = "xalan"; - - /** - * Used as the value of the "xmlEngine" engine parameter: Force the usage - * of Jaxen. - */ - public static final String XPATH_ENGINE_JAXEN = "jaxen"; - - private static final String IGNOREDIR_FILE = "ignoredir.fmpp"; - - private static final String CREATEDIR_FILE = "createdir.fmpp"; - - private static final Set STATIC_FILE_EXTS = new HashSet(); - static { - String[] list = new String[] { - "jpg", "jpeg", "gif", "png", "swf", "bmp", "pcx", "tga", "tiff", - "ico", - "zip", "gz", "tgz", "jar", "ace", "bz", "bz2", "tar", "arj", - "rar", "lha", "cab", "lzh", "taz", "tz", "arc", - "exe", "com", "msi", "class", "dll", - "doc", "xls", "pdf", "ps", "chm", - "avi", "wav", "mp3", "mpeg", "mpg", "wma", "mov", "fli"}; - for (int i = 0; i < list.length; i++) { - STATIC_FILE_EXTS.add(list[i]); - } - } - - private static String cachedVersion; - private static String cachedBuildInfo; - - // Settins - private File srcRoot, outRoot, dataRoot; - private boolean dontTraverseDirs; - private Map freemarkerLinks = new HashMap(); - private boolean stopOnError = true; - private Map data = new HashMap(); - private LayeredChooser localDataBuilders = new LayeredChooser(); - private TemplateDataModelBuilder tdmBuilder; - private String outputEncoding = PARAMETER_VALUE_SOURCE; - private String urlEscapingCharset = PARAMETER_VALUE_OUTPUT; - private LinkedList pModeChoosers = new LinkedList(); - private LayeredChooser headerChoosers = new LayeredChooser(); - private LayeredChooser footerChoosers = new LayeredChooser(); - private LinkedList turnChoosers = new LinkedList(); - private boolean csPathCmp = false; - private boolean expertMode = false; - private ArrayList removeExtensions = new ArrayList(); - private ArrayList removePostfixes = new ArrayList(); - private ArrayList replaceExtensions = new ArrayList(); - private int skipUnchanged; - private boolean alwaysCrateDirs = false; - private boolean ignoreCvsFiles = true; - private boolean ignoreSvnFiles = true; - private boolean ignoreTemporaryFiles = true; - private String xpathEngine = XPATH_ENGINE_DONT_SET; - private Object xmlEntityResolver; - private boolean validateXml = false; - private List xmlRendCfgCntrs = new ArrayList(); - - // Misc - private Configuration fmCfg; - private MultiProgressListener progListeners = new MultiProgressListener(); - private TemplateEnvironment templateEnv; - private int maxTurn, currentTurn; - private Map attributes = new HashMap(); - private Boolean chachedXmlSupportAvailable; - private boolean parametersLocked; - - // Session state - private Map ignoredDirCache = new HashMap(); - private Set processedFiles = new HashSet(); - - /** - * Same as {@link #Engine(BeansWrapper) Engine(null)}. - * - * @deprecated Use {@link #Engine(BeansWrapper, Version)} instead. - */ - public Engine() { - this(null); - } - - /** - * Same as - * {@link #Engine(BeansWrapper, Version) Engine(beansWrapper, null)}. - * - * @deprecated Use {@link #Engine(BeansWrapper, Version)} instead. - */ - public Engine(BeansWrapper beansWrapper) { - this(beansWrapper, null); - } - - /** - * Creates a new FMPP engine instance. - * Use the setter methods (as {@code setProgressListener}) to configure - * the new instance. - * - * @param beansWrapper the FreeMarker beans-wrapper that this instance - * will use. Just use {@code null} if you don't know what's this. - * If you do know what's this, note that FMPP by default (when this - * parameter is {@code null}) uses a {@code BeansWrapper} with - * {@code simpleMapWrapper} set to {@code true}. - * - * @param fmIncompImprovements Sets the "incompatible improvements" version of FreeMarker. You should set this to - * the current FreeMarker version in new projects. See {@link Configuration#Configuration(Version)} for details. - * If it's at least {@code 2.3.21} and {@code beansWrapper} is {@code null}, the default will be created using - * {@link BeansWrapperBuilder} instead of {@code new BeansWrapper()}, which means that that the resulting - * {@link BeansWrapper} will be a shared singleton with read-only settings. - */ - public Engine(BeansWrapper beansWrapper, Version fmIncompImprovements) { - fmCfg = fmIncompImprovements != null ? new Configuration(fmIncompImprovements) : new Configuration(); - - if (beansWrapper == null) { - if (fmIncompImprovements == null - || fmIncompImprovements.intValue() < Configuration.VERSION_2_3_21.intValue()) { - // The old (deprecated) way: - BeansWrapper bw = fmIncompImprovements != null - ? new BeansWrapper(fmIncompImprovements) : new BeansWrapper(); - bw.setSimpleMapWrapper(true); - fmCfg.setObjectWrapper(bw); - } else { - BeansWrapperBuilder bwb = new BeansWrapperBuilder(fmIncompImprovements); - bwb.setSimpleMapWrapper(true); - fmCfg.setObjectWrapper(bwb.build()); - } - } else { - fmCfg.setObjectWrapper(beansWrapper); - } - - fmCfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - fmCfg.setTemplateUpdateDelay(Integer.MAX_VALUE - 10000); - fmCfg.setDefaultEncoding("ISO-8859-1"); - fmCfg.setLocale(Locale.US); - fmCfg.setNumberFormat("0.############"); - fmCfg.setLocalizedLookup(false); - - templateEnv = new TemplateEnvironment(this); - - clearModeChoosers(); - } - - // ------------------------------------------------------------------------- - // Processing - - /** - * Processes a list of files. - * - *

    The source root and output root directory must be set (non-null) prior - * to calling this method. - * - * @see #process(File, File) - * - * @param sources The list of files to process. All file must be inside - * the source root. The files will be processed in the order as they - * appear in the list, except that if you use multiple turns, they - * are re-sorted based on the associated turns (the original order - * of files is kept inside turns). - * - * @throws ProcessingException if {@code Engine.process} has - * thrown any exception. The message of this exception holds nothing - * interesting (just a static text). Call its {@code getCause()} - * method to get the exception that caused the termination. Note that - * all (so even non-checked exceptions) thrown be the engine are - * catched and wrapped by this exeption. - */ - public void process(File[] sources) - throws ProcessingException { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_BEGIN_PROCESSING_SESSION, - null, PMODE_NONE, - null, null); - try { - try { - setupSession(); - } catch (IllegalConfigurationException e) { - throw new ProcessingException(this, null, e); - } - try { - File src; - File[] srcs = new File[sources.length]; - for (int i = 0; i < sources.length; i++) { - src = sources[i].getCanonicalFile(); - - if (!FileUtil.isInsideOrEquals(src, srcRoot)) { - throw new IOException( - "The source file (" - + src.getPath() - + ") is not inside the source root (" - + srcRoot.getPath() + ")"); - } - - srcs[i] = src; - } - - for (; currentTurn <= maxTurn; currentTurn++) { - for (int i = 0; i < srcs.length; i++) { - if (srcs[i] != null) { - boolean done; - - File out = new File( - outRoot, - FileUtil.getRelativePath(srcRoot, srcs[i])); - - if (srcs[i].isDirectory()) { - done = processDir(srcs[i], out); - } else { - done = processFile(srcs[i], out, true); - } - if (done) { - srcs[i] = null; - } - } - } - } - } finally { - cleanupSession(); - } - } catch (ProcessingException e) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - e, null); - throw e; - } catch (IOException e) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - e, null); - throw new ProcessingException(this, null, e); - } - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - null, null); - } - - private boolean isDirMarkedWithIgnoreFile(File dir) - throws IOException { - boolean ign; - Boolean ignore = (Boolean) ignoredDirCache.get(dir); - if (ignore != null) { - return ignore.booleanValue(); - } - if (!dir.equals(srcRoot)) { - File parentDir = dir.getParentFile(); - if (parentDir != null && isDirMarkedWithIgnoreFile(parentDir)) { - ignoredDirCache.put(dir, Boolean.TRUE); - return true; - } - } - ign = new File(dir, IGNOREDIR_FILE).exists(); - ignoredDirCache.put(dir, ign ? Boolean.TRUE : Boolean.FALSE); - return ign; - } - - /** - * Hack to processes a single file. - * - *

    If the source root and/or output root directory is not set, they - * will be set for the time of this method call to the parent diretories of - * the source and output files respectively. - * - * @see #process(File[]) - * - * @param src the source file (not directory). Can't be null. - * @param out the output file (not directory). Can't be null. - * - * @throws ProcessingException if {@code Engine.process} has - * thrown any exception. The message of this exception holds nothing - * interesting (just a static text). Call its {@code getCause()} - * method to get the exception that caused the termination. Note that - * all (so even non-checked exceptions) thrown be the engine are - * catched and wrapped by this exception. - */ - public void process(File src, File out) - throws ProcessingException { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_BEGIN_PROCESSING_SESSION, - null, PMODE_NONE, - null, null); - File oldSrcRoot = srcRoot; - File oldOutRoot = outRoot; - try { - try { - if (src == null) { - throw new IllegalArgumentException( - "The source argument can't be null."); - } - if (out == null) { - throw new IllegalArgumentException( - "The output argument can't be null."); - } - - src = src.getCanonicalFile(); - if (!src.exists()) { - throw new IOException( - "Source file not found: " - + src.getPath()); - } - if (src.isDirectory()) { - throw new IOException( - "Source file can't be a directory: " - + src.getPath()); - } - - out = out.getCanonicalFile(); - if (out.exists() && out.isDirectory()) { - throw new IOException( - "The output file can't be a directory."); - } - - if (srcRoot == null) { - setSourceRoot(src.getParentFile()); - } - - if (outRoot == null) { - setOutputRoot(out.getParentFile()); - } - - try { - setupSession(); - } catch (IllegalConfigurationException e) { - throw new ProcessingException(this, null, e); - } - try { - if (!FileUtil.isInsideOrEquals(src, srcRoot)) { - throw new IOException( - "The source file (" - + src.getPath() - + ") is not inside the source root (" - + srcRoot.getPath() + ")"); - } - - if (!FileUtil.isInsideOrEquals(out, outRoot)) { - throw new IOException( - "The output file (" - + out.getPath() - + ") is not inside the output root (" - + outRoot.getPath() + ")"); - } - - for (; currentTurn <= maxTurn; currentTurn++) { - processFile(src, out, false); - } - } finally { - cleanupSession(); - } - } catch (ProcessingException e) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - e, null); - throw e; - } catch (IOException e) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - e, null); - throw new ProcessingException(this, null, e); - } - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_PROCESSING_SESSION, - null, PMODE_NONE, - null, null); - } finally { - // clear auto-deduced root dirs. - if (oldSrcRoot == null) { - srcRoot = null; - } - if (oldOutRoot == null) { - outRoot = null; - } - } - } - - private void setupSession() - throws IOException, IllegalConfigurationException { - if (srcRoot == null) { - throw new IllegalConfigurationException( - "The source root directory was not set."); - } - if (outRoot == null) { - throw new IllegalConfigurationException( - "The output root directory was not set."); - } - if (!srcRoot.exists()) { - throw new IOException("Source root directory does not exists."); - } - if (!srcRoot.isDirectory()) { - throw new IOException("Source root is not a directory."); - } - if (outRoot.exists() && !outRoot.isDirectory()) { - throw new IOException("Output root is not a directory."); - } - - boolean done = false; - try { - if (!xpathEngine.equals(XPATH_ENGINE_DONT_SET)) { - EngineXmlUtils.setFreeMarkerXPathEngine(xpathEngine); - } - - maxTurn = 1; - Iterator it = turnChoosers.iterator(); - while (it.hasNext()) { - int t = ((TurnChooser) it.next()).turn; - if (t > maxTurn) { - maxTurn = t; - } - } - currentTurn = 1; - - fmCfg.setTemplateLoader(new FmppTemplateLoader(this)); - fmCfg.clearTemplateCache(); - - fmCfg.clearSharedVariables(); - it = data.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - try { - fmCfg.setSharedVariable( - (String) ent.getKey(), ent.getValue()); - } catch (TemplateModelException e) { - throw new IllegalConfigurationException( - "Failed to convert data " - + StringUtil.jQuote((String) ent.getKey()) - + " to FreeMarker variable.", - e); - } - } - - processedFiles.clear(); - ignoredDirCache.clear(); - - templateEnv.setupForSession(); - - lockParameters(); - - done = true; - } finally { - if (!done) { - cleanupSession(); - } - } - } - - private void cleanupSession() { - unlockParameters(); - - templateEnv.cleanAfterSession(); - - processedFiles.clear(); - ignoredDirCache.clear(); - fmCfg.clearTemplateCache(); - fmCfg.clearSharedVariables(); - } - - private boolean processDir(File srcDir, File dstDir) - throws IOException, ProcessingException { - - if (isDirMarkedWithIgnoreFile(srcDir)) { - return true; - } - - String name = srcDir.getName(); - if (ignoreCvsFiles) { - if (name.equals("CVS") - || (!csPathCmp && name.equalsIgnoreCase("CVS"))) { - return true; - } - } - if (ignoreSvnFiles) { - if (name.equals(".svn") - || (!csPathCmp && name.equalsIgnoreCase(".svn"))) { - return true; - } - } - - if (alwaysCrateDirs || new File(srcDir, CREATEDIR_FILE).isFile()) { - if (!dstDir.exists()) { - if (!dstDir.mkdirs()) { - throw new IOException( - "Failed to create directory: " - + dstDir.getAbsolutePath()); - } - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_CREATED_EMPTY_DIR, - srcDir, - PMODE_NONE, null, null); - } - } - - if (!dontTraverseDirs) { - File[] dir = srcDir.listFiles(); - for (int i = 0; i < dir.length; i++) { - File sf = dir[i]; - String fn = sf.getName(); - File df = new File(dstDir, fn); - if (sf.isDirectory()) { - processDir(sf, df); - } else { - processFile(sf, df, true); - } - } - } - - return false; - } - - private boolean processFile(File sf, File df, boolean allowOutFAdj) - throws IOException, ProcessingException { - if (isDirMarkedWithIgnoreFile( - sf.getParentFile().getCanonicalFile())) { - return true; - } - - if (sf.getName().equalsIgnoreCase(CREATEDIR_FILE)) { - File srcDir = sf.getParentFile(); - // Re-check with the comparison rules of the file-system - if (new File(srcDir, CREATEDIR_FILE).exists()) { - File dstDir = df.getParentFile(); - if (!dstDir.exists()) { - if (!dstDir.mkdirs()) { - throw new IOException( - "Failed to create directory: " - + dstDir.getAbsolutePath()); - } - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_CREATED_EMPTY_DIR, - srcDir, - PMODE_NONE, null, null); - } - return true; - } - } - - if (currentTurn != getTurn(sf)) { - return false; - } - if (!processedFiles.add(sf)) { - return true; - } - - int pmode = getProcessingMode(sf); - - Throwable catchedExc = null; - - try { - if (allowOutFAdj && pmode != Engine.PMODE_IGNORE) { - df = adjustOutputFileName(df); - } - if (!expertMode && pmode != Engine.PMODE_IGNORE) { - if (sf.equals(df)) { - throw new IOException( - "The input and output files are the same (" - + sf.getPath() - + "); if you want to allow this, " - + "you should turn on expert mode."); - } - } - if (pmode != Engine.PMODE_IGNORE - && (skipUnchanged == SKIP_ALL - || (skipUnchanged == SKIP_STATIC - && pmode == Engine.PMODE_COPY))) { - long dfl = df.lastModified(); - long sfl = sf.lastModified(); - if (df.exists() && dfl > 0 && sfl > 0 && dfl == sfl) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_SOURCE_NOT_MODIFIED, - sf, pmode, - null, null); - return true; //! - } - } - } catch (Throwable e) { - // delay the throwing of exc. as if it was happen while processing - catchedExc = e; - } - - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_BEGIN_FILE_PROCESSING, - sf, pmode, - null, null); - try { - if (catchedExc != null) { - throw catchedExc; - } - - switch (pmode) { - case PMODE_EXECUTE: - executeFile(sf, df); - break; - case PMODE_COPY: - File dstDir; - dstDir = df.getParentFile(); - if (dstDir != null) { - dstDir.mkdirs(); - } - FileUtil.copyFile(sf, df); - break; - case PMODE_RENDER_XML: - renderXmlFile(sf, df); - break; - case PMODE_IGNORE: - break; - default: - throw new BugException( - "Bad processing mode in the procModeChoosers:" + pmode); - } - } catch (Throwable e) { - catchedExc = e; - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_FILE_PROCESSING, - sf, pmode, - e, null); - } - if (catchedExc == null) { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_END_FILE_PROCESSING, - sf, pmode, - null, null); - } else { - // OutOfMemoryError-s can cause Java applications to enter an - // inconsistent state, so it's better stop the session. - if (stopOnError || catchedExc instanceof OutOfMemoryError) { - throw new ProcessingException(this, sf, catchedExc); - } - } - return true; - } - - private void executeFile(File sf, File df) - throws ProcessingException, DataModelBuildingException, - TemplateException, IOException { - Template template - = fmCfg.getTemplate(FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(srcRoot, sf))); - - String outEnc = getOutputEncoding(); - if (outputEncoding.equalsIgnoreCase(PARAMETER_VALUE_SOURCE)) { - outEnc = template.getEncoding(); - } - - FmppOutputWriter out = new FmppFileOutputWriter(this, df, outEnc); - boolean done = false; - try { - templateEnv.execute(template, out, sf, null, null, null); - done = true; - } finally { - out.close(!done); - } - } - - private void renderXmlFile(File sf, File df) - throws ProcessingException, DataModelBuildingException, - TemplateException, IOException, InstallationException, - GenericProcessingException { - final XmlRenderingConfiguration xrc; - Object loadedDoc = null; // this is an org.w3c.Document - boolean isLoadedDocumentValidated = false; - { - String sfPathForComparison = null; - int xrccln = xmlRendCfgCntrs.size(); - int xrccIdx; - XmlRenderingConfiguration curXRC = null; - findMatchingXRC: for (xrccIdx = 0; xrccIdx < xrccln; xrccIdx++) { - XmlRenderingCfgContainer curXRCC = (XmlRenderingCfgContainer) xmlRendCfgCntrs.get(xrccIdx); - curXRC = curXRCC.xmlRenderingCfg; - - // Filter: ifSourceIs - { - int ln = curXRCC.compiledPathPatterns.length; - if (ln != 0) { - if (sfPathForComparison == null) { - sfPathForComparison = normalizePathForComparison( - FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(srcRoot, sf))); - } - int i; - for (i = 0; i < ln; i++) { - if (curXRCC.compiledPathPatterns[i].matcher(sfPathForComparison).matches()) { - break; - } - } - if (i == ln) { - // curXRC was excluded - continue findMatchingXRC; - } - } - } // end Filter: ifSourceIs - // At this point: we know that "ifSourceIs" doesn't exclude curXRC - - // Filter: ifDocumentElementIs - { - int ln = curXRC.getDocumentElementLocalNames().size(); - if (ln != 0) { - if (loadedDoc == null) { - Object o = curXRC.getXmlDataLoaderOptions().get("validate"); - if (o == null) { - o = getValidateXml() ? Boolean.TRUE : Boolean.FALSE; - } - isLoadedDocumentValidated = Boolean.TRUE.equals(o); - loadXml: while (true) { - try { - loadedDoc = EngineXmlUtils.loadXmlFile( - this, sf, isLoadedDocumentValidated); - } catch (Exception e) { - if (isLoadedDocumentValidated) { - isLoadedDocumentValidated = false; - // Retry without validation: - continue loadXml; - } - throw new DataModelBuildingException( - "Failed to load XML source file.", e); - } - break loadXml; - } - } - // At this point: loadedDoc is non-null - - List localNames = curXRC.getDocumentElementLocalNames(); - List namespaces = curXRC.getDocumentElementNamespaces(); - int i; - for (i = 0; i < ln; i++) { - if (EngineXmlUtils.documentElementEquals( - loadedDoc, - (String) namespaces.get(i), - (String) localNames.get(i))) { - break; - } - } - if (i == ln) { - // curXRC was excluded - continue findMatchingXRC; - } - } - } // end Filter: ifDocumentElementIs - // At this point: we know that "ifDocumentElementIs" doesn't exclude curXRC - - // Nothing has excluded it, so curXRC is matching: - break findMatchingXRC; - } // findRendering - - xrc = xrccIdx != xrccln ? curXRC : null; - } // end find matching XRC - if (xrc == null) { - throw new GenericProcessingException( - "The source file has to be processed in " - + "\"renderXml\" mode, but there is no matching " - + "XML rendering configuration for it. " - + "(Check the if... options of the XML rendering " - + "configurations)"); - } - - if (xrc.getCopy()) { - File dstDir; - dstDir = df.getParentFile(); - if (dstDir != null) { - dstDir.mkdirs(); - } - FileUtil.copyFile(sf, df); - } else { - Object xmlDLValidateOpt = xrc.getXmlDataLoaderOptions().get("validate"); - if (xmlDLValidateOpt == null) { - xmlDLValidateOpt = Boolean.valueOf(getValidateXml()); - } - boolean doctMustBeValidated = Boolean.TRUE.equals(xmlDLValidateOpt); - if (isLoadedDocumentValidated != doctMustBeValidated) { - loadedDoc = null; - } - if (loadedDoc == null) { - try { - loadedDoc = EngineXmlUtils.loadXmlFile(this, sf, doctMustBeValidated); - } catch (Exception e) { - throw new DataModelBuildingException( - "Failed to load the XML source file.", e); - } - } - - TemplateNodeModel wrappedDoc; - List args = new ArrayList(2); - args.add(""); - args.add(xrc.getXmlDataLoaderOptions()); - try { - wrappedDoc = EngineXmlUtils.loadWithXmlDataLoader(this, args, loadedDoc); - } catch (Exception e) { - throw new DataModelBuildingException( - "Failed to load the XML source file.", e); - } - - Template template; - try { - template = fmCfg.getTemplate(xrc.getTemplatePath()); - } catch (IOException e) { - throw new GenericProcessingException( - "Failed to load the template specified by the XML " - + "rendering configuration: " + xrc.getTemplatePath(), - e); - } - - String outEnc = getOutputEncoding(); - if (outputEncoding.equalsIgnoreCase(PARAMETER_VALUE_SOURCE)) { - outEnc = template.getEncoding(); - } - - FmppOutputWriter out = new FmppFileOutputWriter(this, df, outEnc); - boolean done = false; - try { - templateEnv.execute( - template, out, sf, - loadedDoc, wrappedDoc, xrc.getLocalDataBuilders()); - done = true; - } finally { - out.close(!done); - } - } - } - - // ------------------------------------------------------------------------- - // Engine parameters - - public boolean getStopOnError() { - return stopOnError; - } - - public void setStopOnError(boolean stopOnError) { - checkParameterLock(); - this.stopOnError = stopOnError; - } - - /** - * Returns the output root directory. - * This can be null. However, it is never null while a processing session is - * running, since the output root must be specified for successfully start a - * processing session. - * - *

    The returned {@code File} is always a canonical - * {@code File}.

    - */ - public File getOutputRoot() { - return outRoot; - } - - /** - * Sets the root directory of output files. - * If it is null, the output directory will be used if the output is a - * directory, otherwise the parent directory of the output file. - * Initially this engine parameter is null. - */ - public void setOutputRoot(File outputRoot) - throws IOException { - checkParameterLock(); - this.outRoot = outputRoot.getCanonicalFile(); - } - - /** - * Returns the source root directory. - * This can be null. However, it is never null while a processing session is - * runing, since the source root must be specified for successfully start a - * processing session. - * - *

    The returned {@code File} is always a canonical - * {@code File}.

    - */ - public File getSourceRoot() { - return srcRoot; - } - - /** - * Sets the root directory of source files. - * If it is null, the source directory will be used if the source is a - * directory, otherwise the parent directory of the source file. - */ - public void setSourceRoot(File srcRoot) throws IOException { - checkParameterLock(); - if (srcRoot != null) { - this.srcRoot = srcRoot.getCanonicalFile(); - } else { - this.srcRoot = null; - } - } - - /** - * Returns the directory used as data root directory. - * This will be the source root, if the data directory was not set (null). - * Note that the data-root can be null, when the source root is also null. - * However, it is never null while a processing session is runing, since - * the source root must be specified for successfully start a processing - * session. - * - *

    The returned {@code File} is always a canonical - * {@code File}.

    - */ - public File getDataRoot() { - if (dataRoot == null) { - return srcRoot; - } else { - return dataRoot; - } - } - - /** - * Sets the root directory of data files. - * If it is {@code "source"} or {@code null}, then the source - * directory will be used. - */ - public void setDataRoot(File dataRoot) - throws IOException { - checkParameterLock(); - if (dataRoot == null) { - this.dataRoot = null; - } else { - this.dataRoot = dataRoot.getCanonicalFile(); - } - } - - /** - * Adds a FreeMarker link. FreeMarker links are fake files/directories - * visible in the source root directory. They are visible for the predefined - * FreeMarker directives only (thus, not for {@code pp} variables). - * A FreeMarker link acts as an alias or hard-link to another file or - * directory. This is a hack that allows you to - * {@code <#include ...>} or {@code <#import ...>} files - * that are outside the source root directory. - * - *

    The link is visible as a file or directory in the source root - * directory with name {@code @}{@code name}. For example, if the link name - * is {@code "inc"}, then it can be used as - * {@code <#include '/@inc/blah.ftl'>} (assuming the link points - * to a directory that contains file {@code blah.ftl}). - * - *

    In the generic case, a FreeMarker link is associated with a list of - * files/directories, not just with a single file/directory. For example, - * if {@code inc} is associated with {@code /home/joe/inc1} and - * {@code /home/joe/inc2} (in this order), then - * {@code <#include '/@inc/blah.ftl'>} will try to read - * {@code /home/joe/inc1/blah.ftl}, and if that file is missing, - * then {@code /home/joe/inc2/blah.ftl}. You can associate the name with - * multiple files/directories by calling this method with the same name for - * multiple times. The earlier you have added a file/directory, the higher - * its priority is. - * - * @param name the name of fake entry in the source root directory, minus - * the {@code @} prefix. To prevent confusion, the name can't start - * with @. - * @param fileOrDir the file or directory the link will point to. It can be - * a outside the source root directory. - */ - public void addFreemarkerLink(String name, File fileOrDir) - throws IOException { - checkParameterLock(); - if (name == null) { - throw new IllegalArgumentException("The \"name\" argument to the " - + "\"Engine.addIncludeDirectory\" method can't be null."); - } - if (name.startsWith("@")) { - throw new IllegalArgumentException("The \"name\" argument to the " - + "\"Engine.addIncludeDirectory\" method can't start with " - + "@. The @ prefix is used only when you refer to a " - + "FreeMarker link. It is not part of the link name. " - + "For example, if the link name is \"foo\", then you can " - + "refer to it as <#include '/@foo/something.ftl'>."); - } - if (fileOrDir == null) { - throw new IllegalArgumentException("The \"fileOrDir\" argument to " - + "the \"Engine.addIncludeDirectory\" method can't be " - + "null."); - } - fileOrDir = fileOrDir.getCanonicalFile(); - List dirs = (List) freemarkerLinks.get(name); - if (dirs == null) { - dirs = new ArrayList(); - freemarkerLinks.put(name, dirs); - } - dirs.add(fileOrDir); - } - - /** - * Returns the list of files associated with a FreeMarker link name. - * - * @param name the name of the link (do not use the {@code @} preifx) - * - * @return the list of canonical files associated with this link, or - * {@code null}, if no FreeMarker link with the given name exist. - */ - public List getFreemarkerLink(String name) { - return (List) freemarkerLinks.get(name); - } - - /** - * Removes all FreeMarker links. - * - * @see #addFreemarkerLink(String, File) - */ - public void clearFreemarkerLinks() { - checkParameterLock(); - freemarkerLinks.clear(); - } - - /** - * Adds a progress listener to the list of progress listeners. - * All progress listeners of the list will be invoked on the events of the - * engine. - * - *

    If you want a local data loader or engine attribute to listen engine - * events, do not add it with this method. It will be automatically - * notified about events, they need not be added here. - * - *

    Note that if you try to add the same object for multiple times, the - * object will added only in the first occasion. - */ - public void addProgressListener(ProgressListener listener) { - checkParameterLock(); - this.progListeners.addUserListener(listener); - } - - /** - * Removes all progress listeners from the list of progress listeners that - * were added with {@link #addProgressListener}. It does not affect - * other listening objects, as local data loaders or engine attributes. - */ - public void clearProgressListeners() { - checkParameterLock(); - progListeners.clearUserListeners(); - } - - /** - * Sets the class that will be instantiated to create the template specfic - * variables. - * - * @see TemplateDataModelBuilder - */ - public void setTemplateDataModelBuilder( - TemplateDataModelBuilder tdmBuilder) { - checkParameterLock(); - this.tdmBuilder = tdmBuilder; - } - - /** - * @see #setTemplateDataModelBuilder(TemplateDataModelBuilder) - */ - public void setTemplateDataModelBuilder(String className) - throws DataModelBuildingException { - - checkParameterLock(); - - Class clazz; - try { - clazz = Class.forName(className); - } catch (ClassNotFoundException exc) { - throw new DataModelBuildingException( - "Template data builder class not found: " + className); - } - - if (clazz.isInterface()) { - throw new DataModelBuildingException( - "Template data builder class must be a class, but this " - + "is an interface: " + clazz.getName()); - } - - if (!(TemplateDataModelBuilder.class) - .isAssignableFrom(clazz)) { - throw new DataModelBuildingException( - "Template data builder class must implement " - + "TemplateDataModelBuilder interface, " - + "but this class doesn't implement that: " - + clazz.getName()); - } - try { - this.setTemplateDataModelBuilder( - (TemplateDataModelBuilder) clazz.newInstance()); - } catch (InstantiationException exc) { - throw new DataModelBuildingException( - "Failed to create an instance of " - + clazz.getName() + ": " - + exc, exc); - } catch (IllegalAccessException exc) { - throw new DataModelBuildingException( - "Failed to create an instance of " - + clazz.getName() + ": " - + exc, exc); - } - } - - /** - * @see #setTemplateDataModelBuilder(TemplateDataModelBuilder) - */ - public TemplateDataModelBuilder getTemplateDataModelBuilder() { - return tdmBuilder; - } - - /** - * Sets the encoding (charset) of textual source files. - * Note that according to FreeMarker rules, this can be overridden in a - * template with {@code <#ftl encoding="...">}. - * - *

    Initially the encoding is ISO-8859-1. - * - * @param encoding The encoding, or {@code "host"} if the default - * encoding ({@code file.encoding} system property) of the host - * machine should be used. {@code null} is the same as - * {@code "host"}. - */ - public void setSourceEncoding(String encoding) { - checkParameterLock(); - if (encoding == null || encoding.equals(PARAMETER_VALUE_HOST)) { - fmCfg.setDefaultEncoding(System.getProperty("file.encoding")); - } else { - fmCfg.setDefaultEncoding(encoding); - } - } - - /** - * Returns the source encoding used for the template files. - * This is not {@code null} or {@code "host"}; this is always - * a concrete encoding, such as {@code "UTF-8"}. - */ - public String getSourceEncoding() { - return fmCfg.getDefaultEncoding(); - } - - /** - * Sets the locale (country, language). - * - *

    Initially the locale is {@code en_US}. - * - * @param locale The locale, or null if the default locale of the host - * machine should be used. - */ - public void setLocale(Locale locale) { - checkParameterLock(); - if (locale == null) { - fmCfg.setLocale(Locale.getDefault()); - } else { - fmCfg.setLocale(locale); - } - } - - /** - * Sets the locale (country, language). - * - *

    Initially the locale is {@code en_US}. - * - * @param locale The locale, or "host" if the default locale of the host - * machine should be used. Null is the same as "host". - */ - public void setLocale(String locale) { - checkParameterLock(); - if (locale == null || locale.equals(PARAMETER_VALUE_HOST)) { - fmCfg.setLocale(Locale.getDefault()); - } else { - String codes[] = StringUtil.split(locale + "__", '_'); - fmCfg.setLocale(new Locale(codes[0], codes[1], codes[2])); - } - } - - /** - * Returns the actual (non-null) locale in use. - */ - public Locale getLocale() { - return fmCfg.getLocale(); - } - - /** - * Sets if the {@code #} is required in FTL tags or not. - * In the old template syntax {@code #} was not required. - * The default and recommended value for this engine parameter is - * {@code false}. - */ - public void setOldTemplateSyntax(boolean oldSyntax) { - checkParameterLock(); - fmCfg.setStrictSyntaxMode(!oldSyntax); - } - - /** - * @see #setOldTemplateSyntax - */ - public boolean getOldTemplateSyntax() { - return !fmCfg.getStrictSyntaxMode(); - } - - /** - * Sets the {@code tagSyntax} setting of FreeMarker. - * The recommendend value for new projects is - * {@link Configuration#AUTO_DETECT_TAG_SYNTAX}, the defalt with - * FreeMarker 2.3.x is {@link Configuration#ANGLE_BRACKET_TAG_SYNTAX}, - * the default with FreeMarker 2.4 and later is - * {@link Configuration#AUTO_DETECT_TAG_SYNTAX}. - */ - public void setTagSyntax(int tagSyntax) { - checkParameterLock(); - fmCfg.setTagSyntax(tagSyntax); - } - - /** - * @see #setTagSyntax(int) - */ - public int getTagSyntax() { - return fmCfg.getTagSyntax(); - } - - /** - * Sets the encoding used for textural output (template generated files). - * By default it is {@code "source"}. - * - * @param outputEncoding The name of encoding. If it is - * {@code "source"}, then the encoding of the source (template - * file) will be used for the output. {@code null} is the same as - * {@code "source"}. If it is {@code "host"} then the - * default encoding of the host machine will be used. - */ - public void setOutputEncoding(String outputEncoding) { - checkParameterLock(); - if (outputEncoding == null) { - this.outputEncoding = PARAMETER_VALUE_SOURCE; - } else if (outputEncoding.equals(PARAMETER_VALUE_HOST)) { - this.outputEncoding = System.getProperty("file.encoding"); - } else { - this.outputEncoding = outputEncoding; - } - } - - /** - * Retruns the output encoding used; It can be {@code "source"} - * (since that can't be resolved to a concrete charset), but never - * {@code null} or {@code "host"}. - */ - public String getOutputEncoding() { - return outputEncoding; - } - - /** - * Sets the charset used for URL escaping. By default it is - * {@code "output"}. - * - * @param urlEscapingCharset The name of charset (encoding) that is used - * for URL escaping. If it is {@code "output"}, then the encoding - * of the output will be used. {@code null} is the same as - * {@code "output"}. If it is {@code "host"} then the - * default encoding of the host machine will be used. - */ - public void setUrlEscapingCharset(String urlEscapingCharset) { - checkParameterLock(); - if (urlEscapingCharset == null - || urlEscapingCharset.equals(PARAMETER_VALUE_OUTPUT)) { - this.urlEscapingCharset = PARAMETER_VALUE_OUTPUT; - fmCfg.setURLEscapingCharset(null); - } else if (urlEscapingCharset.equals(PARAMETER_VALUE_HOST)) { - this.urlEscapingCharset = System.getProperty("file.encoding"); - fmCfg.setURLEscapingCharset(this.urlEscapingCharset); - } else { - this.urlEscapingCharset = urlEscapingCharset; - fmCfg.setURLEscapingCharset(this.urlEscapingCharset); - } - } - - /** - * Retruns the output encoding used; It can be {@code "output"} - * (since that can't be resolved to a concrete charset), but never - * {@code null}. - */ - public String getUrlEscapingCharset() { - return urlEscapingCharset; - } - - /** - * Sets the number format used to convert numbers to strings, as defined - * by {@link Configuration#setNumberFormat(String)}. - * At least on FreeMarker 2.3.21, this is a pattern as {@link java.text.DecimalFormat} defines it, - * or the reserved values {@code "number"} or {@code "currency"}. - */ - public void setNumberFormat(String format) { - checkParameterLock(); - fmCfg.setNumberFormat(format); - } - - /** - * Sets the boolean format used to convert boolean to strings, as defined - * by {@link Configuration#setBooleanFormat(String)}. Note that it can't be {@code "true,false"}; for that you have - * to print the boolean value with ${foo?c}. - */ - public void setBooleanFormat(String format) { - checkParameterLock(); - fmCfg.setBooleanFormat(format); - } - - /** - * @see #setNumberFormat - */ - public String getNumberFormat() { - return fmCfg.getNumberFormat(); - } - - /** - * Sets the format used to convert date values (year + month + day) to - * strings. - * See {@link Configuration#setDateFormat(String)} in the FreeMarker API - * for more information. - * - *

    The default is the format suggested by the underlying Java platform - * implementation for the current locale. - */ - public void setDateFormat(String format) { - checkParameterLock(); - fmCfg.setDateFormat(format); - } - - /** - * @see #setDateFormat - */ - public String getDateFormat() { - return fmCfg.getDateFormat(); - } - - /** - * Sets the format used to convert time values (hour + minute + second - * + millisecond) to strings. - * See {@link Configuration#setTimeFormat(String)} in the FreeMarker API - * for more information. - * - *

    The default is the format suggested by the underlying Java platform - * implementation for the current locale. - */ - public void setTimeFormat(String format) { - checkParameterLock(); - fmCfg.setTimeFormat(format); - } - - /** - * @see #setTimeFormat - */ - public String getTimeFormat() { - return fmCfg.getTimeFormat(); - } - - /** - * Sets the format used to convert date-time values (year + month + day + - * hour + minute + second + millisecond) to strings. - * See {@link Configuration#setDateTimeFormat(String)} in the FreeMarker API - * for more information. - * - *

    The default is the format suggested by the underlying Java platform - * implementation for the current locale. - */ - public void setDateTimeFormat(String format) { - checkParameterLock(); - fmCfg.setDateTimeFormat(format); - } - - /** - * @see #setDateTimeFormat - */ - public String getDateTimeFormat() { - return fmCfg.getDateTimeFormat(); - } - - /** - * Sets the time zone used to display date/time/date-time values. - * See FreeMarker's {@link Configuration#setTimeZone(TimeZone)} for more information. - */ - public void setTimeZone(TimeZone zone) { - checkParameterLock(); - fmCfg.setTimeZone(zone); - } - - /** - * Same as {@link #setTimeZone(TimeZone)}, but lets FreeMarker parse the value to time zone. If the value comes - * from a string source anyway, it's recommended to use this instead of the other overload. - */ - public void setTimeZone(String zone) { - checkParameterLock(); - try { - fmCfg.setSetting(Configuration.TIME_ZONE_KEY, zone); - } catch (TemplateException e) { - throw new RuntimeException("Failed to set timeZone in FreeMarker Configuration", e); - } - } - - /** - * Sets the time zone used when dealing with {@link java.sql.Date java.sql.Date} and - * {@link java.sql.Time java.sql.Time} values. - * See FreeMarker's {@link Configuration#setSQLDateAndTimeTimeZone(TimeZone)} for more information. - */ - public void setSQLDateAndTimeTimeZone(TimeZone zone) { - checkParameterLock(); - fmCfg.setSQLDateAndTimeTimeZone(zone); - } - - /** - * Same as {@link #setSQLDateAndTimeTimeZone(TimeZone)}, but lets FreeMarker parse the value to time zone. If - * the value comes from a string source anyway, it's recommended to use this instead of the other overload. - */ - public void setSQLDateAndTimeTimeZone(String zone) { - checkParameterLock(); - try { - fmCfg.setSetting(Configuration.SQL_DATE_AND_TIME_TIME_ZONE_KEY, zone); - } catch (TemplateException e) { - throw new RuntimeException("Failed to set timeZone in FreeMarker Configuration", e); - } - } - - /** - * @see #setTimeZone - */ - public TimeZone getTimeZone() { - return fmCfg.getTimeZone(); - } - - /** - * Adds a new entry to the end of path-pattern -> processing-mode - * mapping list. - * @param pattern a path pattern as "*.txt" or - * "/docs/**/item_??.xml". - * You have to use slash (/) or backslash (\) or the platform specific - * separator to spearate directories. - * @param pmode the mode in which you want to process the files. Use the - * {@code PMODE_...} constants. - */ - public void addModeChooser( - String pattern, int pmode) { - checkParameterLock(); - - PModeChooser chooser = new PModeChooser(pattern); - - if (pmode == PMODE_EXECUTE || pmode == PMODE_RENDER_XML - || pmode == PMODE_COPY || pmode == PMODE_IGNORE) { - chooser.pMode = pmode; - } else { - throw new IllegalArgumentException( - "Illegal processing mode was passed to " - + "Engine.addProcessingModeChooser: " + pmode); - } - - pModeChoosers.add(chooser); - } - - /** - * Adds a new entry to the end of path-pattern -> header mapping list of - * layer 0. - * - * @deprecated Use {@link #addHeaderChooser(int, String, String)} instead. - */ - public void addHeaderChooser(String pattern, String header) { - checkParameterLock(); - headerChoosers.addChooser(0, pattern, header); - } - - /** - * Adds a new entry to the end of path-pattern -> header mapping list of the - * given layer. Layers are indexed from 0. The lower the layer index is, - * the earlier the header occurs in the text. - */ - public void addHeaderChooser(int layer, String pattern, String footer) { - checkParameterLock(); - headerChoosers.addChooser(layer, pattern, footer); - } - - /** - * Adds a new entry to the end of path-pattern -> footer mapping list of - * layer 0. - * - * @deprecated Use {@link #addFooterChooser(int, String, String)} instead. - */ - public void addFooterChooser(String pattern, String footer) { - checkParameterLock(); - footerChoosers.addChooser(0, pattern, footer); - } - - /** - * Adds a new entry to the end of path-pattern -> footer mapping list of the - * given layer. Layers are indexed from 0. The lower the layer index is, - * the later the footer occurs in the text. - */ - public void addFooterChooser(int layer, String pattern, String footer) { - checkParameterLock(); - footerChoosers.addChooser(layer, pattern, footer); - } - - /** - * Adds a new entry to the end of path-pattern -> turn-number mapping list. - */ - public void addTurnChooser(String pattern, int turn) { - checkParameterLock(); - TurnChooser chooser = new TurnChooser(pattern); - chooser.turn = turn; - turnChoosers.add(chooser); - } - - /** - * Removes all processing mode choosers. This is the initial state after - * the instantiation of {@link Engine} (i.e. no processing mode - * choosers). - */ - public void clearModeChoosers() { - checkParameterLock(); - pModeChoosers.clear(); - } - - /** - * Removes all header choosers. - */ - public void clearHeaderChoosers() { - checkParameterLock(); - headerChoosers.clear(); - } - - /** - * Removes all footer choosers. - */ - public void clearFooterChoosers() { - checkParameterLock(); - footerChoosers.clear(); - } - - /** - * Removes all turn choosers. - */ - public void clearTurnChoosers() { - checkParameterLock(); - turnChoosers.clear(); - } - - /** - * Sets if the engine differentiates upper- and lower-case letters when it - * compares paths or matches path patterns with paths. False by default - * (ignores case). - */ - public void setCaseSensitive(boolean cs) { - checkParameterLock(); - if (csPathCmp != cs) { - csPathCmp = cs; - - // Re-prase re-s in choosers. - Iterator it; - it = pModeChoosers.iterator(); - while (it.hasNext()) { - ((Chooser) it.next()).recompile(); - } - it = turnChoosers.iterator(); - while (it.hasNext()) { - ((Chooser) it.next()).recompile(); - } - it = xmlRendCfgCntrs.iterator(); - while (it.hasNext()) { - ((XmlRenderingCfgContainer) it.next()).recompile(); - } - headerChoosers.recompile(); - footerChoosers.recompile(); - localDataBuilders.recompile(); - } - } - - /** - * @see #setCaseSensitive - */ - public boolean getCaseSensitive() { - return csPathCmp; - } - - /** - * Allows some features that are considerd dangerous. - * These are currently: - *

      - *
    • The source and the output file is the same - *
    - */ - public void setExpertMode(boolean expertMode) { - checkParameterLock(); - this.expertMode = expertMode; - } - - /** - * @see #setExpertMode - */ - public boolean getExpertMode() { - return expertMode; - } - - /** - * Adds a postfix to the list of file name postfixes to remove. - * If the source file name before the first dot ends with a string in the - * list, then it will be removed from the output file name. For example, - * if "_t" is in the list, then the output file for "example_t.html" will - * be "example.html". If the file name does not contains dot, then it - * still works: "example_t" will become to "example". - * - * @param postfix the postfix to remove. Can't be null or empty - * string, and can't contain dot. - */ - public void addRemovePostfix(String postfix) { - checkParameterLock(); - if (postfix == null || postfix.length() == 0) { - throw new IllegalArgumentException( - "engine parameter \"remove postfix\" can't be empty " - + "string"); - } - if (postfix.indexOf(".") != -1) { - throw new IllegalArgumentException( - "engine parameter \"remove postfix\" can't contain dot: " - + postfix); - } - removePostfixes.add(postfix); - } - - /** - * Adds an extension to the list of extensions to remove. - * If the source file name ends with an extension in the list, then it will - * be removed from the output file name. For example, - * if "t" is in the list, then the output file for "example.html.t" will - * be "example.html". The extension to remove can contain dots (as tar.gz). - * - * @param extension the extension to remove without the dot. Can't be - * null or empty string, and can't start with dot. - */ - public void addRemoveExtension(String extension) { - checkParameterLock(); - checkExtension("remove extension", extension); - removeExtensions.add(extension); - } - - /** - * Adds an old-exension -> new-extension pair to the list of - * extension replacements. - * If a source file name ends with the old extension, then it will - * be replaced with the new extension in the output file name. - * - * @param oldExtension the old extension without the preceding dot. - * @param newExtension the new extension without the preceding dot. - */ - public void addReplaceExtension( - String oldExtension, String newExtension) { - checkParameterLock(); - checkExtension("replace extension", oldExtension); - checkExtension("replace extension", newExtension); - replaceExtensions.add(new String[] {oldExtension, newExtension}); - } - - private void checkExtension(String paramName, String extension) { - if (extension == null || extension.length() == 0) { - throw new IllegalArgumentException( - "Problem with engine parameter \"" + paramName - + "\": extension can't be empty string"); - } - if (extension.startsWith(".")) { - throw new IllegalArgumentException( - "Problem with parameter \"" + paramName - + "\": extension can't start with dot: " - + extension); - } - } - - public void clearRemovePostfixes() { - checkParameterLock(); - removePostfixes.clear(); - } - - public void clearRemoveExtensions() { - checkParameterLock(); - removeExtensions.clear(); - } - - public void clearReplaceExtensions() { - checkParameterLock(); - replaceExtensions.clear(); - } - - /** - * Sets the {@link Engine} should automatically process the files and - * directories inside a directory whose processing was asked through the - * public {@link Engine} API. Defaults to {@code true}. It is set to - * {@code false} by front-ends that explicitly specify the list of - * source files and source directories, rather than expecting the - * {@link Engine} to discover them. - */ - public void setDontTraverseDirectories(boolean dontTraverseDirs) { - checkParameterLock(); - this.dontTraverseDirs = dontTraverseDirs; - } - - public boolean getDontTraverseDirectories() { - return dontTraverseDirs; - } - - /** - * Sets what source file can be skipped if it was not modified after the - * last modification time of the output file. Also, if the output is not - * existing, the source file will be processed. Note that this feature will - * not work for templates that rename or drop the original output file - * during the template execution. - * - *

    The initial value of this engine parameter is {@code SKIP_NONE}. - * - * @param skipWhat a {@code SKIP_...} contant. - */ - public void setSkipUnchanged(int skipWhat) { - checkParameterLock(); - this.skipUnchanged = skipWhat; - } - - public int getSkipUnchanged() { - return skipUnchanged; - } - - /** - * Sets whether for source directories a corresponding output directory - * will be created even if no file output went into it. Defaults to - * {@code false}. - * - *

    Notes: - *

      - *
    • Even if this is set to {@code true}, if - * a directory contains an {@code ignoredir.fmpp} file, it will not - * create output directory. - *
    • If the directory contains a file called {@code createdir.fmpp}, - * the directory will be created even if this setting is - * {@code false}. - *
    - */ - public void setAlwaysCreateDirectories(boolean enable) { - checkParameterLock(); - alwaysCrateDirs = enable; - } - - public boolean getAlwaysCreateDirectories() { - return alwaysCrateDirs; - } - - /** - * Sets if the CVS files inside the source root directory should be - * ignored or not. This engine parameter is initially true. - * - *

    The CVS files are: {@code **}{@code /.cvsignore}, - * {@code **}{@code /CVS/**} and {@code **}{@code /.#*} - */ - public void setIgnoreCvsFiles(boolean ignoreCvsFiles) { - checkParameterLock(); - this.ignoreCvsFiles = ignoreCvsFiles; - } - - public boolean getIgnoreCvsFiles() { - return ignoreCvsFiles; - } - - /** - * Sets if the SVN files inside the source root directory should be - * ignored or not. This engine parameter is initially true. - * - *

    The SVN files are: {@code **}{@code /SVN/**} - */ - public void setIgnoreSvnFiles(boolean ignoreSvnFiles) { - checkParameterLock(); - this.ignoreSvnFiles = ignoreSvnFiles; - } - - public boolean getIgnoreSvnFiles() { - return ignoreSvnFiles; - } - - /** - * Set if well-known temporary files inside the source root directory should - * be ignored or not. For the list of well-known temporary file patterns, - * read the FMPP Manual. - */ - public void setIgnoreTemporaryFiles( - boolean ignoreTemporaryFiles) { - checkParameterLock(); - this.ignoreTemporaryFiles = ignoreTemporaryFiles; - } - - public boolean getIgnoreTemporaryFiles() { - return ignoreTemporaryFiles; - } - - /** - * Sets if which XPath engine should be used. - * @param xpathEngine one of the {@code XPATH_ENGINE_...} constants, - * or a class name. - */ - public void setXpathEngine(String xpathEngine) { - checkParameterLock(); - this.xpathEngine = xpathEngine; - } - - public String getXpathEngine() { - return xpathEngine; - } - - /** - * Sets the XML entiry resolver used for reading XML documents. - * - * The default value is {@code null}. - * - * @param xmlEntityResolver it must implement - * {@link org.xml.sax.EntityResolver org.xml.sax.EntityResolver} (it was declared as - * {@code Object} to prevent linkage errors when XML related - * features are not used on pre-1.4 Java), or it must be {@code null}. - */ - public void setXmlEntityResolver(Object xmlEntityResolver) - throws InstallationException { - checkParameterLock(); - if (xmlEntityResolver != null) { - if (!EngineXmlUtils.isEntityResolver(xmlEntityResolver)) { - throw new IllegalArgumentException( - "The argument to Engine.setXmlEntiryResolver " - + "must implement org.xml.sax.EntityResolver. " - + "The class of the argument was " - + xmlEntityResolver.getClass().getName() + "."); - } - } - this.xmlEntityResolver = xmlEntityResolver; - } - - /** - * Gets the XML entiry resolver used for reading XML documents. - * @return {@code null} of no resolver is used, or an - * {@link org.xml.sax.EntityResolver org.xml.sax.EntityResolver} (it was declared as - * {@code Object} to prevent linkage errors when XML related - * features are not used on pre-1.4 Java). - */ - public Object getXmlEntiryResolver() { - return xmlEntityResolver; - } - - /** - * Sets if XML documents should be validated when they are loaded. - * Defaults to {@code true}. - */ - public void setValidateXml(boolean validateXml) { - checkParameterLock(); - this.validateXml = validateXml; - } - - public boolean getValidateXml() { - return validateXml; - } - - /** - * Adds as XML rendering configuration. - */ - public void addXmlRenderingConfiguration( - XmlRenderingConfiguration xmlRendering) { - if (xmlRendering.getTemplatePath() == null && !xmlRendering.getCopy()) { - throw new IllegalArgumentException( - "Illegal XmlRenderingConfiguration: " - + "Either \"template\" must be non-null, or \"copy\" must " - + "be true."); - } - xmlRendCfgCntrs.add(new XmlRenderingCfgContainer(xmlRendering)); - - List ldbs = xmlRendering.getLocalDataBuilders(); - int ln = ldbs.size(); - for (int i = 0; i < ln; i++) { - Object o = ldbs.get(i); - if (o instanceof ProgressListener) { - progListeners.addXmlLdbListener((ProgressListener) o); - } - } - } - - /** - * Removes all XML rendering configurations. - */ - public void clearXmlRenderingConfigurations() { - xmlRendCfgCntrs.clear(); - progListeners.clearXmlLdbListeners(); - } - - // ------------------------------------------------------------------------- - // Shared variables - - /** - * Adds a variable that will be visible for all templates when the - * processing session executes. - */ - public void addData(String name, Object value) { - checkParameterLock(); - data.put(name, value); - } - - /** - * Convenience method for adding a {@link Byte} object. - * @see #addData(String, Object) - */ - public void addData(String name, byte value) { - checkParameterLock(); - data.put(name, new Byte(value)); - } - - /** - * Convenience method for adding a {@link Short} object. - * @see #addData(String, Object) - */ - public void addData(String name, short value) { - checkParameterLock(); - data.put(name, new Short(value)); - } - - /** - * Convenience method for adding a {@link Integer} object. - * @see #addData(String, Object) - */ - public void addData(String name, int value) { - checkParameterLock(); - data.put(name, new Integer(value)); - } - - /** - * Convenience method for adding a {@link Long} object. - * @see #addData(String, Object) - */ - public void addData(String name, long value) { - checkParameterLock(); - data.put(name, new Long(value)); - } - - /** - * Convenience method for adding a {@link Float} object. - * @see #addData(String, Object) - */ - public void addData(String name, float value) { - checkParameterLock(); - data.put(name, new Float(value)); - } - - /** - * Convenience method for adding a {@link Double} object. - * @see #addData(String, Object) - */ - public void addData(String name, double value) { - checkParameterLock(); - data.put(name, new Double(value)); - } - - /** - * Convenience method for adding a {@link Character} object. - * @see #addData(String, Object) - */ - public void addData(String name, char value) { - checkParameterLock(); - data.put(name, new Character(value)); - } - - /** - * Convenience method for adding a {@link Boolean} object. - * @see #addData(String, Object) - */ - public void addData(String name, boolean value) { - checkParameterLock(); - data.put(name, value ? Boolean.TRUE : Boolean.FALSE); - } - - /** - * Adds all entries with {@link #addData(String, Object)}. - * The name of the variable will be the key of the map entry, - * and its value will be the value of the map entry. - */ - public void addData(Map map) { - checkParameterLock(); - data.putAll(map); - } - - /** - * Removes all data. - * - * @see #addData(String, Object) - */ - public void clearData() { - checkParameterLock(); - data.clear(); - } - - /** - * Gets the value of a variable. This method accesses the variables that - * are visible for all templates. It corresponds to setting {@code data}. - * - *

    Warning! When the processing session is executing, you must - * not modify the returned object. - * - * @return {@code null} if no such variable exist. - * Values are returned exactly as they were added, that is, without - * FreeMarker's wrapping (but note that some variables initially use - * FreeMarker {@link TemplateModel} types, such as variables created by - * some of the data loaders). - * - * @see #addData(String, Object) - */ - public Object getData(String name) { - return data.get(name); - } - - /** - * Removes a variable that would be visible for all templates when the - * processing session executes. I does nothing if there is no variable - * exists for the given name. - * - * @return the removed value, or {@code null} if there was no value - * stored for the given name. - * - * @see #addData(String, Object) - */ - public Object removeData(String name) { - return data.remove(name); - } - - /** - * @deprecated Use {@link #clearData()} instead. - */ - public void clearSharedVariables() { - clearData(); - } - - /** - * Adds a local data builder. The local data builder will be invoked - * directly before the execution of templates (if the - * {@code pathPattern} matches the source file path). - * - * @param layer the index of the layer, stating from 0. 0 is the layer with - * the highest priority. - * @param pathPattern the path pattern of source files where this local - * data builder will be used. - * @param builder the local data builder object. - */ - public void addLocalDataBuilder( - int layer, String pathPattern, LocalDataBuilder builder) { - if (builder == null) { - throw new IllegalArgumentException( - "Argument \"builder\" to addLocalDataBuilder can't be null."); - } - localDataBuilders.addChooser(layer, pathPattern, builder); - if (builder instanceof ProgressListener) { - progListeners.addLdbListener((ProgressListener) builder); - } - } - - /** - * Removes all local data builders. - * - * @see #addLocalDataBuilder(int, String, LocalDataBuilder) - */ - public void clearLocalDataBuilders() { - localDataBuilders.clear(); - progListeners.clearLdbListeners(); - } - - // ------------------------------------------------------------------------- - // Misc public - - /** - * Converts an {@code ProgressListener.EVENT_...} constant to English - * text. - */ - public static String getProgressListenerEventName(int event) { - if (event == ProgressListener.EVENT_BEGIN_FILE_PROCESSING) { - return "begin file processing"; - } else if (event == ProgressListener.EVENT_BEGIN_PROCESSING_SESSION) { - return "begin processing session"; - } else if (event == ProgressListener.EVENT_END_FILE_PROCESSING) { - return "end file processing"; - } else if (event == ProgressListener.EVENT_END_PROCESSING_SESSION) { - return "end processing session"; - } else if (event == ProgressListener.EVENT_IGNORING_DIR) { - return "ignoring dir"; - } else if (event == ProgressListener.EVENT_SOURCE_NOT_MODIFIED) { - return "source not modified"; - } else if (event == ProgressListener.EVENT_WARNING) { - return "warning"; - } else { - return "event code " + event; - } - } - - /** - * Wraps any object as {@link TemplateModel}. - */ - public TemplateModel wrap(Object obj) throws TemplateModelException { - return fmCfg.getObjectWrapper().wrap(obj); - } - - /** - * Returns the {@link TemplateEnvironment}. - * - * The template environment is available with this method only when a - * template execution is in progress, or when a - * {@link TemplateDataModelBuilder} (deprecated) is running. - * - * @throws IllegalStateException if the template environment is not - * available. - */ - public TemplateEnvironment getTemplateEnvironment() { - if (templateEnv.isExternallyAccessible()) { - return templateEnv; - } else { - throw new IllegalStateException( - "You can't get the TemplateEnvironment, since no " - + "template execution is in progress currently."); - } - } - - /** - * Tells if {@link #getTemplateEnvironment()} will throw exception or not. - */ - public boolean isTemplateEnvironmentAvailable() { - return templateEnv.isExternallyAccessible(); - } - - /** - * Adds/replaces an engine attribute. - * Attributes are arbitrary key-value pairs that are associated with the - * {@link Engine} object. FMPP reserves all keys starting with - * {@code fmpp.} for its own use. Attributes are not understood by the - * {@link Engine}, but by data loaders, local data builders, and tools that - * create them. - * - *

    Attributes can be changed (replaced, removed, ...etc.) while the - * processing session is executing. - * - * @param name the name of the attribute. To prevent name - * clashes, it should follow the naming convention of Java classes, e.g. - * {@code "com.example.someproject.something"}. - * @param value the value of the attribute. If it implements - * {@link ProgressListener}, then it will receive notifications about - * the events of the {@link Engine}. If attribute(s) with that value is - * (are) removed, then the value object doesn't receive more - * notifications. - * @return The previous value of the attribute, or {@code null} if - * there was no attribute with the given name. - */ - public Object setAttribute(String name, Object value) { - Object oldValue = attributes.put(name, value); - if (value instanceof ProgressListener) { - progListeners.addAttrListener((ProgressListener) value); - } - if (oldValue instanceof ProgressListener) { - if (!MiscUtil.mapContainsObject(attributes, oldValue)) { - progListeners.removeAttrListener((ProgressListener) oldValue); - } - } - return oldValue; - } - - /** - * Reads an engine attribute. - * - * @see #setAttribute(String, Object) - * - * @return {@code null} if no attribute exists with the given name. - */ - public Object getAttribute(String name) { - return attributes.get(name); - } - - /** - * Removes an attribute. It does nothing if the attribute does not exist. - * - * @see #setAttribute(String, Object) - * - * @return The value of the removed attribute or {@code null} if there - * was no attribute with the given name. - */ - public Object removeAttribute(String name) { - Object oldValue = attributes.remove(name); - if (oldValue instanceof ProgressListener) { - if (!MiscUtil.mapContainsObject(attributes, oldValue)) { - progListeners.removeAttrListener((ProgressListener) oldValue); - } - } - return oldValue; - } - - /** - * Removes all attributes. - * - * @see #setAttribute(String, Object) - */ - public void clearAttribues() { - progListeners.clearAttrListeners(); - attributes.clear(); - } - - /** - * Returns the FMPP version number string. FMPP version number string - * follows the {@code major.minor.sub} or {@code major.minor.sub.nightly} - * format, where each part (separated by dots) is an non-negative integer - * number. - */ - public static String getVersionNumber() { - if (cachedVersion == null) { - loadVersionInfo(); - } - return cachedVersion; - } - - /** - * Returns FMPP build info. This is usually the date of the build, but it - * can be anything. - */ - public static String getBuildInfo() { - if (cachedBuildInfo == null) { - loadVersionInfo(); - } - return cachedBuildInfo; - } - - public static String getFreeMarkerVersionNumber() { - return Configuration.getVersionNumber(); - } - - /** - * Quickly tells if XML support is available. - */ - public boolean isXmlSupportAvailabile() { - if (chachedXmlSupportAvailable != null) { - return chachedXmlSupportAvailable.booleanValue(); - } else { - try { - MiscUtil.checkXmlSupportAvailability(null); - } catch (InstallationException e) { - chachedXmlSupportAvailable = Boolean.FALSE; - return false; - } - chachedXmlSupportAvailable = Boolean.TRUE; - return true; - } - } - - /** - * Checks if XML support is available. It can be quicker than - * {@link MiscUtil#checkXmlSupportAvailability(String)}, so rather use this. - * - * @param requiredForThis a short sentence that describes for human reader - * if for what do we need the XML support (e.g. - * {@code "Usage of xml data loader."} or - * {@code "Set XML entity resolver."}). This sentence is used - * in error message of the {@link fmpp.util.InstallationException}. - * Can be {@code null}. - * - * @throws InstallationException if the XML support is not available. - */ - public void checkXmlSupportAvailability(String requiredForThis) - throws InstallationException { - if (chachedXmlSupportAvailable != null - && chachedXmlSupportAvailable.booleanValue()) { - return; - } - try { - MiscUtil.checkXmlSupportAvailability(requiredForThis); - } catch (InstallationException e) { - chachedXmlSupportAvailable = Boolean.FALSE; - throw e; - } - chachedXmlSupportAvailable = Boolean.TRUE; - } - - // ------------------------------------------------------------------------- - // Package - - void sendWarning(File srcFile, String message) { - try { - progListeners.notifyProgressEvent( - this, - ProgressListener.EVENT_WARNING, - srcFile, PMODE_NONE, - null, message); - } catch (ProcessingException e) { - ; // ignore - } - } - - Reader wrapReader(Reader r, File f) throws IOException { - List headers = headerChoosers.choose(f); - List footers = footerChoosers.choose(f); - int hc = headers.size(); - int fc = footers.size(); - if (hc == 0 && fc == 0) { - return r; - } else { - int i; - String header; - String footer; - StringBuffer sb = null; - - if (hc != 0) { - if (hc == 1) { - header = (String) headers.get(0); - } else { - sb = new StringBuffer(40 + hc * 80); - for (i = 0; i < hc; i++) { - sb.append((String) headers.get(i)); - } - header = sb.toString(); - } - header = moveHeaderAfterTheFtlDirective(header, r); - } else { - header = null; - } - - if (fc != 0) { - if (fc == 1) { - footer = (String) footers.get(0); - } else { - if (sb == null) { - sb = new StringBuffer(40 + fc * 80); - } else { - sb.setLength(0); - } - for (i = fc - 1; i >= 0; i--) { - sb.append((String) footers.get(i)); - } - footer = sb.toString(); - } - } else { - footer = null; - } - - return new BorderedReader(header, r, footer); - } - } - - List getLocalDataBuildersForFile(File sf) throws IOException { - return localDataBuilders.choose(sf); - } - - Pattern pathPatternToRegexpPattern (String path) { - String originalPattern = path; - - path = FileUtil.pathToUnixStyle(path); - if (!csPathCmp) { - path = path.toLowerCase(); - } - path = FileUtil.pathPatternToPerl5Regex(path); - try { - return Pattern.compile(path); - } catch (PatternSyntaxException exc) { - throw new BugException( - "Failed to parse path pattern: " + originalPattern, - exc); - } - } - - // ------------------------------------------------------------------------- - // Private - - private static final int MAX_WBLN = 64; - - /** - * Moves the header after the {@code <#ftl ...>} if that exists. - * The returned header should by used instead of the parameter header. - * The reader's "position" will be increased, but the readen characters - * are added to the new header, so they don't lose. - */ - private String moveHeaderAfterTheFtlDirective(String header, Reader r) - throws IOException { - StringBuffer sb = new StringBuffer(MAX_WBLN); - - char[] wb = new char[MAX_WBLN]; - int wbln; - - int mode = 0; - int submode = 0; - char quot = ' '; - int cmpIdx = 0; - headerBuilding: while (true) { - wbln = r.read(wb); - fetchChars: for (int i = 0; i < wbln; i++) { - char c = wb[i]; - if (mode == 0) { - if (Character.isWhitespace(c)) { - continue fetchChars; //! - } else { - mode = 1; - } - } - if (mode == 1) { - if (cmpIdx < 5 && c == "<#ftl".charAt(cmpIdx)) { - cmpIdx++; - continue fetchChars; //! - } else { - if (cmpIdx == 5 - && (Character.isWhitespace(c) - || c == '>' || c == '/')) { - mode = 2; - } else { - mode = -1; - break fetchChars; //! - } - } - } - if (mode == 2) { - if (submode == 0) { - if (c == '>') { - sb.append(wb, 0, i + 1); - sb.append(header); - if (i < wbln - 1) { - sb.append(wb, i + 1, wbln - (i + 1)); - } - header = sb.toString(); - break headerBuilding; //!! - } else if (c == '\'' || c == '\"') { - quot = c; - if ((i != 0 && wb[i - 1] == 'r') - || (sb.length() > 0 - && sb.charAt(sb.length() - 1) == 'r')) { - submode = 2; - } else { - submode = 1; - } - } - } else if (submode == 1) { - if (c == '\\') { - submode = 3; - } else if (c == quot) { - submode = 0; - } - } else if (submode == 2) { - if (c == quot) { - submode = 0; - } - } else if (submode == 3) { - submode = 1; - } - } - } - if (wbln > 0) { - sb.append(wb, 0, wbln); - } - if (wbln < MAX_WBLN || mode == -1) { - header = header + sb.toString(); - break headerBuilding; //!! - } - } - - return header; - } - - private File adjustOutputFileName(File f) throws IOException { - String fn = f.getName(); - fn = applyRemoveExtensionSetting(fn); - fn = applyRemovePostfixesSetting(fn); - fn = applyReplaceExtensionsSetting(fn); - - if (fn.length() == 0) { - throw new IOException( - "The deduced output file name is empty " - + "for this source file: " - + FileUtil.getRelativePath(outRoot, f)); - } - - return new File(f.getParent(), fn).getCanonicalFile(); - } - - private String applyRemoveExtensionSetting(String fn) { - final String fnNormdCase = csPathCmp ? fn : fn.toLowerCase(); - int ln = removeExtensions.size(); - for (int i = 0; i < ln; i++) { - final String dotExtToRemove = "." + (String) removeExtensions.get(i); - final String dotExtToRemoveNormdCase = csPathCmp ? dotExtToRemove : dotExtToRemove.toLowerCase(); - if (fnNormdCase.endsWith(dotExtToRemoveNormdCase)) { - // We only remove one extension: - return fn.substring(0, fn.length() - dotExtToRemove.length()); - } - } - return fn; - } - - private String applyRemovePostfixesSetting(String fn) { - final int extDotIdx; - final String fnWithoutExt; - { - int i = fn.indexOf('.'); - if (i != -1) { - fnWithoutExt = fn.substring(0, i); - extDotIdx = i; - } else { - fnWithoutExt = fn; - extDotIdx = fn.length(); - } - } - - final String fnWithoutExtNormdCase = csPathCmp ? fnWithoutExt : fnWithoutExt.toLowerCase(); - final int ln = removePostfixes.size(); - for (int i = 0; i < ln; i++) { - final String posfixToRemove = (String) removePostfixes.get(i); - final String posfixToRemoveNormdCase = csPathCmp ? posfixToRemove : posfixToRemove.toLowerCase(); - if (fnWithoutExtNormdCase.endsWith(posfixToRemoveNormdCase)) { - // We only remove one postfix: - return fn.substring(0, extDotIdx - posfixToRemove.length()) + fn.substring(extDotIdx); - } - } - return fn; - } - - private String applyReplaceExtensionsSetting(String fn) { - final String fnNormedCase = csPathCmp ? fn : fn.toLowerCase(); - final int ln = replaceExtensions.size(); - for (int i = 0; i < ln; i++) { - final String[] fromToPair = (String[]) replaceExtensions.get(i); - final String replacedExtNormedCase = csPathCmp ? fromToPair[0] : fromToPair[0].toLowerCase(); - if (fnNormedCase.endsWith("." + replacedExtNormedCase)) { - // We only d one substitution: - return fn.substring(0, fn.length() - fromToPair[0].length()) + fromToPair[1]; - } - } - return fn; - } - - private Chooser findChooser(LinkedList choosers, File f) - throws IOException { - String fp = FileUtil.getRelativePath(srcRoot, f); - fp = normalizePathForComparison(FileUtil.pathToUnixStyle(fp)); - - Iterator it = choosers.iterator(); - while (it.hasNext()) { - Chooser c = (Chooser) it.next(); - if (c.regexpPattern.matcher(fp).matches()) { - return c; - } - } - return null; - } - - private String normalizePathForComparison(String fp) { - if (fp.endsWith("/")) { - fp = fp.substring(0, fp.length() - 1); - } - if (!fp.startsWith("/")) { - fp = "/" + fp; - } - if (!csPathCmp) { - fp = fp.toLowerCase(); - } - return fp; - } - - private int getProcessingMode(File f) throws IOException { - String fnameCs = f.getName(); - String fpathCs = f.getAbsolutePath(); - String fnameCisLower; - String fpathCisLower; - String fpathCisUpper; - if (!csPathCmp) { - fnameCisLower = fnameCs.toLowerCase(); - fpathCisLower = fpathCs.toLowerCase(); - fpathCisUpper = fpathCs.toUpperCase(); - } else { - fnameCisLower = fnameCs; - fpathCisLower = fpathCs; - fpathCisUpper = fpathCs; - } - - int i = fnameCs.lastIndexOf("."); - String extLower; - if (i == -1) { - extLower = ""; - } else { - extLower = fnameCs.substring(i + 1).toLowerCase(); - } - - if (extLower.equals("fmpp")) { - return PMODE_IGNORE; - } - if (ignoreCvsFiles) { - if (fnameCisLower.equals(".cvsignore") - || fpathCisUpper.indexOf("/CVS/") != -1 - || fpathCisUpper.indexOf( - File.separatorChar + "CVS" + File.separatorChar) - != -1 - || (fnameCs.length() > 2 && fnameCs.startsWith(".#"))) { - return PMODE_IGNORE; - } - } - if (ignoreSvnFiles) { - if (fpathCisLower.indexOf("/.svn/") != -1 - || fpathCisLower.indexOf( - File.separatorChar + ".svn" + File.separatorChar) - != -1) { - return PMODE_IGNORE; - } - } - if (ignoreTemporaryFiles) { - if ( - (fnameCs.length() > 2 && ( - (fnameCs.startsWith("#") && fnameCs.endsWith("#")) - || (fnameCs.startsWith("%") && fnameCs.endsWith("%")) - || fnameCs.startsWith("._") - || extLower.equals("bak"))) - || (fnameCs.length() > 1 && ( - fnameCs.endsWith("~") - || fnameCs.startsWith("~") - || extLower.startsWith("~"))) - ) { - return PMODE_IGNORE; - } - } - - PModeChooser pmc = (PModeChooser) findChooser(pModeChoosers, f); - if (pmc == null) { - if (STATIC_FILE_EXTS.contains(extLower)) { - return PMODE_COPY; - } else if (xmlRendCfgCntrs.size() != 0 && extLower.equals("xml")) { - return PMODE_RENDER_XML; - } else { - return PMODE_EXECUTE; - } - } else { - return pmc.pMode; - } - } - - private int getTurn(File f) throws IOException { - TurnChooser tc = (TurnChooser) findChooser(turnChoosers, f); - if (tc == null) { - return 1; - } else { - return tc.turn; - } - } - - private static void loadVersionInfo() { - Properties vp = new Properties(); - InputStream ins = Engine.class.getClassLoader() - .getResourceAsStream("fmpp/version.properties"); - if (ins == null) { - throw new RuntimeException( - "Version file (/fmpp/version.properties) " - + "is missing."); - } else { - try { - try { - vp.load(ins); - } finally { - ins.close(); - } - } catch (IOException exc) { - throw new RuntimeException( - "Error loading version file " - + "(/fmpp/version.properties): " + exc); - } - String v = vp.getProperty("version"); - if (v == null) { - throw new RuntimeException( - "Version file (/fmpp/version.properties) " - + "is corrupt: version key is missing."); - } - - String d = vp.getProperty("buildInfo"); - if (d == null) { - throw new RuntimeException( - "Version file (/fmpp/version.properties) " - + "is corrupt: buildInfo key is missing."); - } - - cachedVersion = v; - cachedBuildInfo = d; - } - } - - private void lockParameters() { - parametersLocked = true; - } - - private void unlockParameters() { - parametersLocked = false; - } - - private void checkParameterLock() { - if (parametersLocked) { - throw new IllegalStateException( - "You can't change the engine parameters now. Settings can't be" - + "changed while the processing session is runing."); - } - } - - // ------------------------------------------------------------------------- - // Classes - - private class Chooser { - private Chooser(String pathPattern) { - this.pathPattern = pathPattern; - this.regexpPattern = pathPatternToRegexpPattern(pathPattern); - } - - void recompile() { - this.regexpPattern = pathPatternToRegexpPattern(pathPattern); - } - - private String pathPattern; - private Pattern regexpPattern; - } - - private class PModeChooser extends Chooser { - PModeChooser(String pathPattern) { - super(pathPattern); - } - - private int pMode; - } - - private class TurnChooser extends Chooser { - TurnChooser(String pathPattern) { - super(pathPattern); - } - - private int turn; - } - - private class ObjectChooser extends Chooser { - private final Object value; - - ObjectChooser(String pathPattern, Object value) { - super(pathPattern); - this.value = value; - } - } - - private class LayeredChooser { - private List layers = new ArrayList(); - private int usedLayers; - - /** - * @param layer Must be 0 or positive. 0 is the layer with the highest - * priority. Missing layers are automatically added, but there shouldn't - * be to much unused layers embedded (as hundreds of them) as that - * degrades performance. - */ - private void addChooser( - int layer, String pathPattern, Object value) { - if (layer < 0) { - throw new IllegalArgumentException( - "Layer index can't be negative: " + layer); - } - ObjectChooser chooser = new ObjectChooser(pathPattern, value); - int max = layers.size() - 1; - while (max < layer) { - layers.add(null); - max++; - } - LinkedList choosers = (LinkedList) layers.get(layer); - if (choosers == null) { - choosers = new LinkedList(); - layers.set(layer, choosers); - usedLayers++; - } - choosers.add(chooser); - } - - /** - * @return the list of choosen objects, ordered by ascending layer - * index. Possibly an empty list, but never {@code null}. - */ - private List choose(File f) throws IOException { - List result = new ArrayList(usedLayers); - int ln = layers.size(); - for (int i = 0; i < ln; i++) { - LinkedList choosers = (LinkedList) layers.get(i); - if (choosers != null) { - ObjectChooser c = (ObjectChooser) findChooser(choosers, f); - if (c != null) { - result.add(c.value); - } - } - } - return result; - } - - private void recompile() { - int ln = layers.size(); - for (int i = 0; i < ln; i++) { - LinkedList choosers = (LinkedList) layers.get(i); - Iterator it = choosers.iterator(); - while (it.hasNext()) { - ((Chooser) it.next()).recompile(); - } - } - } - - private void clear() { - layers.clear(); - usedLayers = 0; - } - } - - private class MultiProgressListener implements ProgressListener { - - private ArrayList userListeners = new ArrayList(); - private ArrayList attrListeners = new ArrayList(); - private ArrayList ldbListeners = new ArrayList(); - private ArrayList xmlLdbListeners = new ArrayList(); - private boolean mergedNeedsRefresh = true; - private ArrayList mergedListeners = new ArrayList(); - - void addUserListener(ProgressListener listener) { - if (!MiscUtil.listContainsObject(userListeners, listener)) { - userListeners.add(listener); - } - } - - void clearUserListeners() { - mergedNeedsRefresh = true; - userListeners.clear(); - } - - void addAttrListener(ProgressListener listener) { - if (!MiscUtil.listContainsObject(attrListeners, listener)) { - mergedNeedsRefresh = true; - attrListeners.add(listener); - } - } - - void removeAttrListener(ProgressListener listener) { - int i = MiscUtil.findObject(attrListeners, listener); - if (i != -1) { - mergedNeedsRefresh = true; - attrListeners.remove(i); - } - } - - void clearAttrListeners() { - mergedNeedsRefresh = true; - attrListeners.clear(); - } - - void addLdbListener(ProgressListener listener) { - if (!MiscUtil.listContainsObject(ldbListeners, listener)) { - mergedNeedsRefresh = true; - ldbListeners.add(listener); - } - } - - void clearLdbListeners() { - mergedNeedsRefresh = true; - ldbListeners.clear(); - } - - void addXmlLdbListener(ProgressListener listener) { - if (!MiscUtil.listContainsObject(xmlLdbListeners, listener)) { - mergedNeedsRefresh = true; - xmlLdbListeners.add(listener); - } - } - - void clearXmlLdbListeners() { - mergedNeedsRefresh = true; - xmlLdbListeners.clear(); - } - - public void notifyProgressEvent( - Engine engine, - int event, - File src, int pMode, - Throwable error, Object param) - throws ProcessingException { - if (mergedNeedsRefresh) { - refreshMergedListeneres(); - } - int doneCounter = 0; - int closingEvent = getClosingEvent(event); - ProcessingException firstException = null; - Iterator it = mergedListeners.iterator(); - normalLoop: while (it.hasNext()) { - ProgressListener lr = (ProgressListener) it.next(); - try { - lr.notifyProgressEvent( - engine, - event, - src, pMode, - error, param); - } catch (Throwable e) { - //!!logme - if (firstException == null) { - firstException = new ProcessingException( - Engine.this, src, new ExceptionCC( - "A listener Java object has failed to " - + "handle event \"" - + getProgressListenerEventName(event) - + "\". The class of the failing " - + "listener object is " - + lr.getClass().getName() + ".", - e)); - } - if (closingEvent != Integer.MIN_VALUE) { - break normalLoop; - } - } - doneCounter++; - } - if (firstException != null) { - if (closingEvent != Integer.MIN_VALUE) { - it = mergedListeners.iterator(); - while (it.hasNext() && doneCounter != 0) { - ProgressListener lr = (ProgressListener) it.next(); - try { - lr.notifyProgressEvent( - engine, - closingEvent, - src, pMode, - error, param); - } catch (Throwable e) { - ; //!!logme - } - doneCounter--; - } - } - throw firstException; - } - } - - private void refreshMergedListeneres() { - int i; - int ln; - Object o; - - mergedListeners.clear(); - - ln = xmlLdbListeners.size(); - for (i = 0; i < ln; i++) { - o = xmlLdbListeners.get(i); - if (!MiscUtil.listContainsObject(mergedListeners, o)) { - mergedListeners.add(o); - } - } - - ln = ldbListeners.size(); - for (i = 0; i < ln; i++) { - o = ldbListeners.get(i); - if (!MiscUtil.listContainsObject(mergedListeners, o)) { - mergedListeners.add(o); - } - } - - ln = attrListeners.size(); - for (i = 0; i < ln; i++) { - o = attrListeners.get(i); - if (!MiscUtil.listContainsObject(mergedListeners, o)) { - mergedListeners.add(o); - } - } - - ln = userListeners.size(); - for (i = 0; i < ln; i++) { - o = userListeners.get(i); - if (!MiscUtil.listContainsObject(mergedListeners, o)) { - mergedListeners.add(o); - } - } - - mergedNeedsRefresh = false; - } - - private int getClosingEvent(int event) { - if (event == EVENT_BEGIN_FILE_PROCESSING) { - return EVENT_END_FILE_PROCESSING; - } else if (event == EVENT_BEGIN_PROCESSING_SESSION) { - return EVENT_END_PROCESSING_SESSION; - } else { - return Integer.MIN_VALUE; - } - } - } - - private class XmlRenderingCfgContainer { - final XmlRenderingConfiguration xmlRenderingCfg; - Pattern[] compiledPathPatterns; - - XmlRenderingCfgContainer( - XmlRenderingConfiguration xmlRendering) { - this.xmlRenderingCfg = xmlRendering; - recompile(); - } - - void recompile() { - List pathPatterns = xmlRenderingCfg.getPathPatterns(); - int ln = pathPatterns.size(); - compiledPathPatterns = new Pattern[ln]; - for (int i = 0; i < ln; i++) { - compiledPathPatterns[i] - = pathPatternToRegexpPattern((String) pathPatterns.get(i)); - } - } - - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/EngineXmlUtils.java b/fmpp/src/main/java/fmpp/EngineXmlUtils.java deleted file mode 100644 index 786ded4..0000000 --- a/fmpp/src/main/java/fmpp/EngineXmlUtils.java +++ /dev/null @@ -1,91 +0,0 @@ -package fmpp; - -import java.io.File; -import java.util.List; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.EntityResolver; - -import fmpp.dataloaders.XmlDataLoader; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; -import freemarker.ext.dom.NodeModel; -import freemarker.template.TemplateNodeModel; - -class EngineXmlUtils { - - private EngineXmlUtils() { } - - static void setFreeMarkerXPathEngine(String xpathEngine) - throws IllegalConfigurationException { - if (xpathEngine.equals(Engine.XPATH_ENGINE_DONT_SET)) { - ; // do nothing - } else if (xpathEngine.equals(Engine.XPATH_ENGINE_DEFAULT)) { - NodeModel.useDefaultXPathSupport(); - } else if (xpathEngine.equals(Engine.XPATH_ENGINE_XALAN)) { - try { - NodeModel.useXalanXPathSupport(); - } catch (Exception e) { - throw new IllegalConfigurationException( - "Failed to use Xalan XPath engine.", e); - } - } else if (xpathEngine.equals(Engine.XPATH_ENGINE_JAXEN)) { - try { - NodeModel.useJaxenXPathSupport(); - } catch (Exception e) { - throw new IllegalConfigurationException( - "Failed to use Jaxen XPath engine.", e); - } - } else { - Class cl; - try { - cl = MiscUtil.classForName(xpathEngine); - } catch (ClassNotFoundException e) { - throw new IllegalConfigurationException( - "Custom XPath engine adapter class " - + StringUtil.jQuote(xpathEngine) + " not found. " - + "Note that the reserved names are: " - + StringUtil.jQuote(Engine.XPATH_ENGINE_DONT_SET) + ", " - + StringUtil.jQuote(Engine.XPATH_ENGINE_DEFAULT) + ", " - + StringUtil.jQuote(Engine.XPATH_ENGINE_XALAN) + ", " - + StringUtil.jQuote(Engine.XPATH_ENGINE_JAXEN) + ".", - e); - } - NodeModel.setXPathSupportClass(cl); - } - } - - static boolean isEntityResolver(Object o) { - return o instanceof EntityResolver; - } - - static Object loadXmlFile( - Engine eng, File xmlFile, boolean validate) throws Exception { - return XmlDataLoader.loadXmlFile(eng, xmlFile, true, validate); - } - - static boolean documentElementEquals( - Object doc, String namespace, String localName) { - Element e = ((Document) doc).getDocumentElement(); - String ns = e.getNamespaceURI(); - String ln = e.getLocalName(); - if (ns == null || ns.length() == 0) { - if (namespace != null) { - return false; - } - } else { - if (namespace == null || !namespace.equals(ns)) { - return false; - } - } - return localName.equals(ln); - } - - static TemplateNodeModel loadWithXmlDataLoader( - Engine eng, List args, Object preLoaderXml) throws Exception { - XmlDataLoader xdl = new XmlDataLoader(); - return xdl.load(eng, args, (Document) preLoaderXml); - } - -} diff --git a/fmpp/src/main/java/fmpp/FmppFileOutputWriter.java b/fmpp/src/main/java/fmpp/FmppFileOutputWriter.java deleted file mode 100644 index 245838a..0000000 --- a/fmpp/src/main/java/fmpp/FmppFileOutputWriter.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Iterator; - -import fmpp.util.FileUtil; -import fmpp.util.NullWriter; - -/** - * The writer that FMPP uses to write file output. - */ -class FmppFileOutputWriter extends FmppOutputWriter { - private static final int BUFFER_SIZE = 160; // large buffer slows down - - private Engine engine; - private ArrayList stateStack = new ArrayList(); - private boolean closed = false; - private boolean ignoreFlush = false; - - // State fields. Keep in sync. with save/restoreState! - private File dst; - private String enc; - private int freeBuf = BUFFER_SIZE; - private StringBuffer buf = new StringBuffer(BUFFER_SIZE); - private Writer fileWriter; - private boolean append; - private SavedState sharedSavedState; - - FmppFileOutputWriter(Engine engine, File dst, String enc) { - this.engine = engine; - this.engine = engine; - this.dst = dst; - this.enc = enc; - } - - public void write(String data) throws IOException { - if (fileWriter != null) { - fileWriter.write(data); - } else { - int ln = data.length(); - if (ln <= freeBuf) { - buf.append(data); - freeBuf -= ln; - } else { - createFileWriter(); - fileWriter.write(buf.toString()); - buf = null; - fileWriter.write(data); - } - } - } - - public void write(char[] data, int off, int len) throws IOException { - if (fileWriter != null) { - fileWriter.write(data, off, len); - } else { - int ln = data.length; - if (ln <= freeBuf) { - buf.append(data, off, len); - freeBuf -= ln; - } else { - createFileWriter(); - fileWriter.write(buf.toString()); - buf = null; - fileWriter.write(data, off, len); - } - } - } - - // Affects current writer only! - public void flush() throws IOException { - if (!ignoreFlush) { - if (fileWriter == null) { - createFileWriter(); - fileWriter.write(buf.toString()); - buf = null; - } - fileWriter.flush(); - } - } - - // Close *all* writers here! - public void close(boolean error) throws IOException { - if (closed) { - return; - } - try { - do { - try { - if (!error - || fileWriter != null - || (buf != null && buf.length() != 0)) { - flush(); - } - } finally { - if (fileWriter != null) { - fileWriter.close(); - } - } - fileWriter = null; - if (stateStack.size() == 0) { - break; - } - nestOutputFileEnd(true); - } while (true); - } finally { - // Final attempt to release resources - Iterator it = stateStack.iterator(); - while (it.hasNext()) { - SavedState s = (SavedState) it.next(); - try { - s.fileWriter.close(); - } catch (Throwable exc) { - //!!logme - ; //ignore - } - } - stateStack.clear(); - closed = true; - } - } - - public void close() throws IOException { - close(false); - } - - void dropOutputFile() throws IOException { - if (fileWriter != null) { - fileWriter.close(); - if (dst.isFile()) { - dst.delete(); - } - } - fileWriter = NullWriter.INSTANCE; - buf = null; - } - - void restartOutputFile() throws IOException { - if (fileWriter != null) { - fileWriter.close(); - } - initOutputBufferAndWriter(); - } - - void renameOutputFile(String newName) throws IOException { - File newDst = deduceNewDst(newName); - if (dst.equals(newDst)) { - return; - } - if (fileWriter != null) { - flush(); - fileWriter.close(); - - initOutputBufferAndWriter(); - - if (!dst.isFile()) { - throw new IOException("Can't find the file to rename: " - + dst.getPath()); - } - if (newDst.isFile()) { - newDst.delete(); - } - File parent = newDst.getParentFile(); - if (parent != null && !parent.exists()) { - parent.mkdirs(); - } - if (!dst.renameTo(newDst)) { - throw new IOException("Failed to rename " + dst.getPath() - + " to " + newDst.getPath()); - } - append = true; - } - dst = newDst; - } - - void changeOutputFile(String newName, boolean append) - throws IOException { - File newDst = deduceNewDst(newName); - if (dst.equals(newDst)) { - return; - } - - for (int i = stateStack.size() - 1; i >= 0; i--) { - SavedState s = (SavedState) stateStack.get(i); - if (s.dst.equals(newDst)) { - if (sharedSavedState == null || s != sharedSavedState) { - throw new IOException( - "Something is already using this file as output: " - + newDst.getAbsolutePath()); - } else { - break; - } - } - } - - - flush(); - fileWriter.close(); - - initOutputBufferAndWriter(); - this.append = append; - - dst = newDst; - } - - void nestOutputFileBegin(String newName, boolean append) - throws IOException { - File newDst = deduceNewDst(newName); - - SavedState s = new SavedState(); - s.store(); - stateStack.add(s); - - for (int i = stateStack.size() - 1; i >= 0; i--) { - s = (SavedState) stateStack.get(i); - if (s.dst.equals(newDst)) { - s.load(); - // intentionally ignore "append" parameter - sharedSavedState = s; - return; //! - } - } - initOutputBufferAndWriter(); - sharedSavedState = null; - this.append = append; - dst = newDst; - } - - void nestOutputFileEnd(boolean alreadyClosed) throws IOException { - if (stateStack.size() == 0) { - throw new RuntimeException( - "There is no more saved state in the state-stack!"); - } - - if (sharedSavedState != null) { - SavedState s = sharedSavedState.sharedSavedState; - sharedSavedState.store(); - sharedSavedState.sharedSavedState = s; - } else { - if (!alreadyClosed) { - flush(); - fileWriter.close(); - } - } - SavedState s = (SavedState) stateStack.remove(stateStack.size() - 1); - s.load(); - } - - void setOutputEncoding(String enc) throws IOException { - if (fileWriter != null && !(fileWriter instanceof NullWriter)) { - throw new IOException("Can't change the output encoding becasue " + "some of the output was already written to the file."); - } else { - if (enc.equals(Engine.PARAMETER_VALUE_HOST)) { - this.enc = System.getProperty("file.encoding"); - } else { - this.enc = enc; - } - } - } - - String getOutputEncoding() { - return enc; - } - - void setIgnoreFlush(boolean ignore) { - ignoreFlush = ignore; - } - - private void createFileWriter() throws IOException { - File p = dst.getParentFile(); - if (p != null) { - p.mkdirs(); - } - fileWriter = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(dst.getPath(), append), enc)); - } - - private File deduceNewDst(String newName) throws IOException { - newName = FileUtil.pathToUnixStyle(newName); - return FileUtil.resolveRelativeUnixPath( - engine.getOutputRoot(), - dst.getParentFile(), - newName); - } - - private void initOutputBufferAndWriter() { - fileWriter = null; - if (buf == null) { - buf = new StringBuffer(BUFFER_SIZE); - } else { - buf.delete(0, buf.length()); - } - freeBuf = BUFFER_SIZE; - } - - private class SavedState { - private File dst; - private String enc; - private int freeBuf; - private StringBuffer buf; - private Writer fileWriter; - private boolean append; - private SavedState sharedSavedState; - - private void store() { - this.dst = FmppFileOutputWriter.this.dst; - enc = FmppFileOutputWriter.this.enc; - freeBuf = FmppFileOutputWriter.this.freeBuf; - buf = FmppFileOutputWriter.this.buf; - fileWriter = FmppFileOutputWriter.this.fileWriter; - append = FmppFileOutputWriter.this.append; - sharedSavedState = FmppFileOutputWriter.this.sharedSavedState; - } - - private void load() { - FmppFileOutputWriter.this.dst = dst; - FmppFileOutputWriter.this.enc = enc; - FmppFileOutputWriter.this.freeBuf = freeBuf; - FmppFileOutputWriter.this.buf = buf; - FmppFileOutputWriter.this.append = append; - FmppFileOutputWriter.this.fileWriter = fileWriter; - FmppFileOutputWriter.this.sharedSavedState = sharedSavedState; - } - } - - public File getOutputFile() { - return dst; - } -} diff --git a/fmpp/src/main/java/fmpp/FmppOutputWriter.java b/fmpp/src/main/java/fmpp/FmppOutputWriter.java deleted file mode 100644 index d3e3ee3..0000000 --- a/fmpp/src/main/java/fmpp/FmppOutputWriter.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; -import java.io.IOException; -import java.io.Writer; - -/** - * The writer that FMPP uses to write the output files. - */ -abstract class FmppOutputWriter extends Writer { - abstract void dropOutputFile() throws IOException; - - abstract void restartOutputFile() throws IOException; - - abstract void renameOutputFile(String newName) throws IOException; - - abstract void changeOutputFile(String newName, boolean append) - throws IOException; - - abstract void nestOutputFileBegin(String newName, boolean append) - throws IOException; - - abstract void nestOutputFileEnd(boolean alreadyClosed) throws IOException; - - abstract void setOutputEncoding(String enc) throws IOException; - - abstract String getOutputEncoding(); - - abstract File getOutputFile(); - - abstract void setIgnoreFlush(boolean ignore) throws IOException; - - abstract void close(boolean error) throws IOException; -} diff --git a/fmpp/src/main/java/fmpp/FmppTemplateLoader.java b/fmpp/src/main/java/fmpp/FmppTemplateLoader.java deleted file mode 100644 index 559eaeb..0000000 --- a/fmpp/src/main/java/fmpp/FmppTemplateLoader.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.List; - -import freemarker.cache.TemplateLoader; - -/** - * A TemplateLoader that uses files in a specified directory as the - * source of templates. - */ -class FmppTemplateLoader implements TemplateLoader { - private static final boolean SEP_IS_SLASH = File.separatorChar == '/'; - private final Engine engine; - - public FmppTemplateLoader(Engine engine) - throws IOException { - this.engine = engine; - } - - public Object findTemplateSource(String name) - throws IOException { - if (name.indexOf('\\') != -1) { - throw new IOException("Malformed path. FreeMarker paths use slash " - + "(/) to separate path components, not backslash (\\). " - + "Please replace backslashes with slashes in this path: " - + name); - } - - String nativeName - = SEP_IS_SLASH ? name : name.replace('/', File.separatorChar); - - File source = new File(engine.getSourceRoot(), nativeName); - if (source.isFile()) { - return source; - } - - if (name.startsWith("@")) { - int i = name.indexOf("/"); - String linkName; - if (i != -1) { - linkName = name.substring(1, i); - nativeName = nativeName.substring(i + 1); - } else { - linkName = name.substring(1); - nativeName = null; - } - List links = engine.getFreemarkerLink(linkName); - if (links != null) { - int ln = links.size(); - for (i = 0; i < ln; i++) { - if (nativeName != null) { - source = new File((File) links.get(i), nativeName); - } else { - source = (File) links.get(i); - } - if (source.isFile()) { - return source; //!! - } - } - } - } - - return null; - } - - public long getLastModified(Object templateSource) { - return ((File) templateSource).lastModified(); - } - - public Reader getReader(Object templateSource, String encoding) - throws IOException { - return engine.wrapReader( - new InputStreamReader( - new FileInputStream((File) templateSource), - encoding), - (File) templateSource); - } - - public void closeTemplateSource(Object templateSource) { - // Do nothing. - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/GenericProcessingException.java b/fmpp/src/main/java/fmpp/GenericProcessingException.java deleted file mode 100644 index 57c60c7..0000000 --- a/fmpp/src/main/java/fmpp/GenericProcessingException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import fmpp.util.ExceptionCC; - -/** - * Problem has occured during the processing session. - */ -class GenericProcessingException extends ExceptionCC { - - public GenericProcessingException(String message) { - super(message); - } - - public GenericProcessingException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/IllegalConfigurationException.java b/fmpp/src/main/java/fmpp/IllegalConfigurationException.java deleted file mode 100644 index d7315bf..0000000 --- a/fmpp/src/main/java/fmpp/IllegalConfigurationException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import fmpp.util.ExceptionCC; - -/** - * The engine was not configured correctly. - */ -class IllegalConfigurationException extends ExceptionCC { - - public IllegalConfigurationException(String message) { - super(message); - } - - public IllegalConfigurationException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/LocalDataBuilder.java b/fmpp/src/main/java/fmpp/LocalDataBuilder.java deleted file mode 100644 index fe036f1..0000000 --- a/fmpp/src/main/java/fmpp/LocalDataBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.util.Map; - -/** - * Contains callback to build the local data for a file processing. - * This interface is used to implement the "localData" setting. - * - *

    Life-cycle: These are long-lived objects. The - * local data builder object is plugged into the {@link Engine}, and then it may - * be in use during several processing sessions. - * Typically the construction of the object is done by - * {@link fmpp.setting.Settings#execute()}, based on the value of setting - * "localData". - * - *

    Local data builders that are added with setting "localData" (or - * directly with {@link Engine#addLocalDataBuilder}) receive notifications about - * the events of the {@link Engine} if they implement interface - * {@link ProgressListener}. - */ -public interface LocalDataBuilder { - /** - * Returns the variables that could be added to the local data. - * - * @return the variables to add to the local data. Can be - * null. The returned map will not be modified - * (although technically, badly behaved 3rd party code can modify - * the values soted in the map...). - */ - Map build(Engine eng, TemplateEnvironment env) throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/ProcessingException.java b/fmpp/src/main/java/fmpp/ProcessingException.java deleted file mode 100644 index bcbbacf..0000000 --- a/fmpp/src/main/java/fmpp/ProcessingException.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; - -import fmpp.util.ExceptionCC; - -/** - * Error while performing the processing session. - */ -public class ProcessingException extends ExceptionCC { - - private static final long serialVersionUID = 1L; - - private final File sourceFile; - private final File sourceRoot; - - /** - * @param sourceFile can be null. - */ - public ProcessingException(Engine e, File sourceFile, Throwable cause) { - super(cause); - this.sourceRoot = e.getSourceRoot(); - if (sourceRoot != null) { - this.sourceFile = sourceFile; - } else { - this.sourceFile = null; - } - } - - /** - * Returns the source file the faliure relates to. - * This is an absolute file (not relative). - * It's null if no such information is available. - */ - public File getSourceFile() { - return sourceFile; - } - - /** - * Returns the "sourceRoot" used during the processing session that failed. - * It's maybe null, but only if {@link #getSourceFile()} - * returns null too. - */ - public File getSourceRoot() { - return sourceRoot; - } - - /** - * Returns always the same text: "FMPP processing session failed." - */ - public String getMessage() { - return "FMPP processing session failed" + (sourceFile != null ? " at " + sourceFile : ""); - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/ProgressListener.java b/fmpp/src/main/java/fmpp/ProgressListener.java deleted file mode 100644 index 3722105..0000000 --- a/fmpp/src/main/java/fmpp/ProgressListener.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; - -/** - * Interface to monitor the events of an Engine. - * - *

    The object that implements this interface need to be plugged into the - * {@link Engine} to receive notifications about its events. For example, if you - * add an object as engine attribute or as local data loader to the engine, it - * will be notified about the events. Object that has no role other than - * listening to events can to be plugged with - * {@link Engine#addProgressListener}. - * - *

    Examples of the usage of progress listeners: - *

      - *
    • Displaying visually the progress of the processing session for the - * user. - *
    • Creating statistics about the processing session. - *
    • Implementing a poor man's logging (until no logging support added to - * FMPP) - *
    • Releasing the resources held by local data loaders and engine - * attributes when the session is finished. - *
    - */ -public interface ProgressListener { - /** Engine.process has started the work. */ - int EVENT_BEGIN_PROCESSING_SESSION = 1; - - /** Engine.process has finished the work. */ - int EVENT_END_PROCESSING_SESSION = 4; - - /** The processing of a single file has been started. */ - int EVENT_BEGIN_FILE_PROCESSING = 2; - - /** The processing of a single file has been finished. */ - int EVENT_END_FILE_PROCESSING = 3; - - /** A source directory has been ignored (skipped.) */ - int EVENT_IGNORING_DIR = 5; - - /** An empty directory was created due to the copyEmptyDirs setting. */ - int EVENT_CREATED_EMPTY_DIR = 8; - - /** - * A warning message has been received from a template or from the - * engine. - */ - int EVENT_WARNING = 6; - - /** - * The processing of source was skipped because the output was generated - * after the last modification of the source file. - */ - int EVENT_SOURCE_NOT_MODIFIED = 7; - - /** - * Method called be the engine to notify events. - * - *

    It is guaranteed that this method will not be called concurrently - * as far as the listener is added to a single Engine instance - * only. - * - * @param engine The engine instance where the event has occurred. - * @param event The code of the event: an EVENT_... constant. - * As new event types can be introduced with new FMPP versions (even if - * it happens very seldom), a progress listener implementation should - * survive events that it does not understand. That is, it must not stop - * with an error, but it should silently ignore the event. - * @param src Depending on event the source file or null. - * @param pMode Depending on event the proccessing mode - * (Engine.PMODE_... constant) or - * Engine.PMODE_NONE. Note that new processing modes may - * be added as FMPP evolvers, so values that are not known be the - * progress listener should be handler nicely, and never cause error. - * @param error The error, or null if there was no error. - * @param param Extra information about the event. The class and meaning of - * object depends on the concrete event: - *

      - *
    • For EVENT_WARNING it is a String that - * describles the reason of warning. - *
    - */ - void notifyProgressEvent( - Engine engine, - int event, - File src, int pMode, - Throwable error, Object param) throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/TemplateDataModelBuilder.java b/fmpp/src/main/java/fmpp/TemplateDataModelBuilder.java deleted file mode 100644 index 903b944..0000000 --- a/fmpp/src/main/java/fmpp/TemplateDataModelBuilder.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; -import java.util.Map; - -import freemarker.template.Template; - -/** - * Contains callback to build the data-model for a template execution. - * - * @deprecated Use {@link fmpp.LocalDataBuilder} instead. - */ -public interface TemplateDataModelBuilder { - - /** - * Returns the top-level variables that will be available for the template. - */ - Map build(Engine e, Template template, File src) - throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/TemplateEnvironment.java b/fmpp/src/main/java/fmpp/TemplateEnvironment.java deleted file mode 100644 index b7d6911..0000000 --- a/fmpp/src/main/java/fmpp/TemplateEnvironment.java +++ /dev/null @@ -1,1473 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.io.File; -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import fmpp.models.AddTransform; -import fmpp.models.ClearTransform; -import fmpp.models.CopyWritableVariableMethod; -import fmpp.models.NewWritableHashMethod; -import fmpp.models.NewWritableSequenceMethod; -import fmpp.models.RemoveTransform; -import fmpp.models.SetTransform; -import fmpp.models.TemplateModelUtils; -import fmpp.models.WritableHash; -import fmpp.tdd.DataLoader; -import fmpp.tdd.EvalException; -import fmpp.util.FileUtil; -import fmpp.util.FreemarkerUtil; -import fmpp.util.StringUtil; -import freemarker.core.Environment; -import freemarker.template.ObjectWrapper; -import freemarker.template.SimpleCollection; -import freemarker.template.SimpleDate; -import freemarker.template.SimpleNumber; -import freemarker.template.SimpleScalar; -import freemarker.template.Template; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateDateModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateMethodModel; -import freemarker.template.TemplateMethodModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNodeModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateTransformModel; - -/** - * The runtime FMPP environment of an executing template. - */ -public class TemplateEnvironment { - private static final ThreadLocal THREAD_LOCAL = new ThreadLocal(); - - private final Engine eng; - - private class PPHash implements TemplateHashModelEx { - private Map map = new HashMap(); - - public int size() throws TemplateModelException { - return map.size(); - } - - public TemplateCollectionModel keys() throws TemplateModelException { - return new SimpleCollection( - map.keySet(), ObjectWrapper.SIMPLE_WRAPPER); - } - - public TemplateCollectionModel values() throws TemplateModelException { - return new SimpleCollection( - map.values(), ObjectWrapper.SIMPLE_WRAPPER); - } - - public TemplateModel get(String key) throws TemplateModelException { - Object o = map.get(key); - if (o instanceof LiveScalar) { - return (TemplateModel) ((LiveScalar) o) - .exec(Collections.EMPTY_LIST); - } else { - return (TemplateModel) o; - } - } - - public boolean isEmpty() throws TemplateModelException { - return map.isEmpty(); - } - - public void put(String name, TemplateModel value) { - map.put(name, value); - } - - public void put(String name, String value) { - map.put(name, new SimpleScalar(value)); - } - - public void remove(String name) { - map.remove(name); - } - } - - // State variables - private final PPHash ppHash = new PPHash(); - private boolean externallyAccessible; - private String ppOpDenialMessage; - private FmppOutputWriter outputWriter; - private File srcFile; - private Template template; - private Environment fmEnv; - private Map localData; - private Object xmlDocument; // org.w3c.Document - private TemplateNodeModel wrappedXmlDocument; - - TemplateEnvironment(Engine engine) { - this.eng = engine; - - // transforms - ppHash.put("changeOutputFile", new ChangeOutputFileTransform()); - ppHash.put("renameOutputFile", new RenameOutputFileTransform()); - ppHash.put("dropOutputFile", new DropOutputFileTransform()); - ppHash.put("restartOutputFile", new RestartOutputFileTransform()); - ppHash.put("nestOutputFile", new NestOutputFileTransform()); - ppHash.put("setOutputEncoding", new SetOutputEncodingTransform()); - ppHash.put("ignoreOutput", new IgnoreOutputTransform()); - ppHash.put("warning", new WarningTransform()); - ppHash.put("set", new SetTransform()); - ppHash.put("add", new AddTransform()); - ppHash.put("remove", new RemoveTransform()); - ppHash.put("clear", new ClearTransform()); - - // methods - ppHash.put("realFileSize", new RealFileSizeMethod()); - ppHash.put("realFileLastModified", new RealFileLastModifiedMethod()); - ppHash.put("realFileExists", new RealFileExistsMethod()); - ppHash.put("sourceFileSize", new SourceFileSizeMethod()); - ppHash.put("sourceFileLastModified", - new SourceFileLastModifiedMethod()); - ppHash.put("sourceFileExists", new SourceFileExistsMethod()); - ppHash.put("outputFileSize", new OutputFileSizeMethod()); - ppHash.put("outputFileLastModified", - new OutputFileLastModifiedMethod()); - ppHash.put("outputFileExists", new OutputFileExistsMethod()); - ppHash.put("urlEnc", new UrlEncodeMethod()); - ppHash.put("urlPathEnc", new UrlPathEncodeMethod()); - ppHash.put("sourceRootRelativePath", - new ToSourceRootRelativePathMethod()); - ppHash.put("outputRootRelativePath", - new ToOutputRootRelativePathMethod()); - ppHash.put("pathTo", - new PathToMethod()); - ppHash.put("sourcePathTo", - new PathToSourceMethod()); - ppHash.put("newWritableSequence", new NewWritableSequenceMethod()); - ppHash.put("newWritableHash", new NewWritableHashMethod()); - ppHash.put("copyWritable", new CopyWritableVariableMethod()); - ppHash.put("loadData", new LoadDataMethod()); - - // constants - ppHash.put("slash", File.separator); - ppHash.put("version", Engine.getVersionNumber()); - ppHash.put("freemarkerVersion", Engine.getFreeMarkerVersionNumber()); - - // live variables - ppHash.put("outputFile", new OutputFileMethod()); - ppHash.put("outputDirectory", new OutputDirectoryMethod()); - ppHash.put("outputFileName", new OutputFileNameMethod()); - ppHash.put("realOutput", new RealOutputMethod()); - ppHash.put("realOutputDirectory", new RealOutputDirectoryMethod()); - ppHash.put("outputEncoding", new OutputEncodingMethod()); - ppHash.put("home", new HomeScalar()); - ppHash.put("locale", new LocaleMethod()); - ppHash.put("now", new NowScalar()); - ppHash.put("doc", new DocScalar()); - } - - // ------------------------------------------------------------------------- - // Public - - /** - * Returns the {@link TemplateEnvironment} object used for the template - * currently being executed by FMPP in the current thread. - * The return value of the method is undefined if no such template execution - * is in progress. - * In practice it means that it can be safely called from a Java - * method that is (indirectly) invoked by the executing template. For - * example, in a {@link freemarker.template.TemplateTransformModel} that is - * used in the template with {@code <@...>}. - */ - public static TemplateEnvironment getCurrentInstance() { - return (TemplateEnvironment) THREAD_LOCAL.get(); - } - - /** - * Returns the FreeMarker environment currently in use. - * The FreeMarker environment can be used to set/get variables, among - * others. - * - * @throws IllegalStateException if the FreeMarker environment is not - * available. - */ - public Environment getFreemarkerEnvironment() { - if (fmEnv == null) { - throw new IllegalStateException("The FreeMarker environment is " - + "not available, because the template is not executing."); - } - return fmEnv; - } - - /** - * Returns the FMPP engine object in use. - */ - public Engine getEngine() { - return eng; - } - - /** - * Returns the processed XML document ({@code pp.doc}) as - * {@link org.w3c.dom.Document}. This will return non-{@code null} - * if, and only if the current processing mode is "renderXml". - * - * @see #getWrappedXmlDocument() - */ - public Object getXmlDocument() { - return xmlDocument; - } - - /** - * The same as {@link #getXmlDocument()}, but returns the document as - * {@link freemarker.ext.dom.NodeModel}. - */ - public TemplateNodeModel getWrappedXmlDocument() { - return wrappedXmlDocument; - } - - /** - * Similar to {@link Engine#getData}, but it also sees file processing - * specifict variables (local data). - * - * @param name the name of the variable. - * @return the value of the variable, or {@code null} if no variable - * with the given name exists. - */ - public Object getData(String name) { - Object o = localData.get(name); - return o == null ? eng.getData(name) : o; - } - - /** - * Returns the source file. - */ - public File getSourceFile() { - return srcFile; - } - - /** - * Retuns the FreeMarker {@link Template} object for the source file. - */ - public Template getTemplate() { - return template; - } - - /** - * Returns the output file. Note that this value can change during the - * execution of template. - */ - public File getOutputFile() throws IOException { - return outputWriter.getOutputFile(); - } - - /** - * Returns URL-style path of the output root relative to the current output - * file. - */ - public String getHomePath() throws IOException { - File d = outputWriter.getOutputFile().getParentFile(); - File r = eng.getOutputRoot(); - String home = ""; - while (!d.equals(r)) { - home = home + "../"; - d = d.getParentFile(); - } - return home; - } - - /** - * Returns the output encoding. Note that this value can change during the - * execution of template. - */ - public String getOutputEncoding() throws IOException { - return outputWriter.getOutputEncoding(); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void changeOutputFile(String name) throws IOException { - checkPpOpsAllowed(); - outputWriter.changeOutputFile(name, false); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void changeOutputFile(String name, boolean append) - throws IOException { - checkPpOpsAllowed(); - outputWriter.changeOutputFile(name, append); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void renameOutputFile(String name) throws IOException { - checkPpOpsAllowed(); - outputWriter.renameOutputFile(name); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void dropOutputFile() throws IOException { - checkPpOpsAllowed(); - outputWriter.dropOutputFile(); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void restartOutputFile() throws IOException { - checkPpOpsAllowed(); - outputWriter.restartOutputFile(); - } - - /** - * It does the same as the begin tag of the corresponding directive of the - * pp hash. - */ - public void beginNestedOutputFile(String name) throws IOException { - checkPpOpsAllowed(); - outputWriter.nestOutputFileBegin(name, false); - } - - /** - * It does the same as the begin tag of the corresponding directive of the - * pp hash. - */ - public void beginNestedOutputFile(String name, boolean append) - throws IOException { - checkPpOpsAllowed(); - outputWriter.nestOutputFileBegin(name, append); - } - - /** - * It does the same as the end tag of the corresponding directive of the - * pp hash. - */ - public void endNestedOutputFile() throws IOException { - checkPpOpsAllowed(); - outputWriter.nestOutputFileEnd(false); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void setOutputEncoding(String encoding) throws IOException { - checkPpOpsAllowed(); - outputWriter.setOutputEncoding(encoding); - fmEnv.setOutputEncoding(outputWriter.getOutputEncoding()); - } - - /** - * It does the same as the directive in the pp hash. - */ - public void warning(String message) { - eng.sendWarning(srcFile, message); - } - - /** - * Resolves a source path to a File object. - * Use this for your custom transforms that wants the path of a source file - * as parameter. When it tries to find the file, paths as - * {@code foo.jpg} will be interpreted relatively to the current source - * file, while paths like {@code /img/foo.jpg} will be interpreted - * relatively to source root directory. - * - *

    Note that an IOException will be thrown if the file is outside the - * source root directory. - * - * @param path the path in UN*X or native format. - * @return {@link File} object that points to the file. - */ - public File resolveSourcePath(String path) throws IOException { - path = FileUtil.pathToUnixStyle(path); - return FileUtil.resolveRelativeUnixPath( - eng.getSourceRoot(), - srcFile.getParentFile(), - path); - } - - /** - * Resolves a output path to a File object. - * This follows the same logic as {@link #resolveSourcePath}, but it uses - * the output file and the output root directory as appropriate. - */ - public File resolveOutputPath(String path) throws IOException { - path = FileUtil.pathToUnixStyle(path); - return FileUtil.resolveRelativeUnixPath( - eng.getOutputRoot(), - getOutputFile().getParentFile(), - path); - } - - /** - * Returns the path relative to the source root. - * - * @param path the path in UN*X or native format. - * The virtual root directory will be the source root, not the real - * root directory of the host system. - * @return the source root relative path in UN*X format. - * It does not start with slash. - */ - public String toSourceRootRelativePath(String path) throws IOException { - File f = resolveSourcePath(path); - return FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(eng.getSourceRoot(), f)); - } - - /** - * Convets a file object to a source root relative UN*X style path. - */ - public String toSourceRootRelativePath(File f) throws IOException { - return FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(eng.getSourceRoot(), f)); - } - - /** - * Same as {@link #toSourceRootRelativePath(String)} but with the output - * file and output root directory. - */ - public String toOutputRelatitvePath(String path) throws IOException { - File f = resolveOutputPath(path); - return FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(eng.getOutputRoot(), f)); - } - - /** - * Convets a file object to an output root relative UN*X style path. - */ - public String toOutputRootRelativePath(File f) throws IOException { - return FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(eng.getOutputRoot(), f)); - } - - /** - * Calculates the path of another output file relatively to current output - * file, in UN*X format. - * - * @param dst the path of the other output file in UN*X or native format. - * The (virtual) root directory will be the output root directory, not - * the real root directory of the host system. - * @return the path of {@code dst} relatively to the current output - * file, in UN*X format. - * It never starts with slash. It ends with slash if and only if - * {@code dst} ends with slash, except if the return value would - * be a single slash then, in which case the result will be an empty - * string instead. - */ - public String getPathTo(String dst) throws IOException { - boolean slashEnd = dst.endsWith("/") || dst.endsWith(File.separator); - File f = resolveOutputPath(dst); - String res = FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(getOutputFile().getParentFile(), f)); - if (res.endsWith("/")) { - res = res.substring(0, res.length() - 1); - } - return slashEnd && res.length() != 0 ? res + "/" : res; - } - - /** - * Same as {@link #getPathTo} but with the source file and - * source root directory. - */ - public String getSourcePathTo(String dst) throws IOException { - boolean slashEnd = dst.endsWith("/") || dst.endsWith(File.separator); - File f = resolveSourcePath(dst); - String res = FileUtil.pathToUnixStyle( - FileUtil.getRelativePath(srcFile.getParentFile(), f)); - if (res.endsWith("/")) { - res = res.substring(0, res.length() - 1); - } - return slashEnd && res.length() != 0 ? res + "/" : res; - } - - // ------------------------------------------------------------------------- - // Protected - - boolean isExternallyAccessible() { - return externallyAccessible; - } - - void setupForSession() { - ppHash.put("s", new WritableHash()); - ppHash.put("sessionStart", - new SimpleDate(new Date(), TemplateDateModel.DATETIME)); - } - - void cleanAfterSession() { - ppHash.remove("s"); - } - - void execute( - Template template, FmppOutputWriter out, File srcFile, - Object xmlDocument, TemplateNodeModel wrappedXmlDocument, - List xmlldbs) - throws DataModelBuildingException, TemplateException, IOException { - try { - this.outputWriter = out; - this.srcFile = srcFile; - this.template = template; - this.xmlDocument = xmlDocument; - this.wrappedXmlDocument = wrappedXmlDocument; - this.localData = new HashMap(); - - // Update the PP hash: - - ppHash.put("sourceRoot", fixedDirPath(eng.getSourceRoot())); - ppHash.put("outputRoot", fixedDirPath(eng.getOutputRoot())); - ppHash.put("realSource", fixedFilePath(srcFile)); - ppHash.put("sourceFile", FileUtil.pathToUnixStyle( - FileUtil.getRelativePath( - eng.getSourceRoot(), srcFile))); - ppHash.put("sourceFileName", srcFile.getName()); - ppHash.put("realSourceDirectory", - fixedDirPath(srcFile.getParentFile())); - ppHash.put("sourceDirectory", FileUtil.pathToUnixStyle( - fixedDirPath(FileUtil.getRelativePath( - eng.getSourceRoot(), - srcFile.getParentFile())))); - ppHash.put("sourceEncoding", template.getEncoding()); - - // Build the local data model: - - ppOpDenialMessage = "You are not allowed to do this operation " + "while building the local data model."; - List ldbs = eng.getLocalDataBuildersForFile(srcFile); - int ln = ldbs.size(); - Map builtData; - for (int i = ln - 1; i >= 0; i--) { - LocalDataBuilder ldb = (LocalDataBuilder) ldbs.get(i); - try { - builtData = ldb.build(eng, this); - } catch (Throwable e) { - throw new DataModelBuildingException( - "Failed to build local data.", e); - } - if (builtData != null) { - localData.putAll(builtData); - } - } - if (xmlldbs != null) { - ln = xmlldbs.size(); - for (int i = 0; i < ln; i++) { - try { - builtData = ((LocalDataBuilder) xmlldbs.get(i)) - .build(eng, this); - } catch (Throwable e) { - throw new DataModelBuildingException( - "Failed to build local data with the " + "local data builder specified by the XML " + "rendering configuration.", e); - } - if (builtData != null) { - localData.putAll(builtData); - } - } - } - - // Execute the template: - - Object lastThreadLocal = THREAD_LOCAL.get(); - THREAD_LOCAL.set(this); - try { - externallyAccessible = true; - try { - // Deprecated TemplateDataModelBuilder - TemplateDataModelBuilder tdmBuilder - = eng.getTemplateDataModelBuilder(); - if (tdmBuilder != null) { - Map td; - try { - td = tdmBuilder.build(eng, template, srcFile); - } catch (Throwable e) { - throw new DataModelBuildingException( - "Failed to build template specific data. " - + "(at builder of class " - + tdmBuilder.getClass().getName() + ")", - e); - } - if (td != null) { - localData.putAll(td); - } - } - - localData.put("pp", ppHash); - - ppOpDenialMessage = null; - - fmEnv = template.createProcessingEnvironment( - localData, outputWriter); - fmEnv.setOutputEncoding(outputWriter.getOutputEncoding()); - fmEnv.process(); - } finally { - externallyAccessible = false; - } - } finally { - THREAD_LOCAL.set(lastThreadLocal); - } - } finally { - execute_clean(); - } - } - - // ------------------------------------------------------------------------- - // Private - - private void execute_clean() { - outputWriter = null; - srcFile = null; - template = null; - fmEnv = null; - localData = null; - xmlDocument = null; - wrappedXmlDocument = null; - } - - private void checkPpOpsAllowed() { - if (ppOpDenialMessage != null) { - throw new IllegalStateException(ppOpDenialMessage); - } - } - - private String getCurrentUrlEncodingCharset() { - String s = fmEnv.getURLEscapingCharset(); - return s != null ? s : fmEnv.getOutputEncoding(); - } - - private static String fixedFilePath(File f) throws IOException { - return f.getCanonicalPath(); - } - - private static String fixedDirPath(File f) throws IOException { - return fixedDirPath(f.getCanonicalPath()); - } - - private static String fixedDirPath(String s) throws IOException { - if (s.length() > 0 && !s.endsWith(File.separator) && !s.endsWith("/")) { - s = s + File.separator; - } - return s; - } - - // ------------------------------------------------------------------------- - // Transforms - - private class ChangeOutputFileTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - String name = null; - boolean append = false; - - try { - out.flush(); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to change the outout file", exc); - } - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("name".equals(pname)) { - name = strParam(pvalue, pname); - } else if ("append".equals(pname)) { - append = boolParam(pvalue, pname); - } else { - throw newUnsupportedParamException(pname); - } - } - if (name == null) { - throw newMissingParamException("name"); - } - - try { - outputWriter.changeOutputFile(name, append); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to change the outout file", exc); - } - - return null; - } - } - - private class RenameOutputFileTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - String name = null; - String extension = null; - - try { - outputWriter.setIgnoreFlush(true); - try { - out.flush(); - } finally { - outputWriter.setIgnoreFlush(false); - } - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to rename the output file", exc); - } - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("name".equals(pname)) { - name = strParam(pvalue, pname); - } else if ("extension".equals(pname)) { - extension = strParam(pvalue, pname); - } else { - throw newUnsupportedParamException(pname); - } - } - if (name == null) { - if (extension == null) { - throw new TemplateModelException("You must specify on of " + "parameters \"name\" and \"extension\"."); - } - try { - name = getOutputFile().getName(); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to rename the output file", exc); - } - int i = name.lastIndexOf('.'); - if (i != -1) { - name = name.substring(0, i + 1) + extension; - } else { - name = name + "." + extension; - } - } else { - if (extension != null) { - throw new TemplateModelException("You can't specify both " - + "parameters \"name\" and \"extension\"."); - } - } - - try { - outputWriter.renameOutputFile(name); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to rename the output file", exc); - } - - return null; - } - } - - private class DropOutputFileTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - if (params != null && params.size() != 0) { - throw newNoParamsAllowedException(); - } - - try { - outputWriter.dropOutputFile(); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to drop the output file", exc); - } - - return null; - } - } - - private class RestartOutputFileTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - if (params != null && params.size() != 0) { - throw newNoParamsAllowedException(); - } - - try { - outputWriter.restartOutputFile(); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to reset the output file", exc); - } - - return null; - } - } - - private class NestOutputFileTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(final Writer out, Map params) - throws TemplateModelException { - String name = null; - boolean append = false; - - try { - out.flush(); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to nest output file", exc); - } - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("name".equals(pname)) { - name = strParam(pvalue, pname); - } else if ("append".equals(pname)) { - append = boolParam(pvalue, pname); - } else { - throw newUnsupportedParamException(pname); - } - } - if (name == null) { - throw newMissingParamException("name"); - } - - try { - outputWriter.nestOutputFileBegin(name, append); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to nest output file", exc); - } - - return new Writer() { - - public void write(String data) - throws IOException { - out.write(data); - } - - public void write(char[] cbuf, int off, int len) - throws IOException { - out.write(cbuf, off, len); - } - - public void flush() throws IOException { - out.flush(); - } - - public void close() throws IOException { - outputWriter.nestOutputFileEnd(false); - } - }; - } - } - - class SetOutputEncodingTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - String encoding = null; - - try { - outputWriter.setIgnoreFlush(true); - try { - out.flush(); - } finally { - outputWriter.setIgnoreFlush(false); - } - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to set output encoding", exc); - } - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("encoding".equals(pname)) { - encoding = strParam(pvalue, pname); - } else { - throw newUnsupportedParamException(pname); - } - } - if (encoding == null) { - throw newMissingParamException("encoding"); - } - - try { - if (encoding.equals(Engine.PARAMETER_VALUE_SOURCE)) { - encoding = template.getEncoding(); - } - setOutputEncoding(encoding); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to set output encoding", exc); - } - - return null; - } - } - - private class WarningTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException { - String message = null; - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("message".equals(pname)) { - message = strParam(pvalue, pname); - } else { - throw newUnsupportedParamException(pname); - } - } - if (message == null) { - throw newMissingParamException("message"); - } - - eng.sendWarning(srcFile, message); - - return null; - } - } - - private class IgnoreOutputTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(final Writer out, Map params) - throws TemplateModelException { - if (params != null && params.size() != 0) { - throw new TemplateModelException( - "This transform does no support parameters."); - } - - return new Writer() { - public void close() throws IOException { - // nop - } - - public void flush() throws IOException { - out.flush(); - } - - public void write(char[] arg0, int arg1, int arg2) - throws IOException { - // nop - } - - public void write(String str) throws IOException { - // nop - } - }; - } - } - - private class RealFileSizeMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "realFileSize needs 1 argument: file name"); - } - File f = new File((String) arguments.get(0)); - return new SimpleNumber(f.length()); - } - } - - private class RealFileLastModifiedMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "realFileLastModified needs 1 argument: file name"); - } - File f = new File((String) arguments.get(0)); - long l = f.lastModified(); - if (l == 0L) { - throw new TemplateModelException( - "Can't query last modification date, because the " - + "file does not exist: " + f.getAbsolutePath()); - } - return new SimpleDate(new Date(l), TemplateDateModel.DATETIME); - } - } - - private class RealFileExistsMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "realFileExists needs 1 argument: file name"); - } - File f = new File((String) arguments.get(0)); - return f.exists() - ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE; - } - } - - private class SourceFileSizeMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "sourceFileSize needs 1 argument: file name"); - } - try { - File f = resolveSourcePath((String) arguments.get(0)); - return new SimpleNumber(f.length()); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to query file size", exc); - } - } - } - - private class SourceFileLastModifiedMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "sourceFileLastModified needs 1 argument: file name"); - } - try { - File f = resolveSourcePath((String) arguments.get(0)); - long l = f.lastModified(); - if (l == 0L) { - throw new TemplateModelException( - "Can't query last modification date, because the " - + "file does not exist: " + f.getAbsolutePath()); - } - return new SimpleDate(new Date(l), TemplateDateModel.DATETIME); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to query last modification date", - exc); - } - } - } - - private class SourceFileExistsMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "sourceFileExists needs 1 argument: file name"); - } - try { - File f = resolveSourcePath((String) arguments.get(0)); - return f.exists() - ? TemplateBooleanModel.TRUE - : TemplateBooleanModel.FALSE; - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to check if the file exists", exc); - } - } - } - - private class OutputFileSizeMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "outputFileSize needs 1 argument: file name"); - } - try { - File f = resolveOutputPath((String) arguments.get(0)); - return new SimpleNumber(f.length()); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to query file size", exc); - } - } - } - - private class OutputFileLastModifiedMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "outputFileLastModified needs 1 argument: file name"); - } - try { - File f = resolveOutputPath((String) arguments.get(0)); - long l = f.lastModified(); - if (l == 0L) { - throw new TemplateModelException( - "Can't query last modification date, because the " - + "file does not exist: " + f.getAbsolutePath()); - } - return new SimpleDate(new Date(l), TemplateDateModel.DATETIME); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to query last modification date", - exc); - } - } - } - - private class OutputFileExistsMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "outputFileExists needs 1 argument: file name"); - } - try { - File f = resolveOutputPath((String) arguments.get(0)); - return f.exists() - ? TemplateBooleanModel.TRUE - : TemplateBooleanModel.FALSE; - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to check if the file exists", exc); - } - } - } - - private class UrlEncodeMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "urlEncode needs 1 argument"); - } - try { - return new SimpleScalar( - StringUtil.urlEnc( - (String) arguments.get(0), - getCurrentUrlEncodingCharset())); - } catch (IOException exc) { - throw new TemplateModelException( - "URL encoding failed", exc); - } - } - } - - private class UrlPathEncodeMethod implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "urlEncode needs 1 argument"); - } - try { - String s = (String) arguments.get(0); - s = s.replace('\\', '/'); - s = s.replace(File.separatorChar, '/'); - return new SimpleScalar( - StringUtil.urlPathEnc( - s, - getCurrentUrlEncodingCharset())); - } catch (IOException exc) { - throw new TemplateModelException( - "URL path encoding failed", exc); - } - } - } - - private class ToSourceRootRelativePathMethod - implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "sourceRootRelativePath needs 1 argument"); - } - try { - return new SimpleScalar( - toSourceRootRelativePath( - (String) arguments.get(0))); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to transform path " + StringUtil.jQuote((String) arguments.get(0)) - + " to source-root relative.", - exc); - } - } - } - - private class ToOutputRootRelativePathMethod - implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "outputRootRelativePath needs 1 argument"); - } - try { - return new SimpleScalar( - toOutputRelatitvePath( - (String) arguments.get(0))); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to transform path " + StringUtil.jQuote((String) arguments.get(0)) - + " to output-root relative.", - exc); - } - } - } - - private class PathToSourceMethod - implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "pathToSource needs 1 argument"); - } - try { - return new SimpleScalar( - getSourcePathTo( - (String) arguments.get(0))); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to transform path " + StringUtil.jQuote((String) arguments.get(0)) - + " to source file relative.", - exc); - } - } - } - - private class PathToMethod - implements TemplateMethodModel { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() != 1) { - throw new TemplateModelException( - "pathTo needs 1 argument"); - } - try { - return new SimpleScalar( - getPathTo( - (String) arguments.get(0))); - } catch (IOException exc) { - throw new TemplateModelException( - "Failed to transform path " + StringUtil.jQuote((String) arguments.get(0)) - + " to output file relative.", - exc); - } - } - } - - private abstract class LiveScalar implements TemplateMethodModelEx { - abstract String getName(); - - abstract TemplateModel getValue() throws IOException; - - public Object exec(List args) - throws TemplateModelException { - if (args.size() != 0) { - throw new TemplateModelException( - getFullName() + " does not support parameters."); - } - try { - return getValue(); - } catch (IOException exc) { - throw new TemplateModelException( - getFullName() + " failed", exc); - } - } - - private String getFullName() { - return "pp.get" + getName().substring(0, 1).toUpperCase() - + getName().substring(1) + "()"; - } - - } - - private abstract class LiveString extends LiveScalar { - TemplateModel getValue() throws IOException { - return new SimpleScalar(getStringValue()); - } - - abstract String getStringValue() throws IOException; - } - - private class OutputEncodingMethod extends LiveString { - - String getName() { - return "outputEncoding"; - } - - String getStringValue() { - return outputWriter.getOutputEncoding(); - } - } - - private class RealOutputMethod extends LiveString { - - String getName() { - return "realOutput"; - } - - String getStringValue() throws IOException { - return outputWriter.getOutputFile().getCanonicalPath(); - } - } - - private class OutputFileMethod extends LiveString { - - String getName() { - return "outputFile"; - } - - String getStringValue() throws IOException { - return FileUtil.pathToUnixStyle(FileUtil.getRelativePath( - eng.getOutputRoot(), outputWriter.getOutputFile())); - } - } - - private class RealOutputDirectoryMethod extends LiveString { - - String getName() { - return "realOutputDirectory"; - } - - String getStringValue() throws IOException { - return fixedDirPath(outputWriter.getOutputFile().getParentFile()); - } - } - - private class OutputDirectoryMethod extends LiveString { - - String getName() { - return "outputDirectory"; - } - - String getStringValue() throws IOException { - return FileUtil.pathToUnixStyle( - fixedDirPath(FileUtil.getRelativePath( - eng.getOutputRoot(), - outputWriter.getOutputFile().getParentFile()))); - } - } - - private class OutputFileNameMethod extends LiveString { - - String getName() { - return "outputFile"; - } - - String getStringValue() { - return outputWriter.getOutputFile().getName(); - } - } - - private class HomeScalar extends LiveString { - - String getName() { - return "home"; - } - - String getStringValue() throws IOException { - return getHomePath(); - } - } - - private class NowScalar extends LiveScalar { - - String getName() { - return "now"; - } - - TemplateModel getValue() { - return new SimpleDate(new Date(), TemplateDateModel.DATETIME); - } - } - - private class DocScalar extends LiveScalar { - - String getName() { - return "doc"; - } - - TemplateModel getValue() { - return wrappedXmlDocument; - } - } - - private class LocaleMethod extends LiveString { - - String getName() { - return "locale"; - } - - String getStringValue() { - return Environment.getCurrentEnvironment().getLocale().toString(); - } - } - - private class LoadDataMethod - implements TemplateMethodModelEx { - public Object exec(List args) - throws TemplateModelException { - int ln = args.size(); - if (ln < 1) { - throw new TemplateModelException( - "loadData needs at least 1 argument"); - } - Object o = args.get(0); - if (!(o instanceof TemplateScalarModel)) { - throw new TemplateModelException( - "The first argument to loadData must be a string"); - } - List args2 = new ArrayList(ln - 1); - for (int i = 1; i < ln; i++) { - args2.add(FreemarkerUtil.ftlVarToCoreJavaObject( - (TemplateModel) args.get(i))); - } - String dlName = ((TemplateScalarModel) o).getAsString(); - DataLoader dl; - try { - dl = fmpp.tdd.TddUtil.getDataLoaderInstance(eng, dlName); - } catch (EvalException e) { - throw new TemplateModelException( - "Failed to get data loader.", e); - } - try { - return eng.wrap(dl.load(eng, args2)); - } catch (Exception exc) { - throw new TemplateModelException( - "Error runing data loader " + StringUtil.jQuote(dlName) - + ".", - exc); - } - } - } -} diff --git a/fmpp/src/main/java/fmpp/XmlRenderingConfiguration.java b/fmpp/src/main/java/fmpp/XmlRenderingConfiguration.java deleted file mode 100644 index 1985379..0000000 --- a/fmpp/src/main/java/fmpp/XmlRenderingConfiguration.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import fmpp.util.FileUtil; -import fmpp.util.StringUtil; - -/** - * Stores options that describe when and how to process an XML file in - * "renderXml" processing mode. - * - *

    Do not change this object after you have added it to the - * {@link fmpp.Engine}. It's in principle - * an immutable object, but to prevent too many constructor parameters and - * later backward compatibility problems, you have to specify the options with - * setter methods, rather than with constructor arguments. - * - *

    You must set a non-null template or set - * copy to true. All other options are optional. - */ -public class XmlRenderingConfiguration { - private String template; - private boolean copy; - private List pathPatterns = new ArrayList(); - private List documentElementLocalNames = new ArrayList(); - private List documentElementNamespaces = new ArrayList(); - private List localDataBuilders = new ArrayList(); - private Map xmlDataLoaderOptions = new HashMap(); - - // ------------------------------------------------------------------------- - // Constructors - - /** - * Creates new object. - */ - public XmlRenderingConfiguration() { - } - - // ------------------------------------------------------------------------- - // Public interface - - /** - * Sets the renderer template. - * - * @param template the source path of the template used for the - * rendering of the XML file. Can't be null. - */ - public void setTemplate(String template) { - if (template != null) { - template = FileUtil.pathToUnixStyle(template); - if (template.startsWith("/")) { - template = template.substring(1); - } - this.template = template; - } - } - - /** - * Sets if the XML file should be copied as is, or renderd with a template. - * If the value of this option is true, then the value of the - * template option is insignificant. - */ - public void setCopy(boolean copy) { - this.copy = copy; - } - - /** - * Adds an element to the list of document elements. The XML file will not - * be processed according this configuration object if this list - * doesn't contain the document element of the XML file. - * If the list is empty, then this criteria will not be considered - * (accepts XML documents regardels of their document element). - * - * @param xmlns the name-space URL of the element. This should be - * null or 0-length stirng if the element doesn't belong to - * any XML name-space. - * @param localName the local (name-space preixless) name of the element. - */ - public void addDocumentElement(String xmlns, String localName) { - documentElementNamespaces.add(xmlns); - documentElementLocalNames.add(localName); - } - - /** - * Empties the document element list. - * @see #addDocumentElement(String, String) - */ - public void clearDocumentElements() { - documentElementNamespaces.clear(); - documentElementLocalNames.clear(); - } - - /** - * Adds an extra local data builder that is invoked after all other - * local data builders. The task of this builder is to do the - * complex or resource eager parts of the XML processing that you don't - * want to do in FTL, and expose the results as local data. - * - *

    The data loaders added earlier will be executed earlier. The data - * loader executed later can replace earlier added local data variables. - */ - public void addLocalDataBuilder(LocalDataBuilder localDataBuilder) { - localDataBuilders.add(localDataBuilder); - } - - /** - * Removes all local data builders. - * - * @see #addLocalDataBuilder(LocalDataBuilder) - */ - public void clearLocalDataBuilders() { - localDataBuilders.clear(); - } - - /** - * Adds a path to the list of source path patterns. The XML file will not be - * processed according this configuration object if no path - * in this list matches the source root relative path of the XML file. - * If the list is empty, then this criteria will not be considered - * (accepts XML documents regardels of their source file path). - * - * @param pathPattern the path pattern of the source root relative path of - * the XML file. It doesn't mater if it starts with / or not. - */ - public void addSourcePathPattern(String pathPattern) { - this.pathPatterns.add(pathPattern); - } - - /** - * Empties the list of source path patterns. - * @see #addSourcePathPattern(String) - */ - public void clearSourcePathPatterns() { - pathPatterns.clear(); - } - - /** - * Adds or replaces an option in the map of xml data loader - * options. - * The set of valid values are specified by the xml data loader - * (see in the FMPP Manual), and they will not be validated until the data - * loader is actually invoked, so when the processing of the XML file - * starts. The only exception from this rule is the - * "namespaceAware" option, for which false - * value is not allowed. - * - * @param name the name of the option. Option "namespaceAware" - * is not allowed. - * @param value the value of the option - */ - public void addXmlDataLoaderOption(String name, Object value) { - if (name.equals("namespaceAware") && Boolean.FALSE.equals(value)) { - throw new IllegalArgumentException("It's not allowed to set the " - + "\"namespaceAware\" option to false."); - } - xmlDataLoaderOptions.put(name, value); - } - - /** - * Removes all xml data loader options. - */ - public void clearXmlDataLoaderOptions() { - xmlDataLoaderOptions.clear(); - } - - public String toString() { - StringBuffer sb = new StringBuffer(128); - - sb.append("xmlRendering{"); - sb.append("template="); - sb.append(template); - sb.append(", ifSourceIs="); - sb.append(pathPatterns); - sb.append(", ifDocumentElementIs=["); - for (int i = 0; i < documentElementLocalNames.size(); i++) { - if (i != 0) { - sb.append(", "); - } - if (documentElementNamespaces.get(i) != null) { - sb.append(StringUtil.jQuote( - (String) documentElementNamespaces.get(i))); - sb.append(":"); - } - sb.append(documentElementLocalNames.get(i)); - } - sb.append("], localDataBuilder="); - sb.append(localDataBuilders); - sb.append(", xmlDataLoaderOptions="); - sb.append(xmlDataLoaderOptions); - sb.append("}"); - - return sb.toString(); - } - - // ------------------------------------------------------------------------- - // Package interface - - String getTemplatePath() { - return template; - } - - boolean getCopy() { - return copy; - } - - List getPathPatterns() { - return pathPatterns; - } - - List getDocumentElementLocalNames() { - return documentElementLocalNames; - } - - List getDocumentElementNamespaces() { - return documentElementNamespaces; - } - - Map getXmlDataLoaderOptions() { - return xmlDataLoaderOptions; - } - - List getLocalDataBuilders() { - return localDataBuilders; - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/AbstractTextDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AbstractTextDataLoader.java deleted file mode 100644 index d4a36b2..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AbstractTextDataLoader.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.List; - -/** - * Returns a string based on a plain text file. - */ -public abstract class AbstractTextDataLoader extends FileDataLoader { - - protected final Object load(InputStream data) throws Exception { - String encoding; - - encoding = parseExtraArguments(args); - if (encoding == null) { - encoding = engine.getSourceEncoding(); - } - - StringBuffer sb = new StringBuffer(1024); - Reader r = new InputStreamReader(data, encoding); - char[] buffer = new char[4096]; - int i; - while ((i = r.read(buffer)) != -1) { - sb.append(buffer, 0, i); - } - - String s = sb.toString(); - - // Remove Windows Notepad BOM: - if (s.startsWith("\uFEFF")) { - s = s.substring(1); - } - - return parseText(s); - } - - /** - * Parses the file content to the final object that the data loader - * will return. - * - * @param text the content of the text file - * @return the return value of the data loader - */ - protected abstract Object parseText(String text) throws Exception; - - /** - * Parses the argument list, except the 1st (file name) argument. - * @param args the arguments (all of them, starting from the 1st) - * @return the encoding given with the extra arguments, or - * null if the encoding was not specified. In the latest - * case the encoding will default to the source encoding engine - * parameter (the sourceEncoding setting). - */ - protected abstract String parseExtraArguments(List args) throws Exception; - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/AntDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AntDataLoader.java deleted file mode 100644 index 2b2e905..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AntDataLoader.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.List; - -import org.apache.tools.ant.Task; - -import fmpp.Engine; -import fmpp.tdd.DataLoader; -import fmpp.util.RuntimeExceptionCC; - -/** - * Abstract base class of Ant related data loaders. - */ -public abstract class AntDataLoader implements DataLoader { - /** - * The name of the {@link Engine} attribute that must store the Ant task - * object. - */ - public static final String ATTRIBUTE_ANT_TASK = "fmpp.ant.task"; - - /** - * Gets the Ant task object, and invoked {@link #load(Engine, List, Task)}. - */ - public Object load(Engine eng, List args) throws Exception { - Task task = (Task) eng.getAttribute(ATTRIBUTE_ANT_TASK); - if (task == null) { - throw new RuntimeExceptionCC( - "Ant environment not available: " + ATTRIBUTE_ANT_TASK - + " Engine attribute is not set."); - } - - return load(eng, args, task); - } - - /** - * Override this method to implement your Ant related data loader. - */ - protected abstract Object load(Engine eng, List args, Task task) - throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/AntProjectDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AntProjectDataLoader.java deleted file mode 100644 index 666037f..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AntProjectDataLoader.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.List; - -import org.apache.tools.ant.Task; - -import fmpp.Engine; - -/** - * Returns the Ant project object. - */ -public class AntProjectDataLoader extends AntDataLoader { - - public Object load(Engine eng, List args, Task task) { - if (args.size() != 0) { - throw new IllegalArgumentException( - "antProject data loader has no parameters"); - } - - return task.getProject(); - } -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/AntPropertiesDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AntPropertiesDataLoader.java deleted file mode 100644 index 34221c4..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AntPropertiesDataLoader.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; - -import fmpp.Engine; -import fmpp.util.BugException; -import fmpp.util.StringUtil; -import fmpp.util.StringUtil.ParseException; - -/** - * Returns the Map of all Ant properties, or of the selected Ant properties. - */ -public class AntPropertiesDataLoader extends AntDataLoader { - - public Object load(Engine eng, List args, Task task) throws ParseException { - Project proj = task.getProject(); - - if (args.size() == 0) { - return proj.getProperties(); - } else { - Map exposedProps = new HashMap(); - - for (int i = 0; i < args.size(); i++) { - Object o = args.get(i); - if (!(o instanceof String)) { - throw new IllegalArgumentException( - "The parameters of antProperites data loader must " - + "be all strings; the names of the Ant properties " + "to expose."); - } - String name = (String) o; - int type = 0; - if (name.endsWith("?n")) { - type = 1; - } else if (name.endsWith("?b")) { - type = 2; - } else if (name.endsWith("?d")) { - type = 3; - } else if (name.endsWith("?t")) { - type = 4; - } else if (name.endsWith("?dt")) { - type = 5; - } else if (name.endsWith("?s")) { - type = 6; - } - if (type != 0) { - name = name.substring(0, name.lastIndexOf('?')); - } - - String value = proj.getProperty(name); - Object xValue; - if (value != null) { - if (type == 0 || type == 6) { - xValue = value; - } else if (type == 1) { - try { - xValue = StringUtil.stringToBigDecimal(value); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException( - "The value of property " - + StringUtil.jQuote(name) + " is invalid.", - e); - } - } else if (type == 2) { - try { - xValue = StringUtil.stringToBoolean(value) - ? Boolean.TRUE : Boolean.FALSE; - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException( - "The value of property " - + StringUtil.jQuote(name) + " is invalid.", - e); - } - } else if (type == 3) { - try { - xValue = StringUtil.stringToDate( - value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException( - "The value of property " - + StringUtil.jQuote(name) + " is invalid.", - e); - } - } else if (type == 4) { - try { - xValue = StringUtil.stringToTime( - value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException( - "The value of property " - + StringUtil.jQuote(name) + " is invalid.", - e); - } - } else if (type == 5) { - try { - xValue = StringUtil.stringToDateTime( - value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException( - "The value of property " - + StringUtil.jQuote(name) + " is invalid.", - e); - } - } else { - throw new BugException("Unknown type " + type); - } - exposedProps.put(name, xValue); - } // if value not null - } // for - - return exposedProps; - } - } -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/AntPropertyDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AntPropertyDataLoader.java deleted file mode 100644 index ddf724d..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AntPropertyDataLoader.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.List; - -import org.apache.tools.ant.Task; - -import fmpp.Engine; -import fmpp.util.BugException; -import fmpp.util.StringUtil; -import fmpp.util.StringUtil.ParseException; - -/** - * Returns the value of an Ant property. - */ -public class AntPropertyDataLoader extends AntDataLoader { - - public Object load(Engine eng, List args, Task task) throws ParseException { - int argCount = args.size(); - if (argCount < 1 || argCount > 2) { - throw new IllegalArgumentException( - "antProperty(propertyName[, defaultValue]) needs 1 or 2 " + "parameters."); - } - Object obj = args.get(0); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The first parameter to antProperty(propertyName[, " + "defaultValue]) must be a string."); - } - - int type = 0; - String name = (String) obj; - if (name.endsWith("?n")) { - type = 1; - } else if (name.endsWith("?b")) { - type = 2; - } else if (name.endsWith("?d")) { - type = 3; - } else if (name.endsWith("?t")) { - type = 4; - } else if (name.endsWith("?dt")) { - type = 5; - } else if (name.endsWith("?s")) { - type = 6; - } - if (type != 0) { - name = name.substring(0, name.lastIndexOf('?')); - } - - String value = task.getProject().getProperty(name); - if (value == null) { - if (argCount > 1) { - return args.get(1); - } - return null; - } else { - if (type == 0 || type == 6) { - return value; - } else if (type == 1) { - try { - return StringUtil.stringToBigDecimal(value); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException("The value of property " - + StringUtil.jQuote(name) + " is invalid.", e); - } - } else if (type == 2) { - try { - return StringUtil.stringToBoolean(value) - ? Boolean.TRUE : Boolean.FALSE; - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException("The value of property " - + StringUtil.jQuote(name) + " is invalid.", e); - } - } else if (type == 3) { - try { - return StringUtil.stringToDate(value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException("The value of property " - + StringUtil.jQuote(name) + " is invalid.", e); - } - } else if (type == 4) { - try { - return StringUtil.stringToTime(value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException("The value of property " - + StringUtil.jQuote(name) + " is invalid.", e); - } - } else if (type == 5) { - try { - return StringUtil.stringToDateTime( - value, eng.getTimeZone()); - } catch (StringUtil.ParseException e) { - throw new StringUtil.ParseException("The value of property " - + StringUtil.jQuote(name) + " is invalid.", e); - } - } else { - throw new BugException("Unknown type " + type); - } - } - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/AntTaskDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/AntTaskDataLoader.java deleted file mode 100644 index aa78b61..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/AntTaskDataLoader.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.List; - -import org.apache.tools.ant.Task; - -import fmpp.Engine; - -/** - * Returns the FMPP Ant task object. - */ -public class AntTaskDataLoader extends AntDataLoader { - - public Object load(Engine eng, List args, Task task) { - - if (args.size() != 0) { - throw new IllegalArgumentException( - "antTask data loader has no parameters"); - } - - return task; - } - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/CsvDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/CsvDataLoader.java deleted file mode 100644 index e76f66f..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/CsvDataLoader.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.Iterator; -import java.util.Map; - -import fmpp.models.CsvSequence; -import fmpp.util.DataLoaderUtil; -import fmpp.util.StringUtil; -import fmpp.util.StringUtil.ParseException; -import freemarker.template.TemplateModelException; - - -/** - * Data loaders that loads CSV (Column Separated Values) files or other files of - * similar formats (as tab divided text), and returns a - * {@link CsvSequence fmpp.models.CsvSequence} object. - * - *

    The format of the directive is: - * csv(filename, option), - * where option is a hash of options, such as - * {encoding:'ISO-8859-3', separator:','}. - * For the complete list of options please see the parameters of - * {@link fmpp.models.CsvSequence CsvSequence} constructors. - * - *

    Note: This class should be an - * {@link fmpp.dataloaders.AbstractTextDataLoader} subclass, but it is not that - * for backward compatibility. - */ -public class CsvDataLoader extends FileDataLoader { - - protected Object load(InputStream data) throws IOException, - TemplateModelException, ParseException { - String encoding = engine.getSourceEncoding(); - - if (args.size() < 1 || args.size() > 3) { - throw new IllegalArgumentException( - "csv data loader needs 1 or 2 arguments: " - + "csv(filename) or csv(filename, options)"); - } - Object obj; - CsvSequence csvs = new CsvSequence(); - if (args.size() > 1) { - Map options; - obj = args.get(1); - if (!(obj instanceof Map)) { - throw new IllegalArgumentException( - "The 2nd argument (options) must be a hash."); - } - boolean aHeaderOpWasUsed = false; - options = (Map) obj; - Iterator it = options.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String opname = (String) ent.getKey(); - if (opname.equals("headers")) { - if (aHeaderOpWasUsed) { - throw new IllegalArgumentException("Only one of the " - + "\"headers\" and \"replaceHeaders\" options " - + "can be used at once."); - } - csvs.setExternalHeaderRow( - DataLoaderUtil.getStringArrayOption( - opname, ent.getValue())); - csvs.setHasHeaderRow(false); - aHeaderOpWasUsed = true; - } else if (opname.equals("replaceHeaders")) { - if (aHeaderOpWasUsed) { - throw new IllegalArgumentException("Only one of the " - + "\"headers\" and \"replaceHeaders\" options " - + "can be used at once."); - } - csvs.setExternalHeaderRow( - DataLoaderUtil.getStringArrayOption( - opname, ent.getValue())); - csvs.setHasHeaderRow(true); - aHeaderOpWasUsed = true; - } else if (opname.equals("normalizeHeaders")) { - csvs.setNormalizeHeaders(DataLoaderUtil.getBooleanOption( - opname, ent.getValue())); - } else if (opname.equals("trimCells")) { - csvs.setTrimCells(DataLoaderUtil.getBooleanOption( - opname, ent.getValue())); - } else if (opname.equals("emptyValue")) { - csvs.setEmptyValues( - DataLoaderUtil.getStringArrayOption( - opname, ent.getValue(), true)); - } else if (opname.equals("separator")) { - csvs.setSeparator(DataLoaderUtil.getCharOption( - opname, ent.getValue())); - } else if (opname.equals("groupingSeparator")) { - csvs.setGroupingSeparator( - DataLoaderUtil.getCharOption( - opname, ent.getValue())); - } else if (opname.equals("decimalSeparator")) { - csvs.setDecimalSeparator( - DataLoaderUtil.getCharOption( - opname, ent.getValue())); - } else if (opname.equals(DataLoaderUtil.OPTION_NAME_ENCODING)) { - encoding = DataLoaderUtil.getStringOption( - opname, ent.getValue()); - } else if (opname.equals("altTrue")) { - csvs.setAltTrue(DataLoaderUtil.getStringOption( - opname, ent.getValue())); - } else if (opname.equals("altFalse")) { - csvs.setAltFalse(DataLoaderUtil.getStringOption( - opname, ent.getValue())); - } else if (opname.equals("dateFormat")) { - try { - csvs.setDateFormatPattern( - DataLoaderUtil.getStringOption( - opname, ent.getValue())); - } catch (IllegalArgumentException e) { - throw new ParseException( - "The value of option " - + StringUtil.jQuote(opname) + " is illegal.", - e); - } - } else if (opname.equals("timeFormat")) { - try { - csvs.setTimeFormatPattern( - DataLoaderUtil.getStringOption( - opname, ent.getValue())); - } catch (IllegalArgumentException e) { - throw new ParseException( - "The value of option " - + StringUtil.jQuote(opname) + " is illegal.", - e); - } - } else if (opname.equals("dateTimeFormat")) { - try { - csvs.setDateTimeFormatPattern( - DataLoaderUtil.getStringOption( - opname, ent.getValue())); - } catch (IllegalArgumentException e) { - throw new ParseException( - "The value of option " - + StringUtil.jQuote(opname) + " is illegal.", - e); - } - } else { - throw new IllegalArgumentException( - "Unknown option: " + StringUtil.jQuote(opname) - + ". The supported options are: " - + "encoding, separator, headers, replaceHeaders, " - + "normalizeHeaders, trimCells, emptyValue, " - + "groupingSeparator, decimalSeparator, altTrue, " - + "altFalse"); - } - } - } - csvs.setTimeZone(engine.getTimeZone()); - - Reader r = new BufferedReader(new InputStreamReader(data, encoding)); - - // Skipping BOM if present - r.mark(2); - char firstChar = (char) r.read(); - if (firstChar != 0xFEFF) { - r.reset(); - } - - csvs.load(r); - return csvs; - } - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/EvalDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/EvalDataLoader.java deleted file mode 100644 index 2415f9d..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/EvalDataLoader.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import bsh.Interpreter; -import fmpp.Engine; -import fmpp.tdd.DataLoader; - -/** - * Evaluates a BeanShell expression (looks like as Java). - * The scrip has access to the Engine object by the - * engine variable. - */ -public class EvalDataLoader implements DataLoader { - public Object load(Engine e, List args) throws Exception { - int ln = args.size(); - if (ln < 1 || ln > 2) { - throw new IllegalArgumentException( - "eval(script[, vars]) needs 1 or 2 arguments."); - } - String script; - Object o = args.get(0); - if (!(o instanceof String)) { - throw new IllegalArgumentException( - "The 1st parameter to eval(script[, vars])" + "must be a string, but it was a " - + fmpp.tdd.Interpreter.getTypeName(o) + "."); - } - script = (String) o; - - Interpreter intp = new Interpreter(); - intp.set("engine", e); - - if (ln > 1) { - o = args.get(1); - if (!(o instanceof Map)) { - throw new IllegalArgumentException( - "The 2nd parameter to eval(script[, vars])" - + "must be a hash, but it was a " - + fmpp.tdd.Interpreter.getTypeName(o) + "."); - } - Map vars = (Map) o; - Iterator it = vars.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - intp.set((String) ent.getKey(), ent.getValue()); - } - } - - return intp.eval(script); - } -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/FileDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/FileDataLoader.java deleted file mode 100644 index 89f8026..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/FileDataLoader.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.util.List; - -import fmpp.Engine; -import fmpp.tdd.DataLoader; - -/** - * Ancestor of data loaders that create the result based on a file. - * The first argument of the data loader will be the path of the file. - * If the path is a relative path, then it will be relative to the data root - * directory (an engine level setting), or if data root is null, then relative - * to the working directory (OS facility). The path can use slash (/) instead - * of the OS specific separator char. - */ -public abstract class FileDataLoader implements DataLoader { - - protected Engine engine; - protected List args; - protected File dataFile; - - public Object load(Engine engine, List args) throws Exception { - this.engine = engine; - this.args = args; - - if (args.size() < 1) { - throw new IllegalArgumentException( - "At least 1 argument (file name) needed"); - } - Object obj = args.get(0); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The 1st argument (file name) must be a string."); - } - String path = (String) obj; - path = path.replace('/', File.separatorChar); - - dataFile = new File(path); - if (!dataFile.isAbsolute()) { - dataFile = new File(engine.getDataRoot(), path); - } - - InputStream in = new FileInputStream(dataFile); - try { - return load(in); - } finally { - in.close(); - } - } - - /** - * FileDataLoader subclasess override this method to parse - * the file. - */ - protected abstract Object load(InputStream data) throws Exception; - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java deleted file mode 100644 index 3dcb613..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/HtmlUtilsDataLoader.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.io.Writer; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.devlib.schmidt.imageinfo.ImageInfo; - -import fmpp.Engine; -import fmpp.tdd.DataLoader; -import fmpp.util.StringUtil; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateTransformModel; - -/** - * Returns a hash that contains useful directives for HTML generation. - *

      - *
    • img: Same as HTML img, but automatically calculates the width and/or - * height attributes if they are missing. - *
    - */ -public class HtmlUtilsDataLoader implements DataLoader { - private boolean xHtml = false; - private String eTagClose; - - private Engine engine; - - private static final int MAX_CACHE_SIZE = 100; - private Map imageInfoCache = new HashMap(); - private CachedImageInfo first; - private CachedImageInfo last; - private ImageInfo imageInfo = new ImageInfo(); - - public Object load(Engine e, List args) throws Exception { - if (args.size() != 0) { - throw new IllegalArgumentException( - "data loader does not have arguments"); - } - engine = e; - if (xHtml) { - eTagClose = " />"; - } else { - eTagClose = ">"; - } - - Map map = new HashMap(); - - map.put("img", new ImgTransform()); - - return map; - } - - public void setXHtml(boolean xHtml) { - this.xHtml = xHtml; - } - - private CachedImageInfo getImageInfo(File f) - throws IOException, TemplateModelException { - String cacheKey = f.getCanonicalPath(); - - CachedImageInfo inf = (CachedImageInfo) imageInfoCache.get(cacheKey); - if (inf != null) { - long lmd = new File(cacheKey).lastModified(); - if (inf.lmd == lmd && lmd != 0L && inf.lmd != 0L) { - if (inf != last) { - if (inf.prev != null) { - inf.prev.next = inf.next; - } else { - first = inf.next; - } - if (inf.next != null) { - inf.next.prev = inf.prev; - } else { - last = inf.prev; - } - - inf.prev = last; - inf.next = null; - last = inf; - inf.prev.next = last; - } - return inf; //! - } else { - imageInfoCache.remove(cacheKey); - if (inf.prev != null) { - inf.prev.next = inf.next; - } else { - first = inf.next; - } - if (inf.next != null) { - inf.next.prev = inf.prev; - } else { - last = inf.prev; - } - } - } - - RandomAccessFile raf; - try { - raf = new RandomAccessFile(f, "r"); - } catch (FileNotFoundException e) { - throw new TemplateModelException("Image file not found: " + f.getAbsolutePath(), e); - } - try { - imageInfo.setCollectComments(false); - imageInfo.setInput(raf); - if (!imageInfo.check()) { - throw new TemplateModelException("Failed to analyse image file: " + cacheKey); - } - } finally { - raf.close(); - } - inf = new CachedImageInfo(); - inf.lmd = f.lastModified(); - inf.width = imageInfo.getWidth(); - inf.height = imageInfo.getHeight(); - inf.path = cacheKey; - if (last != null) { - last.next = inf; - } - inf.prev = last; - inf.next = null; - last = inf; - if (inf.prev == null) { - first = inf; - } - imageInfoCache.put(cacheKey, inf); - if (imageInfoCache.size() > MAX_CACHE_SIZE) { - imageInfoCache.remove(first.path); - first.next.prev = null; - first = first.next; - } - - return inf; - } - - private class CachedImageInfo { - private CachedImageInfo prev; - private CachedImageInfo next; - private String path; - private long lmd; - private int width; - private int height; - } - - private class ImgTransform implements TemplateTransformModel { - public Writer getWriter(Writer out, Map args) - throws TemplateModelException, IOException { - boolean detectHeight = true; - boolean detectWidth = true; - String src = null; - - out.write("{ "a": 1, "b": 2 }), an array, or even just a string, number, boolean or - * {@code null}. - */ -public class JSONDataLoader extends FileDataLoader { - - protected Object load(InputStream in) throws Exception { - - if (args.size() < 1 || args.size() > 2) { - throw new IllegalArgumentException( - "json data loader needs 1 or 2 arguments: json(filename) or json(filename, charset)"); - } - - final String charset; - if (args.size() > 1) { - final Object arg = args.get(1); - if (!(arg instanceof String)) { - throw new IllegalArgumentException("The 2nd argument (charset) must be a string."); - } - charset = (String) arg; - } else { - charset = engine.getSourceEncoding(); - } - - String src = FileUtil.loadString(in, charset); - - Object jsonPOJO = JSONParser.parse(src, dataFile.getAbsolutePath()); - - return finalizeResult(jsonPOJO); - } - - /** - * Converts the POJO created from the JSON to its final form. - */ - protected Object finalizeResult(Object jsonPOJO) throws Exception { - return JSONNode.wrap(jsonPOJO); - } - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/NowDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/NowDataLoader.java deleted file mode 100644 index a049f13..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/NowDataLoader.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import fmpp.Engine; -import fmpp.tdd.DataLoader; -import fmpp.util.StringUtil; - -/** - * Data loader that produces string from the current date. - * It is maybe better to use pp.sessionStart or - * pp.now instead of this data loader. - * - *

    The format of the directive is: - * now(options), where options is a hash as: - * {pattern:"yyyy-MM-dd HH:mm:ss"} or - * {date:short, time:long, zone:"GMT+0"}. - */ -public class NowDataLoader implements DataLoader { - public Object load(Engine engine, List args) throws Exception { - String pattern = null; - boolean dateTypeSet = false; - int dateType = 0; - boolean timeTypeSet = false; - int timeType = 0; - TimeZone zone = engine.getTimeZone(); - Locale locale = engine.getLocale(); - - if (args.size() > 0) { - if (args.size() != 1) { - throw new IllegalArgumentException( - "nowString data loader needs 0 or 1 arguments."); - } - if (!(args.get(0) instanceof Map)) { - throw new IllegalArgumentException( - "The argument of nowString data loader must be a hash."); - } - Map ops = (Map) args.get(0); - Iterator it = ops.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String opname = (String) e.getKey(); - String opvalue; - if (opname.equals("locale")) { - opvalue = strOp(opname, e.getValue()); - String codes[] = StringUtil.split(opvalue + "__", '_'); - locale = new Locale(codes[0], codes[1], codes[2]); - } else if (opname.equals("date")) { - opvalue = strOp("date", e.getValue()); - dateTypeSet = true; - if (opvalue.equalsIgnoreCase("short")) { - dateType = DateFormat.SHORT; - } else if (opvalue.equalsIgnoreCase("medium")) { - dateType = DateFormat.MEDIUM; - } else if (opvalue.equalsIgnoreCase("long")) { - dateType = DateFormat.LONG; - } else if (opvalue.equalsIgnoreCase("default")) { - dateType = DateFormat.DEFAULT; - } else { - throw new IllegalArgumentException( - "Illegal value for the date option: " - + StringUtil.jQuote(opvalue) + ". " - + "Valid values are: " + "short, medium, long, default"); - } - } else if (opname.equals("time")) { - opvalue = strOp(opname, e.getValue()); - timeTypeSet = true; - if (opvalue.equalsIgnoreCase("short")) { - timeType = DateFormat.SHORT; - } else if (opvalue.equalsIgnoreCase("medium")) { - timeType = DateFormat.MEDIUM; - } else if (opvalue.equalsIgnoreCase("long")) { - timeType = DateFormat.LONG; - } else if (opvalue.equalsIgnoreCase("default")) { - timeType = DateFormat.DEFAULT; - } else { - throw new IllegalArgumentException( - "Illegal value for the time option: " - + StringUtil.jQuote(opvalue) + ". " - + "Valid values are: " - + "short, medium, long, default"); - } - } else if (opname.equals("pattern")) { - pattern = strOp(opname, e.getValue()); - } else if (opname.equals("zone")) { - opvalue = strOp(opname, e.getValue()); - zone = TimeZone.getTimeZone(opvalue); - } else { - throw new IllegalArgumentException( - "Unknown option: " + StringUtil.jQuote(opname) - + ". The supported options are: " - + "locale, date, time, pattern, zone"); - } - } - } - - DateFormat sdf; - if (pattern != null) { - if (dateTypeSet || timeTypeSet) { - throw new IllegalArgumentException( - "You can't use the the date/time options together " - + "with the pattern option."); - } - sdf = new SimpleDateFormat(pattern, locale); - } else { - if (dateTypeSet) { - if (timeTypeSet) { - sdf = DateFormat.getDateTimeInstance( - dateType, timeType, locale); - } else { - sdf = DateFormat.getDateInstance(dateType, locale); - } - } else if (timeTypeSet) { - sdf = DateFormat.getTimeInstance(dateType, locale); - } else { - sdf = DateFormat.getDateTimeInstance( - DateFormat.SHORT, DateFormat.SHORT, locale); - } - } - if (zone != null) { - sdf.setTimeZone(zone); - } - - return sdf.format(new Date()); - } - - private static String strOp(String name, Object value) { - if (value instanceof String) { - return (String) value; - } else { - throw new IllegalArgumentException("The value of " + name - + "option must be a string."); - } - } -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/PropertiesDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/PropertiesDataLoader.java deleted file mode 100644 index a1fdfee..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/PropertiesDataLoader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * Returns a Map based on a Java properties file. - */ -public class PropertiesDataLoader extends FileDataLoader { - protected Object load(InputStream data) throws IOException { - if (args.size() != 1) { - throw new IllegalArgumentException( - "Properties data loader needs exaclty 1 argument: " - + "properties(filename)"); - } - - Properties ps = new Properties(); - ps.load(data); - return ps; - } - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/SlicedTextDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/SlicedTextDataLoader.java deleted file mode 100644 index 172e5a5..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/SlicedTextDataLoader.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import fmpp.util.DataLoaderUtil; -import fmpp.util.StringUtil; - -/** - * Returns a sequence of strings based on a plain text file, where the specified - * symbol is used as separator. For more information please read the FMPP - * Manual. - */ -public class SlicedTextDataLoader extends AbstractTextDataLoader { - - private String separator; - private boolean trim = false; - private boolean dropEmptyLastItem = true; - - protected final Object parseText(String text) throws Exception { - ArrayList res = new ArrayList(100); - int ln = text.length(); - String separator = this.separator; - int sl = separator.length(); - int b = 0; - int e = 0; - boolean hasMore = true; - do { - int si; - int ti = e; - if (e < ln) { - // This part examines if the text starts with the separator - // starting from text index e. If not, si will be less than sl, - // otherwise ti will point the next character after the - // separator. - // { - si = 0; - startsWith: while (si < sl) { - char sc = separator.charAt(si); - if (ti < ln) { - if (sc == 0xA) { - char c = text.charAt(ti); - if (c == 0xA) { - si++; - ti++; - } else if (c == 0xD) { - si++; - ti++; - if (ti < ln && text.charAt(ti) == 0xA) { - ti++; - } - } else if (si != 0 && (c == 0x20 || c == 0x9)) { - ti++; - } else { - break startsWith; - } - } else if (sc == text.charAt(ti)) { - si++; - ti++; - } else { - break startsWith; - } - } else { - break startsWith; - } - } - // } - } else { - // when e == ln: The end of text is an implicit separator - si = sl; - ti = ln; - hasMore = false; - } - - if (si == sl) { - String item; - if (!trim) { - item = text.substring(b, e); - } else { - int e2 = e - 1; - while (e2 >= 0 && Character.isWhitespace(text.charAt(e2))) { - e2--; - } - e2++; - while (b < ln && Character.isWhitespace(text.charAt(b))) { - b++; - } - if (b < e) { - item = text.substring(b, e2); - } else { - item = ""; - } - } - res.add(item); - - b = ti; - e = b; - } else { - e++; - } - } while (hasMore); - - if (dropEmptyLastItem) { - if (((String) res.get(res.size() - 1)).length() == 0) { - res.remove(res.size() - 1); - } - } - - return postProcessItems(res); - } - - /** - * Override this if you want to post-process the items. - * - * @param items the list of String-s that the standard - * slicedText data loader would return. - * - * @return the final return value of the custom data loader. - */ - protected List postProcessItems(List items) { - return items; - } - - protected final String parseExtraArguments(List args) throws Exception { - String encoding = null; - Object obj; - if (args.size() > 1) { - Map options; - obj = args.get(1); - if (!(obj instanceof Map)) { - throw new IllegalArgumentException( - "The 2nd argument (options) must be a hash."); - } - options = (Map) obj; - Iterator it = options.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String opname = (String) ent.getKey(); - Object opvalue = ent.getValue(); - if (opname.equals("separator")) { - separator = StringUtil.normalizeLinebreaks( - DataLoaderUtil.getStringOption( - opname, opvalue)); - if (separator.length() == 0) { - throw new IllegalArgumentException( - "The value of the " + StringUtil.jQuote(opname) - + "option can't be 0 length string."); - } - } else if (opname.equals("encoding")) { - encoding = DataLoaderUtil.getStringOption( - opname, opvalue); - } else if (opname.equals("trim")) { - trim = DataLoaderUtil.getBooleanOption( - opname, opvalue); - } else if (opname.equals("dropEmptyLastItem")) { - dropEmptyLastItem = DataLoaderUtil.getBooleanOption( - opname, opvalue); - } else { - throw new IllegalArgumentException( - "Unknown option: " + StringUtil.jQuote(opname) - + ". The supported options are: " - + "encoding, separator, trim, " - + "dropEmptyLastItem"); - } - } - } - - if (separator == null) { - separator = "\n"; - } - - return encoding; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/TddDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/TddDataLoader.java deleted file mode 100644 index 66f8476..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/TddDataLoader.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.InputStream; - -import fmpp.tdd.DataLoaderEvaluationEnvironment; -import fmpp.tdd.Interpreter; - -/** - * Creates a Map based on a TDD file. The TDD file must contain a hash - * or a hash addition such as:
    - * foo:123, bar:456, properties(baaz.properties) - */ -public class TddDataLoader extends FileDataLoader { - - protected Object load(InputStream data) throws Exception { - String encoding; - - if (args.size() < 1 || args.size() > 2) { - throw new IllegalArgumentException( - "tdd data loader needs 1 or 2 arguments: " - + "tdd(filename) or tdd(filename, encoding)"); - } - Object obj; - if (args.size() > 1) { - obj = args.get(1); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The 2nd argument (encoding) must be a strings."); - } - encoding = (String) obj; - } else { - encoding = engine.getSourceEncoding(); - } - - return Interpreter.evalAsHash( - Interpreter.loadTdd(data, encoding), - new DataLoaderEvaluationEnvironment(engine), - false, dataFile.getAbsolutePath()); - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/TddSequenceDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/TddSequenceDataLoader.java deleted file mode 100644 index af0eaf8..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/TddSequenceDataLoader.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.InputStream; - -import fmpp.tdd.DataLoaderEvaluationEnvironment; -import fmpp.tdd.Interpreter; - -/** - * Creates a List based on a TDD file. The TDD file must contain a - * TDD sequence such as:
    - * "Big Joe", 1, [11, 22, 33], properties(foo.properties) - */ -public class TddSequenceDataLoader extends FileDataLoader { - - protected Object load(InputStream data) throws Exception { - String encoding; - - if (args.size() < 1 || args.size() > 2) { - throw new IllegalArgumentException( - "tddSequence data loader needs 1 or 2 arguments: " - + "tddSequence(filename) or " - + "tddSequence(filename, encoding)"); - } - Object obj; - if (args.size() > 1) { - obj = args.get(1); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The 2nd argument (encoding) must be a strings."); - } - encoding = (String) obj; - } else { - encoding = engine.getSourceEncoding(); - } - - return Interpreter.evalAsSequence( - Interpreter.loadTdd(data, encoding), - new DataLoaderEvaluationEnvironment(engine), - false, dataFile.getAbsolutePath()); - } - -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/TextDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/TextDataLoader.java deleted file mode 100644 index ccbe700..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/TextDataLoader.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringWriter; - -/** - * Returns a string based on a plain text file. - * - *

    Note: This class should be an - * {@link fmpp.dataloaders.AbstractTextDataLoader} subclass, but it is not that - * for backward compatibility. - */ -public class TextDataLoader extends FileDataLoader { - - protected Object load(InputStream data) throws Exception { - String encoding; - - if (args.size() < 1 || args.size() > 2) { - throw new IllegalArgumentException( - "text data loader needs 1 or 2 arguments: " - + "text(filename) or text(filename, encoding)"); - } - Object obj; - if (args.size() > 1) { - obj = args.get(1); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The 2nd argument (encoding) must be a strings."); - } - encoding = (String) obj; - } else { - encoding = engine.getSourceEncoding(); - } - - StringWriter w = new StringWriter(); - Reader r = new InputStreamReader(data, encoding); - char[] buffer = new char[4096]; - int i; - while ((i = r.read(buffer)) != -1) { - w.write(buffer, 0, i); - } - - String s = w.toString(); - - // Remove Windows Notepad BOM: - if (s.startsWith("\uFEFF")) { - s = s.substring(1); - } - - return s; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/XmlDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/XmlDataLoader.java deleted file mode 100644 index aa9c409..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/XmlDataLoader.java +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -import fmpp.Engine; -import fmpp.tdd.DataLoader; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; -import freemarker.ext.dom.NodeModel; -import freemarker.template.TemplateNodeModel; - -/** - * Returns a variable that exposes the content of an XML file. - */ -public class XmlDataLoader implements DataLoader { - public static final String OPTION_REMOVE_COMMENTS = "removeComments"; - public static final String OPTION_REMOVE_PIS = "removePIs"; - public static final String OPTION_NAMESPACE_AWARE = "namespaceAware"; - public static final String OPTION_XINCLUDE_AWARE = "xincludeAware"; - public static final String OPTION_VALIDATE = "validate"; - public static final String OPTION_INDEX = "index"; - public static final String OPTION_XMLNS = "xmlns"; - - private static final Set OPTION_NAMES = new HashSet(); - static { - OPTION_NAMES.add(OPTION_REMOVE_COMMENTS); - OPTION_NAMES.add(OPTION_REMOVE_PIS); - OPTION_NAMES.add(OPTION_NAMESPACE_AWARE); - OPTION_NAMES.add(OPTION_XINCLUDE_AWARE); - OPTION_NAMES.add(OPTION_VALIDATE); - OPTION_NAMES.add(OPTION_INDEX); - OPTION_NAMES.add(OPTION_XMLNS); - } - - public Object load(Engine engine, List args) throws Exception { - return load(engine, args, null); - } - - public TemplateNodeModel - load(Engine engine, List args, Document preLoadedDoc) - throws Exception { - Object obj; - String path; - boolean removePIs = false; - boolean removeComments = true; - boolean namespaceAware = true; - boolean xincludeAware = false; - boolean validate = engine.getValidateXml(); - Map xmlns = new HashMap(); - Object indexOp = null; - - int argCount = args.size(); - if (argCount < 1) { - throw new IllegalArgumentException( - "xml(fileName[, options]) needs at least 1 parameter."); - } - - if (preLoadedDoc == null) { - obj = args.get(0); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The 1st argument (fileName) must be a string."); - } - path = ((String) obj).replace('/', File.separatorChar); - } else { - path = null; - } - - if (argCount > 1) { - obj = args.get(1); - if (!(obj instanceof Map)) { - throw new IllegalArgumentException( - "The 2nd argument (options) must be a hash."); - } - Iterator ops = ((Map) obj).entrySet().iterator(); - while (ops.hasNext()) { - Map.Entry ent = (Map.Entry) ops.next(); - String opName = (String) ent.getKey(); - Object opValue = ent.getValue(); - if (OPTION_REMOVE_COMMENTS.equals(opName)) { - if (!(opValue instanceof Boolean)) { - throw new IllegalArgumentException( - "The value of option \"removeComments\" " - + "must be a boolean."); - } - removeComments = ((Boolean) opValue).booleanValue(); - } else if (OPTION_REMOVE_PIS.equals(opName)) { - if (!(opValue instanceof Boolean)) { - throw new IllegalArgumentException( - "The value of option \"removePIs\" " - + "must be a boolean."); - } - removePIs = ((Boolean) opValue).booleanValue(); - } else if (OPTION_NAMESPACE_AWARE.equals(opName)) { - if (!(opValue instanceof Boolean)) { - throw new IllegalArgumentException( - "The value of option \"namespaceAware\" " - + "must be a boolean."); - } - namespaceAware = ((Boolean) opValue).booleanValue(); - } else if (OPTION_XINCLUDE_AWARE.equals(opName)) { - if (!(opValue instanceof Boolean)) { - throw new IllegalArgumentException( - "The value of option \"namespaceAware\" " - + "must be a boolean."); - } - xincludeAware = ((Boolean) opValue).booleanValue(); - } else if (OPTION_VALIDATE.equals(opName)) { - if (!(opValue instanceof Boolean)) { - throw new IllegalArgumentException( - "The value of option \"validating\" " - + "must be a boolean."); - } - validate = ((Boolean) opValue).booleanValue(); - } else if (OPTION_INDEX.equals(opName)) { - indexOp = opValue; - } else if (OPTION_XMLNS.equals(opName)) { - if (!(opValue instanceof Map)) { - throw new IllegalArgumentException( - "The value of option \"xmlns\" " - + "must be a hash."); - } - xmlns = (Map) opValue; - Iterator it = xmlns.entrySet().iterator(); - while (it.hasNext()) { - ent = (Map.Entry) it.next(); - String prefix = (String) ent.getKey(); - if (prefix.length() == 0) { - throw new IllegalArgumentException( - "The key in xmlns hash can't be " - + "emptry string"); - } - obj = ent.getValue(); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The subvariables of the xmlns hash " - + "must be strings."); - } - String uri = (String) obj; - uri = uri.trim(); - if (uri.length() == 0) { - throw new IllegalArgumentException( - "The value for key " - + StringUtil.jQuote(prefix) - + " in xmlns hash can't be " + "emptry string"); - } - ent.setValue(uri); - } - } else { - throw new IllegalArgumentException( - "Option " + StringUtil.jQuote(opName) - + " is unknown. Supported options are: " - + " index, removeComments, removePIs, xmlns, " + "validate, namespaceAware."); - } - } - } - - Document doc; - if (preLoadedDoc == null) { - // Load and parse XML file: - File xmlFile = new File(path); - if (!xmlFile.isAbsolute()) { - xmlFile = new File(engine.getDataRoot(), path); - } - doc = XmlDataLoader.loadXmlFile( - engine, xmlFile, namespaceAware, xincludeAware, validate); - } else { - doc = preLoadedDoc; - } - - // Simplify XML: - if (removePIs) { - NodeModel.removePIs(doc); - } if (removeComments) { - NodeModel.removeComments(doc); - } - NodeModel.mergeAdjacentText(doc); - - // Indexing: - if (indexOp != null) { - IndexDescriptor[] indices; - if ((indexOp instanceof Map)) { - indices = new IndexDescriptor[1]; - indices[0] = new IndexDescriptor( - (Map) indexOp, xmlns, namespaceAware); - } else if ((indexOp instanceof String)) { - indices = new IndexDescriptor[1]; - indices[0] = new IndexDescriptor( - (String) indexOp, xmlns, namespaceAware); - } else if (indexOp instanceof List) { - List indexCfgs = (List) indexOp; - indices = new IndexDescriptor[indexCfgs.size()]; - for (int i = 0; i < indexCfgs.size(); i++) { - Object icfg = indexCfgs.get(i); - if (icfg instanceof Map) { - indices[i] = new IndexDescriptor( - (Map) icfg, xmlns, namespaceAware); - } else if (icfg instanceof String) { - indices[i] = new IndexDescriptor( - (String) icfg, xmlns, namespaceAware); - } else { - throw new IllegalArgumentException( - "When the \"index\" sub-option of data loader " + "xml(fileName, options) is a " + "sequence, its subvariables must be " - + "hashes and strings."); - } - } - } else { - throw new IllegalArgumentException( - "The \"index\" sub-option of data loader " + "xml(fileName, options) must be either " - + "hash, string, or sequence."); - } - for (int i = 0; i < indices.length; i++) { - indices[i].apply(doc); - } - } - - // wrap - return NodeModel.wrap(doc); - } - - /** - * Checks if the string is a valid xml data loader option name. - * Options names are the keys in the hash pased as the 2nd argument to the - * xml data loader. - */ - public static boolean isOptionName(String optionName) { - return OPTION_NAMES.contains(optionName); - } - - public static Document loadXmlFile( - Engine engine, File xmlFile, - boolean namespaceAware, boolean validate) - throws SAXException, IOException, ParserConfigurationException { - return loadXmlFile( engine, xmlFile, namespaceAware, false, validate); - } - - public static Document loadXmlFile( - Engine engine, File xmlFile, - boolean namespaceAware, boolean xincludeAware, boolean validate) - throws SAXException, IOException, ParserConfigurationException { - DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); - f.setNamespaceAware(namespaceAware); - if (xincludeAware) { - try { - Method m = f.getClass().getMethod( - "setXIncludeAware", new Class[]{Boolean.TYPE}); - m.invoke(f, new Object[]{Boolean.TRUE}); - } catch (Throwable e) { - throw new SAXException("It seems that your Java setup doesn't " - + "support XML XInclude-es. Upgrading Java may helps." - + "\nCause trace:\n" + MiscUtil.causeTrace(e)); - } - } - f.setValidating(validate); - DocumentBuilder db = f.newDocumentBuilder(); - if (validate) { - db.setErrorHandler(new ErrorHandler() { - - public void error(SAXParseException e) - throws SAXException { - throw new FriendlySaxException( - buildSAXParseExceptionMessage( - "XML parsing error: ", e), - e.getException()); - } - - public void fatalError(SAXParseException e) - throws SAXException { - throw new FriendlySaxException( - buildSAXParseExceptionMessage( - "XML parsing error: ", e), - e.getException()); - } - - public void warning(SAXParseException exception) - throws SAXException { - ; // do nothing - } - - }); - } - EntityResolver er = (EntityResolver) engine.getXmlEntiryResolver(); - if (er != null) { - db.setEntityResolver(er); - } - return db.parse(xmlFile); - } - - private static String buildSAXParseExceptionMessage( - String messagePrefix, SAXParseException e) { - int line = e.getLineNumber(); - int col = e.getColumnNumber(); - String pid = e.getPublicId(); - String sid = e.getSystemId(); - String message = e.getMessage(); - StringBuffer res = new StringBuffer(); - - if (messagePrefix != null) { - res.append(messagePrefix); - } - if (message != null) { - res.append(message); - } - if (line != -1 || col != -1 || pid != null || sid != null) { - boolean needSep = false; - if (res.length() != 0) { - res.append(StringUtil.LINE_BREAK); - } - res.append("Error location: "); - if (line != -1) { - res.append("line "); - res.append(line); - needSep = true; - } - if (col != -1) { - if (needSep) { - res.append(", "); - } - res.append("column "); - res.append(col); - needSep = true; - } - if (sid != null) { - if (needSep) { - res.append(" in "); - } - res.append(sid); - needSep = true; - } else if (pid != null) { - if (needSep) { - res.append(" in "); - } - res.append(pid); - needSep = true; - } - } - - return res.toString(); - } - - private static class IndexDescriptor { - private static final String OP_ELEMENT = "element"; - private static final String OP_ATTRIBUTE = "attribute"; - private static final String OP_VALUE = "value"; - private static final String OP_NUMBERING = "numbering"; - private static final String OPVAL_NUMBERING_SEQUENTIAL = "sequential"; - private static final String OPVAL_NUMBERING_HIERARCHICAL - = "hierarchical"; - private static final int NUMBERING_SEQUENTIAL = 1; - private static final int NUMBERING_HIERARCHICAL = 2; - - private Map elements; - private int numbering = NUMBERING_SEQUENTIAL; - private String attName = "id"; - private String attNSUri = ""; - private char[] attValue = "ppi_%n".toCharArray(); - private boolean namespaceAware; - - private StringBuffer wb = new StringBuffer(); - private int count; - - private IndexDescriptor(Map cfg, Map xmlns, boolean namespaceAware) { - this.namespaceAware = namespaceAware; - - Iterator it = cfg.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String opName = (String) ent.getKey(); - Object opValue = ent.getValue(); - - String defaultNS = (String) xmlns.get("D"); - if (defaultNS == null) { - defaultNS = ""; - } - - if (OP_ELEMENT.equals(opName)) { - String names[]; - int elementCount; - if (opValue instanceof String) { - elementCount = 1; - names = new String[1]; - names[0] = (String) opValue; - } else if (opValue instanceof List) { - List elements = (List) opValue; - elementCount = elements.size(); - names = new String[elementCount]; - for (int i = 0; i < elementCount; i++) { - Object obj = elements.get(i); - if (!(obj instanceof String)) { - throw new IllegalArgumentException( - "The value of sub-option \"" - + OP_ELEMENT - + "\", when it is a sequence, " - + "must be a sequence of strings."); - } - names[i] = (String) obj; - } - } else { - throw new IllegalArgumentException( - "The value of sub-option \"" + OP_ELEMENT - + "\" must be a string or " + "a sequence of strings."); - } - - // xmlns: - elements = new HashMap(); - for (int i = 0; i < elementCount; i++) { - String uri; - String eName = names[i]; - if (namespaceAware) { - int x = eName.indexOf(':'); - if (x == -1) { - uri = defaultNS; - } else { - String s2 = eName.substring(0, x); - if (s2.length() == 0) { - throw new IllegalArgumentException( - "Illegal element name " - + "in sub-option \"element\": " - + StringUtil.jQuote(eName) + ". " - + "The prefix is missing before " - + "the colon."); - } - eName = eName.substring(x + 1); - uri = (String) xmlns.get(s2); - if (uri == null) { - throw new IllegalArgumentException( - "Undefined XML name-space prefix " + "in sub-option \"element\": " - + StringUtil.jQuote(s2) + ". You " - + "have to define this prefix with " + "option \"xmlns\"."); - } - } - } else { - uri = ""; - } - Set nsSet = (Set) elements.get(eName); - if (nsSet == null) { - nsSet = new HashSet(); - elements.put(eName, nsSet); - } - nsSet.add(uri); - } - } else if (OP_ATTRIBUTE.equals(opName)) { - if (!(opValue instanceof String)) { - throw new IllegalArgumentException( - "The value of option \"" + OP_ATTRIBUTE - + "\" must be a string."); - } - attName = (String) opValue; - if (namespaceAware) { - int x = attName.indexOf(':'); - if (x == -1) { - attNSUri = ""; - } else { - /* - throw new IllegalArgumentException( - "Sorry, currently you can't use prefixes " - + "with attributes in sub-option " + "\"attribute\", because a Sun J2SE 1.4 " - + "(Apache Crimson) bug prevents it."); - Would die with NPE because of a - Sun J2SE 1.4 (crimson) bug: - */ - - String s2 = attName.substring(0, x); - if (s2.length() == 0) { - throw new IllegalArgumentException( - "Illegal element name " - + "in sub-option \"attribute\": " - + StringUtil.jQuote(attName) + ". " - + "The prefix is missing before the " - + "colon."); - } - attName = attName.substring(x + 1); - attNSUri = (String) xmlns.get(s2); - if (attNSUri == null) { - throw new IllegalArgumentException( - "Undefined XML name-space prefix " - + "in sub-option \"attribute\": " - + StringUtil.jQuote(s2) + ". You " - + "have to define this prefix with " - + "option \"xmlns\"."); - } - } - } else { - attNSUri = ""; - } - } else if (OP_VALUE.equals(opName)) { - if (!(opValue instanceof String)) { - throw new IllegalArgumentException( - "The value of option \"" + OP_VALUE - + "\" must be a string."); - } - attValue = ((String) opValue).toCharArray(); - } else if (OP_NUMBERING.equals(opName)) { - if (!(opValue instanceof String)) { - throw new IllegalArgumentException( - "The value of option \"" + OP_NUMBERING - + "\" must be a string."); - } - String s = (String) opValue; - if (OPVAL_NUMBERING_SEQUENTIAL.equals(s)) { - numbering = NUMBERING_SEQUENTIAL; - } else if (OPVAL_NUMBERING_HIERARCHICAL.equals(s)) { - numbering = NUMBERING_HIERARCHICAL; - } else { - throw new IllegalArgumentException( - "Illegal value for option \"" + OP_NUMBERING - + "\": " + StringUtil.jQuote(s) + ". " - + "Valid values are: \"" - + OPVAL_NUMBERING_SEQUENTIAL + "\", \"" - + OPVAL_NUMBERING_HIERARCHICAL + "\"."); - } - } else { - throw new IllegalArgumentException( - "Unknown index option " + StringUtil.jQuote(opName) - + ". Valid options are: \"" + OP_ELEMENT + "\", \"" - + OP_ATTRIBUTE + "\", \"" + OP_VALUE + "\", \"" - + OP_NUMBERING + "\"."); - } - } - - if (elements == null) { - throw new IllegalArgumentException( - "Required sub-option \"element\" " + "of option \"index\" is missing."); - } - } - - private IndexDescriptor( - String element, Map xmlns, boolean namespaceAware) { - this(createCfgMap(element), xmlns, namespaceAware); - } - - private static Map createCfgMap(String element) { - Map map = new HashMap(); - map.put(OP_ELEMENT, element); - return map; - } - - private void apply(Node node) { - count = 0; - apply(node, ""); - } - - private void apply(Node node, String numPrefix) { - boolean indexed; - if (node.getNodeType() == Node.ELEMENT_NODE) { - String eName; - if (namespaceAware) { - eName = node.getLocalName(); - } else { - eName = node.getNodeName(); - } - Object uris = elements.get(eName); - String domAttNSUri; - if (attNSUri.length() == 0) { - domAttNSUri = null; - } else { - domAttNSUri = attNSUri; - } - if (uris != null) { - boolean match; - String nUri = node.getNamespaceURI(); - if (nUri == null || nUri.length() == 0) { - match = ((Set) uris).contains(""); - } else { - match = ((Set) uris).contains(nUri); - } - if (match) { - count++; - indexed = true; - - Element e = (Element) node; - // Method hasAttributeNS would die with NPE because - // of a Sun J2SE 1.4 (crimson) bug - NamedNodeMap attrs = e.getAttributes(); - Attr theAttr; - if (namespaceAware) { - theAttr = (Attr) attrs.getNamedItemNS( - domAttNSUri, attName); - } else { - theAttr = (Attr) attrs.getNamedItem(attName); - } - if (theAttr == null) { - wb.setLength(0); - int ln = attValue.length; - for (int i = 0; i < ln; i++) { - char c = attValue[i]; - if (c != '%') { - wb.append(c); - } else { - i++; - if (i == ln) { - throw new IllegalArgumentException( - "Illegal usage of % in " + "sub-option \"value\" of " - + "option \"index\": " - + "% at the end of the string"); - } else { - c = attValue[i]; - if (c == 'n') { - wb.append(numPrefix); - wb.append(count); - } else if (c == 'e') { - wb.append(eName); - } else if (c == '%') { - wb.append('%'); - } else { - throw new IllegalArgumentException( - "Illegal usage of % in " - + "sub-option \"value\" of " - + "option \"index\": %" - + c); - } - } - } - } - if (domAttNSUri == null) { - e.setAttribute(attName, wb.toString()); - } else { - // This would die with NPE because - // of a Sun J2SE 1.4 (crimson) bug: - // e.setAttributeNS( - // domAttNSUri, - // "fmppIdx:" + attName, - // wb.toString()); - theAttr = node.getOwnerDocument() - .createAttributeNS( - domAttNSUri, - "fmpp:" + attName); - theAttr.setNodeValue(wb.toString()); - e.setAttributeNode(theAttr); - } - } - } else { - indexed = false; - } - } else { - indexed = false; - } - } else { - indexed = false; - } - - NodeList children = node.getChildNodes(); - int ln = children.getLength(); - if (ln != 0) { - if (numbering == NUMBERING_HIERARCHICAL) { - String newNumPrefix; - int oldCount = count; - if (!indexed) { - newNumPrefix = numPrefix; - } else { - wb.setLength(0); - wb.append(numPrefix); - wb.append(Integer.toString(count)); - wb.append("_"); - newNumPrefix = wb.toString(); - count = 0; - } - for (int i = 0; i < ln; i++) { - apply(children.item(i), newNumPrefix); - } - if (indexed) { - count = oldCount; - } - } else if (numbering == NUMBERING_SEQUENTIAL) { - for (int i = 0; i < ln; i++) { - apply(children.item(i), numPrefix); - } - } - } - } - } - - /** - * SAX Exception where we know that we don't have to print the exception - * class for the user, as the message holds enough information. - */ - private static class FriendlySaxException extends SAXException { - - public FriendlySaxException(String message) { - this(message, null); - } - - public FriendlySaxException(String message, Exception e) { - super(message, e); - } - - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/dataloaders/XmlInfosetDataLoader.java b/fmpp/src/main/java/fmpp/dataloaders/XmlInfosetDataLoader.java deleted file mode 100644 index bd81bec..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/XmlInfosetDataLoader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.dataloaders; - -import java.io.IOException; -import java.io.InputStream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.FactoryConfigurationError; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -/** - * Returns a variable that exposes the content of an XML file based on - * the W3C XML infoset approach. - * - * @deprecated Use {@link XmlDataLoader} instead. - */ -public class XmlInfosetDataLoader extends FileDataLoader { - protected Object load(InputStream data) - throws ParserConfigurationException, FactoryConfigurationError, - SAXException, IOException { - if (args.size() != 1) { - throw new IllegalArgumentException( - "Properties data loader needs exaclty 1 argument: " - + "xmlInfoset(filename)"); - } - - DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); - f.setNamespaceAware(true); - DocumentBuilder db = f.newDocumentBuilder(); - Document doc = db.parse(data); - - return new freemarker.ext.xml.NodeListModel(doc); - } -} diff --git a/fmpp/src/main/java/fmpp/dataloaders/package.html b/fmpp/src/main/java/fmpp/dataloaders/package.html deleted file mode 100644 index 773b05c..0000000 --- a/fmpp/src/main/java/fmpp/dataloaders/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    fmpp.DataLoader implementations. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/localdatabuilders/BshLocalDataBuilder.java b/fmpp/src/main/java/fmpp/localdatabuilders/BshLocalDataBuilder.java deleted file mode 100644 index 4b60983..0000000 --- a/fmpp/src/main/java/fmpp/localdatabuilders/BshLocalDataBuilder.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.localdatabuilders; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import bsh.EvalError; - -import fmpp.DataModelBuildingException; -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.TemplateEnvironment; -import fmpp.setting.SettingException; -import fmpp.tdd.Interpreter; -import fmpp.util.StringUtil; - -/** - * Deduces the file name of a BeanShell scrip file from the source file - * name, and executes that script to create local data. - * - *

    The script must return a java.util.Map, which stores the - * variables that will be added to the local data. - * - *

    The following variables are accessible for the scripts: - *

      - *
    • engine: the {@link fmpp.Engine} instance. - *
    • templateEnvironment: the {@link fmpp.TemplateEnvironment} - * instance. - *
    - */ -public class BshLocalDataBuilder implements LocalDataBuilder { - private static final String PARAM_ENDING = "ending"; - private static final String PARAM_REMOVE_EXTENSION = "removeExtension"; - private static final String PARAM_IGNORE_MISSING = "ignoreMissing"; - private static final String PARAM_ENCODING = "encoding"; - - private String ending = ".bsh"; - private boolean removeExtension; - private boolean ignoreMissing; - private String encoding; - - /** - * Creates new instance. - */ - public BshLocalDataBuilder() { - } - - public static BshLocalDataBuilder createInstanceForSetting( - String fName, List params) throws SettingException { - BshLocalDataBuilder builder = new BshLocalDataBuilder(); - if (params.size() != 0) { - if (params.size() != 1) { - throw new SettingException( - "The number of parameters to function \"" - + fName + "\" must be 1 or 0, but now there are " - + params.size() + " parameters specified."); - } - Object o = params.get(0); - if (!(o instanceof Map)) { - throw new SettingException( - "The parameter to function \"" + fName - + "\" must be a hash, but now it was a " - + Interpreter.getTypeName(o) + "."); - } - Iterator it = ((Map) o).entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String name = (String) ent.getKey(); - Object value = ent.getValue(); - if (name.equals(PARAM_ENDING)) { - if (!(value instanceof String)) { - throw new SettingException( - "In calling of function \"" + fName + "\", " - + "the value of option \"" + PARAM_ENDING - + "\" must be a string, but now it was a " - + Interpreter.getTypeName(value) + "."); - } - builder.setEnding((String) value); - } else if (name.equals(PARAM_REMOVE_EXTENSION)) { - if (!(value instanceof Boolean)) { - throw new SettingException( - "In calling of function \"" + fName + "\", " - + "the value of option \"" - + PARAM_REMOVE_EXTENSION - + "\" must be a boolean, but now it was a " - + Interpreter.getTypeName(value) + "."); - } - builder.setRemoveExtension( - ((Boolean) value).booleanValue()); - } else if (name.equals(PARAM_IGNORE_MISSING)) { - if (!(value instanceof Boolean)) { - throw new SettingException( - "In calling of function \"" + fName + "\", " - + "the value of option \"" - + PARAM_IGNORE_MISSING - + "\" must be a boolean, but now it was a " - + Interpreter.getTypeName(value) + "."); - } - builder.setIgnoreMissing(((Boolean) value).booleanValue()); - } else if (name.equals(PARAM_ENCODING)) { - if (!(value instanceof String)) { - throw new SettingException( - "In calling of function \"" + fName + "\", " - + "the value of option \"" + PARAM_ENCODING - + "\" must be a string, but now it was a " - + Interpreter.getTypeName(value) + "."); - } - builder.setEncoding((String) value); - } else { - throw new SettingException( - "In calling of function \"" + fName + "\", " - + "option " + StringUtil.jQuote(name) - + " is not supported. Supported options are: \"" - + PARAM_ENDING + "\", \"" + PARAM_REMOVE_EXTENSION - + "\", \"" + PARAM_IGNORE_MISSING + "\"."); - } - } - } - return builder; - } - - public Map build(Engine eng, TemplateEnvironment env) - throws FileNotFoundException, DataModelBuildingException { - String fileName = env.getSourceFile().getPath(); - if (removeExtension) { - int di = fileName.lastIndexOf('.'); - if (di != -1) { - int si = fileName.lastIndexOf(File.separatorChar); - if (si < di) { - fileName = fileName.substring(0, di); - } - } - } - fileName += ending; - - File f = new File(fileName); - if (!f.isFile()) { - if (ignoreMissing) { - return null; - } else { - throw new FileNotFoundException( - "Can't find the BeansShell script file for the source " + "file. The BeanShell file should be: " - + f.getAbsolutePath()); - } - } - - bsh.Interpreter bship = new bsh.Interpreter(); - try { - bship.set("engine", eng); - bship.set("templateEnvironment", env); - } catch (EvalError e) { - throw new DataModelBuildingException( - "Failed to prepare BeanShell execution.", e); - } - Object res; - try { - Reader r = new InputStreamReader( - new FileInputStream(f), - encoding == null ? eng.getSourceEncoding() : encoding); - try { - res = bship.eval(r); - } finally { - r.close(); - } - } catch (IOException e) { - throw new DataModelBuildingException( - "Failed to execute BeanShell script file: " - + f.getAbsolutePath(), e); - } catch (EvalError e) { - throw new DataModelBuildingException( - "Failed to execute BeanShell script file: " - + f.getAbsolutePath(), e); - } - - if (!(res instanceof Map)) { - throw new DataModelBuildingException( - "The BeanShell script file (" - + f.getAbsolutePath() + ") must return a java.util.Map, " - + "but it has returned " - + (res != null - ? "an object of class " - + res.getClass().getName() + "." - : "null.") - ); - } - return (Map) res; - } - - public String getEncoding() { - return encoding; - } - - /** - * Sets the encoding of the script files. If it is null then - * the value of the sourceEncoding setting will be used. - */ - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - public String getEnding() { - return ending; - } - - /** - * Sets the string appended at the end of the source file name. - * Can't be 0 length string. It defaults to ".bsh". - */ - public void setEnding(String ending) { - if (ending.length() == 0) { - throw new IllegalArgumentException( - "Postix must not be an empty string."); - } - this.ending = ending; - } - - /** - * Set if it will be ignored no script file found for the source file, - * rather than throwing an exception. Defaults to false. - */ - public boolean getIgnoreMissing() { - return ignoreMissing; - } - - public void setIgnoreMissing(boolean ignoreMissing) { - this.ignoreMissing = ignoreMissing; - } - - public boolean getRemoveExtension() { - return removeExtension; - } - - /** - * Sets if the extension from the source file name should be removed before - * appending the ending. The extension is the part after the - * last dot of the file name. The dot itself is also removed. - * Defaults to false. - */ - public void setRemoveExtension(boolean removeExtension) { - this.removeExtension = removeExtension; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/localdatabuilders/CachingLocalDataBuilder.java b/fmpp/src/main/java/fmpp/localdatabuilders/CachingLocalDataBuilder.java deleted file mode 100644 index 97d5359..0000000 --- a/fmpp/src/main/java/fmpp/localdatabuilders/CachingLocalDataBuilder.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.localdatabuilders; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.ProgressListener; -import fmpp.TemplateEnvironment; - -/** - * Stores the returned Map, and reuses it - * {@link #build(Engine, TemplateEnvironment)} is invoked again during the same - * processing session. This is useful when the building of the local data is an - * expensive operation, and the builder is used for multiple source files. - * - *

    The stored Map will be deleted at the end of the processing - * session. - */ -public abstract class CachingLocalDataBuilder - implements LocalDataBuilder, ProgressListener { - private Map cachedResult; - - /** - * Takes care of caching, and calls {@link #build(Engine)} if no cached - * result is available. - */ - public final Map build(Engine eng, TemplateEnvironment env) - throws Exception { - if (cachedResult == null) { - Map res = build(eng); - if (res == null) { - cachedResult = new HashMap(); - } else { - cachedResult = res; - /* Caused getData() to return wrapped objects... - // Pre-wrapp the result for better performance - Map wrappedData = new HashMap(); - Iterator it = res.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - try { - wrappedData.put( - ent.getKey(), - eng.wrap(ent.getValue())); - } catch (TemplateModelException e) { - throw new DataModelBuildingException( - "Failed to build local data: " - + "failed to wrap variable " - + StringUtil.jQuote( - ent.getKey().toString()) + ".", - e); - } - } - cachedResult = wrappedData; - */ - } - } - return cachedResult; - } - - /** - * Discards the cached result on - * {@link ProgressListener#EVENT_END_PROCESSING_SESSION}. - * - *

    The {@link TemplateEnvironment} is not passed, to ensure that the - * returned Map doesn't depend on the source file the builder - * is used for, so reusing the result for other source files is safe. - */ - public void notifyProgressEvent( - Engine engine, int event, File src, int pMode, Throwable error, - Object param) - throws Exception { - if (event == EVENT_END_PROCESSING_SESSION) { - cachedResult = null; - } - } - - /** - * Override this method in your local data builder class. - */ - protected abstract Map build(Engine eng) throws Exception; - -} diff --git a/fmpp/src/main/java/fmpp/localdatabuilders/MapLocalDataBuilder.java b/fmpp/src/main/java/fmpp/localdatabuilders/MapLocalDataBuilder.java deleted file mode 100644 index 6ef1e39..0000000 --- a/fmpp/src/main/java/fmpp/localdatabuilders/MapLocalDataBuilder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.localdatabuilders; - -import java.util.Map; - -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.TemplateEnvironment; - -/** - * Trivial local data builder that returns the Map passed to - * its constructor. - */ -public class MapLocalDataBuilder implements LocalDataBuilder { - private final Map map; - - public MapLocalDataBuilder(Map map) { - this.map = map; - } - - public Map build(Engine eng, TemplateEnvironment env) throws Exception { - return map; - } - -} diff --git a/fmpp/src/main/java/fmpp/localdatabuilders/TddHashLocalDataBuilder.java b/fmpp/src/main/java/fmpp/localdatabuilders/TddHashLocalDataBuilder.java deleted file mode 100644 index 0acfe2c..0000000 --- a/fmpp/src/main/java/fmpp/localdatabuilders/TddHashLocalDataBuilder.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.localdatabuilders; - -import java.util.Map; - -import fmpp.DataModelBuildingException; -import fmpp.Engine; -import fmpp.tdd.DataLoaderEvaluationEnvironment; -import fmpp.tdd.EvaluationEnvironment; -import fmpp.tdd.Fragment; -import fmpp.tdd.Interpreter; - -/** - * Builds data from a TDD hash, interpreting function calls as data loader - * invocations. The hash is evaluated when {@link fmpp.LocalDataBuilder#build} - * is invoked first. Then the result is stored until the end of the processing - * session, to be reused for all subsequent {@link fmpp.LocalDataBuilder#build} - * invokations. - * - *

    This local data builder is what localData setting uses, when the - * last parameter to the case function is a hash, e.g.:
    - * localData: [case(sub/, {bgColor:green, doc:xml(data/foo.xml)})]. - */ -public class TddHashLocalDataBuilder extends CachingLocalDataBuilder { - final Fragment fragment; - - public TddHashLocalDataBuilder(String tddHash) { - this.fragment = new Fragment(tddHash, 0, tddHash.length(), null); - } - - public TddHashLocalDataBuilder(Fragment fragment) { - this.fragment = fragment; - } - - public Map build(Engine eng) throws Exception { - EvaluationEnvironment env = new DataLoaderEvaluationEnvironment(eng); - Object o = Interpreter.eval(fragment, env, false); - if (!(o instanceof Map)) { - throw new DataModelBuildingException( - "Fragment doesn't evalute to Map but to " - + Interpreter.getTypeName(o) + "."); - } - return (Map) o; - } - - public String toString() { - return "TddHashLocalDataBuilder " + fragment; - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/localdatabuilders/package.html b/fmpp/src/main/java/fmpp/localdatabuilders/package.html deleted file mode 100644 index 07d189a..0000000 --- a/fmpp/src/main/java/fmpp/localdatabuilders/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    fmpp.LocalDataBuilder implementations. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/models/AddTransform.java b/fmpp/src/main/java/fmpp/models/AddTransform.java deleted file mode 100644 index 8babb6d..0000000 --- a/fmpp/src/main/java/fmpp/models/AddTransform.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; - -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateTransformModel; - -/** - * Adds/inserts an item to a {@link WritableSequence}. - */ -public class AddTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException, IOException { - WritableSequence seq = null; - int index = 0; - boolean hasIndex = false; - TemplateModel value = null; - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("seq".equals(pname)) { - if (!(pvalue instanceof WritableSequence)) { - throw new TemplateModelException( - "The \"seq\" parameter must be a " - + "writable sequence variable."); - } - seq = (WritableSequence) pvalue; - } else if ("index".equals(pname)) { - if (!(pvalue instanceof TemplateNumberModel)) { - throw new TemplateModelException( - "The \"index\" parameter must be a " - + "numberical value."); - } - index = ((TemplateNumberModel) pvalue).getAsNumber() - .intValue(); - hasIndex = true; - } else if ("value".equals(pname)) { - value = (TemplateModel) pvalue; - } else { - throw newUnsupportedParamException(pname); - } - } - if (seq == null) { - throw newMissingParamException("seq"); - } - if (value == null) { - throw newMissingParamException("value"); - } - if (hasIndex) { - if (index < 0 || index > seq.getList().size()) { - throw new TemplateModelException("Index out of bounds."); - } - seq.getList().add(index, value); - } else { - seq.getList().add(value); - } - - return null; - } -} diff --git a/fmpp/src/main/java/fmpp/models/ClearTransform.java b/fmpp/src/main/java/fmpp/models/ClearTransform.java deleted file mode 100644 index 437c9f9..0000000 --- a/fmpp/src/main/java/fmpp/models/ClearTransform.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateTransformModel; - -/** - * Removes all items from a {@link WritableSequence} or {@link WritableHash}. - */ -public class ClearTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException, IOException { - WritableSequence seq = null; - WritableHash hash = null; - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("seq".equals(pname)) { - if (!(pvalue instanceof WritableSequence)) { - throw new TemplateModelException( - "The \"seq\" parameter must be a " - + "writable sequence variable."); - } - seq = (WritableSequence) pvalue; - } else if ("hash".equals(pname)) { - if (!(pvalue instanceof WritableHash)) { - throw new TemplateModelException( - "The \"hash\" parameter must be a " - + "writable hash variable."); - } - hash = (WritableHash) pvalue; - } else { - throw newUnsupportedParamException(pname); - } - } - if (seq == null && hash == null) { - throw newMissingParamException("seq or hash"); - } - if (seq != null) { - seq.getList().clear(); - } - if (hash != null) { - hash.getMap().clear(); - } - - return null; - } -} diff --git a/fmpp/src/main/java/fmpp/models/CopyWritableVariableMethod.java b/fmpp/src/main/java/fmpp/models/CopyWritableVariableMethod.java deleted file mode 100644 index 30b4064..0000000 --- a/fmpp/src/main/java/fmpp/models/CopyWritableVariableMethod.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.List; - -import freemarker.template.TemplateMethodModelEx; -import freemarker.template.TemplateModelException; - -/** - * Creates a new, empty {@link WritableHash}. - */ -public class CopyWritableVariableMethod implements TemplateMethodModelEx { - public Object exec(List args) - throws TemplateModelException { - if (args.size() != 1) { - throw new TemplateModelException( - "method needs exactly 1 argument"); - } - Object obj = args.get(0); - if (!(obj instanceof WritableVariable)) { - throw new TemplateModelException( - "argument to method " + "must be a writable variable."); - } - return ((WritableVariable) obj).clone(); - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/models/CsvSequence.java b/fmpp/src/main/java/fmpp/models/CsvSequence.java deleted file mode 100644 index d5c79a0..0000000 --- a/fmpp/src/main/java/fmpp/models/CsvSequence.java +++ /dev/null @@ -1,754 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.io.IOException; -import java.io.Reader; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -import fmpp.util.BugException; -import fmpp.util.StringUtil; -import fmpp.util.StringUtil.ParseException; -import freemarker.template.SimpleDate; -import freemarker.template.SimpleNumber; -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateDateModel; -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; - -/** - * Sequence variable implementation that wraps text of CSV or tab separated - * values format, or any other format that is the same as CSV except that it - * uses different column separator char. - * - *

    The sequence is the list of table rows, and each row is hash where you - * can access the cells with the column name. The column names (headers) are - * the values in the first row of cells in the CSV file. - * - *

    The values in the table will be always exposed as string variables, unless - * you specify an other type in the header cell directly. This can be done - * by using colon + a type identifier at the end of the header cell. The type - * indetifier can be: n or number, b or - * boolean, d or date, - * t or time, dt or - * dateTime, s or string. For example, if - * the value of a header cell in the CSV file is "price:n", then the values of - * the cell will be exposed as numberical variables, not string. - * - *

    CsvSequence is also a hash that contains one key: - * headers. This is a sequence that stores the header names. - */ -public class CsvSequence implements - TemplateSequenceModel, TemplateHashModel { - private static final int T_STRING = 1; - private static final int T_NUMBER = 2; - private static final int T_BOOLEAN = 3; - private static final int T_DATE = 4; - private static final int T_TIME = 5; - private static final int T_DATETIME = 6; - - // data - private boolean loaded; - private ArrayList rows = new ArrayList(); - private Map nameToCol = new HashMap(); - private int colCount; - private List keyList = new ArrayList(); - - // settings - private String[] externalHeaderRow; - private boolean hasHeaderRow = true; - private boolean normalizeHeaders = false; - private boolean trimCells = false; - private String[] emptyValues; - private char separator = ';'; - private String altTrue, altFalse; - private char groupingSeparator = 0; - private char decimalSeparator = '.'; - private DateFormat dateFormat; - private String dateFormatPattern; - private DateFormat timeFormat; - private String timeFormatPattern; - private DateFormat dateTimeFormat; - private String dateTimeFormatPattern; - private TimeZone timeZone; - - /** - * Creates a new instance. - */ - public CsvSequence() { - } - - /** - * Loads data from text of CSV (or whatever similar) format. - * This method can be called once per instance. - * Set all options (as {@link #getSeparator separator}) before calling this. - * - * @param in reader to read the text (file) to parse. - * Will be close()-d. - */ - public void load(Reader in) - throws ParseException, IOException { - if (loaded) { - throw new IllegalStateException( - "Data already loaded into this CSV sequence."); - } - if (externalHeaderRow == null && !hasHeaderRow) { - throw new IllegalArgumentException("If \"fileHasHeaders\" is " - + "false then the \"headers\" parameter can't be null."); - } - new Parser(in).load(); - loaded = true; - } - - public TemplateModel get(int index) throws TemplateModelException { - return (TemplateModel) rows.get(index); - } - - public int size() throws TemplateModelException { - return rows.size(); - } - - private class Parser { - private Reader in; - private StringBuffer wb = new StringBuffer(); - private int cur; - - private Parser(Reader in) { - this.in = in; - } - - private void load() - throws IOException, ParseException { - String s; - boolean hasNextCol; - - try { - ArrayList headerTypes = new ArrayList(); - if (externalHeaderRow == null) { - cur = in.read(); - - colCount = 0; - hasNextCol = false; - headers: while (hasNextCol || cur != -1) { - s = fetchValue(); - - load_processHeaderCell(s, headerTypes); - - if (cur != separator) { - if (cur == 0xD) { - cur = in.read(); - if (cur == 0xA) { - cur = in.read(); - } - } else if (cur == 0xA) { - cur = in.read(); - } else if (cur != -1) { - if (cur != separator) { - throw new ParseException( - "Line-break or EOF expected but " - + "found " + StringUtil.jQuote( - String.valueOf((char) cur)) - + " instead."); - } - } - break headers; - } - cur = in.read(); - hasNextCol = true; - } - } else { - for (int j = 0; j < externalHeaderRow.length; j++) { - Object o = externalHeaderRow[j]; - if (!(o instanceof String)) { - throw new IllegalArgumentException("The header at " - + "index " + j + " (0 based) is not a " - + "string."); - } - load_processHeaderCell((String) o, headerTypes); - } - cur = in.read(); - if (hasHeaderRow) { - while (cur != 0xA && cur != 0xD && cur != -1) { - cur = in.read(); - } - if (cur == 0xD) { - cur = in.read(); - if (cur == 0xA) { - cur = in.read(); - } - } else if (cur == 0xA) { - cur = in.read(); - } - } - } - - // Iterate through rows: - while (cur != -1) { - TemplateModel[] row = new TemplateModel[colCount]; - int colIdx = 0; - cols: do { - s = fetchValue(); - - if (emptyValues != null) { - searchEmptyValue: - for (int i = 0; i < emptyValues.length; i++) { - if (s.equals(emptyValues[i])) { - s = ""; - break searchEmptyValue; - } - } - } - - if (colIdx >= colCount) { - throw new ParseException( - "Row " + (rows.size() + 2) - + " contains more columns than the number " - + "of header cells."); - } - int t = ((Integer) headerTypes.get(colIdx)).intValue(); - if (t == T_STRING) { - row[colIdx] = new SimpleScalar(s); - } else if (t == T_NUMBER) { - s = fixNumber(s); - if (s.length() != 0) { - row[colIdx] = new SimpleNumber( - StringUtil.stringToBigDecimal(s)); - } - } else if (t == T_BOOLEAN) { - s = fixBoolean(s); - if (s.length() != 0) { - row[colIdx] = StringUtil.stringToBoolean(s) - ? TemplateBooleanModel.TRUE - : TemplateBooleanModel.FALSE; - } - } else if (t == T_DATE) { - if (s.length() != 0) { - if (dateFormat != null) { - try { - row[colIdx] = new SimpleDate( - dateFormat.parse(s.trim()), - TemplateDateModel.DATE); - } catch (java.text.ParseException e) { - throw new ParseException("Date value " - + StringUtil.jQuote(s) - + " is not valid according to " + "pattern " - + StringUtil.jQuote( - dateFormatPattern)); - } - } else { - row[colIdx] = StringUtil.stringToDate( - s, timeZone); - } - } - } else if (t == T_TIME) { - if (s.length() != 0) { - if (timeFormat != null) { - try { - row[colIdx] = new SimpleDate( - timeFormat.parse(s.trim()), - TemplateDateModel.TIME); - } catch (java.text.ParseException e) { - throw new ParseException("Time value " - + StringUtil.jQuote(s) - + " is not valid according to " + "pattern " - + StringUtil.jQuote( - timeFormatPattern)); - } - } else { - row[colIdx] = StringUtil.stringToTime( - s, timeZone); - } - } - } else if (t == T_DATETIME) { - if (s.length() != 0) { - if (dateTimeFormat != null) { - try { - row[colIdx] = new SimpleDate( - dateTimeFormat.parse(s.trim()), - TemplateDateModel.DATETIME); - } catch (java.text.ParseException e) { - throw new ParseException( - "Date-time value " - + StringUtil.jQuote(s) - + " is not valid according to " + "pattern " - + StringUtil.jQuote( - dateTimeFormatPattern)); - } - } else { - row[colIdx] = StringUtil.stringToDateTime( - s, timeZone); - } - } - } else { - throw new BugException("Unknown column type " + t); - } - colIdx++; - - if (cur != separator) { - if (cur == 0xD) { - cur = in.read(); - if (cur == 0xA) { - cur = in.read(); - } - } else if (cur == 0xA) { - cur = in.read(); - } else if (cur != -1) { - if (cur != separator) { - throw new ParseException( - "Line-break or EOF expected " - + "but found" + StringUtil.jQuote( - String.valueOf((char) cur)) - + " instead."); - } - } - break cols; - } - cur = in.read(); - } while (true); - rows.add(new RowHash(row)); - } - } finally { - in.close(); - } - } - - private void load_processHeaderCell(String s, List headerTypes) - throws ParseException { - if (normalizeHeaders) { - // First we remove the part in parenthesses. Further - // normalization will be done only after the type part was - // extracted - int open = s.indexOf('('); - int close = s.lastIndexOf(')'); - if (open != -1 && close != -1 && open < close) { - s = s.substring(0, open) + s.substring(close + 1); - } - } - - int type; - int i = s.lastIndexOf(':'); - if (i == -1) { - s = s.trim(); - type = T_STRING; - } else { - String s2 = s.substring(i + 1).trim().toLowerCase(); - s = s.substring(0, i).trim(); - if (s2.equals("n") || s2.equals("number")) { - type = T_NUMBER; - } else if (s2.equals("s") || s2.equals("string")) { - type = T_STRING; - } else if (s2.equals("b") || s2.equals("boolean")) { - type = T_BOOLEAN; - } else if (s2.equals("d") || s2.equals("date")) { - type = T_DATE; - } else if (s2.equals("t") || s2.equals("time")) { - type = T_TIME; - } else if (s2.equals("dt") || s2.equals("dateTime")) { - type = T_DATETIME; - } else { - throw new ParseException("Unknown data type in a " - + "header: " + StringUtil.jQuote(s2)); - } - } - if (normalizeHeaders) { - s = s.toLowerCase(); - s = StringUtil.replace(s, " ", "_"); - s = StringUtil.replace(s, "-", "_"); - s = StringUtil.replace(s, ",", "_"); - s = StringUtil.replace(s, ";", "_"); - s = StringUtil.replace(s, ":", "_"); - while (s.indexOf("__") != -1) { - s = StringUtil.replace(s, "__", "_"); - } - } - nameToCol.put(s, new Integer(colCount)); - keyList.add(new SimpleScalar(s)); - headerTypes.add(new Integer(type)); - colCount++; - } - - private String fetchValue() throws IOException, ParseException { - wb.setLength(0); - if (cur == '"') { - cur = in.read(); - while (cur != -1) { - if (cur != '"') { - wb.append((char) cur); - cur = in.read(); - } else { - cur = in.read(); - if (cur == '"') { - wb.append((char) cur); - cur = in.read(); - } else { - return wb.toString(); //! - } - } - } - throw new ParseException("Reached the end of the file, and " - + "the closing quotation mark of value is missing."); - } else { - while (cur != separator && cur != -1 - && cur != 0xA && cur != 0xD) { - wb.append((char) cur); - cur = in.read(); - } - String r = wb.toString(); //! - if (trimCells) { - r = r.trim(); - } - return r; - } - } - } - - /** - * Override this if you want to correct boolean values come from the file. - * The default implementation removes leading and trailing white-space, - * converts to lowe case, and reaplaces the alternative boolean values (if - * set) with "true" and "false". - * - * @param s the raw column value - * @return String fixed value - */ - protected String fixBoolean(String s) { - s = s.trim().toLowerCase(); - if (altTrue != null && s.equals(altTrue)) { - return "true"; - } - if (altFalse != null && s.equals(altFalse)) { - return "false"; - } - return s; - } - - /** - * Override this if you want to correct numerical values come from the - * file. - * The default implementation removes leading and trailing white-space, - * removes grouping symbols (if set) and replaces decimal separator (if set) - * with dot. - * - * @param s the raw column value - * @return String fixed value - */ - protected String fixNumber(String s) { - s = s.trim(); - if (groupingSeparator != '\0') { - int i; - while ((i = s.indexOf(groupingSeparator)) != -1) { - s = s.substring(0, i) + s.substring(i + 1, s.length()); - } - } - if (decimalSeparator != '.') { - s = s.replace(decimalSeparator, '.'); - } - return s; - } - - private class RowHash - implements TemplateHashModelEx, TemplateSequenceModel { - - private TemplateModel[] cols; - - private RowHash(TemplateModel[] cols) { - this.cols = cols; - } - - public int size() { - return colCount; - } - - public TemplateCollectionModel keys() { - return new TemplateModelListCollection(keyList); - } - - public TemplateCollectionModel values() { - return new TemplateModelArrayCollection(cols); - } - - public TemplateModel get(String key) { - Integer i = (Integer) nameToCol.get(key); - if (i != null) { - return cols[i.intValue()]; - } else { - return null; - } - } - - public boolean isEmpty() { - return size() == 0; - } - - public TemplateModel get(int i) throws TemplateModelException { - return cols[i]; - } - - } - - public TemplateModel get(String key) throws TemplateModelException { - if (key.equals("headers")) { - return new TemplateModelListSequence(keyList); - } else { - return null; - } - } - - public boolean isEmpty() throws TemplateModelException { - return false; - } - - // ------------------------------------------------------------------------- - // Property setters/getters - - /** - * If it is not null, then it is used as the header row - * instead of the first row of the CSV file. Each value in the array - * corresponds to a header row cell. - */ - public void setExternalHeaderRow(String[] externalHeaderRow) { - this.externalHeaderRow = externalHeaderRow; - } - - public String[] getExternalHeaderRow() { - return externalHeaderRow; - } - - /** - * Specifies if the file contains header row or not. - * If it is false, then the externalHeaderRow - * property must not be null when calling - * {@link #load(Reader)}. Defaults to true. - */ - public void setHasHeaderRow(boolean hasHeaderRow) { - this.hasHeaderRow = hasHeaderRow; - } - - public boolean getHasHeaderRow() { - return hasHeaderRow; - } - - /** - * Specifies if the header names coming from the file will be normalized - * or should be left as is. Normalization means: - *

      - *
    1. Remove the part between the first "(" and last - * ")", before the header is parsed for column type - * identifier (like ":n"). - *
    2. After the type identifier was extracted and removed (if there was - * any), the cell value is trimmed. (Trimming happens even if - * header normalization is off.) - *
    3. Then it's converted to lower case. - *
    4. Then the following characters are replaced with "_": - * space, comma, semicolon, colon.
    5. Then all "__" - * and "___" and so on is replaced with a single - * "_". - *
    - * - * For example, "Price, old (category: A, B, F): n" will be - * normailzed to "price_old", and the type identifier will be - * n. - */ - public void setNormalizeHeaders(boolean normalizeHeaders) { - this.normalizeHeaders = normalizeHeaders; - } - - public boolean getNormalizeHeaders() { - return normalizeHeaders; - } - - /** - * Specifies if all cells will be trimmed. - * Trimming means the removal of all leading and trailing white-space. - * Defaults to false. - */ - public void setTrimCells(boolean trimCells) { - this.trimCells = trimCells; - } - - public boolean getTrimCells() { - return trimCells; - } - - /** - * Specifies the list of cell values that will be replaced with an empty - * (0 length) string. Typical such values are "-" or - * "N/A". The comparison is case-sensitice. When - * {@link #getTrimCells()} is true, the comparison occurs - * after the trimming. The replacement occurs before type conversions (for - * typed columns). Header values will not be affected by this property. - * Defaults to null, i.e., no replacement. - */ - public void setEmptyValues(String[] emptyValues) { - this.emptyValues = emptyValues; - } - - public String[] getEmptyValues() { - return emptyValues; - } - - public String getAltFalse() { - return altFalse; - } - - /** - * Alternative word used to indicate boolean false in the CSV file. - * Use null if you don't need alternative value. - * Defaults to null. - */ - public void setAltFalse(String altFalse) { - this.altFalse = altFalse; - } - - public String getAltTrue() { - return altTrue; - } - - /** - * Alternative word used to indicate boolean true in the CSV file. - * Use null if you don't need alternative value. - * Defaults to null. - */ - public void setAltTrue(String altTrue) { - this.altTrue = altTrue; - } - - public String getDateFormatPattern() { - return dateFormatPattern; - } - - /** - * Sets the pattern used to parse date columns. If this is - * null, then {@link StringUtil#stringToDate} will be used - * to parse the values. Defaults to null. - */ - public void setDateFormatPattern(String dateFormatPattern) { - if (dateFormatPattern == null) { - dateFormat = null; - } else { - dateFormat = new SimpleDateFormat(dateFormatPattern); - if (timeZone != null) { - dateFormat.setTimeZone(timeZone); - } - this.dateFormatPattern = dateFormatPattern; - } - } - - public String getDateTimeFormatPattern() { - return dateTimeFormatPattern; - } - - /** - * Sets the pattern used to parse date-time columns. If this is - * null, then {@link StringUtil#stringToDateTime} will be used - * to parse the values. Defaults to null. - */ - public void setDateTimeFormatPattern(String dateTimeFormatPattern) { - if (dateTimeFormatPattern == null) { - dateTimeFormat = null; - } else { - dateTimeFormat = new SimpleDateFormat(dateTimeFormatPattern); - if (timeZone != null) { - dateTimeFormat.setTimeZone(timeZone); - } - this.dateTimeFormatPattern = dateTimeFormatPattern; - } - } - - public char getDecimalSeparator() { - return decimalSeparator; - } - - /** - * Sets the alternative symbol used for the decimal dot in - * the file for numbers. Note that dot will be always assumed as - * decimal separator, except if groupingSeparator is set to dot. - */ - public void setDecimalSeparator(char decimalSeparator) { - this.decimalSeparator = decimalSeparator; - } - - public char getGroupingSeparator() { - return groupingSeparator; - } - - /** - * Set the grouping separator symbol used for grouping in the file - * for numbers. Use 0 ('\0') if you don't use grouping. - * Defaults to 0. - */ - public void setGroupingSeparator(char groupingSeparator) { - this.groupingSeparator = groupingSeparator; - } - - public char getSeparator() { - return separator; - } - - /** - * Separator char between cloumns. Defaults to semi-colon (;). - */ - public void setSeparator(char separator) { - this.separator = separator; - } - - public String getTimeFormatPattern() { - return timeFormatPattern; - } - - /** - * Sets the pattern used to parse time columns. If this is - * null, then {@link StringUtil#stringToTime} will be used - * to parse the values. Defaults to null. - */ - public void setTimeFormatPattern(String timeFormatPattern) { - if (timeFormatPattern == null) { - timeFormat = null; - } else { - timeFormat = new SimpleDateFormat(timeFormatPattern); - if (timeZone != null) { - timeFormat.setTimeZone(timeZone); - } - this.timeFormatPattern = timeFormatPattern; - } - } - - public TimeZone getTimeZone() { - return timeZone; - } - - /** - * Sets the time zone used for parsing date/time/date-time that does not - * specify a time zone explicitly. If null, the default time - * zone of the computer is used. - */ - public void setTimeZone(TimeZone timeZone) { - this.timeZone = timeZone; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/models/JSONArrayNode.java b/fmpp/src/main/java/fmpp/models/JSONArrayNode.java deleted file mode 100644 index 40e883a..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONArrayNode.java +++ /dev/null @@ -1,114 +0,0 @@ -package fmpp.models; - -import java.util.List; - -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "array" value; see http://www.json.org/. - * This class is NOT thread safe. - */ -public class JSONArrayNode extends JSONNode implements TemplateSequenceModel { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "array"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - /** - * Used internally to differentiate lazily initialized values that are already set to JSON {@code null} - * from those that weren't set yet. - */ - private static JSONNode JSON_NULL_MARK = new JSONNode(null, null) { - - private static final long serialVersionUID = 1L; - - public String getNodeType() throws TemplateModelException { - return null; - } - - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return null; - } - - protected String getDefaultNodeName() { - return null; - } - - }; - - /** Stores the array elements with plain Java types */ - private final List/**/ elements; - - /** Stores the array elements with FTL type; filled lazily. */ - private transient JSONNode[] wrappedElements; - - public JSONArrayNode(JSONNode parentNode, String nodeName, List/**/ elements) { - super(parentNode, nodeName); - this.elements = elements; - } - - /** - * Returns the {@link JSONNode}-s in this JSON array, using a {@link JSONNullNode} for JSON {@code null}-s. - * Note that {@link #get(int)} treats JSON {@code null}-s differently. - */ - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return new TemplateSequenceModel() { - - public TemplateModel get(int index) throws TemplateModelException { - final TemplateModel element = JSONArrayNode.this.get(index); - return element != null ? element : new JSONNullNode(JSONArrayNode.this, null); - } - - public int size() throws TemplateModelException { - return JSONArrayNode.this.size(); - } - - }; - } - - /** - * Returns {@link #NODE_TYPE}. - */ - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - /** - * Returns the {@link JSONNode} at the given index from this JSON array, using a Java {@code null} for JSON - * {@code null}-s. Note that {@link #getChildNodes()} treats JSON {@code null}-s differently. - */ - public TemplateModel get(int idx) throws TemplateModelException { - final int size = elements.size(); - if (idx < 0 || idx >= size) { - throw new TemplateModelException("JSON array index out of bounds: " + idx + " is outside 0.." + (size - 1)); - } - - JSONNode[] wrappedChildren = this.wrappedElements; - if (wrappedChildren == null) { - wrappedChildren = new JSONNode[size]; - this.wrappedElements = wrappedChildren; - } - - JSONNode r = wrappedChildren[idx]; - if (r == null) { - r = wrap(elements.get(idx), this, null, false); - if (r == null) { - r = JSON_NULL_MARK; - } - wrappedChildren[idx] = r; - } - return r != JSON_NULL_MARK ? r : null; - } - - public int size() throws TemplateModelException { - return elements.size(); - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONBooleanNode.java b/fmpp/src/main/java/fmpp/models/JSONBooleanNode.java deleted file mode 100644 index 40f5c45..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONBooleanNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package fmpp.models; - -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "true" and "false" value; see http://www.json.org/. - */ -public class JSONBooleanNode extends JSONNode implements TemplateBooleanModel { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "boolean"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - private final boolean value; - - public JSONBooleanNode(JSONNode parentNode, String nodeName, boolean value) { - super(parentNode, nodeName); - this.value = value; - } - - /** - * Always returns {@code null}. - */ - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return null; - } - - /** - * Returns {@link #NODE_TYPE}. - */ - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - public boolean getAsBoolean() throws TemplateModelException { - return value; - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONNode.java b/fmpp/src/main/java/fmpp/models/JSONNode.java deleted file mode 100644 index 90416e7..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONNode.java +++ /dev/null @@ -1,109 +0,0 @@ -package fmpp.models; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -import fmpp.util.StringUtil; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNodeModel; - -/** - * Node in a hierarchy of JSON values. See http://www.json.org/ for JSON types; each has its own subclass. - * JSON "object" and "array" values are the non-leafs in the tree. - */ -public abstract class JSONNode implements TemplateNodeModel, Serializable { - - private static final long serialVersionUID = 1L; - - private final JSONNode parentNode; - private final String nodeName; - - /** - * Returns the FTL node name for a node that has otherwise no name. - */ - protected static String nodeTypeToDefaultNodeName(String nodeType) { - return "unnamed" + StringUtil.capitalizeFirst(nodeType); - } - - /** - * @param parentNode the JSON "object" or JSON "array" that contains this value. - * @param nodeName {@code null}, unless this is the value in a key-value pair, in which case it's the key. - * When it's {@code null}, the actual node name will be {@link #getDefaultNodeName()}. - */ - protected JSONNode(JSONNode parentNode, String nodeName) { - this.parentNode = parentNode; - this.nodeName = nodeName != null ? nodeName : getDefaultNodeName(); - } - - /** - * Returns the name of the node if it has no explicit name. This is normally called by the - * {@link #JSONNode(JSONNode, String)} constructor if its second argument is {@code null}. - * - * @see #nodeTypeToDefaultNodeName(String) - */ - protected abstract String getDefaultNodeName(); - - /** - * Returns the JSON "object" or JSON "array" that contains this value. - */ - public final TemplateNodeModel getParentNode() throws TemplateModelException { - return parentNode; - } - - /** - * Returns the same as {@link #getNodeType()}, except when the node is the value in a key-value pair in a - * JSON object, in which case it returns the key value. - */ - public final String getNodeName() throws TemplateModelException { - return nodeName; - } - - public final String getNodeNamespace() throws TemplateModelException { - return null; - } - - /** - * Wraps a {@link List}, a {@link Map} with string keys, a {@link String}, a {@link Number} or a {@link Boolean} - * into a {@link JSONNode}. The values in the {@link List} or {@link Map} must be also be one of the previously - * listed types. The resulting object is NOT thread safe. Also, the wrapped objects shouldn't be changed after the - * wrapping. The wrapping of the contained values is possibly lazy. - * @return The wrapped value; note the this will return {@code null} for JSON null values, not a - * {@link JSONNullNode} instance. - * @throws TemplateModelException If {@code obj} can't be wrapped into JSON node. - */ - public static JSONNode wrap(Object jsonPOJO) throws TemplateModelException { - return wrap(jsonPOJO, null, null, false); - } - - /** - * @param parentNode Same as the similar parameter of {@link #JSONNode(JSONNode, String)}. - * @param nodeName Same as the similar parameter of {@link #JSONNode(JSONNode, String)}. - * @throws TemplateModelException If {@code obj} can't be wrapped into JSON node. - */ - protected static JSONNode wrap(Object obj, JSONNode parentNode, String nodeName, boolean wrapNullAsJSONNullNode) - throws TemplateModelException { - if (obj == null) { - return wrapNullAsJSONNullNode ? new JSONNullNode(parentNode, nodeName) : null; - } - - if (obj instanceof String) { - return new JSONStringNode(parentNode, nodeName, (String) obj); - } - if (obj instanceof Number) { - return new JSONNumberNode(parentNode, nodeName, (Number) obj); - } - if (obj instanceof Boolean) { - return new JSONBooleanNode(parentNode, nodeName, ((Boolean) obj).booleanValue()); - } - if (obj instanceof List) { - return new JSONArrayNode(parentNode, nodeName, (List) obj); - } - if (obj instanceof Map) { - return new JSONObjectNode(parentNode, nodeName, (Map) obj); - } - throw new TemplateModelException("Can't warp an object of this class as JSON node: " - + obj.getClass().getName()); - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONNullNode.java b/fmpp/src/main/java/fmpp/models/JSONNullNode.java deleted file mode 100644 index 6faec27..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONNullNode.java +++ /dev/null @@ -1,34 +0,0 @@ -package fmpp.models; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNodeModel; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "null" value; see http://www.json.org/. Instances of this can only be found through traversing the FTL node - * tree ({@link TemplateNodeModel} tree), not as normal FTL sequence or FTL hash items. - */ -public class JSONNullNode extends JSONNode { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "null"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - public JSONNullNode(JSONNode parentNode, String nodeName) { - super(parentNode, nodeName); - } - - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return null; - } - - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONNumberNode.java b/fmpp/src/main/java/fmpp/models/JSONNumberNode.java deleted file mode 100644 index 36f1525..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONNumberNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package fmpp.models; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "number" value; see http://www.json.org/. - */ -public class JSONNumberNode extends JSONNode implements TemplateNumberModel { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "number"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - private final Number value; - - public JSONNumberNode(JSONNode parentNode, String nodeName, Number value) { - super(parentNode, nodeName); - this.value = value; - } - - /** - * Always returns {@code null}. - */ - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return null; - } - - /** - * Returns {@link #NODE_TYPE}. - */ - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - public Number getAsNumber() throws TemplateModelException { - return value; - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONObjectNode.java b/fmpp/src/main/java/fmpp/models/JSONObjectNode.java deleted file mode 100644 index 94843ee..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONObjectNode.java +++ /dev/null @@ -1,190 +0,0 @@ -package fmpp.models; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateModelIterator; -import freemarker.template.TemplateNodeModel; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "object" value; see http://www.json.org/. - * This class is NOT thread safe. - */ -public class JSONObjectNode extends JSONNode implements TemplateHashModelEx { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "object"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - private final Map/**/ map; - - /** - * @param map The JSON name-value pairs. The keys must be {@link String}-s, and values must be of a type that - * {@link JSONNode#wrap(Object)} can wrap. - */ - public JSONObjectNode(JSONNode parentNode, String nodeName, Map/**/ map) { - super(parentNode, nodeName); - this.map = map; - } - - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - /** - * Returns the {@link JSONNode} for the given key from this JSON object, using a Java {@code null} for JSON - * {@code null}-s. Note that {@link #getChildNodes()} treats JSON {@code null}-s differently. - */ - public TemplateModel get(String key) throws TemplateModelException { - return wrap(map.get(key), this, key, false); - } - - public boolean isEmpty() throws TemplateModelException { - return map.isEmpty(); - } - - public int size() throws TemplateModelException { - return map.size(); - } - - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return new JSONChildNodeSequence(map.entrySet()); - } - - public TemplateCollectionModel keys() throws TemplateModelException { - return new JSONKeyCollection(map.keySet()); - } - - /** - * Returns the values from the key-value pairs of this JSON object, returning Java {@code null} for JSON - * {@code null}-s. Note that {@link #getChildNodes()} treats JSON {@code null}-s differently. - */ - public TemplateCollectionModel values() throws TemplateModelException { - return new JSONValueCollection(map.entrySet()); - } - - private class JSONChildNodeSequence implements TemplateSequenceModel, TemplateCollectionModel { - - private final Collection/*>*/ entries; - - private TemplateNodeModel[] wrappedValues; - - private JSONChildNodeSequence(Collection/*>*/ entries) { - this.entries = entries; - } - - public TemplateModelIterator iterator() throws TemplateModelException { - if (this.wrappedValues == null) { - initializeWrappedValues(); - } - return new TemplateModelIterator() { - - private int nextIdx; - - public boolean hasNext() throws TemplateModelException { - return nextIdx < wrappedValues.length; - } - - public TemplateModel next() throws TemplateModelException { - return wrappedValues[nextIdx++]; - } - - }; - } - - public TemplateModel get(int idx) throws TemplateModelException { - TemplateNodeModel[] wrappedValues = this.wrappedValues; - if (wrappedValues == null) { - wrappedValues = initializeWrappedValues(); - } - - if (idx < 0 || idx >= wrappedValues.length) { - throw new TemplateModelException("JSON object child node index out of bounds: " + idx - + " is outside 0.." + (wrappedValues.length - 1)); - } - return wrappedValues[idx]; - } - - protected TemplateNodeModel[] initializeWrappedValues() throws TemplateModelException { - TemplateNodeModel[] wrappedValues; - wrappedValues = new TemplateNodeModel[size()]; - int dstIdx = 0; - for (Iterator it = entries.iterator(); it.hasNext();) { - final Map.Entry/**/ entry = (Entry) it.next(); - wrappedValues[dstIdx++] = wrap(entry.getValue(), JSONObjectNode.this, (String) entry.getKey(), true); - } - return this.wrappedValues = wrappedValues; - } - - public int size() throws TemplateModelException { - return entries.size(); - } - - } - - private class JSONKeyCollection implements TemplateCollectionModel { - - private final Collection/**/ values; - - private JSONKeyCollection(Collection/**/ values) { - this.values = values; - } - - public TemplateModelIterator iterator() throws TemplateModelException { - return new TemplateModelIterator() { - - Iterator it = values.iterator(); - - public boolean hasNext() throws TemplateModelException { - return it.hasNext(); - } - - public TemplateModel next() throws TemplateModelException { - return wrap(it.next(), JSONObjectNode.this, null, false); - } - - }; - } - - } - - private class JSONValueCollection implements TemplateCollectionModel { - - private final Collection/*>*/ values; - - private JSONValueCollection(Collection/*>*/ values) { - this.values = values; - } - - public TemplateModelIterator iterator() throws TemplateModelException { - return new TemplateModelIterator() { - - Iterator it = values.iterator(); - - public boolean hasNext() throws TemplateModelException { - return it.hasNext(); - } - - public TemplateModel next() throws TemplateModelException { - final Map.Entry/**/ entry = (Entry) it.next(); - return wrap(entry.getValue(), JSONObjectNode.this, (String) entry.getKey(), false); - } - - }; - } - - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/JSONStringNode.java b/fmpp/src/main/java/fmpp/models/JSONStringNode.java deleted file mode 100644 index 387da9f..0000000 --- a/fmpp/src/main/java/fmpp/models/JSONStringNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package fmpp.models; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateSequenceModel; - -/** - * JSON "string" value; see http://www.json.org/. - */ -public class JSONStringNode extends JSONNode implements TemplateScalarModel { - - private static final long serialVersionUID = 1L; - - public static final String NODE_TYPE = "string"; - public static final String DEFAULT_NODE_NAME = nodeTypeToDefaultNodeName(NODE_TYPE); - - private final String value; - - public JSONStringNode(JSONNode parentNode, String nodeName, String value) { - super(parentNode, nodeName); - this.value = value; - } - - /** - * Always returns {@code null}. - */ - public TemplateSequenceModel getChildNodes() throws TemplateModelException { - return null; - } - - /** - * Returns {@link #NODE_TYPE}. - */ - public String getNodeType() throws TemplateModelException { - return NODE_TYPE; - } - - public String getAsString() throws TemplateModelException { - return value; - } - - protected String getDefaultNodeName() { - return DEFAULT_NODE_NAME; - } - -} diff --git a/fmpp/src/main/java/fmpp/models/NewWritableHashMethod.java b/fmpp/src/main/java/fmpp/models/NewWritableHashMethod.java deleted file mode 100644 index 6ba09e3..0000000 --- a/fmpp/src/main/java/fmpp/models/NewWritableHashMethod.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.HashMap; -import java.util.List; - -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateMethodModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateModelIterator; -import freemarker.template.TemplateScalarModel; - -/** - * Creates a new, empty {@link WritableHash}. - */ -public class NewWritableHashMethod implements TemplateMethodModelEx { - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() == 0) { - return new WritableHash(); - } else if (arguments.size() == 1) { - Object arg = arguments.get(0); - if (arg instanceof WritableHash) { - return ((WritableHash) arg).clone(); - } else if (arg instanceof TemplateHashModel) { - if (!(arg instanceof TemplateHashModelEx)) { - throw new TemplateModelException( - "The argument to newWritableHash(hash) must be " - + "an \"TemplateHashModelEx\" hash (like a wrapped " - + "Map). The argument you have given is a hash, " - + "but it is not \"Ex\", so its entires can't be " - + "enumerated, hence it can't be copyed."); - } - TemplateHashModelEx src = (TemplateHashModelEx) arg; - HashMap dst = new HashMap((int) (src.size() / 0.75 + 1)); - TemplateModelIterator it = src.keys().iterator(); - while (it.hasNext()) { - TemplateModel key = it.next(); - if (!(key instanceof TemplateScalarModel)) { - throw new TemplateModelException( - "The hash given as the argument of " - + "newWritableHash(hash) contains a key that is" - + "not a string. A such key is illegal " - + "according to FreeMarker."); - } - String strkey = ((TemplateScalarModel) key).getAsString(); - dst.put(strkey, src.get(strkey)); - } - return new WritableHash(dst); - } else { - throw new TemplateModelException( - "The argument to newWritableHash(hash) must be " - + "a hash (like a wrapped Map)."); - } - } else { - throw new TemplateModelException( - "The newWritableHash method needs 0 or 1 argument, not " - + arguments.size() + "."); - } - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/models/NewWritableSequenceMethod.java b/fmpp/src/main/java/fmpp/models/NewWritableSequenceMethod.java deleted file mode 100644 index fb8d5d3..0000000 --- a/fmpp/src/main/java/fmpp/models/NewWritableSequenceMethod.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.ArrayList; -import java.util.List; - -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateMethodModelEx; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateModelIterator; -import freemarker.template.TemplateSequenceModel; - -/** - * Creates a new, empty {@link WritableSequence}. - */ -public class NewWritableSequenceMethod implements TemplateMethodModelEx { - - public Object exec(List arguments) - throws TemplateModelException { - if (arguments.size() == 0) { - return new WritableSequence(); - } else if (arguments.size() == 1) { - Object arg = arguments.get(0); - if (arg instanceof WritableSequence) { - return ((WritableSequence) arg).clone(); - } else if (arg instanceof TemplateSequenceModel) { - TemplateSequenceModel src = (TemplateSequenceModel) arg; - int ln = src.size(); - ArrayList dst = new ArrayList(ln + 1); - for (int i = 0; i < ln; i++) { - dst.add(src.get(i)); - } - return new WritableSequence(dst); - } else if (arg instanceof TemplateCollectionModel) { - TemplateModelIterator src - = ((TemplateCollectionModel) arg).iterator(); - ArrayList dst = new ArrayList(); - while (src.hasNext()) { - dst.add(src.next()); - } - return new WritableSequence(dst); - } else { - throw new TemplateModelException( - "The argument to newWritableSequence(seq) must be " - + "a sequence (like a wrapped List) or a collection " - + "(like a wrapped Iterator)."); - } - } else { - throw new TemplateModelException( - "The newWritableHash method needs 0 or 1 argument, not " - + arguments.size() + "."); - } - } - -} diff --git a/fmpp/src/main/java/fmpp/models/RemoveTransform.java b/fmpp/src/main/java/fmpp/models/RemoveTransform.java deleted file mode 100644 index f1c5fc6..0000000 --- a/fmpp/src/main/java/fmpp/models/RemoveTransform.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateTransformModel; - -/** - * Removes an item from a {@link WritableSequence} or {@link WritableHash}. - */ -public class RemoveTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException, IOException { - WritableSequence seq = null; - WritableHash hash = null; - int index = 0; - String key = null; - boolean hasIndex = false; - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("seq".equals(pname)) { - if (!(pvalue instanceof WritableSequence)) { - throw new TemplateModelException( - "The \"seq\" parameter must be a " - + "writable sequence variable."); - } - seq = (WritableSequence) pvalue; - } else if ("hash".equals(pname)) { - if (!(pvalue instanceof WritableHash)) { - throw new TemplateModelException( - "The \"hash\" parameter must be a " - + "writable hash variable."); - } - hash = (WritableHash) pvalue; - } else if ("index".equals(pname)) { - if (!(pvalue instanceof TemplateNumberModel)) { - throw new TemplateModelException( - "The \"index\" parameter must be a " - + "numberical value."); - } - index = ((TemplateNumberModel) pvalue).getAsNumber() - .intValue(); - hasIndex = true; - } else if ("key".equals(pname)) { - if (!(pvalue instanceof TemplateScalarModel)) { - throw new TemplateModelException( - "The \"key\" parameter must be a " - + "string value."); - } - key = ((TemplateScalarModel) pvalue).getAsString(); - } else { - throw newUnsupportedParamException(pname); - } - } - if (seq == null && hash == null) { - throw newMissingParamException("seq or hash"); - } - if (seq != null) { - if (!hasIndex) { - throw newMissingParamException("index"); - } - if (index < 0 || index >= seq.getList().size()) { - throw new TemplateModelException("Index out of bounds."); - } - seq.getList().remove(index); - } - if (hash != null) { - if (key == null) { - throw newMissingParamException("key"); - } - hash.getMap().remove(key); - } - - return null; - } -} diff --git a/fmpp/src/main/java/fmpp/models/SetTransform.java b/fmpp/src/main/java/fmpp/models/SetTransform.java deleted file mode 100644 index f4ea446..0000000 --- a/fmpp/src/main/java/fmpp/models/SetTransform.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; - -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateTransformModel; - -/** - * Changes items an item in a {@link WritableSequence} or sets/adds and - * item to a {@link WritableHash}. - */ -public class SetTransform - extends TemplateModelUtils implements TemplateTransformModel { - - public Writer getWriter(Writer out, Map params) - throws TemplateModelException, IOException { - WritableSequence seq = null; - WritableHash hash = null; - int index = 0; - String key = null; - boolean hasIndex = false; - TemplateModel value = null; - - Iterator it = params.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry e = (Map.Entry) it.next(); - String pname = (String) e.getKey(); - Object pvalue = e.getValue(); - - if ("seq".equals(pname)) { - if (!(pvalue instanceof WritableSequence)) { - throw new TemplateModelException( - "The \"seq\" parameter must be a " - + "writable sequence variable."); - } - seq = (WritableSequence) pvalue; - } else if ("hash".equals(pname)) { - if (!(pvalue instanceof WritableHash)) { - throw new TemplateModelException( - "The \"hash\" parameter must be a " - + "writable hash variable."); - } - hash = (WritableHash) pvalue; - } else if ("index".equals(pname)) { - if (!(pvalue instanceof TemplateNumberModel)) { - throw new TemplateModelException( - "The \"index\" parameter must be a " - + "numberical value."); - } - index = ((TemplateNumberModel) pvalue).getAsNumber() - .intValue(); - hasIndex = true; - } else if ("key".equals(pname)) { - if (!(pvalue instanceof TemplateScalarModel)) { - throw new TemplateModelException( - "The \"key\" parameter must be a " - + "string value."); - } - key = ((TemplateScalarModel) pvalue).getAsString(); - } else if ("value".equals(pname)) { - value = (TemplateModel) pvalue; - } else { - throw newUnsupportedParamException(pname); - } - } - if (seq != null) { - if (value == null) { - throw newMissingParamException("value"); - } - if (!hasIndex) { - throw newMissingParamException("index"); - } - if (index < 0 || index >= seq.getList().size()) { - throw new TemplateModelException("Index out of bounds."); - } - seq.getList().set(index, value); - } else if (hash != null) { - if (value == null) { - throw newMissingParamException("value"); - } - if (key == null) { - throw newMissingParamException("key"); - } - hash.getMap().put(key, value); - } else { - throw newMissingParamException("seq or hash"); - } - - return null; - } -} diff --git a/fmpp/src/main/java/fmpp/models/StringArraySequence.java b/fmpp/src/main/java/fmpp/models/StringArraySequence.java deleted file mode 100644 index 5900ae2..0000000 --- a/fmpp/src/main/java/fmpp/models/StringArraySequence.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateSequenceModel; - -/** - * Sequence variable implementation that wraps a String[] with relatively low - * resource utilization. Warning: it does not copy the wrapped array, so do - * not modify that after the model was made! - */ -public class StringArraySequence implements TemplateSequenceModel { - private String[] stringArray; - private TemplateScalarModel[] array; - - /** - * Warning: Does not copy the argument array! - */ - public StringArraySequence(String[] stringArray) { - this.stringArray = stringArray; - } - - public TemplateModel get(int index) throws TemplateModelException { - if (array == null) { - array = new TemplateScalarModel[stringArray.length]; - } - TemplateScalarModel result = array[index]; - if (result == null) { - result = new SimpleScalar(stringArray[index]); - array[index] = result; - } - return result; - } - - public int size() throws TemplateModelException { - return stringArray.length; - } -} diff --git a/fmpp/src/main/java/fmpp/models/TemplateModelArrayCollection.java b/fmpp/src/main/java/fmpp/models/TemplateModelArrayCollection.java deleted file mode 100644 index 971c15b..0000000 --- a/fmpp/src/main/java/fmpp/models/TemplateModelArrayCollection.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelIterator; - -/** - * Collection variable implementation that wraps an array of already - * wrapped objects directly. - */ -public class TemplateModelArrayCollection implements TemplateCollectionModel { - private TemplateModel[] array; - - public TemplateModelArrayCollection(TemplateModel[] array) { - this.array = array; - } - - public TemplateModelIterator iterator() { - return new ArrayModelIterator(); - } - - private class ArrayModelIterator implements TemplateModelIterator { - private int index = 0; - - public TemplateModel next() { - return array[index++]; - } - - public boolean hasNext() { - return index < array.length; - } - } -} diff --git a/fmpp/src/main/java/fmpp/models/TemplateModelListCollection.java b/fmpp/src/main/java/fmpp/models/TemplateModelListCollection.java deleted file mode 100644 index 62ce5ce..0000000 --- a/fmpp/src/main/java/fmpp/models/TemplateModelListCollection.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.List; - -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelIterator; - -/** - * Collection variable implementation that wraps a java.util.List of already - * wrapped objects directly. - */ -public class TemplateModelListCollection implements TemplateCollectionModel { - private List list; - - public TemplateModelListCollection(List list) { - this.list = list; - } - - public TemplateModelIterator iterator() { - return new ListModelIterator(); - } - - private class ListModelIterator implements TemplateModelIterator { - private int index = 0; - - public TemplateModel next() { - return (TemplateModel) list.get(index++); - } - - public boolean hasNext() { - return index < list.size(); - } - } -} diff --git a/fmpp/src/main/java/fmpp/models/TemplateModelListSequence.java b/fmpp/src/main/java/fmpp/models/TemplateModelListSequence.java deleted file mode 100644 index 414cdc7..0000000 --- a/fmpp/src/main/java/fmpp/models/TemplateModelListSequence.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.List; - -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; - -/** - * Sequence that wraps a java.util.List of already wrapped objects - * directly, with minimal resource usage. Warning! It does not copy the original - * list. - */ -public class TemplateModelListSequence implements TemplateSequenceModel { - private List list; - - public TemplateModelListSequence(List list) { - this.list = list; - } - - public TemplateModel get(int index) throws TemplateModelException { - return (TemplateModel) list.get(index); - } - - public int size() throws TemplateModelException { - return list.size(); - } - - public Object getWrappedObject() { - return list; - } -} diff --git a/fmpp/src/main/java/fmpp/models/TemplateModelUtils.java b/fmpp/src/main/java/fmpp/models/TemplateModelUtils.java deleted file mode 100644 index 9921021..0000000 --- a/fmpp/src/main/java/fmpp/models/TemplateModelUtils.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import fmpp.util.StringUtil; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; - -/** - * Constains utility methods for transform and method variable implementation. - */ -public class TemplateModelUtils { - protected String strParam(Object m, String name) - throws TemplateModelException { - if (!(m instanceof TemplateScalarModel)) { - throw new TemplateModelException( - "Parameter " + StringUtil.jQuote(name) - + " must be string."); - } else { - return ((TemplateScalarModel) m).getAsString(); - } - } - - protected int intParam(Object m, String name) - throws TemplateModelException { - if (!(m instanceof TemplateNumberModel)) { - throw new TemplateModelException( - "Parameter " + StringUtil.jQuote(name) - + " must be an integer number."); - } else { - Number n = ((TemplateNumberModel) m).getAsNumber(); - int i = n.intValue(); - if (n.doubleValue() != i) { - throw new TemplateModelException( - "Parameter " + StringUtil.jQuote(name) - + " must be an integer."); - } else { - return n.intValue(); - } - } - } - - protected boolean boolParam(Object m, String name) - throws TemplateModelException { - if (!(m instanceof TemplateBooleanModel)) { - throw new TemplateModelException( - "Parameter " + StringUtil.jQuote(name) - + " must be boolean."); - } else { - return ((TemplateBooleanModel) m).getAsBoolean(); - } - } - - /** - * @deprecated Use {@code throw} {@link #newMissingParamException(String)}. - */ - protected void dieWithMissingParam(String pname) throws TemplateModelException { - throw newMissingParamException(pname); - } - - protected TemplateModelException newMissingParamException(String pname) { - return new TemplateModelException("Required parameter with this name is missing: " + pname); - } - - /** - * @deprecated Use {@code throw} {@link #newUnsupportedParamException(String)}. - */ - protected void dieWithUnknownParam(String pname) throws TemplateModelException { - throw newUnsupportedParamException(pname); - } - - protected TemplateModelException newUnsupportedParamException(String pname) { - return new TemplateModelException("Unsupported parameter: " + pname); - } - - /** - * @deprecated Use {@code throw} {@link #newNoParamsAllowedException()}. - */ - protected void dieWithParamsNotAllowed() throws TemplateModelException { - throw newNoParamsAllowedException(); - } - - protected TemplateModelException newNoParamsAllowedException() - throws TemplateModelException { - return new TemplateModelException("This directive doesn't allow any parameters"); - } - -} diff --git a/fmpp/src/main/java/fmpp/models/WritableHash.java b/fmpp/src/main/java/fmpp/models/WritableHash.java deleted file mode 100644 index 086626f..0000000 --- a/fmpp/src/main/java/fmpp/models/WritableHash.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.HashMap; -import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; - -import freemarker.template.SimpleCollection; -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; - -/** - * Hash variable that can be changed during template execution with the proper - * method variables. - */ -public class WritableHash - extends WritableVariable implements TemplateHashModelEx { - private Map map; - - public WritableHash() { - map = new HashMap(); - } - - /** - * @param map must use {@link String} for keys and {@link TemplateModel}-s - * for values. - */ - public WritableHash(Map map) { - this.map = map; - } - - public int size() throws TemplateModelException { - return map.size(); - } - - public TemplateCollectionModel keys() throws TemplateModelException { - return new SimpleCollection(map.keySet()); - } - - public TemplateCollectionModel values() throws TemplateModelException { - return new SimpleCollection(map.values()); - } - - public TemplateModel get(String key) throws TemplateModelException { - return (TemplateModel) map.get(key); - } - - public boolean isEmpty() throws TemplateModelException { - return map.isEmpty(); - } - - public Map getMap() { - return map; - } - - public void setMap(Map map) { - this.map = map; - } - - public Object clone() { - return new WritableHash(copyMap(map)); - } - - private static Map copyMap(Map map) { - if (map instanceof HashMap) { - return (Map) ((HashMap) map).clone(); - } else if (map instanceof SortedMap) { - if (map instanceof TreeMap) { - return (Map) ((TreeMap) map).clone(); - } else { - return new TreeMap((SortedMap) map); - } - } - return new HashMap(map); - } -} diff --git a/fmpp/src/main/java/fmpp/models/WritableSequence.java b/fmpp/src/main/java/fmpp/models/WritableSequence.java deleted file mode 100644 index 847c4d9..0000000 --- a/fmpp/src/main/java/fmpp/models/WritableSequence.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import java.util.ArrayList; -import java.util.List; - -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; - -/** - * Sequence variable that can be changed during template execution with the - * proper method variables. - */ -public class WritableSequence - extends WritableVariable implements TemplateSequenceModel { - private List list; - - public WritableSequence() { - list = new ArrayList(); - } - - /** - * @param list must contain only {@link TemplateModel}-s. - */ - public WritableSequence(List list) { - this.list = list; - } - - public TemplateModel get(int index) throws TemplateModelException { - return (TemplateModel) list.get(index); - } - - public int size() throws TemplateModelException { - return list.size(); - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - public Object clone() { - return new WritableSequence(new ArrayList(list)); - } -} diff --git a/fmpp/src/main/java/fmpp/models/WritableVariable.java b/fmpp/src/main/java/fmpp/models/WritableVariable.java deleted file mode 100644 index 2fba168..0000000 --- a/fmpp/src/main/java/fmpp/models/WritableVariable.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.models; - -import freemarker.template.TemplateModel; - -/** - * Marker interface for writable variables. - */ -abstract class WritableVariable implements Cloneable, TemplateModel { - public abstract Object clone(); -} diff --git a/fmpp/src/main/java/fmpp/models/package.html b/fmpp/src/main/java/fmpp/models/package.html deleted file mode 100644 index 13746e6..0000000 --- a/fmpp/src/main/java/fmpp/models/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    freemarker.template.TemplateModel implementations. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/overview.html b/fmpp/src/main/java/fmpp/overview.html deleted file mode 100644 index 7321698..0000000 --- a/fmpp/src/main/java/fmpp/overview.html +++ /dev/null @@ -1,18 +0,0 @@ - -

    FMPP is a general-purpose text file preprocessor tool that uses FreeMarker - templates. It is especially designed for HTML preprocessor, for the generation - of complete (static) homepages: directory structure that contains HTML-s, - image files, etc. FMPP can pull data from external data sources (database, - XML files, Java property files, etc.) and embed the data into the - generated files. - -

    For detailed instructions, read the FMPP Manual. - -

    Report bugs and send suggestions to "ddekany at freemail dot hu" - or use the mailing list, forums and trackers on the source forge project page: - http://sourceforge.net/projects/fmpp/. - -

    For the latest version, and for more information visit: - http://fmpp.sourceforge.net/. - - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/package.html b/fmpp/src/main/java/fmpp/package.html deleted file mode 100644 index ef7d539..0000000 --- a/fmpp/src/main/java/fmpp/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    The very core, the foundation of FMPP. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/progresslisteners/AntProgressListener.java b/fmpp/src/main/java/fmpp/progresslisteners/AntProgressListener.java deleted file mode 100644 index 18054d7..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/AntProgressListener.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.progresslisteners; - -import java.io.File; -import java.io.IOException; - -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; - -import fmpp.Engine; -import fmpp.ProgressListener; -import fmpp.util.FileUtil; -import fmpp.util.MiscUtil; - - -/** - * Designed to show the progress for Ant tasks. - */ -public class AntProgressListener implements ProgressListener { - private int maxPathLength = 80 - 35; - private Task antTask; - private boolean quiet = false; - private int errorCount; - private int warningCount; - private int executedCount; - private int renderedCount; - private int copiedCount; - private int processedCount; - private long startTime; - - /** - * Output will be printed to the stdout. - */ - public AntProgressListener(Task antTask) { - this.antTask = antTask; - } - - /** - * @param quiet If true, only error and warning messages will be printed. - */ - public AntProgressListener(Task antTask, boolean quiet) { - this.antTask = antTask; - this.quiet = quiet; - } - - public void notifyProgressEvent( - Engine engine, int event, - File src, int pMode, - Throwable error, Object param) { - StringBuffer message = new StringBuffer(); - switch (event) { - case EVENT_BEGIN_PROCESSING_SESSION: - errorCount = 0; - warningCount = 0; - processedCount = 0; - executedCount = 0; - renderedCount = 0; - copiedCount = 0; - startTime = System.currentTimeMillis(); - break; - case EVENT_SOURCE_NOT_MODIFIED: //! falls through - case EVENT_BEGIN_FILE_PROCESSING: - if (quiet) { - break; - } - - if (event == EVENT_SOURCE_NOT_MODIFIED) { - message.append("- Not modified: "); - } else { - if (pMode == Engine.PMODE_EXECUTE) { - message.append("- Executing: "); - } else if (pMode == Engine.PMODE_COPY) { - message.append("- Copying: "); - } else if (pMode == Engine.PMODE_RENDER_XML) { - message.append("- Rendering XML: "); - } else if (pMode == Engine.PMODE_IGNORE) { - message.append("- Ignoring: "); - } else { - message.append("- ???: "); - } - } - try { - message.append( - FileUtil.compressPath(FileUtil.getRelativePath( - engine.getSourceRoot(), src), maxPathLength)); - } catch (IOException exc) { - message.append("???"); - } - antTask.log(message.toString()); - break; - case EVENT_END_FILE_PROCESSING: - if (error != null) { - errorCount++; - if (quiet) { - message.append("Error with "); - try { - message.append( - FileUtil.getRelativePath( - engine.getSourceRoot(), src)); - } catch (IOException exc) { - message.append("???"); - } - } else { - message.append("Error"); - } - if (!engine.getStopOnError()) { - message.append(": " + MiscUtil.causeMessages(error)); - } - antTask.log(message.toString(), Project.MSG_ERR); - } else { - processedCount++; - if (pMode == Engine.PMODE_COPY) { - copiedCount++; - } else if (pMode == Engine.PMODE_EXECUTE) { - executedCount++; - } else if (pMode == Engine.PMODE_RENDER_XML) { - renderedCount++; - } - } - break; - case EVENT_WARNING: - warningCount++; - message.append("Warning"); - try { - message.append(" from "); - message.append( - FileUtil.getRelativePath( - engine.getSourceRoot(), src)); - } catch (IOException exc) { - message.append(" from ???"); - } - message.append(": "); - message.append((String) param); - antTask.log(message.toString(), Project.MSG_WARN); - break; - case EVENT_IGNORING_DIR: - if (quiet) { - break; - } - - message.append("- Ignoring directory: "); - try { - message.append( - FileUtil.compressPath(FileUtil.getRelativePath( - engine.getSourceRoot(), src), maxPathLength)); - } catch (IOException exc) { - message.append("???"); - } - antTask.log(message.toString()); - break; - case EVENT_CREATED_EMPTY_DIR: - if (quiet) { - break; - } - - /* Rather don't log this... it's just confusing. - message.append("- Created empty directory:"); - try { - message.append( - FileUtil.compressPath(FileUtil.getRelativePath( - engine.getSourceRoot(), src), maxPathLength)); - } catch (IOException exc) { - message.append("???"); - } - antTask.log(message.toString()); - */ - break; - case EVENT_END_PROCESSING_SESSION: - if (error != null) { - antTask.log( - "Task aborted: " + MiscUtil.causeMessages(error), - Project.MSG_ERR); - } else if (errorCount != 0) { - antTask.log( - "Task finished with " + errorCount + " error(s).", - Project.MSG_WARN); - } - if (!quiet) { - antTask.log("Summary: " - + executedCount + " exe. + " - + renderedCount + " xml. + " - + copiedCount + " cop. = " - + processedCount + " succ.; " - + warningCount + " warn.; " - + errorCount + " failed"); - antTask.log("Time elapsed: " - + (System.currentTimeMillis() - startTime) / 1000.0 - + " seconds", Project.MSG_VERBOSE); - } - break; - default: - ; // ignore - } - } - - public int getErrorCount() { - return errorCount; - } -} diff --git a/fmpp/src/main/java/fmpp/progresslisteners/ConsoleProgressListener.java b/fmpp/src/main/java/fmpp/progresslisteners/ConsoleProgressListener.java deleted file mode 100644 index 650e2dc..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/ConsoleProgressListener.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.progresslisteners; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; - -import fmpp.Engine; -import fmpp.ProgressListener; -import fmpp.util.FileUtil; - - -/** - * Designed to show the progress on console screen. - */ -public class ConsoleProgressListener implements ProgressListener { - private final PrintWriter out; - private int maxPathLength = 80 - 24; - private boolean quiet; - - /** - * Output will be printed to the stdout. - */ - public ConsoleProgressListener() { - this(System.out); - } - - public ConsoleProgressListener(OutputStream out) { - this(new PrintWriter(out, true)); - } - - public ConsoleProgressListener(PrintWriter out) { - this.out = out; - } - - /** - * @param quiet Print warnings and skipped errors only - */ - public ConsoleProgressListener(OutputStream out, boolean quiet) { - this(new PrintWriter(out, true)); - this.quiet = quiet; - } - - /** - * @param quiet Print warnings and skipped errors only - */ - public ConsoleProgressListener(PrintWriter out, boolean quiet) { - this.out = out; - this.quiet = quiet; - } - - public void notifyProgressEvent( - Engine engine, int event, - File src, int pMode, - Throwable error, Object param) { - switch (event) { - case EVENT_SOURCE_NOT_MODIFIED: //! falls through - case EVENT_BEGIN_FILE_PROCESSING: - if (!quiet) { - if (event == EVENT_SOURCE_NOT_MODIFIED) { - out.print("- Not modified: "); - } else { - if (pMode == Engine.PMODE_EXECUTE) { - out.print("- Executing: "); - } else if (pMode == Engine.PMODE_COPY) { - out.print("- Copying: "); - } else if (pMode == Engine.PMODE_RENDER_XML) { - out.print("- Rendering XML: "); - } else if (pMode == Engine.PMODE_IGNORE) { - out.print("- Ignoring: "); - } else { - out.print("- ???: "); - } - } - try { - out.println( - FileUtil.compressPath( - FileUtil.getRelativePath( - engine.getSourceRoot(), src), - maxPathLength)); - } catch (IOException exc) { - out.println("???"); - } - } - break; - case EVENT_END_FILE_PROCESSING: - if (error != null) { - if (!quiet) { - out.println(" !!! FAILED"); - } else { - if (!engine.getStopOnError()) { - out.print("! Error with "); - try { - out.print( - FileUtil.getRelativePath( - engine.getSourceRoot(), src)); - } catch (IOException exc) { - out.print("???"); - } - out.println(": " + error); - } - } - } - break; - case EVENT_WARNING: - if (!quiet) { - out.println(" * Warning: " + (String) param); - } else { - out.print("* Warning from "); - try { - out.print( - FileUtil.getRelativePath( - engine.getSourceRoot(), src)); - } catch (IOException exc) { - out.print("???"); - } - out.println(": " + (String) param); - } - break; - case EVENT_IGNORING_DIR: - if (!quiet) { - out.print("- Ignoring directory: "); - try { - out.println( - FileUtil.compressPath( - FileUtil.getRelativePath( - engine.getSourceRoot(), src), - maxPathLength)); - } catch (IOException exc) { - out.println("???"); - } - } - break; - case EVENT_CREATED_EMPTY_DIR: - if (!quiet) { - /* Rather don't log this... it's just confusing. - out.print("- Created empty directory: "); - try { - out.println( - FileUtil.compressPath( - FileUtil.getRelativePath( - engine.getSourceRoot(), src), - maxPathLength)); - } catch (IOException exc) { - out.println("???"); - } - */ - } - break; - default: - ; // ignore - } - - } -} diff --git a/fmpp/src/main/java/fmpp/progresslisteners/LoggerProgressListener.java b/fmpp/src/main/java/fmpp/progresslisteners/LoggerProgressListener.java deleted file mode 100644 index 27ae566..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/LoggerProgressListener.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.progresslisteners; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.util.Date; - -import fmpp.Engine; -import fmpp.ProcessingException; -import fmpp.ProgressListener; -import fmpp.util.FileUtil; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; - - -/** - * Writes detailed information about errors and warning messages into a file - * or into any character stream. - */ -public class LoggerProgressListener implements ProgressListener { - private static final String LOG_FILE_HEADER = "FMPP log file"; - private static final String LOG_FILE_HEADER_OLD = "--- BEGIN LOG FILE ---"; - private final PrintWriter out; - - private int executedCount; - private int copiedCount; - private int renderedCount; - private int errorCount; - private int warningCount; - private long startTime; - - /** - * Output will be printed to the stderr. - */ - public LoggerProgressListener() { - this(System.err); - } - - public LoggerProgressListener(OutputStream out) { - this(new PrintWriter(out, true)); - } - - public LoggerProgressListener(PrintWriter out) { - this.out = out; - } - - public LoggerProgressListener(File logFile) throws IOException { - this(logFile, false); - } - - public LoggerProgressListener(File logFile, boolean append) - throws IOException { - // check what do we prepare to overwrite - boolean logFileExists = logFile.exists() && logFile.length() != 0; - if (logFileExists) { - Reader r = new FileReader(logFile); - try { - int c; - boolean h1 = true; - boolean h2 = true; - int ln1 = LOG_FILE_HEADER.length(); - int ln2 = LOG_FILE_HEADER_OLD.length(); - int i = 0; - while (h1 || h2) { - c = r.read(); - if (h1) { - if (LOG_FILE_HEADER.charAt(i) != c) { - h1 = false; - } - if (i == ln1 - 1) { - break; - } - } - if (h2) { - if (LOG_FILE_HEADER_OLD.charAt(i) != c) { - h2 = false; - } - if (i == ln2 - 1) { - break; - } - } - i++; - } - if (!h1 && !h2) { - throw new IOException( - "Do not want to modify the log file, because " - + "it seems not be an FMPP log file. " - + "If this is a corruped log file, please delete " - + "it manually."); - } - } finally { - r.close(); - } - } - - out = new PrintWriter(new FileWriter( - logFile.getAbsolutePath(), append), true); - if (!append || !logFileExists) { - out.println(LOG_FILE_HEADER); - println("Log file created: " + new Date()); - } else { - println(); - } - println(); - } - - public void notifyProgressEvent( - Engine engine, int event, - File src, int pMode, - Throwable error, Object param) { - switch (event) { - case EVENT_BEGIN_PROCESSING_SESSION: - startTime = System.currentTimeMillis(); - errorCount = 0; - warningCount = 0; - executedCount = 0; - copiedCount = 0; - println("==============================================================================="); - println("PROCESSING SESSION STARTED: " + new Date()); - String fmppVersion, freemarkerVersion; - try { - fmppVersion = Engine.getVersionNumber(); - } catch (Throwable e) { - fmppVersion = "??? (" + e + ")"; - } - try { - freemarkerVersion = Engine.getFreeMarkerVersionNumber(); - } catch (Throwable e) { - freemarkerVersion = "??? (" + e + ")"; - } - println("FMPP version: " + fmppVersion + " (using FreeMarker " + freemarkerVersion + ")"); - - int startIndex = 0; - int dotCount = 0; - while (true) { - startIndex = fmppVersion.indexOf('.', startIndex); - if (startIndex == -1) { - break; - } - startIndex++; - dotCount++; - } - if (dotCount == 3) { - String buildInfo; - try { - buildInfo = Engine.getBuildInfo(); - } catch (Throwable e) { - buildInfo = "??? (" + e + ")"; - } - println("Unreleased \"nightly\" FMPP version! Version number doesn't reflect changes,"); - println("so watch the build date too: " + buildInfo); - } - - println(); - break; - case EVENT_WARNING: - warningCount++; - println("-------------------------------------------------------------------------------"); - println("*** WARNING: " + (String) param); - if (src != null) { - try { - println("Source file: " + FileUtil.getRelativePath(engine.getSourceRoot(), src)); - } catch (IOException e) { - println("???"); - } - } - println(); - break; - case EVENT_END_PROCESSING_SESSION: - println("==============================================================================="); - println("END OF PROCESSING SESSION"); - println(); - - println("Summary:\n" - + executedCount + " executed + " - + renderedCount + " xmlRendered + " - + copiedCount + " copied = " - + (executedCount + copiedCount + renderedCount) - + " successfully processed\n" - + errorCount + " failed, " - + warningCount + " warning(s)"); - println("Time elapsed: " - + (System.currentTimeMillis() - startTime) / 1000.0 - + " seconds"); - break; - case EVENT_END_FILE_PROCESSING: - if (error != null) { - errorCount++; - } else { - if (pMode == Engine.PMODE_COPY) { - copiedCount++; - } else if (pMode == Engine.PMODE_EXECUTE) { - executedCount++; - } else if (pMode == Engine.PMODE_RENDER_XML) { - renderedCount++; - } - } - break; - default: - ; // ignore - } - - if (error != null) { - if (event != EVENT_END_PROCESSING_SESSION) { - println("-------------------------------------------------------------------------------"); - println("!!! ERROR"); - } else { - println(); - println("WARNING! Processing session was interrupted:"); - println(); - } - - if (error instanceof ProcessingException) { - src = ((ProcessingException) error).getSourceFile(); - } - if (src != null) { - println("> Source file:"); - try { - println(FileUtil.getRelativePath(engine.getSourceRoot(), src)); - } catch (IOException e) { - println("???"); - } - } - - if (event == EVENT_END_FILE_PROCESSING && engine.getStopOnError()) { - out.println("> Error message (see also full stack trace at session end):"); - out.print(MiscUtil.causeMessages(error)); - } else { - println("> Error message with stack trace:"); - if (error instanceof ProcessingException) { - final Throwable cause = error.getCause(); - if (cause != null) { - error = cause; - } - } - error.printStackTrace(out); - } - out.flush(); - - println(); - } - if (event == EVENT_END_PROCESSING_SESSION) { - println("==============================================================================="); - } - } - - /** - * Returns the PrintWriter used for printing into the log. - */ - public PrintWriter getPrintWriter() { - return out; - } - - /** - * Closes the PrintWriter used for printing into the log. - */ - public void close() { - out.close(); - } - - /** - * Flushes the PrintWriter used for printing into the log. - */ - public void flush() { - out.flush(); - } - - /** - * Prints into the log without word-wrapping. - */ - public void printlnNW(String text) { - out.println(text); - } - - /** - * Prints into the log without word-wrapping. - */ - public void printNW(String text) { - out.print(text); - } - - /** - * Prints line-break into the log. - */ - public void println() { - out.println(); - } - - /** - * Prints into the log with word-wrapping. - */ - public void println(Object obj) { - println(obj.toString()); - } - - /** - * Prints into the log with word-wrapping. - */ - public void println(String text) { - println(text, 0); - } - - /** - * Prints into the log with word-wrapping and indentation. - */ - public void println(String text, int indent) { - out.println(StringUtil.wrap(text, 80, indent)); - } - - public void printStackTrace(Throwable exc) { - printlnNW("--- Java stack trace: ---"); - exc.printStackTrace(out); - println(); - } -} diff --git a/fmpp/src/main/java/fmpp/progresslisteners/StatisticsProgressListener.java b/fmpp/src/main/java/fmpp/progresslisteners/StatisticsProgressListener.java deleted file mode 100644 index cc7afee..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/StatisticsProgressListener.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.progresslisteners; - -import java.io.File; - -import fmpp.Engine; -import fmpp.ProgressListener; - -/** - * Spins some counters regarding the work of the Engine. - * All methods of this listener can be called from multiple threads. The current - * state of counters can be read while the engine is working. - */ -public class StatisticsProgressListener implements ProgressListener { - private int failed, executed, copied, rendered, warnings; - private long endTime, beginTime; - - public void notifyProgressEvent( - Engine engine, - int event, - File src, int pMode, - Throwable error, Object param) { - switch (event) { - case EVENT_BEGIN_PROCESSING_SESSION: - beginTime = System.currentTimeMillis(); - break; - case EVENT_END_PROCESSING_SESSION: - endTime = System.currentTimeMillis(); - break; - case EVENT_BEGIN_FILE_PROCESSING: - // nop - break; - case EVENT_END_FILE_PROCESSING: - if (error == null) { - if (pMode == Engine.PMODE_COPY) { - copied++; - } else if (pMode == Engine.PMODE_EXECUTE) { - executed++; - } else if (pMode == Engine.PMODE_RENDER_XML) { - rendered++; - } - } else { - failed++; - } - break; - case EVENT_WARNING: - warnings++; - default: - ; // ignore - } - } - - /** - * Rests all counters. - */ - public synchronized void reset() { - failed = 0; - executed = 0; - rendered = 0; - copied = 0; - warnings = 0; - beginTime = -1; - endTime = -1; - } - - /** - * The duration of the last - * BEGIN_ALL_PROCESSING-END_ALL_PROCESSING - * in milliseconds, or -1 if that is not known. - */ - public synchronized long getProcessingTime() { - if (beginTime == -1 || endTime == -1) { - return -1; - } else { - return endTime - beginTime; - } - } - - /** - * Number of files successfully copied. - */ - public synchronized int getCopied() { - return copied; - } - - /** - * Number of files successfully executed (templates). - */ - public synchronized int getExecuted() { - return executed; - } - - /** - * Number of XML files successfully rendered. - */ - public synchronized int getXmlRendered() { - return rendered; - } - - /** - * Number of files where processing was failed. - */ - public synchronized int getFailed() { - return failed; - } - - /** - * Number of files where processing was successfull. - */ - public synchronized int getSuccesful() { - return executed + copied + rendered; - } - - /** - * Number of files that the engine has tried to process. - */ - public synchronized int getAccessed() { - return executed + copied + rendered + failed; - } - - /** - * Total number of warnings. - */ - public synchronized int getWarnings() { - return warnings; - } -} diff --git a/fmpp/src/main/java/fmpp/progresslisteners/TerseConsoleProgressListener.java b/fmpp/src/main/java/fmpp/progresslisteners/TerseConsoleProgressListener.java deleted file mode 100644 index 5995b96..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/TerseConsoleProgressListener.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.progresslisteners; - -import java.io.File; -import java.io.OutputStream; -import java.io.PrintWriter; - -import fmpp.Engine; -import fmpp.ProgressListener; - -/** - * Designed to show the progress on console screen in a - * very terse way (prints a symbol for each processed file). - */ -public class TerseConsoleProgressListener implements ProgressListener { - private final PrintWriter out; - - /** - * Output will be printed to the stdout. - */ - public TerseConsoleProgressListener() { - this(System.out); - } - - public TerseConsoleProgressListener(OutputStream out) { - this(new PrintWriter(out, true)); - } - - public TerseConsoleProgressListener(PrintWriter out) { - this.out = out; - } - - public void notifyProgressEvent( - Engine engine, int event, - File src, int pMode, - Throwable error, Object param) { - if (event == EVENT_END_FILE_PROCESSING) { - if (error != null) { - out.print("E"); - out.flush(); - } else { - if (pMode == Engine.PMODE_EXECUTE) { - out.print("."); - out.flush(); - } else if (pMode == Engine.PMODE_RENDER_XML) { - out.print(";"); - out.flush(); - } else if (pMode == Engine.PMODE_COPY) { - out.print(":"); - out.flush(); - } else if (pMode == Engine.PMODE_IGNORE) { - ; // nop - } else { - out.print(","); - out.flush(); - } - } - } else if (event == EVENT_SOURCE_NOT_MODIFIED) { - out.print("_"); - out.flush(); - } else if (event == EVENT_END_PROCESSING_SESSION) { - out.println(); - } - } -} diff --git a/fmpp/src/main/java/fmpp/progresslisteners/package.html b/fmpp/src/main/java/fmpp/progresslisteners/package.html deleted file mode 100644 index 47a86cd..0000000 --- a/fmpp/src/main/java/fmpp/progresslisteners/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    fmpp.ProgressListener implementations. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/setting/FileWithConfigurationBase.java b/fmpp/src/main/java/fmpp/setting/FileWithConfigurationBase.java deleted file mode 100644 index eb11f3c..0000000 --- a/fmpp/src/main/java/fmpp/setting/FileWithConfigurationBase.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -import java.io.File; - -/** - * File that stores the current configuration base directory at - * the time it was instantiated. This extra information is - * needed if the path may need or need not be resolved relatively to the - * configuration base later, depending on factors that are not known when - * the setting value is set. - */ -public class FileWithConfigurationBase - extends FileWithSettingValue { - private final File configurationBase; - - /** - * Creates a new instance. - * The path will not be resolved relatively to the - * configurationBase. If it was a relative path, then - * it remains that. - */ - public FileWithConfigurationBase( - File configurationBase, String path, String settingValue) { - super(path, settingValue); - if (configurationBase == null) { - throw new IllegalArgumentException( - "Parameter \"cfgBase\" can't be null."); - } - this.configurationBase = configurationBase; - } - - public File getConfigurationBase() { - return configurationBase; - } - - public String toString() { - return getPath() + " (base: " + configurationBase.getPath() + "; " - + "setting value: " + getSettingValue() + ")"; - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/setting/FileWithSettingValue.java b/fmpp/src/main/java/fmpp/setting/FileWithSettingValue.java deleted file mode 100644 index 57d94a1..0000000 --- a/fmpp/src/main/java/fmpp/setting/FileWithSettingValue.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -import java.io.File; - -/** - * {@link File} that stores the original setting value (string) it was - * constructed from. This extra information is needed, for example, to - * display the content of a loaded configuration file for the user. - */ -public class FileWithSettingValue extends File { - - private static final long serialVersionUID = 1L; - - private final String settingValue; - - public FileWithSettingValue( - File parent, String child, String settingValue) { - super(parent, child); - if (settingValue == null) { - throw new IllegalArgumentException( - "Parameter settingValue can't be null"); - } - this.settingValue = settingValue; - } - - public FileWithSettingValue(String path, String settingValue) { - super(path); - if (settingValue == null) { - throw new IllegalArgumentException( - "Parameter settingValue can't be null"); - } - this.settingValue = settingValue; - } - - public FileWithSettingValue( - String parent, String child, String settingValue) { - super(parent, child); - if (settingValue == null) { - throw new IllegalArgumentException( - "Parameter settingValue can't be null"); - } - this.settingValue = settingValue; - } - - public String getSettingValue() { - return settingValue; - } - - public String toString() { - return getPath() + " (setting value: " + settingValue + ")"; - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/setting/SettingException.java b/fmpp/src/main/java/fmpp/setting/SettingException.java deleted file mode 100644 index 90c2299..0000000 --- a/fmpp/src/main/java/fmpp/setting/SettingException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -import fmpp.util.ExceptionCC; - -/** - * Bad setting or setting combination, or failure when trying to setup the - * engine with the settings. - */ -public class SettingException extends ExceptionCC { - - private static final long serialVersionUID = 1L; - - public SettingException(String s) { - super(s); - } - - public SettingException(String s, Throwable cause) { - super(s, cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/setting/Settings.java b/fmpp/src/main/java/fmpp/setting/Settings.java deleted file mode 100644 index 9153b57..0000000 --- a/fmpp/src/main/java/fmpp/setting/Settings.java +++ /dev/null @@ -1,3518 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Vector; - -import bsh.EvalError; -import fmpp.DataModelBuildingException; -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.ProcessingException; -import fmpp.ProgressListener; -import fmpp.XmlRenderingConfiguration; -import fmpp.localdatabuilders.BshLocalDataBuilder; -import fmpp.localdatabuilders.MapLocalDataBuilder; -import fmpp.localdatabuilders.TddHashLocalDataBuilder; -import fmpp.tdd.DataLoaderEvaluationEnvironment; -import fmpp.tdd.EvalException; -import fmpp.tdd.EvaluationEnvironment; -import fmpp.tdd.Fragment; -import fmpp.tdd.FunctionCall; -import fmpp.tdd.Interpreter; -import fmpp.util.BugException; -import fmpp.util.InstallationException; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; -import freemarker.ext.beans.BeansWrapper; -import freemarker.template.Configuration; -import freemarker.template.Version; - -/** - * Stores FMPP settings, loads configuration files, provides other setting - * handling related utilities. - * - *

    Settings are typed variables identified with their case-sensitive name. - * When you set the value of a setting, the value object you supply must be - * of the correct type. See the description of the TYPE_... - * to see the available setting types. - * - *

    Methods that change setting values have a variation - * that require String value(s) instead of Object(s). - * These methods should be used when you get the setting values from text-only - * sources, such as command-line option values, XML attributes or - * .properties file. To demonstrate the difference, assume you have - * string value "a, b, c". If you try to use this value for a - * setting of type list, the normal setter method will interpret the value - * as a list of length 1, that stores string "a, b, c". If you - * try to use the same value with the string version of the same method, it - * will interpret the string as a list of length 3, that stores 3 strings, - * "a", "b", and "c". - * - *

    Notes: - *

      - *
    • All settings you want to set/get must be defined. See {@link #define}. - * Standard settings (the settings documented in the FMPP Manual) are - * initially already defined. - *
    • If you have used an object as the value of a setting, the object must - * not be changed anymore. - *
    • If a method throws {@link SettingException}, then it is ensured that - * the method doesn't change the Settings object. For - * example, with {@link #add(Map)}, either all settings in the map will be - * successfully set, or neither will be set. - *
    - * - *

    You can execute the processing session described by the setting with - * {@link #execute()}. - */ -public class Settings { - - // Setting names: - - public static final String NAME_SKIP_UNCHANGED = "skipUnchanged"; - public static final String NAME_TURNS = "turns"; - public static final String NAME_SOURCES = "sources"; - public static final String NAME_SOURCE_ROOT = "sourceRoot"; - public static final String NAME_OUTPUT_ROOT = "outputRoot"; - public static final String NAME_OUTPUT_FILE = "outputFile"; - public static final String NAME_DATA_ROOT = "dataRoot"; - public static final String NAME_OBJECT_WRAPPER = "objectWrapper"; - public static final String NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS = "freemarkerIncompatibleImprovements"; - public static final String NAME_FREEMARKER_LINKS = "freemarkerLinks"; - public static final String NAME_INHERIT_CONFIGURATION - = "inheritConfiguration"; - public static final String NAME_MODES = "modes"; - public static final String NAME_BORDERS = "borders"; - public static final String NAME_DATA = "data"; - public static final String NAME_LOCAL_DATA = "localData"; - public static final String NAME_TEMPLATE_DATA = "templateData"; - public static final String NAME_SOURCE_ENCODING = "sourceEncoding"; - public static final String NAME_OUTPUT_ENCODING = "outputEncoding"; - public static final String NAME_URL_ESCAPING_CHARSET = "urlEscapingCharset"; - public static final String NAME_LOCALE = "locale"; - public static final String NAME_NUMBER_FORMAT = "numberFormat"; - public static final String NAME_BOOLEAN_FORMAT = "booleanFormat"; - public static final String NAME_DATE_FORMAT = "dateFormat"; - public static final String NAME_TIME_FORMAT = "timeFormat"; - public static final String NAME_DATETIME_FORMAT = "datetimeFormat"; - public static final String NAME_TIME_ZONE = "timeZone"; - public static final String NAME_SQL_DATE_AND_TIME_TIME_ZONE = "sqlDateAndTimeTimeZone"; - public static final String NAME_TAG_SYNTAX = "tagSyntax"; - public static final String NAME_CASE_SENSITIVE = "caseSensitive"; - public static final String NAME_STOP_ON_ERROR = "stopOnError"; - public static final String NAME_REMOVE_EXTENSIONS = "removeExtensions"; - public static final String OLD_NAME_REMOVE_EXTENSION = "removeExtension"; - public static final String NAME_REMOVE_POSTFIXES = "removePostfixes"; - public static final String OLD_NAME_REMOVE_POSTFIX = "removePostfix"; - public static final String NAME_REPLACE_EXTENSIONS = "replaceExtensions"; - public static final String OLD_NAME_REPLACE_EXTENSION = "replaceExtension"; - public static final String NAME_ALWAYS_CREATE_DIRECTORIES - = "alwaysCreateDirectories"; - public static final String NAME_IGNORE_CVS_FILES = "ignoreCvsFiles"; - public static final String NAME_IGNORE_SVN_FILES = "ignoreSvnFiles"; - public static final String NAME_IGNORE_TEMPORARY_FILES - = "ignoreTemporaryFiles"; - public static final String NAME_EXPERT = "expert"; - public static final String NAME_LOG_FILE = "logFile"; - public static final String NAME_APPEND_LOG_FILE = "appendLogFile"; - public static final String NAME_CONFIGURATION_BASE = "configurationBase"; - public static final String NAME_ECHO_FORMAT = "echoFormat"; - public static final String NAME_QUIET = "quiet"; - public static final String NAME_COLUMNS = "columns"; - public static final String NAME_SNIP = "snip"; - public static final String NAME_PRINT_STACK_TRACE = "printStackTrace"; - public static final String NAME_XPATH_ENGINE = "xpathEngine"; - public static final String NAME_XML_CATALOG_FILES = "xmlCatalogFiles"; - public static final String NAME_XML_CATALOG_PREFER = "xmlCatalogPrefer"; - // public static final String NAME_XML_CATALOG_ALLOW_PI - // = "xmlCatalogAllowPi"; [I don't know how to use those PI-s...] - public static final String NAME_VALIDATE_XML = "validateXml"; - public static final String NAME_XML_RENDERINGS = "xmlRenderings"; - - // Values of standard settings: - - public static final String VALUE_SOURCE = Engine.PARAMETER_VALUE_SOURCE; - public static final String VALUE_HOST = Engine.PARAMETER_VALUE_HOST; - public static final String VALUE_OUTPUT = Engine.PARAMETER_VALUE_OUTPUT; - public static final String VALUE_OBJECTWRAPPER_SHARED_BEANS_WRAPPER - = "shared"; - public static final String VALUE_TAG_SYNTAX_ANGLE_BRACKET = "angleBracket"; - public static final String VALUE_TAG_SYNTAX_SQUARE_BRACKET - = "squareBracket"; - public static final String VALUE_TAG_SYNTAX_AUTO_DETECT = "autoDetect"; - public static final String VALUE_NONE = "none"; - public static final String VALUE_REALLY_QUIET = "reallyQuiet"; - public static final String VALUE_XML_CATALOG_PREFER_PUBLIC = "public"; - public static final String VALUE_XML_CATALOG_PREFER_SYSTEM = "system"; - public static final String VALUE_GLOBAL_DEFAULT = "globalDefault"; - - // File names: - - /** - * Primary default file name. - */ - public static final String DEFAULT_CFG_FILE_NAME = "config.fmpp"; - - /** - * Secondary (legacy) default file name. - */ - public static final String DEFAULT_CFG_FILE_NAME_OLD = "fmpp.cfg"; - - // ------------------------------------------------------------------------- - // Setting types - - /** - * Any object. - *

    Input type: Object. - *

    Output type: Object. - *

    String input: any value, stored as is. - *

    Merging: not supported. - */ - public static final SettingType TYPE_ANY = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - return value; - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - return value; - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - throw new SettingException( - "Settings of type \"any\" can't be merged."); - } - }; - - /** - * String setting type. - *

    Input type: String, Number, - * Boolean. The last two is converted to string with - * toString() - *

    Output type: String. - *

    String input: any value, stored as is. - *

    Merging: not supported - */ - public static final SettingType TYPE_STRING = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof String) { - return value; - } else if (value instanceof Number || value instanceof Boolean) { - return String.valueOf(value); - } - throw new SettingException( - "The setting value should be a string, but now it was a " - + typeName(value) + "."); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - return value; - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - throw new SettingException( - "Settings of type \"string\" can't be merged."); - } - }; - - /** - * Integer setting type. - *

    Input type: Number that can be converted to - * Integer without lost. - *

    Output type: Integer. - *

    String input: any value, that can be parsed to Integer - * by Integer.parseInt after trimming. In additional, - * redundant + sign is supported. - *

    Merging: not supported - */ - public static final SettingType TYPE_INTEGER = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof Integer) { - return value; - } else if (value instanceof Number) { - Number n = (Number) value; - double d = n.doubleValue(); - int i = n.intValue(); - if (i != d) { - if (d < Integer.MAX_VALUE && d > Integer.MIN_VALUE) { - throw new SettingException( - "The setting value should be an integer number, " - + "but now it was a fraction number."); - } else { - throw new SettingException( - "The setting value should be an integer number, " - + "but it was a too big number to store " - + "on 32 bits."); - } - } - return new Integer(i); - } - throw new SettingException( - "The setting value should be an integer number, but now " - + "it was a " + typeName(value) + "."); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - try { - value = value.trim(); - if (value.startsWith("+")) { - value = value.substring(1).trim(); - } - return new Integer(Integer.parseInt(value)); - } catch (NumberFormatException e) { - throw new SettingException( - "Not a valid integer number: " + value, e); - } - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - throw new SettingException( - "Settings of type \"integer\" can't be merged."); - } - }; - - /** - * Boolean setting type. - *

    Input type: Boolean. - *

    Output type: Boolean. - *

    String input: After trimming and converting to lower-case, - * "true", "false" or empty - * string are allowed. Empty string is interpreted as true - * (consider a properties file that contains a key without value). - *

    Merging: not supported - */ - public static final SettingType TYPE_BOOLEAN = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof Boolean) { - return value; - } - throw new SettingException( - "The setting value should be a boolean, but now " - + "it was a " + typeName(value) + "."); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - value = value.trim().toLowerCase(); - if (value.equals("true") || value.length() == 0) { - return Boolean.TRUE; - } - if (value.equals("false")) { - return Boolean.FALSE; - } - throw new SettingException("Not a valid boolean: " + value); - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - throw new SettingException( - "Settings of type \"boolean\" can't be merged."); - } - }; - - /** - * Sequence setting type. - *

    Input type: List, any array, Vector. No - * restriction regarding the type of the list items. - *

    Output type: List. No restriction regarding the type of - * the list items. - *

    String input: TDD expression starting in list mode. If the result is - * a list that contains a single list, then the contained list will - * be used. This heuristic is used to fix this user mistake:
    - * --some-list="[a, b, c]"
    - * instead of:
    - * --some-list="a, b, c" - *

    Merging: the two lists are concatenated, with the default (inherited) - * value coming last. - */ - public static final SettingType TYPE_SEQUENCE = new SequenceSettingType(); - - /** - * Local data model setting type. - * This is the same as {@link #TYPE_SEQUENCE}, just if the value is given as - * text (string input), it defers the evaluation of the hash parameter of - * the case function call, and stores that as - * {@link fmpp.tdd.Fragment}. This is required because that hash parameter - * may uses data loaders, which shouldn't be executed until almost all - * settings of the {@link fmpp.Engine} are set. This also means that if - * you set the setting value with Java, the last parameter to the - * case {@link fmpp.tdd.FunctionCall} must be a - * {@link fmpp.tdd.Fragment} instead of Map, if you want to use - * data loaders in it. - */ - public static final SettingType TYPE_LOCAL_DATA_MODEL - = new SequenceSettingType() { - protected EvaluationEnvironment getEvaluationEnvironment() { - return new EvaluationEnvironment() { - private int functionCallLevel; - private int hashLevel; - private int sequenceLevel; - private boolean inCaseFunction; - - public Object evalFunctionCall( - FunctionCall fc, Interpreter ip) { - return fc; - } - - public Object notify( - int event, Interpreter ip, String name, Object extra) { - if (event == EVENT_ENTER_FUNCTION_PARAMS) { - functionCallLevel++; - if (functionCallLevel == 1 - && name.equals(FUNCTION_CASE)) { - inCaseFunction = true; - } - } else if (event == EVENT_LEAVE_FUNCTION_PARAMS) { - functionCallLevel--; - if (functionCallLevel == 0) { - inCaseFunction = false; - } - } else if (event == EVENT_ENTER_HASH) { - hashLevel++; - if (inCaseFunction && functionCallLevel == 1 - && hashLevel == 1 && sequenceLevel == 0) { - return RETURN_FRAGMENT; - } - } else if (event == EVENT_LEAVE_HASH) { - hashLevel--; - } else if (event == EVENT_ENTER_SEQUENCE) { - if (inCaseFunction) { - sequenceLevel++; - } - } else if (event == EVENT_LEAVE_SEQUENCE) { - if (inCaseFunction) { - sequenceLevel--; - } - } - return null; - } - - }; - } - }; - - /** - * Hash setting type. - *

    Input type: Map, Dictionary. - *

    Output type: Map. - *

    String input: TDD expression, starting in hash mode. - *

    Merging: the two maps are added (union) - */ - public static final SettingType TYPE_HASH = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof Map) { - return value; - } else if (value instanceof Dictionary) { - return MiscUtil.dictionaryToMap((Dictionary) value); - } - throw new SettingException( - "The setting value should be a hash (a Map), but now it " - + "was a " + typeName(value) + "."); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - try { - // Because of the hash union feature both will be fine: - // --some-hash-option="a:1, b:2, c:3" - // --some-hash-option="{a:1, b:2, c:3}" - return Interpreter.evalAsHash(value, null, forceStr, null); - } catch (EvalException e) { - throw new SettingException( - "Failed to parse the text as TDD hash.", e); - } - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - Map m1 = (Map) defValue; - Map m2 = (Map) value; - Map m = new HashMap(m1.size() + m2.size()); - m.putAll(m1); - m.putAll(m2); - return m; - } - }; - - /** - * "Configuration relative path" setting type. - *

    Input type: String, {@link FileWithSettingValue}. - * Plain File is not allowed. - *

    Output type: {@link FileWithSettingValue}. - *

    String input: Any value, trimmed before converting. - *

    Merging: not supported - */ - public static final SettingType TYPE_CFG_RELATIVE_PATH - = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof String) { - File f = new File((String) value); - if (f.isAbsolute()) { - return new FileWithSettingValue( - (String) value, (String) value); - } else { - return new FileWithSettingValue( - settings.baseDir, (String) value, (String) value); - } - - } else if (value instanceof FileWithSettingValue) { - return value; - } else { - throw new SettingException( - "The setting value should be a string (a path), but " - + "now it was a " + typeName(value) + "."); - } - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - return convert(settings, value.trim()); - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - throw new SettingException( - "Settings of type \"path\" can't be merged."); - } - }; - - /** - * "Configuration relative paths" setting type. - *

    Input type: Same as for {@link #TYPE_SEQUENCE}, but all list items - * must be string or {@link FileWithSettingValue}. - *

    Output type: Same as for {@link #TYPE_SEQUENCE}, but all list items - * are {@link FileWithSettingValue}-s. - *

    String input: Same as for {@link #TYPE_SEQUENCE}, but all sequence - * items must be strings. "force strings" option is on during the TDD - * interpretation. - *

    Merging: the two list are concatenated. - */ - public static final SettingType TYPE_CFG_RELATIVE_PATHS - = new SequenceSettingType() { - public Object convert(Settings settings, Object value) - throws SettingException { - return convertList(settings, (List) super.convert(settings, value)); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - return convertList( - settings, - (List) super.convertString(settings, value, forceStr)); - } - - private List convertList(Settings settings, List ls) - throws SettingException { - int ln = ls.size(); - List res = new ArrayList(ln); - for (int i = 0; i < ln; i++) { - Object o = ls.get(i); - - if (o instanceof String) { - File f = new File((String) o); - if (f.isAbsolute()) { - res.add(new FileWithSettingValue( - (String) o, (String) o)); - } else { - res.add(new FileWithSettingValue( - settings.baseDir, (String) o, - (String) o)); - } - } else if (o instanceof FileWithSettingValue) { - res.add(o); - } else { - throw new SettingException( - "All list items must be strings (paths), " - + "but the item at index " + i + " is a " - + typeName(o) + "."); - } - } - return res; - } - }; - - /** - * "Unresolved configuration relative paths" setting type. - *

    Input type: Same as for {@link #TYPE_SEQUENCE}, but all list items - * must be string or {@link FileWithConfigurationBase}. - *

    Output type: Same as for {@link #TYPE_SEQUENCE}, but all list items - * are {@link FileWithConfigurationBase}-s. - *

    String input: Same as for {@link #TYPE_SEQUENCE}, but all sequence - * items must be strings. "force strings" option is on during the TDD - * interpretation. - *

    Merging: the two list are concatenated. - */ - public static final SettingType TYPE_UNRESOLVED_CFG_RELATIVE_PATHS - = new SequenceSettingType() { - public Object convert(Settings settings, Object value) - throws SettingException { - return convertList(settings, (List) super.convert(settings, value)); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - return convertList( - settings, - (List) super.convertString(settings, value, forceStr)); - } - - private List convertList(Settings settings, List ls) - throws SettingException { - int ln = ls.size(); - List res = new ArrayList(ln); - for (int i = 0; i < ln; i++) { - Object o = ls.get(i); - if (!(o instanceof FileWithConfigurationBase)) { - if (!(o instanceof String)) { - throw new SettingException( - "All list items must be strings (paths), " - + "but the item at index " + i + " is a " - + typeName(o) + "."); - } - res.add(new FileWithConfigurationBase( - settings.baseDir, (String) o, (String) o)); - } else { - res.add(o); - } - } - return res; - } - }; - - /** - * Data model setting type. - *

    Input type: Map, Dictionary, - * {@link fmpp.tdd.Fragment}, - * private class DataList. - *

    Output type: private class DataList extends - * ArrayList. The list may contains: - * Map, String, {@link fmpp.tdd.Fragment}. - *

    String input: TDD expression, starting in hash mode. - *

    Merging: The tow lists are concatenated. - * - *

    This type is used for the "data" setting. The hash value of that - * setting can't be generated until the final value of all other setting is - * set (because data loaders may use the other settings). This way, the - * value of the "data" setting is a List that records the - * changes made on the setting, and not a Map. The - * Map will be built internally based on the list when you call - * {@link #execute()}. - */ - public static final SettingType TYPE_DATA_MODEL = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof Dictionary) { - value = MiscUtil.dictionaryToMap((Dictionary) value); - } - if (value instanceof Map - || value instanceof Fragment - || value instanceof String) { - List ls = new DataList(1); - ls.add(value); - return ls; - } - if (value instanceof DataList) { - return value; - } - throw new SettingException( - "The setting value should be a hash, but now it was a " - + typeName(value) + "."); - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - List ls = new DataList(1); - ls.add(value); - return ls; - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - DataList l1 = (DataList) defValue; - DataList l2 = (DataList) value; - DataList ls = new DataList(l1.size() + l2.size()); - ls.addAll(l1); - ls.addAll(l2); - return ls; - } - }; - - /** - * Hash-of-configuration-relative-paths setting type. - *

    Input type: Map or Dictionary, that stores - * a List or Vector or array, that stores - * strings and/or {@link FileWithSettingValue}-s. Also, the map may - * contains strings and/or {@link FileWithSettingValue} directly as - * value (instead of a list of length 1 that stores the same value). - *

    Output type: Map of List of - * {@link FileWithSettingValue}-s. - *

    String input: TDD expression, starting in hash mode. - *

    Merging: the two maps are added (union) - */ - public static final SettingType TYPE_HASH_OF_SEQUENCE_OF_CFG_RELATIVE_PATHS - = new SettingType() { - - public Object convert(Settings settings, Object value) - throws SettingException { - Map mapVal = (Map) TYPE_HASH.convert(settings, value); - Iterator it = mapVal.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - Object convertedValue; - try { - convertedValue = TYPE_CFG_RELATIVE_PATHS.convert( - settings, ent.getValue()); - } catch (SettingException e) { - throw new SettingException( - "Problem with a value in the hash: " - + e.getMessage(), - e.getCause()); - } - ent.setValue(convertedValue); - } - return mapVal; - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - try { - // Because of the hash union feature both will be fine: - // --some-hash-option="a:1, b:2, c:3" - // --some-hash-option="{a:1, b:2, c:3}" - return convert(settings, Interpreter.evalAsHash( - value, null, forceStr, null)); - } catch (EvalException e) { - throw new SettingException( - "Failed to parse the text as TDD hash.", e); - } - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - Map mDef = (Map) defValue; - Map mPri = (Map) value; - Map mMerged = new HashMap(mDef.size() + mPri.size()); - mMerged.putAll(mPri); - Iterator it = mDef.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String key = (String) ent.getKey(); - List vDef = (List) ent.getValue(); - List vPri = (List) mMerged.get(key); - if (vPri != null) { - List mergedList = new ArrayList(vPri.size() + vDef.size()); - mergedList.addAll(vPri); - mergedList.addAll(vDef); - mMerged.put(key, mergedList); - } else { - mMerged.put(key, vDef); - } - } - return mMerged; - } - }; - - // ------------------------------------------------------------------------- - // Standard defs - - private static final Map STD_DEFS = new HashMap(); - private static final Map STD_STDCMDL = new HashMap(); - static { - stdDef(NAME_SKIP_UNCHANGED, TYPE_STRING, false, true); - stdDef(NAME_TURNS, TYPE_SEQUENCE, true, false); - stdDef(NAME_SOURCES, TYPE_UNRESOLVED_CFG_RELATIVE_PATHS, true, true); - stdDef(NAME_SOURCE_ROOT, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_OUTPUT_ROOT, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_OUTPUT_FILE, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_DATA_ROOT, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_OBJECT_WRAPPER, TYPE_STRING, false, true); - stdDef(NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS, TYPE_STRING, false, true); - stdDef(NAME_FREEMARKER_LINKS, - TYPE_HASH_OF_SEQUENCE_OF_CFG_RELATIVE_PATHS, true, true); - stdDef(NAME_INHERIT_CONFIGURATION, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_MODES, TYPE_SEQUENCE, true, true); - stdDef(NAME_BORDERS, TYPE_SEQUENCE, true, true); - stdDef(NAME_DATA, TYPE_DATA_MODEL, true, false); - stdDef(NAME_LOCAL_DATA, TYPE_LOCAL_DATA_MODEL, true, false); - stdDef(NAME_TEMPLATE_DATA, TYPE_STRING, false, true); - stdDef(NAME_SOURCE_ENCODING, TYPE_STRING, false, true); - stdDef(NAME_OUTPUT_ENCODING, TYPE_STRING, false, true); - stdDef(NAME_URL_ESCAPING_CHARSET, TYPE_STRING, false, true); - stdDef(NAME_LOCALE, TYPE_STRING, false, true); - stdDef(NAME_NUMBER_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_BOOLEAN_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_DATE_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_TIME_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_DATETIME_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_TIME_ZONE, TYPE_STRING, false, true); - stdDef(NAME_SQL_DATE_AND_TIME_TIME_ZONE, TYPE_STRING, false, true); - stdDef(NAME_TAG_SYNTAX, TYPE_STRING, false, true); - stdDef(NAME_CASE_SENSITIVE, TYPE_BOOLEAN, false, false); - stdDef(NAME_STOP_ON_ERROR, TYPE_BOOLEAN, false, false); - stdDef(NAME_REMOVE_EXTENSIONS, TYPE_SEQUENCE, true, true); - stdDef(NAME_REMOVE_POSTFIXES, TYPE_SEQUENCE, true, true); - stdDef(NAME_REPLACE_EXTENSIONS, TYPE_SEQUENCE, true, true); - stdDef(NAME_ALWAYS_CREATE_DIRECTORIES, TYPE_BOOLEAN, false, false); - stdDef(NAME_IGNORE_CVS_FILES, TYPE_BOOLEAN, false, false); - stdDef(NAME_IGNORE_SVN_FILES, TYPE_BOOLEAN, false, false); - stdDef(NAME_IGNORE_TEMPORARY_FILES, TYPE_BOOLEAN, false, false); - stdDef(NAME_EXPERT, TYPE_BOOLEAN, false, false); - stdDef(NAME_LOG_FILE, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_APPEND_LOG_FILE, TYPE_BOOLEAN, false, false); - stdDef(NAME_CONFIGURATION_BASE, TYPE_CFG_RELATIVE_PATH, false, true); - stdDef(NAME_ECHO_FORMAT, TYPE_STRING, false, true); - stdDef(NAME_QUIET, TYPE_STRING, false, true); - stdDef(NAME_COLUMNS, TYPE_INTEGER, false, false); - stdDef(NAME_PRINT_STACK_TRACE, TYPE_BOOLEAN, false, false); - stdDef(NAME_SNIP, TYPE_BOOLEAN, false, false); - stdDef(NAME_XPATH_ENGINE, TYPE_STRING, false, true); - stdDef(NAME_XML_CATALOG_FILES, TYPE_CFG_RELATIVE_PATHS, true, false); - stdDef(NAME_XML_CATALOG_PREFER, TYPE_STRING, false, false); - // stdDef(new SettingDefinition( - // NAME_XML_CATALOG_ALLOW_PI, TYPE_STRING, false, false)); - stdDef(NAME_VALIDATE_XML, TYPE_BOOLEAN, false, false); - stdDef(NAME_XML_RENDERINGS, TYPE_SEQUENCE, true, false); - } - - // ------------------------------------------------------------------------- - // Other constants - - private static final String FUNCTION_LAYER = "layer"; - private static final String FUNCTION_CASE = "case"; - private static final String LOCAL_DATA_BUILDER_BSH = "bsh"; - - // ------------------------------------------------------------------------- - // State - - private File baseDir; - private Map defs; - private Map values = new HashMap(); - private Map cmdLineNames; - private XmlDependentOps xmlDependentOps; - private List progressListeners = new ArrayList(); - private Map engineAttributes = new HashMap(); - private boolean dontTraverseDirs; - - // ------------------------------------------------------------------------- - // Public menthods - - /** - * Creates a new instance. The standard settings will be already defined - * in the new instance. - * - * @param baseDir the base directory used to resolve relative paths in - * setting names. When you load settings from a configuration file, the - * parent directory of the file will be used instenad, for the settings - * coming from the file. - */ - public Settings(File baseDir) throws SettingException { - if (baseDir == null) { - throw new IllegalArgumentException( - "Parameter \"baseDir\" can't be null."); - } - try { - this.baseDir = baseDir.getCanonicalFile(); - } catch (IOException e) { - throw new SettingException( - "Can't bring base path to canonical form: " - + baseDir.getPath(), e); - } - defs = STD_DEFS; - cmdLineNames = STD_STDCMDL; - } - - /** - * Defines a new setting. No setting with the same name already exists. - * @param name the name of the setting - * @param type the type of the setting - * @param merge specifies if when you add a new setting value, and the - * setting has already set, then the new and old value will be merged, - * or the new value will replace old value. Note that only a few - * setting type supports merging, such as list and map. - * @param forceStr specifies if when parsing string values with TDD - * interpreter, it should be done with the "force strings" option or - * not. - */ - public void define( - String name, SettingType type, boolean merge, boolean forceStr) - throws SettingException { - name = name.trim(); - if (defs.containsKey(name)) { - throw new SettingException( - "Setting " + StringUtil.jQuote(name) - + " is already defined."); - } - SettingDefinition def - = new SettingDefinition(name, type, merge, forceStr); - if (defs == STD_DEFS) { - defs = new HashMap(STD_DEFS); - cmdLineNames = new HashMap(STD_STDCMDL); - } - defs.put(def.name, def); - cmdLineNames.put(getDashedName(name), name); - } - - /** - * Returns if a setting with the given name is defined (do not mix it up - * with being set). - * - * @see #define - */ - public boolean isDefined(String name) { - return defs.containsKey(name); - } - - /** - * Returns if the given name is the name of a standard setting. - */ - public static Iterator getStandardSettingNames() { - return Collections.unmodifiableSet(STD_DEFS.keySet()).iterator(); - } - - /** - * Adds a setting value. If a setting value already exists, it will be - * either replaced or merged with the new value, depending on the - * definition of the setting. When merging, the new value has higher - * priority than the old value. - */ - public void add(String name, Object value) throws SettingException { - addOrSet(values, name, value, false); - } - - /** - * Adds a setting value with low priority. If a setting value already - * exists, it will be either kept (and thus the method call has no effect) - * or merged with the new value, depending on the definition of the setting. - * When merging, the new value has lower priorty than the old value. - */ - public void addDefault(String name, Object value) throws SettingException { - addOrSetDefault(values, name, value, false); - } - - /** - * Same as {@link #add(String, Object)}, but uses string value. - */ - public void addWithString(String name, String value) - throws SettingException { - addOrSet(values, name, translateProperty(name, value), false); - } - - /** - * Same as {@link #addDefault(String, Object)}, but uses string value. - */ - public void addDefaultWithString(String name, String value) - throws SettingException { - addOrSetDefault(values, name, translateProperty(name, value), false); - } - - /** - * Adds all name-value pairs stored in the map with - * {@link #add(String, Object)}. - */ - public void add(Map settingMap) throws SettingException { - addOrSet(settingMap, false); - } - - /** - * Adds all entries stored in the map with - * {@link #addDefault(String, Object)}. - */ - public void addDefaults(Map settingMap) throws SettingException { - addOrSetDefaults(settingMap, false); - } - - /** - * Same as {@link #add(Map)}, but uses a Properties object, - * so the values are strings. - */ - public void addWithStrings(Properties props) throws SettingException { - addOrSetWithStrings(props, false); - } - - /** - * Same as {@link #addDefaults(Map)}, but uses a Properties - * object, so the values are strings. - */ - public void addDefaultsWithStrings(Properties props) - throws SettingException { - addOrSetDefaultsWithStrings(props, false); - } - - /** - * Sets the value of a setting. If the setting value already exists, it will - * be replaced (never merged). - */ - public void set(String name, Object value) throws SettingException { - addOrSet(values, name, value, true); - } - - /** - * Convenience method for setting a Boolean value. - */ - public void set(String name, boolean value) throws SettingException { - set(name, value ? Boolean.TRUE : Boolean.FALSE); - } - - /** - * Convenience method for setting an Integer value. - */ - public void set(String name, int value) throws SettingException { - set(name, new Integer(value)); - } - - /** - * Sets the value of a setting if the value doesn't exists yet. - */ - public void setDefault(String name, Object value) throws SettingException { - addOrSetDefault(values, name, value, true); - } - - /** - * Convenience method for setting a Boolean value. - */ - public void setDefault(String name, boolean value) throws SettingException { - setDefault(name, value ? Boolean.TRUE : Boolean.FALSE); - } - - /** - * Convenience method for setting an Integer value. - */ - public void setDefault(String name, int value) throws SettingException { - setDefault(name, new Integer(value)); - } - - /** - * Same as {@link #set(String, Object)}, but uses string value. - */ - public void setWithString(String name, String value) - throws SettingException { - addOrSet(values, name, translateProperty(name, value), true); - } - - /** - * Same as {@link #setDefault(String, Object)}, but uses string value. - */ - public void setDefaultWithString(String name, String value) - throws SettingException { - addOrSetDefault(values, name, translateProperty(name, value), true); - } - - /** - * Sets all name-value pairs stored in the map with - * {@link #set(String, Object)}. - */ - public void set(Map settingMap) throws SettingException { - addOrSet(settingMap, true); - } - - /** - * Sets all name-value pairs stored in the map with - * {@link #setDefault(String, Object)}. - */ - public void setDefaults(Map settingMap) throws SettingException { - addOrSetDefaults(settingMap, true); - } - - /** - * Same as {@link #set(Map)}, but uses a Properties object, - * so the values are strings. - */ - public void setWithStrings(Properties props) throws SettingException { - addOrSetWithStrings(props, true); - } - - /** - * Same as {@link #setDefaults(Map)}, but uses a Properties - * object, so the values are strings. - */ - public void setDefaultsWithStrings(Properties props) - throws SettingException { - addOrSetDefaultsWithStrings(props, true); - } - - /** - * Loads settings from a configuration file. The file will be interpreted - * as legacy properties file if its extension is cfg or - * properties, otherwise it will be interpreted as TDD file. - * The settings stored in the configuration file will be added - * to the this object with {@link #add(Map)}. - * - *

    Note that meta-settings ("configurationBase" and - * "inheritConfiguration") will not be added to the settings object. - * - *

    If the setting "configurationBase" or "inheritConfiguration" is - * set in this setting object, then they will override the - * meta-settings in the file directly loaded with this method. Files - * inherited by the directly loaded file, however, are not affected. - * - * @param cfgFile the configuration file, or the directory of the - * configuration file if its file name is one of the - * default configuration file names. - * - * @see #loadDefaults(File) - */ - public void load(File cfgFile) throws SettingException { - load_common(cfgFile, false); - } - - /** - * Same as {@link #load(File) load}, except that it adds the settings with - * {@link #addDefaults(Map)}. - * - * @see #load(File) - */ - public void loadDefaults(File cfgFile) throws SettingException { - load_common(cfgFile, true); - } - - /** - * Gets the current value of a setting. - * @param name the name of the setting. - * @return The value of the setting, or null if the setting - * is not set. Do not modify the returned object! - */ - public Object get(String name) { - return values.get(name); - } - - /** - * Removes a setting value. - * @return the removed value, or null if there was no - * value stored for the setting. - */ - public Object remove(String name) { - return values.remove(name); - } - - /** - * Lists the names of settings that were set. - */ - public Iterator getNames() { - return values.keySet().iterator(); - } - - /** - * Executes a processing session based on the setting values. - * For each call of this method, a new {@link fmpp.Engine} object will be - * internaly created, and initialized based on the setting values, and then - * its process method will be called. The method automatically - * chooses between bulk and single-file processing, based on the presence of - * the "outputFile" setting. - * - *

    Settings will go throught semantical checks that are not done when - * you call other methods. For example, it will be checked if setting - * "modes" contains valid mode setter function calls, if "sourceRoot" and - * "outputRoot" are defined for bulk mode, if exactly 1 "sources" is defined - * for single-file mode, etc. - * - *

    This method ignores the following settings: - * "logFile", "appendLogFile", "echoFormat", "quiet", "snip". - * It's the task of the embedding software (the front-end) to interpret - * these settings, at least the ones it is interested in. - * It usually involves adding progress listeners with - * {@link #addProgressListener(ProgressListener)}. - * - *

    This method can be called for multiple times, but be aware of - * that for each call of this method, a new {@link fmpp.Engine} - * object will be created and initialized, even if you didn't changed the - * settings since the last call. If this overhead is not acceptable - * in you case, you can call Engine.process(...) for multiple - * times within the same {@link #execute()} call, by overriding the - * {@link #doProcessing(Engine, File[], File, File)} method. - * Also, you can do extra engine initalization there. - * - * @throws SettingException if the settings are not correct, or can't be - * applied because of some errors occured. This exception, when thrown, - * is always thrown before the execution of the processing session is - * stated. - * @throws ProcessingException if Engine.process has - * thrown any exception, that is, there was an error during the - * execution of the processing session. The message of this exception - * holds nothing interesting (just a static text). Call its - * getCause() method to get the exception that caused the - * termination. Note that all (so even non-checked exceptions) thrown be - * the engine are catched and wrapped by this exeption. - */ - public void execute() throws SettingException, ProcessingException { - final Version fmIcI; - { - String s = (String) get(NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS); - if (s != null) { - try { - fmIcI = new Version(s); - } catch (Exception e) { - throw new SettingException("Failed to apply the value of the " - + StringUtil.jQuote(NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS) - + " setting.", e); - } - } else { - fmIcI = null; - } - } - - final BeansWrapper ow; - { - String s = (String) get(NAME_OBJECT_WRAPPER); - if (s != null) { - Object bres; - bsh.Interpreter intp = new bsh.Interpreter(); - try { - intp.eval("import freemarker.template.ObjectWrapper;"); - intp.eval("import freemarker.ext.beans.BeansWrapper;"); - intp.eval("import freemarker.ext.beans.BeansWrapperBuilder;"); - intp.set(NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS, - fmIcI != null ? fmIcI : Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); - bres = intp.eval(s); - } catch (EvalError e) { - throw new SettingException("Failed to apply the value of the " - + StringUtil.jQuote(NAME_OBJECT_WRAPPER) - + " setting.", e); - } - if (bres == null) { - throw new SettingException("Failed to apply the value of the " - + StringUtil.jQuote(NAME_OBJECT_WRAPPER) - + " setting: the result of the setting value " - + "evaluation was null. (The typical reason is that " - + "you forget the \"return\" statement. A rare but " - + "rather evil reason is that you use a \"//\" " - + "comment, and Ant eats the line-breaks, so you " - + "comment out everything after the \"//\".)"); - } - if (!(bres instanceof BeansWrapper)) { - throw new SettingException("Failed to apply the value of the " - + StringUtil.jQuote(NAME_OBJECT_WRAPPER) - + " setting: the class of the resulting object must " - + "extend " + BeansWrapper.class.getName() - + ", but the " + bres.getClass().getName() - + " class doesn't extend it."); - } - ow = (BeansWrapper) bres; - } else { - ow = null; - } - } - - final Engine eng = new Engine(ow, fmIcI); - - String s; - Boolean b; - List ls; - Map m; - File f; - int i; - - eng.setDontTraverseDirectories(dontTraverseDirs); - - b = (Boolean) get(NAME_EXPERT); - if (b != null) { - eng.setExpertMode(b.booleanValue()); - } - - b = (Boolean) get(NAME_CASE_SENSITIVE); - if (b != null) { - eng.setCaseSensitive(b.booleanValue()); - } - - s = (String) get(NAME_LOCALE); - if (s != null) { - eng.setLocale(s); - } - - s = (String) get(NAME_NUMBER_FORMAT); - if (s != null) { - eng.setNumberFormat(s); - } - - s = (String) get(NAME_BOOLEAN_FORMAT); - if (s != null) { - eng.setBooleanFormat(s); - } - - s = (String) get(NAME_DATE_FORMAT); - if (s != null) { - eng.setDateFormat(s); - } - - s = (String) get(NAME_TIME_FORMAT); - if (s != null) { - eng.setTimeFormat(s); - } - - s = (String) get(NAME_DATETIME_FORMAT); - if (s != null) { - eng.setDateTimeFormat(s); - } - - s = (String) get(NAME_TIME_ZONE); - if (s != null) { - eng.setTimeZone(s); - } - - s = (String) get(NAME_SQL_DATE_AND_TIME_TIME_ZONE); - if (s != null) { - eng.setSQLDateAndTimeTimeZone(s); - } - - s = (String) get(NAME_TAG_SYNTAX); - if (s != null) { - if (s.equals(VALUE_TAG_SYNTAX_ANGLE_BRACKET)) { - eng.setTagSyntax(Configuration.ANGLE_BRACKET_TAG_SYNTAX); - } else if (s.equals(VALUE_TAG_SYNTAX_SQUARE_BRACKET)) { - eng.setTagSyntax(Configuration.SQUARE_BRACKET_TAG_SYNTAX); - } else if (s.equals(VALUE_TAG_SYNTAX_AUTO_DETECT)) { - eng.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); - } else { - throw new SettingException("The value of the " - + StringUtil.jQuote(NAME_TAG_SYNTAX) - + " setting should be one of " - + "\"" + VALUE_TAG_SYNTAX_ANGLE_BRACKET - + "\", \"" + VALUE_TAG_SYNTAX_SQUARE_BRACKET - + "\", \"" + VALUE_TAG_SYNTAX_AUTO_DETECT - + "\". Value " + StringUtil.jQuote(s) + " is invalid."); - } - } - - s = (String) get(NAME_SOURCE_ENCODING); - if (s != null) { - eng.setSourceEncoding(s); - } - - s = (String) get(NAME_OUTPUT_ENCODING); - if (s != null) { - eng.setOutputEncoding(s); - } - - s = (String) get(NAME_URL_ESCAPING_CHARSET); - if (s != null) { - eng.setUrlEscapingCharset(s); - } - - s = (String) get(NAME_XPATH_ENGINE); - if (s != null) { - eng.setXpathEngine(s); - } - - b = (Boolean) get(NAME_STOP_ON_ERROR); - if (b != null) { - eng.setStopOnError(b.booleanValue()); - } - - b = (Boolean) get(NAME_ALWAYS_CREATE_DIRECTORIES); - if (b != null) { - eng.setAlwaysCreateDirectories(b.booleanValue()); - } - - b = (Boolean) get(NAME_IGNORE_CVS_FILES); - if (b != null) { - eng.setIgnoreCvsFiles(b.booleanValue()); - } - - b = (Boolean) get(NAME_IGNORE_SVN_FILES); - if (b != null) { - eng.setIgnoreSvnFiles(b.booleanValue()); - } - - b = (Boolean) get(NAME_IGNORE_TEMPORARY_FILES); - if (b != null) { - eng.setIgnoreTemporaryFiles(b.booleanValue()); - } - - Boolean xmlCatalogPreferPublic; - s = (String) get(NAME_XML_CATALOG_PREFER); - if (s != null) { - if (s.equals(VALUE_XML_CATALOG_PREFER_PUBLIC)) { - xmlCatalogPreferPublic = Boolean.TRUE; - } else if (s.equals(VALUE_XML_CATALOG_PREFER_SYSTEM)) { - xmlCatalogPreferPublic = Boolean.FALSE; - } else if (s.equals(VALUE_GLOBAL_DEFAULT)) { - xmlCatalogPreferPublic = null; - } else { - throw new SettingException("The value of the " - + StringUtil.jQuote(NAME_XML_CATALOG_PREFER) - + " setting should be one of " - + "\"" + VALUE_XML_CATALOG_PREFER_PUBLIC - + "\", \"" + VALUE_XML_CATALOG_PREFER_SYSTEM - + "\", \"" + VALUE_GLOBAL_DEFAULT - + "\". Value " + StringUtil.jQuote(s) + " is invalid."); - } - } else { - xmlCatalogPreferPublic = Boolean.TRUE; - } - - /* - Boolean xmlCatalogAllowPi; - s = (String) get(NAME_XML_CATALOG_ALLOW_PI); - if (s != null) { - try { - xmlCatalogAllowPi = StringUtil.stringToBoolean(s) - ? Boolean.TRUE : Boolean.FALSE; - } catch (StringUtil.ParseException e) { - if (s.equals(VALUE_GLOBAL_DEFAULT)) { - xmlCatalogAllowPi = null; - } else { - throw new SettingException("The value of setting " - + StringUtil.jQuote(NAME_XML_CATALOG_ALLOW_PI) - + " should be a valid boolean value or " - + "\"" + VALUE_GLOBAL_DEFAULT + "\". " - + "Value " + StringUtil.jQuote(s) + " is invalid."); - } - } - } else { - xmlCatalogAllowPi = null; - } - */ - - ls = (List) get(NAME_XML_CATALOG_FILES); - if (ls != null) { - try { - loadXmlCatalogs( - eng, - ls, xmlCatalogPreferPublic, null /*xmlCatalogAllowPi*/); - } catch (InstallationException e) { - throw new SettingException("Failed to setup XML catalogs.", e); - } - } - - b = (Boolean) get(NAME_VALIDATE_XML); - if (b != null) { - eng.setValidateXml(b.booleanValue()); - } - - ls = (List) get(NAME_MODES); - if (ls != null) { - try { - loadProcessingModeChoosers(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" + NAME_MODES - + "\" setting.", - e); - } - } - - ls = (List) get(NAME_BORDERS); - if (ls != null) { - try { - loadBorderChoosers(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" + NAME_BORDERS - + "\" setting.", - e); - } - } - - ls = (List) get(NAME_TURNS); - if (ls != null) { - try { - loadTurnChoosers(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" + NAME_TURNS - + "\" setting.", - e); - } - } - - ls = (List) get(NAME_REPLACE_EXTENSIONS); - if (ls != null) { - try { - loadReplaceExtensions(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_REPLACE_EXTENSIONS + "\" setting.", - e); - } - } - - ls = (List) get(NAME_REMOVE_EXTENSIONS); - if (ls != null) { - try { - loadRemoveExtensions(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_REMOVE_EXTENSIONS + "\" setting.", - e); - } - } - - ls = (List) get(NAME_REMOVE_POSTFIXES); - if (ls != null) { - try { - loadRemovePostfixes(eng, ls); - } catch (SettingException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_REMOVE_POSTFIXES + "\" setting.", - e); - } - } - - s = (String) get(NAME_SKIP_UNCHANGED); - if (s != null) { - if (s.equalsIgnoreCase("none")) { - eng.setSkipUnchanged(Engine.SKIP_NONE); - } else if (s.equalsIgnoreCase("all")) { - eng.setSkipUnchanged(Engine.SKIP_ALL); - } else if (s.equalsIgnoreCase("static")) { - eng.setSkipUnchanged(Engine.SKIP_STATIC); - } else { - throw new SettingException( - "The value of the \"" + NAME_SKIP_UNCHANGED - + "\" setting can't be " + StringUtil.jQuote(s) + ". " - + "It should be one of: none, all, static"); - } - } - - // Root directories and source/output files: - - // - single-file mode: - File outputFile = (File) get(NAME_OUTPUT_FILE); - List sources = (List) get(NAME_SOURCES); - if (sources != null) { - sources = new ArrayList(sources); - } - File sourceFile; - if (outputFile != null) { - try { - outputFile = outputFile.getCanonicalFile(); - } catch (IOException e) { - throw new SettingException( - "Failed to bring the output file path to " - + "canonical form: " + outputFile.getPath(), - e); - } - if (outputFile.exists() && outputFile.isDirectory()) { - throw new SettingException( - "The output file can't be a directory: " - + outputFile.getPath()); - } - if (sources == null || sources.size() != 1) { - throw new SettingException( - "Since you have set the \"" - + NAME_OUTPUT_FILE + "\" setting, you must " - + "give exactly 1 source file. " - + (sources == null || sources.size() == 0 - ? "But there was no source file specified." - : "But there were specified " + sources.size() - + " source files.")); - } - sourceFile = ((FileWithConfigurationBase) sources.get(0)); - if (!sourceFile.isAbsolute()) { - sourceFile = new File( - ((FileWithConfigurationBase) sourceFile) - .getConfigurationBase(), - sourceFile.getPath()); - } - try { - sourceFile = sourceFile.getCanonicalFile(); - } catch (IOException e) { - throw new SettingException( - "Failed to bring the source file path to " - + "canonical form: " + sourceFile.getPath(), - e); - } - if (!sourceFile.exists()) { - throw new SettingException( - "Source file not found: " - + sourceFile.getPath()); - } - if (sourceFile.isDirectory()) { - throw new SettingException( - "This source file is not a file, but a directory: " - + sourceFile.getPath()); - } - if (!sourceFile.isFile()) { - throw new SettingException( - "This source file is not a file: " - + sourceFile.getPath()); - } - } else { - sourceFile = null; - } - - // - source root: - f = (File) get(NAME_SOURCE_ROOT); - if (f == null) { - if (sourceFile != null) { - try { - eng.setSourceRoot(sourceFile.getParentFile()); - } catch (IOException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_SOURCE_ROOT - + "\" setting.", - e); - } - } else { - throw new SettingException( - "The \"" + NAME_SOURCE_ROOT + "\" setting was not set. " - + "FMPP can't start working without that."); - } - } else { - if (!f.exists()) { - throw new SettingException( - "Source root directory not found: " - + f.getPath()); - } - if (!f.isDirectory()) { - throw new SettingException( - "This source root directory is not a directoy: " - + f.getPath()); - } - try { - eng.setSourceRoot(f); - } catch (IOException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_SOURCE_ROOT - + "\" setting.", - e); - } - } - - // - convert sources for bulk mode - if (outputFile == null) { - if (sources != null) { - f = eng.getSourceRoot(); - for (i = 0; i < sources.size(); i++) { - File sf = (File) sources.get(i); - if (!sf.isAbsolute()) { - sf = new File(f, sf.getPath()); - sources.set(i, sf); - } - if (i < 4 && !(sf.exists())) { - throw new SettingException( - "Source file or directory not found: " - + ((File) sources.get(i)).getAbsolutePath()); - } - } - } - } - - // - output root: - f = (File) get(NAME_OUTPUT_ROOT); - if (f == null) { - if (outputFile != null) { - try { - eng.setOutputRoot(outputFile.getParentFile()); - } catch (IOException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_OUTPUT_ROOT - + "\" setting.", - e); - } - } else { - throw new SettingException( - "The \"" + NAME_OUTPUT_ROOT + "\" setting was not set. " - + "FMPP can't start working without that."); - } - } else { - if (f.exists() && !f.isDirectory()) { - throw new SettingException( - "This output root directory is not a directoy: " - + f.getPath()); - } - try { - eng.setOutputRoot(f); - } catch (IOException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_OUTPUT_ROOT - + "\" setting.", - e); - } - } - - // - default source: - if (sources == null) { - sources = new ArrayList(1); - sources.add(eng.getSourceRoot()); - } - - // - data root: - f = (File) get(NAME_DATA_ROOT); - if (f != null && !(f instanceof FileWithSettingValue - && ((FileWithSettingValue) f).getSettingValue() - .equals(VALUE_SOURCE) - )) { - try { - eng.setDataRoot(f); - } catch (IOException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_OUTPUT_ROOT - + "\" setting.", - e); - } - } - - // Safety checks - if (!eng.getExpertMode()) { - try { - if (outputFile == null) { - if (eng.getSourceRoot().getCanonicalFile() - .equals(eng.getOutputRoot().getCanonicalFile())) { - throw new SettingException( - "Safety error! The source root and output " - + "root directories are identical. If this is " - + "intentional, use expert mode to allow " - + "this. (Set the \"" + NAME_EXPERT - + "\" setting to true.)"); - } - } else { - if (sourceFile == null) { - throw new BugException("sourceFile == null"); - } - if (outputFile.getCanonicalFile() - .equals(sourceFile.getCanonicalFile())) { - throw new SettingException( - "Safety error! The source and output " - + "files are identical. If this is " - + "intentional, use expert mode to allow " - + "this. (Set the \"" + NAME_EXPERT - + "\" setting to true.)"); - } - } - } catch (IOException e) { - // This can't happen in principle... - throw new SettingException( - "Unexpected path canonicalization error.", e); - } - } - - // Adding FreeMarker links - - m = (Map) get(NAME_FREEMARKER_LINKS); - if (m != null) { - try { - loadFreemarkerLinks(eng, m); - } catch (Exception e) { - throw new SettingException( - "Failed to apply the \"" + NAME_FREEMARKER_LINKS - + "\" setting.", - e); - } - } - - // Adding XML renderings - - ls = (List) get(NAME_XML_RENDERINGS); - if (ls != null && ls.size() != 0) { - try { - loadXmlRenderings(eng, ls); - } catch (InstallationException e) { - throw new SettingException( - "Failed to apply the \"" + NAME_XML_RENDERINGS - + "\" setting.", - e); - } - } - - // Adding attributes - - // B.C.: Don't clean attributes! - Iterator it = engineAttributes.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - eng.setAttribute((String) ent.getKey(), ent.getValue()); - } - - // Adding progress listeners - - // B.C.: Don't clean progress listeners! - it = progressListeners.iterator(); - while (it.hasNext()) { - eng.addProgressListener((ProgressListener) it.next()); - } - - // Data settings. These must set last! - - // - Session level data - - ls = (List) get(NAME_DATA); - if (ls != null) { - eng.clearData(); - Map dataModel = new HashMap(); - for (i = 0; i < ls.size(); i++) { - Object o = ls.get(i); - if (o instanceof String) { - try { - dataModel.putAll(Interpreter.evalAsHash( - (String) o, - new DataLoaderEvaluationEnvironment(eng), - false, - null)); - } catch (EvalException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_DATA + "\" setting.", e); - } - } else if (o instanceof Fragment) { - Fragment fr = (Fragment) o; - try { - o = Interpreter.eval( - fr, - new DataLoaderEvaluationEnvironment(eng), - false); - if (o instanceof Map) { - dataModel.putAll((Map) o); - } else { - if (o != null) { - throw new SettingException( - "The value of the \"" - + NAME_DATA + "\" setting should be a " - + "hash, but it is a " + typeName(o) - + " in " + fr.getFileName() + "."); - } - } - } catch (EvalException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_DATA + "\" setting.", e); - } - } else if (o instanceof Map) { - dataModel.putAll((Map) o); - } else { - throw new BugException("Delayed step call can't be " - + o.getClass().getName()); - } - } - eng.addData(dataModel); - } - - // - Templat data (deprecated) - - s = (String) get(NAME_TEMPLATE_DATA); - if (s != null) { - try { - eng.setTemplateDataModelBuilder(s); - } catch (DataModelBuildingException e) { - throw new SettingException( - "Failed to apply the value of the \"" - + NAME_TEMPLATE_DATA + "\" setting.", - e); - } - } - - // - Local data (this must be the very very last) - - ls = (List) get(NAME_LOCAL_DATA); - if (ls != null) { - eng.clearLocalDataBuilders(); - int layer = 0; - boolean layerUsed = false; - for (i = 0; i < ls.size(); i++) { - Object o = ls.get(i); - if (!(o instanceof FunctionCall)) { - throw new SettingException( - "The value of the \"" + NAME_LOCAL_DATA - + "\" setting must be a sequence of TDD function " - + "calls, but there is an item of type " - + Interpreter.getTypeName(o) + "."); - } - FunctionCall fc = (FunctionCall) o; - if (fc.getName().equals(FUNCTION_LAYER)) { - if (fc.getParams().size() != 0) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: Function " - + "\"" + FUNCTION_LAYER + "\" " - + "doesn't allow arguments, but now it has " - + fc.getParams().size() + " argument(s)."); - } - if (layerUsed) { - layer++; - layerUsed = false; - } - } else if (fc.getName().equals(FUNCTION_CASE)) { - layerUsed = true; - List params = fc.getParams(); - int paramCnt = params.size(); - if (paramCnt < 2) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: Function call " - + "to \"" + FUNCTION_CASE + "\" needs at " - + "least 2 parameters: pathPattern, data"); - } - o = params.get(params.size() - 1); - LocalDataBuilder builder; - if (o instanceof String) { - Object bo; - bsh.Interpreter bship = new bsh.Interpreter(); - try { - bship.set("engine", eng); - bo = bship.eval((String) o); - } catch (EvalError e) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: Failed to " - + "evaluate BeanShell expression.", e); - } - if (!(bo instanceof LocalDataBuilder)) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: BeanShell " - + "expression " - + StringUtil.jQuote((String) o) - + " evaluates to an object which " - + "doesn't implement " - + LocalDataBuilder.class.getName() - + ". (The class of the object is: " - + o.getClass().getName() + ")"); - } - builder = (LocalDataBuilder) bo; - } else if (o instanceof Fragment) { - builder = new TddHashLocalDataBuilder( - (Fragment) o); - } else if (o instanceof Map) { - builder = new MapLocalDataBuilder((Map) o); - } else if (o instanceof FunctionCall) { - FunctionCall fc2 = (FunctionCall) o; - String name = fc2.getName(); - if (name.equals(LOCAL_DATA_BUILDER_BSH)) { - try { - builder = BshLocalDataBuilder - .createInstanceForSetting( - name, fc2.getParams()); - } catch (SettingException e) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting.", e); - } - } else { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: function " - + "call as the last parameter to \"" - + FUNCTION_CASE - + "\" must refer to a predefined local " - + "data builder, but there is no " - + "predefined local data builder with " - + "name \"" + fc2.getName() + "\"."); - } - } else { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA + "\" setting: The last " - + "parameter to function \"" + FUNCTION_CASE - + "\" must be a function call or a hash, but " - + "now it was a " + Interpreter.getTypeName(o) - + "."); - } - for (int x = 0; x < paramCnt - 1; x++) { - o = params.get(x); - if (!(o instanceof String)) { - throw new SettingException( - "Problem with the value of the \"" - + NAME_LOCAL_DATA - + "\" setting: Parameters before the last " - + "parameter to function \"" + FUNCTION_CASE - + "\" must be strings (path patterns), " - + "but parameter at position " + (x + 1) - + " is a " - + (o instanceof Fragment - ? "hash" - : Interpreter.getTypeName(o)) - + "."); - } - eng.addLocalDataBuilder(layer, (String) o, builder); - } - } else { - throw new SettingException( - "Sequence items in the \"" + NAME_LOCAL_DATA - + "\" setting must be a sequence of TDD function " - + "calls to \"" + FUNCTION_LAYER + "\" or \"" - + FUNCTION_CASE + "\", but there is a call to " - + StringUtil.jQuote(fc.getName()) + "."); - } - } - } - - // Processing - - if (outputFile == null) { - int ln = sources.size(); - File[] ss = new File[ln]; - for (i = 0; i < ln; i++) { - ss[i] = (File) sources.get(i); - } - doProcessing(eng, ss, null, null); - } else { - doProcessing(eng, null, sourceFile, outputFile); - } - } - - /** - * Adds a progress listener. The progress listener will be added to the - * internally used {@link fmpp.Engine} object when you call - * {@link #execute()}. - * - * @see #clearProgressListeners() - */ - public void addProgressListener(ProgressListener pl) { - progressListeners.add(pl); - } - - /** - * Removes all progress listeneres. - * - * @see #addProgressListener(ProgressListener) - */ - public void clearProgressListeners() { - progressListeners.clear(); - } - - /** - * Sets an engine attribute. The attribute will be set in the internally - * used {@link fmpp.Engine} object when you call {@link #execute()}. - * - * @return The previous value of the attribute, or null if - * there was no attribute with the given name. - */ - public Object setEngineAttribute(String name, Object value) { - return engineAttributes.put(name, value); - } - - /** - * Reads an engine attribute. - * - * @see #setEngineAttribute(String, Object) - * - * @return null if no attribute exists with the given name. - */ - public Object getEngineAttribute(String name) { - return engineAttributes.get(name); - } - - /** - * Removes an engine attribute. It does nothing if the attribute does not - * exist. - * - * @see #setEngineAttribute(String, Object) - * - * @return The value of the removed attribute or null if there - * was no attribute with the given name. - */ - public Object removeAttribute(String name) { - return engineAttributes.remove(name); - } - - /** - * Removes all engine attributes. - * - * @see #setEngineAttribute(String, Object) - */ - public void clearAttribues() { - engineAttributes.clear(); - } - - /** See {@link Engine#setDontTraverseDirectories(boolean)}. */ - public void setDontTraverseDirectories(boolean dontTraverseDirs) { - this.dontTraverseDirs = dontTraverseDirs; - } - - public boolean getDontTraverseDirectories() { - return dontTraverseDirs; - } - - /** - * Dumps the current content of this object for debugging purposes. - */ - public String dump() { - return Interpreter.dump(values); - } - - /** - * Returns 0 for verbose mode, 1 for quiet mode, 2 for really-quiet mode. - */ - public static int quietSettingValueToInt(String value, String name) - throws SettingException { - if (value == null) { - return 0; - } - if (value.length() == 0) { - return 1; - } else if (value.equals("true")) { - return 1; - } else if (value.equals("false")) { - return 0; - } else if (value.equals(VALUE_REALLY_QUIET)) { - return 2; - } else { - // Backward compatibility - int level; - try { - level = Integer.parseInt(value) + 1; - } catch (NumberFormatException exc) { - level = -123; - } - if (level < 0 || level > 2) { - throw new SettingException("The value of the \"" + name - + "\" setting has to be one of (case insensitive): " - + "\"true\" (or empty string), \"false\", \"" - + VALUE_REALLY_QUIET + "\", but now it was " - + StringUtil.jQuote(value)); - } - return level; - } - } - - /** - * Returns the default configuration file in the directory. - * @return the absolute file, or null if no default - * configuration file exists in the directory. - */ - public static File getDefaultConfigurationFile(File dir) { - File f = new File(dir, Settings.DEFAULT_CFG_FILE_NAME); - if (f.isFile()) { - return f.getAbsoluteFile(); - } else { - f = new File(dir, Settings.DEFAULT_CFG_FILE_NAME_OLD); - if (f.isFile()) { - return f.getAbsoluteFile(); - } else { - return null; - } - } - } - - /** - * Converts legacy dashed setting names to the standard format, as - * source-root to sourceRoot. - * - * @param props the Properties object to convert. - * - * @throws SettingException if no setting with the given name exists. - */ - public void undashNames(Properties props) - throws SettingException { - Enumeration en = props.propertyNames(); - while (en.hasMoreElements()) { - String name = (String) en.nextElement(); - String convertedName = (String) cmdLineNames.get(name); - if (convertedName == null || convertedName.equals(name)) { - if (!defs.containsKey(name)) { - throw newUnknownSettingException(name); - } - } else { - if (props.containsKey(convertedName)) { - throw new SettingException("Setting " - + StringUtil.jQuote(convertedName) - + " was specified twice in the Properties object, " - + "with different but semantically equivalent " - + "names."); - } - props.setProperty(convertedName, props.getProperty(name)); - props.remove(name); - } - } - } - - /** - * Trims all property values. - */ - public void trimValues(Properties props) { - Enumeration en = props.propertyNames(); - while (en.hasMoreElements()) { - String name = (String) en.nextElement(); - String value = props.getProperty(name); - String trimmedValue = value.trim(); - if (!trimmedValue.equals(value)) { - props.setProperty(name, trimmedValue); - } - } - } - - // ------------------------------------------------------------------------- - // Protected - - /** - * Executes the processing session(s) on the {@link fmpp.Engine} level, - * using the already initialized Engine object. - * - *

    By overriding this method, you can - *

      - *
    • call Engine.process(...) for multiple times, so you - * can do multiple processing sessions with the same already - * initialized Engine object. - *
    • do extra Engine initialization. - *
    - * - *

    The inital implementation of this method (that is, the implementation - * in the {@link Settings} class) is something like this: - * - *

    -     * if (outputFile == null) {
    -     *     eng.process(sources);
    -     * } else {
    -     *     eng.process(sourceFile, outputFile);
    -     * }
    - * - *

    Modifying the {@link Settings} object in this method has no effect on - * the Engine object (which is passed in as argument), - * since all settings are already applied on it. If you need to modify the - * Engine object, call its methods directly. - * - *

    An implementation of this method may leak out the initialized - * Engine object for the caller of {@link #execute()}. Also, it - * may does not call Engine.proccess(...), but left it for the - * caller (who has the out-leaked Engine object). These are - * extreme, but otherwise legitimate usages. - * - * @param eng the already initialized Engine object. You may - * do extra addjustments on it. - * @param sources the list of source files, the parameter to - * {@link fmpp.Engine#process(File[])}. It's null if - * the processing session uses outputFile setting. - * @param sourceFile if the session uses outputFile setting, - * then it' the 1st parameter to - * {@link fmpp.Engine#process(File, File)}, otherwise it is null. - * @param outputFile if the session uses outputFile setting, - * then it' the 2nd parameter to - * {@link fmpp.Engine#process(File, File)}, otherwise it is null. - */ - protected void doProcessing( - Engine eng, File[] sources, File sourceFile, File outputFile) - throws SettingException, ProcessingException { - if (outputFile == null) { - eng.process(sources); - } else { - eng.process(sourceFile, outputFile); - } - } - - // ------------------------------------------------------------------------- - // Private - - private void addOrSet(Map m, String name, Object value, boolean set) - throws SettingException { - SettingDefinition def = (SettingDefinition) defs.get(name); - if (def == null) { - throw newUnknownSettingException(name); - } - try { - value = def.type.convert(this, value); - } catch (SettingException e) { - // addjust message - throw new SettingException( - "Problem with the value of setting " - + StringUtil.jQuote(name) + ": " + e.getMessage(), - e.getCause()); - } - if (!set && def.merge) { - Object oldValue = m.get(name); - if (oldValue != null) { - try { - value = def.type.merge(this, oldValue, value); - } catch (SettingException e) { - // addjust message - throw new SettingException( - "Problem with the value of setting " - + StringUtil.jQuote(name) + ": " + e.getMessage(), - e.getCause()); - } - } - } - m.put(name, value); - } - - private void addOrSetDefault(Map m, String name, Object value, boolean set) - throws SettingException { - SettingDefinition def = (SettingDefinition) defs.get(name); - if (def == null) { - throw newUnknownSettingException(name); - } - try { - value = def.type.convert(this, value); - } catch (SettingException e) { - // addjust message - throw new SettingException( - "Problem with the value of setting " - + StringUtil.jQuote(name) + ": " + e.getMessage(), - e.getCause()); - } - Object oldValue = m.get(name); - if (oldValue != null) { - if (!set && def.merge) { - try { - value = def.type.merge(this, value, oldValue); - } catch (SettingException e) { - // addjust message - throw new SettingException( - "Problem with the value of setting " - + StringUtil.jQuote(name) + ": " + e.getMessage(), - e.getCause()); - } - } else { - return; //! - } - } - m.put(name, value); - } - - private void addOrSetWithString( - Map m, String name, String value, boolean set) - throws SettingException { - addOrSet(m, name, translateProperty(name, value), set); - } - - private void addOrSetDefaultWithString( - Map m, String name, String value, boolean set) - throws SettingException { - addOrSetDefault(m, name, translateProperty(name, value), set); - } - - private void addOrSet(Map settingMap, boolean set) throws SettingException { - Map changed = new HashMap(); - Iterator it = settingMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String name = (String) ent.getKey(); - Object value = ent.getValue(); - Object oldValue = values.get(name); - if (oldValue != null) { - changed.put(name, oldValue); - } - addOrSet(changed, name, value, set); - } - values.putAll(changed); - } - - private void addOrSetDefaults(Map settingMap, boolean set) - throws SettingException { - Map changed = new HashMap(); - Iterator it = settingMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String name = (String) ent.getKey(); - Object value = ent.getValue(); - Object oldValue = values.get(name); - if (oldValue != null) { - changed.put(name, oldValue); - } - addOrSetDefault(changed, name, value, set); - } - values.putAll(changed); - } - - private void addOrSetWithStrings(Properties props, boolean set) - throws SettingException { - Map changed = new HashMap(); - Enumeration en = props.propertyNames(); - while (en.hasMoreElements()) { - String name = (String) en.nextElement(); - String value = props.getProperty(name); - Object oldValue = values.get(name); - if (oldValue != null) { - changed.put(name, oldValue); - } - addOrSetWithString(changed, name, value, set); - } - values.putAll(changed); - } - - private void addOrSetDefaultsWithStrings(Properties props, boolean set) - throws SettingException { - Map changed = new HashMap(); - Enumeration en = props.propertyNames(); - while (en.hasMoreElements()) { - String name = (String) en.nextElement(); - String value = props.getProperty(name); - Object oldValue = values.get(name); - if (oldValue != null) { - changed.put(name, oldValue); - } - addOrSetDefaultWithString(changed, name, value, set); - } - values.putAll(changed); - } - - private Object translateProperty(String name, String value) - throws SettingException { - SettingDefinition def = (SettingDefinition) defs.get(name); - if (def == null) { - throw newUnknownSettingException(name); - } - try { - return def.type.convertString(this, value, def.forceStr); - } catch (SettingException e) { - // addjust message - throw new SettingException( - "Problem with the value of setting " - + StringUtil.jQuote(name) + ": " + e.getMessage(), - e.getCause()); - } - } - - private SettingException newUnknownSettingException(String name) { - String s = findSimilar(name); - if (s == null) { - return new SettingException("Unknown setting " - + StringUtil.jQuote(name) + "."); - } else { - return new SettingException("Unknown setting " - + StringUtil.jQuote(name) + ". Maybe you meant to write " - + StringUtil.jQuote(s) + "."); - } - } - - /** - * Converts mixed-case setting name to dashed form, - * as sourceRoot to source-root. - */ - public static String getDashedName(String name) { - int ln = name.length(); - StringBuffer sb = new StringBuffer(ln + 4); - for (int i = 0; i < ln; i++) { - char c = name.charAt(i); - if (Character.isUpperCase(c)) { - sb.append("-"); - c = Character.toLowerCase(c); - } - sb.append(c); - } - return sb.toString(); - } - - private String findSimilar(String name) { - String s; - - s = (String) cmdLineNames.get(name); - if (s != null) { - return s; - } - - String lNameV1 = name.toLowerCase(); - String lNameV2 = lNameV1 + "s"; - String lNameV3 = lNameV1 + "es"; - String lNameV4; - if (lNameV1.endsWith("s")) { - lNameV4 = lNameV1.substring(0, lNameV1.length() - 1); - } else { - lNameV4 = null; - } - String lNameV5; - if (lNameV1.endsWith("es")) { - lNameV5 = lNameV1.substring(0, lNameV1.length() - 2); - } else { - lNameV5 = null; - } - Iterator it = defs.keySet().iterator(); - while (it.hasNext()) { - String dName = (String) it.next(); - String lName = dName.toLowerCase(); - if (lName.equals(lNameV1) - || lName.equals(lNameV2) - || lName.equals(lNameV3) - || (lNameV4 != null && lName.equals(lNameV4)) - || (lNameV5 != null && lName.equals(lNameV5))) { - return dName; - } - } - it = cmdLineNames.keySet().iterator(); - while (it.hasNext()) { - String dName = (String) it.next(); - String lName = dName.toLowerCase(); - if (lName.equals(lNameV1) - || lName.equals(lNameV2) - || lName.equals(lNameV3) - || (lNameV4 != null && lName.equals(lNameV4)) - || (lNameV5 != null && lName.equals(lNameV5))) { - return dName; - } - } - - return null; - } - - private static void stdDef( - String name, SettingType type, boolean merge, boolean forceStr) { - SettingDefinition def = new SettingDefinition( - name, type, merge, forceStr); - if (STD_DEFS.containsKey(def.name)) { - throw new BugException( - "Setting " + StringUtil.jQuote(def.name) - + " is already defined."); - } - STD_DEFS.put(def.name, def); - STD_STDCMDL.put(getDashedName(def.name), def.name); - } - - private static String typeName(Object value) { - if (value instanceof String) { - return "string"; - } else if (value instanceof Number) { - return "number"; - } else if (value instanceof Boolean) { - return "boolean"; - } else if (value instanceof List || value.getClass().isArray() - || value instanceof Vector) { - return "sequence"; - } else if (value instanceof Map || value instanceof Dictionary) { - return "hash"; - } else if (value instanceof FunctionCall) { - return "function call"; - } else { - return value.getClass().getName(); - } - } - - /** - * Backward compatibility hack: renames properties that use - * pre-FMPP 0.9.0 names of settings. - */ - public static void fixVersion08SettingNames(Properties props) - throws SettingException { - fixOldSettingName(props, - OLD_NAME_REMOVE_EXTENSION, - NAME_REMOVE_EXTENSIONS); - fixOldSettingName(props, - OLD_NAME_REMOVE_POSTFIX, - NAME_REMOVE_POSTFIXES); - fixOldSettingName(props, - OLD_NAME_REPLACE_EXTENSION, - NAME_REPLACE_EXTENSIONS); - } - - private static void fixOldSettingName( - Properties props, String oldName, String newName) - throws SettingException { - fixOldSettingName_inner(props, oldName, newName); - fixOldSettingName_inner( - props, - getDashedName(oldName), - getDashedName(newName)); - } - - private static void fixOldSettingName_inner( - Properties props, String oldName, String newName) - throws SettingException { - String s; - s = props.getProperty(oldName); - if (s != null) { - props.remove(oldName); - s = (String) props.setProperty(newName, s); - if (s != null) { - throw new SettingException( - "Old and new setting names are used together: Old \"" - + oldName + "\" and new (use this!) \"" - + newName + "\"."); - } - } - } - - private void load_common(File cfgFile, boolean defaults) - throws SettingException { - File baseOverride = (File) get(NAME_CONFIGURATION_BASE); - File inheritOverride = (File) get(NAME_INHERIT_CONFIGURATION); - Map savedSettings = values; - boolean done = false; - try { - values = new HashMap(); - load_inner(cfgFile, false, baseOverride, inheritOverride); - done = true; - } finally { - if (done) { - Map newSettings = values; - values = savedSettings; - savedSettings = new HashMap(values); - done = false; - try { - if (defaults) { - addDefaults(newSettings); - } else { - add(newSettings); - } - done = true; - } finally { - if (!done) { - values = savedSettings; - } - } - } else { - values = savedSettings; - } - } - } - - /** - * When you call this, the settings map must contain stuff only - * from this loading session. - */ - private void load_inner( - File cfgFile, boolean inherited, - File baseOverride, File inheritOverride) - throws SettingException { - String s; - File f; - boolean tddMode; - - if (cfgFile instanceof FileWithSettingValue - && ((FileWithSettingValue) cfgFile) - .getSettingValue().equals(VALUE_NONE)) { - return; //! - } - - try { - if (cfgFile.isDirectory()) { - f = new File(cfgFile, DEFAULT_CFG_FILE_NAME); - if (!f.exists()) { - f = new File(cfgFile, DEFAULT_CFG_FILE_NAME_OLD); - if (!f.exists()) { - throw new IOException("No file with name \"" - + DEFAULT_CFG_FILE_NAME + "\" or \"" - + DEFAULT_CFG_FILE_NAME_OLD + "\" exists in " - + "this directory: " - + cfgFile.getAbsolutePath()); - } - cfgFile = f; - } else { - cfgFile = f; - } - } - cfgFile = cfgFile.getCanonicalFile(); - s = cfgFile.getName().toLowerCase(); - tddMode = !(s.endsWith(".cfg") || s.endsWith(".properties")); - File inherit; - Map loaded; - if (tddMode) { - String text; - InputStream in = new FileInputStream(cfgFile); - try { - text = Interpreter.loadTdd(in, "ISO-8859-1"); - } finally { - in.close(); - } - FirstPhaseEvaluationEnvironment ee - = new FirstPhaseEvaluationEnvironment(this); - loaded = Interpreter.evalAsHash( - text, ee, false, cfgFile.getAbsolutePath()); - } else { - Properties props = new Properties(); - InputStream in = new FileInputStream(cfgFile); - try { - props.load(in); - } finally { - in.close(); - } - - fixVersion08SettingNames(props); - - undashNames(props); - trimValues(props); - loaded = props; - } - File oldBaseDir = baseDir; - try { - if (baseOverride != null) { - baseDir = baseOverride; - } else { - baseDir = cfgFile.getParentFile().getCanonicalFile(); - f = load_getMetaSetting( - loaded, NAME_CONFIGURATION_BASE, tddMode); - if (f != null) { - baseDir = f; - } - } - loaded.remove(NAME_CONFIGURATION_BASE); - if (!tddMode) { - loaded.remove(getDashedName(NAME_CONFIGURATION_BASE)); - } - - if (inheritOverride != null) { - inherit = inheritOverride; - } else { - inherit = load_getMetaSetting( - loaded, NAME_INHERIT_CONFIGURATION, tddMode); - } - loaded.remove(NAME_INHERIT_CONFIGURATION); - if (!tddMode) { - loaded.remove(getDashedName(NAME_INHERIT_CONFIGURATION)); - } - - if (inherited) { - if (tddMode) { - addDefaults(loaded); - } else { - addDefaultsWithStrings((Properties) loaded); - } - } else { - if (tddMode) { - add(loaded); - } else { - addWithStrings((Properties) loaded); - } - } - - if (inherit != null) { - load_inner(inherit, true, null, null); - } - } finally { - baseDir = oldBaseDir; - } - } catch (Throwable e) { - throw new SettingException( - (inherited - ? "Error loading inherited configuration file: " - : "Error loading configuration file: ") - + cfgFile.getAbsolutePath(), - e); - } - } - - private File load_getMetaSetting(Map m, String name, boolean tddMode) - throws SettingException, IOException { - Object o = m.get(name); - if (!tddMode) { - Object o2 = m.get(getDashedName(name)); - if (o == null) { - o = o2; - } else { - if (o2 != null) { - throw new SettingException("Setting " - + StringUtil.jQuote(name) - + " was specified twice, with different names: " - + StringUtil.jQuote(name) + " and " - + StringUtil.jQuote(getDashedName(name)) + "."); - } - } - } - if (o != null) { - if (!(o instanceof String)) { - throw new SettingException("Setting " - + StringUtil.jQuote(name) - + " must be a string (a path), but now it was a(n) " - + typeName(o) + "."); - } - File f = new File((String) o); - if (f.isAbsolute()) { - return new FileWithSettingValue( - f.getCanonicalPath(), (String) o); - } else { - return new FileWithSettingValue( - new File(baseDir, f.getPath()).getCanonicalPath(), - (String) o); - } - } else { - return null; - } - } - - private static void loadBorderChoosers(Engine eng, List ls) - throws SettingException { - eng.clearFooterChoosers(); - eng.clearHeaderChoosers(); - int layer = 0; - boolean layerUsed = false; - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (!(obj instanceof FunctionCall)) { - throw new SettingException( - "All top-level sequence items must be function calls, " - + "but one of them is a(n) " + typeName(obj) + "."); - } - FunctionCall f = (FunctionCall) obj; - List params = f.getParams(); - Iterator it2 = params.iterator(); - while (it2.hasNext()) { - obj = it2.next(); - if (!(obj instanceof String)) { - throw new SettingException( - "All function call arguments must be strings, " - + "but one of them is a(n) " + typeName(obj) + "."); - } - } - String header = null; - String footer = null; - int i = 0; - if (f.getName().equals("header")) { - if (params.size() < 1) { - throw new SettingException( - "\"header\" function call needs at least " - + "1 argument."); - } - header = (String) params.get(i++); - } else if (f.getName().equals("footer")) { - if (params.size() < 1) { - throw new SettingException( - "\"footer\" function call needs at least " - + "1 argument."); - } - footer = (String) params.get(i++); - } else if (f.getName().equals("border")) { - if (params.size() < 2) { - throw new SettingException( - "\"border\" function call needs at least " - + "2 arguments, but it has " + params.size() - + " argument(s)."); - } - header = (String) params.get(i++); - footer = (String) params.get(i++); - } else if (f.getName().equals(FUNCTION_LAYER)) { - if (params.size() != 0) { - throw new SettingException( - "\"" + FUNCTION_LAYER + "\" function call doesn't " - + "allow arguments, but now it has " + params.size() - + " argument(s)."); - } - if (layerUsed) { - layer++; - layerUsed = false; - } - } else { - throw new SettingException( - "Invalid function: \"" + f.getName() + "\". " - + "Function should be one of: " - + "\"header\", \"footer\", \"border\", \"" + FUNCTION_LAYER + "\"."); - } - if (header != null || footer != null) { - layerUsed = true; - try { - if (i == params.size()) { - if (header != null) { - eng.addHeaderChooser( - layer, "**", header); - } - if (footer != null) { - eng.addFooterChooser( - layer, "**", footer); - } - } else { - for (; i < params.size(); i++) { - if (header != null) { - eng.addHeaderChooser( - layer, (String) params.get(i), header); - } - if (footer != null) { - eng.addFooterChooser( - layer, (String) params.get(i), footer); - } - } - } - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - } - - private static void loadTurnChoosers(Engine eng, List ls) - throws SettingException { - eng.clearTurnChoosers(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (!(obj instanceof FunctionCall)) { - throw new SettingException( - "All top-level sequence items must be function calls, " - + "but one of them is a(n) " + typeName(obj) + "."); - } - FunctionCall f = (FunctionCall) obj; - if (!f.getName().equals("turn")) { - throw new SettingException( - "Only \"turn\" function allowed here, not " - + StringUtil.jQuote(f.getName())); - } - - List params = f.getParams(); - - if (params.size() < 2) { - throw new SettingException( - "\"turn\" function call needs at least " - + "two parameters, but it has " + params.size() - + " parameter(s)."); - } - obj = params.get(0); - if (!(obj instanceof Integer)) { - throw new SettingException( - "The first argument to \"turn\" function call must " - + "be an integer, but it is a(n) " - + typeName(obj) + "."); - } - int turn = ((Integer) obj).intValue(); - for (int i = 1; i < params.size(); i++) { - obj = params.get(i); - if (!(obj instanceof String)) { - throw new SettingException( - "The arguments to \"turn\" function call after " - + "the first argument must be strings, but " - + "one of them is a(n) " + typeName(obj) + "."); - } - try { - eng.addTurnChooser((String) obj, turn); - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - } - - private static void loadRemoveExtensions(Engine eng, List ls) - throws SettingException { - eng.clearRemoveExtensions(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (!(obj instanceof String)) { - throw new SettingException( - "All sequence items must be strings, but " - + "one of the items is a(n) " + typeName(obj) + "."); - } - try { - eng.addRemoveExtension((String) obj); - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - - private static void loadReplaceExtensions(Engine eng, List ls) - throws SettingException { - if (ls.size() % 2 != 0) { - throw new SettingException( - "The number of elements in the sequence " - + "must be even, but it is " + ls.size() + "."); - } - eng.clearReplaceExtensions(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj1 = it.next(); - if (!(obj1 instanceof String)) { - throw new SettingException( - "All sequence items must be strings, but " - + "one of them is a(n) " + typeName(obj1) + "."); - } - Object obj2 = it.next(); - if (!(obj2 instanceof String)) { - throw new SettingException( - "All sequence items must be strings, but " - + "one of them is a(n) " + typeName(obj2) + "."); - } - try { - eng.addReplaceExtension((String) obj1, (String) obj2); - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - - private static void loadRemovePostfixes(Engine eng, List ls) - throws SettingException { - eng.clearRemovePostfixes(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (!(obj instanceof String)) { - throw new SettingException( - "All sequence items must be strings, but " - + "one of them is a(n) " + typeName(obj) + "."); - } - try { - eng.addRemovePostfix((String) obj); - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - - private static void loadProcessingModeChoosers(Engine eng, List ls) - throws SettingException { - eng.clearModeChoosers(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - if (!(obj instanceof FunctionCall)) { - throw new SettingException( - "All sequence items must be function calls, but " - + "one of them is a(n) " + typeName(obj) + "."); - } - FunctionCall f = (FunctionCall) obj; - int pmode; - if (f.getName().equals("execute")) { - pmode = Engine.PMODE_EXECUTE; - } else if (f.getName().equals("copy")) { - pmode = Engine.PMODE_COPY; - } else if (f.getName().equals("ignore")) { - pmode = Engine.PMODE_IGNORE; - } else if (f.getName().equals("renderXml")) { - pmode = Engine.PMODE_RENDER_XML; - } else { - throw new SettingException( - "Invalid function: \"" + f.getName() + "\". " - + "Function should be one of: " - + "\"execute\", \"copy\", \"ignore\"."); - } - List paths = f.getParams(); - Iterator it2 = paths.iterator(); - while (it2.hasNext()) { - obj = it2.next(); - if (!(obj instanceof String)) { - throw new SettingException( - "Arguments to \"" + f.getName() - + "\" function must be strings, but " - + "one of them is a(n) " + typeName(obj) + "."); - } - try { - eng.addModeChooser((String) obj, pmode); - } catch (IllegalArgumentException e) { - throw new SettingException( - "FMPP engine rejects the value.", e); - } - } - } - } - - private static void loadFreemarkerLinks(Engine eng, Map m) - throws IOException, SettingException { - Iterator it = m.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - String name = (String) ent.getKey(); - if (name.startsWith("@")) { - throw new SettingException("The FreeMarker link name itself " - + "can't start with @. The @ prefix is used only when " - + "you refer to a FreeMarker link. For example, if the " - + "link name is \"foo\", then you can refer to it as " - + "<#include '/@foo/something.ftl'>."); - } - List files = (List) ent.getValue(); - int ln = files.size(); - for (int i = 0; i < ln; i++) { - eng.addFreemarkerLink(name, (File) files.get(i)); - } - } - } - - private void loadXmlCatalogs( - Engine eng, List ls, Boolean preferPublic, Boolean allowCatalogPI) - throws InstallationException { - StringBuffer catalogs = new StringBuffer(); - Iterator it = ls.iterator(); - while (it.hasNext()) { - catalogs.append(((File) it.next()).getAbsolutePath()); - if (it.hasNext()) { - catalogs.append(';'); - } - } - - XmlDependentOps xmlOps = getXmlDependentOps("Setup XML catalogs."); - eng.setXmlEntityResolver( - xmlOps.createCatalogResolver( - catalogs.toString(), preferPublic, allowCatalogPI)); - } - - private static final String MSG_XML_RENDERING_OPT_ERROR - = "Problem with the options of an XML rendering in " - + "the \"" + NAME_XML_RENDERINGS + "\" setting: "; - - private void loadXmlRenderings(Engine eng, List ls) - throws SettingException, InstallationException { - String s; - Iterator it = ls.iterator(); - XmlDependentOps xmlOps = getXmlDependentOps("Setup XML renderings."); - while (it.hasNext()) { - Object o = it.next(); - if (!(o instanceof Map)) { - throw new SettingException( - "Problem with the value of a sequence item of " - + "the \"" + NAME_XML_RENDERINGS + "\" setting: " - + "The items of the sequence must be hashes, but " - + "one of the items is a " - + Interpreter.getTypeName(o) + "."); - } - - Map m = (Map) o; - XmlRenderingConfiguration xrc = new XmlRenderingConfiguration(); - - boolean copy; - o = m.get("copy"); - if (o == null) { - copy = false; - } else { - if (!(o instanceof Boolean)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the \"copy\" option must be a " - + "boolean, but now it was a " - + Interpreter.getTypeName(o) + "."); - } - copy = ((Boolean) o).booleanValue(); - } - xrc.setCopy(copy); - - o = m.get("template"); - if (o == null) { - if (!copy) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The \"template\" option must be specified, " + "since the \"copy\" option is unspecified or " + "false."); - } - } else { - if (copy) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "You can't use the \"template\" option together " - + "with the \"copy\" option."); - } - if (!(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the \"template\" option must be a " - + "string, but now it was a " - + Interpreter.getTypeName(o) + "."); - } - xrc.setTemplate((String) o); - } - - o = m.get("xmlns"); - String defaultXmlns; - Map xmlns; - if (o != null) { - if (!(o instanceof Map)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the \"xmlns\" option " - + "must be a hash, but now it was a " - + Interpreter.getTypeName(o) + "."); - } - xmlns = (Map) o; - - o = xmlns.get("D"); - if (o != null && !(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The values stored in the \"xmlns\" " - + "map must be strings, but \"D\" is a " - + Interpreter.getTypeName(o) + "."); - } - defaultXmlns = (String) o; - } else { - xmlns = null; - defaultXmlns = null; - } - - Iterator it2 = m.entrySet().iterator(); - while (it2.hasNext()) { - Map.Entry ent = (Map.Entry) it2.next(); - String name = (String) ent.getKey(); - Object value = ent.getValue(); - if (name.equals("template") || name.equals("copy")) { - ; // do nothing - } else if (name.equals("ifSourceIs")) { - if (!(value instanceof List)) { - o = new ArrayList(1); - ((List) o).add(value); - value = o; - } - Iterator sourcesIt = ((List) value).iterator(); - while (sourcesIt.hasNext()) { - o = sourcesIt.next(); - if (!(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the \"ifSourceIs\" option " - + "must be a sequence of strings, but one " - + "of its items is a " - + Interpreter.getTypeName(o) + "."); - } - xrc.addSourcePathPattern((String) o); - } - } else if (name.equals("ifDocumentElementIs")) { - if (!(value instanceof List)) { - o = new ArrayList(1); - ((List) o).add(value); - value = o; - } - Iterator elementsIt = ((List) value).iterator(); - while (elementsIt.hasNext()) { - o = elementsIt.next(); - if (!(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the " + "\"ifDocumentElementIs\" " + "option must be a sequence strings, but " + "one of its items is a " - + Interpreter.getTypeName(o) + "."); - } - s = (String) o; - int cidx = s.indexOf(':'); - if (cidx == -1) { - xrc.addDocumentElement(defaultXmlns, s); - } else { - String prefix = s.substring(0, cidx); - o = xmlns == null ? null : xmlns.get(prefix); - if (o == null) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of the " - + "\"ifDocumentElementIs\" option uses " + "the " + StringUtil.jQuote(prefix) - + " XML name-space prefix, but that " - + "prefix is not defined with the " + "\"xmlns\" option."); - } - if (!(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "Prefixes defined with the \"xmlns\" " - + "option must be associated with " - + "strings, but the " - + StringUtil.jQuote(prefix) - + " prefix is associated with a " - + Interpreter.getTypeName(o) + "."); - } - xrc.addDocumentElement( - (String) o, s.substring(cidx + 1)); - } - } // while (elementsIt.hasNext()) - } else if (name.equals("localDataBuilder")) { - if (!(value instanceof List)) { - o = new ArrayList(1); - ((List) o).add(value); - value = o; - } - Iterator ldbIt = ((List) value).iterator(); - while (ldbIt.hasNext()) { - o = ldbIt.next(); - if (!(o instanceof String)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "The value of \"localDataBulder\" " - + "must be a string (a BeanShell " - + "expression) but now it was a " - + Interpreter.getTypeName(value) + "."); - } - bsh.Interpreter bship = new bsh.Interpreter(); - try { - bship.set("engine", eng); - o = bship.eval((String) o); - } catch (EvalError e) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "Failed to evaluate the value of " + "\"localDataBulder\" as BeanShell " + "script.", - e); - } - if (!(o instanceof LocalDataBuilder)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "Problem with the value of the " - + "\"localDataBulder\" option: BeanShell " - + "expression " - + StringUtil.jQuote((String) value) - + " evaluates to an object which " - + (o != null - ? "doesn't implement " - + LocalDataBuilder.class - .getName() - + ". (The class of the " + "object is: " - + o.getClass().getName() + ")" - : "is null.")); - } - xrc.addLocalDataBuilder((LocalDataBuilder) o); - } - } else { - if (!xmlOps.isXmlDataLoaderOption(name)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "Unknown option: " + name); - } else { - if (name.equals("namespaceAware")) { - if (Boolean.FALSE.equals(value)) { - throw new SettingException( - MSG_XML_RENDERING_OPT_ERROR - + "It's not allowed to set the " - + "\"namespaceAware\" option to false " - + "for XML renderings."); - } - } - xrc.addXmlDataLoaderOption(name, value); - } - } - } // while hasNext in option entrySet - eng.addXmlRenderingConfiguration(xrc); - } // while hasNext in ls - } - - private XmlDependentOps getXmlDependentOps(String requiredForThis) - throws InstallationException { - if (xmlDependentOps == null) { - MiscUtil.checkXmlSupportAvailability(requiredForThis); - Class cl; - try { - cl = MiscUtil.classForName("fmpp.setting.XmlDependentOpsImpl"); - } catch (ClassNotFoundException e) { - throw new BugException( - "Failed to get fmpp.setting.XmlDependentOpsImpl.", e); - } catch (SecurityException e) { - throw new BugException( - "Failed to get fmpp.setting.XmlDependentOpsImpl.", e); - } - try { - xmlDependentOps = (XmlDependentOps) cl.newInstance(); - } catch (IllegalArgumentException e) { - throw new BugException( - "Failed to instantiate " + "fmpp.setting.XmlDependentOpsImpl", e); - } catch (IllegalAccessException e) { - throw new BugException( - "Failed to instantiate " - + "fmpp.setting.XmlDependentOpsImpl", e); - } catch (InstantiationException e) { - throw new BugException( - "Failed to instantiate " - + "fmpp.setting.XmlDependentOpsImpl", e); - } - } - return xmlDependentOps; - } - - // ------------------------------------------------------------------------- - // Public classes - - private static class SettingDefinition { - private final String name; - private final SettingType type; - private final boolean merge; - private final boolean forceStr; - - private SettingDefinition( - String name, SettingType type, boolean merge, - boolean forceStr) { - this.name = name; - this.type = type; - this.merge = merge; - this.forceStr = forceStr; - } - } - - private static class DataList extends ArrayList { - - private static final long serialVersionUID = 1L; - - public DataList(int initialCapacity) { - super(initialCapacity); - } - - } - - private interface SettingType { - /** - * Converts an object to the type of the setting. - * Warning! Do not modify the value object! - * The method must accept values that were earlier returned by this - * method. - */ - Object convert(Settings settings, Object value) - throws SettingException; - - /** - * Converts a string value to the type of the setting. Ther value is - * already trimmed. - */ - Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException; - - /** - * Merges two setting values. - *

    Warning! Do not modify the value objects! Create new object for - * the merged value. - *

    Both value parameter hold already conver-ed values. - */ - Object merge(Settings settings, Object defValue, Object value) - throws SettingException; - } - - private static class FirstPhaseEvaluationEnvironment - implements EvaluationEnvironment { - private int hashKeyLevel; - private int hashLevel; - private int sequenceLevel; - private int functionCallLevel; - private Settings settings; - private boolean inLocalData; - private boolean inFunctionCase; - - private FirstPhaseEvaluationEnvironment(Settings settings) { - this.settings = settings; - } - - public Object evalFunctionCall(FunctionCall fc, Interpreter ip) - throws Exception { - return fc; - } - - public Object notify( - int event, Interpreter ip, String name, Object extra) - throws SettingException { - if (event == EVENT_ENTER_HASH_KEY) { - hashKeyLevel++; - if (hashKeyLevel == 1) { - if (!settings.defs.containsKey(name)) { - String similar = settings.findSimilar(name); - throw new SettingException( - "No setting with name " - + StringUtil.jQuote(name) + " exists." - + (similar == null - ? "" - : " Maybe you meant to write " - + StringUtil.jQuote(similar) - + ".")); - } - if (name.equals(NAME_DATA)) { - return RETURN_FRAGMENT; - } - if (name.equals(NAME_LOCAL_DATA)) { - inLocalData = true; - } - } - } else if (event == EVENT_LEAVE_HASH_KEY) { - hashKeyLevel--; - if (hashKeyLevel == 0) { - inLocalData = false; - } - } else if (event == EVENT_ENTER_SEQUENCE) { - sequenceLevel++; - } else if (event == EVENT_LEAVE_SEQUENCE) { - sequenceLevel--; - } else if (event == EVENT_ENTER_HASH) { - hashLevel++; - if (inFunctionCase && sequenceLevel == 1 && hashLevel == 2 - && functionCallLevel == 1) { - return RETURN_FRAGMENT; - } - } else if (event == EVENT_LEAVE_HASH) { - hashLevel--; - } else if (event == EVENT_ENTER_FUNCTION_PARAMS) { - functionCallLevel++; - if (inLocalData && sequenceLevel == 1 && hashLevel == 1 - && functionCallLevel == 1 - && name.equals(FUNCTION_CASE)) { - inFunctionCase = true; - } - } else if (event == EVENT_LEAVE_FUNCTION_PARAMS) { - functionCallLevel--; - if (functionCallLevel == 0) { - inFunctionCase = false; - } - } - return null; - } - } - - private static class SequenceSettingType implements SettingType { - - public Object convert(Settings settings, Object value) - throws SettingException { - if (value instanceof List) { - return value; - } - if (value instanceof Vector) { - return new ArrayList((Vector) value); - } - if (value.getClass().isArray()) { - int ln = Array.getLength(value); - List ls = new ArrayList(ln); - for (int i = 0; i < ln; i++) { - ls.add(Array.get(value, i)); - } - return ls; - } - List ls = new ArrayList(1); - ls.add(value); - return ls; - } - - public Object convertString( - Settings settings, String value, boolean forceStr) - throws SettingException { - List ls; - try { - ls = Interpreter.evalAsSequence( - value, getEvaluationEnvironment(), forceStr, null); - } catch (EvalException e) { - throw new SettingException( - "Failed to parse the text as TDD sequence.", e); - } - // To let things work even if the user does this mistake: - // --some-sequ-option="[foo, bar, baz]" - // instead of - // --some-sequ-option="foo, bar, baz" - if (ls.size() == 1 && ls.get(0) instanceof List) { - return ls.get(0); - } - return ls; - } - - public Object merge(Settings settings, Object defValue, Object value) - throws SettingException { - List l1 = (List) defValue; - List l2 = (List) value; - List ls = new ArrayList(l1.size() + l2.size()); - ls.addAll(l2); - ls.addAll(l1); - return ls; - } - - protected EvaluationEnvironment getEvaluationEnvironment() { - return null; - } - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/setting/XmlDependentOps.java b/fmpp/src/main/java/fmpp/setting/XmlDependentOps.java deleted file mode 100644 index 7e4cb6b..0000000 --- a/fmpp/src/main/java/fmpp/setting/XmlDependentOps.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -/** - * Encapsulates operations that dependend on J2SE 1.4 XML related classes. - * These are separated to prevent linkage errors when XML related - * classes are not available. - */ -interface XmlDependentOps { - Object createCatalogResolver( - String catalogs, Boolean preferPublic, Boolean allowCatalogPI); - - boolean isXmlDataLoaderOption(String optionName); -} diff --git a/fmpp/src/main/java/fmpp/setting/XmlDependentOpsImpl.java b/fmpp/src/main/java/fmpp/setting/XmlDependentOpsImpl.java deleted file mode 100644 index ae681d4..0000000 --- a/fmpp/src/main/java/fmpp/setting/XmlDependentOpsImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.setting; - -import java.util.Vector; - -import org.apache.xml.resolver.CatalogManager; -import org.apache.xml.resolver.tools.CatalogResolver; - -import fmpp.dataloaders.XmlDataLoader; - -/** - * Encapsulates operations that dependend on J2SE 1.4 XML related classes. - * These are separated to prevent linkage errors when XML related - * classes are not available. - */ -class XmlDependentOpsImpl implements XmlDependentOps { - - public Object createCatalogResolver( - String catalogs, Boolean preferPublic, Boolean allowCatalogPI) { - CatalogManager cm = new CatalogManager(); - cm.setIgnoreMissingProperties(true); - //cm.setVerbosity(9); - cm.setUseStaticCatalog(false); - if (preferPublic != null) { - cm.setPreferPublic(preferPublic.booleanValue()); - } - if (allowCatalogPI != null) { - cm.setAllowOasisXMLCatalogPI(allowCatalogPI.booleanValue()); - } - if (catalogs != null && catalogs.length() != 0) { - StringBuffer sb; - Vector v = cm.getCatalogFiles(); - if (v != null) { - sb = new StringBuffer(); - for (int i = 0; i < v.size(); i++) { - if (i != 0) { - sb.append(';'); - } - sb.append((String) v.get(i)); - } - } else { - sb = null; - } - if (sb != null && sb.length() != 0) { - cm.setCatalogFiles(catalogs + ";" + sb); - } else { - cm.setCatalogFiles(catalogs); - } - } - return new CatalogResolver(cm); - } - - public boolean isXmlDataLoaderOption(String optionName) { - return XmlDataLoader.isOptionName(optionName); - } -} diff --git a/fmpp/src/main/java/fmpp/setting/package.html b/fmpp/src/main/java/fmpp/setting/package.html deleted file mode 100644 index c57ef58..0000000 --- a/fmpp/src/main/java/fmpp/setting/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -

    FMPP settings. FMPP settings is an abstraction over the FMPP core that - helps to write tools (front-ends) that can share configuration information, and - has similar setup rules from the view point of tool user. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tdd/DataLoader.java b/fmpp/src/main/java/fmpp/tdd/DataLoader.java deleted file mode 100644 index 349c3e6..0000000 --- a/fmpp/src/main/java/fmpp/tdd/DataLoader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import java.util.List; - -import fmpp.Engine; - -/** - * Creates an object that will be accessed in FreeMarker templates. The typical - * usage is with the "data" setting, to load data from external sources as - * XML files, databases, etc. Different implementations of this interface know - * different kind of sources. - * - *

    Life-cycle: Data loaders are short-lived objects. They are created - * when the data has to load, and then they are discarded immediately, not - * reused. That is, the {@link #load} method is typically (but not by all means) - * invoked only once. If a data loader needs to maintain state during a - * processing session (such as cache data, pool connections, etc.) it should use - * engine attributes for that purpose (see {@link Engine#setAttribute}). - */ -public interface DataLoader { - /** - * @param args Arguments that the caller specifies for this directive call. - * Not null. - * The implementation should check if it understands all arguments, - * and it should throw java.lang.IllegalArgumentException - * if it doesn't. - * @return The object that will be accessed in FreeMarker templates. - * The object can be of any type. FreeMarker will wrap the object so - * that it is visible as an FTL variable. However, if the object - * implements freemarker.template.TemplateModel, then it - * will not be wrapped, as it is already an FTL variable. - */ - Object load(Engine e, List args) throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/tdd/DataLoaderEvaluationEnvironment.java b/fmpp/src/main/java/fmpp/tdd/DataLoaderEvaluationEnvironment.java deleted file mode 100644 index f265758..0000000 --- a/fmpp/src/main/java/fmpp/tdd/DataLoaderEvaluationEnvironment.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import fmpp.DataModelBuildingException; -import fmpp.Engine; -import fmpp.util.StringUtil; - -/** - * Evaluates function calls as data loader invocations. - */ -public class DataLoaderEvaluationEnvironment implements EvaluationEnvironment { - - private final Engine eng; - private final List mapStack = new ArrayList(); - private int disableMapStacking; - - public DataLoaderEvaluationEnvironment(Engine eng) { - this.eng = eng; - } - - public Object evalFunctionCall(FunctionCall fc, Interpreter ip) - throws Exception { - if (fc.getName().equals("get")) { - Map m = null; - List args = fc.getParams(); - int ln = args.size(); - for (int i = 0; i < ln; i++) { - Object o = args.get(i); - if (!(o instanceof String)) { - throw new DataModelBuildingException( - "Parameters to function \"get\" must be strings, " - + "but parameter at position " + (i + 1) + " is a " + Interpreter.getTypeName(o) + "."); - } - String name = (String) o; - if (m == null) { - o = findTopLevelVariable(name); - } else { - o = m.get(name); - } - if (o == null) { - if (i == 0) { - throw new DataModelBuildingException( - "No variable with name " - + StringUtil.jQuote(name) + " exists."); - } else { - throw new DataModelBuildingException( - "No sub-variable with name " - + StringUtil.jQuote(name) + " exists " - + "(referred by parameter at position " - + (i + 1) + ")."); - } - } - if (i == ln - 1) { - return o; //! - } - if (!(o instanceof Map)) { - throw new DataModelBuildingException( - "Parameter at position " + (i + 1) - + " must be the name of a hash variable, but " + "it is the name of a " - + Interpreter.getTypeName(o) + " variable."); - } - m = (Map) o; - } - throw new DataModelBuildingException( - "Function \"get\" needs at least 1 arguments. " - + "get(name, subName, subSubName, ...)"); - } else { - return TddUtil.getDataLoaderInstance( - eng, - fc.getName()).load(eng, fc.getParams()); - } - } - - /** - * Override this to help TDD get function to find top level - * variables. The default implementation finds top-level variables already - * created in the executing TDD expression, and then it tries to get the - * variable with {@link Engine#getData(String)}. - * - * @return the value of variable, or null if no variable - * with the given name exists. - */ - protected Object findTopLevelVariable(String name) { - for (int x = mapStack.size() - 1; x >= 0; x--) { - Object o = ((Map) mapStack.get(x)).get(name); - if (o != null) { - return o; - } - } - return eng.getData(name); - } - - public Object notify( - int event, Interpreter ip, String name, Object extra) { - if (event == EVENT_ENTER_SEQUENCE - || event == EVENT_ENTER_FUNCTION_PARAMS) { - disableMapStacking++; - } else if (event == EVENT_LEAVE_SEQUENCE - || event == EVENT_LEAVE_FUNCTION_PARAMS) { - disableMapStacking--; - } else if (disableMapStacking == 0) { - if (event == EVENT_ENTER_HASH) { - mapStack.add(extra); - } else if (event == EVENT_LEAVE_HASH) { - mapStack.remove(mapStack.size() - 1); - } - } - return null; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tdd/EvalException.java b/fmpp/src/main/java/fmpp/tdd/EvalException.java deleted file mode 100644 index 884ad99..0000000 --- a/fmpp/src/main/java/fmpp/tdd/EvalException.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import fmpp.util.ExceptionCC; -import fmpp.util.StringUtil; - -public class EvalException extends ExceptionCC { - public EvalException(String message) { - super(message); - } - - public EvalException(String message, Throwable cause) { - super(message, cause); - } - - public EvalException(String message, int position) { - super(message + StringUtil.LINE_BREAK - + "Error location: character " + (position + 1)); - } - - public EvalException(String message, int position, Throwable cause) { - super(message + StringUtil.LINE_BREAK - + "Error location: character " + (position + 1), - cause); - } - - public EvalException( - String message, String text, int position, String fileName) { - super(StringUtil.createSourceCodeErrorMessage( - message, text, position, fileName, 56)); - } - - public EvalException( - String message, String text, int position, String fileName, - Throwable cause) { - super(StringUtil.createSourceCodeErrorMessage( - message, text, position, fileName, 56), - cause); - } -} diff --git a/fmpp/src/main/java/fmpp/tdd/EvaluationEnvironment.java b/fmpp/src/main/java/fmpp/tdd/EvaluationEnvironment.java deleted file mode 100644 index 49c810e..0000000 --- a/fmpp/src/main/java/fmpp/tdd/EvaluationEnvironment.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -/** - * Callbacks that let you control the behaviour of TDD expression evaluation. - */ -public interface EvaluationEnvironment { - /** - * The code of event that indicates that we have started to evaluate the - * value in a key:value pair. - */ - int EVENT_ENTER_HASH_KEY = 1; - - /** - * The code of event that indicates that we have finished to evaluate the - * value in a key:value pair. - */ - int EVENT_LEAVE_HASH_KEY = -1; - - /** - * The code of event that indicates that we have started to evaluate the - * parameter list in a function call. - */ - int EVENT_ENTER_FUNCTION_PARAMS = 3; - - /** - * The code of event that indicates that we have finished to evaluate the - * parameter list in a function call. - */ - int EVENT_LEAVE_FUNCTION_PARAMS = -3; - - /** - * The code of event that indicates that we have started to evaluate the - * items in a sequence. This does not include function call parameter lists. - */ - int EVENT_ENTER_SEQUENCE = 4; - - /** - * The code of event that indicates that we have finished to evaluate the - * items in a sequence. - */ - int EVENT_LEAVE_SEQUENCE = -4; - - - /** - * The code of event that indicates that we have started to evaluate the - * items in a hash. - */ - int EVENT_ENTER_HASH = 5; - - /** - * The code of event that indicates that we have finished to evaluate the - * items in a sequence. - */ - int EVENT_LEAVE_HASH = -5; - - Object RETURN_SKIP = new Object(); - - Object RETURN_FRAGMENT = new Object(); - - /** - * Evaluates the function call. This method may simply returns its - * parameter, which means that the function was not resolved, and thus the - * function call will be availble for further interpretation in the result - * of the TDD expression evaluation. - * - * @param fc the function call to evaluate. - * - * @return the return value of the function call. During the evaluation of - * a TDD expression, function calls will be replaced with their return - * values. - * If the return value is a {@link FunctionCall} object, it will not be - * evaluated again. This way, the final result of a TDD expression - * evaluation can contain {@link FunctionCall} objects. - */ - Object evalFunctionCall(FunctionCall fc, Interpreter ip) throws Exception; - - /** - * Notifies about an event during expression evaluation. - * - * @param event An EVENT_... constant. Further events may will - * be added later, so the implementation must silently ignore events - * that it does not know. It is guaranteed that for each - * EVENT_ENTER_... event there will be an - * EVENT_LEAVE_... event later, except if - * notifyContextChange has thrown exception during handling - * EVENT_ENTER_..., in which case it is guaranteed that - * there will be no corresponding EVENT_LEAVE_... event. - * @param ip the {@link Interpreter} instance that evaluates the text. - * The value returned by {@link Interpreter#getPosition()} will be - * the position in the text where the this even has been created: - *

      - *
    • {@link #EVENT_ENTER_HASH_KEY}: points the first character - * of the value of the key:value pair. - *
    • {@link #EVENT_ENTER_SEQUENCE}, {@link #EVENT_ENTER_HASH}, and - * {@link #EVENT_ENTER_FUNCTION_PARAMS}: points the first - * character after the [ and ( respectively. - *
    • {@link #EVENT_LEAVE_SEQUENCE}, {@link #EVENT_LEAVE_HASH}, and - * {@link #EVENT_LEAVE_FUNCTION_PARAMS}: points the - * terminating character, that is, the ] or ) - * or the character after the end of the string. - *
    - * @param name For {@link #EVENT_ENTER_HASH_KEY} and - * {@link #EVENT_ENTER_FUNCTION_PARAMS}, the name of the hash key or - * function. It is null otherwise. - * @param extra Even specific extra information. - *
      - *
    • For {@link #EVENT_ENTER_HASH}, {@link #EVENT_LEAVE_HASH}, - * {@link #EVENT_ENTER_SEQUENCE}, {@link #EVENT_LEAVE_SEQUENCE} it - * is the Map or List that is being - * built by the hash or sequence. It's OK to modify this - * Map or List. - *
    • For other events it's - * value is currently null. - *
    - * @return return The allowed return values and their meaning depends on - * the event. But return value null always means - * "do nothing special". The currently defiend non-null - * return values for the events: - *
      - *
    • {@link #EVENT_ENTER_HASH_KEY}: - *
        - *
      • {@link #RETURN_SKIP}: Skip the key:value - * pair. That is, the key:value pair will not be added to - * the map. The value expression will not be evaluated. - *
      • {@link #RETURN_FRAGMENT}: The value of the key:value pair - * will be the {@link Fragment} that stores the value - * expression. The value expression will not be evaluated. - * However, if the value is implicit boolean - * true, (i.e. you omit the value) then - * {@link #RETURN_FRAGMENT} has no effect. - *
      - *
    • - *
    • {@link #EVENT_ENTER_HASH} if the hash uses { and - * }): - *
        - *
      • {@link #RETURN_FRAGMENT}: The value of the hash will be - * the {@link Fragment} that stores the hash expression. - * The hash expression will not be evaluated. - *
      - *
    • - *
    - */ - Object notify(int event, Interpreter ip, String name, Object extra) - throws Exception; -} diff --git a/fmpp/src/main/java/fmpp/tdd/Fragment.java b/fmpp/src/main/java/fmpp/tdd/Fragment.java deleted file mode 100644 index cfbd3ae..0000000 --- a/fmpp/src/main/java/fmpp/tdd/Fragment.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -/** - * Fragment extracted from a TDD expression. - */ -public class Fragment { - private final String text; - private final int fragmentStart; - private final int fragmentEnd; - private final String fileName; - - /** - * Creates new TDD fragment. - * - * @param text the full TDD text that contains the fragment. (In extreme - * case the fragment and the full text is the same.) - * @param fragmentStart the start index of the fragment in the text. - * @param fragmentEnd the start index of the fragment in the text - * @param fileName the name of the file the text comes from (for - * informational purposes only). It can be null if the source - * file is unknown or there is no source file. - */ - public Fragment( - String text, int fragmentStart, int fragmentEnd, String fileName) { - this.text = text; - this.fragmentStart = fragmentStart; - this.fragmentEnd = fragmentEnd; - this.fileName = fileName; - } - - /** - * Returns the name of the file the text comes from (for informational - * purposes only). It can be null if the source file is unknown - * or there is no source file. - */ - public String getFileName() { - return fileName; - } - - /** - * Returns the full TDD text that contains the fragmet. - */ - public String getText() { - return text; - } - - /** - * Returns the start index of the fragment in the text. - */ - public int getFragmentStart() { - return fragmentStart; - } - - /** - * Returns the end index (exclusive) of the fragment in the text. - */ - public int getFragmentEnd() { - return fragmentEnd; - } - - /** - * Returns the fragment text. - */ - public String toString() { - return text.substring(fragmentStart, fragmentEnd); - } -} diff --git a/fmpp/src/main/java/fmpp/tdd/FunctionCall.java b/fmpp/src/main/java/fmpp/tdd/FunctionCall.java deleted file mode 100644 index 40ebccf..0000000 --- a/fmpp/src/main/java/fmpp/tdd/FunctionCall.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import java.util.List; - -/** - * Symbolizes a TDD function call. - * Function calls that are not evaluated during the evaluation of a TDD - * expressions will be present in the result as the instances of this class. - */ -public class FunctionCall { - private final String name; - private final List params; - - public FunctionCall(String name, List params) { - this.name = name; - this.params = params; - } - - public String getName() { - return name; - } - - public List getParams() { - return params; - } - - public String toString() { - return Interpreter.dump(this); - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tdd/Interpreter.java b/fmpp/src/main/java/fmpp/tdd/Interpreter.java deleted file mode 100644 index cb96529..0000000 --- a/fmpp/src/main/java/fmpp/tdd/Interpreter.java +++ /dev/null @@ -1,1728 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import fmpp.util.BugException; -import fmpp.util.FileUtil; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; - -/** - * Evaluates TDD expressions. - */ -public class Interpreter { - - /** - * Evaluates function calls to itself. - */ - public static final EvaluationEnvironment SIMPLE_EVALUATION_ENVIRONMENT - = new EvaluationEnvironment() { - public Object evalFunctionCall(FunctionCall f, Interpreter ip) { - return f; - } - - public Object notify( - int event, Interpreter ip, String name, Object extra) { - return null; - } - }; - - private static final boolean[] UQSTR_CHARS = { - true, // NUL (0) - true, // SOH (1) - true, // STX (2) - true, // ETX (3) - true, // EOT (4) - true, // ENQ (5) - true, // ACK (6) - true, // BEL (7) - true, // BS (8) - false, // HT (9) - false, // LF (10) - false, // VT (11) - false, // FF (12) - false, // CR (13) - true, // SO (14) - true, // SI (15) - true, // DLE (16) - true, // DC1 (17) - true, // DC2 (18) - true, // DC2 (19) - true, // DC4 (20) - true, // NAK (21) - true, // SYN (22) - true, // ETB (23) - true, // CAN (24) - true, // EM (25) - true, // SUB (26) - true, // ESC (27) - true, // FS (28) - true, // GS (29) - true, // RS (30) - true, // US (31) - false, // SP (32) - true, // ! (33) - false, // " (34) - true, // # (35) - true, // $ (36) - true, // % (37) - true, // & (38) - false, // ' (39) - false, // ( (40) - false, // ) (41) - true, // * (42) - false, // + (43) - false, // , (44) - true, // - (45) - true, // . (46) - true, // / (47) - true, // 0 (48) - true, // 1 (49) - true, // 2 (50) - true, // 3 (51) - true, // 4 (52) - true, // 5 (53) - true, // 6 (54) - true, // 7 (55) - true, // 8 (56) - true, // 9 (57) - false, // : (58) - false, // ; (59) - false, // < (60) - false, // = (61) - false, // > (62) - true, // ? (63) - true, // @ (64) - true, // A (65) - true, // B (66) - true, // C (67) - true, // D (68) - true, // E (69) - true, // F (70) - true, // G (71) - true, // H (72) - true, // I (73) - true, // J (74) - true, // K (75) - true, // L (76) - true, // M (77) - true, // N (78) - true, // O (79) - true, // P (80) - true, // Q (81) - true, // R (82) - true, // S (83) - true, // T (84) - true, // U (85) - true, // V (86) - true, // W (87) - true, // X (88) - true, // Y (89) - true, // Z (90) - false, // [ (91) - true, // \ (92) - false, // ] (93) - true, // ^ (94) - true, // _ (95) - true, // ` (96) - true, // a (97) - true, // b (98) - true, // c (99) - true, // d (100) - true, // e (101) - true, // f (102) - true, // g (103) - true, // h (104) - true, // i (105) - true, // j (106) - true, // k (107) - true, // l (108) - true, // m (109) - true, // n (110) - true, // o (111) - true, // p (112) - true, // q (113) - true, // r (114) - true, // s (115) - true, // t (116) - true, // u (117) - true, // v (118) - true, // w (119) - true, // x (120) - true, // y (121) - true, // z (122) - false, // { (123) - true, // | (124) - false, // } (125) - true, // ~ (126) - true, // (127) - true, // (128) - true, // (129) - true, // (130) - true, // (131) - true, // (132) - false, // NEL (133) - true, // (134) - true, // (135) - true, // (136) - true, // (137) - true, // (138) - true, // (139) - true, // (140) - true, // (141) - true, // (142) - true, // (143) - true, // (144) - true, // (145) - true, // (146) - true, // (147) - true, // (148) - true, // (149) - true, // (150) - true, // (151) - true, // (152) - true, // (153) - true, // (154) - true, // (155) - true, // (156) - true, // (157) - true, // (158) - true, // (159) - false // NBSP (160) - }; - - private int p; - private int ln; - EvaluationEnvironment ee; - private String tx; - private String fileName; - private boolean skipWSFoundNL; - - private Interpreter() { - } - - // ------------------------------------------------------------------------- - // Public static methods - - /** - * Evaluates text as single TDD expression. - * - * @param text the text to interpret. - * @param ee the {@link EvaluationEnvironment} used to resolve function - * calls. If it is null then - * {@link #SIMPLE_EVALUATION_ENVIRONMENT} will be used. - * @param forceStringValues specifies if expressions as true and - * 123 should be interpreted as strings, or as boolean and - * number respectively. - * @param fileName the path of the source file, or other description of the - * source. It is used for informative purposes only, as in error - * messages. - * - * @return the result of the evaluation. Possibly an empty - * Map, but never null. - */ - public static Object eval( - String text, EvaluationEnvironment ee, boolean forceStringValues, - String fileName) throws EvalException { - Interpreter ip = new Interpreter(); - ip.init(text, fileName, ee); - ip.skipWS(); - if (ip.p == ip.ln) { - throw ip.newSyntaxError("The text is empty."); - } - Object res = ip.fetchExpression(forceStringValues, false); - ip.skipWS(); - if (ip.p < ip.ln) { - throw ip.newSyntaxError("Extra character(s) after the expression."); - } - return res; - } - - /** - * Evaluates a {@link Fragment} as single TDD expression. The expression - * can be surrounded with superfluous white-space. - * - * @see #eval(String, EvaluationEnvironment, boolean, String) - */ - public static Object eval( - Fragment fragment, - EvaluationEnvironment ee, boolean forceStringValues) - throws EvalException { - Interpreter ip = new Interpreter(); - ip.init(fragment, ee); - ip.skipWS(); - if (ip.p == ip.ln) { - throw ip.newSyntaxError("The text is empty."); - } - Object res = ip.fetchExpression(forceStringValues, false); - ip.skipWS(); - if (ip.p < ip.ln) { - throw ip.newSyntaxError("Extra character(s) after the expression."); - } - return res; - } - - /** - * Same as eval(text, null, false, fileName). - * @see #eval(String, EvaluationEnvironment, boolean, String) - */ - public static Object eval(String text, String fileName) - throws EvalException { - return eval(text, null, false, fileName); - } - - /** - * Same as eval(text, null, false, null). - * @see #eval(String, EvaluationEnvironment, boolean, String) - */ - public static Object eval(String text) - throws EvalException { - return eval(text, null, false, null); - } - - /** - * Evaluates text as a list of key:value pairs. - * - * @param text the text to interpret. - * @param ee the {@link EvaluationEnvironment} used to resolve function - * calls. If it is null then - * {@link #SIMPLE_EVALUATION_ENVIRONMENT} will be used. - * @param forceStringValues specifies if expressions as true and - * 123 should be interpreted as strings, or as boolean and - * number respectively. - * @param fileName the path of the source file, or other description of the - * source. It is used for informative purposes only, as in error - * messages. - * - * @return the result of the evaluation. Possibly an empty - * Map, but never null. - */ - public static Map evalAsHash( - String text, EvaluationEnvironment ee, boolean forceStringValues, - String fileName) throws EvalException { - Interpreter ip = new Interpreter(); - ip.init(text, fileName, ee); - Map res = new HashMap(); - boolean done = false; - try { - try { - ip.ee.notify( - EvaluationEnvironment.EVENT_ENTER_HASH, - ip, null, res); - done = true; - } catch (Throwable e) { - throw ip.newWrappedError(e); - } - return ip.fetchHashInner(res, (char) 0x20, forceStringValues); - } finally { - if (done) { - try { - ip.ee.notify( - EvaluationEnvironment.EVENT_LEAVE_HASH, - ip, null, res); - } catch (Throwable e) { - throw ip.newWrappedError(e); - } - } - } - } - - /** - * Same as evalAsHash(text, null, false, null). - * @see #evalAsHash(String, EvaluationEnvironment, boolean, String) - */ - public static Map evalAsHash(String text) throws EvalException { - return evalAsHash(text, null, false, null); - } - - /** - * Same as evalAsHash(text, null, false, fileName). - * @see #evalAsHash(String, EvaluationEnvironment, boolean, String) - */ - public static Map evalAsHash(String text, String fileName) - throws EvalException { - return evalAsHash(text, null, false, fileName); - } - - /** - * Evaluates text as a list values. - * - * @param text the text to interpret. - * @param ee the {@link EvaluationEnvironment} used to resolve function - * calls. If it is null then - * {@link #SIMPLE_EVALUATION_ENVIRONMENT} will be used. - * @param forceStringValues specifies if expressions as true and - * 123 should be interpreted as strings, or as boolean and - * number respectively. - * @param fileName the path of the source file, or other description of the - * source. It is used for informative purposes only, as in error - * messages. - * - * @return the result of the evaluation. Possibly an empty - * List, but never null. - */ - public static List evalAsSequence( - String text, EvaluationEnvironment ee, boolean forceStringValues, - String fileName) throws EvalException { - Interpreter ip = new Interpreter(); - ip.init(text, fileName, ee); - List res = new ArrayList(); - boolean done = false; - try { - try { - ip.ee.notify( - EvaluationEnvironment.EVENT_ENTER_SEQUENCE, - ip, null, res); - done = true; - } catch (Throwable e) { - throw ip.newWrappedError(e); - } - return ip.fetchSequenceInner(res, (char) 0x20, forceStringValues); - } finally { - if (done) { - try { - ip.ee.notify( - EvaluationEnvironment.EVENT_LEAVE_SEQUENCE, - ip, null, res); - } catch (Throwable e) { - throw ip.newWrappedError(e); - } - } - } - } - - /** - * Same as evalAsList(text, null, false, null). - * @see #evalAsSequence(String, EvaluationEnvironment, boolean, String) - */ - public static List evalAsSequence(String text) - throws EvalException { - return evalAsSequence(text, null, false, null); - } - - /** - * Same as evalAsList(text, null, false, fileName). - * @see #evalAsSequence(String, EvaluationEnvironment, boolean, String) - */ - public static List evalAsSequence(String text, String fileName) - throws EvalException { - return evalAsSequence(text, null, false, fileName); - } - - /** - * Loads a TDD file with utilizing #encoding:enc header. - * If the header is missing, the encoding given as parameter is used. - * - * @param in the stream that reads the content of the file. - */ - public static String loadTdd(InputStream in, String defaultEncoding) - throws IOException { - byte[] b = FileUtil.loadByteArray(in); - return loadTdd(b, defaultEncoding); - } - - /** - * Loads a TDD file with utilizing #encoding:enc header. - * If the header is missing, the encoding given as parameter is used. - * - * @param b the content of the file. - */ - public static String loadTdd(byte[] b, String defaultEncoding) - throws IOException { - String de = detectEncoding(b); - if (de != null) { - defaultEncoding = de; - } - return new String(b, defaultEncoding); - } - - /** - * Converts an object to a TDD-like representation (not necessary valid - * TDD). - * @param value the object to convert - * @return the TDD "source code". - */ - public static String dump(Object value) { - StringBuffer buf = new StringBuffer(); - dumpValue(buf, value, ""); - return buf.toString(); - } - - public static String getTypeName(Object value) { - if (value instanceof String) { - return "string"; - } else if (value instanceof Number) { - return "number"; - } else if (value instanceof Boolean) { - return "boolean"; - } else if (value instanceof List) { - return "sequence"; - } else if (value instanceof Map) { - return "hash"; - } else if (value instanceof FunctionCall) { - return "function call"; - } else { - if (value != null) { - return value.getClass().getName(); - } else { - return "null"; - } - } - } - - // ------------------------------------------------------------------------- - // Public non-static methods - - public int getPosition() { - return p; - } - - public String getText() { - return tx; - } - - public String getFileName() { - return fileName; - } - - public EvaluationEnvironment getEvaluationEnvironment() { - return ee; - } - - // ------------------------------------------------------------------------- - // Private - - /** - * Fetches comma separated expressions. The expressions may surrounded with - * superflous WS. - * @param list destination list - * @param terminator The character that signals the end of the list. - * Use 0x20 for EOS. p will point to the terminator - * character when the method returns. - */ - private List fetchSequenceInner( - List list, char terminator, boolean forceStringValues) - throws EvalException { - int listP = p - 1; - skipWS(); - if (terminator == 0x20) { - listP = p; - } - - while (true) { - char c; - if (p < ln) { - c = tx.charAt(p); - if (c == terminator) { - return list; - } - if (c == ',') { - throw newSyntaxError( - "List item is missing before the comma."); - } - } else { - if (terminator == 0x20) { - return list; - } else { - throw newSyntaxError("Reached the end of the text, " - + "but the list was not closed with " - + StringUtil.jQuoteOrName(terminator) + ".", - listP); - } - } - list.add(fetchExpression(forceStringValues, false)); - c = skipSeparator( - terminator, null, "This is a list, and not a hash."); - if (c == terminator) { - return list; - } - } - } - - /** - * Fetches comma separated key:value pairs. The expressions can be - * surrounded with superflous WS. - * @param map destination map - * @param terminator The character that signals the end of the key:value - * pair list. - * Use 0x20 for EOS. p will point to the terminator - * character when the method returns. - */ - private Map fetchHashInner( - Map map, char terminator, boolean forceStringValues) - throws EvalException { - int p2; - - int mapP = p - 1; - skipWS(); - if (terminator == 0x20) { - mapP = p; - } - - // Key lookup - while (true) { - char c; - - if (p < ln) { - c = tx.charAt(p); - if (c == terminator) { - return map; - } - if (c == ',') { - throw newSyntaxError( - "Key-value pair is missing before the comma."); - } - } else { - if (terminator == 0x20) { - return map; - } else { - throw newSyntaxError("Reached the end of the text, " - + "but the map was not closed with " - + StringUtil.jQuoteOrName(terminator) + ".", - mapP); - } - } - - int keyP = p; - Object o1 = fetchExpression(false, true); - FunctionCall keyFunc; - if (o1 instanceof FunctionCall) { - keyFunc = (FunctionCall) o1; - try { - o1 = ee.evalFunctionCall(keyFunc, this); - } catch (Throwable e) { - throw newError("Failed to evaluate function " - + StringUtil.jQuote(keyFunc.getName()) + ".", - keyP, e); - } - } else { - keyFunc = null; - } - - c = skipSeparator(terminator, null, null); - if (c == ':') { - if (!(o1 instanceof String)) { - if (keyFunc != o1) { - throw newError( - "The key must be a String, but it is a(n) " - + getTypeName(o1) + ".", keyP); - } else { - throw newError( - "You can't use the function here, " - + "because it can't be evaluated " - + "in this context.", - keyP); - } - } - - if (p == ln) { - throw newSyntaxError( - "The key must be followed by a value because " - + "colon was used.", keyP); - } - - Object o2; - boolean done = false; - try { - Object nr; - try { - nr = ee.notify( - EvaluationEnvironment.EVENT_ENTER_HASH_KEY, - this, (String) o1, null); - done = true; - } catch (Throwable e) { - throw newWrappedError(e, keyP); - } - if (nr == null) { - o2 = fetchExpression(forceStringValues, false); - map.put(o1, o2); - } else { - p2 = p; - skipExpression(false); - if (nr == EvaluationEnvironment.RETURN_FRAGMENT) { - map.put(o1, new Fragment(tx, p2, p, fileName)); - } - } - } finally { - if (done) { - try { - ee.notify( - EvaluationEnvironment.EVENT_LEAVE_HASH_KEY, - this, (String) o1, null); - } catch (Throwable e) { - throw newWrappedError(e); - } - } - } - - c = skipSeparator(terminator, null, - "Colon is for separating the key from the value, " - + "and the value was alredy given previously."); - } else if (c == ',' || c == terminator || c == 0x20) { - if (keyFunc == null) { - if (o1 instanceof String) { - boolean done = false; - try { - Object nr; - try { - nr = ee.notify( - EvaluationEnvironment - .EVENT_ENTER_HASH_KEY, - this, (String) o1, null); - done = true; - } catch (Throwable e) { - throw newWrappedError(e, keyP); - } - if (nr == null - || nr == EvaluationEnvironment - .RETURN_FRAGMENT) { - map.put(o1, Boolean.TRUE); - } - } finally { - if (done) { - try { - ee.notify( - EvaluationEnvironment - .EVENT_LEAVE_HASH_KEY, - this, (String) o1, null); - } catch (Throwable e) { - throw newWrappedError(e); - } - } - } - } else if (o1 instanceof Map) { - map.putAll((Map) o1); - } else { - throw newError( - "This expression should be either a string " + "or a hash, but it is a(n) " - + getTypeName(o1) + ".", keyP); - } - } else { - if (o1 instanceof Map) { - map.putAll((Map) o1); - } else { - if (keyFunc == o1) { - throw newError( - "You can't use the function here, " - + "because it can't be evaluated " - + "in this context.", - keyP); - } else { - throw newError( - "Function doesn't evalute to a Map, but " - + "to " + getTypeName(o1) - + ", so it can't be merged into the hash.", - keyP); - } - } - } - } - if (c == terminator) { - return map; - } - } - } - - /** - * Fetches arbitrary expression. No surrounding superflous WS is allowed! - */ - private Object fetchExpression(boolean forceStr, boolean hashKey) - throws EvalException { - char c; - - if (p >= ln) { //!!a - throw new BugException("Calling fetchExpression when p >= ln."); - } - - c = tx.charAt(p); - - // Hash: - if (c == '{') { - Object nr; - p++; - Object res; - Map map = new HashMap(); - boolean done = false; - try { - try { - nr = ee.notify( - EvaluationEnvironment.EVENT_ENTER_HASH, - this, null, map); - done = true; - } catch (Throwable e) { - throw newWrappedError(e); - } - if (nr == null) { - fetchHashInner(map, '}', forceStr); - res = map; - } else { - p--; - int p2 = p; - skipExpression(false); - res = new Fragment(tx, p2, p, fileName); - p--; - } - } finally { - if (done) { - try { - ee.notify( - EvaluationEnvironment.EVENT_LEAVE_HASH, - this, null, map); - } catch (Throwable e) { - throw newWrappedError(e); - } - } - } - p++; - return res; //! - } - - // Sequence: - if (c == '[') { - p++; - List res = new ArrayList(); - boolean done = false; - try { - try { - ee.notify( - EvaluationEnvironment.EVENT_ENTER_SEQUENCE, - this, null, res); - done = true; - } catch (Throwable e) { - throw newWrappedError(e); - } - fetchSequenceInner(res, ']', forceStr); - } finally { - if (done) { - try { - ee.notify( - EvaluationEnvironment.EVENT_LEAVE_SEQUENCE, - this, null, res); - } catch (Throwable e) { - throw newWrappedError(e); - } - } - } - p++; - return res; //! - } - - int b = p; - - // Quoted string: - if (c == '"' || c == '\'') { - char q = c; - - p++; - while (p < ln) { - c = tx.charAt(p); - if (c == '\\') { - break; - } - p++; - if (c == q) { - return tx.substring(b + 1, p - 1); //! - } - } - if (p == ln) { - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } - - int bidx = b + 1; - StringBuffer buf = new StringBuffer(); - while (true) { - buf.append(tx.substring(bidx, p)); - if (p == ln - 1) { - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } - c = tx.charAt(p + 1); - switch (c) { - case '"': - buf.append('"'); - bidx = p + 2; - break; - case '\'': - buf.append('\''); - bidx = p + 2; - break; - case '\\': - buf.append('\\'); - bidx = p + 2; - break; - case 'n': - buf.append('\n'); - bidx = p + 2; - break; - case 'r': - buf.append('\r'); - bidx = p + 2; - break; - case 't': - buf.append('\t'); - bidx = p + 2; - break; - case 'f': - buf.append('\f'); - bidx = p + 2; - break; - case 'b': - buf.append('\b'); - bidx = p + 2; - break; - case 'g': - buf.append('>'); - bidx = p + 2; - break; - case 'l': - buf.append('<'); - bidx = p + 2; - break; - case 'a': - buf.append('&'); - bidx = p + 2; - break; - case '{': - buf.append('{'); - bidx = p + 2; - break; - case 'x': - case 'u': - { - p += 2; - int x = p; - int y = 0; - int z = (ln - p) > 4 ? p + 4 : ln; - while (p < z) { - char c2 = tx.charAt(p); - if (c2 >= '0' && c2 <= '9') { - y <<= 4; - y += c2 - '0'; - } else if (c2 >= 'a' && c2 <= 'f') { - y <<= 4; - y += c2 - 'a' + 10; - } else if (c2 >= 'A' && c2 <= 'F') { - y <<= 4; - y += c2 - 'A' + 10; - } else { - break; - } - p++; - } - if (x < p) { - buf.append((char) y); - } else { - throw newSyntaxError( - "Invalid hexadecimal UNICODE escape in " - + "the string literal.", - x - 2); - } - bidx = p; - break; - } - default: - if (isWS(c)) { - boolean hasWS = false; - bidx = p + 1; - do { - if (c == 0xA || c == 0xD) { - if (hasWS) { - break; - } - hasWS = true; - if (c == 0xD && bidx < ln - 1) { - if (tx.charAt(bidx + 1) == 0xA) { - bidx++; - } - } - } - bidx++; - if (bidx == ln) { - break; - } - c = tx.charAt(bidx); - } while (isWS(c)); - if (!hasWS) { throw newSyntaxError( - "Invalid usage of escape sequence " + "\\white-space. This escape sequence " - + "can be used only before " + "line-break."); - } - } else { - throw newSyntaxError( - "Invalid escape sequence \\" + c - + " in the string literal."); - } - } - p = bidx; - while (true) { - if (p == ln) { - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } - c = tx.charAt(p); - if (c == '\\') { - break; - } - if (c == q) { - buf.append(tx.substring(bidx, p)); - p++; - return buf.toString(); //! - } - p++; - } - } // while true - } // if quoted string - - // Raw string: - char c2; - if (p < ln - 1) { - c2 = tx.charAt(p + 1); - } else { - c2 = 0x20; - } - if (c == 'r' && (c2 == '"' || c2 == '\'')) { - char q = c2; - p += 2; - while (p < ln) { - c = tx.charAt(p); - p++; - if (c == q) { - return tx.substring(b + 2, p - 1); //! - } - } - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } - - // Unquoted string, boolean or number, or function call - uqsLoop: while (true) { - c = tx.charAt(p); - if (c <= 160) { - if (!UQSTR_CHARS[c] - && !(p == b && c == '+') - && !(!hashKey && c == ':')) { - break uqsLoop; - } - } else if (isWS(c)) { - break uqsLoop; - } - p++; - if (p == ln) { - break uqsLoop; - } - } - if (b == p) { - throw newSyntaxError("Unexpected character.", b); - } else { - String s = tx.substring(b, p); - int funcP = b; - int oldP = p; - c = skipWS(); - if (c == '(') { - p++; - List params; - boolean done = false; - try { - try { - ee.notify( - EvaluationEnvironment - .EVENT_ENTER_FUNCTION_PARAMS, - this, s, null); - } catch (Throwable e) { - throw newWrappedError(e, funcP); - } - done = true; - params = fetchSequenceInner(new ArrayList(), ')', forceStr); - } finally { - if (done) { - try { - ee.notify( - EvaluationEnvironment - .EVENT_LEAVE_FUNCTION_PARAMS, - this, s, null); - } catch (Throwable e) { - throw newWrappedError(e); - } - } - } - p++; - FunctionCall func = new FunctionCall(s, params); - if (!hashKey) { - try { - return ee.evalFunctionCall(func, this); //! - } catch (Throwable e) { - throw newError("Failed to evaluate function " - + StringUtil.jQuote(func.getName()) + ".", - b, e); - } - } else { - return func; - } - } else { - p = oldP; - if (!forceStr && !hashKey) { - if (s.equals("true")) { - return Boolean.TRUE; //! - } else if (s.equals("false")) { - return Boolean.FALSE; //! - } - c = s.charAt(0); - if ((c >= '0' && c <= '9') || c == '+' || c == '-') { - String s2; - if (c == '+') { - s2 = s.substring(1); // Integer(s) doesn't know +. - } else { - s2 = s; - } - try { - return new Integer(s2); //! - } catch (NumberFormatException exc) { - ; // ignore - } - try { - return new BigDecimal(s2); //! - } catch (NumberFormatException exc) { - ; // ignore - } - } - } - return s; //! - } // if not '(' - } // if b == p - } - - /** - * Skips a single expression. It's ignores syntax errors in the skipped - * expression as far as it is clean where the end of the expression is. - */ - private void skipExpression(boolean hashKey) throws EvalException { - char c; - - if (p >= ln) { //!!a - throw new BugException("Calling fetchExpression when p >= ln."); - } - - c = tx.charAt(p); - - // Hash: - if (c == '{') { - p++; - skipListing('}'); - p++; - return; - } - - // Sequence: - if (c == '[') { - p++; - skipListing(']'); - p++; - return; - } - - // Unresolved object in a dump: - if (c == '<') { - p++; - skipListing('>'); - p++; - return; - } - - // Just for durability: - if (c == '(') { - p++; - skipListing(')'); - p++; - return; - } - - int b = p; - - // Quoted string: - if (c == '"' || c == '\'') { - char q = c; - - p++; - while (p < ln) { - c = tx.charAt(p); - if (c == '\\') { - if (p != ln - 1) { - p++; - } - } - p++; - if (c == q) { - return; //! - } - } - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } // if quoted string - - // Raw string: - char c2; - if (p < ln - 1) { - c2 = tx.charAt(p + 1); - } else { - c2 = 0x20; - } - if (c == 'r' && (c2 == '"' || c2 == '\'')) { - char q = c2; - p += 2; - while (p < ln) { - c = tx.charAt(p); - p++; - if (c == q) { - return; //! - } - } - throw newSyntaxError( - "The closing " + StringUtil.jQuoteOrName(q) - + " of the string is missing.", - b); - } - - // Unquoted string, boolean or number, or function call - uqsLoop: while (true) { - c = tx.charAt(p); - if (c <= 160) { - if (!UQSTR_CHARS[c] - && !(p == b && c == '+') - && !(!hashKey && c == ':')) { - break uqsLoop; - } - } else if (isWS(c)) { - break uqsLoop; - } - p++; - if (p == ln) { - break uqsLoop; - } - } - if (b == p) { - throw newSyntaxError("Unexpected character.", b); - } else { - int oldP = p; - c = skipWS(); - if (c == '(') { - p++; - skipListing(')'); - p++; - } else { - p = oldP; - } // if not '(' - } // if b == p - } - - private void skipListing(char terminator) throws EvalException { - int listP = p - 1; - skipWS(); - if (terminator == 0x20) { - listP = p; - } - - while (true) { - char c; - if (p < ln) { - c = tx.charAt(p); - if (c == terminator) { - return; - } - } else { - if (terminator == 0x20) { - return; - } else { - throw newSyntaxError("Reached the end of the text, " - + "but the closing " - + StringUtil.jQuoteOrName(terminator) - + " is missing.", - listP); - } - } - if (c == ',' || c == ':' || c == ';' || c == '=') { - p++; - } else { - skipExpression(false); - } - c = skipWS(); - if (c == terminator) { - return; - } - } - } - - /** - * Fetches separator between whatever items. - * - * @return the separator, which is either or ',', - * or ':', or 0x20 for EOS, or - * terminator for the terminator character. - * ',' means comma separation, or separation with implied comma - * (i.e. sparation with NL). - * - *

    p will point the first character of the item (or the - * terminator character) after the skipped separator, unless an exception - * aborts the execution of the method. - * - * @param terminator the character that termiantes the sequence of - * separated. items. Use 0x20 for EOS. - * @param commaBadReason if not null, comma will not be - * accepted as separator, and it is the reason why. - * @param colonBadReason if not null, colon will not be - * accepted as separator, and it is the reason why. - */ - private char skipSeparator( - char terminator, String commaBadReason, String colonBadReason) - throws EvalException { - int intialP = p; - char c = skipWS(); - boolean plusConverted = false; - if (c == '+') { - // deprecated the old hash-union syntax - throw newSyntaxError( - "The + operator (\"hash union\") is deprecated since " - + "FMPP 0.9.0, and starting from FMPP 0.9.9 it is not " - + "allowed at all. Please use \"hash addition\" instead. " - + "For example, assuming that your configuration file is " - + "in .properties format (same as .cfg), instead of this:\n" - + "data={a:1, b:2} + properties(data/style.properties) + " - + "birds:csv(data/birds.csv)" - + "\nyour should write this:\n" - + "data=a:1, b:2, tdd(data/style.tdd), " - + "birds:csv(data/birds.csv)" - + "\nFor more information on hash addition please see:\n" - + "http://fmpp.sourceforge.net/tdd.html#hashAddition"); - } - if (c == ',' || c == ':') { - if (commaBadReason != null && c == ',') { - if (!plusConverted) { - throw newSyntaxError( - "Comma (,) shouldn't be used here. " - + commaBadReason); - } else { - throw newSyntaxError( - "Plus sign (+), which is treated as comma (,) " - + "in this case, shouldn't be used here. " - + commaBadReason); - } - } - if (colonBadReason != null && c == ':') { - throw newSyntaxError( - "Colon (:) shouldn't be used here. " + colonBadReason); - } - p++; - skipWS(); - return c; - } else if (c == terminator) { - return terminator; - } else if (c == ';') { - throw newSyntaxError( - "Semicolon (;) was unexpected here. If you want to " - + "separate items in a listing then use comma " - + "(,) instead."); - } else if (c == '=') { - throw newSyntaxError( - "Equals sign (=) was unexpected here. If you want to " - + "associate a key with a value then use " - + "colon (:) instead."); - } else { - if (c == 0x20) { - // EOS - return c; - } - if (skipWSFoundNL) { - // implicit comma - if (commaBadReason != null) { - throw newSyntaxError( - "Line-break shouldn't be used before this iteam as " - + "separator (which is the same as using comma). " - + commaBadReason); - } - return ','; - } else { - if (p == intialP) { - throw newSyntaxError("Character " - + StringUtil.jQuoteOrName(tx.charAt(p)) - + " shouldn't occur here."); - } else { - // WS* separator - throw newSyntaxError("No separator was used before " - + "the item. Items in listings should be " - + "separated with comma (,) or line-break. Keys " - + "and values in hashes should be separated with " - + "colon (:)."); - } - } - } - } - - /** - * Increments p until it finds non-WS character or EOS, also - * it transparently skips TDD comments. - * @return the non-WS char that terminates the WS, or 0x20 if EOS reached. - */ - private char skipWS() throws EvalException { - char c; - skipWSFoundNL = false; - while (p < ln) { - c = tx.charAt(p); - if (!isWS(c)) { - if (c == '#' && isLineEmptyBefore(p)) { - while (true) { - p++; - if (p == ln) { - return 0x20; //! - } - c = tx.charAt(p); - if (c == 0xA || c == 0xD) { - break; //! - } - } - } else if (c == '<' && p < ln - 3 - && tx.charAt(p + 1) == '#' - && tx.charAt(p + 2) == '-' - && tx.charAt(p + 3) == '-') { - int commentP = p; - while (true) { - p++; - if (p >= ln - 2) { - throw newSyntaxError( - "Comment was not closed with \"-->\".", - commentP); - } - if (tx.charAt(p) == '-' - && tx.charAt(p + 1) == '-' - && tx.charAt(p + 2) == '>') { - p += 2; - break; //! - } - } - } else { - return c; //! - } - } else if (c == 0xD || c == 0xA) { - skipWSFoundNL = true; - } - p++; - } - return 0x20; - } - - /** - * Checks if there is only WS* before the specified position in the line the - * pointed character belongs to. - */ - private boolean isLineEmptyBefore(int pos) { - pos--; - while (pos >= 0) { - char c = tx.charAt(pos); - if (c == 0xA || c == 0xD) { - return true; - } - if (!isWS(c)) { - return false; - } - pos--; - } - return true; - } - - /** - * (Re)inits the evaluator object. - */ - private void init(String text, String fileName, EvaluationEnvironment ee) { - p = 0; - skipWSFoundNL = false; - tx = text; - ln = text.length(); - this.fileName = fileName; - this.ee = ee == null ? SIMPLE_EVALUATION_ENVIRONMENT : ee; - } - - /** - * (Re)inits the evaluator object. - */ - private void init(Fragment fr, EvaluationEnvironment ee) { - p = fr.getFragmentStart(); - skipWSFoundNL = false; - tx = fr.getText(); - ln = fr.getFragmentEnd(); - this.fileName = fr.getFileName(); - this.ee = ee == null ? SIMPLE_EVALUATION_ENVIRONMENT : ee; - } - - private static final String ENCODING_COMMENT_1 = "encoding"; - private static final String ENCODING_COMMENT_2 = "charset"; - - /** - * Same as Character.isWhitespace, but counts BOM as WS too. - */ - private static boolean isWS(char c) { - return Character.isWhitespace(c) || c == 0xFEFF; - } - - private static String detectEncoding(byte[] b) { - char c; - String s; - int p = 0; - int ln = b.length; - - while (p < ln && Character.isWhitespace(toChar(b[p]))) { - p++; - } - if (p == ln) { - return null; - } - c = toChar(b[p]); - if (c != '#') { - // Windows Notepad's monster: UTF-8 with BOM - if (!(p <= ln - 3 - && c == 0xEF - && toChar(b[p + 1]) == 0xBB - && toChar(b[p + 2]) == 0xBF - && toChar(b[p + 3]) == '#')) { - return null; - } - p += 3; - } - p++; - p = detectEncoding_skipNonNLWS(b, p); - int bp = p; - while (p < ln) { - c = toChar(b[p]); - if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) { - break; - } - p++; - } - if (p - bp != ENCODING_COMMENT_1.length() - && p - bp != ENCODING_COMMENT_2.length()) { - return null; - } - try { - s = new String(b, bp, p - bp, "ISO-8859-1").toLowerCase(); - } catch (UnsupportedEncodingException e) { - throw new BugException("ISO-8859-1 decoding failed.", e); - } - if (!s.equals(ENCODING_COMMENT_1) && !s.equals(ENCODING_COMMENT_2)) { - return null; - } - p = detectEncoding_skipNonNLWS(b, p); - if (p == ln) { - return null; - } - c = toChar(b[p]); - if (c != ':') { - return null; - } - p++; - p = detectEncoding_skipNonNLWS(b, p); - if (p == ln) { - return null; - } - bp = p; - while (p < ln && !Character.isWhitespace(toChar(b[p]))) { - p++; - } - if (bp == p) { - return null; - } - try { - s = new String(b, bp, p - bp, "ISO-8859-1"); - } catch (UnsupportedEncodingException e) { - throw new BugException("ISO-8859-1 decoding failed.", e); - } - return s; - } - - private static int detectEncoding_skipNonNLWS(byte[] b, int p) { - int ln = b.length; - while (p < ln) { - char c = toChar(b[p]); - if (!Character.isWhitespace(c) || c == 0xD || c == 0xA) { - break; - } - p++; - } - return p; - } - - private static char toChar(byte b) { - return (char) (0xFF & b); - } - - private static void dumpMap(StringBuffer out, Map m, String indent) { - Iterator it = m.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - out.append( - indent - + StringUtil.jQuote((String) ent.getKey()) + ": "); - dumpValue(out, ent.getValue(), indent); - out.append(StringUtil.LINE_BREAK); - } - } - - private static void dumpMapSL(StringBuffer out, Map m) { - Iterator it = m.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry ent = (Map.Entry) it.next(); - out.append(StringUtil.jQuote((String) ent.getKey()) + ":"); - dumpValueSL(out, ent.getValue()); - if (it.hasNext()) { - out.append(", "); - } - } - } - - private static void dumpList(StringBuffer out, List ls, String indent) { - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - out.append(indent); - dumpValue(out, obj, indent); - out.append(StringUtil.LINE_BREAK); - } - } - - private static void dumpListSL(StringBuffer out, List ls) { - Iterator it = ls.iterator(); - while (it.hasNext()) { - Object obj = it.next(); - dumpValueSL(out, obj); - if (it.hasNext()) { - out.append(", "); - } - } - } - - private static void dumpValue(StringBuffer out, Object o, String indent) { - if (o instanceof Number || o instanceof Boolean) { - out.append(o); - } else if (o instanceof String) { - out.append(StringUtil.jQuote((String) o)); - } else if (o instanceof Map) { - out.append("{"); - out.append(StringUtil.LINE_BREAK); - dumpMap(out, (Map) o, indent + " "); - out.append(indent + "}"); - } else if (o instanceof List) { - out.append("["); - out.append(StringUtil.LINE_BREAK); - dumpList(out, (List) o, indent + " "); - out.append(indent + "]"); - } else if (o instanceof FunctionCall) { - FunctionCall dir = (FunctionCall) o; - out.append(dir.getName()); - out.append("("); - dumpListSL(out, dir.getParams()); - out.append(")"); - } else { - if (o == null) { - out.append(""); - } else { - out.append("<"); - out.append(o.getClass().getName()); - out.append(" "); - out.append(StringUtil.jQuote(o.toString())); - out.append(">"); - } - } - } - - private static void dumpValueSL(StringBuffer out, Object o) { - if (o instanceof Number || o instanceof Boolean) { - out.append(o); - } else if (o instanceof String) { - out.append(StringUtil.jQuote((String) o)); - } else if (o instanceof Map) { - out.append("{"); - dumpMapSL(out, (Map) o); - out.append("}"); - } else if (o instanceof List) { - out.append("["); - dumpListSL(out, (List) o); - out.append("]"); - } else if (o instanceof FunctionCall) { - FunctionCall dir = (FunctionCall) o; - out.append(dir.getName()); - out.append("("); - dumpListSL(out, dir.getParams()); - out.append(")"); - } else { - out.append("<"); - out.append(o.getClass().getName()); - out.append(" "); - out.append(StringUtil.jQuote(o.toString())); - out.append(">"); - } - } - - private EvalException newSyntaxError(String message) { - return newSyntaxError(message, p); - } - - private EvalException newSyntaxError(String message, int position) { - return new EvalException( - "TDD syntax error: " + message, tx, position, fileName); - } - - private EvalException newError(String message, int position) { - return new EvalException( - "TDD error: " + message, tx, position, fileName); - } - - private EvalException newError( - String message, int position, Throwable cause) { - return new EvalException( - "TDD error: " + message, tx, position, fileName, cause); - } - - private EvalException newWrappedError(Throwable e) { - return newWrappedError(e, p); - } - - private EvalException newWrappedError(Throwable e, int p) { - if (e instanceof EvalException) { - return (EvalException) e; - } - return new EvalException( - "Error while evaluating TDD: " + e.getMessage(), - tx, p, fileName, MiscUtil.getCauseException(e)); - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tdd/TddUtil.java b/fmpp/src/main/java/fmpp/tdd/TddUtil.java deleted file mode 100644 index ab50ff5..0000000 --- a/fmpp/src/main/java/fmpp/tdd/TddUtil.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tdd; - -import fmpp.Engine; -import fmpp.dataloaders.CsvDataLoader; -import fmpp.dataloaders.EvalDataLoader; -import fmpp.dataloaders.HtmlUtilsDataLoader; -import fmpp.dataloaders.JSONDataLoader; -import fmpp.dataloaders.NowDataLoader; -import fmpp.dataloaders.PropertiesDataLoader; -import fmpp.dataloaders.SlicedTextDataLoader; -import fmpp.dataloaders.TddDataLoader; -import fmpp.dataloaders.TddSequenceDataLoader; -import fmpp.dataloaders.TextDataLoader; -import fmpp.util.InstallationException; -import fmpp.util.MiscUtil; - -/** - * Utility methods for TDD related tasks. - */ -public class TddUtil { - /** - * Resolves a data loader name to a data loader instance. - */ - public static DataLoader getDataLoaderInstance(Engine eng, String dlName) - throws EvalException { - if (eng == null) { - throw new IllegalArgumentException("Parameter eng can't be null."); - } - - DataLoader dl; - // Hard-linked data loaders - if (dlName.equals("properties")) { - return new PropertiesDataLoader(); - } else if (dlName.equals("json")) { - return new JSONDataLoader(); - } else if (dlName.equals("tdd")) { - return new TddDataLoader(); - } else if (dlName.equals("tddSequence")) { - return new TddSequenceDataLoader(); - } else if (dlName.equals("text")) { - return new TextDataLoader(); - } else if (dlName.equals("slicedText")) { - return new SlicedTextDataLoader(); - } else if (dlName.equals("csv")) { - return new CsvDataLoader(); - } else if (dlName.equals("eval")) { - return new EvalDataLoader(); - } else if (dlName.equals("htmlUtils")) { - return new HtmlUtilsDataLoader(); - } else if (dlName.equals("xhtmlUtils")) { - HtmlUtilsDataLoader f - = new HtmlUtilsDataLoader(); - f.setXHtml(true); - return f; - } else if (dlName.equals("now")) { - return new NowDataLoader(); - // On-demand linked data loaders: - } else if (dlName.equals("antProperty")) { - dlName = "fmpp.dataloaders.AntPropertyDataLoader"; - } else if (dlName.equals("antProperties")) { - dlName = "fmpp.dataloaders.AntPropertiesDataLoader"; - } else if (dlName.equals("antTask")) { - dlName = "fmpp.dataloaders.AntTaskDataLoader"; - } else if (dlName.equals("antProject")) { - dlName = "fmpp.dataloaders.AntProjectDataLoader"; - } else if (dlName.equals("xmlInfoset")) { - try { - eng.checkXmlSupportAvailability( - "Usage of xmlInfoset data loader."); - } catch (InstallationException e) { - throw new EvalException( - "Can't get xmlInfoset data loader", e); - } - dlName = "fmpp.dataloaders.XmlInfosetDataLoader"; - } else if (dlName.equals("xml")) { - try { - eng.checkXmlSupportAvailability( - "Usage of xml data loader."); - } catch (InstallationException e) { - throw new EvalException("Can't get xml data loader", e); - } - dlName = "fmpp.dataloaders.XmlDataLoader"; - } - - if (Character.isLowerCase(dlName.charAt(0)) - && dlName.indexOf('.') == -1) { - throw new EvalException( - "Unknown data loader: " + dlName); - } - - Class clazz; - try { - clazz = MiscUtil.classForName(dlName); - } catch (ClassNotFoundException exc) { - throw new EvalException( - "Data loader class not found: " + dlName); - } - - if (clazz.isInterface()) { - throw new EvalException( - "Data loader class must be a class, but this " - + "is an interface: " + clazz.getName()); - } - - if (!(DataLoader.class) - .isAssignableFrom(clazz)) { - throw new EvalException( - "Data loader class must implement " - + "fmpp.tdd.DataLoader interface, " - + "but this class doesn't implement that: " - + clazz.getName()); - } - try { - dl = (DataLoader) clazz.newInstance(); - } catch (InstantiationException exc) { - throw new EvalException( - "Failed to create an instance of " - + clazz.getName() + ": " - + exc); - } catch (IllegalAccessException exc) { - throw new EvalException( - "Failed to create an instance of " - + clazz.getName() + ": " - + exc); - } - return dl; - } - -} diff --git a/fmpp/src/main/java/fmpp/tdd/package.html b/fmpp/src/main/java/fmpp/tdd/package.html deleted file mode 100644 index 3283bdc..0000000 --- a/fmpp/src/main/java/fmpp/tdd/package.html +++ /dev/null @@ -1,9 +0,0 @@ - -

    Textual Data Definition related classes. - TDD is a very simple expression language created for defining hierarchical data - (vectors, dictionaries) as plain text (maybe a command-line argument). - Its syntax is similar to FreeMarker expression syntax. - -

    TDD is not for defining large amount of data. - Rather, it is for give a uniform syntax for simple setting (configuration) values.

    - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tools/AntTask.java b/fmpp/src/main/java/fmpp/tools/AntTask.java deleted file mode 100644 index 07dbc4c..0000000 --- a/fmpp/src/main/java/fmpp/tools/AntTask.java +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tools; - -import java.io.File; -import java.io.IOException; -import java.util.Properties; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.ProjectComponent; -import org.apache.tools.ant.Target; - -import fmpp.ProcessingException; -import fmpp.dataloaders.AntTaskDataLoader; -import fmpp.progresslisteners.AntProgressListener; -import fmpp.progresslisteners.LoggerProgressListener; -import fmpp.setting.FileWithSettingValue; -import fmpp.setting.SettingException; -import fmpp.setting.Settings; -import fmpp.util.MiscUtil; -import fmpp.util.RuntimeExceptionCC; -import fmpp.util.StringUtil; -import freemarker.log.Logger; - -/** - * Ant task to process files selected by pattern sets. - */ -public class AntTask extends org.apache.tools.ant.taskdefs.MatchingTask { - - private Properties initialOps = new Properties(); - private File dir; - private String configuration; - private boolean hasSourceFileAttr; - private boolean antTaskFailOnError = true; - private Boolean alwaysCreateDirsAltName; - private Boolean sourceRootAltName; - private Boolean outputRootAltName; - - public void setConfiguration(File outputFile) { - configuration = outputFile.getAbsolutePath(); - } - - public void setAntTaskFailOnError(boolean antTaskFailOnError) { - this.antTaskFailOnError = antTaskFailOnError; - } - - public void setConfigurationBase(File f) { - initialOps.setProperty( - Settings.NAME_CONFIGURATION_BASE, f.getAbsolutePath()); - } - - public void setInheritConfiguration(File f) { - initialOps.setProperty( - Settings.NAME_INHERIT_CONFIGURATION, f.getAbsolutePath()); - } - - public void setOutputFile(File outputFile) { - initialOps.setProperty( - Settings.NAME_OUTPUT_FILE, outputFile.getAbsolutePath()); - } - - public void setOutputRoot(File outputRoot) { - setOutputRoot_common(outputRoot, false); - } - - public void setDestDir(File outputRoot) { - setOutputRoot_common(outputRoot, true); - } - - public void setOutputRoot_common(File outputRoot, boolean alt) { - Boolean oAlt = alt ? Boolean.TRUE : Boolean.FALSE; - if (outputRootAltName != null && outputRootAltName != oAlt) { - throw new IllegalArgumentException( - "Can't use synonymous attributes together: " - + "outputroot and destdir"); - } - outputRootAltName = oAlt; - initialOps.setProperty( - Settings.NAME_OUTPUT_ROOT, outputRoot.getAbsolutePath()); - } - - public void setSourceFile(File sourceFile) { - hasSourceFileAttr = true; - initialOps.setProperty( - Settings.NAME_SOURCES, - StringUtil.jQuote(sourceFile.getAbsolutePath())); - } - - public void setSourceRoot(File sourceRoot) { - setSourceRoot_common(sourceRoot, false); - } - - public void setSrcDir(File sourceRoot) { - setSourceRoot_common(sourceRoot, true); - } - - public void setSourceRoot_common(File sourceRoot, boolean alt) { - Boolean oAlt = alt ? Boolean.TRUE : Boolean.FALSE; - if (sourceRootAltName != null && sourceRootAltName != oAlt) { - throw new IllegalArgumentException( - "Can't use synonymous attributes together: " - + "sourceroot and srcdir"); - } - sourceRootAltName = oAlt; - initialOps.setProperty( - Settings.NAME_SOURCE_ROOT, sourceRoot.getAbsolutePath()); - } - - public void setFreemarkerIncompatibleImprovements(String fmIcI) { - initialOps.setProperty( - Settings.NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS, fmIcI); - } - - public void setObjectWrapper(String objectWrapper) { - initialOps.setProperty( - Settings.NAME_OBJECT_WRAPPER, objectWrapper); - } - - public void setFreemarkerLinks(String freemarkerLinks) { - initialOps.setProperty( - Settings.NAME_FREEMARKER_LINKS, freemarkerLinks); - } - - public void setBorders(String border) { - if (initialOps.getProperty(Settings.NAME_BORDERS) != null) { - throw newMultipleDefinitionsException(Settings.NAME_BORDERS); - } - initialOps.setProperty(Settings.NAME_BORDERS, border); - } - - public void setCaseSensitive(boolean caseSensitive) { - initialOps.setProperty( - Settings.NAME_CASE_SENSITIVE, String.valueOf(caseSensitive)); - } - - public void setDataRoot(File dataRoot) { - initialOps.setProperty( - Settings.NAME_DATA_ROOT, dataRoot.getAbsolutePath()); - } - - public void setData(String data) { - if (initialOps.getProperty(Settings.NAME_DATA) != null) { - throw newMultipleDefinitionsException(Settings.NAME_DATA); - } - initialOps.setProperty(Settings.NAME_DATA, data); - } - - public void setLocalData(String localData) { - if (initialOps.getProperty(Settings.NAME_LOCAL_DATA) != null) { - throw newMultipleDefinitionsException(Settings.NAME_LOCAL_DATA); - } - initialOps.setProperty(Settings.NAME_LOCAL_DATA, localData); - } - - public void setTurns(String turn) { - if (initialOps.getProperty(Settings.NAME_TURNS) != null) { - throw newMultipleDefinitionsException(Settings.NAME_TURNS); - } - initialOps.setProperty(Settings.NAME_TURNS, turn); - } - - public void setExpert(boolean expert) { - initialOps.setProperty(Settings.NAME_EXPERT, String.valueOf(expert)); - } - - /** - * Same as {@link #setAlwaysCreateDirectories(boolean)}; added as this name - * is closer to the Ant naming conventions. - */ - public void setAlwaysCreateDirs(boolean copy) { - setAlwaysCreateDirs_common(copy, true); - } - - public void setAlwaysCreateDirectories(boolean copy) { - setAlwaysCreateDirs_common(copy, false); - } - - private void setAlwaysCreateDirs_common(boolean copy, boolean alt) { - Boolean oAlt = alt ? Boolean.TRUE : Boolean.FALSE; - if (alwaysCreateDirsAltName != null - && alwaysCreateDirsAltName != oAlt) { - throw new IllegalArgumentException( - "Can't use synonymous attributes together: " - + "alwaysCreateDirs and alwaysCreateDirectories"); - } - alwaysCreateDirsAltName = oAlt; - initialOps.setProperty( - Settings.NAME_ALWAYS_CREATE_DIRECTORIES, String.valueOf(copy)); - } - - public void setLocale(String locale) { - initialOps.setProperty(Settings.NAME_LOCALE, locale); - } - - public void setLogFile(File logFile) { - if (!logFile.equals(getProject().getBaseDir())) { // if not logFile="" - initialOps.setProperty( - Settings.NAME_LOG_FILE, logFile.getAbsolutePath()); - } - } - - public void setAppendLogFile(boolean append) { - initialOps.setProperty( - Settings.NAME_APPEND_LOG_FILE, String.valueOf(append)); - } - - public void setModes(String mode) { - if (initialOps.getProperty(Settings.NAME_MODES) != null) { - throw newMultipleDefinitionsException(Settings.NAME_MODES); - } - initialOps.setProperty(Settings.NAME_MODES, mode); - } - - public void setNumberFormat(String numberFormat) { - initialOps.setProperty(Settings.NAME_NUMBER_FORMAT, numberFormat); - } - - public void setBooleanFormat(String booleanFormat) { - initialOps.setProperty(Settings.NAME_BOOLEAN_FORMAT, booleanFormat); - } - - public void setDateFormat(String dateFormat) { - initialOps.setProperty(Settings.NAME_DATE_FORMAT, dateFormat); - } - - public void setTimeFormat(String timeFormat) { - initialOps.setProperty(Settings.NAME_TIME_FORMAT, timeFormat); - } - - public void setDateTimeFormat(String dateTimeFormat) { - initialOps.setProperty(Settings.NAME_DATETIME_FORMAT, dateTimeFormat); - } - - public void setTimeZone(String timeZone) { - initialOps.setProperty(Settings.NAME_TIME_ZONE, timeZone); - } - - public void setSQLDateAndTimeTimeZone(String timeZone) { - initialOps.setProperty(Settings.NAME_SQL_DATE_AND_TIME_TIME_ZONE, timeZone); - } - - public void setTagSyntax(String tagSyntax) { - initialOps.setProperty(Settings.NAME_TAG_SYNTAX, tagSyntax); - } - - public void setOutputEncoding(String outputEncoding) { - initialOps.setProperty(Settings.NAME_OUTPUT_ENCODING, outputEncoding); - } - - public void setUrlEscapingCharset(String urlEscapingCharset) { - initialOps.setProperty( - Settings.NAME_URL_ESCAPING_CHARSET, urlEscapingCharset); - } - - public void setXpathEngine(String engine) { - initialOps.setProperty(Settings.NAME_XPATH_ENGINE, engine); - } - - public void setXmlCatalogFiles(String files) { - initialOps.setProperty(Settings.NAME_XML_CATALOG_FILES, files); - } - - public void setXmlCatalogPrefer(String prefer) { - initialOps.setProperty(Settings.NAME_XML_CATALOG_PREFER, prefer); - } - - /* - public void setXmlCatalogAllowPi(String allow) { - initialOps.setProperty( - Settings.NAME_XML_CATALOG_ALLOW_PI, antBooleanToTdd(allow)); - } - */ - - public void setValidateXml(String validate) { - initialOps.setProperty( - Settings.NAME_VALIDATE_XML, antBooleanToTdd(validate)); - } - - public void setXmlRenderings(String prefer) { - if (initialOps.getProperty(Settings.NAME_XML_RENDERINGS) != null) { - throw newMultipleDefinitionsException(Settings.NAME_XML_RENDERINGS); - } - initialOps.setProperty(Settings.NAME_XML_RENDERINGS, prefer); - } - - public void setQuiet(String quiet) { - initialOps.setProperty(Settings.NAME_QUIET, antBooleanToTdd(quiet)); - } - - public void setReplaceExtensions(String replaceExtension) { - initialOps.setProperty( - Settings.NAME_REPLACE_EXTENSIONS, replaceExtension); - } - - public void setRemoveExtensions(String removeExtension) { - initialOps.setProperty( - Settings.NAME_REMOVE_EXTENSIONS, removeExtension); - } - - public void setRemovePostfixes(String removePostfix) { - initialOps.setProperty(Settings.NAME_REMOVE_POSTFIXES, removePostfix); - } - - public void setReplaceExtension(String replaceExtension) { - initialOps.setProperty( - Settings.OLD_NAME_REPLACE_EXTENSION, replaceExtension); - } - - public void setRemoveExtension(String removeExtension) { - initialOps.setProperty( - Settings.OLD_NAME_REMOVE_EXTENSION, removeExtension); - } - - public void setRemovePostfix(String removePostfix) { - initialOps.setProperty( - Settings.OLD_NAME_REMOVE_POSTFIX, removePostfix); - } - - public void setSourceEncoding(String sourceEncoding) { - initialOps.setProperty(Settings.NAME_SOURCE_ENCODING, sourceEncoding); - } - - public void setStopOnError(boolean stopOnError) { - initialOps.setProperty( - Settings.NAME_STOP_ON_ERROR, String.valueOf(stopOnError)); - } - - public void setSkipUnchanged(String skipUnchanged) { - initialOps.setProperty(Settings.NAME_SKIP_UNCHANGED, skipUnchanged); - } - - public void setTemplateData(String templateData) { - initialOps.setProperty(Settings.NAME_TEMPLATE_DATA, templateData); - } - - public void setDir(File dir) { - this.dir = dir; - } - - public void addConfiguredModes(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_MODES, ats); - } - - public void addConfiguredData(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_DATA, ats); - } - - public void addConfiguredLocalData(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_LOCAL_DATA, ats); - } - - public void addConfiguredBorders(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_BORDERS, ats); - } - - public void addConfiguredTurns(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_TURNS, ats); - } - - public void addConfiguredXmlRenderings(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_XML_RENDERINGS, ats); - } - - public void addConfiguredFreemarkerLinks(AntAttributeSubstitution ats) { - doAttributeSubstitution(Settings.NAME_FREEMARKER_LINKS, ats); - } - - public Target getTarget() { - return getOwningTarget(); - } - - public void execute() throws CausePrinterBuildException { - AntProgressListener antProgressListener; - LoggerProgressListener fileLogger = null; - - try { - Logger.selectLoggerLibrary(Logger.LIBRARY_NONE); - } catch (ClassNotFoundException e) { - throw new RuntimeExceptionCC( - "Failed to disable FreeMarker logging", e); - } - - Settings ss; - - try { - boolean singleFileMode; - boolean quiet; - boolean expert; - try { - ss = new Settings(getProject().getBaseDir()); - ss.setEngineAttribute( - AntTaskDataLoader.ATTRIBUTE_ANT_TASK, this); - - Settings.fixVersion08SettingNames(initialOps); - ss.addWithStrings(initialOps); - - if (configuration != null) { - ss.loadDefaults(new File(configuration)); - } - - FileWithSettingValue fws - = (FileWithSettingValue) - ss.get(Settings.NAME_LOG_FILE); - if (fws != null - && !fws.getSettingValue().equals(Settings.VALUE_NONE)) { - try { - Boolean append = (Boolean) - ss.get(Settings.NAME_APPEND_LOG_FILE); - fileLogger = new LoggerProgressListener( - fws, append != null && append.booleanValue()); - ss.addProgressListener(fileLogger); - } catch (IOException e) { - throw new SettingException( - "Failed to create log file.", e); - } - } - - // single file mode - if (ss.get(Settings.NAME_OUTPUT_FILE) != null) { - singleFileMode = true; - } else { - if (hasSourceFileAttr) { - throw new SettingException( - "Attribute \"sourceFile\" can be used in " - + "single file mode only."); - } - singleFileMode = false; - } - - // Disable CVS/SVN file and temporary file ignoring, - // as it interferes with defaultexcludes="no" - ss.add(Settings.NAME_IGNORE_CVS_FILES, Boolean.FALSE); - ss.add(Settings.NAME_IGNORE_SVN_FILES, Boolean.FALSE); - ss.add(Settings.NAME_IGNORE_TEMPORARY_FILES, Boolean.FALSE); - - try { - // Check for misconfigured output root - Object o = ss.get(Settings.NAME_EXPERT); - expert = o == null ? false : ((Boolean) o).booleanValue(); - o = ss.get(Settings.NAME_OUTPUT_ROOT); - if (o != null - && ((File) o).getCanonicalFile().equals( - getProject().getBaseDir() - .getCanonicalFile()) - && !expert) { - throw new SettingException( - "The output root directory is the same as the " - + "project base directory. Maybe something was " - + "misconfigured here? Use expert=\"yes\" to " + "allow this."); - } - } catch (IOException e) { - throw new SettingException( - "Output root directory or project base directory " + "caninalization failed.", - e); - } - - // Add listeners - try { - int q = Settings.quietSettingValueToInt( - (String) ss.get(Settings.NAME_QUIET), - Settings.NAME_QUIET); - quiet = q > 0; - } catch (SettingException e) { - throw new CausePrinterBuildException( - "Failed to interpret the value of setting \"" + Settings.NAME_QUIET + "\".", - e); - } - antProgressListener = new AntProgressListener( - this, quiet || singleFileMode); - ss.addProgressListener(antProgressListener); - - // Add more sources - if (!singleFileMode) { - File sourceRoot = (File) ss.get(Settings.NAME_SOURCE_ROOT); - if (sourceRoot == null) { - throw new CausePrinterBuildException( - "Setting \"" + Settings.NAME_SOURCE_ROOT - + "\" is not set."); - } - File scannerBase = dir != null ? dir : sourceRoot; - - String[] scanResults = MiscUtil.add( - getDirectoryScanner(scannerBase) - .getIncludedFiles(), - getDirectoryScanner(scannerBase) - .getIncludedDirectories()); - String[] sourceFiles = new String[scanResults.length]; - for (int i = 0; i < scanResults.length; i++) { - File f = new File(scannerBase, scanResults[i]); - sourceFiles[i] = f.getAbsolutePath(); - } - ss.add(Settings.NAME_SOURCES, sourceFiles); - - scanResults = getDirectoryScanner(scannerBase) - .getIncludedDirectories(); - String[] sourceDirectories = new String[scanResults.length]; - for (int i = 0; i < scanResults.length; i++) { - File f = new File(scannerBase, scanResults[i]); - sourceDirectories[i] = f.getAbsolutePath(); - } - } - } catch (SettingException e) { - if (fileLogger != null) { - fileLogger.println( - "Failed to initialize FMPP engine:" - + StringUtil.LINE_BREAK - + MiscUtil.causeMessages(e)); - fileLogger.printStackTrace(e); - } - throw new CausePrinterBuildException( - "Failed to initialize FMPP engine.", e); - } - - ss.setDontTraverseDirectories(true); - try { - ss.execute(); - if (antProgressListener.getErrorCount() != 0) { - if (antTaskFailOnError) { - throw new CausePrinterBuildException( - "FMPP Ant task failed: There were errors " + "during the processing session."); - } - } else if (singleFileMode && !quiet) { - log("File processed."); - } - } catch (ProcessingException e) { - // It's already logged by the progress listener, - // so no extra logging is needed here. - if (antTaskFailOnError) { - throw new CausePrinterBuildException( - "FMPP processing session failed.", e.getCause()); - } - } catch (SettingException e) { - // It was not logged by the progress listerner, as the - // processing session didn't started. Has to be logged - // into the log file here. - if (fileLogger != null) { - fileLogger.println(">>> TERMINATED WITH SETTING ERROR <<<"); - fileLogger.println(MiscUtil.causeMessages(e)); - fileLogger.printStackTrace(e); - } - - // And now this is for Ant: - throw new CausePrinterBuildException( - "Failed to initialize FMPP engine.", e); - } - } finally { - if (fileLogger != null) { - fileLogger.close(); - } - } - } - - /** - * Used internally (must be public class for technical reasons). - */ - public static class AntAttributeSubstitution extends ProjectComponent { - private String text; - private boolean expandProperties = false; - - public void setExpandProperties(boolean expandProperties) { - this.expandProperties = expandProperties; - } - - public void addText(String text) { - this.text = text; - } - - public String getText() { - if (text == null) { - text = ""; - } - if (expandProperties) { - return getProject().replaceProperties(text); - } - return text; - } - } - - private String antBooleanToTdd(String s) { - if (s != null) { - if (s.equals("no")) { - return "false"; - } else if (s.equals("yes")) { - return "true"; - } - } - return s; - } - - private void doAttributeSubstitution( - String settingName, AntAttributeSubstitution ats) { - if (initialOps.getProperty(settingName) != null) { - throw newMultipleDefinitionsException(settingName); - } - initialOps.setProperty(settingName, ats.getText()); - } - - private CausePrinterBuildException newMultipleDefinitionsException( - String setting) { - return new CausePrinterBuildException( - "You can't use both attribute \"" + setting - + "\" and element \"" + setting + "\", nor use the element " - + "for multiple times."); - } - - /** - * The message of this exception is the message given in the constructor - * plus the cause trace. This is required because Ant only prints the - * result of getMessage. - */ - class CausePrinterBuildException extends BuildException { - - private static final long serialVersionUID = 1L; - - public CausePrinterBuildException(String message) { - super(message); - } - - public CausePrinterBuildException(String message, Throwable exc) { - super( - message + StringUtil.LINE_BREAK + "Caused by: " - + MiscUtil.causeMessages(exc), - exc); - } - } -} diff --git a/fmpp/src/main/java/fmpp/tools/CommandLine.java b/fmpp/src/main/java/fmpp/tools/CommandLine.java deleted file mode 100644 index 1f5556e..0000000 --- a/fmpp/src/main/java/fmpp/tools/CommandLine.java +++ /dev/null @@ -1,1083 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.tools; - -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Iterator; -import java.util.Locale; -import java.util.Properties; - -import fmpp.Engine; -import fmpp.ProcessingException; -import fmpp.progresslisteners.ConsoleProgressListener; -import fmpp.progresslisteners.LoggerProgressListener; -import fmpp.progresslisteners.StatisticsProgressListener; -import fmpp.progresslisteners.TerseConsoleProgressListener; -import fmpp.setting.FileWithSettingValue; -import fmpp.setting.SettingException; -import fmpp.setting.Settings; -import fmpp.util.ArgsParser; -import fmpp.util.ArgsParser.OptionDefinition; -import fmpp.util.FileUtil; -import fmpp.util.MiscUtil; -import fmpp.util.NullOutputStream; -import fmpp.util.RuntimeExceptionCC; -import fmpp.util.StringUtil; -import freemarker.log.Logger; -import freemarker.template.Configuration; -import freemarker.template.Version; - -/** - * Command-line tool for preprocessing single files or entire directories. - */ -public class CommandLine { - - /** - * The number of console (terminal) columns can be passed in with this environment variable, supposedly by the - * OS-specific starter executable (shell script). Note that if the {@link Settings#NAME_COLUMNS} is set, that will - * override this (but by default it isn't set). The value of the environment variable should be just an integer - * (with possible white space around it), however, if it's not a number, {@link CommandLine} will attempt to parse - * it as the output of the Windows {@code mode con /status} command (also then {@code [BR]} can be used instead of - * real line-breaks, to ease bat programming). On UN*X-es usually this should be the output of {@code tput cols}. - */ - public static final String FMPP_CONSOLE_COLS = "FMPP_CONSOLE_COLS"; - - /** Use only as last resort! */ - private static final int DEFAULT_CONSOLE_COLS = 80; - - // Option keys: - private static final String OPTION_CONFIGURATION = "configuration"; - private static final String OPTION_PRINT_LOCALES = "print-locales"; - private static final String OPTION_VERSION = "version"; - private static final String OPTION_HELP = "help"; - private static final String OPTION_LONG_HELP = "long-help"; - - // Misc. static: - private static final String RC_FILE_NAME = ".fmpprc"; - private static final int EF_NORMAL = 0; - private static final int EF_TERSE = 1; - private static final int EF_QUIET = 2; - - // Option variables: - private boolean quiet; - private boolean printStackTrace; - - // Misc.: - private PrintWriter stdout; - private PrintWriter stderr; - private PrintWriter tOut; - private PrintWriter eOut; - private Integer screenCols; - private boolean loggingStarted = false; - private LoggerProgressListener logListener; - - /** - * Runs the command line interface. - * - * @see #FMPP_CONSOLE_COLS - */ - public static void main(String[] args) { - int exitCode = execute(args, null, null); - if (exitCode != 0) { - System.exit(exitCode); - } - } - - /** - * Emulates the command-line invocation of the tool. - * - * @param args the command line arguments - * @param stdout the PrintWriter used as stdout. - * If it is null then it defaults to the real stdout. - * @param stderr the PrintWriter used as stderr. - * If it is null then it defaults to the real stderr. - * - * @return exit code. 0 if everything was OK, non-0 if there was an error. - */ - public static int execute( - String[] args, PrintWriter stdout, PrintWriter stderr) { - CommandLine tool = new CommandLine(); - tool.stdout = - stdout == null ? new PrintWriter(System.out, true) : stdout; - tool.stderr = - stderr == null ? new PrintWriter(System.err, true) : stderr; - tool.tOut = tool.stdout; - tool.eOut = tool.tOut; - - tool.screenCols = getScreenColsFromEnvVar(); - - return tool.run(args); - } - - /** - * Returns the number of console columns passed in environment variable, or {@code null}. - * - * @see #FMPP_CONSOLE_COLS - */ - private static Integer getScreenColsFromEnvVar() { - String colsStr = System.getenv(FMPP_CONSOLE_COLS); - if (colsStr == null) return null; - colsStr = StringUtil.normalizeLinebreaks(colsStr); - colsStr = StringUtil.replace(colsStr, "[BR]", "\n"); - colsStr = colsStr.trim(); - if (colsStr.startsWith("CON:")) { // This is probably Windows `mode con /status` output. - String[] rows = StringUtil.split(colsStr, '\n'); - int cols = 0; - boolean colsFoundByName = false; - int rowsWithNumValue = 0; - findColumnsRow: for (int i = 0; i < rows.length; i++) { - String row = rows[i]; - int colonIdx = row.indexOf(':'); - if (colonIdx > 0) { - String rowValueStr = row.substring(colonIdx + 1).trim(); - Integer rowValue; - try { - rowValue = Integer.valueOf(rowValueStr); - } catch (NumberFormatException e) { - rowValue = null; - } - if (rowValue != null) { - rowsWithNumValue++; - - String rowLabel = row.substring(0, colonIdx).trim().toLowerCase(); - if ("columns".equals(rowLabel) || "cols".equals(rowLabel) || "spalten".equals(rowLabel) - || "colonnes".equals(rowLabel) || "columnas".equals(rowLabel) - || "\uF99C".equals(rowLabel)) { - cols = rowValue.intValue(); - colsFoundByName = true; - break findColumnsRow; - } - - // The 2nd column with numerical value used to be the number of columns: - if (rowsWithNumValue == 2) { - cols = rowValue.intValue(); - } - } - } - } - // If not found by name, some heuristics to decide if the output of "mode con" has changed too much for - // safe parsing. - if (colsFoundByName || (rowsWithNumValue >= 4 && cols >= 20 && cols < 800)) { - return new Integer(cols); - } else { - return null; - } - } else { - try { - return Integer.valueOf(colsStr); - } catch (NumberFormatException e) { - return null; - } - } - } - - private int run(String[] args) { - String s; - int i; - int exitCode = 0; - - try { - Logger.selectLoggerLibrary(Logger.LIBRARY_NONE); - } catch (ClassNotFoundException e) { - throw new RuntimeExceptionCC( - "Failed to disable FreeMarker logging", e); - } - - File rcFile = null; - s = System.getProperty("user.home"); - if (s != null) { - rcFile = new File(s, RC_FILE_NAME); - if (!rcFile.isFile()) { - rcFile = null; - } - } - if (rcFile == null) { - s = System.getProperty("fmpp.userHome"); - if (s != null) { - rcFile = new File(s, RC_FILE_NAME); - if (!rcFile.isFile()) { - rcFile = null; - } - } - } - if (rcFile == null) { - // Windows hack... - s = System.getProperty("fmpp.home"); - if (s != null && !s.startsWith("%")) { - rcFile = new File(s, RC_FILE_NAME); - if (!rcFile.isFile()) { - rcFile = null; - } - } - } - int impliedEchoFormat = EF_NORMAL; - boolean impliedPrintStackTrace = false; - boolean impliedAppendLogFile = false; - int impliedQuiet = 0; - if (rcFile != null) { - try { - Settings fmpprc = new Settings(new File("."));; - fmpprc.load(rcFile); - Iterator it = fmpprc.getNames(); - while (it.hasNext()) { - String key = (String) it.next(); - String value; - if (key.equals(Settings.NAME_ECHO_FORMAT)) { - value = (String) fmpprc.get(key); - impliedEchoFormat = echoFormatOpToInt( - value, false, key); - } else if (key.equals(Settings.NAME_PRINT_STACK_TRACE)) { - impliedPrintStackTrace - = ((Boolean) fmpprc.get(key)).booleanValue(); - } else if (key.equals(Settings.NAME_SNIP)) { - impliedPrintStackTrace - = !((Boolean) fmpprc.get(key)).booleanValue(); - } else if (key.equals(Settings.NAME_APPEND_LOG_FILE)) { - impliedAppendLogFile - = ((Boolean) fmpprc.get(key)).booleanValue(); - } else if (key.equals(Settings.NAME_COLUMNS)) { - screenCols = (Integer) fmpprc.get(key); - } else if (key.equals(Settings.NAME_QUIET)) { - value = (String) fmpprc.get(key); - impliedQuiet - = Settings.quietSettingValueToInt(value, key); - } else { - throw new SettingException( - "Setting \"" + key + "\" is not allowed in " + ".fmpprc. In general, not setting that " - + "could influence the output files can be " + "set here."); - } - } - } catch (SettingException e) { - p("Error loading .fmpprc."); - p(MiscUtil.causeMessages(e)); - return -1; - } - } - - final File defaultCfg = Settings.getDefaultConfigurationFile(new File(".")); - if (args.length == 0 && defaultCfg == null) { - printHelp(null); - return -1; - } - - try { - - // ----------------------------------------------------------------- - // Parse cmd line - - ArgsParser ap = new ArgsParser(); - - OptionDefinition od; - ap.addOption("S DIR", cln(Settings.NAME_SOURCE_ROOT)) - .desc("Sets the root directory of source files. " - + "In bulk-mode it defaults to the current " + "working directory."); - ap.addOption("O DIR", cln(Settings.NAME_OUTPUT_ROOT)) - .desc("Sets the root directory of output files."); - ap.addOption("o FILE", cln(Settings.NAME_OUTPUT_FILE)) - .desc("The output file. This switches FMPP to single-file " - + "mode."); - ap.addOption(null, cln(Settings.NAME_FREEMARKER_LINKS) + "=MAP") - .desc("The map of FreeMarker links (external includes)."); - ap.addOption("U WHAT", cln(Settings.NAME_SKIP_UNCHANGED)) - .desc("Skip files if the source was not modified " - + "after the output file was last modified. " - + " can be \"all\", \"none\" or \"static\""); - ap.addOption(null, cln(Settings.NAME_DATA_ROOT) + "=DIR") - .desc("Sets the root directory of data files. " - + "The reserved value \"source\" means that the " - + "data root is the same as the source root. " - + "The default value is \"source\"."); - ap.addOption("C FILE", OPTION_CONFIGURATION) - .desc("Load settings from a configuration " - + "file. Settings given with command-line options " + "have higher priority (note that some settings " - + "are merged, rather than overridden). " - + "Be default fmpp will use " + "./config.fmpp or ./fmpp.cfg if that exists. " + "Use value \"none\" (-C none) to prevent this."); - ap.addOption(null, - cln(Settings.NAME_INHERIT_CONFIGURATION) + " FILE") - .desc("Inherits options from a configuration file. " - + "The options in the primary configuration " + "file (-C) has higher precednece."); - ap.addOption("M SEQ", cln(Settings.NAME_MODES)) - .desc("The list of TDD function calls that choose the file " - + "processing mode, e.g.:\n" - + "-M \"ignore(**/tmp/), execute(**/*.htm, " + "**/*.html), copy(**/*)\""); - ap.addOption(null, cln(Settings.NAME_TURNS) + "=SEQ") - .desc("The list of turn(...)-s that choose the " - + "turns of processings, e.g.:\n" - + "--turns \"turn(2, **/*_t2.*, ), " - + "turn(3, **/*_t3.*, **/*.toc)\"\n" - + "By default all files will be procesed in the " - + "first turn."); - ap.addOption(null, cln(Settings.NAME_BORDERS) + "=SEQ") - .desc("The list of TDD function calls that choose header " - + "and footer for templates, e.g.:\n" - + "-M 'border(\"<#escape x as x?html>\", " - + "\"\", *.htm, *.html), " - + "header(\"<#include \\\"/css.ftl\\\">\", *.css)'" - ); - ap.addOption("D TDD", cln(Settings.NAME_DATA)) - .desc("Creates shared data that all template will see. " - + " is the Textual Data Definition, e.g.:\n" - + "-D \"properties(style.properties), " + "onLine:true\"\n" - + "Note that paths like \"style.properties\" are " - + "relatve to the data root directory."); - Version maxFMVer = Configuration.getVersion(); - Version defFMVer = Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS; - ap.addOption(null, cln(Settings.NAME_FREEMARKER_INCOMPATIBLE_IMPROVEMENTS) + "=VER") - .desc("Enables the FreeMarker fixes/improvements that are not 100% backward compatible, and " - + "were implemented in FreeMarker version . " - + "In older projects using the highest available 2.3.x is usually a good " - + "compromise. New projects should use the maximum, which is currently \"" - + maxFMVer.getMajor() + "." + maxFMVer.getMinor() + "." + maxFMVer.getMicro() + "\". " - + "The default is \"" - + defFMVer.getMajor() + "." + defFMVer.getMinor() + "." + defFMVer.getMicro() + "\"."); - ap.addOption(null, cln(Settings.NAME_OBJECT_WRAPPER) + "=BSH") - .desc("Specifies the ObjectWrapper to use with a BeanShell " - + "expression that must evaluate to an object " - + "that extends BeansWrapper. The default value is " - + "a BeansWrapper instance with simpleMapWrapper " - + "set to true."); - ap.addOption(null, cln(Settings.NAME_LOCAL_DATA) + "=SEQ") - .desc("Creates data that is visible only for certain " - + "templates. This is a list of case(...) and " + "layer() function calls."); - ap.addOption(null, cln(Settings.NAME_TEMPLATE_DATA) + "=CLASS") - .desc("Creates Java object that builds data for " - + "individual templates.") - .hide(); - ap.addOption("s", cln(Settings.NAME_STOP_ON_ERROR)) - .propertyValue("true") - .implied() - .desc("Terminate fmpp on failed file processing. " - + "This is the default behaviour. " - + "Use -c to override this."); - ap.addOption("c", "continue-on-error") - .property(cln(Settings.NAME_STOP_ON_ERROR), "false") - .implied() - .desc("Skip to the next file on failed file processing " - + "(and log the error: see -L)"); - ap.addOption("E ENC", cln(Settings.NAME_SOURCE_ENCODING)) - .desc("The encoding of textual sources (templates). " - + "Use the special value \"host\" (-E host) if the " - + "default encoding of the host machine should " - + "be used. The default is " - + "\"ISO-8859-1\"."); - ap.addOption(null, cln(Settings.NAME_OUTPUT_ENCODING) + "=ENC") - .desc("The encoding of template output. Use the special " - + "value \"source\" if the encoding of the " - + "template file should be used. " - + "Use the special value \"host\" if the " - + "default encoding of the host machine should " - + "be used. " - + "The default is \"source\"."); - ap.addOption(null, cln(Settings.NAME_URL_ESCAPING_CHARSET) + "=ENC") - .desc("The charset used for URL escaping. Use the special " - + "value \"output\" if the encoding of the " - + "output file should be used. " - + "The default is \"output\"."); - ap.addOption("A LOC", cln(Settings.NAME_LOCALE)) - .desc("The locale (as ar_SA). Use the special value " - + "\"host\" (-A host) if the default locale of " - + "the host machine should be used. " - + "The default value of the option is en_US."); - ap.addOption(null, cln(Settings.NAME_NUMBER_FORMAT) + "=FORMAT") - .desc("The number format used to show numerical values. " - + "The default is 0.############"); - ap.addOption(null, cln(Settings.NAME_BOOLEAN_FORMAT) + "=FORMAT") - .desc("The boolean format used to show boolean values, like \"Yes,No\". Not \"true,false\"; " - + "use ${myBool?c} for that. The default is error on ${myBool}."); - ap.addOption(null, cln(Settings.NAME_DATE_FORMAT) + "=FORMAT") - .desc("The format used to show date (year+month+day) " - + "values. The default is locale dependent."); - ap.addOption(null, cln(Settings.NAME_TIME_FORMAT) + "=FORMAT") - .desc("The format used to show time values. " - + "The default is locale dependent."); - ap.addOption(null, cln(Settings.NAME_DATETIME_FORMAT) + "=FORMAT") - .desc("The format used to show date-time values. " - + "The default is locale dependent."); - ap.addOption(null, cln(Settings.NAME_TIME_ZONE) + "=ZONE") - .desc("Sets the time zone in which date/time/date-time values are shown. " - + "The default is the time zone of the host " - + "machine. Example: GMT+02"); - ap.addOption(null, cln(Settings.NAME_SQL_DATE_AND_TIME_TIME_ZONE) + "=ZONE") - .desc("Sets a different time zone for java.sql.Date and java.sql.Time only."); - ap.addOption(null, cln(Settings.NAME_TAG_SYNTAX) + "=WHAT") - .desc("Sets the tag syntax for templates that doesn't start " - + "with the ftl directive. Possible values are: " - + Settings.VALUE_TAG_SYNTAX_ANGLE_BRACKET + ", " - + Settings.VALUE_TAG_SYNTAX_SQUARE_BRACKET + ", " - + Settings.VALUE_TAG_SYNTAX_AUTO_DETECT + ". The default " - + "depends on the FreeMarker version. The recommended " - + "value is " + Settings.VALUE_TAG_SYNTAX_AUTO_DETECT - + "."); - ap.addOption(null, cln(Settings.NAME_CASE_SENSITIVE)) - .propertyValue("true") - .desc("Upper- and lower-case letters are considered as " - + "different characters when comparing or matching " - + "paths."); - ap.addOption(null, "ignore-case") - .property(cln(Settings.NAME_CASE_SENSITIVE), "false") - .implied() - .desc("Upper- and lower-case letters are considered as " - + "the same characters when comparing or matching " - + "paths. This is the default."); - ap.addOption(null, cln(Settings.NAME_ALWAYS_CREATE_DIRECTORIES)) - .propertyValue("true") - .desc("Create output subdirectory even if it will remain " - + "empty. Defaults to false."); - ap.addOption(null, cln(Settings.NAME_IGNORE_CVS_FILES)) - .implied() - .desc("Ignore CVS files in the source root directory. " - + "This is the default."); - ap.addOption(null, "dont-" + cln(Settings.NAME_IGNORE_CVS_FILES)) - .property(cln(Settings.NAME_IGNORE_CVS_FILES), "false") - .desc("Don't ignore CVS files in the source root " - + "directory."); - ap.addOption(null, cln(Settings.NAME_IGNORE_SVN_FILES)) - .implied() - .desc("Ignore SVN files in the source root directory. " - + "This is the default."); - ap.addOption(null, "dont-" + cln(Settings.NAME_IGNORE_SVN_FILES)) - .property(cln(Settings.NAME_IGNORE_SVN_FILES), "false") - .desc("Don't ignore SVN files in the source root " - + "directory."); - ap.addOption(null, cln(Settings.NAME_IGNORE_TEMPORARY_FILES)) - .implied() - .desc("Ignore well-known temporary files (e.g. **/?*~) in " + "the source root directory. " + "This is the default."); - ap.addOption(null, - "dont-" + cln(Settings.NAME_IGNORE_TEMPORARY_FILES)) - .property(cln(Settings.NAME_IGNORE_TEMPORARY_FILES), "false") - .desc("Don't ignore well-known temporary files in the " - + "source root directory."); - ap.addOption("R SEQ", cln(Settings.NAME_REMOVE_EXTENSIONS)) - .desc("These extensions will be removed from the output " - + "file name. contains the extensions " + "without the dot."); - ap.addOption(null, cln(Settings.OLD_NAME_REMOVE_EXTENSION) + "=L") - .hide(); - ap.addOption(null, cln(Settings.NAME_REPLACE_EXTENSIONS) + "=SEQ") - .desc("Replaces the extensions with another exensions. " - + "The list contains the old and new extensions " - + "alternately; old1, new1, old2, new2, etc. " - + "The extensions in the do not contain " - + "the dot."); - ap.addOption(null, cln(Settings.OLD_NAME_REPLACE_EXTENSION) + "=L") - .hide(); - ap.addOption(null, cln(Settings.NAME_REMOVE_POSTFIXES) + "=SEQ") - .desc("If the source file name without the extension ends " - + "with a string in the , then that string " - + "will be removed from the output file name."); - ap.addOption(null, cln(Settings.OLD_NAME_REMOVE_POSTFIX) + "=L") - .hide(); - ap.addOption("L FILE", cln(Settings.NAME_LOG_FILE)) - .implied("none") - .desc("Sets the log file. " - + "Use \"none\" (-L none) to disable logging. " - + "The default is \"none\"."); - od = ap.addOption(null, cln(Settings.NAME_APPEND_LOG_FILE)) - .desc("If the log file already exists, it will be " + "continuted, instead of restarting it."); - if (impliedAppendLogFile) { - setAsDefault(od); - } - od = ap.addOption(null, "dont-" + cln(Settings.NAME_APPEND_LOG_FILE)) - .property(cln(Settings.NAME_APPEND_LOG_FILE), "false") - .desc("If the log file already exists, it will be " + "restarted."); - if (!impliedAppendLogFile) { - setAsDefault(od); - } - ap.addOption(null, cln(Settings.NAME_CONFIGURATION_BASE) + "=DIR") - .desc("The directory used as base to " - + "resolve relative paths in the configuration " - + "file. It defaults to the directory of the " - + "configuration file."); - ap.addOption("x", cln(Settings.NAME_EXPERT)) - .propertyValue("true") - .desc("Expert mode."); - ap.addOption(null, "not-expert") - .property(cln(Settings.NAME_EXPERT), "false") - .desc("Disables expert mode. This is the default."); - ap.addOption(null, cln(Settings.NAME_XML_RENDERINGS) + "=SEQ") - .desc("Sets the sequence of XML renderings. Each item is " - + "hash, that stores the options of an XML " - + "rendering configuration."); - ap.addOption(null, cln(Settings.NAME_XPATH_ENGINE) + "=NAME") - .desc("Sets the XPath engine to be used. Legal values are: " - + Engine.XPATH_ENGINE_DONT_SET + ", " - + Engine.XPATH_ENGINE_DEFAULT + ", " - + Engine.XPATH_ENGINE_JAXEN + ", " - + Engine.XPATH_ENGINE_XALAN + ", " - + "and any adapter class name."); - ap.addOption(null, cln(Settings.NAME_XML_CATALOG_FILES) + "=SEQ") - .desc("Sets the catalog files used for XML entity " + "resolution. Catalog based resolution is enabled if " - + "and only if this settings is specified."); - ap.addOption(null, cln(Settings.NAME_XML_CATALOG_PREFER) + "=WHAT") - .desc("Sets if catalog file based XML entity resolution " - + "prefers public or system identifiers. Valid " + "values are: " - + Settings.VALUE_XML_CATALOG_PREFER_PUBLIC + ", " - + Settings.VALUE_XML_CATALOG_PREFER_SYSTEM + ", " - + Settings.VALUE_GLOBAL_DEFAULT + ". Defaults to " - + Settings.VALUE_XML_CATALOG_PREFER_PUBLIC + "."); - /* - ap.addOption(null, - dn(Settings.NAME_XML_CATALOG_ALLOW_PI) + " ALLOW") - .desc("Sets if catalog PI-s are allowed. Valid values " + "are booleans and \"" - + Settings.VALUE_GLOBAL_DEFAULT + "\"."); - */ - ap.addOption(null, cln(Settings.NAME_VALIDATE_XML)) - .desc("Sets that XML files will be validated by default."); - ap.addOption(null, "dont-" + cln(Settings.NAME_VALIDATE_XML)) - .property(cln(Settings.NAME_VALIDATE_XML), "false") - .desc("Sets that XML files will not be validated by " + "default. This is the default."); - od = ap.addOption("v", "verbose") - .property(cln(Settings.NAME_QUIET), "false") - .desc("The opposite of -Q: prints everything to " + "the stdout."); - if (impliedQuiet == 0) { - setAsDefault(od); - } - od = ap.addOption("q", cln(Settings.NAME_QUIET)) - .property(cln(Settings.NAME_QUIET), "true") - .desc("Don't write to the stdout, unless the command-line " - + "arguments are wrong. Print warning and error " + "messages to the stderr."); - if (impliedQuiet == 1) { - setAsDefault(od); - } - od = ap.addOption("Q", "really-quiet") - .property(cln(Settings.NAME_QUIET), - Settings.VALUE_REALLY_QUIET) - .desc("As -q, but doesn't even write to the stderr."); - if (impliedQuiet == 2) { - setAsDefault(od); - } - ap.addOption("F FORMAT", cln(Settings.NAME_ECHO_FORMAT)) - .implied(echoFormatToString(impliedEchoFormat)) - .desc("The format used for displaying the progress. " - + " is n[ormal], t[erse] or q[uiet] " - + "(or v[erbose], which is the same as normal). " - + "The default is " - + echoFormatToString(impliedEchoFormat) + "."); - ap.addOption(null, cln(Settings.NAME_COLUMNS) + "=COLS") - .desc("The number of columns on the console screen. Use when auto-detection gives bad result."); - od = ap.addOption(null, cln(Settings.NAME_PRINT_STACK_TRACE)) - .property(cln(Settings.NAME_PRINT_STACK_TRACE), "true") - .desc("Print stack trace on error."); - if (impliedPrintStackTrace) { - setAsDefault(od); - } - od = ap.addOption(null, "dont-" + cln(Settings.NAME_PRINT_STACK_TRACE)) - .property(cln(Settings.NAME_PRINT_STACK_TRACE), "false") - .desc("Don't print stack trace on error, just cause chain."); - if (!impliedPrintStackTrace) { - setAsDefault(od); - } - od = ap.addOption(null, cln(Settings.NAME_SNIP)) - .property(cln(Settings.NAME_PRINT_STACK_TRACE), "false") - .desc("Deprecated; alias of dont-" + Settings.NAME_PRINT_STACK_TRACE + "."); - od = ap.addOption(null, "dont-" + cln(Settings.NAME_SNIP)) - .property(cln(Settings.NAME_PRINT_STACK_TRACE), "true") - .desc("Deprecated; alias of " + Settings.NAME_PRINT_STACK_TRACE + "."); - ap.addOption(null, OPTION_PRINT_LOCALES) - .desc("Prints the locale codes that Java platform knows."); - ap.addOption(null, OPTION_VERSION) - .desc("Prints version information."); - ap.addOption("h", OPTION_HELP) - .desc("Prints help on options."); - ap.addOption(null, OPTION_LONG_HELP) - .desc("Deprecated; same as -h"); - - Properties impliedOps = new Properties(); - Properties ops; - ap.setDefaultProperties(impliedOps); - try { - ops = ap.parse(args); - args = ap.getNonOptions(); - } catch (ArgsParser.BadArgsException e) { - throw new SettingException( - "Bad command-line: " + MiscUtil.causeMessages(e)); - } - Settings.fixVersion08SettingNames(ops); - - // ----------------------------------------------------------------- - // Pre-interpret some options - - i = Settings.quietSettingValueToInt( - ops.getProperty(cln(Settings.NAME_QUIET)), - cln(Settings.NAME_QUIET)); - if (i > 0) { - quiet = true; - tOut.flush(); - tOut = new PrintWriter(NullOutputStream.INSTANCE); - if (i == 1) { - eOut = stderr; - } else { - eOut = tOut; - } - } else { - quiet = false; - } - - final int screenColsOr0 = opToInt( - ops.getProperty(cln(Settings.NAME_COLUMNS)), - cln(Settings.NAME_COLUMNS)); - if (screenColsOr0 != 0) { - screenCols = new Integer(screenColsOr0); - } - - // ----------------------------------------------------------------- - // Do a special task instead of processing? - - if (ops.containsKey(OPTION_HELP) || ops.containsKey(OPTION_LONG_HELP)) { - printHelp(ap); - throw FinishedException.INSTANCE; - } - - if (ops.containsKey(OPTION_VERSION)) { - p("FMPP version " + Engine.getVersionNumber() - + ", build " + Engine.getBuildInfo()); - p("Currently using FreeMarker version " - + Engine.getFreeMarkerVersionNumber()); - p("For the latest version visit: " + "http://fmpp.sourceforge.net/"); - throw FinishedException.INSTANCE; - } - - if (ops.containsKey(OPTION_PRINT_LOCALES)) { - Locale[] locales = Locale.getAvailableLocales(); - Arrays.sort(locales, new Comparator() { - - public int compare(Object o1, Object o2) { - Locale loc1 = (Locale) o1; - Locale loc2 = (Locale) o2; - int r = ("" + loc1.getLanguage()).compareTo("" + loc2.getLanguage()); - if (r != 0) { - return r; - } - r = ("" + loc1.getCountry()).compareTo("" + loc2.getCountry()); - if (r != 0) { - return r; - } - return ("" + loc1.getVariant()).compareTo("" + loc2.getVariant()); - } - - }); - - StringBuffer sb = new StringBuffer(); - for (i = 0; i < locales.length; i++) { - sb.setLength(0); - - String la = locales[i].getLanguage(); - String co = locales[i].getCountry(); - String va = locales[i].getVariant(); - - sb.append(la); - if (co.length() != 0) { - sb.append("_"); - sb.append(co); - if (va.length() != 0) { - sb.append("_"); - sb.append(va); - } - } - sb.append(" ("); - sb.append(locales[i].getDisplayLanguage()); - if (co.length() != 0) { - sb.append(", "); - sb.append(locales[i].getDisplayCountry()); - if (va.length() != 0) { - sb.append(", "); - sb.append(locales[i].getDisplayVariant()); - } - } - sb.append(")"); - - p(sb.toString(), 0, 3); - } - throw FinishedException.INSTANCE; - } - - // ----------------------------------------------------------------- - // Create the settings - - // Delete implied values, so they don't hide cfg settings - Properties savedImpliedOps = new Properties(); - savedImpliedOps.putAll(impliedOps); - impliedOps.clear(); - - final String opCfg = ops.getProperty(OPTION_CONFIGURATION); - ops.remove(OPTION_CONFIGURATION); // remove non-setting - - Settings settings = new Settings(new File(".")); - settings.undashNames(ops); - settings.addWithStrings(ops); - ops = null; - - // Load cfg file - final File cfgToLoad; - if (opCfg != null) { - cfgToLoad = !opCfg.equals(Settings.VALUE_NONE) ? new File(opCfg) : null; - } else if (defaultCfg != null) { - cfgToLoad = defaultCfg; - p("Note: Using the " + cfgToLoad.getName() + " in the working directory."); - } else { - cfgToLoad = null; - } - if (cfgToLoad != null) { - settings.loadDefaults(cfgToLoad); - } - - // Add implied options - settings.undashNames(savedImpliedOps); - settings.addDefaultsWithStrings(savedImpliedOps); - savedImpliedOps = null; - - // ----------------------------------------------------------------- - // Interpret pre-interpreted options again - - i = Settings.quietSettingValueToInt((String) - settings.get(Settings.NAME_QUIET), Settings.NAME_QUIET); - if (i > 0) { - quiet = true; - tOut.flush(); - tOut = new PrintWriter(NullOutputStream.INSTANCE); - if (i == 1) { - eOut = stderr; - } else { - eOut = tOut; - } - } else { - quiet = false; - } - - final Integer colsOrNull = (Integer) settings.get(Settings.NAME_COLUMNS); - if (colsOrNull != null) { - screenCols = colsOrNull; - } - - // ----------------------------------------------------------------- - // Tool specific setup - - boolean singleFileMode - = settings.get(Settings.NAME_OUTPUT_FILE) != null; - - // - Start logging: - FileWithSettingValue logFile = (FileWithSettingValue) settings.get(Settings.NAME_LOG_FILE); - if (!logFile.getSettingValue().equals("none")) { - startLogging( - logFile, - ((Boolean) settings.get(Settings.NAME_APPEND_LOG_FILE)).booleanValue()); - } - if (logListener != null) { - settings.addProgressListener(logListener); - } - - // - Add non-options - if (args.length != 0) { - settings.add(Settings.NAME_SOURCES, args); - } - - // - Echo format - int ef = echoFormatOpToInt( - (String) settings.get(Settings.NAME_ECHO_FORMAT), - true, Settings.NAME_ECHO_FORMAT); - if (!singleFileMode && !quiet) { - if (ef == EF_NORMAL) { - settings.addProgressListener( - new ConsoleProgressListener(tOut)); - } else if (ef == EF_TERSE) { - settings.addProgressListener( - new TerseConsoleProgressListener(tOut)); - } else if (ef == EF_QUIET) { - settings.addProgressListener( - new ConsoleProgressListener(tOut, true)); - } - } else { - settings.addProgressListener( - new ConsoleProgressListener(eOut, true)); - } - - // - printStackTrace - printStackTrace = ((Boolean) settings.get(Settings.NAME_PRINT_STACK_TRACE)).booleanValue(); - - // - Stats - StatisticsProgressListener stats = new StatisticsProgressListener(); - settings.addProgressListener(stats); - - // - Default source root - if (!singleFileMode) { - settings.addDefault(Settings.NAME_SOURCE_ROOT, "."); - } - - // ----------------------------------------------------------------- - // Processing - - Throwable abortingExc = null; - try { - settings.execute(); - } catch (ProcessingException e) { - abortingExc = e; - } - - if (!singleFileMode) { - p(); - } - if (abortingExc != null) { - pe(">>> ABORTED! <<<"); - } else { - if (stats.getFailed() == 0) { - p("*** DONE ***"); - } else { - p(">>> DONE WITH ERRORS <<<"); - } - } - if (!singleFileMode) { - p(); - p(stats.getExecuted() + " executed + " - + stats.getXmlRendered() + " rendered + " - + stats.getCopied() + " copied = " - + stats.getSuccesful() + " successfully processed\n" - + stats.getFailed() + " failed, " - + stats.getWarnings() + " warning(s) "); - p("Time elapsed: " - + (stats.getProcessingTime()) / 1000.0 - + " seconds"); - } - if (abortingExc != null) { - pe(""); - pe("The cause of aborting was: "); - if (abortingExc instanceof ProcessingException) { - ProcessingException procExc = (ProcessingException) abortingExc; - if (!singleFileMode && procExc.getSourceFile() != null) { - pe("Error when processing this file: " - + FileUtil.getRelativePath(procExc.getSourceRoot(), procExc.getSourceFile())); - } - abortingExc = procExc.getCause(); - } - if (printStackTrace) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - abortingExc.printStackTrace(pw); - pw.flush(); - pe(sw.toString()); - } else { - pe(MiscUtil.causeMessages(abortingExc)); - } - exitCode = -2; - } - } catch (IOException e) { - pe("I/O error:"); - pe(e); - - pl(">>> TERMINATED WITH I/O ERROR <<<"); - pl(MiscUtil.causeMessages(e)); - if (logListener != null) { - logListener.printStackTrace(e); - } - exitCode = -2; - } catch (SettingException e) { - pe("Failed!"); - pe(MiscUtil.causeMessages(e)); - - pl(">>> TERMINATED WITH SETTING ERROR <<<"); - pl(MiscUtil.causeMessages(e)); - if (logListener != null) { - logListener.printStackTrace(e); - } - - exitCode = -1; - } catch (FinishedException e) { - exitCode = 0; - } catch (Throwable e) { - pe("INTERNAL ERROR:"); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - pw.close(); - pTrace(sw.toString()); - - pl(">>> TERMINATED WITH INTERNAL ERROR <<<"); - if (logListener != null) { - logListener.printStackTrace(e); - } - - exitCode = -2; - } finally { - tOut.println(); - tOut.flush(); - eOut.flush(); - if (logListener != null) { - logListener.close(); - } - } - return exitCode; - } - - private void printHelp(ArgsParser ap) { - p("Typical usages:"); - p("fmpp -C configfile", 3); - p("fmpp -S sourcedir -O outputdir", 3); - p("fmpp sourcefile -o outputfile", 3); - p("For more examples: http://fmpp.sourceforge.net/commandline.html"); - if (ap == null) { - p("To see all options: fmpp -h"); - } else { - p(); - p("Options:"); - tOut.println(ap.getOptionsHelp(getScreenColumnsOrDefault())); - p(); - p( - "Most options above directly correspond to FMPP settings. " - + "See their full descriptions here: " - + "http://fmpp.sourceforge.net/settings.html"); - } - p(); - tOut.flush(); - } - - private int getScreenColumnsOrDefault() { - return screenCols != null ? screenCols.intValue() : DEFAULT_CONSOLE_COLS; - } - - private void p() { - tOut.println(); - } - - /*unused - private void pt(Object obj) { - pt(obj.toString()); - } - */ - - private void p(String text) { - p(text, 0); - } - - private void p(String text, int indent) { - p(text, indent, indent); - } - - private void p(String text, int firstIndent, int furtherIndent) { - if (screenCols == null && (furtherIndent == firstIndent || furtherIndent == 0)) { - // Fall back to printing without wrapping - tOut.println(StringUtil.repeat(" ", firstIndent) + text); - } else { - tOut.println(StringUtil.wrap(text, getScreenColumnsOrDefault(), firstIndent, furtherIndent)); - } - } - - private void pe(Object obj) { - pe(obj.toString()); - } - - private void pe(String text) { - pe(text, 0); - } - - private void pTrace(String text) { - tOut.println(StringUtil.wrapTrace(text, getScreenColumnsOrDefault())); - } - - private void pe(String text, int indent) { - if (screenCols == null) { - eOut.println(StringUtil.repeat(" ", indent) + text); - } else { - eOut.println(StringUtil.wrap(text, screenCols.intValue(), indent)); - } - } - - private void pl(Object obj) { - if (logListener == null) { - return; - } - logListener.println(obj); - } - - private void startLogging(File logFile, boolean append) - throws SettingException { - if (loggingStarted) { - return; - } - - try { - logListener = new LoggerProgressListener(logFile, append); - } catch (IOException e) { - throw new SettingException("Failed to create log file.", e); - } - - loggingStarted = true; - } - - private static void setAsDefault(OptionDefinition od) { - od.implied(); - od.desc(od.getDescription() + " This is the default."); - } - - private static int echoFormatOpToInt( - String s, boolean ignoreError, String name) - throws SettingException { - s = s.toLowerCase(); - if (s.equals("n") || s.equals("normal") - || s.equals("verbose") || s.equals("v")) { - return EF_NORMAL; - } else if (s.equals("t") || s.equals("terse")) { - return EF_TERSE; - } else if (s.equals("q") || s.equals("quiet")) { - return EF_QUIET; - } else if (ignoreError) { - return EF_NORMAL; - } else { - throw new SettingException( - "Invalid value " + StringUtil.jQuote(s) + " for setting " - + StringUtil.jQuote(name) + ". " - + " Valid values are (case insensitive): " + "\"normal\", \"n\", \"terse\", \"t\", \"quiet\", \"q\"."); - } - } - - private static String echoFormatToString(int ef) { - if (ef == EF_NORMAL) { - return "normal"; - } else if (ef == EF_TERSE) { - return "terse"; - } else if (ef == EF_QUIET) { - return "quiet"; - } else { - return null; - } - } - - private static int opToInt(String value, String name) - throws SettingException { - if (value == null || value.length() == 0) { - return 0; - } else { - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new SettingException("The value of setting \"" + name - + "\" has to be a valid integer."); - } - } - } - - private String cln(String name) { - return Settings.getDashedName(name); - } - - private static class FinishedException extends Exception { - private static final long serialVersionUID = 1L; - private static final FinishedException INSTANCE = new FinishedException(); - } -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/tools/package.html b/fmpp/src/main/java/fmpp/tools/package.html deleted file mode 100644 index b26e205..0000000 --- a/fmpp/src/main/java/fmpp/tools/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    Tools (front-ends) that end-user can use out-of-the-box. - \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/util/ArgsParser.java b/fmpp/src/main/java/fmpp/util/ArgsParser.java deleted file mode 100644 index 6f6bb82..0000000 --- a/fmpp/src/main/java/fmpp/util/ArgsParser.java +++ /dev/null @@ -1,1100 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Properties; -import java.util.Set; - -/** - * Simple command-line argument parser that mimics the logic of UN*X - * tools as {@code ls}. It does not support the logic of tools like - * {@code gcc}. - * - *

    Features: short (1 character) and long option names, options - * with no argument, with optional argument and with mandatory argument, option - * groups (a.k.a. mutually exclusive options), implied options, alias options, - * retrieval of non-options, automatically generates formatted options help. - * - *

    For example, here it is a typical "UN*X command-line": - * - *

    {@code $ ls -laT4 --color=auto --quote-name etc etc/mysql} - * - *

    Here, we have 3 options given with short-name: "l", "a" and "T", and - * 2 options given with long-name: "color" and "quote-name". Two options have - * argument: "T" and "color". Also, we have 2 non-option arguments: - * "etc" and "etc/mysql". According to Java logic, the - * main method doesn't get the program name (here: "ls"), so we don't deal with - * that. - * - *

    A short example, that defines a subset of {@code ls} options: - *

    - * // 1. Create parser instance:
    - * ArgsParser ap = new ArgsParser();
    - * 
    - * // 2. Define the options:
    - * ap.addOption("a", "all")
    - *         .desc("do not hide entries starting with .");
    - * ap.addOption("A", "almost-all")
    - *         .desc("do not list implied . and ..");
    - * ap.addOption("l", null)
    - *         .desc("use a long list format");
    - * ap.addOption("T", "tabsize=COLS")
    - *         .desc("assume tab stops at each COLS instead of 8");
    - * ap.addOption(null, "color=WHEN")
    - *         .defaultArg("always")
    - *         .desc("control whether color is used ...[too long].");
    - * ap.addOption("Q", "quote-name")
    - *         .desc("enclose entry names in double-quotes");
    - * 
    - * // 3. Parse args[]:
    - * try {
    - *     ap.parse(args);
    - * } catch (ArgsParser.BadArgsException exc) {
    - *     System.out.println(exc.getMessage());
    - *     System.exit(-1);
    - * }
    - * 
    - * // 4. Get the results:
    - * Properties ops = ap.getOptions();
    - * String[] nonOps = ap.getNonOptions();
    - *
    - * // 5. Print the results for the sake of testing:
    - * System.out.println("Options:");
    - * Iterator it = ops.entrySet().iterator();
    - * while (it.hasNext()) {
    - *     Map.Entry e = (Map.Entry) it.next();
    - *     System.out.println(
    - *             "- " + e.getKey() + " = " + e.getValue());
    - * }
    - * System.out.println("Non-options:");
    - * for (int i = 0; i < nonOps.length; i++) {
    - *     System.out.println("- " + nonOps[i]);
    - * }
    - * 
    - * - *

    This defines the following options:

    - * - *
    short-namelong-nameargument? - *
    aallno - *
    Aalmost-allno - *
    l no - *
    Ttabsizemandatory - *
     coloroptional, defaults to "always" - *
    Qquote-nameno - *
    - *

    and will parse command-line arguments like: - *
    {@code -laT4 --color=auto --quote-name etc etc/mysql} - * - *

    The resulting properties will be:

    - * - * - *
    namevalue - *
    all"" - *
    l"" - *
    tabsize"4" - *
    color"auto" - *
    quote-name"" - *
    - * - *

    Note that the property name is always the long-name of the option if the - * option has a long-name, otherwise the short-name. Also note that the value of - * options that do not allow argument is 0 length String when the option is - * present, otherwise no property is made for the option (there is no - * "almost-all" propery). - * - *

    For options that has argument it is maybe practical to use implied values - * as: - *

    - * ...
    - * ap.addOption("T", "tabsize=COLS")
    - *         .implied("8")
    - *         .desc("assume tab stops at each COLS instead of 8");
    - * ap.addOption(null, "color=WHEN")
    - *         .implied("none")
    - *         .defaultArg("always")
    - *         .desc("control whether color is used ...[too long].");
    - * ...
    - * 
    - * - *

    If you parse this with the above modification: - *
    {@code -la --quote-name etc etc/mysql}
    - * then the "tabsize" property will be "8", and the - * "color" property will be "none". If you parse this: - *
    {@code -laT4 --color --quote-name etc etc/mysql}
    - * then the "tabsize" property will be "4", and the - * "color" property will be "always" (note that it is - * the default argument of "color", as there was no argument given for that in - * the command-line). - * - *

    You may want to use the same propery name but different value for options - * as "a" and "A". They should be mutually exclusive options anyway: - * - *

    - * ...
    - * ap.addOption("a", "all")
    - *         .property("show", "all")
    - *         .desc("do not hide entries starting with .");
    - * ap.addOption("A", "almost-all")
    - *         .property("show", "almost-all")
    - *         .desc("do not list implied . and ..");
    - * ...
    - * 
    - * - *

    Here you say that both option sets the value of the "show" property - * (instead of setting "all" and "almost-all" properties) to the given values - * ("all" and "almost-all") if the option is present. As usually you want the - * option long-name (or short-name if there is no long-name) as the value of - * the property, there is a conveniece method for this: - * - *

    - * ...
    - * ap.addOption("a", "all")
    - *         .group("show")
    - *         .desc("do not hide entries starting with .");
    - * ap.addOption("A", "almost-all")
    - *         .group("show")
    - *         .desc("do not list implied . and ..");
    - * ...
    - * 
    - * - *

    The {@code parse} method will throw exception if two options in - * args[] tries to set the same property, so the two options will mutually - * exclude each other here. - * - *

    For grouped options you may want to choose an implied option. Say, assume - * you have "format-normal", and a "format-terse" and a "format-verbose" options - * that are mutually exclusively set the value of "format" property. If the user - * do not use any of the "format-..." options, then you want see it as if it - * were a "--format-nomal" in the command-line: - * - *

    - * ...
    - * ap.addOption(null, "format-normal")
    - *         .property("format", "normal")
    - *         .implied();
    - * ap.addOption(null, "format-terse")
    - *         .property("format", "terse");
    - * ap.addOption(null, "format-verbose")
    - *         .property("format", "verbose");
    - * ...
    - * 
    - * - *

    You can print the options help to the screen: - *

    - * System.out.println(ap.getOptionsHelp(80));
    - * 
    - * - *

    For more information please read the documentation of methods. - */ -public class ArgsParser implements java.io.Serializable { - - private static final int WRAP_INDENT = 2; - - private static final int COL_DISTANCE = 3; - - private static final int MAX_LEFT_COL_WIDTH = 30; - - private static final long serialVersionUID = 1L; - - private static final Comparator CMPRTR_OP_KEY = new OptionDefinitionKeyComparator(); - private static final Comparator CMPRTR_OP_SNAME = new OptionDefinitionShortNameComparator(); - private static final Comparator CMPRTR_OP_LNAME = new OptionDefinitionLongNameComparator(); - - // Settings: - private Properties defaultProperties; - private Properties messages; - - // Option definitions: - private ArrayList odsByKey = new ArrayList(); - private ArrayList odsBySName = new ArrayList(); - private ArrayList odsByLName = new ArrayList(); - - // Parsing results: - private Properties prsdOps = new Properties(); - private ArrayList prsdNonOps = new ArrayList(); - private String[] prsdNonOpsArray; - - // Messages - public static final String MSG_OPTION_CONFLICT = "OPTION_CONFLICT"; - public static final String MSG_ARG_MISSING = "ARG_MISSING"; - public static final String MSG_OPTION_UNKNOWN = "OPTION_UNKNOWN"; - public static final String MSG_ARG_NOT_ALLOWED = "NOT_ALLOWED"; - private Properties defaultMessages; - { - defaultMessages = new Properties(); - defaultMessages.put( - MSG_OPTION_CONFLICT, - "This option conflicts with a preceding option: "); - defaultMessages.put( - MSG_ARG_MISSING, - "The argument is missing for this option: "); - defaultMessages.put( - MSG_OPTION_UNKNOWN, - "Unknown option: "); - defaultMessages.put( - MSG_ARG_NOT_ALLOWED, - "This option does not allow argument: "); - } - - /** - * Creates a parser. - */ - public ArgsParser() { - } - - /** - * Parses the args[]. After this, you can get the options and non-options - * with {@link #getOptions getOptions} and - * {@link #getNonOptions getNonOptions}. - * - * @param args the array of Strings that you get as the parameter of - * {@code main} method. - * @throws BadArgsException if the user has entered bad command-line - * arguments. The message in the exception (call - * {@code exception.getMessage()}) contains the (relatively) - * user-frinedly desription of the problem. - * @return the properties object that stores the options. This is the - * same object as {@code getOptions()} returns. - */ - public Properties parse(String[] args) throws BadArgsException { - if (defaultProperties == null) { - prsdOps = new Properties(); - } else { - prsdOps = new Properties(defaultProperties); - } - prsdNonOps.clear(); - prsdNonOpsArray = null; - - OptionDefinition dummy = new OptionDefinition(); - OptionDefinition op; - int opi, x; - args: for (int i = 0; i < args.length; i++) { - String arg = args[i]; - if (arg.startsWith("--")) { - if (arg.equals("--")) { - for (i++; i < args.length; i++) { - prsdNonOps.add(args[i]); - } - break args; - } - arg = arg.substring(2); - x = arg.indexOf('='); - if (x != -1) { - dummy.lName = arg.substring(0, x); - } else { - dummy.lName = arg; - } - opi = Collections.binarySearch( - odsByLName, dummy, CMPRTR_OP_LNAME); - if (opi < 0) { - throw new BadArgsException( - getMessage(MSG_OPTION_UNKNOWN) + dummy.lName); - } - op = (OptionDefinition) odsByLName.get(opi); - if (prsdOps.get(op.pName) != null) { - throw new BadArgsException( - getMessage(MSG_OPTION_CONFLICT) - + dummy.lName); - } - if (op.argType != OptionDefinition.ARGT_NONE) { - if (x == -1) { - if (op.argType == OptionDefinition.ARGT_OPTIONAL) { - prsdOps.put(op.pName, op.defaultArg); - } else { - if (i == args.length - 1) { - throw new BadArgsException( - getMessage(MSG_ARG_MISSING) - + dummy.lName); - } - i++; - prsdOps.put(op.pName, args[i]); - } - } else { - prsdOps.put(op.pName, arg.substring(x + 1)); - } - } else { - if (x != -1) { - throw new BadArgsException( - getMessage(MSG_ARG_NOT_ALLOWED) + dummy.lName); - } - prsdOps.put(op.pName, op.pValue); - } - } else if (arg.startsWith("-")) { - if (arg.equals("-")) { - prsdNonOps.add(arg); - } else { - arg = arg.substring(1); - arg: for (x = 0; x < arg.length(); x++) { - dummy.sName = arg.substring(x, x + 1); - opi = Collections.binarySearch( - odsBySName, dummy, CMPRTR_OP_SNAME); - if (opi < 0) { - throw new BadArgsException( - getMessage(MSG_OPTION_UNKNOWN) - + dummy.sName); - } - op = (OptionDefinition) odsBySName.get(opi); - if (prsdOps.get(op.pName) != null) { - throw new BadArgsException( - getMessage(MSG_OPTION_CONFLICT) - + dummy.sName); - } - if (op.argType == OptionDefinition.ARGT_NONE) { - prsdOps.put(op.pName, op.pValue); - continue arg; //! - } else { - if (arg.length() - 1 > x) { - prsdOps.put(op.pName, arg.substring(x + 1)); - } else { - if (op.argType - == OptionDefinition.ARGT_OPTIONAL) { - prsdOps.put(op.pName, op.defaultArg); - } else { - if (i == args.length - 1) { - throw new BadArgsException( - getMessage(MSG_ARG_MISSING) - + dummy.sName); - } - i++; - prsdOps.put(op.pName, args[i]); - } - } - break arg; //! - } - } // for x in arg - } - } else { - prsdNonOps.add(arg); - } - } // for i in args - - Properties eps; - if (defaultProperties != null) { - eps = defaultProperties; - } else { - eps = prsdOps; - } - Iterator it = odsByKey.iterator(); - while (it.hasNext()) { - op = (OptionDefinition) it.next(); - if (op.isImplied && prsdOps.get(op.pName) == null) { - if (op.impliedArg != null) { - eps.put(op.pName, op.impliedArg); - } else { - eps.put(op.pName, op.pValue); - } - } - } - - return prsdOps; - } - - /** - * Returns the options resulting from the latest {@link #parse parse} - * call as {@link Properties} object. An empty - * {@link Properties} object will be returned if there was no - * {@code parse} call yet. - */ - public Properties getOptions() { - return prsdOps; - } - - /** - * Convenience funtcion to read the option {@link Properties} object. - */ - public String getOption(String name) { - return (String) prsdOps.get(name); - } - - /** - * Retruns the non-options resulting from the latest {@link #parse parse} - * call. An empty array will be returned if there was no {@code parse} - * call yet. - * - *

    Non-options are the elements of args[] that are not not options - * (as "{@code -l}" or "{@code --quote-name}"), nor option - * arguments (as the "{@code 4}" after "{@code --tabsize 4}", - * assuming that "{@code tabsize}" has mandatory argument). For - * example, in "{@code -l etc --tabsize 8 etc/mysql}" there are 2 - * non-options: "{@code etc}" and "{@code etc/mysql}". - */ - public String[] getNonOptions() { - if (prsdNonOpsArray == null) { - int ln = prsdNonOps.size(); - prsdNonOpsArray = new String[ln]; - for (int i = 0; i < ln; i++) { - prsdNonOpsArray[i] = (String) prsdNonOps.get(i); - } - } - return prsdNonOpsArray; - } - - /** - * Returns the property names used in the options. - */ - public Set getPropertyNames() { - Set res = new HashSet(); - - Iterator it = odsByKey.iterator(); - while (it.hasNext()) { - OptionDefinition op = (OptionDefinition) it.next(); - res.add(op.pName); - } - - return res; - } - - /** - * Defines an option for the parser. - * - *

    Note that if you create an option that supports argument, then - * the argument will be initially mandatory. To have optional argument, - * you have to give a default argument value by calling the - * {@link OptionDefinition#defaultArg defaultArg} method of the returned - * object. - * @param shortName the short-name of option or null. Examples of - * short-names are "{@code a}" and "{@code l}" in - * "{@code $ ls -la}" If the option has argument, then this - * parameter has to be in the form "s ARGNAME" or - * "s=ARGNAME"; for example: {@code "T COLS"}. - * The space or {@code =} indicates that the option supports - * argument. - * The ARGNAME is used only for showing the help, otherwise its - * value is unimportant. - * Note that if you will indicate in the {@code longName} - * parameter that the option has argument, you don't have to indicate it - * here. - * @param longName the long-name of option or null. An example of long-name - * is {@code "quote-name"} in "{@code $ ls --quote-name}" - * If the option supports argument, then this parameter has to - * be in the form "long-name=ARGNAME" or - * "long-name ARGNAME"; for example: - * {@code "tabsize=COLS"}. The {@code =} or space indicates - * that the option supports argument. The ARGNAME is used only - * for showing the help, otherwise its value is unimportant. - * Note that if you have already indicated in the {@code shortName} - * parameter that the option has argument, you don't have to indicate it - * agian here. - * @return the newly created {@code OptionDefinition}; this is - * returned to let you addjust the new option with methods like - * {@link OptionDefinition#desc(String) desc}, - * {@link OptionDefinition#property(String, String) property}, - * {@link OptionDefinition#implied(String) implied} - * or {@link OptionDefinition#defaultArg defaultArg}. - * @throws IllegalArgumentException If an option with the same long-name or - * short-name is already added, or if the given long- or short-name is - * malformed. - */ - public OptionDefinition addOption(String shortName, String longName) { - OptionDefinition op = new OptionDefinition(); - int i; - - op.argType = OptionDefinition.ARGT_NONE; - if (longName != null - && ( - ((i = longName.indexOf("=")) != -1) - || - ((i = longName.indexOf(" ")) != -1) - )) { - op.argType = OptionDefinition.ARGT_REQUIRED; - op.argName = longName.substring(i + 1); - longName = longName.substring(0, i); - } - if (shortName != null - && ( - ((i = shortName.indexOf("=")) != -1) - || - ((i = shortName.indexOf(" ")) != -1) - )) { - op.argType = OptionDefinition.ARGT_REQUIRED; - op.argName = shortName.substring(i + 1); - shortName = shortName.substring(0, i); - } - - checkOptionNames(shortName, longName); - - op.lName = longName; - op.sName = shortName; - op.key = shortName != null ? shortName : longName; - op.pName = longName != null ? longName : shortName; - if (op.argType == OptionDefinition.ARGT_NONE) { - op.pValue = ""; - } - - insertOp(op); - - return op; - } - - /** - * Sets the properies object that will be the default properties object for - * the properies object that {@code parse} creates for the options - * (See {@link java.util.Properties#Properties(Properties defaults)}). - * Also, {@code parse} will put the implied option values into - * the default properties object. - * By default there is no default properties object. - * - *

    This setting takes effect only when you call {@code parse} next - * time. - */ - public void setDefaultProperties(Properties defaultProperties) { - this.defaultProperties = defaultProperties; - } - - /** - * Customizes the error messages shown to the user. - * The {@link Properties} should contain the following keys, - * associated with the translation of the following sentences: - *

      - *
    • "OPTION_CONFLICT": - * "This option conflicts with a preceding option: " - *
    • "ARG_MISSING": "The argument is missing for this option: " - *
    • "OPTION_UNKNOWN": "Unknown option: " - *
    • "ARG_NOT_ALLOWED": "This option does not allow argument: " - *
    - * You may use the {@code MSG_...} constants for the key values. - */ - public void setMessages(Properties messages) { - this.messages = messages; - } - - /** - * Describes and option. It does not store the actual value of the - * option after parsing; it is just the definition of the option. - */ - public class OptionDefinition implements Cloneable { - private static final int ARGT_NONE = 0; - private static final int ARGT_OPTIONAL = 1; - private static final int ARGT_REQUIRED = 2; - - private String key; - private String pName; - private String lName; - private String sName; - private String pValue; - private boolean isImplied; - private int argType; - private String impliedArg; - private String defaultArg; - private String desc; - private String argName; - private boolean hidden; - - /** - * Sets the property name for this option. - * If you don't override the property name with this, it will be - * the long-name of the option if the option has long-name, otherwise - * the short-name of the option. - * - * @see #property(String, String) - */ - public OptionDefinition property(String pName) { - this.pName = pName; - return this; - } - - /** - * Sets the property value for this option. - * This only allowed for options that do no support argument, as - * the value of options that has argument will be the actual value - * of the argument. - * If you don't override the property value with this, it will be - * "" (0 length String) for those options. - * - * @throws IllegalArgumentException if the option has argument. - * - * @see #property(String, String) - */ - public OptionDefinition propertyValue(String value) { - if (argType != ARGT_NONE) { - throw new IllegalArgumentException( - "This option supports argument."); - } - this.pValue = value; - return this; - } - - /** - * Convenience method; same as calling {@code property(String)} and - * then {@code propertyValue}. This method only applies for - * options that do no support argument. - * - * @see #property(String) - * @see #propertyValue - */ - public OptionDefinition property( - String propertyName, String propertyValue) { - if (argType != ARGT_NONE) { - throw new IllegalArgumentException( - "This option supports argument."); - } - property(propertyName); - propertyValue(propertyValue); - return this; - } - - /** - * Convenience method; same as calling - * {@code property(propertyName, optionName)}, where optionName - * is the long-name if that exists, otherwise the short-name. - * This method only applies for options that do no support argument. - * - * @see #property(String) - * @see #propertyValue - */ - public OptionDefinition group(String propertyName) { - property(propertyName, lName != null ? lName : sName); - return this; - } - - /** - * Ensures that the option will be seemingly present if the - * args[] does not contains this option or any other option that - * mutually excludes this option. Note that if the option supports - * argument, you have to use {@link #implied(String)}. - * - * @throws IllegalArgumentException if the option has argument. - * - * @see #implied(String) - */ - public OptionDefinition implied() { - if (argType != ARGT_NONE) { - throw new IllegalArgumentException( - "This overload is for options that don't " - + "support argument."); - } - this.isImplied = true; - return this; - } - - /** - * Ensures that the option will be seemingly present with the given - * argument value if args[] does not contains this option, or any - * other option that mutually excludes this option. - * This version of the method applies only for options that support - * argument. - * - * @throws IllegalArgumentException if the option has no argument. - * - * @see #implied() - */ - public OptionDefinition implied(String impliedArg) { - if (argType == ARGT_NONE) { - throw new IllegalArgumentException( - "This overload is for options that support argument."); - } - this.isImplied = true; - this.impliedArg = impliedArg; - return this; - } - - /** - * Gives default argument value for an option that supports arguments, - * thus it will be optional to specify the argument value in the - * command-line. - * - *

    Note that introducing default value for an option is not a - * backward compatible step. For example if "color" has no default - * value, then "{@code --color red}" is interpreted as "color" - * has an argument that is "red". But, if "color" has a default value, - * then it is interpreted as "color" has the default value, and - * we have a non-option "red". Of coruse, there would not be problem - * if we use "{@code --color=red}". - */ - public OptionDefinition defaultArg(String defaultValue) { - if (argType == ARGT_NONE) { - throw new IllegalArgumentException( - "This option has no argument."); - } - this.defaultArg = defaultValue; - argType = ARGT_OPTIONAL; - return this; - } - - /** - * Sets the description (used in help) of the option. - */ - public OptionDefinition desc(String desc) { - if (desc != null && desc.length() == 0) { - desc = null; - } - this.desc = desc; - return this; - } - - /** - * Hides option, that is, it will not be shown in the option help. - */ - public void hide() { - hidden = true; - } - - /** - * Creates a copy of the option with different short- and long-name, - * but with the same property name (and other attributes). - * This is mostly useful to create alias options. - * - * @param longName the long-name of option or null. - * Do not use the long-name=ARGNAME form here. - * @param shortName the short-name of option or null. - * Do not use the s=ARGNAME form here. - * @return the newly created {@code OptionDefinition}. - * @throws IllegalArgumentException If an option with the same - * long-name or short-name is already added, or if the given long- - * or short-name is malformed. - */ - public OptionDefinition copy(String shortName, String longName) { - OptionDefinition op; - - checkOptionNames(shortName, longName); - try { - op = (OptionDefinition) this.clone(); - } catch (CloneNotSupportedException e) { - // it is supprted... - throw new RuntimeException("Bug: " + e); - } - op.lName = longName; - op.sName = shortName; - op.key = shortName != null ? shortName : longName; - - insertOp(op); - - return op; - } - - /** - * Returns the name of the argument, or null if the option does not - * support argument. - */ - public String getArgName() { - return argName; - } - - /** - * Returns the default argument of the option, or null if the option - * has no default argument. - */ - public String getDefaultArg() { - return defaultArg; - } - - /** - * Returns the description of the option, or null if no description is - * available. - */ - public String getDescription() { - return desc; - } - - /** - * Returns the long-name of the option, or null if the option has no - * long-name. - */ - public String getLongName() { - return lName; - } - - /** - * Returns the short-name of the option, or null if the option has no - * short-name. - */ - public String getShortName() { - return sName; - } - - } - - /** - * Returns the list of {@link OptionDefinition}-s, sorted as they should - * appear in an option help. - */ - public Iterator getOptionDefintions() { - ArrayList odsByHelp = (ArrayList) odsByKey.clone(); - Collections.sort(odsByHelp, new OptionDefinitionHelpComparator()); - return odsByHelp.iterator(); - } - - /** - * Returns the {@link OptionDefinition} for the given option name. - * The name can be either short- or long-name. - */ - public OptionDefinition getOptionDefinition(String name) { - int i = Collections.binarySearch(odsByKey, name, CMPRTR_OP_KEY); - return i < 0 ? null : (OptionDefinition) odsByKey.get(i); - } - - /** - * Generates options help for the defined options. - * @param screenWidth the (minimum) width of the console screen. - */ - public String getOptionsHelp(int screenWidth) { - int i, ln; - String s; - - int lColW = 0; - ArrayList lCols = new ArrayList(); - ArgsParser.OptionDefinition od; - StringBuffer res = new StringBuffer(); - - // Collect the left column contents: - Iterator it = getOptionDefintions(); - while (it.hasNext()) { - od = (ArgsParser.OptionDefinition) it.next(); - if (!od.hidden) { - s = createOptionLeftColumn(od); - lCols.add(s); - int width = s.length(); - if (width > lColW) { - lColW = width <= MAX_LEFT_COL_WIDTH ? width : MAX_LEFT_COL_WIDTH; - } - } - } - - if (screenWidth - 1 - (lColW + 3 + 2) < 16) { - if (screenWidth - 1 < lColW) { - return StringUtil.wrap("Unable to display option help: " - + "Screen is too narrow.", screenWidth); - } else { - res.append(StringUtil.wrap( - "Warning: Unable to display option descriptions: " - + "Screen is too narrow.", screenWidth)) - .append(StringUtil.LINE_BREAK); - ln = lCols.size(); - for (i = 0; i < ln; i++) { - res.append((String) lCols.get(i)); - if (i != ln - 1) { - res.append(StringUtil.LINE_BREAK); - } - } - return res.toString(); - } - } else { - i = 0; - it = getOptionDefintions(); - while (it.hasNext()) { - od = (ArgsParser.OptionDefinition) it.next(); - if (!od.hidden) { - String lCol = (String) lCols.get(i); - i++; - if (od.getDescription() != null) { - final int lColWithPaddingW = lColW + COL_DISTANCE; - if (lCol.length() <= lColW) { // Has space to use two columns - StringBuffer desc = StringUtil.wrap( - new StringBuffer(od.getDescription()), - screenWidth, - lColWithPaddingW, lColWithPaddingW + WRAP_INDENT); - desc.replace(0, lCol.length(), lCol); - res.append(desc); - } else { // No space for two columns, use a single line - String lColAndSep= lCol.length() >= lColWithPaddingW - ? lCol + " " - : freemarker.template.utility.StringUtil.rightPad(lCol, lColWithPaddingW); - res.append(StringUtil.wrap( - new StringBuffer(lColAndSep + od.getDescription()), - screenWidth, - 0, lColWithPaddingW + WRAP_INDENT)); - } - } else { - res.append(lCol); - } - if (it.hasNext()) { - res.append(StringUtil.LINE_BREAK); - } - } - } - return res.toString(); - } - } - - private static String createOptionLeftColumn( - ArgsParser.OptionDefinition od) { - StringBuffer b = new StringBuffer(30); - b.append(" "); - - String sn = od.getShortName(); - String ln = od.getLongName(); - String an = od.getArgName(); - - if (sn != null) { - b.append("-"); - b.append(sn); - if (an != null && ln == null) { - b.append("<"); - b.append(an); - b.append(">"); - } - } - if (ln != null) { - if (sn == null) { - b.append(" --"); - } else { - b.append(", --"); - } - b.append(ln); - if (an != null) { - b.append("=<"); - b.append(an); - b.append(">"); - } - } - - return b.toString(); - } - - private String getMessage(String key) { - String r = null; - if (messages != null) { - r = messages.getProperty(key); - } - if (r == null) { - r = defaultMessages.getProperty(key); - if (r == null) { - r = "??? (message not found): "; - } - } - return r; - } - - private void insertOp(OptionDefinition op) { - int ki, li = 0, ni = 0; - - if (op.sName != null) { - li = Collections.binarySearch(odsBySName, op, CMPRTR_OP_SNAME); - if (li >= 0) { - throw new IllegalArgumentException( - "An option with this short-name is already defined: " - + op.sName); - } - } - if (op.lName != null) { - ni = Collections.binarySearch(odsByLName, op, CMPRTR_OP_LNAME); - if (ni >= 0) { - throw new IllegalArgumentException( - "An option with this long-name is already defined: " - + op.lName); - } - } - ki = Collections.binarySearch(odsByKey, op, CMPRTR_OP_KEY); - if (ki >= 0) { - throw new IllegalArgumentException( - "An option with this short- or long-name is " - + "already defined: " + op.key); - }; - - odsByKey.add(-ki - 1, op); - if (op.sName != null) { - odsBySName.add(-li - 1, op); - } - if (op.lName != null) { - odsByLName.add(-ni - 1, op); - } - } - - private void checkOptionNames(String shortName, String longName) { - checkOptionName(longName); - checkOptionName(shortName); - if (shortName != null && shortName.length() != 1) { - throw new IllegalArgumentException( - "Short-name must be 1 character long."); - } - if (shortName == null && longName == null) { - throw new IllegalArgumentException("At least one of the option " - + "short- and the long-names must be non-null."); - } - } - - private static void checkOptionName(String name) - throws IllegalArgumentException { - if (name == null) { - return; - } - if (name.length() == 0) { - throw new IllegalArgumentException( - "Option name can't be 0 character long."); - } - int ln = name.length(); - if (name.charAt(0) == '-') { - throw new IllegalArgumentException( - "Option name can't start with -."); - } - for (int i = 0; i < ln; i++) { - char c = name.charAt(i); - if (!((c >= '0' && c <= '9') - || (c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || (c == '-') || (c == '_') || (c == '@') || (c == '#') - )) { - throw new IllegalArgumentException( - "Option name can contain only: " - + "0-9, a-z, A-Z, -, _, @, #"); - } - } - } - - private static class OptionDefinitionShortNameComparator - implements Comparator { - public int compare(Object o1, Object o2) { - return ((OptionDefinition) o1).sName - .compareTo(((OptionDefinition) o2).sName); - } - } - - private static class OptionDefinitionLongNameComparator - implements Comparator { - public int compare(Object o1, Object o2) { - return ((OptionDefinition) o1).lName - .compareTo(((OptionDefinition) o2).lName); - } - } - - private static class OptionDefinitionKeyComparator - implements Comparator { - public int compare(Object o1, Object o2) { - return ((OptionDefinition) o1).key - .compareTo(((OptionDefinition) o2).key); - } - } - - private static class OptionDefinitionHelpComparator - implements Comparator { - public int compare(Object o1, Object o2) { - String s1 = ((OptionDefinition) o1).key; - String s2 = ((OptionDefinition) o2).key; - int x = s1.toLowerCase().compareTo(s2.toLowerCase()); - if (x != 0) { - return x; - } - return -s1.compareTo(s2); - } - } - - /** - * The user has entered invalid options in the command-line. - * Use the {@code getMessage()} method to get the description of the - * problem, that you can directly print to the terminal for the user. - */ - public static class BadArgsException extends Exception { - private BadArgsException(String message) { - super(message); - } - } -} diff --git a/fmpp/src/main/java/fmpp/util/BorderedReader.java b/fmpp/src/main/java/fmpp/util/BorderedReader.java deleted file mode 100644 index d6375ca..0000000 --- a/fmpp/src/main/java/fmpp/util/BorderedReader.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.IOException; -import java.io.Reader; - - -/** - * Reader that can insert a string before and after an encapsulated - * character stream. - */ -public class BorderedReader extends Reader { - private static final int PHASE_HEADER = 0; - private static final int PHASE_BODY = 1; - private static final int PHASE_FOOTER = 2; - - private String header; - private int headerLength; - - private Reader body; - - private String footer; - private int footerLength; - - private int phase = PHASE_HEADER; - private int index = 0; - - public BorderedReader(String header, Reader body, String footer) { - this.header = header; - if (header == null) { - headerLength = 0; - } else { - headerLength = header.length(); - } - - this.footer = footer; - if (footer == null) { - footerLength = 0; - } else { - footerLength = footer.length(); - } - - this.body = body; - } - - public void close() throws IOException { - body.close(); - } - - public int read() throws IOException { - switch (phase) { - case PHASE_HEADER: - if (index < headerLength) { - return header.charAt(index++); //! - } - phase = PHASE_BODY; - //! falls through - case PHASE_BODY: - int i = body.read(); - if (i != -1) { - return i; //! - } - phase = PHASE_FOOTER; - index = 0; - //! falls through - case PHASE_FOOTER: - if (index < footerLength) { - return footer.charAt(index++); //! - } else { - return -1; //! - } - //! falls through - default: - throw new BugException("Illegal phase: " + phase); - } - } - - public int read(char[] cbuf, int off, int len) throws IOException { - int i; - int clen; - int total = 0; - switch (phase) { - case PHASE_HEADER: - clen = headerLength - index; - if (clen > 0) { - clen = clen > len ? len : clen; - for (i = 0; i < clen; i++) { - cbuf[off++] = header.charAt(index++); - } - len -= clen; - total = clen; - } - if (len == 0) { - break; //! - } - phase = PHASE_BODY; - //! falls through - case PHASE_BODY: - i = body.read(cbuf, off, len); - if (i != -1) { - total += i; - break; //! - } - phase = PHASE_FOOTER; - index = 0; - //! falls through - case PHASE_FOOTER: - clen = footerLength - index; - if (clen > 0) { - clen = clen > len ? len : clen; - for (i = 0; i < clen; i++) { - cbuf[off++] = footer.charAt(index++); - } - total += clen; - } else { - if (total == 0) { - total = -1; - } - } - break; - default: - throw new BugException("Illegal phase: " + phase); - } - return total; - } - - public long skip(long n) throws IOException { - long i; - long clen; - long total = 0; - - if (n < 0L) { - throw new IllegalArgumentException( - "skip value is negative"); - } - - switch (phase) { - case PHASE_HEADER: - clen = headerLength - index; - clen = clen > n ? n : clen; - total = clen; - index += clen; - if (n == total) { - break; //! - } - phase = PHASE_BODY; - //! falls through - case PHASE_BODY: - do { - i = body.skip(n - total); - if (i == 0) { - break; - } - total += i; - } while (n > total); - if (n == total) { - break; - } - phase = PHASE_FOOTER; - index = 0; - //! falls through - case PHASE_FOOTER: - clen = footerLength - index; - clen = clen > (n - total) ? (n - total) : clen; - index += clen; - total += clen; - } - return total; - } -} diff --git a/fmpp/src/main/java/fmpp/util/BugException.java b/fmpp/src/main/java/fmpp/util/BugException.java deleted file mode 100644 index f638c43..0000000 --- a/fmpp/src/main/java/fmpp/util/BugException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -/** - * A bug has been detected. - */ -public class BugException extends RuntimeExceptionCC { - - private static final String MESSAGE = - "Internal error; it's maybe a bug or some other low-level malfunction. " + "If you think it's a bug, please report it to me: " + "ddekanyREMOVEME@freemail.hu, delete the REMOVEME. Details: "; - - public BugException(String message) { - super(MESSAGE + message); - } - - public BugException(String message, Throwable cause) { - super(MESSAGE + message, cause); - } -} diff --git a/fmpp/src/main/java/fmpp/util/DataLoaderUtil.java b/fmpp/src/main/java/fmpp/util/DataLoaderUtil.java deleted file mode 100644 index 4e0c460..0000000 --- a/fmpp/src/main/java/fmpp/util/DataLoaderUtil.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.util.List; - -/** - * Utility methods for writing data loaders. - */ -public class DataLoaderUtil { - - public static final String OPTION_NAME_ENCODING = "encoding"; - - public static String getStringArgument(int index, Object value) { - return getStringSomething(argumentX(index), value); - } - - public static String getStringOption(String name, Object value) { - return getStringSomething(theXOption(name), value); - } - - public static char getCharArgument(int index, Object value) { - return getCharSomething(argumentX(index), value); - } - - public static char getCharOption(String name, Object value) { - return getCharSomething(theXOption(name), value); - } - - public static boolean getBooleanArgument(int index, Object value) { - return getBooleanSomething(argumentX(index), value); - } - - public static boolean getBooleanOption(String name, Object value) { - return getBooleanSomething(theXOption(name), value); - } - - public static int getIntArgument(int index, Object value) { - return parseIntSomething(argumentX(index), value); - } - - public static int getIntOption(String name, Object value) { - return parseIntSomething(theXOption(name), value); - } - - public static String[] getStringArrayArgument(int index, Object value) { - return getStringArrayArgument(index, value, false); - } - - public static String[] getStringArrayOption(String name, Object value) { - return getStringArrayOption(name, value, false); - } - - /** - * @param allowString if true a value that is a single string - * will be treated as a 1 long sequence that contains that string. - */ - public static String[] getStringArrayArgument(int index, Object value, - boolean allowString) { - return parseStringArraySomething(argumentX(index), value, allowString); - } - - /** - * @param allowString if true a value that is a single string - * will be treated as a 1 long sequence that contains that string. - */ - public static String[] getStringArrayOption(String name, Object value, - boolean allowString) { - return parseStringArraySomething(theXOption(name), value, allowString); - } - - private static String theXOption(String name) { - return "the \"" + name + "\" option"; - } - - private static String argumentX(int index) { - return "argument " + index; - } - - private static String getStringSomething( - String what, Object value) { - if (value instanceof String) { - return (String) value; - } else { - throw new IllegalArgumentException("The value of " + what - + " must be a string."); - } - } - - private static char getCharSomething( - String what, Object value) { - if (value instanceof String) { - String s = (String) value; - if (s.equalsIgnoreCase("tab")) { - return '\t'; - } - if (s.length() != 1) { - throw new IllegalArgumentException( - "The value of " + what - + " must be 1 character long or tab."); - } - return s.charAt(0); - } else { - throw new IllegalArgumentException("The value of " + what - + " must be a character."); - } - } - - private static boolean getBooleanSomething( - String what, Object value) { - if (value instanceof Boolean) { - return ((Boolean) value).booleanValue(); - } else { - throw new IllegalArgumentException("The value of " + what - + " must be a boolean."); - } - } - - private static int parseIntSomething( - String what, Object value) { - if (value instanceof Number) { - try { - return MiscUtil.numberToInt((Number) value); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("The value of " + what - + " must be an integer. (Detail: " - + e.getMessage() + ")"); - } - } else { - throw new IllegalArgumentException("The value of " + what - + " must be an integer."); - } - } - - private static String[] parseStringArraySomething( - String what, Object value, boolean allowString) { - Object o; - String[] res; - if (value instanceof List) { - List ls = (List) value; - int ln = ls.size(); - res = new String[ln]; - for (int i = 0; i < ln; i++) { - o = ls.get(i); - if (!(o instanceof String)) { - throw new IllegalArgumentException("The value of " + what - + " must be a sequence of strings, but the item at " - + "index " + i + " is not a string."); - } - res[i] = (String) o; - } - return res; - } else if (value instanceof String[]) { - return (String[]) value; - } else if (value instanceof Object[]) { - Object[] ls = (Object[]) value; - res = new String[ls.length]; - for (int i = 0; i < ls.length; i++) { - o = ls[i]; - if (!(o instanceof String)) { - throw new IllegalArgumentException("The value of " + what - + " must be a sequence of strings, but the item at " - + "index " + i + " is not a string."); - } - res[i] = (String) o; - } - return res; - } else if (allowString && value instanceof String) { - res = new String[1]; - res[0] = (String) value; - return res; - } else { - if (allowString) { - throw new IllegalArgumentException("The value of " + what - + " must be a sequence of strings or a single string, " - + "but it is neither."); - } else { - throw new IllegalArgumentException("The value of " + what - + " must be a sequence of strings, but it is not even " - + "a sequence."); - } - } - } - -} diff --git a/fmpp/src/main/java/fmpp/util/ExceptionCC.java b/fmpp/src/main/java/fmpp/util/ExceptionCC.java deleted file mode 100644 index cfa814c..0000000 --- a/fmpp/src/main/java/fmpp/util/ExceptionCC.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - - -/** - * This was used for emulating cause-chains on Java earlier than 1.4, but as FMPP now requires 1.4, it just dispatches - * to {@link Exception}. - * Not that in FMPP error messages, the message of this exception is trusted (i.e. no need to print the class name), as - * it is inside an {@code fmpp} package. - */ -public class ExceptionCC extends Exception { - - private static final long serialVersionUID = 1L; - - public ExceptionCC() { - super(); - } - - public ExceptionCC(String s) { - super(s); - } - - public ExceptionCC(Throwable cause) { - super(cause); - } - - public ExceptionCC(String s, Throwable cause) { - super(s, cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/util/FileUtil.java b/fmpp/src/main/java/fmpp/util/FileUtil.java deleted file mode 100644 index f35ac45..0000000 --- a/fmpp/src/main/java/fmpp/util/FileUtil.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; - -/** - * Collection of file and path related functions. - */ -public class FileUtil { - /** - * Reaturns the path of a file or directory relative to a directory, - * in native format. - * @return The relative path. - * It never starts with separator char (/ on UN*X). - * @throws IOException if the two paths has no common parent directory - * (such as C:\foo.txt and D:\foo.txt), or - * the the paths are malformed. - */ - public static String getRelativePath(File fromDir, File toFileOrDir) - throws IOException { - char sep = File.separatorChar; - String ofrom = fromDir.getCanonicalPath(); - String oto = toFileOrDir.getCanonicalPath(); - boolean needSepEndForDirs; - if (!ofrom.endsWith(File.separator)) { - ofrom += sep; - needSepEndForDirs = false; - } else { - needSepEndForDirs = true; - } - boolean otoEndsWithSep; - if (!oto.endsWith(File.separator)) { - oto += sep; - otoEndsWithSep = false; - } else { - otoEndsWithSep = true; - } - String from = ofrom.toLowerCase(); - String to = oto.toLowerCase(); - - StringBuffer path = new StringBuffer(oto.length()); - - int fromln = from.length(); - goback: while (true) { - if (to.regionMatches(0, from, 0, fromln)) { - File fromf = new File(ofrom.substring( - 0, needSepEndForDirs ? fromln : fromln - 1)); - File tof = new File(oto.substring( - 0, needSepEndForDirs ? fromln : fromln - 1)); - if (fromf.equals(tof)) { - break goback; - } - } - path.append(".." + sep); - fromln--; - while (fromln > 0 && from.charAt(fromln - 1) != sep) { - fromln--; - } - if (fromln == 0) { - throw new IOException( - "Could not find common parent directory in these " - + "paths: " + ofrom + " and " + oto); - } - } - path.append(oto.substring(fromln)); - if (!otoEndsWithSep && path.length() != 0) { - path.setLength(path.length() - 1); - } - - return path.toString(); - } - - /** - * Copies a file; silently overwrites the destination if already exists. - * - * @param copyLMD tells if the last modification time of the original - * file will be copied too. - */ - public static void copyFile(File src, File dst, boolean copyLMD) - throws IOException { - byte[] buffer = new byte[1024 * 64]; - InputStream in = new FileInputStream(src); - try { - long srcLMD = 0L; - if (copyLMD) { - srcLMD = src.lastModified(); - if (srcLMD == 0) { - throw new IOException("Failed to get the last modification " - + "time of " + src.getAbsolutePath()); - } - } - OutputStream out = new FileOutputStream(dst); - try { - int ln; - while ((ln = in.read(buffer)) != -1) { - out.write(buffer, 0, ln); - } - } finally { - out.close(); - } - if (srcLMD != 0L) { - dst.setLastModified(srcLMD); - } - } finally { - in.close(); - } - } - - /** - * Same as {@link #copyFile(File, File, boolean) copyFile(src, dst, true))}. - */ - public static void copyFile(File src, File dst) throws IOException { - copyFile(src, dst, true); - } - - /** - * Returns true if file is inside ascendant or - * file is the same as the ascendant, otherwise - * returns false. - */ - public static boolean isInsideOrEquals(File file, File ascendant) { - while (!file.equals(ascendant)) { - file = file.getParentFile(); - if (file == null) { - return false; - } - } - return true; - } - - /** - * Returns true if file is inside ascendant, - * otherwise returns false. - */ - public static boolean isInside(File file, File ascendant) { - if (!file.equals(ascendant)) { - return false; - } - do { - file = file.getParentFile(); - if (file == null) { - return false; - } - } while (!file.equals(ascendant)); - return true; - } - - /** - * Resolves relative UN*X path based on given root and working directory. - * @param root root directory - * @param wd working directory (current direcory) - */ - public static File resolveRelativeUnixPath(File root, File wd, String path) - throws IOException { - File c; - int i; - if (path.startsWith("/")) { - i = 1; - c = root.getAbsoluteFile(); - } else { - i = 0; - c = wd.getAbsoluteFile(); - } - int ln = path.length(); - while (i < ln) { - String step; - int si = path.indexOf(i, '/'); - if (si == -1) { - si = ln; - } - step = path.substring(i, si); - i = si + 1; - if (step.equals(".")) { - continue; - } else if (step.equals("..")) { - c = c.getParentFile(); - if (c == null) { - throw new IOException("Parent directory not found."); - } - } else { - c = new File(c, step); - } - } - c = c.getCanonicalFile(); - - if (!isInsideOrEquals(c, root)) { - throw new IOException("Attempt to leave the root directory."); - } - - return c; - } - - /** - * Returns a compressed version of the path. - * For example, /foo/ba.../baaz.txt instead of - * /foo/bar/blah/blah/blah/baaz.txt. - * @param path the path to compress. Either native or UNIX format. - * @param maxPathLength the maximum length of the result. - * Must be at least 4. - */ - public static String compressPath(String path, int maxPathLength) { - if (path.length() > maxPathLength) { - int r = path.length() - maxPathLength + 3; - int i = path.lastIndexOf(File.separatorChar); - if (i == -1) { - i = path.lastIndexOf('/'); - } - if (i <= r) { - return "..." + path.substring(r); - } else { - return path.substring(0, i - r) + "..." + path.substring(i); - } - } else { - return path; - } - } - - /** - * Brings the path to UNI*X style format, so that it can be handled - * with path pattern handling functions. - */ - public static String pathToUnixStyle(String path) { - path = path.replace(File.separatorChar, '/'); - if (File.separatorChar != '\\') { - path = path.replace('\\', '/'); // Protection from Win users... :) - } - return path; - } - - public static String removeSlashPrefix(String path) { - if (path.startsWith("/") && !path.startsWith("//")) { - return path.substring(1); - } else { - return path; - } - } - - /** - * Converts UN*X style path to regular expression (originally, for Perl 5 dialect, but also works for Java's - * dialect). - * In additional to standard UN*X path meta characters (*, - * ?) it understands **, that is the same as - * in Ant. It assumes that the paths what you will later match - * with the pattern are always starting with slash (they are absoulte paths - * to an imaginary base). - */ - public static String pathPatternToPerl5Regex(String text) { - StringBuffer sb = new StringBuffer(); - - if (!text.startsWith("/")) { - text = "/" + text; - } - if (text.endsWith("/")) { - text += "**"; - } - - char[] chars = text.toCharArray(); - int ln = chars.length; - for (int i = 0; i < ln; i++) { - char c = chars[i]; - if (c == '\\' || c == '^' || c == '.' || c == '$' || c == '|' - || c == '(' || c == ')' || c == '[' || c == ']' - || c == '+' || c == '{' - || c == '}' || c == '@') { - sb.append('\\'); - sb.append(c); - } else if (i == 0 && ln > 2 - && chars[0] == '*' && chars[1] == '*' - && chars[2] == '/') { - sb.append(".*/"); - i += 2; - } else if (c == '/' && i + 2 < ln - && chars[i + 1] == '*' && chars[i + 2] == '*') { - if (i + 3 == ln) { - sb.append("/.*"); - } else { - sb.append("(/.*)?"); - } - i += 2; - } else if (c == '*') { - sb.append("[^/]*"); - } else if (c == '?') { - sb.append("[^/]"); - } else { - sb.append(c); - } - } - - return sb.toString(); - } - - public static String loadString(InputStream in, String charset) - throws IOException { - Reader r = charset != null ? new InputStreamReader(in, charset) : new InputStreamReader(in); - StringBuffer sb = new StringBuffer(1024); - try { - char[] buf = new char[4096]; - int ln; - while ((ln = r.read(buf)) != -1) { - sb.append(buf, 0, ln); - } - } finally { - r.close(); - } - return sb.toString(); - } - - public static byte[] loadByteArray(InputStream in) throws IOException { - int size = 0; - int bcap = 1024; - byte[] b = new byte[bcap]; - try { - int rdn; - while ((rdn = in.read(b, size, bcap - size)) != -1) { - size += rdn; - if (bcap == size) { - bcap *= 2; - byte[] newB = new byte[bcap]; - System.arraycopy(b, 0, newB, 0, size); - b = newB; - } - } - } finally { - in.close(); - } - if (b.length != size) { - byte[] newB = new byte[size]; - System.arraycopy(b, 0, newB, 0, size); - return newB; - } else { - return b; - } - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/util/FreemarkerUtil.java b/fmpp/src/main/java/fmpp/util/FreemarkerUtil.java deleted file mode 100644 index 138034b..0000000 --- a/fmpp/src/main/java/fmpp/util/FreemarkerUtil.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import freemarker.ext.util.WrapperTemplateModel; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateDateModel; -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateHashModelEx; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateModelIterator; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateSequenceModel; - -/** - * FreeMarker related utilities. - */ -public class FreemarkerUtil { - - /** - * Converts TemplateModel-s to java.util.* and - * java.lang.* objects. - *

      - *
    • FTL hash will be converted to java.util.Map - *
    • FTL sequence and collection will be converted to - * java.util.List - *
    • FTL numbers will be converted to java.lang.Number - *
    • FTL dates will be converted to java.util.Date - *
    • FTL booleans will be converted to java.lang.Boolean - *
    • FTL strings will be converted to java.lang.String - *
    • Other FTL variables (transforms, methods, etc.) will be returned as - * is. - *
    - * - *

    Container types (hash, equence, etc.) will be converted recursively, - * so the subvariables are also converted, and the subvariables of - * subvariables are converted, etc. - * - *

    For multi-type variables a single type will be choosen, which is the - * first type in the above list. - * - *

    If the TemplateModel supports - * WrapperTemplateModel, unwrapping will be used only if - * the type of the unwrapped object is proper according to the above list. - * - * @return The converted object. You may do not modify the returned - * objects, as it is unpredicalbe if it has effect on the converted - * TemplateModel-s. - */ - public static Object ftlVarToCoreJavaObject(TemplateModel m) - throws TemplateModelException { - Object o; - - if (m instanceof TemplateHashModel) { - if (m instanceof WrapperTemplateModel) { - o = ((WrapperTemplateModel) m).getWrappedObject(); - if (o instanceof Map) { - return o; //!! - } - } - if (m instanceof TemplateHashModelEx) { - Map res = new HashMap(); - TemplateHashModelEx hash = (TemplateHashModelEx) m; - TemplateModelIterator tit = hash.keys().iterator(); - while (tit.hasNext()) { - String key = ((TemplateScalarModel) tit.next()) - .getAsString(); - res.put(key, ftlVarToCoreJavaObject(hash.get(key))); - } - return res; //!! - } else { - throw new TemplateModelException( - "Can't convert hash variable to java.util.Map, " - + "because it is not a TemplateHashModelEx, so the " - + "keys can't be enumerated."); - } - } else if (m instanceof TemplateSequenceModel) { - if (m instanceof WrapperTemplateModel) { - o = ((WrapperTemplateModel) m).getWrappedObject(); - if (o instanceof List) { - return o; //!! - } - } - TemplateSequenceModel seq = (TemplateSequenceModel) m; - int ln = seq.size(); - List res = new ArrayList(ln); - for (int i = 0; i < ln; i++) { - res.add(ftlVarToCoreJavaObject(seq.get(i))); - } - return res; //!! - } else if (m instanceof TemplateCollectionModel) { - TemplateModelIterator tit = ((TemplateCollectionModel) m) - .iterator(); - List res = new ArrayList(); - while (tit.hasNext()) { - res.add(ftlVarToCoreJavaObject(tit.next())); - } - return res; //!! - } else if (m instanceof TemplateNumberModel) { - return ((TemplateNumberModel) m).getAsNumber(); //!! - } else if (m instanceof TemplateDateModel) { - return ((TemplateDateModel) m).getAsDate(); - } else if (m instanceof TemplateBooleanModel) { - return ((TemplateBooleanModel) m).getAsBoolean() - ? Boolean.TRUE : Boolean.FALSE; //!! - } else if (m instanceof TemplateScalarModel) { - return ((TemplateScalarModel) m).getAsString(); //!! - } else { - // Do not convert - return m; //!! - } - } -} diff --git a/fmpp/src/main/java/fmpp/util/InstallationException.java b/fmpp/src/main/java/fmpp/util/InstallationException.java deleted file mode 100644 index 8435c95..0000000 --- a/fmpp/src/main/java/fmpp/util/InstallationException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -/** - * There is a problem with the software environment. - */ -public class InstallationException extends ExceptionCC { - - public InstallationException(String s) { - super(s); - } - - public InstallationException(String s, Throwable cause) { - super(s, cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/util/JSONParseException.java b/fmpp/src/main/java/fmpp/util/JSONParseException.java deleted file mode 100644 index c928c3d..0000000 --- a/fmpp/src/main/java/fmpp/util/JSONParseException.java +++ /dev/null @@ -1,21 +0,0 @@ -package fmpp.util; - -public class JSONParseException extends ExceptionCC { - - private static final long serialVersionUID = 1L; - - public JSONParseException( - String message, String text, int position, String fileName) { - super(StringUtil.createSourceCodeErrorMessage( - message, text, position, fileName, 56)); - } - - public JSONParseException( - String message, String text, int position, String fileName, - Throwable cause) { - super(StringUtil.createSourceCodeErrorMessage( - message, text, position, fileName, 56), - cause); - } - -} diff --git a/fmpp/src/main/java/fmpp/util/JSONParser.java b/fmpp/src/main/java/fmpp/util/JSONParser.java deleted file mode 100644 index d3614fc..0000000 --- a/fmpp/src/main/java/fmpp/util/JSONParser.java +++ /dev/null @@ -1,434 +0,0 @@ -package fmpp.util; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import freemarker.template.utility.NumberUtil; - -/** - * Simple JSON parser where JSON objects create {@link Map}-s, JSON array-s create {@link List}-s, and the others - * create the obvious Java equivalents. Numbers will be {@link Integer}-s where they fit into that, otherwise they - * will be {@link Long}-s, and if not even can store the value or if the value is not whole, {@link BigDecimal}-s. - * - * @since 0.9.15 - */ -public class JSONParser { - - private static final String UNCLOSED_OBJECT_MESSAGE - = "This {...} was still unclosed when the end of the file was reached. (Look for a missing \"}\")"; - - private static final String UNCLOSED_ARRAY_MESSAGE - = "This [...] was still unclosed when the end of the file was reached. (Look for a missing \"]\")"; - - private static final Object JSON_NULL = new Object(); - - private static final BigDecimal MIN_INT_AS_BIGDECIMAL = BigDecimal.valueOf(Integer.MIN_VALUE); - private static final BigDecimal MAX_INT_AS_BIGDECIMAL = BigDecimal.valueOf(Integer.MAX_VALUE); - private static final BigDecimal MIN_LONG_AS_BIGDECIMAL = BigDecimal.valueOf(Long.MIN_VALUE); - private static final BigDecimal MAX_LONG_AS_BIGDECIMAL = BigDecimal.valueOf(Long.MAX_VALUE); - - private final String src; - private final String sourceLocation; - private final int ln; - - private int p; - - public static Object parse(String src, String sourceLocation) throws JSONParseException { - return new JSONParser(src, sourceLocation).parse(); - } - - /** - * @param sourceLocation Only used in error messages, maybe {@code null}. - */ - private JSONParser(String src, String sourceLocation) { - this.src = src; - this.sourceLocation = sourceLocation; - this.ln = src.length(); - } - - private Object parse() throws JSONParseException { - // Skip BOM: - if (ln > 0 && src.charAt(0) == '\uFEFF') { - p++; - } - - skipWS(); - Object result = consumeValue("Empty JSON (contains no value)", p); - - skipWS(); - if (p != ln) { - throw newParseException("End-of-file was expected but found further non-whitespace characters."); - } - - return result; - } - - private Object consumeValue(String eofErrorMessage, int eofBlamePosition) throws JSONParseException { - if (p == ln) { - throw newParseException( - eofErrorMessage == null - ? "A value was expected here, but end-of-file was reached." : eofErrorMessage, - eofBlamePosition == -1 ? p : eofBlamePosition); - } - - Object result; - - result = tryConsumeString(); - if (result != null) return result; - - result = tryConsumeNumber(); - if (result != null) return result; - - result = tryConsumeObject(); - if (result != null) return result; - - result = tryConsumeArray(); - if (result != null) return result; - - result = tryConsumeTrueFalseNull(); - if (result != null) return result != JSON_NULL ? result : null; - - // Better error message for a frequent mistake: - if (p < ln && src.charAt(p) == '\'') { - throw newParseException("Unexpected apostrophe-quote character. " - + "JSON strings must be quoted with quotation mark."); - } - - throw newParseException( - "Expected either the beginning of a (negative) number or the beginning of one of these: " - + "{...}, [...], \"...\", true, false, null. Found character " + StringUtil.jQuote(src.charAt(p)) - + " instead."); - } - - private Object tryConsumeTrueFalseNull() throws JSONParseException { - int startP = p; - if (p < ln && isIdentifierStart(src.charAt(p))) { - p++; - while (p < ln && isIdentifierPart(src.charAt(p))) { - p++; - } - } - - if (startP == p) return null; - - String keyword = src.substring(startP, p); - if (keyword.equals("true")) { - return Boolean.TRUE; - } else if (keyword.equals("false")) { - return Boolean.FALSE; - } else if (keyword.equals("null")) { - return JSON_NULL; - } - - throw newParseException( - "Invalid JSON keyword: " + keyword + ". Should be one of: true, false, null. " - + "If it meant to be a string then it must be quoted.", startP); - } - - private Number tryConsumeNumber() throws JSONParseException { - char c = src.charAt(p); - boolean negative = c == '-'; - if (!(negative || isDigit(c) || c == '.')) { - return null; - } - - int startP = p; - - if (negative) { - if (p + 1 >= ln) { - throw newParseException("Expected a digit after \"-\", but reached end-of-file."); - } - char lookAheadC = src.charAt(p + 1); - if (!(isDigit(lookAheadC) || lookAheadC == '.')) { - return null; - } - p++; // Consume "-" only, not the digit - } - - long longSum = 0; - boolean firstDigit = true; - consumeLongFittingHead: do { - c = src.charAt(p); - - if (!isDigit(c)) { - if (c == '.' && firstDigit) { - throw newParseException("JSON doesn't allow numbers starting with \".\"."); - } - break consumeLongFittingHead; - } - - int digit = c - '0'; - if (longSum == 0) { - if (!firstDigit) { - throw newParseException("JSON doesn't allow superfluous leading 0-s.", p - 1); - } - - longSum = !negative ? digit : -digit; - p++; - } else { - long prevLongSum = longSum; - longSum = longSum * 10 + (!negative ? digit : -digit); - if (!negative && prevLongSum > longSum || negative && prevLongSum < longSum) { - // We had an overflow => Can't consume this digit as long-fitting - break consumeLongFittingHead; - } - p++; - } - firstDigit = false; - } while (p < ln); - - if (p < ln && isBigDecimalFittingTailCharacter(c)) { - char lastC = c; - p++; - - consumeBigDecimalFittingTail: while (p < ln) { - c = src.charAt(p); - if (isBigDecimalFittingTailCharacter(c)) { - p++; - } else if ((c == '+' || c == '-') && isE(lastC)) { - p++; - } else { - break consumeBigDecimalFittingTail; - } - lastC = c; - } - - String numStr = src.substring(startP, p); - BigDecimal bd; - try { - bd = new BigDecimal(numStr); - } catch (NumberFormatException e) { - throw new JSONParseException("Malformed number: " + numStr, src, startP, sourceLocation, e); - } - - if (bd.compareTo(MIN_INT_AS_BIGDECIMAL) >= 0 && bd.compareTo(MAX_INT_AS_BIGDECIMAL) <= 0) { - if (NumberUtil.isIntegerBigDecimal(bd)) { - return new Integer(bd.intValue()); - } - } else if (bd.compareTo(MIN_LONG_AS_BIGDECIMAL) >= 0 && bd.compareTo(MAX_LONG_AS_BIGDECIMAL) <= 0) { - if (NumberUtil.isIntegerBigDecimal(bd)) { - return new Long(bd.longValue()); - } - } - return bd; - } else { - return longSum <= Integer.MAX_VALUE && longSum >= Integer.MIN_VALUE - ? (Number) new Integer((int) longSum) : new Long(longSum); - } - } - - private String tryConsumeString() throws JSONParseException { - int startP = p; - if (!tryConsumeChar('"')) return null; - - StringBuffer sb = new StringBuffer(); - char c = 0; - while (p < ln) { - c = src.charAt(p); - - if (c == '"') { - p++; - return sb.toString(); // Call normally returns here! - } else if (c == '\\') { - p++; - sb.append(consumeAfterBackslash()); - } else if (c <= 0x1F) { - if (c == '\t') { - throw newParseException("JSON doesn't allow unescaped tab character in string literals; " - + "use \\t instead."); - } - if (c == '\r') { - throw newParseException("JSON doesn't allow unescaped CR character in string literals; " - + "use \\r instead."); - } - if (c == '\n') { - throw newParseException("JSON doesn't allow unescaped LF character in string literals; " - + "use \\n instead."); - } - throw newParseException("JSON doesn't allow unescaped control characters in string literals, " - + "but found character with code (decimal): " + (int) c); - } else { - p++; - sb.append(c); - } - } - - throw newParseException("String literal was still unclosed when the end of the file was reached. " - + "(Look for missing or accidentally escaped closing quotation mark.)", startP); - } - - private List/**/ tryConsumeArray() throws JSONParseException { - int startP = p; - if (!tryConsumeChar('[')) return null; - - skipWS(); - if (tryConsumeChar(']')) return Collections.EMPTY_LIST; - - boolean afterComma = false; - List elements = new ArrayList(); - do { - skipWS(); - elements.add(consumeValue(afterComma ? null : UNCLOSED_ARRAY_MESSAGE, afterComma ? -1 : startP)); - - skipWS(); - afterComma = true; - } while (consumeChar(',', ']', UNCLOSED_ARRAY_MESSAGE, startP) == ','); - return elements; - } - - private Map/**/ tryConsumeObject() throws JSONParseException { - int startP = p; - if (!tryConsumeChar('{')) return null; - - skipWS(); - if (tryConsumeChar('}')) return Collections.EMPTY_MAP; - - boolean afterComma = false; - Map map = new LinkedHashMap(); // Must keeps original order! - do { - skipWS(); - int keyStartP = p; - Object key = consumeValue(afterComma ? null : UNCLOSED_OBJECT_MESSAGE, afterComma ? -1 : startP); - if (!(key instanceof String)) { - throw newParseException("Wrong key type. JSON only allows string keys inside {...}.", keyStartP); - } - - skipWS(); - consumeChar(':'); - - skipWS(); - map.put(key, consumeValue(null, -1)); - - skipWS(); - afterComma = true; - } while (consumeChar(',', '}', UNCLOSED_OBJECT_MESSAGE, startP) == ','); - return map; - } - - private boolean isE(char c) { - return c == 'e' || c == 'E'; - } - - private boolean isBigDecimalFittingTailCharacter(char c) { - return c == '.' || isE(c) || isDigit(c); - } - - private char consumeAfterBackslash() throws JSONParseException { - if (p == ln) { - throw newParseException("Reached the end of the file, but the escape is unclosed."); - } - - final char c = src.charAt(p); - switch (c) { - case '"': - case '\\': - case '/': - p++; - return c; - case 'b': - p++; - return '\b'; - case 'f': - p++; - return '\f'; - case 'n': - p++; - return '\n'; - case 'r': - p++; - return '\r'; - case 't': - p++; - return '\t'; - case 'u': - p++; - return consumeAfterBackslashU(); - } - throw newParseException("Unsupported escape: \\" + c); - } - - private char consumeAfterBackslashU() throws JSONParseException { - if (p + 3 >= ln) { - throw newParseException("\\u must be followed by exactly 4 hexadecimal digits"); - } - final String hex = src.substring(p, p + 4); - try { - char r = (char) Integer.parseInt(hex, 16); - p += 4; - return r; - } catch (NumberFormatException e) { - throw newParseException("\\u must be followed by exactly 4 hexadecimal digits, but was followed by " - + StringUtil.jQuote(hex) + "."); - } - } - - private boolean tryConsumeChar(char c) { - if (p < ln && src.charAt(p) == c) { - p++; - return true; - } else { - return false; - } - } - - private void consumeChar(char expected) throws JSONParseException { - consumeChar(expected, (char) 0, null, -1); - } - - private char consumeChar(char expected1, char expected2, String eofErrorHint, int eofErrorP) throws JSONParseException { - if (p >= ln) { - throw newParseException(eofErrorHint == null - ? "Expected " + StringUtil.jQuote(expected1) - + ( expected2 != 0 ? " or " + StringUtil.jQuote(expected2) : "") - + " character, but reached end-of-file. " - : eofErrorHint, - eofErrorP == -1 ? p : eofErrorP); - } - char c = src.charAt(p); - if (c == expected1 || (expected2 != 0 && c == expected2)) { - p++; - return c; - } - throw newParseException("Expected " + StringUtil.jQuote(expected1) - + ( expected2 != 0 ? " or " + StringUtil.jQuote(expected2) : "") - + " character, but found " + StringUtil.jQuote(c) + " instead."); - } - - private void skipWS() { - while (p < ln && isWS(src.charAt(p))) { - p++; - } - } - - /** - * Whitespace as specified by JSON. - */ - private boolean isWS(char c) { - return c == ' ' || c == '\t' || c == '\r' || c == '\n'; - } - - private boolean isIdentifierStart(char c) { - return Character.isLetter(c) || c == '_' || c == '$'; - } - - private boolean isDigit(char c) { - return c >= '0' && c <= '9'; - } - - private boolean isIdentifierPart(char c) { - return isIdentifierStart(c) || isDigit(c); - } - - private JSONParseException newParseException(String message) { - return newParseException(message, p); - } - - private JSONParseException newParseException(String message, int p) { - return new JSONParseException(message, src, p, sourceLocation); - } - -} diff --git a/fmpp/src/main/java/fmpp/util/MiscUtil.java b/fmpp/src/main/java/fmpp/util/MiscUtil.java deleted file mode 100644 index 3250151..0000000 --- a/fmpp/src/main/java/fmpp/util/MiscUtil.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.lang.reflect.Method; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import freemarker.core.ParseException; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModelException; - -/** - * Miscellaneous utility methods. - */ -public class MiscUtil { - - public static final Class[] EMPTY_CLASS_ARRAY = new Class[]{}; - public static final Object[] EMPTY_OBJECT_ARRAY = new Object[]{}; - public static final String[] EMPTY_STRING_ARRAY = new String[]{}; - - private static final BigInteger MAX_INT_AS_BIG_INTEGER - = BigInteger.valueOf(Integer.MAX_VALUE); - private static final BigInteger MIN_INT_AS_BIG_INTEGER - = BigInteger.valueOf(Integer.MIN_VALUE); - - /** - * This is the same as {@link #causeTrace}, but it doesn't print the - * exception class name if the class is inside an fmpp package. - */ - public static String causeMessages(Throwable e) { - return causeTrace_common(e, true); - } - - /** - * Returns the cause trace of an exception. This is similar to a J2SE 1.4+ - * stack-trace, but it's shorter, because it does not contain the "at" - * lines. - */ - public static String causeTrace(Throwable e) { - return causeTrace_common(e, false); - } - - private static String causeTrace_common( - Throwable e, boolean hideUninterstingClasses) { - if (e == null) { - return "??? (the error was described with a null object)"; - } - - StringBuffer res = new StringBuffer(); - String lastShownMsg = null; - - boolean first = true; - traceBack: while (true) { - String msg = e.getMessage(); - if (msg != null) { - if (lastShownMsg == null || !msg.equals(lastShownMsg)) { - if (!first) { - appendCausedBy(res); - } - lastShownMsg = msg; - String cn = e.getClass().getName(); - if (!hideUninterstingClasses || !cn.startsWith("fmpp.")) { - int prevLen = res.length(); - appendClassAndLocation(e, hideUninterstingClasses, res); - if (res.length() != prevLen) { - res.append(": "); - } - } - res.append(msg); - } - } else { - if (!first) { - appendCausedBy(res); - } - appendClassAndLocation(e, false, res); - } - e = getCauseException(e); - if (e == null) { - break traceBack; - } - first = false; - } - - return res.toString(); - } - - private static void appendCausedBy(StringBuffer res) { - res.append(StringUtil.LINE_BREAK); - res.append(StringUtil.LINE_BREAK); - res.append("Caused by:"); - res.append(StringUtil.LINE_BREAK); - } - - private static void appendClassAndLocation(Throwable e, boolean hideUninterstingClasses, StringBuffer res) { - StackTraceElement[] stackTrace = e.getStackTrace(); - if (stackTrace != null && stackTrace.length >= 1) { - StackTraceElement thrower = stackTrace[0]; - String throwerC = thrower.getClassName(); - if (!hideUninterstingClasses || !technicalDetailsNeedNotBeShown(throwerC, e)) { - res.append(e.getClass().getName()); - res.append(" (at "); - res.append(throwerC); - String m = thrower.getMethodName(); - if (m != null) { - res.append('.'); - res.append(m); - } - int line = thrower.getLineNumber(); - if (line > 0) { - res.append(':'); - res.append(line); - } - res.append(")"); - } else if (e instanceof TemplateException) { - res.append("FreeMarker template error"); - } - } else { // Shouldn't ever occur - res.append(e.getClass().getName()); - } - } - - private static boolean technicalDetailsNeedNotBeShown(String throwerClassName, Throwable thrownExc) { - return - ( - thrownExc instanceof ExceptionCC - || thrownExc instanceof RuntimeExceptionCC - || thrownExc instanceof TemplateException - || thrownExc instanceof ParseException - || thrownExc instanceof TemplateModelException - ) - && - ( - throwerClassName.startsWith("freemarker.") - || throwerClassName.startsWith("fmpp.") - ); - } - - /** - * Tries to load the class with the current context class loader, - * and only then with the current defining class loader. - */ - public static Class classForName(String className) - throws ClassNotFoundException { - try { - return Class.forName( - className, true, - Thread.currentThread().getContextClassLoader()); - } catch (ClassNotFoundException e) { - ; // ignored - } catch (SecurityException e) { - ; // ignored - } - return Class.forName(className); - } - - public static Map dictionaryToMap(Dictionary dict) { - Map m = new HashMap(dict.size()); - Enumeration en = dict.keys(); - while (en.hasMoreElements()) { - Object key = en.nextElement(); - m.put(key, dict.get(key)); - } - return m; - } - - public static Throwable getCauseException(Throwable e) { - Throwable cause = e.getCause(); - if (cause != null) { - return cause; - } - - try { - Method m = e.getClass().getMethod("getTarget", EMPTY_CLASS_ARRAY); - Throwable targetE = (Throwable) m.invoke(e, EMPTY_OBJECT_ARRAY); - if (targetE != null) { - return targetE; - } - } catch (Throwable exc) { - ; // ignore - } - - try { - Method m = e.getClass().getMethod( - "getRootCause", EMPTY_CLASS_ARRAY); - Throwable rootCauseE = (Throwable) m.invoke(e, EMPTY_OBJECT_ARRAY); - if (rootCauseE != null) { - return rootCauseE; - } - } catch (Throwable exc) { - ; // ignore - } - - return null; - } - - /** - * Checks if the list contains the given object (exactly the same instance). - */ - public static boolean listContainsObject(List list, Object o) { - if (list instanceof ArrayList) { - int ln = list.size(); - int i = 0; - while (i < ln && list.get(i) != o) { - i++; - } - return i < ln; - } else { - Iterator it = list.iterator(); - while (it.hasNext()) { - if (it.next() == o) { - return true; - } - } - return false; - } - } - - /** - * Checks if the map contains the given object (exactly the same instance) - * as value. - */ - public static boolean mapContainsObject(Map map, Object o) { - Iterator it = map.entrySet().iterator(); - while (it.hasNext()) { - if (((Map.Entry) it.next()).getValue() == o) { - return true; - } - } - return false; - } - - /** - * Returns the first index of the given object (exactly the same instance) - * in the list. - * @return the index of the first occurance, or -1 if not found. - */ - public static int findObject(List list, Object o) { - if (list instanceof ArrayList) { - int ln = list.size(); - int i = 0; - while (i < ln) { - if (list.get(i) == o) { - return i; - } - i++; - } - return -1; - } else { - int i = 0; - Iterator it = list.iterator(); - while (it.hasNext()) { - if (it.next() == o) { - return i; - } - i++; - } - return -1; - } - } - - private static final String MSG_XML_NOT_AVAIL - = "XML support is not available. " - + "You need to use Java2 platform 1.4 or later, or " - + "you have to install XML support."; - - /** - * Checks if XML API-s (JAXP, SAX2, DOM) are present. - * Can be a bit slow depending on the actual class loader setup. - * - * @param requiredForThis a short sentence that describes for human reader - * if for what do we need the XML support (e.g. - * "Usage of xml data loader." or - * "Set XML entity resolver."). This sentence is used - * in error message of the {@link fmpp.util.InstallationException}. - * Can be null. - */ - public static void checkXmlSupportAvailability(String requiredForThis) - throws InstallationException { - Throwable error = null; - try { - classForName("javax.xml.parsers.DocumentBuilderFactory"); - classForName("org.w3c.dom.Element"); - classForName("org.xml.sax.XMLReader"); - } catch (ClassNotFoundException e) { - error = e; - } catch (SecurityException e) { - error = e; - } - if (error != null) { - if (requiredForThis != null) { - throw new InstallationException( - MSG_XML_NOT_AVAIL - + " Note that XML support was required for this: " - + requiredForThis, error); - } else { - throw new InstallationException(MSG_XML_NOT_AVAIL, error); - } - } - } - - /** - * Loseless convertion to int. - * - * @throws IllegalArgumentException if the loseless conversion is not - * possible. The error message contains the details. - */ - public static int numberToInt(Number value) { - if (value instanceof Integer || value instanceof Short - || value instanceof Byte) { - return value.intValue(); - } else if (value instanceof Long) { - long lv = ((Long) value).longValue(); - if (lv >= Integer.MIN_VALUE && lv <= Integer.MAX_VALUE) { - return (int) lv; - } else { - throw new IllegalArgumentException( - "Can't convert this long value to int, because " - + "it's out of range: " + lv); - } - } else if (value instanceof Double) { - double dv = ((Double) value).doubleValue(); - int iv = (int) dv; - if (dv == (int) dv) { - return iv; - } else { - throw new IllegalArgumentException( - "Can't convert this double value to int " - + "without loss: " + dv); - } - } else if (value instanceof Float) { - float fv = ((Float) value).floatValue(); - int iv = (int) fv; - if (fv == (int) fv) { - return iv; - } else { - throw new IllegalArgumentException( - "Can't convert this float value to int " - + "without loss: " + fv); - } - } else if (value instanceof BigDecimal) { - BigDecimal bv = (BigDecimal) value; - int iv = bv.intValue(); - if (bv.compareTo(BigDecimal.valueOf(iv)) == 0) { - return iv; - } else { - throw new IllegalArgumentException( - "Can't convert this BigDecimal value to int " - + "without loss: " + bv); - } - } else if (value instanceof BigInteger) { - BigInteger bv = (BigInteger) value; - if (bv.compareTo(MIN_INT_AS_BIG_INTEGER) >= 0 - && bv.compareTo(MAX_INT_AS_BIG_INTEGER) <= 0) { - return bv.intValue(); - } else { - throw new IllegalArgumentException( - "Can't convert this BigInteger value to int " - + "without loss: " + bv); - } - } else { - throw new IllegalArgumentException( - "Can't convert a " + value.getClass().getName() - + " to integer number."); - } - } - - /** - * Concatenates two arrays. - */ - public static String[] add(String[] a1, String[] a2) { - String[] r = new String[a1.length + a2.length]; - System.arraycopy(a1, 0, r, 0, a1.length); - System.arraycopy(a2, 0, r, a1.length, a2.length); - return r; - } - -} \ No newline at end of file diff --git a/fmpp/src/main/java/fmpp/util/MultiListIterator.java b/fmpp/src/main/java/fmpp/util/MultiListIterator.java deleted file mode 100644 index 55db7d0..0000000 --- a/fmpp/src/main/java/fmpp/util/MultiListIterator.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -/** - * Iterates over multiple List-s. The elements of a list that was - * added earlier will be iterated earlier. - */ -public class MultiListIterator implements Iterator { - private List lists[] = new List[6]; - private int listCount; - private int currentList; - private Iterator currentIterator; - - public MultiListIterator() { - } - - public MultiListIterator(List ls1) { - addList(ls1); - } - - public MultiListIterator(List ls1, List ls2) { - addList(ls1); - addList(ls2); - } - - public MultiListIterator(List ls1, List ls2, List ls3) { - addList(ls1); - addList(ls2); - addList(ls3); - } - - public MultiListIterator(List ls1, List ls2, List ls3, List ls4) { - addList(ls1); - addList(ls2); - addList(ls3); - addList(ls4); - } - - /** - * Use this to add more lists after the constructor. - */ - public void addList(List ls) { - if (ls.size() != 0) { - if (listCount == lists.length) { - List[] newLists = new List[listCount * 2]; - System.arraycopy(lists, 0, newLists, 0, listCount); - lists = newLists; - } - lists[listCount++] = ls; - } - } - - public boolean hasNext() { - if (currentIterator == null) { - if (listCount != 0) { - currentIterator = lists[0].iterator(); - } else { - return false; - } - } - boolean hasNext = currentIterator.hasNext(); - if (!hasNext && currentList < listCount - 1) { - return true; - } else { - return hasNext; - } - } - - public Object next() { - if (currentIterator == null) { - if (listCount != 0) { - currentIterator = lists[0].iterator(); - } else { - throw new NoSuchElementException( - "No next element; the list is empty."); - } - } - if (currentIterator.hasNext() || currentList == listCount - 1) { - return currentIterator.next(); - } else { - currentList++; - currentIterator = lists[currentList].iterator(); - return currentIterator.next(); - } - } - - public void remove() { - currentIterator.remove(); - } -} diff --git a/fmpp/src/main/java/fmpp/util/NullOutputStream.java b/fmpp/src/main/java/fmpp/util/NullOutputStream.java deleted file mode 100644 index 94d444c..0000000 --- a/fmpp/src/main/java/fmpp/util/NullOutputStream.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * OutputStream that simply drops what it gets. - */ -public class NullOutputStream extends OutputStream { - - public static final NullOutputStream INSTANCE = new NullOutputStream(); - - private NullOutputStream() { - } - - public void write(int b) throws IOException { - //nop - } - - public void write(byte[] b, int off, int len) throws IOException { - //nop - } - -} diff --git a/fmpp/src/main/java/fmpp/util/NullWriter.java b/fmpp/src/main/java/fmpp/util/NullWriter.java deleted file mode 100644 index d30d06b..0000000 --- a/fmpp/src/main/java/fmpp/util/NullWriter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.IOException; -import java.io.Writer; - -/** - * Writer that simply drops what it gets. - */ -public class NullWriter extends Writer { - - public static final NullWriter INSTANCE = new NullWriter(); - - private NullWriter() { - } - - public void write(char[] cbuf, int off, int len) throws IOException { - } - - public void flush() throws IOException { - } - - public void close() throws IOException { - } - -} diff --git a/fmpp/src/main/java/fmpp/util/RuntimeExceptionCC.java b/fmpp/src/main/java/fmpp/util/RuntimeExceptionCC.java deleted file mode 100644 index dd1fabd..0000000 --- a/fmpp/src/main/java/fmpp/util/RuntimeExceptionCC.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.PrintStream; -import java.io.PrintWriter; - -/** - * RuntimeException that emulates J2SE 1.4+ cause-chains if it runs - * on earlier versions. Furthermore, in FMPP error messages, the message of this - * exception is trusted (i.e. no need to print the class name), as it is inside - * an fmpp.* package. - */ -public class RuntimeExceptionCC extends RuntimeException { - private Throwable cause; - - private static final boolean BEFORE_1_4 = before14(); - private static boolean before14() { - Class ec = Exception.class; - try { - ec.getMethod("getCause", new Class[]{}); - } catch (NoSuchMethodException e) { - return true; - } - return false; - } - - public RuntimeExceptionCC() { - super(); - } - - public RuntimeExceptionCC(String s) { - super(s); - } - - public RuntimeExceptionCC(Throwable cause) { - super(); - this.cause = cause; - } - - public RuntimeExceptionCC(String s, Throwable cause) { - super(s); - this.cause = cause; - } - - public Throwable getCause() { - return cause; - } - - public void printStackTrace() { - super.printStackTrace(); - if (BEFORE_1_4 && cause != null) { - System.err.print("Caused by: "); - cause.printStackTrace(); - } - } - - public void printStackTrace(PrintStream s) { - super.printStackTrace(s); - if (BEFORE_1_4 && cause != null) { - s.print("Caused by: "); - cause.printStackTrace(s); - } - } - - public void printStackTrace(PrintWriter s) { - super.printStackTrace(s); - if (BEFORE_1_4 && cause != null) { - s.print("Caused by: "); - cause.printStackTrace(s); - } - } -} diff --git a/fmpp/src/main/java/fmpp/util/StringUtil.java b/fmpp/src/main/java/fmpp/util/StringUtil.java deleted file mode 100644 index 9a03401..0000000 --- a/fmpp/src/main/java/fmpp/util/StringUtil.java +++ /dev/null @@ -1,1548 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.util; - -import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Locale; -import java.util.TimeZone; - -import freemarker.template.SimpleDate; -import freemarker.template.TemplateDateModel; - -/** - * Collection of string manipulation functions. - */ -public class StringUtil { - - private static final DateFormat DTF4 - = new SimpleDateFormat("yyyy-MM-dd H:mm:ss'|'", Locale.US); - private static final DateFormat DTF3 - = new SimpleDateFormat("yyyy-MM-dd h:mm:ss a'|'", Locale.US); - private static final DateFormat DTF2 - = new SimpleDateFormat("yyyy-MM-dd H:mm:ss z'|'", Locale.US); - private static final DateFormat DTF1 - = new SimpleDateFormat("yyyy-MM-dd h:mm:ss a z'|'", Locale.US); - private static final DateFormat DF1 - = new SimpleDateFormat("yyyy-MM-dd'|'", Locale.US); - private static final DateFormat DF2 - = new SimpleDateFormat("yyyy-MM-dd z'|'", Locale.US); - private static final DateFormat TF1 - = new SimpleDateFormat("H:mm:ss'|'", Locale.US); - private static final DateFormat TF2 - = new SimpleDateFormat("h:mm:ss a'|'", Locale.US); - private static final DateFormat TF3 - = new SimpleDateFormat("H:mm:ss z'|'", Locale.US); - private static final DateFormat TF4 - = new SimpleDateFormat("h:mm:ss a z'|'", Locale.US); - - static { - DF1.setLenient(false); - DF2.setLenient(false); - DTF1.setLenient(false); - DTF2.setLenient(false); - DTF3.setLenient(false); - DTF4.setLenient(false); - TF1.setLenient(false); - TF2.setLenient(false); - TF3.setLenient(false); - TF4.setLenient(false); - } - - /** - * The default line-break string used by the methods in this class. - */ - public static final String LINE_BREAK = - System.getProperty("line.separator"); - - /** - * HTML encoding (does not convert line breaks). - * Replaces all '>' '<' '&' and '"' with entity reference - */ - public static String htmlEnc(String s) { - int ln = s.length(); - for (int i = 0; i < ln; i++) { - char c = s.charAt(i); - if (c == '<' || c == '>' || c == '&' || c == '"') { - StringBuffer b = - new StringBuffer(s.substring(0, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - case '"': b.append("""); break; - default: throw new BugException("Illegal char"); - } - i++; - int next = i; - while (i < ln) { - c = s.charAt(i); - if (c == '<' || c == '>' || c == '&' || c == '"') { - b.append(s.substring(next, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - case '"': b.append("""); break; - default: throw new BugException("Illegal char"); - } - next = i + 1; - } - i++; - } - if (next < ln) { - b.append(s.substring(next)); - } - s = b.toString(); - break; - } // if c == - } // for - return s; - } - - /** - * XML Encoding. - * Replaces all '>' '<' '&', "'" and '"' with entity reference - */ - public static String xmlEnc(String s) { - int ln = s.length(); - for (int i = 0; i < ln; i++) { - char c = s.charAt(i); - if (c == '<' || c == '>' || c == '&' || c == '"' || c == '\'') { - StringBuffer b = - new StringBuffer(s.substring(0, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - case '"': b.append("""); break; - case '\'': b.append("'"); break; - default: throw new BugException("Illegal char"); - } - i++; - int next = i; - while (i < ln) { - c = s.charAt(i); - if (c == '<' || c == '>' || c == '&' - || c == '"' || c == '\'') { - b.append(s.substring(next, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - case '"': b.append("""); break; - case '\'': b.append("'"); break; - default: throw new BugException("Illegal char"); - } - next = i + 1; - } - i++; - } - if (next < ln) { - b.append(s.substring(next)); - } - s = b.toString(); - break; - } // if c == - } // for - return s; - } - - /** - * XML encoding without replacing apostrophes and quotation marks. - * @see #xmlEnc(String) - */ - public static String xmlEncNQ(String s) { - int ln = s.length(); - for (int i = 0; i < ln; i++) { - char c = s.charAt(i); - if (c == '<' || c == '>' || c == '&') { - StringBuffer b = - new StringBuffer(s.substring(0, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - default: throw new BugException("Illegal char"); - } - i++; - int next = i; - while (i < ln) { - c = s.charAt(i); - if (c == '<' || c == '>' || c == '&') { - b.append(s.substring(next, i)); - switch (c) { - case '<': b.append("<"); break; - case '>': b.append(">"); break; - case '&': b.append("&"); break; - default: throw new BugException("Illegal char"); - } - next = i + 1; - } - i++; - } - if (next < ln) { - b.append(s.substring(next)); - } - s = b.toString(); - break; - } // if c == - } // for - return s; - } - - /** - * Rich Text Format encoding (does not replace line breaks). - * Escapes all '\' '{' '}' and '"' - */ - public static String rtfEnc(String s) { - int ln = s.length(); - for (int i = 0; i < ln; i++) { - char c = s.charAt(i); - if (c == '\\' || c == '{' || c == '}') { - StringBuffer b = - new StringBuffer(s.substring(0, i)); - switch (c) { - case '\\': b.append("\\\\"); break; - case '{': b.append("\\{"); break; - case '}': b.append("\\}"); break; - default: throw new BugException("Illegal char"); - } - i++; - int next = i; - while (i < ln) { - c = s.charAt(i); - if (c == '\\' || c == '{' || c == '}') { - b.append(s.substring(next, i)); - switch (c) { - case '\\': b.append("\\\\"); break; - case '{': b.append("\\{"); break; - case '}': b.append("\\}"); break; - default: throw new BugException("Illegal char"); - } - next = i + 1; - } - i++; - } - if (next < ln) { - b.append(s.substring(next)); - } - s = b.toString(); - break; - } // if c == - } // for - return s; - } - - /** - * Quotes character as Java language character, except quote characters, - * which are referred with name. - */ - public static String jQuoteOrName(char c) { - if (c == '\\' || c == '\'' || c == '"' || c < 0x20) { - switch (c) { - case '\\': - return "'\\\\'"; - case '\'': - return "apostrophe-quote"; - case '"': - return "quotation mark"; - case '\n': - return "'\\n'"; - case '\r': - return "'\\r'"; - case '\t': - return "'\\t'"; - case '\b': - return "'\\b'"; - case '\f': - return "'\\f'"; - default: - String s = Integer.toHexString(c); - int ln = s.length(); - if (ln == 1) { - return "'\\u000" + s + "'"; - } else if (ln == 2) { - return "'\\u00" + s + "'"; - } else if (ln == 3) { - return "'\\u0" + s + "'"; - } else { - return "'\\u" + s + "'"; - } - } - } else { - return "'" + c + "'"; - } - } - - /** - * Quotes string as Java language character. - */ - public static String jQuote(char c) { - if (c == '\\' || c == '\'' || c < 0x20) { - switch (c) { - case '\\': - return "'\\\\'"; - case '\'': - return "'\\''"; - case '\n': - return "'\\n'"; - case '\r': - return "'\\r'"; - case '\t': - return "'\\t'"; - case '\b': - return "'\\b'"; - case '\f': - return "'\\f'"; - default: - String s = Integer.toHexString(c); - int ln = s.length(); - if (ln == 1) { - return "'\\u000" + s + "'"; - } else if (ln == 2) { - return "'\\u00" + s + "'"; - } else if (ln == 3) { - return "'\\u0" + s + "'"; - } else { - return "'\\u" + s + "'"; - } - } - } else { - return "'" + c + "'"; - } - } - - /** - * Quotes string as Java language string literal. - */ - public static String jQuote(String s) { - if (s == null) { - return "null"; - } - String s2; - int ln = s.length(); - int next = 0; - int i = 0; - StringBuffer b = new StringBuffer(ln + 3); - b.append("\""); - while (i < ln) { - char c = s.charAt(i); - if (c == '\\' || c == '"' || c < 0x20) { - b.append(s.substring(next, i)); - switch (c) { - case '\\': - b.append("\\\\"); break; - case '"': - b.append("\\\""); break; - case '\n': - b.append("\\n"); break; - case '\r': - b.append("\\r"); break; - case '\t': - b.append("\\t"); break; - case '\b': - b.append("\\b"); break; - case '\f': - b.append("\\f"); break; - default: - b.append("\\u0000"); - int x = b.length(); - s2 = Integer.toHexString(c); - b.replace(x - s2.length(), x, s2); - } - next = i + 1; - } - i++; - } - if (next < ln) { - b.append(s.substring(next)); - } - b.append("\""); - return b.toString(); - } - - /** - * FTL string literal decoding. - * - * \\, \", \', \n, \t, \r, \b and \f will be replaced according to - * Java rules. In additional, it knows \g, \l, \a and \{ which are - * replaced with <, >, & and { respectively. - * \x works as hexadecimal character code escape. The character - * codes are interpreted according to UCS basic plane (Unicode). - * "f\x006Fo", "f\x06Fo" and "f\x6Fo" will be "foo". - * "f\x006F123" will be "foo123" as the maximum number of digits is 4. - * - * All other \X (where X is any character not mentioned above or - * End-of-string) will cause a {@link ParseException}. - * - * @param s String literal without the surrounding quotation marks - * @return String with all escape sequences resolved - * @throws ParseException if there string contains illegal escapes - */ - public static String ftlStringLiteralDec(String s) throws ParseException { - - int idx = s.indexOf('\\'); - if (idx == -1) { - return s; - } - - int lidx = s.length() - 1; - int bidx = 0; - StringBuffer buf = new StringBuffer(lidx); - do { - buf.append(s.substring(bidx, idx)); - if (idx >= lidx) { - throw new ParseException( - "The last character of string literal is backslash"); - } - char c = s.charAt(idx + 1); - switch (c) { - case '"': - buf.append('"'); - bidx = idx + 2; - break; - case '\'': - buf.append('\''); - bidx = idx + 2; - break; - case '\\': - buf.append('\\'); - bidx = idx + 2; - break; - case 'n': - buf.append('\n'); - bidx = idx + 2; - break; - case 'r': - buf.append('\r'); - bidx = idx + 2; - break; - case 't': - buf.append('\t'); - bidx = idx + 2; - break; - case 'f': - buf.append('\f'); - bidx = idx + 2; - break; - case 'b': - buf.append('\b'); - bidx = idx + 2; - break; - case 'g': - buf.append('>'); - bidx = idx + 2; - break; - case 'l': - buf.append('<'); - bidx = idx + 2; - break; - case 'a': - buf.append('&'); - bidx = idx + 2; - break; - case '{': - buf.append('{'); - bidx = idx + 2; - break; - case 'x': { - idx += 2; - int x = idx; - int y = 0; - int z = lidx > idx + 3 ? idx + 3 : lidx; - while (idx <= z) { - char b = s.charAt(idx); - if (b >= '0' && b <= '9') { - y <<= 4; - y += b - '0'; - } else if (b >= 'a' && b <= 'f') { - y <<= 4; - y += b - 'a' + 10; - } else if (b >= 'A' && b <= 'F') { - y <<= 4; - y += b - 'A' + 10; - } else { - break; - } - idx++; - } - if (x < idx) { - buf.append((char) y); - } else { - throw new ParseException( - "Invalid \\x escape in a string literal"); - } - bidx = idx; - break; - } - default: - throw new ParseException( - "Invalid escape sequence (\\" + c + ") in " + "a string literal"); - } - idx = s.indexOf('\\', bidx); - } while (idx != -1); - buf.append(s.substring(bidx)); - - return buf.toString(); - } - - /** - * Convers string to Perl 5 regular expression. - * This means that regular expression metacharacters will be escaped. - */ - public static String stringToPerl5Regex(String text) { - StringBuffer sb = new StringBuffer(); - char[] chars = text.toCharArray(); - int ln = chars.length; - for (int i = 0; i < ln; i++) { - char c = chars[i]; - if (c == '\\' || c == '^' || c == '.' || c == '$' || c == '|' - || c == '(' || c == ')' || c == '[' || c == ']' - || c == '*' || c == '+' || c == '?' || c == '{' - || c == '}' || c == '@') { - sb.append('\\'); - } - sb.append(c); - } - - return sb.toString(); - } - - /** - * Same as {@link #split(String, char, boolean) split(s, c, false)}. - */ - public static String[] split(String s, char c) { - return split(s, c, false); - } - - /** - * Splits a string at the specified character, and optionally trims the - * items. - */ - public static String[] split(String s, char c, boolean trim) { - int i, b, e; - int cnt; - String res[]; - int ln = s.length(); - - i = 0; - cnt = 1; - while ((i = s.indexOf(c, i)) != -1) { - cnt++; - i++; - } - res = new String[cnt]; - - i = 0; - b = 0; - while (b <= ln) { - e = s.indexOf(c, b); - if (e == -1) { - e = ln; - } - if (!trim) { - res[i++] = s.substring(b, e); - } else { - int e2 = e - 1; - while (e2 >= 0 && Character.isWhitespace(s.charAt(e2))) { - e2--; - } - e2++; - while (b < ln && Character.isWhitespace(s.charAt(b))) { - b++; - } - if (b < e) { - res[i++] = s.substring(b, e2); - } else { - res[i++] = ""; - } - } - b = e + 1; - } - return res; - } - - /** - * Splits a string at the specified string. - */ - public static String[] split(String s, String sep) { - int i, b, e; - int cnt; - String res[]; - int ln = s.length(); - int sln = sep.length(); - - if (sln == 0) { - throw new IllegalArgumentException( - "The separator string has 0 length"); - } - - i = 0; - cnt = 1; - while ((i = s.indexOf(sep, i)) != -1) { - cnt++; - i += sln; - } - res = new String[cnt]; - - i = 0; - b = 0; - while (b <= ln) { - e = s.indexOf(sep, b); - if (e == -1) { - e = ln; - } - res[i++] = s.substring(b, e); - b = e + sln; - } - return res; - } - - /** - * Splits a string at white-spaces. A continous sequence of one or more - * white-space is considered as a single separator. If the string is - * starting or ending with a separator, then that separator is silently - * ignored. Thus, the result array contains only trimmed non-0-length - * strings. - */ - public static String[] splitAtWS(String text) { - int i = 0; - int ln = text.length(); - - int cnt = 0; - countWords: while (true) { - while (i < ln && Character.isWhitespace(text.charAt(i))) { - i++; - } - if (i < ln) { - cnt++; - while (i < ln && !Character.isWhitespace(text.charAt(i))) { - i++; - } - } else { - break countWords; - } - } - - String[] res = new String[cnt]; - int x = 0; - i = 0; - fillResult: while (true) { - int b; - while (i < ln && Character.isWhitespace(text.charAt(i))) { - i++; - } - b = i; - if (i < ln) { - cnt++; - while (i < ln && !Character.isWhitespace(text.charAt(i))) { - i++; - } - res[x++] = text.substring(b, i); - } else { - break fillResult; - } - } - return res; - } - - /** - * Replaces all occurances of a sub-string in a string. - * @param text The string where it will replace {@code oldsub} with - * {@code newsub}. - * @return String The string after the replacements. - */ - public static String replace(String text, String oldsub, String newsub) { - int e = text.indexOf(oldsub); - if (e == -1) { - return text; - } - int b = 0; - int tln = text.length(); - int oln = oldsub.length(); - StringBuffer buf = new StringBuffer(tln + 16); - do { - buf.append(text.substring(b, e)); - buf.append(newsub); - b = e + oln; - e = text.indexOf(oldsub, b); - } while (e != -1); - buf.append(text.substring(b)); - return buf.toString(); - } - - /** - * Same as {@code expandTabs(text, tabWidth, 0)}. - * @see #expandTabs(String, int, int) - */ - public static String expandTabs(String text, int tabWidth) { - return expandTabs(text, tabWidth, 0); - } - - /** - * Replaces all occurances of character tab with spaces. - * @param tabWidth the distance of tab stops. - * @param startCol the index of the column in which the first character of - * the string is from the left edge of the page. The index of the first - * column is 0. - * @return String The string after the replacements. - */ - public static String expandTabs(String text, int tabWidth, int startCol) { - int e = text.indexOf('\t'); - if (e == -1) { - return text; - } - int b = 0; - int tln = text.length(); - StringBuffer buf = new StringBuffer(tln + 16); - do { - buf.append(text.substring(b, e)); - int col = buf.length() + startCol; - for (int i = tabWidth * (1 + col / tabWidth) - col; i > 0; i--) { - buf.append(' '); - } - b = e + 1; - e = text.indexOf('\t', b); - } while (e != -1); - buf.append(text.substring(b)); - return buf.toString(); - } - - /** - * Removes the line-break from the end of the string. - */ - public static String chomp(String s) { - if (s.endsWith("\r\n")) { - return s.substring(0, s.length() - 2); - } - if (s.endsWith("\r") || s.endsWith("\n")) { - return s.substring(0, s.length() - 1); - } - return s; - } - - /** - * Removes the line-break from the end of the {@link StringBuffer}. - */ - public static void chomp(StringBuffer sb) { - int ln = sb.length(); - if (ln >= 2 && sb.charAt(ln - 2) == '\r' && sb.charAt(ln - 1) == '\n') { - sb.setLength(ln - 2); - } else if (ln >= 1) { - char c = sb.charAt(ln - 1); - if (c == '\n' || c == '\r') { - sb.setLength(ln - 1); - } - } - } - - /** - * URL encoding (like%20this). - */ - public static String urlEnc(String s, String enc) - throws UnsupportedEncodingException { - int ln = s.length(); - int i; - for (i = 0; i < ln; i++) { - char c = s.charAt(i); - if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' - || c >= '0' && c <= '9' - || c == '_' || c == '-' || c == '.' || c == '!' || c == '~' - || c >= '\'' && c <= '*')) { - break; - } - } - if (i == ln) { - // Nothing to escape - return s; - } - - StringBuffer b = new StringBuffer((int) (ln * 1.333) + 2); - b.append(s.substring(0, i)); - - int encstart = i; - for (i++; i < ln; i++) { - char c = s.charAt(i); - if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' - || c >= '0' && c <= '9' - || c == '_' || c == '-' || c == '.' || c == '!' || c == '~' - || c >= '\'' && c <= '*') { - if (encstart != -1) { - byte[] o = s.substring(encstart, i).getBytes(enc); - for (int j = 0; j < o.length; j++) { - b.append('%'); - byte bc = o[j]; - int c1 = bc & 0x0F; - int c2 = (bc >> 4) & 0x0F; - b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A')); - b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A')); - } - encstart = -1; - } - b.append(c); - } else { - if (encstart == -1) { - encstart = i; - } - } - } - if (encstart != -1) { - byte[] o = s.substring(encstart, i).getBytes(enc); - for (int j = 0; j < o.length; j++) { - b.append('%'); - byte bc = o[j]; - int c1 = bc & 0x0F; - int c2 = (bc >> 4) & 0x0F; - b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A')); - b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A')); - } - } - - return b.toString(); - } - - /** - * URL encoding without escaping slashes. - */ - public static String urlPathEnc(String s, String enc) - throws UnsupportedEncodingException { - int ln = s.length(); - int i; - for (i = 0; i < ln; i++) { - char c = s.charAt(i); - if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' - || c >= '0' && c <= '9' || c == '/' - || c == '_' || c == '-' || c == '.' || c == '!' || c == '~' - || c >= '\'' && c <= '*')) { - break; - } - } - if (i == ln) { - // Nothing to escape - return s; - } - - StringBuffer b = new StringBuffer((int) (ln * 1.333) + 2); - b.append(s.substring(0, i)); - - int encstart = i; - for (i++; i < ln; i++) { - char c = s.charAt(i); - if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' - || c >= '0' && c <= '9' || c == '/' - || c == '_' || c == '-' || c == '.' || c == '!' || c == '~' - || c >= '\'' && c <= '*') { - if (encstart != -1) { - byte[] o = s.substring(encstart, i).getBytes(enc); - for (int j = 0; j < o.length; j++) { - b.append('%'); - byte bc = o[j]; - int c1 = bc & 0x0F; - int c2 = (bc >> 4) & 0x0F; - b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A')); - b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A')); - } - encstart = -1; - } - b.append(c); - } else { - if (encstart == -1) { - encstart = i; - } - } - } - if (encstart != -1) { - byte[] o = s.substring(encstart, i).getBytes(enc); - for (int j = 0; j < o.length; j++) { - b.append('%'); - byte bc = o[j]; - int c1 = bc & 0x0F; - int c2 = (bc >> 4) & 0x0F; - b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A')); - b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A')); - } - } - - return b.toString(); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, 0, 0, LINE_BREAK, false)}. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap(String text, int screenWidth) { - return wrap(text, screenWidth, 0, 0, LINE_BREAK, false); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, 0, 0, LINE_BREAK, true)}. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrapTrace(String text, int screenWidth) { - return wrap(text, screenWidth, 0, 0, LINE_BREAK, true); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, 0, 0, lineBreak, false)}. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap(String text, int screenWidth, String lineBreak) { - return wrap(text, screenWidth, 0, 0, lineBreak, false); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, indent, indent, LINE_BREAK, false)}. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap(String text, int screenWidth, int indent) { - return wrap(text, screenWidth, indent, indent, LINE_BREAK, false); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * wrap(text, screenWidth, firstIndent, indent, LINE_BREAK, - * false). - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap( - String text, int screenWidth, int firstIndent, int indent) { - return wrap(text, screenWidth, firstIndent, indent, LINE_BREAK, false); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, indent, indent, lineBreak, false)}. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap( - String text, int screenWidth, int indent, String lineBreak) { - return wrap(text, screenWidth, indent, indent, lineBreak, false); - } - - /** - * Hard-wraps flow-text. This is a convenience method that equivalent with - * wrap(text, screenWidth, firstIndent, indent, lineBreak, - * false). - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static String wrap( - String text, int screenWidth, int firstIndent, int indent, - String lineBreak) { - return wrap(text, screenWidth, firstIndent, indent, lineBreak, false); - } - - /** - * Hard-wraps flow-text. Uses StringBuffer-s instead of String-s. - * This is a convenience method that equivalent with - * {@code wrap(text, screenWidth, firstIndent, indent, LINE_BREAK)}. - * - * @see #wrap(StringBuffer, int, int, int, String, boolean) - */ - public static StringBuffer wrap( - StringBuffer text, int screenWidth, int firstIndent, int indent) { - return wrap(text, screenWidth, firstIndent, indent, LINE_BREAK, false); - } - - /** - * Hard-wraps flow-text. - * - * @param text The flow-text to wrap. The explicit line-breaks of the - * source text will be kept. All types of line-breaks (UN*X, Mac, DOS/Win) - * are understood. - * @param screenWidth The (minimum) width of the screen. It does not - * utilize the {@code screenWidth}-th column of the screen to store - * characters, except line-breaks (because some terminals/editors - * do an automatic line-break when you write visible character there, - * and some doesn't... so it is unpredictable if an explicit line-break - * is needed or not.). - * @param firstIndent The indentation of the first line - * @param indent The indentation of all lines but the first line - * @param lineBreak The String used for line-breaks - * @param traceMode Set this true if the input text is a Java stack - * trace. In this mode, all lines starting with - * optional indentation + {@code 'at'} + space are treated as location - * lines, and will be indented and wrapped in a slightly special way. - * @throws IllegalArgumentException if the number of columns remaining for - * the text is less than 2. - */ - public static String wrap( - String text, int screenWidth, int firstIndent, int indent, - String lineBreak, boolean traceMode) { - return wrap( - new StringBuffer(text), screenWidth, firstIndent, indent, - lineBreak, traceMode).toString(); - } - - /** - * Hard-wraps flow-text. Uses StringBuffer-s instead of String-s. - * This is the method that is internally used by all other {@code wrap} - * variations, so if you are working with StringBuffers anyway, it gives - * better performance. - * - * @see #wrap(String, int, int, int, String, boolean) - */ - public static StringBuffer wrap( - StringBuffer text, int screenWidth, int firstIndent, int indent, - String lineBreak, boolean traceMode) { - - if (firstIndent < 0 || indent < 0 || screenWidth < 0) { - throw new IllegalArgumentException("Negative dimension"); - } - - int allowedCols = screenWidth - 1; - - if ((allowedCols - indent) < 2 || (allowedCols - firstIndent) < 2) { - throw new IllegalArgumentException("Usable columns < 2"); - } - - int ln = text.length(); - int defaultNextLeft = allowedCols - indent; - int b = 0; - int e = 0; - - StringBuffer res = new StringBuffer((int) (ln * 1.2)); - int left = allowedCols - firstIndent; - for (int i = 0; i < firstIndent; i++) { - res.append(' '); - } - StringBuffer tempb = new StringBuffer(indent + 2); - tempb.append(lineBreak); - for (int i = 0; i < indent; i++) { - tempb.append(' '); - } - String defaultBreakAndIndent = tempb.toString(); - - boolean firstSectOfSrcLine = true; - boolean firstWordOfSrcLine = true; - int traceLineState = 0; - int nextLeft = defaultNextLeft; - String breakAndIndent = defaultBreakAndIndent; - int wln = 0, x; - char c, c2; - do { - word: while (e <= ln) { - if (e != ln) { - c = text.charAt(e); - } else { - c = ' '; - } - if (traceLineState > 0 && e > b) { - if (c == '.' && traceLineState == 1) { - c = ' '; - } else { - c2 = text.charAt(e - 1); - if (c2 == ':') { - c = ' '; - } else if (c2 == '(') { - traceLineState = 2; - c = ' '; - } - } - } - if (c != ' ' && c != '\n' && c != '\r' && c != '\t') { - e++; - } else { - wln = e - b; - if (left >= wln) { - res.append(text.substring(b, e)); - left -= wln; - b = e; - } else { - wln = e - b; - if (wln > nextLeft || firstWordOfSrcLine) { - int ob = b; - while (wln > left) { - if (left > 2 || (left == 2 - && (firstWordOfSrcLine - || !(b == ob && nextLeft > 2)) - )) { - res.append(text.substring(b, b + left - 1)); - res.append("-"); - res.append(breakAndIndent); - wln -= left - 1; - b += left - 1; - left = nextLeft; - } else { - x = res.length() - 1; - if (x >= 0 && res.charAt(x) == ' ') { - res.delete(x, x + 1); - } - res.append(breakAndIndent); - left = nextLeft; - } - } - res.append(text.substring(b, b + wln)); - b += wln; - left -= wln; - } else { - x = res.length() - 1; - if (x >= 0 && res.charAt(x) == ' ') { - res.delete(x, x + 1); - } - res.append(breakAndIndent); - res.append(text.substring(b, e)); - left = nextLeft - wln; - b = e; - } - } - firstSectOfSrcLine = false; - firstWordOfSrcLine = false; - break word; - } - } - int extra = 0; - space: while (e < ln) { - c = text.charAt(e); - if (c == ' ') { - e++; - } else if (c == '\t') { - e++; - extra += 7; - } else if (c == '\n' || c == '\r') { - nextLeft = defaultNextLeft; - breakAndIndent = defaultBreakAndIndent; - res.append(breakAndIndent); - e++; - if (e < ln) { - c2 = text.charAt(e); - if ((c2 == '\n' || c2 == '\r') && c != c2) { - e++; - } - } - left = nextLeft; - b = e; - firstSectOfSrcLine = true; - firstWordOfSrcLine = true; - traceLineState = 0; - } else { - wln = e - b + extra; - if (firstSectOfSrcLine) { - int y = allowedCols - indent - wln; - if (traceMode && ln > e + 2 - && text.charAt(e) == 'a' - && text.charAt(e + 1) == 't' - && text.charAt(e + 2) == ' ') { - if (y > 5 + 3) { - y -= 3; - } - traceLineState = 1; - } - if (y > 5) { - y = allowedCols - y; - nextLeft = allowedCols - y; - tempb = new StringBuffer(indent + 2); - tempb.append(lineBreak); - for (int i = 0; i < y; i++) { - tempb.append(' '); - } - breakAndIndent = tempb.toString(); - } - } - if (wln <= left) { - res.append(text.substring(b, e)); - left -= wln; - b = e; - } else { - res.append(breakAndIndent); - left = nextLeft; - b = e; - } - firstSectOfSrcLine = false; - break space; - } - } - } while (e < ln); - - return res; - } - - public static String createSourceCodeErrorMessage( - String message, String srcCode, int position, String fileName, - int maxQuotLength) { - int ln = srcCode.length(); - if (position < 0) { - position = 0; - } - if (position >= ln) { - if (position == ln) { - return message + StringUtil.LINE_BREAK - + "Error location: The very end of " - + (fileName == null ? "the text" : fileName) - + "."; - } else { - return message + StringUtil.LINE_BREAK - + "Error location: ??? (after the end of " - + (fileName == null ? "the text" : fileName) - + ")"; - } - } - - int i; - char c; - int rowBegin = 0; - int rowEnd; - int row = 1; - char lastChar = 0; - for (i = 0; i <= position; i++) { - c = srcCode.charAt(i); - if (lastChar == 0xA) { - rowBegin = i; - row++; - } else if (lastChar == 0xD && c != 0xA) { - rowBegin = i; - row++; - } - lastChar = c; - } - for (i = position; i < ln; i++) { - c = srcCode.charAt(i); - if (c == 0xA || c == 0xD) { - if (c == 0xA && i > 0 && srcCode.charAt(i - 1) == 0xD) { - i--; - } - break; - } - } - rowEnd = i - 1; - if (position > rowEnd + 1) { - position = rowEnd + 1; - } - int col = position - rowBegin + 1; - if (rowBegin > rowEnd) { - return message + StringUtil.LINE_BREAK - + "Error location: line " - + row + ", column " + col - + (fileName == null ? ":" : " in " + fileName + ":") - + StringUtil.LINE_BREAK - + "(Can't show the line because it is empty.)"; - } - String s1 = srcCode.substring(rowBegin, position); - String s2 = srcCode.substring(position, rowEnd + 1); - s1 = StringUtil.expandTabs(s1, 8); - int ln1 = s1.length(); - s2 = StringUtil.expandTabs(s2, 8, ln1); - int ln2 = s2.length(); - if (ln1 + ln2 > maxQuotLength) { - int newLn2 = ln2 - ((ln1 + ln2) - maxQuotLength); - if (newLn2 < 6) { - newLn2 = 6; - } - if (newLn2 < ln2) { - s2 = s2.substring(0, newLn2 - 3) + "..."; - ln2 = newLn2; - } - if (ln1 + ln2 > maxQuotLength) { - s1 = "..." + s1.substring((ln1 + ln2) - maxQuotLength + 3); - } - } - StringBuffer res = new StringBuffer(message.length() + 80); - res.append(message); - res.append(StringUtil.LINE_BREAK); - res.append("Error location: line "); - res.append(row); - res.append(", column "); - res.append(col); - if (fileName != null) { - res.append(" in "); - res.append(fileName); - } - res.append(":"); - res.append(StringUtil.LINE_BREAK); - res.append(s1); - res.append(s2); - res.append(StringUtil.LINE_BREAK); - int x = s1.length(); - while (x != 0) { - res.append(' '); - x--; - } - res.append('^'); - - return res.toString(); - } - - /** - * Converts a string to {@link BigDecimal}. - */ - public static BigDecimal stringToBigDecimal(String s) - throws ParseException { - s = s.trim(); - try { - return new BigDecimal(s); - } catch (NumberFormatException e) { - throw new ParseException("Value " + jQuote(s) - + " is not a valid number."); - } - } - - public static boolean stringToBoolean(String s) - throws ParseException { - s = s.trim().toLowerCase(); - if (s.equals("yes") || s.equals("true") || s.equals("y") - || s.equals("1")) { - return true; - } else if (s.equals("no") || s.equals("false") - || s.equals("n") || s.equals("0")) { - return false; - } else { - throw new StringUtil.ParseException("Value " + jQuote(s) + " is " - + "not a valid boolean."); - } - } - - /** - * Parses a date of format {@code "yyyy-MM-dd"} - * or {@code "yyyy-MM-dd z"} and returns it as - * {@link TemplateDateModel}. - */ - public static TemplateDateModel stringToDate(String s, TimeZone tz) - throws ParseException { - String orig = s; - s = s.trim() + "|"; - if (tz == null) { - tz = TimeZone.getDefault(); - } - synchronized (DF1) { - DF1.setTimeZone(tz); - try { - return new SimpleDate(DF1.parse(s), TemplateDateModel.DATE); - } catch (java.text.ParseException e) { - ; // ignore - } - DF2.setTimeZone(tz); - try { - return new SimpleDate(DF2.parse(s), TemplateDateModel.DATE); - } catch (java.text.ParseException e) { - throw new ParseException("Failed to parse " - + jQuote(orig) + " as date. Use format " - + "\"yyyy-MM-dd\" or \"yyyy-MM-dd z\"."); - } - } - } - - /** - * Parses a time of format {@code "H:mm:ss"} - * or {@code "h:mm:ss a"} or {@code "H:mm:ss z"} - * or {@code "h:mm:ss a z"} and returns it as - * {@link TemplateDateModel}. - */ - public static TemplateDateModel stringToTime(String s, TimeZone tz) - throws ParseException { - String orig = s; - s = s.trim() + "|"; - if (tz == null) { - tz = TimeZone.getDefault(); - } - synchronized (TF1) { - TF1.setTimeZone(tz); - try { - return new SimpleDate(TF1.parse(s), TemplateDateModel.TIME); - } catch (java.text.ParseException e) { - ; // ignore - } - TF2.setTimeZone(tz); - try { - return new SimpleDate(TF2.parse(s), TemplateDateModel.TIME); - } catch (java.text.ParseException e) { - ; // ignore - } - TF3.setTimeZone(tz); - try { - return new SimpleDate(TF3.parse(s), TemplateDateModel.TIME); - } catch (java.text.ParseException e) { - ; // ignore - } - TF4.setTimeZone(tz); - try { - return new SimpleDate(TF4.parse(s), TemplateDateModel.TIME); - } catch (java.text.ParseException e) { - throw new ParseException("Failed to parse " - + jQuote(orig) + " as time. Use format " - + "\"H:mm:ss\" or \"h:mm:ss a\" " + "or \"H:mm:ss z\" or \"h:mm:ss a z\"."); - } - } - } - - /** - * Parses a date-time of format {@code "yyyy-MM-dd H:mm:ss"} - * or {@code "yyyy-MM-dd h:mm:ss a"} or - * {@code "yyyy-MM-dd H:mm:ss z"} - * or {@code "yyyy-MM-dd h:mm:ss a z"} and returns it as - * {@link TemplateDateModel}. - */ - public static TemplateDateModel stringToDateTime(String s, TimeZone tz) - throws ParseException { - String orig = s; - s = s.trim() + "|"; - if (tz == null) { - tz = TimeZone.getDefault(); - } - synchronized (DTF1) { - DTF1.setTimeZone(tz); - try { - return new SimpleDate( - DTF1.parse(s), TemplateDateModel.DATETIME); - } catch (java.text.ParseException e) { - ; // ignore - } - DTF2.setTimeZone(tz); - try { - return new SimpleDate( - DTF2.parse(s), TemplateDateModel.DATETIME); - } catch (java.text.ParseException e) { - ; // ignore - } - DTF3.setTimeZone(tz); - try { - return new SimpleDate( - DTF3.parse(s), TemplateDateModel.DATETIME); - } catch (java.text.ParseException e) { - ; // ignore - } - DTF4.setTimeZone(tz); - try { - return new SimpleDate( - DTF4.parse(s), TemplateDateModel.DATETIME); - } catch (java.text.ParseException e) { - throw new ParseException("Failed to parse " - + jQuote(orig) + " as date-time. Use format " - + "\"yyyy-MM-dd H:mm:ss\" " + "or \"yyyy-MM-dd h:mm:ss a\" " - + "or \"yyyy-MM-dd H:mm:ss z\" " + "or \"yyyy-MM-dd h:mm:ss a z\"."); - } - } - } - - /** - * Converts all line-breaks to UN*X linebreaks ({@code "\n"}). The - * input text can contain UN*X, DOS (Windows) and Mac linebreaks mixed. - */ - public static String normalizeLinebreaks(String s) { - int ln = s.length(); - char c; - int i; - for (i = 0; i < ln; i++) { - c = s.charAt(i); - if (c == 0x0D) { - break; - } - } - if (i == ln) { - return s; - } - StringBuffer res = new StringBuffer(ln); - for (int x = 0; x < i; x++) { - res.append(s.charAt(x)); - } - outer: while (true) { - if (i + 1 < ln && s.charAt(i + 1) == 0xA) { - i++; - } - res.append('\n'); - inner: while (true) { - i++; - if (i == ln) { - break outer; - } - c = s.charAt(i); - if (c == 0xD) { - break inner; - } - res.append(c); - } - } - return res.toString(); - } - - /** - * Formal (syntactical) problem with the text. - */ - public static class ParseException extends ExceptionCC { - - public ParseException(String message) { - super(message); - } - - public ParseException(String message, int position) { - super(message + StringUtil.LINE_BREAK - + "Error location: character " + (position + 1)); - } - - public ParseException( - String message, String text, int position, String fileName) { - super(createSourceCodeErrorMessage( - message, text, position, fileName, 56)); - } - - - public ParseException(String message, Throwable cause) { - super(message, cause); - } - - public ParseException(String message, int position, Throwable cause) { - super(message + StringUtil.LINE_BREAK - + "Error location: character " + (position + 1), - cause); - } - - public ParseException( - String message, String text, int position, String fileName, - Throwable cause) { - super(createSourceCodeErrorMessage( - message, text, position, fileName, 56), - cause); - } - } - - /** - * @since 0.9.15 - */ - public static String repeat(String s, int n) { - if (n == 0) return ""; - if (n == 1) return s; - if (n < 0) { - throw new IllegalArgumentException("Negative repeat count: " + n); - } - StringBuffer sb = new StringBuffer(s.length() * n); - for (int i = 0; i < n; i++) { - sb.append(s); - } - return sb.toString(); - } - - /** - * @since 0.9.15 - */ - public static String capitalizeFirst(String s) { - if (s == null || s.length() == 0) return s; - char c = s.charAt(0); - return Character.isLowerCase(c) ? Character.toUpperCase(c) + s.substring(1) : s; - } -} diff --git a/fmpp/src/main/java/fmpp/util/package.html b/fmpp/src/main/java/fmpp/util/package.html deleted file mode 100644 index 9df7c9f..0000000 --- a/fmpp/src/main/java/fmpp/util/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -

    Collection of more-less FMPP independent utility classes. - \ No newline at end of file diff --git a/fmpp/src/main/resources/META-INF/LICENSE.txt b/fmpp/src/main/resources/META-INF/LICENSE.txt deleted file mode 100644 index 4e14d05..0000000 --- a/fmpp/src/main/resources/META-INF/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/fmpp/src/main/resources/fmpp/version.properties b/fmpp/src/main/resources/fmpp/version.properties deleted file mode 100644 index 1ec91f9..0000000 --- a/fmpp/src/main/resources/fmpp/version.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Format: major.minor.micro -# Nightly version of upcoming version x.y.z should look like: x.y.z.5 -# No letters are allowed for META-INF compatibility. -version=0.9.15 - -# Same as "version" above, except that for nightly use "-SNAPSHOT" instead of ".5". -mavenVersion=0.9.15 - -buildInfo=@TIMESTAMP@ \ No newline at end of file diff --git a/fmpp/src/test/java/fmpp/testsuite/ConsoleTestProgressListener.java b/fmpp/src/test/java/fmpp/testsuite/ConsoleTestProgressListener.java deleted file mode 100644 index a52407b..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/ConsoleTestProgressListener.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -/** - * Prints test suite progress to the console. - */ -public class ConsoleTestProgressListener implements TestProgressListener { - - public void sendMessage(String message) { - System.out.println(message); - } - -} diff --git a/fmpp/src/test/java/fmpp/testsuite/SortAttrsTransform.java b/fmpp/src/test/java/fmpp/testsuite/SortAttrsTransform.java deleted file mode 100644 index 140dbe3..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/SortAttrsTransform.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateTransformModel; - -/** - * Sorts the attributes of elements to alphabetical order. - */ -public class SortAttrsTransform implements TemplateTransformModel { - - public SortAttrsTransform() { - } - - public Writer getWriter(Writer out, Map args) - throws TemplateModelException, IOException { - return new AttributeSorterWriter(out); - } - - private class AttributeSorterWriter extends Writer { - private final Writer out; - private StringBuffer buf = new StringBuffer(); - - private AttributeSorterWriter(Writer out) { - this.out = out; - } - - public void close() throws IOException { - sendBuffer(); - } - - public void flush() throws IOException { - sendBuffer(); - out.flush(); - } - - public void write(char[] cbuf, int off, int len) throws IOException { - buf.append(cbuf, off, len); - } - - private void sendBuffer() throws IOException { - String src = buf.toString(); - int ln = src.length(); - char[] dst = new char[ln]; - List attrs = new ArrayList(); - int dp = 0, sp = 0; - normalMode: while (sp < ln) { - char c = src.charAt(sp++); - dst[dp++] = c; - - if (c == '<' && sp < ln && Character.isLetter(src.charAt(sp))) { - tagNameMode: while (sp < ln) { - c = src.charAt(sp++); - dst[dp++] = c; - if (c == '>' || c == '/') { - continue normalMode; - } - if (Character.isWhitespace(c)) { - break tagNameMode; - } - } - findFirstAttrMode: while (sp < ln) { - c = src.charAt(sp); - if (!Character.isWhitespace(c)) { - break findFirstAttrMode; - } - sp++; - dst[dp++] = c; - } - if (sp == ln || c == '>' || c == '/') { - continue normalMode; - } - int attrStart; - attrs.clear(); - fetchAttrsMode: while (true) { - attrStart = sp; - findAttrNameEndMode: while (true) { - if (sp == ln) { - break findAttrNameEndMode; - } - c = src.charAt(sp); - if (Character.isWhitespace(c) || c == '=') { - break findAttrNameEndMode; - } - if (c == '>' || c == '/') { - break findAttrNameEndMode; - } - sp++; - } - boolean foundEqS = false; - findAttrValueStartMode: while (true) { - if (sp == ln) { - break findAttrValueStartMode; - } - c = src.charAt(sp); - if (c == '=') { - foundEqS = true; - } else if (!Character.isWhitespace(c)) { - break findAttrValueStartMode; - } - sp++; - } - if (!foundEqS) { - int x = sp - 1; - while (x >= attrStart - && Character.isWhitespace(src.charAt(x))) { - x--; - } - attrs.add(src.substring(attrStart, x + 1)); - sp = x + 1; - } else { - char q = ' '; - findAttrValueEndMode: while (true) { - if (sp == ln) { - attrs.add(src.substring(attrStart, sp)); - break findAttrValueEndMode; - } - c = src.charAt(sp); - if (c == '"' || c == '\'') { - if (q == c) { - q = ' '; - } else if (q == ' ') { - q = c; - } - } - if (q == ' ') { - if (Character.isWhitespace(c)) { - attrs.add(src.substring(attrStart, sp)); - break findAttrValueEndMode; - } else if (c == '>' || c == '/') { - attrs.add(src.substring(attrStart, sp)); - break findAttrValueEndMode; - } - } - sp++; - } - } - int lastSp = sp; - while (true) { - if (sp == ln) { - sp = lastSp; - break fetchAttrsMode; - } - c = src.charAt(sp); - if (c == '>' || c == '/') { - sp = lastSp; - break fetchAttrsMode; - } - if (!Character.isWhitespace(c)) { - break; - } - sp++; - } - } // fetchAttrsMode loop - Collections.sort(attrs); - int aln = attrs.size(); - for (int i = 0; i < aln; i++) { - if (i != 0) { - dst[dp++] = ' '; - } - String s = (String) attrs.get(i); - int sln = s.length(); - for (int x = 0; x < sln; x++) { - dst[dp++] = s.charAt(x); - } - } - } // if element tag start - } // normalMode loop; - buf.setLength(0); - out.write(dst, 0, dp); - } - } -} diff --git a/fmpp/src/test/java/fmpp/testsuite/TestLocalDataBuilder.java b/fmpp/src/test/java/fmpp/testsuite/TestLocalDataBuilder.java deleted file mode 100644 index 5895671..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/TestLocalDataBuilder.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -import java.util.HashMap; -import java.util.Map; - -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.TemplateEnvironment; - -/** - */ -public class TestLocalDataBuilder implements LocalDataBuilder { - - public Map build(Engine eng, TemplateEnvironment env) throws Exception { - Map res = new HashMap(); - String path = env.toSourceRootRelativePath(env.getSourceFile()); - res.put("id", "Z:" + path); - res.put("id2", "ZZ:" + path); - res.put("id3", "ZZZ:" + path); - return res; - } - -} diff --git a/fmpp/src/test/java/fmpp/testsuite/TestProgressListener.java b/fmpp/src/test/java/fmpp/testsuite/TestProgressListener.java deleted file mode 100644 index a499a18..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/TestProgressListener.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -/** - * Contains callback method for monitoring test suite execution. - */ -public interface TestProgressListener { - - void sendMessage(String message); -} diff --git a/fmpp/src/test/java/fmpp/testsuite/TestSuite.java b/fmpp/src/test/java/fmpp/testsuite/TestSuite.java deleted file mode 100644 index abcb8cf..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/TestSuite.java +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; - -import fmpp.tools.CommandLine; -import fmpp.util.FileUtil; -import fmpp.util.MiscUtil; -import fmpp.util.StringUtil; - -/** - * FMPP test suite. - */ -public class TestSuite { - private final File projsParentDir; - private final File refsParentDir; - private final File suiteOutputDir; - private final String testcase; - private Writer suiteLogWriter; - private TestProgressListener progressListener; - - private int countSuccessfull; - private int countDiffers; - private int countError; - private List differProjectNames = new ArrayList(); - private List errorProjectNames = new ArrayList(); - - /** - * Commandline interface for the test suite. - * - *

    Command-line parameters: - *

      - *
    1. FMPP home directory. Required. - *
    2. The name of the testcase to run. If omitted or empty string, - * then all testcases will be executed. - *
        - */ - public static void main(String[] args) throws Exception { - int argsln = args.length; - if (argsln != 1 && argsln != 2) { - System.out.println( - "Usage: java fmpp.testsuite.TestSuite " + " [testcase]"); - System.out.println(); - System.exit(-1); - } - File fmppHomeDir = new File(args[0]); - if (!fmppHomeDir.isDirectory()) { - System.out.println( - "The specified FMPP home directory does not exist."); - System.out.println(); - System.exit(-1); - } - File outputDir = new File( - fmppHomeDir, "build" + File.separator + "test-output"); - String testcase = null; - if (argsln > 1) { - testcase = args[1]; - if (testcase.length() == 0) { - testcase = null; - } - } - TestSuite testSuite = new TestSuite( - new File(fmppHomeDir, - "src" + File.separator + "test" + File.separator + "resources" - + File.separator + "tests"), - new File(fmppHomeDir, - "src" + File.separator + "test" + File.separator + "resources" - + File.separator + "expected"), - outputDir, - testcase); - testSuite.progressListener = new ConsoleTestProgressListener(); - testSuite.run(); - System.out.println("================================================="); - System.out.println("OK: " + testSuite.countSuccessfull - + ", Differs: " + testSuite.countDiffers - + ", Error: " + testSuite.countError); - System.out.println(); - if (testSuite.countError != 0 || testSuite.countDiffers != 0) { - System.out.println("/\\/\\/ TEST SUITE FAILED! \\/\\/\\"); - if (testSuite.countError != 0) { - System.out.println("Projects failed with errors were:"); - for (int i = 0; i < testSuite.errorProjectNames.size(); i++) { - System.out.print("- "); - System.out.println(testSuite.errorProjectNames.get(i)); - } - } - if (testSuite.countDiffers != 0) { - System.out.println( - "Projects where the output and the reference differs:"); - for (int i = 0; i < testSuite.differProjectNames.size(); i++) { - System.out.print("- "); - System.out.println(testSuite.differProjectNames.get(i)); - } - } - System.out.println(""); - System.out.println("Look into build/testsuite/ for more details."); - System.exit(-1); - } else { - System.out.println("*** TEST SUITE SUCCESSFULL ***"); - System.exit(0); - } - } - - public TestSuite( - File projsParentDir, File refsParentDir, File suiteOutputDir, - String testcase) - throws IOException { - this.projsParentDir = projsParentDir; - this.refsParentDir = refsParentDir; - this.suiteOutputDir = suiteOutputDir; - this.testcase = testcase; - } - - public void run() throws IOException { - File[] projects; - if (testcase == null) { - projects = removeCVSAndSVNFiles(projsParentDir.listFiles()); - } else { - projects = new File[] {new File(projsParentDir, testcase)}; - } - if (projects == null) { - throw new FileNotFoundException("Project directory not found: " - + projsParentDir.getCanonicalPath()); - } - createEmptyDir(suiteOutputDir, "compile"); - this.suiteLogWriter = new FileWriter( - new File(suiteOutputDir, "suitelog.txt")); - try { - for (int i = 0; i < projects.length; i++) { - if (projects[i].isDirectory()) { - String projName = projects[i].getName(); - File projOutDir = new File( - suiteOutputDir, - "projects" + File.separator + projName); - createEmptyDir(projOutDir, null); - String[] args = new String[] { - "-C", projects[i].getAbsolutePath(), - "-O", new File(projOutDir, "out") - .getAbsolutePath(), - "-L", new File(projOutDir, "projlog.txt") - .getAbsolutePath(), - "--columns", "76", - "-q"}; - File argsFile = new File(projects[i], "args.txt"); - if (argsFile.exists()) { - String[] oldArgs = args; - String[] extraArgs = loadArgs(argsFile); - args = new String[ - oldArgs.length + extraArgs.length]; - int x; - for (x = 0; x < oldArgs.length; x++) { - args[x] = oldArgs[x]; - } - int y = 0; - for (; x < args.length; x++) { - args[x] = extraArgs[y]; - y++; - } - } - StringWriter capturedStderr = new StringWriter(); - PrintWriter pwr = new PrintWriter(capturedStderr); - int exitCode = CommandLine.execute(args, pwr, pwr); - if (exitCode != 0) { - pwr.close(); - log(projName + ": Error!"); - logIndented( - StringUtil.chomp( - capturedStderr.toString())); - countError++; - errorProjectNames.add(projName); - if (progressListener != null) { - progressListener.sendMessage( - "- " + projName + ": Error!"); - } - } else { - String diffs = checkProjectOutput( - new File(refsParentDir, projName), - new File(projOutDir, "out")); - if (diffs == null) { - log(projName + ": OK"); - countSuccessfull++; - if (progressListener != null) { - progressListener.sendMessage( - "- " + projName + ": OK"); - } - } else { - log(projName + ": Differs!"); - logIndented(diffs); - differProjectNames.add(projName); - countDiffers++; - if (progressListener != null) { - progressListener.sendMessage( - "- " + projName + ": Differs!"); - } - } - } - } else if (!projects[i].exists()) { - throw new FileNotFoundException(projects[i].getPath()); - } - } - } catch (IOException e) { - log("Test suite aborted with I/O error: "); - log(MiscUtil.causeTrace(e)); - throw e; - } finally { - this.suiteLogWriter.close(); - this.suiteLogWriter = null; - } - } - - private static void createEmptyDir(File dir, String keepDir) - throws IOException { - if (!dir.exists()) { - dir.mkdirs(); - } else { - emptyDir(dir, keepDir); - } - } - - private static void emptyDir(File dir, String keepDir) throws IOException { - String path = dir.getCanonicalPath(); - if (path.indexOf(File.separator + "build" + File.separator) == -1) { - throw new IOException("Safety restriction: " - + "The directory to empty must be inside directory " - + "\"build\". This does not stand for this path: " + path); - } - - File[] files = removeCVSAndSVNFiles(dir.listFiles()); - for (int i = 0; i < files.length; i++) { - if (files[i].isDirectory()) { - if (keepDir == null || !files[i].getName().equals(keepDir)) { - emptyDir(files[i], null); - files[i].delete(); - } - } else { - files[i].delete(); - } - } - } - - /** - * Compares two directories and its content for equality. - * @return null if the two directory is identical, otherwise - * the text that describes the difference. - */ - private String checkProjectOutput( - File currentProjRefDir, File currentProjOutputDir) - throws IOException { - ComparsionEnvironment env = new ComparsionEnvironment(); - env.currentProjOutputDir = currentProjOutputDir; - env.currentProjRefDir = currentProjRefDir; - checkProjectOutput_compareDirs( - env, currentProjRefDir, currentProjOutputDir); - StringUtil.chomp(env.diffs); - return env.diffs.length() == 0 ? null : env.diffs.toString(); - } - - private void checkProjectOutput_compareDirs( - ComparsionEnvironment env, File refDir, File chkedDir) - throws IOException { - File[] refDirFiles = refDir.listFiles(); - if (refDirFiles == null) { - throw new IOException("Reference directory not found: " - + refDir.getAbsolutePath()); - } - refDirFiles = removeCVSAndSVNFiles(refDirFiles); - - File[] chkedDirFiles = chkedDir.listFiles(); - if (chkedDirFiles == null) { - throw new IOException("Checked directory not found: " - + chkedDir.getAbsolutePath()); - } - chkedDirFiles = removeCVSAndSVNFiles(chkedDirFiles); - - for (int ci = 0; ci < chkedDirFiles.length; ci++) { - File cf = chkedDirFiles[ci]; - boolean isDir = cf.isDirectory(); - int ri = findCounterpart(refDirFiles, cf); - if (ri != -1) { - if (isDir) { - checkProjectOutput_compareDirs(env, refDirFiles[ri], cf); - } else { - checkProjectOutput_compareFiles(env, refDirFiles[ri], cf); - } - refDirFiles[ri] = null; - } else { - env.logDiff( - FileUtil.getRelativePath(env.currentProjOutputDir, cf) - + ": " - + (isDir ? "Directory" : "File") - + " shouldn't exist."); - } - } - - for (int ri = 0; ri < refDirFiles.length; ri++) { - File rf = refDirFiles[ri]; - if (rf != null) { - env.logDiff( - FileUtil.getRelativePath(env.currentProjRefDir, rf) - + ": " - + (rf.isDirectory() ? "Directory" : "File") - + " is missing."); - } - } - } - - private void checkProjectOutput_compareFiles( - ComparsionEnvironment env, File refFile, File chkdFile) - throws IOException { - InputStream in; - - byte[] ref; - int refln; - int refi; - in = new FileInputStream(refFile); - try { - ref = FileUtil.loadByteArray(in); - } finally { - in.close(); - } - refln = ref.length; - refi = 0; - - byte[] chkd; - int chkdln; - int chkdi; - in = new FileInputStream(chkdFile); - try { - chkd = FileUtil.loadByteArray(in); - } finally { - in.close(); - } - chkdln = chkd.length; - chkdi = 0; - - int refc; - int chkdc; - readLoop: do { - if (refi < refln) { - refc = ref[refi++]; - if (refc == 0xD) { - refc = 0xA; - if (refi < refln) { - if (ref[refi] == 0xA) { - refi++; - } - } - } - } else { - refc = -1; - } - - - if (chkdi < chkdln) { - chkdc = chkd[chkdi++]; - if (chkdc == 0xD) { - chkdc = 0xA; - if (chkdi < chkdln) { - if (chkd[chkdi] == 0xA) { - chkdi++; - } - } - } - } else { - chkdc = -1; - } - - if (refc != chkdc) { - if (refc == -1) { - env.logDiff( - FileUtil.getRelativePath( - env.currentProjRefDir, refFile) - + ": The file is longer than the reference file."); - break readLoop; - } else if (chkdc == -1) { - env.logDiff( - FileUtil.getRelativePath( - env.currentProjRefDir, refFile) - + ": The file is shorter than the reference file."); - break readLoop; - } else { - env.logDiff( - FileUtil.getRelativePath( - env.currentProjRefDir, refFile) - + ": Different byte(s) at output file position " - + (chkdi)); - break readLoop; - } - } - } while (!(refc == -1 && chkdc == -1)); - } - - private static int findCounterpart(File[] files, File file) { - String fName = file.getName(); - for (int i = 0; i < files.length; i++) { - if (files[i] != null && files[i].getName().equals(fName) - && (files[i].isDirectory() == file.isDirectory())) { - return i; - } - } - return -1; - } - - private void log(String text) throws IOException { - suiteLogWriter.write(StringUtil.wrap(text, 80)); - suiteLogWriter.write(StringUtil.LINE_BREAK); - } - - private void logIndented(String text) throws IOException { - suiteLogWriter.write(StringUtil.wrap(text, 80, 4)); - suiteLogWriter.write(StringUtil.LINE_BREAK); - } - - private class ComparsionEnvironment { - StringBuffer diffs = new StringBuffer(); - File currentProjOutputDir; - File currentProjRefDir; - byte[] wb1 = new byte[8192]; - byte[] wb2 = new byte[8192]; - - void logDiff(String message) { - diffs.append(message); - diffs.append(StringUtil.LINE_BREAK); - } - } - - private String[] loadArgs(File f) throws IOException { - String s = FileUtil.loadString(new FileInputStream(f), "UTF-8"); - int ln = s.length(); - List ls = new ArrayList(); - int next = 0; - for (int i = 0; i <= ln; i++) { - char c; - if (i != ln) { - c = s.charAt(i); - } else { - c = 0xA; - } - if (c == 0xA || c == 0xD) { - String s2 = s.substring(next, i); - next = i + 1; - s2 = s2.trim(); - if (s2.length() != 0 && !s2.startsWith("#")) { - ls.add(s2); - } - } - } - ln = ls.size(); - String[] res = new String[ln]; - for (int i = 0; i < ln; i++) { - res[i] = (String) ls.get(i); - } - return res; - } - - private static File[] removeCVSAndSVNFiles(File[] files) { - int ln = files.length; - ArrayList list = new ArrayList(ln); - boolean changed = false; - for (int i = 0; i < ln; i++) { - String name = files[i].getName().toLowerCase(); - if (!name.equals("cvs") && !name.startsWith(".#") - && !name.equals(".svn") && !name.equals(".gitignore")) { - list.add(files[i]); - } else { - changed = true; - } - } - if (changed) { - ln = list.size(); - files = new File[ln]; - for (int i = 0; i < ln; i++) { - files[i] = (File) list.get(i); - } - } - return files; - } -} \ No newline at end of file diff --git a/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder.java b/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder.java deleted file mode 100644 index 378c7f1..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -import java.util.HashMap; -import java.util.Map; - -import org.w3c.dom.Document; - -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.TemplateEnvironment; - -/** - */ -public class TestXmlLocalDataBuilder implements LocalDataBuilder { - - public Map build(Engine eng, TemplateEnvironment env) throws Exception { - Document doc = (Document) env.getXmlDocument(); - - Map ld = new HashMap(); - - ld.put("a", doc.getDocumentElement().getLocalName()); - - return ld; - } -} \ No newline at end of file diff --git a/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder2.java b/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder2.java deleted file mode 100644 index ba6b44c..0000000 --- a/fmpp/src/test/java/fmpp/testsuite/TestXmlLocalDataBuilder2.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package fmpp.testsuite; - -import java.util.HashMap; -import java.util.Map; - -import fmpp.Engine; -import fmpp.LocalDataBuilder; -import fmpp.TemplateEnvironment; -import freemarker.template.TemplateNodeModel; - -/** - */ -public class TestXmlLocalDataBuilder2 implements LocalDataBuilder { - - public Map build(Engine eng, TemplateEnvironment env) throws Exception { - TemplateNodeModel wdoc = env.getWrappedXmlDocument(); - - Map ld = new HashMap(); - - ld.put("a", "bad"); - ld.put("b", ((TemplateNodeModel) wdoc.getChildNodes().get(0)) - .getNodeName()); - - return ld; - } - -} \ No newline at end of file diff --git a/fmpp/src/test/java/fmpp/util/JSONParserTest.java b/fmpp/src/test/java/fmpp/util/JSONParserTest.java deleted file mode 100644 index 249ca1f..0000000 --- a/fmpp/src/test/java/fmpp/util/JSONParserTest.java +++ /dev/null @@ -1,356 +0,0 @@ -package fmpp.util; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import junit.framework.TestCase; -import fmpp.models.JSONNode; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNodeModel; -import freemarker.template.TemplateSequenceModel; - -public class JSONParserTest extends TestCase { - - public void testKeywords() throws JSONParseException { - assertJSONEquals(Boolean.TRUE, "true"); - assertJSONEquals(Boolean.FALSE, "false"); - assertJSONEquals(null, "null"); - - assertJSONEquals(Boolean.TRUE, " true "); - } - - public void testMalformedKeywords() throws JSONParseException { - assertJSONParsingFails("keyword: True", "True"); - assertJSONParsingFails("keyword: _true$1", "_true$1"); - assertJSONParsingFails("keyword: truefalse", "truefalse"); - assertJSONParsingFails("found further non-whitespace", "true[]"); - assertJSONParsingFails("found further non-whitespace", "true{}"); - } - - public void testStrings() throws JSONParseException { - assertJSONEquals("", "\"\""); - assertJSONEquals("a", "\"a\""); - assertJSONEquals("ab cd", "\"ab cd\""); - assertJSONEquals(" ", "\" \""); - assertJSONEquals(" ", "\" \""); - - assertJSONEquals("a\"c", "\"a\\\"c\""); - assertJSONEquals("a\"c\"", "\"a\\\"c\\\"\""); - assertJSONEquals("a\\\"c", "\"a\\\\\\\"c\""); - assertJSONEquals("\"\\/\b\f\n\r\t", "\"\\\"\\\\\\/\\b\\f\\n\\r\\t\""); - assertJSONEquals(" \" \\ / \b \f \n \r \t ", "\" \\\" \\\\ \\/ \\b \\f \\n \\r \\t \" "); - assertJSONEquals("\n", "\"\\n\""); - assertJSONEquals("\"", "\"\\\"\""); - - assertJSONEquals("a\nb", "\"a\\nb\""); - assertJSONEquals("\n", "\"\\n\""); - - assertJSONEquals("a", " \"a\" "); - - assertJSONEquals("a", " \"a\" "); - - assertJSONEquals("\f", " \"\\u000c\" "); - assertJSONEquals("\f", " \"\\u000C\" "); - assertJSONEquals(" AB3", " \"\\u0020\\u0041\\u00423\" "); - } - - public void testMalformedStrings() throws JSONParseException { - assertJSONParsingFails("apostrophe", "'a'"); - assertJSONParsingFails("string literal was still unclosed", "\"a"); - assertJSONParsingFails("LF", "\"\n\""); - assertJSONParsingFails("CR", "\"\r\""); - assertJSONParsingFails("tab", "\"\t\""); - - assertJSONParsingFails("unsupported escape", "\"\\x\""); - assertJSONParsingFails("unsupported escape", "\"\\U0000\""); - - assertJSONParsingFails("4 hex", "\"\\u\""); - assertJSONParsingFails("4 hex", "\"\\uc\""); - assertJSONParsingFails("4 hex", "\"\\u0c\""); - assertJSONParsingFails("4 hex", "\"\\u00c\""); - assertJSONParsingFails("4 hex", "\"\\u00q0\""); - } - - public void testPlainWholeNumbers() throws JSONParseException { - assertJSONEquals(new Integer(0), "0"); - assertJSONEquals(new Integer(1), "1"); - assertJSONEquals(new Integer(10), "10"); - assertJSONEquals(new Integer(9999001), "9999001"); - assertJSONEquals(new Integer(Integer.MAX_VALUE), "" + Integer.MAX_VALUE); - - assertJSONEquals(new Integer(0), "-0"); - assertJSONEquals(new Integer(-1), "-1"); - assertJSONEquals(new Integer(-10), "-10"); - assertJSONEquals(new Integer(-9999001), "-9999001"); - assertJSONEquals(new Integer(Integer.MIN_VALUE), "" + Integer.MIN_VALUE); - - assertJSONEquals(new Long(Integer.MAX_VALUE + 1L), "" + (Integer.MAX_VALUE + 1L)); - assertJSONEquals(new Long(Integer.MIN_VALUE - 1L), "" + (Integer.MIN_VALUE - 1L)); - assertJSONEquals(new Long(Long.MAX_VALUE), "" + Long.MAX_VALUE); - assertJSONEquals(new Long(Long.MIN_VALUE), "" + Long.MIN_VALUE); - - assertJSONEquals(new BigDecimal("9223372036854775808"), "9223372036854775808"); - assertJSONEquals(new BigDecimal("-9223372036854775809"), "-9223372036854775809"); - assertJSONEquals(new BigDecimal("123456789012345678901234567890"), "123456789012345678901234567890"); - assertJSONEquals(new BigDecimal("-123456789012345678901234567890"), "-123456789012345678901234567890"); - } - - public void testDecimalNumbers() throws JSONParseException { - assertJSONEquals(new Integer(0), "0.0"); - assertJSONEquals(new Integer(0), "0.000"); - assertJSONEquals(new BigDecimal("0.1"), "0.1"); - assertJSONEquals(new BigDecimal("0.01"), "0.01"); - assertJSONEquals(new BigDecimal("0.001"), "0.001"); - assertJSONEquals(new BigDecimal("0.123"), "0.123"); - assertJSONEquals(new BigDecimal("0.12300"), "0.12300"); - assertJSONEquals(new BigDecimal("2345.678"), "2345.678"); - assertJSONEquals(new BigDecimal("1234567890.1234567890"), "1234567890.1234567890"); - - assertJSONEquals(new Integer(0), "-0.0"); - assertJSONEquals(new BigDecimal("-0.1"), "-0.1"); - assertJSONEquals(new BigDecimal("-0.001"), "-0.001"); - assertJSONEquals(new BigDecimal("-2345.678"), "-2345.678"); - assertJSONEquals(new BigDecimal("-1234567890.1234567890"), "-1234567890.1234567890"); - - assertJSONEquals(new BigDecimal("0.1"), "\n\t 0.1\n "); - } - - public void testENumbers() throws JSONParseException { - assertJSONEquals(new Integer(0), "0E0"); - assertJSONEquals(new Integer(0), "0E-3"); - assertJSONEquals(new Integer(0), "0E3"); - assertJSONEquals(new Integer(0), "0E+3"); - assertJSONEquals(new Integer(100), "1e2"); - assertJSONEquals(new Integer(100), "1e002"); - assertJSONEquals(new BigDecimal("1.5e-2"), "1.5e-2"); - assertJSONEquals(new Integer(150), "1.5e2"); - assertJSONEquals(new Integer(150), "1.5e+2"); - assertJSONEquals(new BigDecimal("1.5"), "1.5e-0"); - assertJSONEquals(new BigDecimal("1.5"), "1.5e+0"); - assertJSONEquals(new BigDecimal("1.5"), "1.5e0"); - assertJSONEquals(new Long(10000000000L), "1E10"); - assertJSONEquals(new Long(10567000000L), "1.0567E10"); - assertJSONEquals(new Long(9223372036854775807L), "9223372036854775807E0"); - assertJSONEquals(new Long(9223372036854775807L), "9223372036854775.807E3"); - assertJSONEquals(new BigDecimal("9223372036854775808"), "9223372036854775808E0"); - assertJSONEquals(new BigDecimal("9223372036854775808"), "9223372036854775.808E3"); - assertJSONEquals(new BigDecimal("3.14E1234567890"), "3.14E1234567890"); - - assertJSONEquals(new Integer(0), "-0E0"); - assertJSONEquals(new Integer(0), "-0E-3"); - assertJSONEquals(new Integer(0), "-0E3"); - assertJSONEquals(new Integer(0), "-0E+3"); - assertJSONEquals(new Integer(-100), "-1e2"); - assertJSONEquals(new BigDecimal("-1.5e-2"), "-1.5e-2"); - assertJSONEquals(new Integer(-150), "-1.5e2"); - assertJSONEquals(new Integer(-150), "-1.5e+2"); - assertJSONEquals(new BigDecimal("-1.5"), "-1.5e-0"); - assertJSONEquals(new BigDecimal("-1.5"), "-1.5e+0"); - assertJSONEquals(new BigDecimal("-1.5"), "-1.5e0"); - assertJSONEquals(new Long(-10000000000L), "-1E10"); - assertJSONEquals(new Long(-10567000000L), "-1.0567E10"); - assertJSONEquals(new Long(-9223372036854775808L), "-9223372036854775808E0"); - assertJSONEquals(new Long(-9223372036854775808L), "-9223372036854775.808E3"); - assertJSONEquals(new BigDecimal("-9223372036854775809"), "-9223372036854775809E0"); - assertJSONEquals(new BigDecimal("-9223372036854775809"), "-9223372036854775.809E3"); - assertJSONEquals(new BigDecimal("-3.14E1234567890"), "-3.14E1234567890"); - } - - public void testMalformedNumbers() throws JSONParseException { - assertJSONParsingFails("superfluous leading 0", "01"); - assertJSONParsingFails("superfluous leading 0", "-01"); - assertJSONParsingFails("beginning", "+1"); - assertJSONParsingFails("starting with \".\"", ".1"); - assertJSONParsingFails("Malformed number: 1e0.1", "1e0.1"); - assertJSONParsingFails("Malformed number: 1.2.3", "1.2.3"); - assertJSONParsingFails("Malformed number: 1e1e1", "1e1e1"); - assertJSONParsingFails("Malformed number: -1e1e1", "-1e1e1"); - assertJSONParsingFails("end-of-file", "-"); - assertJSONParsingFails("beginning", "- "); - assertJSONParsingFails("found further non-whitespace", "1i"); - assertJSONParsingFails("found further non-whitespace", "1-2"); - assertJSONParsingFails("found further non-whitespace", "1+2"); - assertJSONParsingFails("found further non-whitespace", "1[]"); - assertJSONParsingFails("found further non-whitespace", "1{}"); - assertJSONParsingFails("found further non-whitespace", "1true"); - } - - public void testArray() throws JSONParseException { - assertJSONEquals(Collections.EMPTY_LIST, "[]"); - assertJSONEquals(Collections.EMPTY_LIST, "[ \r\n\t ]"); - - ArrayList list = new ArrayList(); - list.add(new Integer(1)); - list.add("x"); - list.add(null); - list.add(new Integer(-140)); - list.add(Boolean.TRUE); - assertJSONEquals(list, "[1, \"x\", null, -1.4e2, true]"); - assertJSONEquals(list, "[\n\t1,\"x\",null,-1.4e2,true\n]"); - assertJSONEquals(list, "\n[\n\t1 ,\n\t\"x\" , null,-1.4e2,true]\n"); - } - - public void testMalformedArray() throws JSONParseException { - assertJSONParsingFails("[...] was still unclosed", "["); - assertJSONParsingFails("[...] was still unclosed", "[1"); - assertJSONParsingFails("value was expected", "[1,"); - assertJSONParsingFails("beginning of", "[1,,"); - assertJSONParsingFails("expected ','", "[1 2"); - } - - public void testObject() throws JSONParseException { - assertJSONEquals(Collections.EMPTY_MAP, "{}"); - assertJSONEquals(Collections.EMPTY_MAP, "{ \r\n\t }"); - - LinkedHashMap map = new LinkedHashMap(); - map.put("a", new Integer(1)); - map.put("k2", "x"); - map.put("ccc", null); - map.put("", new Integer(-140)); - map.put("e", Boolean.TRUE); - assertJSONEquals(map, "{\"a\":1,\"k2\":\"x\",\"ccc\":null,\"\":-1.4e2,\"e\":true}"); - assertJSONEquals(map, "{\n\t\"a\": 1, \"k2\" : \"x\" , \"ccc\" :null , \"\" : -1.4e2 , \"e\" :true\n}"); - - // Source order must be kept: - Map jm = (Map) JSONParser.parse("{\"a\":\"1\", \"x\":\"2\", \"c\":\"3\", \"y\":\"4\"}", null); - assertEquals(Arrays.asList(new Object[] { "a", "x", "c", "y" }), new ArrayList(jm.keySet())); - assertEquals(Arrays.asList(new Object[] { "1", "2", "3", "4" }), new ArrayList(jm.values())); - } - - public void testMalformedObject() throws JSONParseException { - assertJSONParsingFails("{...} was still unclosed", "{"); - assertJSONParsingFails("expected ':'", "{\"x\""); - assertJSONParsingFails("value was expected", "{\"x\":"); - assertJSONParsingFails("{...} was still unclosed", "{\"x\":1"); - assertJSONParsingFails("value was expected", "{\"x\":1, "); - - assertJSONParsingFails("wrong key type", "{1:2}"); - } - - public void testComposites1() throws JSONParseException { - Map subM = new HashMap(); - subM.put("u", new Integer(100)); - subM.put("v", new Integer(200)); - - Map subM2 = new HashMap(); - subM2.put("i", Arrays.asList(new Object[] { "i1", "i2" })); - subM2.put("j", Arrays.asList(new Object[] { "j1", "j2" })); - - Map rootM = new HashMap(); - rootM.put("a", new BigDecimal("0.5")); - rootM.put("b", Arrays.asList(new Object[] { - new Integer(11), - Arrays.asList(new Object[] { "x", "y" }), - Arrays.asList(new Object[] { "X", "Y" }), - new Integer(22), - subM - })); - rootM.put("c", null); - rootM.put("d", subM); - rootM.put("e", subM2); - rootM.put("f", Collections.EMPTY_LIST); - rootM.put("g", Collections.EMPTY_MAP); - rootM.put("h", Collections.singletonList(Collections.EMPTY_LIST)); - rootM.put("i", Collections.singletonMap("", Collections.EMPTY_MAP)); - - assertJSONEquals(rootM, - "{" - + " \"a\": 0.5," - + " \"b\": [11, [\"x\", \"y\"], [\"X\", \"Y\"], 22, {\"u\": 100, \"v\": 200}]," - + " \"c\": null," - + " \"d\": {\"u\": 100, \"v\": 200}," - + " \"e\": {\"i\": [\"i1\", \"i2\"], \"j\": [\"j1\", \"j2\"]}," - + " \"f\": []," - + " \"g\": {}," - + " \"h\": [[]]," - + " \"i\": {\"\":{}}" - + "}"); - } - - public void testComposites2() throws JSONParseException { - Map subM = new HashMap(); - subM.put("u", new Integer(100)); - subM.put("v", new Integer(200)); - - List list = Arrays.asList(new Object[] { - subM, - Arrays.asList(new Object[] { "x", "y" }), - Collections.EMPTY_LIST, - Collections.EMPTY_LIST, - null - }); - assertJSONEquals(list, "[{\"u\": 100, \"v\": 200}, [\"x\", \"y\"], [], [], null]"); - } - - public void testEmptyFile() throws JSONParseException { - assertJSONParsingFails("Empty JSON", ""); - assertJSONParsingFails("Empty JSON", " \n "); - } - - public void testIOOBMessages() throws JSONParseException, TemplateModelException { - { - TemplateNodeModel node = JSONNode.wrap(Arrays.asList(new String[] { "a", "b", "c" })); - try { - node.getChildNodes().get(-1); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - try { - node.getChildNodes().get(3); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - - TemplateSequenceModel seq = (TemplateSequenceModel) node; - try { - seq.get(-1); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - try { - seq.get(3); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - } - - { - Map m = new HashMap(); - m.put("a", "A"); - m.put("b", "B"); - m.put("c", "C"); - TemplateNodeModel node = JSONNode.wrap(m); - try { - node.getChildNodes().get(-1); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - try { - node.getChildNodes().get(3); - } catch (TemplateModelException e) { - assertTrue(e.getMessage().indexOf("0..2") != -1); - } - } - } - - private static void assertJSONEquals(Object expected, String json) throws JSONParseException { - assertEquals(expected, JSONParser.parse(json, null)); - } - - private static void assertJSONParsingFails(String expectedMsgContains, String json) throws JSONParseException { - try { - JSONParser.parse(json, null); - } catch (JSONParseException e) { - final String message = e.getMessage(); - assertTrue("Message didn't contain " + StringUtil.jQuote(expectedMsgContains) + ":\n" - + message, message.toLowerCase().indexOf(expectedMsgContains.toLowerCase()) >= 0); - } - } - -} diff --git a/fmpp/src/test/resources/README.txt b/fmpp/src/test/resources/README.txt deleted file mode 100644 index ff639a0..0000000 --- a/fmpp/src/test/resources/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -FMPP test suite ---------------- - -Directories: - -- tests: FMPP projects (test cases) -- expected: The expected output of the FMPP projects - -The test suite can be run from the FMPP home directory with: - - ant test - -To run only a single test case: - - ant test -Dfmpp.testcase= - -where is the name of the subdirectory in the -"tests" directory. diff --git a/fmpp/src/test/resources/expected/always_create_dirs_off/sub/t3.txt b/fmpp/src/test/resources/expected/always_create_dirs_off/sub/t3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/expected/always_create_dirs_off/sub/t3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/always_create_dirs_off/t.txt b/fmpp/src/test/resources/expected/always_create_dirs_off/t.txt deleted file mode 100644 index 5b5b93f..0000000 --- a/fmpp/src/test/resources/expected/always_create_dirs_off/t.txt +++ /dev/null @@ -1,38 +0,0 @@ - ELEM: I'm the PARAMS element. - I'm belonging the http://example.com/1 namespace. - ATT: I'm the xmlns attribute - of an PARAMS element. - I'm belonging to the http://www.w3.org/2000/xmlns/ namespace. - My value is: http://example.com/1 - ATT: I'm the x attribute - of an PARAMS element. - I'm belonging to the http://www.w3.org/2000/xmlns/ namespace. - My value is: http://example.com/2 - - ELEM: I'm the PARAM element. - I'm belonging the http://example.com/1 namespace. - ATT: I'm the name attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Color - ATT: I'm the value attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Red - - ELEM: I'm the PARAM element. - I'm belonging the http://example.com/2 namespace. - ATT: I'm the name attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Height - ATT: I'm the value attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: 34 inches - ATT: I'm the foo attribute - of an PARAM element. - I'm belonging to the http://example.com/2 namespace. - My value is: bar - - diff --git a/fmpp/src/test/resources/expected/always_create_dirs_on/sub/t3.txt b/fmpp/src/test/resources/expected/always_create_dirs_on/sub/t3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/expected/always_create_dirs_on/sub/t3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/always_create_dirs_on/t.txt b/fmpp/src/test/resources/expected/always_create_dirs_on/t.txt deleted file mode 100644 index 5b5b93f..0000000 --- a/fmpp/src/test/resources/expected/always_create_dirs_on/t.txt +++ /dev/null @@ -1,38 +0,0 @@ - ELEM: I'm the PARAMS element. - I'm belonging the http://example.com/1 namespace. - ATT: I'm the xmlns attribute - of an PARAMS element. - I'm belonging to the http://www.w3.org/2000/xmlns/ namespace. - My value is: http://example.com/1 - ATT: I'm the x attribute - of an PARAMS element. - I'm belonging to the http://www.w3.org/2000/xmlns/ namespace. - My value is: http://example.com/2 - - ELEM: I'm the PARAM element. - I'm belonging the http://example.com/1 namespace. - ATT: I'm the name attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Color - ATT: I'm the value attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Red - - ELEM: I'm the PARAM element. - I'm belonging the http://example.com/2 namespace. - ATT: I'm the name attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: Height - ATT: I'm the value attribute - of an PARAM element. - I'm belonging to the void namespace. - My value is: 34 inches - ATT: I'm the foo attribute - of an PARAM element. - I'm belonging to the http://example.com/2 namespace. - My value is: bar - - diff --git a/fmpp/src/test/resources/expected/basic_usecase/index.html b/fmpp/src/test/resources/expected/basic_usecase/index.html deleted file mode 100644 index b7f4a33..0000000 --- a/fmpp/src/test/resources/expected/basic_usecase/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - Die maggots! - - -

        Die maggots!

        -

        -

        Rattrah - diff --git a/fmpp/src/test/resources/expected/basic_usecase/mi.png b/fmpp/src/test/resources/expected/basic_usecase/mi.png deleted file mode 100644 index 902e9424de508d39a634e02391c9208a2851b092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5;pK<9Qpf>grPhVH|%Un!CN{T-FOtXPP zoCO|{#S9Gmi6G3l!hU%sP>?0v(btiIVPik{pF~z5-ypyz#1%+eSXi{Tw;w-#eC5iO z<>lquwr%_O@1L8S+w|$v)6>(RJ$t66rgrPrt?=-0QBl!@ybEpt_1y4uaSW-rm7L(f z-ebfgWAJU!le0W?gcrzs{v^b=Mz(XWUe&a{ z*re0;+`;(g>C@&0HTwFg5A^0U6ooTgSlY_-=Bd1d#Iotr&#;}`be+kxYkIQ- - Rattrah - - -

        Rattrah

        -

        Rattrahad - diff --git a/fmpp/src/test/resources/expected/basic_usecase/sub/subsub/rattrahad.html b/fmpp/src/test/resources/expected/basic_usecase/sub/subsub/rattrahad.html deleted file mode 100644 index 1e08df2..0000000 --- a/fmpp/src/test/resources/expected/basic_usecase/sub/subsub/rattrahad.html +++ /dev/null @@ -1,7 +0,0 @@ - - Rattrahad - - -

        Rattrahad

        -

        Index - diff --git a/fmpp/src/test/resources/expected/borders/1.txt b/fmpp/src/test/resources/expected/borders/1.txt deleted file mode 100644 index f11ac3e..0000000 --- a/fmpp/src/test/resources/expected/borders/1.txt +++ /dev/null @@ -1 +0,0 @@ -H0{H1{ROOTH2{@}ROOTF3}F1}F0 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/1.x b/fmpp/src/test/resources/expected/borders/1.x deleted file mode 100644 index 8880660..0000000 --- a/fmpp/src/test/resources/expected/borders/1.x +++ /dev/null @@ -1,2 +0,0 @@ -H0{H1{ROOTH2{@}ROOTF3}F1}F0 ----X--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/1.y b/fmpp/src/test/resources/expected/borders/1.y deleted file mode 100644 index 0841f41..0000000 --- a/fmpp/src/test/resources/expected/borders/1.y +++ /dev/null @@ -1,2 +0,0 @@ -H0{H1{ROOTH2{@}ROOTF3}F1}F0 ----Y--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/sub/1.txt b/fmpp/src/test/resources/expected/borders/sub/1.txt deleted file mode 100644 index e775735..0000000 --- a/fmpp/src/test/resources/expected/borders/sub/1.txt +++ /dev/null @@ -1 +0,0 @@ -H0{H1{SUBH3{@}SUBF2}F1}F0 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/sub/1.x b/fmpp/src/test/resources/expected/borders/sub/1.x deleted file mode 100644 index 0c9ae8d..0000000 --- a/fmpp/src/test/resources/expected/borders/sub/1.x +++ /dev/null @@ -1,2 +0,0 @@ -H0{H1{SUBH3{@}SUBF2}F1}F0 ----X--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/sub/1.y b/fmpp/src/test/resources/expected/borders/sub/1.y deleted file mode 100644 index 86d1b4d..0000000 --- a/fmpp/src/test/resources/expected/borders/sub/1.y +++ /dev/null @@ -1,2 +0,0 @@ -H0{H1{SUBH3{@}SUBF2}F1}F0 ----Y--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/borders/sub/foo/1.txt b/fmpp/src/test/resources/expected/borders/sub/foo/1.txt deleted file mode 100644 index e775735..0000000 --- a/fmpp/src/test/resources/expected/borders/sub/foo/1.txt +++ /dev/null @@ -1 +0,0 @@ -H0{H1{SUBH3{@}SUBF2}F1}F0 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_base/index.html b/fmpp/src/test/resources/expected/cfg_base/index.html deleted file mode 100644 index 70f8cd2..0000000 --- a/fmpp/src/test/resources/expected/cfg_base/index.html +++ /dev/null @@ -1 +0,0 @@ -

        Rattrah \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_base/sub/rattrah.html b/fmpp/src/test/resources/expected/cfg_base/sub/rattrah.html deleted file mode 100644 index 7adb375..0000000 --- a/fmpp/src/test/resources/expected/cfg_base/sub/rattrah.html +++ /dev/null @@ -1 +0,0 @@ -

        Rattrah. \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_inheritance/1.txt b/fmpp/src/test/resources/expected/cfg_inheritance/1.txt deleted file mode 100644 index f0e2262..0000000 --- a/fmpp/src/test/resources/expected/cfg_inheritance/1.txt +++ /dev/null @@ -1,3 +0,0 @@ -HDR1 -1 -FTR \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_inheritance/2.txt b/fmpp/src/test/resources/expected/cfg_inheritance/2.txt deleted file mode 100644 index 4e356e7..0000000 --- a/fmpp/src/test/resources/expected/cfg_inheritance/2.txt +++ /dev/null @@ -1,3 +0,0 @@ -HDR2 -2 -FTR \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_inheritance/3.txt b/fmpp/src/test/resources/expected/cfg_inheritance/3.txt deleted file mode 100644 index 1535895..0000000 --- a/fmpp/src/test/resources/expected/cfg_inheritance/3.txt +++ /dev/null @@ -1,3 +0,0 @@ -HDR3 -3 -FTR \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_inheritance/4.txt b/fmpp/src/test/resources/expected/cfg_inheritance/4.txt deleted file mode 100644 index 1383e1a..0000000 --- a/fmpp/src/test/resources/expected/cfg_inheritance/4.txt +++ /dev/null @@ -1,3 +0,0 @@ -HDR3 -4 -FTR \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/cfg_inheritance/test.txt b/fmpp/src/test/resources/expected/cfg_inheritance/test.txt deleted file mode 100644 index 48b83b8..0000000 --- a/fmpp/src/test/resources/expected/cfg_inheritance/test.txt +++ /dev/null @@ -1 +0,0 @@ -ABC \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/dl_csv/test.html b/fmpp/src/test/resources/expected/dl_csv/test.html deleted file mode 100644 index 91fa691..0000000 --- a/fmpp/src/test/resources/expected/dl_csv/test.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -

        Header query and row hashes: - - -
        nameprotectedpriceenteredxy -
        arctic-terntrue10,000.00Jan 25, 2003 03:10:06 AMJan 20, 200112:05:00 PM -
        N/AN/AN/AN/AN/A -
        house-sparrowfalse50.00Feb 15, 2003 01:20:30 AMN/AN/A -
        moooN/AN/AN/AN/AN/A -
        N/AN/AN/AN/AN/A -
        mooo2N/AN/AN/AN/AN/A -
        - -

        Row sequences: - - -
        arctic-terntrue10,000.00Jan 25, 2003 03:10:06 AMJan 20, 200112:05:00 PM -
        N/AN/AN/AN/AN/A -
        house-sparrowfalse50.00Feb 15, 2003 01:20:30 AMN/AN/A -
        moooN/AN/AN/AN/AN/A -
        N/AN/AN/AN/AN/A -
        mooo2N/AN/AN/AN/AN/A -
        - -

        CSV2 headers replaced: - - -
        r1r2r3 -
        1.002.003.00 -
        4.005.00N/A -
        6.00N/AN/A -
        - -

        CSV2 headers added: - - -
        a1a2a3 -
        abc -
        123 -
        45N/A -
        6N/AN/A -
        - -

        CSV3 headers replaced: - - -
        r1r2r3 -
        - -

        CSV3 headers added: - - -
        a1a2a3 -
        abc -
        - -

        CSV4 headers replaced: - - -
        r1r2r3 -
        - -

        CSV4 headers added: - - -
        a1a2a3 -
        - -

        Header normalization: - - -
        nameprotectedprice_netenteredx_y_zy -
        arctic-terntrue10,000.00Jan 25, 2003 03:10:06 AMJan 20, 200112:05:00 PM -
        N/AN/AN/AN/AN/A -
        house-sparrowfalse50.00Feb 15, 2003 01:20:30 AMN/AN/A -
        moooN/AN/AN/AN/AN/A -
        N/AN/AN/AN/AN/A -
        mooo2N/AN/AN/AN/AN/A -
        - -

        UTF-8 BOM: - - -
        árvíztűrőfúrógép -
        1122 -
        - - - diff --git a/fmpp/src/test/resources/expected/dl_eval/test.txt b/fmpp/src/test/resources/expected/dl_eval/test.txt deleted file mode 100644 index 01dd2b9..0000000 --- a/fmpp/src/test/resources/expected/dl_eval/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -2 -2 -2 -2 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/dl_get/test.txt b/fmpp/src/test/resources/expected/dl_get/test.txt deleted file mode 100644 index 1f30c63..0000000 --- a/fmpp/src/test/resources/expected/dl_get/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -A -B -C -D \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/dl_json/explicit-traversal.html b/fmpp/src/test/resources/expected/dl_json/explicit-traversal.html deleted file mode 100644 index 29e844b..0000000 --- a/fmpp/src/test/resources/expected/dl_json/explicit-traversal.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameAgeSkillsTest resultsDecided
        - Jean Test - (m.n.: Jean Test) - 20 - HTML, - CSS - - a: 10.5, - b: 20.0, - c: 30.0 - - Y -
        - José Test - - 30 - Ruby, - C++, - Cuda - - a: 20.0, - b: 30.0, - c: 40.0 - - N -
        - - - diff --git a/fmpp/src/test/resources/expected/dl_json/visitor-traversal.html b/fmpp/src/test/resources/expected/dl_json/visitor-traversal.html deleted file mode 100644 index 4e244c2..0000000 --- a/fmpp/src/test/resources/expected/dl_json/visitor-traversal.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameAgeSkillsTest resultsDecided
        - Jean Test - (m.n.: Jean Test) - 20 - HTML, - CSS - - a: 10.5, - b: 20.0, - c: 30.0 - Y
        - José Test - - 30 - Ruby, - C++, - Cuda - - a: 20.0, - b: 30.0, - c: 40.0 - N
        - - - - diff --git a/fmpp/src/test/resources/expected/dl_slicedtext/test.txt b/fmpp/src/test/resources/expected/dl_slicedtext/test.txt deleted file mode 100644 index cb87903..0000000 --- a/fmpp/src/test/resources/expected/dl_slicedtext/test.txt +++ /dev/null @@ -1,174 +0,0 @@ - -[a ] -[ b] -[ c ] -== -[a] -[ b] -[ c ] - ---------- - -[a ] -[ b] -[ c ] -[] -== -[a] -[ b] -[ c ] -[] - -[a] -[b] -[c] -== -[a] -[b] -[c] - ---------- - -[a] -[b] -[c] -== -[a] -[b] -[c] - ---------- - -[--- - a - A ] -[b --- B ] -[ c ----] -== -[--- - a - A ] -[ b --- B ] -[ c ----] - -[--- - a - A ] -[b --- B ] -[ c ] -[] -== -[--- - a - A ] -[ b --- B ] -[ c ] -[] - -[--- - a - A ] -[b --- B ] -[ c ----x] -== -[--- - a - A ] -[ b --- B ] -[ c ----x] - -[a] -[ b] -[ c] -[ d ] -[e ] -== -[a] -[ b] -[ c] -[ d ] -[e ] -== -[a] -[ b] -[ c] -[ d ] -[e ] -== -[a] -[ b] -[ c] -[ d ] -[e ] - -[reg] -[green] -[blue] -== -[red] -[green] -[blue] - -[A a a -aaa -a] -[Separate items like this: ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: - ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: ---8<-- - -But don't forget to put empty lines around it!] -[C c c -ccc -c] -== -[A a a -aaa -a] -[Separate items like this: ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: - ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: ---8<-- - -But don't forget to put empty lines around it!] -[C c c -ccc -c] - -[a] -[b] -[] -[] -[] -[c] -== -[a] -[b] -[] -[] -[] -[c] - -== - -[] -== -[] \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/dl_text/test.txt b/fmpp/src/test/resources/expected/dl_text/test.txt deleted file mode 100644 index d263d1b..0000000 --- a/fmpp/src/test/resources/expected/dl_text/test.txt +++ /dev/null @@ -1,8 +0,0 @@ -[bla1 -bla2 -bla3 -] -[bla1 -bla2 -bla3 -] \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/encoding/test.txt b/fmpp/src/test/resources/expected/encoding/test.txt deleted file mode 100644 index f8a1577..0000000 --- a/fmpp/src/test/resources/expected/encoding/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -UTF-8 áő - diff --git a/fmpp/src/test/resources/expected/encoding/test2.txt b/fmpp/src/test/resources/expected/encoding/test2.txt deleted file mode 100644 index a495b16..0000000 --- a/fmpp/src/test/resources/expected/encoding/test2.txt +++ /dev/null @@ -1,2 +0,0 @@ -ISO-8859-2 áõ -ISO-8859-2 áõ \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/encoding/test2_iso-8859-1.txt b/fmpp/src/test/resources/expected/encoding/test2_iso-8859-1.txt deleted file mode 100644 index 2e024f3..0000000 --- a/fmpp/src/test/resources/expected/encoding/test2_iso-8859-1.txt +++ /dev/null @@ -1 +0,0 @@ -ISO-8859-1 á? diff --git a/fmpp/src/test/resources/expected/encoding/text_UTF-8_2.txt b/fmpp/src/test/resources/expected/encoding/text_UTF-8_2.txt deleted file mode 100644 index 96cef21..0000000 --- a/fmpp/src/test/resources/expected/encoding/text_UTF-8_2.txt +++ /dev/null @@ -1,3 +0,0 @@ -UTF-8 áő -áő -áő diff --git a/fmpp/src/test/resources/expected/encoding/text_iso-8859-2.txt b/fmpp/src/test/resources/expected/encoding/text_iso-8859-2.txt deleted file mode 100644 index c5d8d14..0000000 --- a/fmpp/src/test/resources/expected/encoding/text_iso-8859-2.txt +++ /dev/null @@ -1,2 +0,0 @@ -ISO-8859-2 áõ - diff --git a/fmpp/src/test/resources/expected/encoding/text_utf-16.txt b/fmpp/src/test/resources/expected/encoding/text_utf-16.txt deleted file mode 100644 index fab18a5f763cbce5dc84ca8e1e0a2f77ac027b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20 bcmezOpCObXgu#tLm%)(1j6s3nA!8r_J+K7S diff --git a/fmpp/src/test/resources/expected/ex_border/test.c.html b/fmpp/src/test/resources/expected/ex_border/test.c.html deleted file mode 100644 index a092440..0000000 --- a/fmpp/src/test/resources/expected/ex_border/test.c.html +++ /dev/null @@ -1,25 +0,0 @@ -

        #include <string.h>
        -#include "futil_i.h"
        -
        -zxz_ec_t
        -zxz_f_child_path_can_match(zxz_bool_t *pbMatches,
        -        const char *sPath, const char *sPattern)
        -{
        -    zxz_ec_t ec;
        -    int i;
        -    char *sNew = NULL;
        -
        -    i = strlen(sPath);
        -    if (i != 0 && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR_CHR
        -            && sPath[i-1] != ZXZ_CFGM_PATH_SEPARATOR2_CHR) {
        -        sNew = malloc(i+2);  /* <-- +sNew  */
        -        strcpy(sNew, sPath);
        -        sNew[i] = ZXZ_CFGM_PATH_SEPARATOR_CHR;
        -        sNew[i+1] = '\0';
        -        sPath = sNew;
        -    }
        -    ec = zxz_f_path_matches_ex(pbMatches, sPath, sPattern, FALSE, 1);
        -    free(sNew);  /* <-- -sNew  */
        -    return ec;
        -}
        -
        \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_border/test.html b/fmpp/src/test/resources/expected/ex_border/test.html deleted file mode 100644 index 6484820..0000000 --- a/fmpp/src/test/resources/expected/ex_border/test.html +++ /dev/null @@ -1,3 +0,0 @@ -Hello -

        a < b & c -

        A C program \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_capture/test.html b/fmpp/src/test/resources/expected/ex_capture/test.html deleted file mode 100644 index 76b9f0d..0000000 --- a/fmpp/src/test/resources/expected/ex_capture/test.html +++ /dev/null @@ -1,111 +0,0 @@ - Contents: -

        -
        - - -

        Foo

        - - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - - -

        Bar

        - - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - - -

        Baaz

        - - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - -

        Blah blah blah blah blah blah blah blah blah blah blah blah -blah blah blah blah blah blah blah blah blah - - diff --git a/fmpp/src/test/resources/expected/ex_check_links/good_target.html b/fmpp/src/test/resources/expected/ex_check_links/good_target.html deleted file mode 100644 index 2f9031f..0000000 --- a/fmpp/src/test/resources/expected/ex_check_links/good_target.html +++ /dev/null @@ -1 +0,0 @@ -Hi! \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_check_links/index.html b/fmpp/src/test/resources/expected/ex_check_links/index.html deleted file mode 100644 index 6a9a183..0000000 --- a/fmpp/src/test/resources/expected/ex_check_links/index.html +++ /dev/null @@ -1,2 +0,0 @@ -

        Working link -

        Broken link \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_csv/test.html b/fmpp/src/test/resources/expected/ex_csv/test.html deleted file mode 100644 index cda725d..0000000 --- a/fmpp/src/test/resources/expected/ex_csv/test.html +++ /dev/null @@ -1,7 +0,0 @@ - -
        nameprotectedpriceentered -
        arctic-terntrue10,000.00Jan 25, 2003 03:10:06 AM -
        house-sparrowfalse50.00Feb 15, 2003 01:20:30 PM -
        hoachimtrueN/AN/A -
        sakerettrue200,000.00Dec 18, 2002 08:45:00 PM -
        \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_img_dims/falcon.png b/fmpp/src/test/resources/expected/ex_img_dims/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 calcualted: -Falcon -

        Width calculated: -Falcon - -

        Height calculated: -Falcon -

        Nothing calculated: -Falcon \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/index.html b/fmpp/src/test/resources/expected/ex_local_data/index.html deleted file mode 100644 index a8e9ff3..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - -

        Test

        -

        Other pages: -

        - -

        Here it is the config file used: -
        -
        sourceRoot: src
        -outputRoot: out
        -logFile: log.fmpp
        -
        -modes: ignore(**/*.bsh)
        -
        -data: {
        -    bgColor: green
        -    author: Anonymous
        -}
        -
        -localData: [
        -    # Run the attached BeanShell script for HTML-s, if there is one available.
        -    case(**/*.htm, **/*.html, bsh({ignoreMissing}))
        -    
        -    # Independently of the above,
        -    # set "bgColor" to "yellow" when processing the files of the "sub" folder:
        -    # except for the files in "sun/sky/**", where use "blue".
        -    # But, never override the "bgColor" if the file name starts with "foo"
        -    layer()
        -    case(**/foo*, {})
        -    case(sub/sky/**, {bgColor: blue})
        -    case(sub/**, sub2/**, {bgColor: yellow})
        -    
        -    # Independently of all above, set the "author"...
        -    layer()
        -    case(**/*_j.*, {author: Joe})
        -    case(**/*_a.*, {author: Amy})
        -]
        -
        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/1.html b/fmpp/src/test/resources/expected/ex_local_data/sub/1.html deleted file mode 100644 index e1ed4ce..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/1.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

        1

        -

        Author: Anonymous -

        x: Just for test: Anonymous -

        y: Blah for 1... - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/2.html b/fmpp/src/test/resources/expected/ex_local_data/sub/2.html deleted file mode 100644 index 61382dc..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        2

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/3_j.html b/fmpp/src/test/resources/expected/ex_local_data/sub/3_j.html deleted file mode 100644 index 8f71d3b..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/3_j.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

        3_j

        -

        Author: Joe -

        x: Just for test: Joe -

        y: Blah for 3_j... - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/food.html b/fmpp/src/test/resources/expected/ex_local_data/sub/food.html deleted file mode 100644 index 8345052..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/food.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        Food

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/1.html b/fmpp/src/test/resources/expected/ex_local_data/sub/sky/1.html deleted file mode 100644 index 5fc1f99..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        1

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/2.html b/fmpp/src/test/resources/expected/ex_local_data/sub/sky/2.html deleted file mode 100644 index 00fd5bc..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        2

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/3_a.html b/fmpp/src/test/resources/expected/ex_local_data/sub/sky/3_a.html deleted file mode 100644 index 5e0e130..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/sky/3_a.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        3_a

        -

        Author: Amy - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/1.html b/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/1.html deleted file mode 100644 index e192f3f..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        1

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/2.html b/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/2.html deleted file mode 100644 index 61382dc..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub/subsub/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        2

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub2/1.html b/fmpp/src/test/resources/expected/ex_local_data/sub2/1.html deleted file mode 100644 index e192f3f..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub2/1.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        1

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_local_data/sub2/2.html b/fmpp/src/test/resources/expected/ex_local_data/sub2/2.html deleted file mode 100644 index 61382dc..0000000 --- a/fmpp/src/test/resources/expected/ex_local_data/sub2/2.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

        2

        -

        Author: Anonymous - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result1.html b/fmpp/src/test/resources/expected/ex_multipage_list/result1.html deleted file mode 100644 index 477de4e..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - Results - page 1 of 6 - - -

        Results

        - -

        1. Qweqwe: http://qweqwe.com -

        2. Asdasd: http://asdasd.com -

        3. Cvbcvbcv: http://cvbcvbcvb.com -

        4. Iopiopi: http://iopiopo.com -

        5. Bmbnmbm: http://bnmnbmb.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result2.html b/fmpp/src/test/resources/expected/ex_multipage_list/result2.html deleted file mode 100644 index 2f75ffd..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - Results - page 2 of 6 - - -

        Results

        - -

        6. Uiouioui: http://uiouiouio.com -

        7. Bvnbvnbv: http://bvnbvnbvnbv.com -

        8. Hghjghjghjg: http://hghjghjghjg.com -

        9. Werwer: http://werwerr.com -

        10. Mnmbnbm: http://mbnmbnmb.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result3.html b/fmpp/src/test/resources/expected/ex_multipage_list/result3.html deleted file mode 100644 index dea7b99..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result3.html +++ /dev/null @@ -1,31 +0,0 @@ - - - Results - page 3 of 6 - - -

        Results

        - -

        11. Gfhfghgfgfh: http://fghgfhgfhg.com -

        12. Asdasas: http://asdasdasd.com -

        13. Yuuiyiyu: http://yuiyuiyui.com -

        14. Rtytryytr: http://rttryytr.com -

        15. Kjhkjhk: http://khjkhjkhjk.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result4.html b/fmpp/src/test/resources/expected/ex_multipage_list/result4.html deleted file mode 100644 index 93613d0..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result4.html +++ /dev/null @@ -1,31 +0,0 @@ - - - Results - page 4 of 6 - - -

        Results

        - -

        16. Rrrrr: http://rrrrr.com -

        17. Ddfdgfgf: http://ddffdg.com -

        18. Jhjhhgjh: http://jghjjhj.com -

        19. Zzzzzzzz: http://zzzzzzzz.com -

        20. Zxzxxzzx: http://zzxzxzxzx.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result5.html b/fmpp/src/test/resources/expected/ex_multipage_list/result5.html deleted file mode 100644 index 49af391..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result5.html +++ /dev/null @@ -1,31 +0,0 @@ - - - Results - page 5 of 6 - - -

        Results

        - -

        21. Cvvcvvcv: http://ccvvcvcvcv.com -

        22. Bnvvbnvb: http://vbnvbnnvbnb.com -

        23. Asdsadasd: http://asdasdasd.com -

        24. Vvvvvv: http://vvvvvvv.com -

        25. Ssssss: http://sssss.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - diff --git a/fmpp/src/test/resources/expected/ex_multipage_list/result6.html b/fmpp/src/test/resources/expected/ex_multipage_list/result6.html deleted file mode 100644 index e937850..0000000 --- a/fmpp/src/test/resources/expected/ex_multipage_list/result6.html +++ /dev/null @@ -1,32 +0,0 @@ - - - Results - page 6 of 6 - - -

        Results

        - -

        26. Qqqqqqq: http://qqqqqq.com -

        27. Xxxxxxx: http://xxxxx.com -

        28. Vvvvv: http://vvvvv.com -

        29. Aaaaaaa: http://aaaaaaaa.com - -


        - Pages:   - <<  - 1 - | - 2 - | - 3 - | - 4 - | - 5 - | - 6 - -  >> - - - - diff --git a/fmpp/src/test/resources/expected/ex_qtour_step1/falcon.png b/fmpp/src/test/resources/expected/ex_qtour_step1/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

        Index

        -

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step1/subdir/something.html b/fmpp/src/test/resources/expected/ex_qtour_step1/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step1/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

        Something else

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step2/falcon.png b/fmpp/src/test/resources/expected/ex_qtour_step2/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - Index - - -

        Index

        -

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step2/subdir/something.html b/fmpp/src/test/resources/expected/ex_qtour_step2/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step2/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

        Something else

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step3/falcon.png b/fmpp/src/test/resources/expected/ex_qtour_step3/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 zcmV-f6Q=BmP)^VKz80DJCu>AQ}-A7(zfWdSqUjkbsJYZ@R*Q%)G9y zmWeGNAAxLcG$<}rQcO%gKQT2ib9#ZLwY@w(LqbYVc6m}FBQ0oENiQxQQfN_3Qa>p( zFD^JlU3OE~M5w%7m912dpG?R6BGLc=5*A5B zK~#9!U0DfxqD-@GKpG9=pwNI2*O-V~LdGSTtj_=cQ{Oq&WZwJSiVGU;)3u$dYSrd& zIBpi{PZ-jn-WJ z>5CtrL9f;btuem7WbYs1rjJh%3t}%sm)0HD8Sk=V+!dZ6@_^TPpX+m(cJb@C`1fiJ zMAgJ>*UxXOoP6Z_`X7e%^~a}pg91&S+KX1i6d&^CU;jnU|M9N4r(N*JIec~fXjc#z z3u52;XhGnne-Q27zCZtqPiqyck9EvdRuZlL(h=f`Co$8{$^v2cuhur62ttp-6Ibif z>%S<)`eOJ`M(7n=eEN_zpbA#QZm#n3>7Os&+x5A70YMV9_WH8^<|lr%`6bo{f;Aa( z4Icj$|HyC{0pr)__fJNA{1c1uw0;zyY}OV~0-%MF++|>XTE~mX>c8S4{^Hn$ctaO& zFxO$c>-AH-@Y(wQ=_k6VfS8N7^=9*vh3_Aq?Xpnhv&H!3##qw@2KFD}K8!rijeuw^ zX?OJb**aVT^+(ipE6KR|Pac1=K=dHU=f|hp+Q%ct&`YAk6PUzO za@lU{bqjJhv?%|Akve?}f(rm5Kn>R&y1+>iuPBOyFmMe$_Wdu81!ess>T)?YB;Xnx zd^`f>V9h3>@J^kGfIZ_zp{2OEuYF(czV9U7ko)=k=M0O2zG3z9j|_xPHRhAfYB$aoQKBBz>)nQVJ#;+}_@D^S8p}x7N@5{SHg2S9rcTT~5ue zu6N=besX){^V9u(97k9OW=RI{1_F4{hjGlC%1J? z6V>&8-yC0G&&_Txjt2slKM{!_HT*)&c80d{`qM1!L2hn(X`W`rcu}PBqmvpbWPrV`+mPBdr{n3=G*}moKUg~nQVoHJ0J3;l#rHt*`f2Z`RMqn4=Fju<^WC3G zH!UkuQYxdWstnCwFc|i;DPW?N7JcT`re`APSXbm@x?ZQ$|7!zidGp_4agrxitHF z*Fcko2(T8FIBW^w#4W~sJnj@7fV};=`BOeWZ=EqvCRV6Xo{Kt}Ny8{v4C4g) z)OEY$p80qSJ#-$%Z*N$h zYC!UwATU~`t2{8-Vqv0zI7KLae>gCB7YYvFA+Dgpe0M(2AAVayEvx(A)I(S5x%2RL zN02{&dw5{nmiZkqQlt)W0M_l6#!PjVB;j;XGwaEa`@Mkd00QIfaRrdw+#d^wJdELS zrK)G>!tlD82nOQ0Dxtu#o8phUv={=KP*nvY*e3F+59@ z-?%}OXE4|E+gtJWTp_j~Z*R}g!wT(nw`?!+CGKS!A}_O=DQRo%5qWHWe*i~U+3ZQs(mv@;Y*uG7cJEB-rWr8%SbXW5_u00 z2kX2c8Cn@*T@;hIw+i`C-901ouw&*3cFtvObmb`o*MT-!&@F=yu1A@LZw{=5dtqT{ zbh^9(1p6)To)NV_C=UdAdsEM)M3byYDFexN@}ykIyMWK~42lNfw%L=6Q856vrccPh zVzmVlc-gHGv@}1FkRosjq>>;)V!%YmJyn5;wNSBA89)N@zl1ezw{1Q`4<@}rA!&$l zJ|E97_}FCmti%BYu*N_k0vNYqN{~lN)X6D|ASPP>>q|hgSW1pdN<2KEMJbqzlWxxXf$bX-IyKOP2qjIUa#hMvaDGmnNmH=F zXf|84su1R+V7${SF<)O7VQ-R`%j(T39ET5u(?NnW;9$nmR9Uvr$-qm9f_4IR7~PVl z#r!I_nUV|T%);sRB5pyUKOPnOMqs?~{u1_jVLn*~<$`gro3B=mtMW+~=|~;(YN32# zK^At;9S#QGpzmqrE7O{5S>^zl^#Z-!qBq&HA~stkh4FMI#>=ADTR?Dym*+VsbMEMT z)I(LAOnQ@vLUs2da7QxDR1&%Dz0tHLg;yv6St3c&bTsPq;Cgnyr^^|SN>Y6XKE41X z=q+};7b~`T0XgTr9uU|{++dl|L9;!KT}OG*fE^iHy}tI1CCYq>W+NRQQ04p*P${C&hC3nW`GO#n9z9bUO%zN(E(est_Xk54ePmT) zea{aW!js8t2G_q{z`Gzxby&mn3kx$}K_jsheR7hXi3I?DX;B0wM{k9lK*VBnZ>gM!v#A6A zs^pddCHBfu4kAW`rQrZgD`vL?i`JU^2Mmmd>1W$ul0fap-|4W~i@WHWl`{_rLsjx1 z$PH4wqPYsdRNw-<4*UqMK{u#?(aphMgIb1%{a&H{-fU`;B{;bT!<-}z_9squP_;RW z{~br8nVisSIUts%Kwy=nAAwOyVNFx!rSGY{SB|=QFYN~5U|SR7a8P@yRCAU)a8cHn zz5SP%lidxRH5hO>$a(@Z=>`5`fl(oHz?Wz?P)$m7`5EfG290)mc@LaCGYe@^nw?@{ zvD7bZ>J|eeF>GM4+1T$fVGQ~lw{(Tzq%z%!=GF^0(m|>4eo4m|60!kN_JVG@$ii^3 zoA2pbC9J}pqB*vLq73+2+CS)WSU=rjYEKFdx;a6hiOMwi-Bg9^7D{=ZZ%h$ke1vDx zpxaAlNZD|@sOxu|3q>GVxiSstvw5P%Sz>6?da}`l#VpO2Ztnf?t zMxn2Ff#B<+fHHvuSDnT!fji=J8dC%R;a~uh+Xcia@;u0#*!0vJB9g zW|dRqUG3?zL~=qS4b(ErOqPxUBy51Hg19+13XKY=k_`(yfp7+^yu6-Q94uQ5@O=~y zy~uGfW>XcSEYX#q=;{Ihu2%u2KwV)^oaqpJpJ$n8!Vs-JL0-gAoKCPNrf#XlE8Aic zW3yiPnC!qGgRf@(R7H<5VS8$x%~)fqqE~ zNV7*vWEuF<$iXcWaW4%yBYCHtPAAX2d)MKylPeap7!ziAfx9VzQaXMaV3t?N{VWZz z5%d>^PLYIAGWs$G7)sdq4+wcnql++sap6@L7;fRkZlo+qS>*<{GHf+eQ28Ji&`Sjk z;E--_S%#?zQB-I!3_<(7ZH2cq*Fm0SOh)ZSLxeE#qA{ccW^%{l!mIL>B?Ik|j|>k` zko_ed5qv7h18IyRA@Y}GsZkr@SrOm z!)!W5MF*=Rco&YzE6`Yghfb$}@t{XQkX{~)Mz9x3)n2u~I5bB%dP`IBwA*ob*5RX9 zEluA;J?i*{ANgYxCRd}rYh+=h5z)}nWbBAd(Gl8*&)E*MYz66TiF~YAYek6Tc2nB{ zUQBh1FN60Wold2bqB90PIX(->xD%^*>@slSsK~2OyTD@TPfdZ21+y2FK+@xBl%})p zY_Ypu>u6ajOQve z4W(C9!-eD|5~A=!na^y~&8}c8_-yuTd}x5&Mz)SzUg3Sg+@$9K;nq^%x8mk#b$9 z@@49Fil}nqNL+#qAS;YhEd%TZ?Khf)Rm4^C>||0Zi%}Z``R_ebCw|C4xmf{`bvWl`z1JLVgV-I9{iJs z=xWvB=hvnU+PsB$n>m7l-XD0=j5JY3ag1Kh?ZhrBZj5wP=pPC&Jxjb{0j@YW$aIr; zr9Sr<#3SQI3&$P&_+*1boL801W)*l&XPEtU7NpPv-i}cgQB~YhkK=Ldg4i7otr7O1 zK=mch56I44o*xio0-ul40Z;ewJ=HQ*J=Zd4DrWB@TSWaSyqRU0qdSZ!f*=)3HRb`8 zkA~69W&jDY5V^;p)DDc@k(D$br95+uU482+G9iV7pdg^(z$`e#2m)(mXsA0#ZMW0$ zF-WRP$*EyfmL3|F0E7-@W$vBWx(pd1?-2(PWJy2E ziU{@_D=@uVA?s0;c>D=_f#-+5oOfE@rMoRguQ!{8uyxkW6S&fKRX`VO0iYIa1E@)6 zre+#t*o$AH$*sU!9)bul<;O93U)_O&$C8B$f=ouzi`$+&Me_)2V(dbWX*bD9wpu(< z3|*DN0DwWif$SRgF&BW2hDiohQ~UmUKkBS zWq+bjhK|)i4qd2DmL)@;lqYHGyC$gg5Ur>IooJSp@i<~7^guIU0iDlywqkLR>S>D7 z6<`1_^JV6TA)-q>0-ADNA0ssWACzI3h9*qnVG@~906u3@W53ExJP;)6V+?NArNUQ? z@40AwvMfxc=T8|nWxl|e#0t<$(cZg?;vp&rJo7gn$M}z*a zcsNRu)cDBA+;~YAgebt67G2W;5p!{ - - Index - - -

        Index

        -

        Birds: -

          -
        • Arctic-tern: Flies very long distances all years. - Favorite food: sardine -
        • House-sparrow: Don't you say you don't know it... - Favorite food: sunflower -
        • Sakeret: Great hunter of the sky. - Favorite food: pigeon -
        -
        -

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step3/subdir/something.html b/fmpp/src/test/resources/expected/ex_qtour_step3/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step3/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

        Something else

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step4/arctic-tern.html b/fmpp/src/test/resources/expected/ex_qtour_step4/arctic-tern.html deleted file mode 100644 index bccb61a..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step4/arctic-tern.html +++ /dev/null @@ -1,12 +0,0 @@ - - - Arctic-tern - - -

        Arctic-tern

        - -

        Flies very long distances all years.

        - -

        Favorite food: sardine

        - - diff --git a/fmpp/src/test/resources/expected/ex_qtour_step4/falcon.png b/fmpp/src/test/resources/expected/ex_qtour_step4/falcon.png deleted file mode 100644 index fec524371fc48d985af99aaded1b14b0688f2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 - - House-sparrow - - -

        House-sparrow

        - -

        Don't you say you don't know it...

        - -

        Favorite food: sunflower

        - - diff --git a/fmpp/src/test/resources/expected/ex_qtour_step4/index.html b/fmpp/src/test/resources/expected/ex_qtour_step4/index.html deleted file mode 100644 index b87e8d0..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step4/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - Index - - -

        Index

        -

        Birds: -

        -
        -

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_qtour_step4/sakeret.html b/fmpp/src/test/resources/expected/ex_qtour_step4/sakeret.html deleted file mode 100644 index c4559c2..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step4/sakeret.html +++ /dev/null @@ -1,12 +0,0 @@ - - - Sakeret - - -

        Sakeret

        - -

        Great hunter of the sky.

        - -

        Favorite food: pigeon

        - - diff --git a/fmpp/src/test/resources/expected/ex_qtour_step4/subdir/something.html b/fmpp/src/test/resources/expected/ex_qtour_step4/subdir/something.html deleted file mode 100644 index fd4daec..0000000 --- a/fmpp/src/test/resources/expected/ex_qtour_step4/subdir/something.html +++ /dev/null @@ -1,8 +0,0 @@ - - - Something else - - -

        Something else

        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_session/01_foo.html b/fmpp/src/test/resources/expected/ex_session/01_foo.html deleted file mode 100644 index d68b5ad..0000000 --- a/fmpp/src/test/resources/expected/ex_session/01_foo.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Foo - - -

        Foo

        - -

        Blah blah blah - - diff --git a/fmpp/src/test/resources/expected/ex_session/02_bar.html b/fmpp/src/test/resources/expected/ex_session/02_bar.html deleted file mode 100644 index 53f43a5..0000000 --- a/fmpp/src/test/resources/expected/ex_session/02_bar.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Bar - - -

        Bar

        - -

        Blah blah blah - - diff --git a/fmpp/src/test/resources/expected/ex_session/03_baaz.html b/fmpp/src/test/resources/expected/ex_session/03_baaz.html deleted file mode 100644 index 1d7f074..0000000 --- a/fmpp/src/test/resources/expected/ex_session/03_baaz.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Baaz - - -

        Baaz

        - -

        Blah blah blah - - diff --git a/fmpp/src/test/resources/expected/ex_session/04_wombat.html b/fmpp/src/test/resources/expected/ex_session/04_wombat.html deleted file mode 100644 index 8c25b0a..0000000 --- a/fmpp/src/test/resources/expected/ex_session/04_wombat.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Wombat - - -

        Wombat

        - -

        Blah blah blah - - diff --git a/fmpp/src/test/resources/expected/ex_session/index.html b/fmpp/src/test/resources/expected/ex_session/index.html deleted file mode 100644 index 0ec490c..0000000 --- a/fmpp/src/test/resources/expected/ex_session/index.html +++ /dev/null @@ -1,12 +0,0 @@ - -Index - -

        Index

        - - - diff --git a/fmpp/src/test/resources/expected/ex_tdd/index.html b/fmpp/src/test/resources/expected/ex_tdd/index.html deleted file mode 100644 index 6dda2ff..0000000 --- a/fmpp/src/test/resources/expected/ex_tdd/index.html +++ /dev/null @@ -1,10 +0,0 @@ -

        Hello Big Joe!

        - -

        Our offers: -

          -
        • White mouse for 30 credits -
        • Black mouse for 25 credits -
        • Green mouse for 150 credits -
        - -

        Note that we know that you are tall, Big Joe.

        \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_xml/test.html b/fmpp/src/test/resources/expected/ex_xml/test.html deleted file mode 100644 index 24240e8..0000000 --- a/fmpp/src/test/resources/expected/ex_xml/test.html +++ /dev/null @@ -1,10 +0,0 @@ -

        The XML Test

        -

        Preface

        -

        Preface blah blah...

        -

        And preface blah blah...

        -

        Blah

        -

        Blah blah blah...

        -

        And blah blah blah...

        -

        Foo

        -

        Foo blah blah...

        -

        And foo blah blah...

        diff --git a/fmpp/src/test/resources/expected/ex_xml2/index.html b/fmpp/src/test/resources/expected/ex_xml2/index.html deleted file mode 100644 index 87bb006..0000000 --- a/fmpp/src/test/resources/expected/ex_xml2/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - Product Catalog - - - -

        Product Catalog

        - -

        The available products are: - -

        - - diff --git a/fmpp/src/test/resources/expected/ex_xml2/product_1.html b/fmpp/src/test/resources/expected/ex_xml2/product_1.html deleted file mode 100644 index 74e2de5..0000000 --- a/fmpp/src/test/resources/expected/ex_xml2/product_1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - K8 Widget - - - -

        K8 Widget

        - -

        Price: $500 - -

        Description: -
        This is a standard widget with highly durable thingamy. -

        - -

        Manufacturer: -
        Name: Foo Incorporated -
        Address: 3 Traktor Road, Budapest, 1234, Hungary -
        Phone: 45-456-7461 -
        Homepage: http://www.foo.hu/ - - -


        -Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml2/product_2.html b/fmpp/src/test/resources/expected/ex_xml2/product_2.html deleted file mode 100644 index 6109985..0000000 --- a/fmpp/src/test/resources/expected/ex_xml2/product_2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - Giant/S2 Widget - - - -

        Giant/S2 Widget

        - -

        Price: $2500 - -

        Description: -
        This is an extra-large widget. -

        - -

        Manufacturer: -
        Name: Acmee Incorporated -
        Address: 5 Kili Street, Tarawa, Kiribati - -
        Homepage: http://www.acmee.com/ -
        Email: bounche@acmee.com - -


        -Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml2/product_3.html b/fmpp/src/test/resources/expected/ex_xml2/product_3.html deleted file mode 100644 index 3c4130b..0000000 --- a/fmpp/src/test/resources/expected/ex_xml2/product_3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - Micro Widget - - - -

        Micro Widget

        - -

        Price: $800 - -

        Description: -
        This widget can even fit into your suitcase. -

        - -

        Manufacturer: -
        Name: Acmee Incorporated -
        Address: 5 Kili Street, Tarawa, Kiribati - -
        Homepage: http://www.acmee.com/ -
        Email: bounche@acmee.com - -


        -Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml2/product_4.html b/fmpp/src/test/resources/expected/ex_xml2/product_4.html deleted file mode 100644 index bc6bd65..0000000 --- a/fmpp/src/test/resources/expected/ex_xml2/product_4.html +++ /dev/null @@ -1,25 +0,0 @@ - - - CXC Widget - - - -

        CXC Widget

        - -

        Price: $350 - -

        Description: -
        I have no idea... this is just a stupid example, OK? -

        - -

        Manufacturer: -
        Name: Batman International -
        Address: 77 Cash Square, Palo Alto, California 94531, U.S.A -
        Phone: 07-798-456-985 -
        Homepage: http://www.batmaninternational.com/ -
        Email: devnul@batmaninternational.com - -


        -Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/bigwidget.html b/fmpp/src/test/resources/expected/ex_xml_rendering/bigwidget.html deleted file mode 100644 index cb026df..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/bigwidget.html +++ /dev/null @@ -1,16 +0,0 @@ - - - Product: Big widget - - -

        Big widget

        -

        Price: only $15 -

        Description:
        - - This is an extra large widget, manufactured with a technology - developed by the NASA. - -


        - Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_1.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_1.html deleted file mode 100644 index e9f9e4f..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - An example chapter - - -Prev | -Up | - Next - | - ToC | Home -
        -

        An example chapter

        - -

        A paragraph with emphasized and marked sections.

        - - -
        A quotation with emphasized and marked sections.
        - - -

        A emphasized section with a marked section in it.

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_2.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_2.html deleted file mode 100644 index 84fb50c..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_2_2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - Another example chapter - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Another example chapter

        - -

        Blah...

        - -

        Blah blah...

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_1.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_1.html deleted file mode 100644 index ca4a593..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - Yet another example chapter - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Yet another example chapter

        - -

        Blah blah blah...

        - -

        Blah blah blah blah...

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_2.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_2.html deleted file mode 100644 index be9a144..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - And... yet another example chapter - - -Prev | -Up | - Next - | - ToC | Home -
        -

        And... yet another example chapter

        - -

        Blah blah blah blah blah...

        - -

        Blah blah blah blah blah blah...

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_3.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_3.html deleted file mode 100644 index e019569..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_chapter_3_3.html +++ /dev/null @@ -1,23 +0,0 @@ - - - The last example chapter - - -Prev | -Up | -Next | - ToC | Home -
        -

        The last example chapter

        - -

        Blah blah blah blah blah blah blah...

        - -

        Blah blah blah blah blah blah blah blah...

        - -
        -Prev | -Up | -Next | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_index.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_index.html deleted file mode 100644 index 5fa723d..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - Example 1 - - - Prev | Up | Next | ToC | Home -
        -

        Example 1

        -

        Table of Contents

        - - - - - - -
        - Prev | Up | Next | ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_1.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_1.html deleted file mode 100644 index 0fdc3f0..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - Preface - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Preface

        - -

        This is an example "book" that demonstrates FreeMarker and FMPP.

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_2.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_2.html deleted file mode 100644 index 6ff6fb6..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_2.html +++ /dev/null @@ -1,29 +0,0 @@ - - - An Example Part - - -Prev | -Up | - Next - | - ToC | Home -
        -

        An Example Part

        -

        Part Contents

        - - - - - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_3.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_3.html deleted file mode 100644 index 6aac3e2..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example1_part_3.html +++ /dev/null @@ -1,32 +0,0 @@ - - - Another Example Part - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Another Example Part

        -

        Part Contents

        - - - - - - - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_chapter_2_1.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example2_chapter_2_1.html deleted file mode 100644 index 0bbe1db..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_chapter_2_1.html +++ /dev/null @@ -1,21 +0,0 @@ - - - Blah blah - - -Prev | -Up | -Next | - ToC | Home -
        -

        Blah blah

        - -

        So you have seen that you can have more books...

        - -
        -Prev | -Up | -Next | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_index.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example2_index.html deleted file mode 100644 index 47e5fdd..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Example 2 - - - Prev | Up | Next | ToC | Home -
        -

        Example 2

        -

        Table of Contents

        - - - - - -
        - Prev | Up | Next | ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_1.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_1.html deleted file mode 100644 index 298e5f6..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - Preface - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Preface

        - -

        Yet another example book.

        - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_2.html b/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_2.html deleted file mode 100644 index f759373..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/example2_part_2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - Blah - - -Prev | -Up | - Next - | - ToC | Home -
        -

        Blah

        -

        Part Contents

        - - - -
        -Prev | -Up | - Next - | - ToC | Home - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/index.html b/fmpp/src/test/resources/expected/ex_xml_rendering/index.html deleted file mode 100644 index 8154588..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - XML rendering example - - -

        XML rendering example

        -

        The "books": -

        -

        The "products": -

        - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/normalwidget.html b/fmpp/src/test/resources/expected/ex_xml_rendering/normalwidget.html deleted file mode 100644 index 02281f8..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/normalwidget.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Product: Normal widget - - -

        Normal widget

        -

        Price: only $5 -

        Description:
        - - This is a standard widget, with great quality pink painting. - -


        - Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml_rendering/smallwidget.html b/fmpp/src/test/resources/expected/ex_xml_rendering/smallwidget.html deleted file mode 100644 index 57e42f0..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_rendering/smallwidget.html +++ /dev/null @@ -1,16 +0,0 @@ - - - Product: Small widget - - -

        Small widget

        -

        Price: only $10 -

        Description:
        - - Always wanted a small widget, but never found it? - Now, then this one is for You! - -


        - Back... - - diff --git a/fmpp/src/test/resources/expected/ex_xml_validating/test.txt b/fmpp/src/test/resources/expected/ex_xml_validating/test.txt deleted file mode 100644 index ba658a1..0000000 --- a/fmpp/src/test/resources/expected/ex_xml_validating/test.txt +++ /dev/null @@ -1,12 +0,0 @@ - -Title: -Test - -Paragraphs: -- p1 -- p2 -- p3 - -Paragraphs where class is "foo": -- p1 -- p3 diff --git a/fmpp/src/test/resources/expected/filename/a b/fmpp/src/test/resources/expected/filename/a deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/a +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/a.foo b/fmpp/src/test/resources/expected/filename/a.foo deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/a.foo +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/a.foo.bar b/fmpp/src/test/resources/expected/filename/a.foo.bar deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/a.foo.bar +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/bt b/fmpp/src/test/resources/expected/filename/bt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/bt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/bt.x b/fmpp/src/test/resources/expected/filename/bt.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/bt.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/c b/fmpp/src/test/resources/expected/filename/c deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/c +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/c.x b/fmpp/src/test/resources/expected/filename/c.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/c.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/d b/fmpp/src/test/resources/expected/filename/d deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/d +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/d.pok b/fmpp/src/test/resources/expected/filename/d.pok deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/d.pok +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/e b/fmpp/src/test/resources/expected/filename/e deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/e +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/f1.wq b/fmpp/src/test/resources/expected/filename/f1.wq deleted file mode 100644 index 81f4282..0000000 --- a/fmpp/src/test/resources/expected/filename/f1.wq +++ /dev/null @@ -1 +0,0 @@ -qw \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/f2.qw b/fmpp/src/test/resources/expected/filename/f2.qw deleted file mode 100644 index 918c841..0000000 --- a/fmpp/src/test/resources/expected/filename/f2.qw +++ /dev/null @@ -1 +0,0 @@ -wq \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/gxx b/fmpp/src/test/resources/expected/filename/gxx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/gxx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/rme_casesens b/fmpp/src/test/resources/expected/filename/rme_casesens deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/rme_casesens +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/rmp_casesens b/fmpp/src/test/resources/expected/filename/rmp_casesens deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/rmp_casesens +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename/rpe_casesens.wq b/fmpp/src/test/resources/expected/filename/rpe_casesens.wq deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename/rpe_casesens.wq +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/a b/fmpp/src/test/resources/expected/filename_casesens/a deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/a +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/a.foo b/fmpp/src/test/resources/expected/filename_casesens/a.foo deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/a.foo +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/a.foo.bar b/fmpp/src/test/resources/expected/filename_casesens/a.foo.bar deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/a.foo.bar +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/bt b/fmpp/src/test/resources/expected/filename_casesens/bt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/bt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/bt.x b/fmpp/src/test/resources/expected/filename_casesens/bt.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/bt.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/c b/fmpp/src/test/resources/expected/filename_casesens/c deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/c +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/c.x b/fmpp/src/test/resources/expected/filename_casesens/c.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/c.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/d b/fmpp/src/test/resources/expected/filename_casesens/d deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/d +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/d.pok b/fmpp/src/test/resources/expected/filename_casesens/d.pok deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/d.pok +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/e b/fmpp/src/test/resources/expected/filename_casesens/e deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/e +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/f1.wq b/fmpp/src/test/resources/expected/filename_casesens/f1.wq deleted file mode 100644 index 81f4282..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/f1.wq +++ /dev/null @@ -1 +0,0 @@ -qw \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/f2.qw b/fmpp/src/test/resources/expected/filename_casesens/f2.qw deleted file mode 100644 index 918c841..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/f2.qw +++ /dev/null @@ -1 +0,0 @@ -wq \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/gxx b/fmpp/src/test/resources/expected/filename_casesens/gxx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/gxx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/rme_casesens.Man b/fmpp/src/test/resources/expected/filename_casesens/rme_casesens.Man deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/rme_casesens.Man +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/rmp_casesensXx b/fmpp/src/test/resources/expected/filename_casesens/rmp_casesensXx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/rmp_casesensXx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/filename_casesens/rpe_casesens.Qw b/fmpp/src/test/resources/expected/filename_casesens/rpe_casesens.Qw deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/filename_casesens/rpe_casesens.Qw +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/fm_ici_2.3.21/test.txt b/fmpp/src/test/resources/expected/fm_ici_2.3.21/test.txt deleted file mode 100644 index 77662ba..0000000 --- a/fmpp/src/test/resources/expected/fm_ici_2.3.21/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -2147483647 - - s - -- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/fm_ici_2.3.21_ow/test.txt b/fmpp/src/test/resources/expected/fm_ici_2.3.21_ow/test.txt deleted file mode 100644 index a3489f8..0000000 --- a/fmpp/src/test/resources/expected/fm_ici_2.3.21_ow/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -2147483647 - - s - -bar \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/fm_ici_null/test.txt b/fmpp/src/test/resources/expected/fm_ici_null/test.txt deleted file mode 100644 index 20c4715..0000000 --- a/fmpp/src/test/resources/expected/fm_ici_null/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -0 - - Failed - -- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/fm_ici_null_ow/test.txt b/fmpp/src/test/resources/expected/fm_ici_null_ow/test.txt deleted file mode 100644 index 62f09bd..0000000 --- a/fmpp/src/test/resources/expected/fm_ici_null_ow/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -0 - - Failed - -bar \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/format_settings/test.txt b/fmpp/src/test/resources/expected/format_settings/test.txt deleted file mode 100644 index c7930af..0000000 --- a/fmpp/src/test/resources/expected/format_settings/test.txt +++ /dev/null @@ -1,6 +0,0 @@ -1.00 -Y/N -1995-06-07T15:16:17 -19950607 -15:16:17 -16:16:17 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/freemarker_links/@test4 b/fmpp/src/test/resources/expected/freemarker_links/@test4 deleted file mode 100644 index 0095f13..0000000 --- a/fmpp/src/test/resources/expected/freemarker_links/@test4 +++ /dev/null @@ -1 +0,0 @@ -INTERNAL @test4 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/freemarker_links/sub/t.txt b/fmpp/src/test/resources/expected/freemarker_links/sub/t.txt deleted file mode 100644 index dc121a5..0000000 --- a/fmpp/src/test/resources/expected/freemarker_links/sub/t.txt +++ /dev/null @@ -1,19 +0,0 @@ -INTERNAL @inc/test1.ftl == INTERNAL @inc/test1.ftl -EXTERNAL inc1/test2.ftl == EXTERNAL inc1/test2.ftl -EXTERNAL inc2/test3.ftl == EXTERNAL inc2/test3.ftl - -INTERNAL @inc/test1.ftl == INTERNAL @inc/test1.ftl -EXTERNAL inc1/test2.ftl == EXTERNAL inc1/test2.ftl -EXTERNAL inc2/test3.ftl == EXTERNAL inc2/test3.ftl - -INTERNAL @test4 == INTERNAL @test4 -EXTERNAL inc1/test5.ftl == EXTERNAL inc1/test5.ftl -EXTERNAL inc2/test6.ftl == EXTERNAL inc2/test6.ftl - -INTERNAL @test4 == INTERNAL @test4 -EXTERNAL inc1/test5.ftl == EXTERNAL inc1/test5.ftl -EXTERNAL inc2/test6.ftl == EXTERNAL inc2/test6.ftl - -GODZILLA == GODZILLA - -GODZILLA == GODZILLA \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/freemarker_links/t.txt b/fmpp/src/test/resources/expected/freemarker_links/t.txt deleted file mode 100644 index dc121a5..0000000 --- a/fmpp/src/test/resources/expected/freemarker_links/t.txt +++ /dev/null @@ -1,19 +0,0 @@ -INTERNAL @inc/test1.ftl == INTERNAL @inc/test1.ftl -EXTERNAL inc1/test2.ftl == EXTERNAL inc1/test2.ftl -EXTERNAL inc2/test3.ftl == EXTERNAL inc2/test3.ftl - -INTERNAL @inc/test1.ftl == INTERNAL @inc/test1.ftl -EXTERNAL inc1/test2.ftl == EXTERNAL inc1/test2.ftl -EXTERNAL inc2/test3.ftl == EXTERNAL inc2/test3.ftl - -INTERNAL @test4 == INTERNAL @test4 -EXTERNAL inc1/test5.ftl == EXTERNAL inc1/test5.ftl -EXTERNAL inc2/test6.ftl == EXTERNAL inc2/test6.ftl - -INTERNAL @test4 == INTERNAL @test4 -EXTERNAL inc1/test5.ftl == EXTERNAL inc1/test5.ftl -EXTERNAL inc2/test6.ftl == EXTERNAL inc2/test6.ftl - -GODZILLA == GODZILLA - -GODZILLA == GODZILLA \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/htmlutils/test.bmp b/fmpp/src/test/resources/expected/htmlutils/test.bmp deleted file mode 100644 index 72289e61f84642b11c48d4883e0e0fe9225d7b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1498 zcmeH{yA6OK5QZVq#Ln8@!U-I}-n|^eshowvAMUBa34{yYNqqYuYvMtUR%TG(!&-N0{dAmVv|(K4Usf1wH#mFplnk5ozUi5S)qK`?E> uhtgAjp)61)qnKA_B^S}}tbkTx)Kk+ki)LA;35_Xv)|oMriid)@6VMGJ-3Ckm diff --git a/fmpp/src/test/resources/expected/htmlutils/test.gif b/fmpp/src/test/resources/expected/htmlutils/test.gif deleted file mode 100644 index cc29e793d965e971449f96ede9ce7587684f5499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 zcmZ?wbhEHblw{y%XlGzxQ2Fzx14xa6(GVDkA)xq^1?cVn3_2jsgYpCehd%=&i-1Q# zLPIl$u$0b;f`x}#c=^qAeiSGptWQ=;c2HUBD>$iSs1`nf#! eEs@xqa(cS5?7fzi6Vv?Xnij6gsWet#um%8=btZcN diff --git a/fmpp/src/test/resources/expected/htmlutils/test.html b/fmpp/src/test/resources/expected/htmlutils/test.html deleted file mode 100644 index a110107..0000000 --- a/fmpp/src/test/resources/expected/htmlutils/test.html +++ /dev/null @@ -1,4 +0,0 @@ -

        GIF -

        PNG -

        -

        diff --git a/fmpp/src/test/resources/expected/htmlutils/test.jpg b/fmpp/src/test/resources/expected/htmlutils/test.jpg deleted file mode 100644 index cc8871f6b94953a0ffbfaaa0a2f19d1720706d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmex=ct*k%^fF=o}7CE^Yw^CPrpv zCKhH^peunYYk_hMEP|{;iiVDC!hwnGN`)dujT0AgC_8ODC>nI}gNkudQ4=SZn7D+b zl&YG#hNhN@shPQjrIoXbtDC!rr&n-DXjpheWK?oWYFc_mW>#@YX<2ziWmR)aYg>Cq zXV;|3Q>IRvK4a#rMT?g#UABD1%2k^-Z`rzS`;MKv4jn#n^w{weCr@3veC6u3>o;!R zdidz^lc&#~zj*oTWKS#c?s+z;ylzumXF{b zg8S$HEe0NDMqsjG7G$tzSo}a)}AN1xAv?EsgQj5 zpFz~Dmpkh2;=Nn4YBm@wQ)2vCd5h`K+Jm>mvkO+On_zz^PVKk)>Eto%yLAeTXV_Zy zGjDCKvHtq?rDt8NS8q9UTd9-rr{%+tn&p;GmA8soCbe>I-T0q@>(lRlH74tSzq8Z`_X}2W=8ww&;t;swfGq>3y@X&`9t5%->&v5AR#()2&{%2@3 zxBt`YCbcZTtAFFeIr3WXR#^RwDTeo;$nbML-* O`((@3wNLi{zX<>idT;sw diff --git a/fmpp/src/test/resources/expected/htmlutils/test.png b/fmpp/src/test/resources/expected/htmlutils/test.png deleted file mode 100644 index 7ef3cc08647587c13205d32c3b63f7f8e082882b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3-qTc1*d>z`)E9;1lA?pz`NW2T*JjjE2BS z3;}!RUz36UcJp*`45^rtdp=r-L4kwGVbA}iv*olBz6!scAS|%6dhQ*D*12;h$f|qF z9FSdR_`Ntc`R7ghz1^OL){`}E-QT@f \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_2/test1.txt b/fmpp/src/test/resources/expected/tag_syntax_2/test1.txt deleted file mode 100644 index dabd0fd..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_2/test1.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm not a comment --> \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_2/test2.txt b/fmpp/src/test/resources/expected/tag_syntax_2/test2.txt deleted file mode 100644 index 7ca45bf..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_2/test2.txt +++ /dev/null @@ -1 +0,0 @@ -[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_2/test3.txt b/fmpp/src/test/resources/expected/tag_syntax_2/test3.txt deleted file mode 100644 index dabd0fd..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_2/test3.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm not a comment --> \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_3/test1a.txt b/fmpp/src/test/resources/expected/tag_syntax_3/test1a.txt deleted file mode 100644 index 7ca45bf..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_3/test1a.txt +++ /dev/null @@ -1 +0,0 @@ -[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_3/test1b.txt b/fmpp/src/test/resources/expected/tag_syntax_3/test1b.txt deleted file mode 100644 index dabd0fd..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_3/test1b.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm not a comment --> \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_3/test2.txt b/fmpp/src/test/resources/expected/tag_syntax_3/test2.txt deleted file mode 100644 index 7ca45bf..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_3/test2.txt +++ /dev/null @@ -1 +0,0 @@ -[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tag_syntax_3/test3.txt b/fmpp/src/test/resources/expected/tag_syntax_3/test3.txt deleted file mode 100644 index dabd0fd..0000000 --- a/fmpp/src/test/resources/expected/tag_syntax_3/test3.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm not a comment --> \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tdd/comments.txt b/fmpp/src/test/resources/expected/tdd/comments.txt deleted file mode 100644 index 2239e48..0000000 --- a/fmpp/src/test/resources/expected/tdd/comments.txt +++ /dev/null @@ -1,8 +0,0 @@ -c1: - - (a) : str (#A) - - (b) : str ( -#B<#-- -) -c2: - - (a) : str (A) - - (b) : str (B) diff --git a/fmpp/src/test/resources/expected/tdd/encoding.txt b/fmpp/src/test/resources/expected/tdd/encoding.txt deleted file mode 100644 index 639cf66..0000000 --- a/fmpp/src/test/resources/expected/tdd/encoding.txt +++ /dev/null @@ -1 +0,0 @@ -bálnabél \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tdd/hashes.txt b/fmpp/src/test/resources/expected/tdd/hashes.txt deleted file mode 100644 index 0cde47d..0000000 --- a/fmpp/src/test/resources/expected/tdd/hashes.txt +++ /dev/null @@ -1,35 +0,0 @@ -m1: - - (k1) : num (1) - - (k2) : num (2) - - (k3) : num (3) - - (k4) : num (4) - - (k5) : num (5) - - (k6) : num (6) - - (k7) : num (7) - - (k8) : num (8) - - (k9) : num (9) -m2: - - (a) : str (b:c:d) - - (a:b) : str (c:d) - - (a:b:c) : str (d) -m3: - - (1) : num (1) - - (true) : bool (true) -m4: - - (a) : str (A) - - (b) : str (B) - - (c) : str (C) - - (d) : str (D) -m5: - - (a) : seq [(num (1)), (num (2)), (num (3))] - - (b) : hash {(a):(num (11))], (b):(num (22))], (c):(num (33))]} - - (c) : num (3) -m6: - - (a) : num (111) - - (b) : num (222) - - (c) : num (333) - - (d) : num (444) - -a: 111 -b: 222 -c: 333 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/tdd/nestedscalars.txt b/fmpp/src/test/resources/expected/tdd/nestedscalars.txt deleted file mode 100644 index f90f0db..0000000 --- a/fmpp/src/test/resources/expected/tdd/nestedscalars.txt +++ /dev/null @@ -1,33 +0,0 @@ - [foo-bar/**/baz.txt] - [C:\windows\system32] - [25%] - [7.txt] - [1-2] - [True] - [contains space] - [a'b] - [(c)] - [] - [7] - [true] - [x"y] - [x'y] - [x'y] - [x"y] - [a\'b] - [a\"b] - [line1 - line2 - line3] - [!?] - [d-dd-dd0] - [A B C D] - [X - Y - - Z] - [true] - [false] - [7] - [0.7] - [-0.7] diff --git a/fmpp/src/test/resources/expected/tdd/scalars.txt b/fmpp/src/test/resources/expected/tdd/scalars.txt deleted file mode 100644 index f90f0db..0000000 --- a/fmpp/src/test/resources/expected/tdd/scalars.txt +++ /dev/null @@ -1,33 +0,0 @@ - [foo-bar/**/baz.txt] - [C:\windows\system32] - [25%] - [7.txt] - [1-2] - [True] - [contains space] - [a'b] - [(c)] - [] - [7] - [true] - [x"y] - [x'y] - [x'y] - [x"y] - [a\'b] - [a\"b] - [line1 - line2 - line3] - [!?] - [d-dd-dd0] - [A B C D] - [X - Y - - Z] - [true] - [false] - [7] - [0.7] - [-0.7] diff --git a/fmpp/src/test/resources/expected/tdd/seqmode.txt b/fmpp/src/test/resources/expected/tdd/seqmode.txt deleted file mode 100644 index e5ad504..0000000 --- a/fmpp/src/test/resources/expected/tdd/seqmode.txt +++ /dev/null @@ -1,5 +0,0 @@ -num (1) -str (2) -seq [(num (3)), (str (4))] -hash {(5):(num (5))], (6):(str (6))]} -bool (true) diff --git a/fmpp/src/test/resources/expected/terminated_output/correct.html b/fmpp/src/test/resources/expected/terminated_output/correct.html deleted file mode 100644 index 0e1c94f..0000000 --- a/fmpp/src/test/resources/expected/terminated_output/correct.html +++ /dev/null @@ -1 +0,0 @@ -x-mooo \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/terminated_output/flushedzero.html b/fmpp/src/test/resources/expected/terminated_output/flushedzero.html deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/expected/terminated_output/n1.txt b/fmpp/src/test/resources/expected/terminated_output/n1.txt deleted file mode 100644 index 5c66153..0000000 --- a/fmpp/src/test/resources/expected/terminated_output/n1.txt +++ /dev/null @@ -1 +0,0 @@ - n1 diff --git a/fmpp/src/test/resources/expected/terminated_output/n2.txt b/fmpp/src/test/resources/expected/terminated_output/n2.txt deleted file mode 100644 index 34d2aaf..0000000 --- a/fmpp/src/test/resources/expected/terminated_output/n2.txt +++ /dev/null @@ -1 +0,0 @@ - n2 diff --git a/fmpp/src/test/resources/expected/terminated_output/n3.txt b/fmpp/src/test/resources/expected/terminated_output/n3.txt deleted file mode 100644 index 8d110c3..0000000 --- a/fmpp/src/test/resources/expected/terminated_output/n3.txt +++ /dev/null @@ -1 +0,0 @@ - n3 \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/terminated_output/nZero.txt b/fmpp/src/test/resources/expected/terminated_output/nZero.txt deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/expected/terminated_output/nestings.html b/fmpp/src/test/resources/expected/terminated_output/nestings.html deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/expected/terminated_output/one.html b/fmpp/src/test/resources/expected/terminated_output/one.html deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/expected/terminated_output/one.html +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/url_escaping/test.txt b/fmpp/src/test/resources/expected/url_escaping/test.txt deleted file mode 100644 index 1157393..0000000 --- a/fmpp/src/test/resources/expected/url_escaping/test.txt +++ /dev/null @@ -1,18 +0,0 @@ - -output_encoding: ISO-8859-2 = ISO-8859-2 -url_escaping_charset: - = - -%2Fa%20n%F5%FCgy%2Faz -%2Fa%20n%F5%FCgy%2Faz -/a%20n%F5%FCgy/az - -output_encoding: utf-8 = utf-8 -url_escaping_charset: - = - -%2Fa%20n%C5%91%C3%BCgy%2Faz -%2Fa%20n%C5%91%C3%BCgy%2Faz -/a%20n%C5%91%C3%BCgy/az - -output_encoding: utf-8 = utf-8 -url_escaping_charset: utf-16 = utf-16 -%FE%FF%00%2Fa%FE%FF%00%20n%FE%FF%01%51%00%FCgy%FE%FF%00%2Faz -%FE%FF%00%2Fa%FE%FF%00%20n%FE%FF%01%51%00%FCgy%FE%FF%00%2Faz -/a%FE%FF%00%20n%FE%FF%01%51%00%FCgy/az \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/url_escaping2/test.txt b/fmpp/src/test/resources/expected/url_escaping2/test.txt deleted file mode 100644 index bd75bd5..0000000 --- a/fmpp/src/test/resources/expected/url_escaping2/test.txt +++ /dev/null @@ -1,15 +0,0 @@ - -output_encoding: ISO-8859-2 = ISO-8859-2 -url_escaping_charset: UTF-16 = UTF-16 -b%FE%FF%00%E9ka -b%FE%FF%00%E9ka - -output_encoding: utf-8 = utf-8 -url_escaping_charset: UTF-16 = UTF-16 -b%FE%FF%00%E9ka -b%FE%FF%00%E9ka - -output_encoding: utf-8 = utf-8 -url_escaping_charset: ISO-8859-2 = ISO-8859-2 -b%E9ka -b%E9ka \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/writable_hash/test.txt b/fmpp/src/test/resources/expected/writable_hash/test.txt deleted file mode 100644 index cdb1041..0000000 --- a/fmpp/src/test/resources/expected/writable_hash/test.txt +++ /dev/null @@ -1,20 +0,0 @@ - -stuff: - - a = A - - b = B - -x: - - a = A - - b = B - - c = C - -y: - - a = A - - b = B - - c = C - - d = D - -z: - - x = X - - z = Z - diff --git a/fmpp/src/test/resources/expected/writable_sequence/test.txt b/fmpp/src/test/resources/expected/writable_sequence/test.txt deleted file mode 100644 index bc1c6c1..0000000 --- a/fmpp/src/test/resources/expected/writable_sequence/test.txt +++ /dev/null @@ -1,21 +0,0 @@ - -stuff: - - A - - B - -x: - - A - - B - - C - -y: - - A - - B - - C - - D - -z: - - X - - Y - - Z - diff --git a/fmpp/src/test/resources/expected/xinclude/index.html b/fmpp/src/test/resources/expected/xinclude/index.html deleted file mode 100644 index 4e47c7f..0000000 --- a/fmpp/src/test/resources/expected/xinclude/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - XML Tree Dump - - - - -

        XML Tree Dump

        - -
          -
        • document -
            -
          • <?foo bar baaz ?> -
          • <book 'http://www.w3.org/2000/xmlns/':xi="http://www.w3.org/2001/XInclude"> -
              -
            • "&#xA;  " -
            • <!-- This is a comment --> -
            • "&#xA;  " -
            • <part id="1" title="Part 1" 'http://www.w3.org/XML/1998/namespace':base="part1.xml"> -
                -
              • "&#xA;  " -
              • <chapter id="2" title="Chapter 1.1"> -
                  -
                • "&#xA;    " -
                • <para id="3"> -
                    -
                  • "A" -
                  -
                • "&#xA;    " -
                • <para id="4"> -
                    -
                  • "CDATA is just text." -
                  -
                • "&#xA;  " -
                -
              • "&#xA;  " -
              • <chapter id="5" title="Chapter 1.2"> -
                  -
                • "&#xA;    " -
                • <para id="6"> -
                    -
                  • "A" -
                  -
                • "&#xA;    " -
                • <para id="7"> -
                    -
                  • "B" -
                  -
                • "&#xA;  " -
                -
              • "&#xA;  " -
              • <chapter id="8" title="Chapter 1.3"> -
                  -
                • "&#xA;    " -
                • <para id="9"> -
                    -
                  • "A" -
                  -
                • "&#xA;    " -
                • <para id="10"> -
                    -
                  • "B" -
                  -
                • "&#xA;  " -
                -
              • "&#xA;" -
              -
            • "&#xA;  " -
            • <part id="11" title="Part 2" 'http://www.w3.org/XML/1998/namespace':base="part2.xml"> -
                -
              • "&#xA;  " -
              • <chapter id="12" title="Chapter 2.1"> -
                  -
                • "&#xA;    " -
                • <para id="13"> -
                    -
                  • "A" -
                  -
                • "&#xA;    " -
                • <para id="14"> -
                    -
                  • "B" -
                  -
                • "&#xA;    " -
                • <para id="15"> -
                    -
                  • "C" -
                  -
                • "&#xA;  " -
                -
              • "&#xA;  " -
              • <chapter id="16" title="Chapter 2.2"> -
                  -
                • "&#xA;    " -
                • <para id="17"> -
                    -
                  • "A" -
                  -
                • "&#xA;    " -
                • <para id="18"> -
                    -
                  • "B" -
                  -
                • "&#xA;    " -
                • <para id="19"> -
                    -
                  • "C" -
                  -
                • "&#xA;  " -
                -
              • "&#xA;" -
              -
            • "&#xA;" -
            -
          -
        - -

        Legend: -

          -
        • <foo bar="123">: Element node -
        • "Blah blah": Text node -
        • <?foo bar ?>: Processing instruction node -
        • <!-- Blah blah -->: Comment node -
        • foo: Other node -
        - - - diff --git a/fmpp/src/test/resources/expected/xml_catalogs/test.txt b/fmpp/src/test/resources/expected/xml_catalogs/test.txt deleted file mode 100644 index dc44d2d..0000000 --- a/fmpp/src/test/resources/expected/xml_catalogs/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -- Test2 - diff --git a/fmpp/src/test/resources/expected/xml_rendering/a.xml b/fmpp/src/test/resources/expected/xml_rendering/a.xml deleted file mode 100644 index fd9856e..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/a.xml +++ /dev/null @@ -1,4 +0,0 @@ - - Aá - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/b.xml b/fmpp/src/test/resources/expected/xml_rendering/b.xml deleted file mode 100644 index 8c7e37a..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/b.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - B - B - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/c.xml b/fmpp/src/test/resources/expected/xml_rendering/c.xml deleted file mode 100644 index d66881e..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/c.xml +++ /dev/null @@ -1,4 +0,0 @@ - - C - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/copy.txt b/fmpp/src/test/resources/expected/xml_rendering/copy.txt deleted file mode 100644 index 67930f0..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/copy.txt +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/d.xml b/fmpp/src/test/resources/expected/xml_rendering/d.xml deleted file mode 100644 index 8da9335..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/d.xml +++ /dev/null @@ -1,4 +0,0 @@ - - D - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/e.xml b/fmpp/src/test/resources/expected/xml_rendering/e.xml deleted file mode 100644 index 826d586..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/e.xml +++ /dev/null @@ -1,4 +0,0 @@ - - E - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/f.xml b/fmpp/src/test/resources/expected/xml_rendering/f.xml deleted file mode 100644 index 601373b..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/f.xml +++ /dev/null @@ -1,4 +0,0 @@ - - F - - \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/g.txt b/fmpp/src/test/resources/expected/xml_rendering/g.txt deleted file mode 100644 index ec6b8fc..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/g.txt +++ /dev/null @@ -1,4 +0,0 @@ - - G - ----[6]--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/h.txt b/fmpp/src/test/resources/expected/xml_rendering/h.txt deleted file mode 100644 index 38e669c..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/h.txt +++ /dev/null @@ -1,4 +0,0 @@ - - H - ----[6]--- \ No newline at end of file diff --git a/fmpp/src/test/resources/expected/xml_rendering/ldb.xml b/fmpp/src/test/resources/expected/xml_rendering/ldb.xml deleted file mode 100644 index 5ec8af4..0000000 --- a/fmpp/src/test/resources/expected/xml_rendering/ldb.xml +++ /dev/null @@ -1,3 +0,0 @@ -test -test -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/config.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/config.fmpp deleted file mode 100644 index 700e506..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -data: { - doc: xml(test.xml) -} diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/a/r.txt b/fmpp/src/test/resources/tests/always_create_dirs_off/src/a/r.txt deleted file mode 100644 index ac017d0..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/src/a/r.txt +++ /dev/null @@ -1 +0,0 @@ -<@pp.dropOutputFile /> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/q/q2/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/q/q2/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/x.txt b/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/x.txt deleted file mode 100644 index ca1584d..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/x/x.txt +++ /dev/null @@ -1 +0,0 @@ -sd \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/y/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/b/c/y/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/c/d/createdir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/c/d/createdir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/d/createdir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/d/createdir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/d/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/d/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_off/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/data/test.xml b/fmpp/src/test/resources/tests/always_create_dirs_off/src/data/test.xml deleted file mode 100644 index 9197392..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/src/data/test.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/sub/t3.txt b/fmpp/src/test/resources/tests/always_create_dirs_off/src/sub/t3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/src/sub/t3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_off/src/t.txt b/fmpp/src/test/resources/tests/always_create_dirs_off/src/t.txt deleted file mode 100644 index db9512e..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_off/src/t.txt +++ /dev/null @@ -1,21 +0,0 @@ -<#visit doc> - -<#macro @element> - ELEM: I'm the ${.node?node_name} element. - I'm belonging the ${.node?node_namespace} namespace. - <@recurseAttributes /> - <#recurse> - - -<#macro recurseAttributes> - <#list .node["@*"] as att> - <@@attribute att /> - - - -<#macro @attribute att> - ATT: I'm the ${att?node_name} attribute - of an ${.node?node_name} element. - I'm belonging to the ${att?node_namespace!'void'} namespace. - My value is: ${att} - diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/config.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/config.fmpp deleted file mode 100644 index 86223e2..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/config.fmpp +++ /dev/null @@ -1,8 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -alwaysCreateDirectories: true -modes: [ignore(.gitignore)] -data: { - doc: xml(test.xml) -} diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/a/r.txt b/fmpp/src/test/resources/tests/always_create_dirs_on/src/a/r.txt deleted file mode 100644 index ac017d0..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/src/a/r.txt +++ /dev/null @@ -1 +0,0 @@ -<@pp.dropOutputFile /> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/q/q2/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/q/q2/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/x.txt b/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/x.txt deleted file mode 100644 index ca1584d..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/x/x.txt +++ /dev/null @@ -1 +0,0 @@ -sd \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/y/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/b/c/y/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/c/d/createdir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/c/d/createdir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/d/createdir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/d/createdir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/d/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/d/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/always_create_dirs_on/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/data/test.xml b/fmpp/src/test/resources/tests/always_create_dirs_on/src/data/test.xml deleted file mode 100644 index 9197392..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/src/data/test.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/sub/t3.txt b/fmpp/src/test/resources/tests/always_create_dirs_on/src/sub/t3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/src/sub/t3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/always_create_dirs_on/src/t.txt b/fmpp/src/test/resources/tests/always_create_dirs_on/src/t.txt deleted file mode 100644 index db9512e..0000000 --- a/fmpp/src/test/resources/tests/always_create_dirs_on/src/t.txt +++ /dev/null @@ -1,21 +0,0 @@ -<#visit doc> - -<#macro @element> - ELEM: I'm the ${.node?node_name} element. - I'm belonging the ${.node?node_namespace} namespace. - <@recurseAttributes /> - <#recurse> - - -<#macro recurseAttributes> - <#list .node["@*"] as att> - <@@attribute att /> - - - -<#macro @attribute att> - ATT: I'm the ${att?node_name} attribute - of an ${.node?node_name} element. - I'm belonging to the ${att?node_namespace!'void'} namespace. - My value is: ${att} - diff --git a/fmpp/src/test/resources/tests/basic_usecase/fmpp.cfg b/fmpp/src/test/resources/tests/basic_usecase/fmpp.cfg deleted file mode 100644 index c4c7f09..0000000 --- a/fmpp/src/test/resources/tests/basic_usecase/fmpp.cfg +++ /dev/null @@ -1,5 +0,0 @@ -## $id$ -source-root = src -output-root = out -log-file = fmpp.log -data = properties(data/style.properties), message:'Die maggots!' \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/basic_usecase/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/data/style.properties b/fmpp/src/test/resources/tests/basic_usecase/src/data/style.properties deleted file mode 100644 index 5858f70..0000000 --- a/fmpp/src/test/resources/tests/basic_usecase/src/data/style.properties +++ /dev/null @@ -1,2 +0,0 @@ -backgroundColor=black -textColor=red \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/include/ignoredir.fmpp b/fmpp/src/test/resources/tests/basic_usecase/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/include/page.ftl b/fmpp/src/test/resources/tests/basic_usecase/src/include/page.ftl deleted file mode 100644 index 19f03b2..0000000 --- a/fmpp/src/test/resources/tests/basic_usecase/src/include/page.ftl +++ /dev/null @@ -1,12 +0,0 @@ -<#-- $Id: page.ftl,v 1.1 2003/10/11 11:29:23 ddekany Exp $ --> -<#macro page title> -<#escape x as x?html> - - ${title?cap_first} - - -

        ${title?cap_first}

        - <#nested> - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/index.html b/fmpp/src/test/resources/tests/basic_usecase/src/index.html deleted file mode 100644 index de797f8..0000000 --- a/fmpp/src/test/resources/tests/basic_usecase/src/index.html +++ /dev/null @@ -1,7 +0,0 @@ -<#-- $Id: index.html,v 1.1 2003/10/11 11:29:23 ddekany Exp $ --> -<#include "/include/page.ftl"> - -<@page title=message> -

        -

        Rattrah - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/mi.png b/fmpp/src/test/resources/tests/basic_usecase/src/mi.png deleted file mode 100644 index 902e9424de508d39a634e02391c9208a2851b092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5;pK<9Qpf>grPhVH|%Un!CN{T-FOtXPP zoCO|{#S9Gmi6G3l!hU%sP>?0v(btiIVPik{pF~z5-ypyz#1%+eSXi{Tw;w-#eC5iO z<>lquwr%_O@1L8S+w|$v)6>(RJ$t66rgrPrt?=-0QBl!@ybEpt_1y4uaSW-rm7L(f z-ebfgWAJU!le0W?gcrzs{v^b=Mz(XWUe&a{ z*re0;+`;(g>C@&0HTwFg5A^0U6ooTgSlY_-=Bd1d#Iotr&#;}`be+kxYkIQ- -<#include "/include/page.ftl"> -<@page title="Rattrah"> -

        Rattrahad - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/basic_usecase/src/sub/subsub/rattrahad.html b/fmpp/src/test/resources/tests/basic_usecase/src/sub/subsub/rattrahad.html deleted file mode 100644 index 2453601..0000000 --- a/fmpp/src/test/resources/tests/basic_usecase/src/sub/subsub/rattrahad.html +++ /dev/null @@ -1,5 +0,0 @@ -<#-- $Id: rattrahad.html,v 1.1 2003/10/11 11:29:23 ddekany Exp $ --> -<#include "/include/page.ftl"> -<@page title="Rattrahad"> -

        Index - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/config.fmpp b/fmpp/src/test/resources/tests/borders/config.fmpp deleted file mode 100644 index b17bd88..0000000 --- a/fmpp/src/test/resources/tests/borders/config.fmpp +++ /dev/null @@ -1,23 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -borders: [ - footer('\n---X---', **/*.x) - footer('\n---Y---', **/*.y) - layer() - border('H', '0') - layer() - border('0', 'F') - layer() - border('{', '}') - layer() - header('H1{') - footer('}F1') - layer() - layer() - header('ROOTH2{', /*) - footer('}SUBF2', sub/) - layer() - header('SUBH3{', sub/) - footer('}ROOTF3', /*) -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/1.txt b/fmpp/src/test/resources/tests/borders/src/1.txt deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/1.txt +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/1.x b/fmpp/src/test/resources/tests/borders/src/1.x deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/1.x +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/1.y b/fmpp/src/test/resources/tests/borders/src/1.y deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/1.y +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/sub/1.txt b/fmpp/src/test/resources/tests/borders/src/sub/1.txt deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/sub/1.txt +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/sub/1.x b/fmpp/src/test/resources/tests/borders/src/sub/1.x deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/sub/1.x +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/sub/1.y b/fmpp/src/test/resources/tests/borders/src/sub/1.y deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/sub/1.y +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/borders/src/sub/foo/1.txt b/fmpp/src/test/resources/tests/borders/src/sub/foo/1.txt deleted file mode 100644 index b516b2c..0000000 --- a/fmpp/src/test/resources/tests/borders/src/sub/foo/1.txt +++ /dev/null @@ -1 +0,0 @@ -@ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_base/b1/src/index.html b/fmpp/src/test/resources/tests/cfg_base/b1/src/index.html deleted file mode 100644 index 70f8cd2..0000000 --- a/fmpp/src/test/resources/tests/cfg_base/b1/src/index.html +++ /dev/null @@ -1 +0,0 @@ -

        Rattrah \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_base/b1/src/sub/rattrah.html b/fmpp/src/test/resources/tests/cfg_base/b1/src/sub/rattrah.html deleted file mode 100644 index 7adb375..0000000 --- a/fmpp/src/test/resources/tests/cfg_base/b1/src/sub/rattrah.html +++ /dev/null @@ -1 +0,0 @@ -

        Rattrah. \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_base/cfg2/fmpp.cfg b/fmpp/src/test/resources/tests/cfg_base/cfg2/fmpp.cfg deleted file mode 100644 index ec2da29..0000000 --- a/fmpp/src/test/resources/tests/cfg_base/cfg2/fmpp.cfg +++ /dev/null @@ -1,2 +0,0 @@ -configuration-base = .. -data-root = foo/data \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_base/fmpp.cfg b/fmpp/src/test/resources/tests/cfg_base/fmpp.cfg deleted file mode 100644 index d17bb74..0000000 --- a/fmpp/src/test/resources/tests/cfg_base/fmpp.cfg +++ /dev/null @@ -1,7 +0,0 @@ -## $id$ -configuration-base=b1 -inherit-configuration=../cfg2 -source-root = src -output-root = ../out -log-file = ../fmpp.log -data = properties(style.properties), message:'Die maggots!' \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_base/foo/data/style.properties b/fmpp/src/test/resources/tests/cfg_base/foo/data/style.properties deleted file mode 100644 index 5858f70..0000000 --- a/fmpp/src/test/resources/tests/cfg_base/foo/data/style.properties +++ /dev/null @@ -1,2 +0,0 @@ -backgroundColor=black -textColor=red \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/cfg2/fmpp2.cfg b/fmpp/src/test/resources/tests/cfg_inheritance/cfg2/fmpp2.cfg deleted file mode 100644 index a47ecea..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/cfg2/fmpp2.cfg +++ /dev/null @@ -1,5 +0,0 @@ -inherit-configuration=../fmpp3.cfg -output-root=../out -source-root=overrideme -data=a:x, b:B -borders=header('HDR2\n', **/2.txt), footer('\nFTR', **/?.txt) \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/fmpp.cfg b/fmpp/src/test/resources/tests/cfg_inheritance/fmpp.cfg deleted file mode 100644 index 55ce89a..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/fmpp.cfg +++ /dev/null @@ -1,4 +0,0 @@ -inherit-configuration=cfg2/fmpp2.cfg -source-root=src -data=a:A -borders=header('HDR1\n', **/1.txt) \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/fmpp3.cfg b/fmpp/src/test/resources/tests/cfg_inheritance/fmpp3.cfg deleted file mode 100644 index df8d08e..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/fmpp3.cfg +++ /dev/null @@ -1,3 +0,0 @@ -data=a:x, b:x, c:C -source-root=overrideme2 -borders=header('HDR3\n', **/?.txt) \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/src/1.txt b/fmpp/src/test/resources/tests/cfg_inheritance/src/1.txt deleted file mode 100644 index 56a6051..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/src/1.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/src/2.txt b/fmpp/src/test/resources/tests/cfg_inheritance/src/2.txt deleted file mode 100644 index d8263ee..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/src/2.txt +++ /dev/null @@ -1 +0,0 @@ -2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/src/3.txt b/fmpp/src/test/resources/tests/cfg_inheritance/src/3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/src/3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/src/4.txt b/fmpp/src/test/resources/tests/cfg_inheritance/src/4.txt deleted file mode 100644 index bf0d87a..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/src/4.txt +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/cfg_inheritance/src/test.txt b/fmpp/src/test/resources/tests/cfg_inheritance/src/test.txt deleted file mode 100644 index 8d795da..0000000 --- a/fmpp/src/test/resources/tests/cfg_inheritance/src/test.txt +++ /dev/null @@ -1 +0,0 @@ -${a}${b}${c} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_csv/config.fmpp b/fmpp/src/test/resources/tests/dl_csv/config.fmpp deleted file mode 100644 index 38b0c17..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/config.fmpp +++ /dev/null @@ -1,28 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -logFile: log.fmpp -outputEncoding: utf-8 -data: { - csv: csv(test.txt, { - separator: tab - dateFormat: yyyy.MM.dd - timeFormat: HH-mm-ss - dateTimeFormat: 'yyyy.MM.dd HH-mm-ss' - }) - csv2r: csv(test2.txt, {replaceHeaders: [r1:n, r2:n, r3:n]}) - csv2a: csv(test2.txt, {headers: [a1, a2, a3]}) - csv3r: csv(test3.txt, {replaceHeaders: [r1:n, r2:n, r3:n]}) - csv3a: csv(test3.txt, {headers: [a1, a2, a3]}) - csv4r: csv(test4.txt, {replaceHeaders: [r1:n, r2:n, r3:n]}) - csv4a: csv(test4.txt, {headers: [a1, a2, a3]}) - csv5: csv(test5.txt, { - normalizeHeaders - trimCells - separator: tab - dateFormat: yyyy.MM.dd - timeFormat: HH-mm-ss - dateTimeFormat: 'yyyy.MM.dd HH-mm-ss' - }) - csv_utf8_bom: csv(test-utf8-bom.csv, {encoding: UTF-8}) -} diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/dl_csv/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test-utf8-bom.csv b/fmpp/src/test/resources/tests/dl_csv/src/data/test-utf8-bom.csv deleted file mode 100644 index 26d3df3..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/data/test-utf8-bom.csv +++ /dev/null @@ -1,3 +0,0 @@ -aá;eé -árvíztűrő;fúrógép -11;22 diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test.txt b/fmpp/src/test/resources/tests/dl_csv/src/data/test.txt deleted file mode 100644 index 213cf84..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/data/test.txt +++ /dev/null @@ -1,7 +0,0 @@ -name protected:b price:n entered:dt x:d y:t -arctic-tern yes 10000 2003.01.25 03-10-06 2001.01.20 12-05-00 - -house-sparrow no 50 2003.02.15 01-20-30 -mooo - -mooo2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test2.txt b/fmpp/src/test/resources/tests/dl_csv/src/data/test2.txt deleted file mode 100644 index c8fc74a..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/data/test2.txt +++ /dev/null @@ -1,4 +0,0 @@ -a;b;c -1;2;3 -4;5 -6 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test3.txt b/fmpp/src/test/resources/tests/dl_csv/src/data/test3.txt deleted file mode 100644 index 797db92..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/data/test3.txt +++ /dev/null @@ -1 +0,0 @@ -a;b;c \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test4.txt b/fmpp/src/test/resources/tests/dl_csv/src/data/test4.txt deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_csv/src/data/test5.txt b/fmpp/src/test/resources/tests/dl_csv/src/data/test5.txt deleted file mode 100644 index 41d04f9..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/data/test5.txt +++ /dev/null @@ -1,7 +0,0 @@ - Name (English) protected:b price net (blah: x, y, z) : n entered:dt x, y :; , z:d y:t -arctic-tern yes 10000 2003.01.25 03-10-06 2001.01.20 12-05-00 - - house-sparrow no 50 2003.02.15 01-20-30 -mooo - -mooo2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_csv/src/test.html b/fmpp/src/test/resources/tests/dl_csv/src/test.html deleted file mode 100644 index 2343d74..0000000 --- a/fmpp/src/test/resources/tests/dl_csv/src/test.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - -<#setting number_format=",##0.00"> -<#setting datetime_format="MMM dd, yyyy hh:mm:ss a"> - -

        Header query and row hashes: - - - <#list csv.headers as h><#list csv.headers as h>
        ${h} -<#list csv as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        Row sequences: - - -<#list csv as row> - <#list row as cell>
        ${cell?default("N/A")?string} - -
        - -

        CSV2 headers replaced: - - - <#list csv2r.headers as h><#list csv2r.headers as h>
        ${h} -<#list csv2r as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        CSV2 headers added: - - - <#list csv2a.headers as h><#list csv2a.headers as h>
        ${h} -<#list csv2a as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        CSV3 headers replaced: - - - <#list csv3r.headers as h><#list csv3r.headers as h>
        ${h} -<#list csv3r as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        CSV3 headers added: - - - <#list csv3a.headers as h><#list csv3a.headers as h>
        ${h} -<#list csv3a as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        CSV4 headers replaced: - - - <#list csv4r.headers as h><#list csv4r.headers as h>
        ${h} -<#list csv4r as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        CSV4 headers added: - - - <#list csv4a.headers as h><#list csv4a.headers as h>
        ${h} -<#list csv4a as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        Header normalization: - - - <#list csv5.headers as h><#list csv5.headers as h>
        ${h} -<#list csv5 as row> -
        ${row[h]?default("N/A")?string} - -
        - -

        UTF-8 BOM: - - -<#list csv_utf8_bom as row> -
        ${row.aá}${row.eé} - -
        - - - diff --git a/fmpp/src/test/resources/tests/dl_eval/config.fmpp b/fmpp/src/test/resources/tests/dl_eval/config.fmpp deleted file mode 100644 index 81d0d2b..0000000 --- a/fmpp/src/test/resources/tests/dl_eval/config.fmpp +++ /dev/null @@ -1,9 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - a:4 - e1:eval("1+1") - e2:eval("a / 2", {a:get(a)}) - e3:eval("a - b", {a:get(a), b:get(e2)}) - e4:eval("x = 3; x *= 2; x -= 4; return x;") -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_eval/src/test.txt b/fmpp/src/test/resources/tests/dl_eval/src/test.txt deleted file mode 100644 index 0b63133..0000000 --- a/fmpp/src/test/resources/tests/dl_eval/src/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -${e1} -${e2} -${e3} -${e4} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_get/config.fmpp b/fmpp/src/test/resources/tests/dl_get/config.fmpp deleted file mode 100644 index b280eba..0000000 --- a/fmpp/src/test/resources/tests/dl_get/config.fmpp +++ /dev/null @@ -1,20 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - a: A - ga: get(a) - b:{ - s1: { - s2: B - } - } - gb: get(b, s1, s2) - { - a: C - {gc: get(a)} - } - a: D - gd:[ - {a: BAD, value:get(a)} - ] -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_get/src/test.txt b/fmpp/src/test/resources/tests/dl_get/src/test.txt deleted file mode 100644 index ab91114..0000000 --- a/fmpp/src/test/resources/tests/dl_get/src/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -${ga} -${gb} -${gc} -${gd[0].value} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_json/config.fmpp b/fmpp/src/test/resources/tests/dl_json/config.fmpp deleted file mode 100644 index 4ed70e2..0000000 --- a/fmpp/src/test/resources/tests/dl_json/config.fmpp +++ /dev/null @@ -1,9 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -logFile: log.fmpp -outputEncoding: utf-8 -data: { - applicants: json(applicants.json) - synthetic: json(synthetic.json, utf-8) -} diff --git a/fmpp/src/test/resources/tests/dl_json/src/data/applicants.json b/fmpp/src/test/resources/tests/dl_json/src/data/applicants.json deleted file mode 100644 index 51640c5..0000000 --- a/fmpp/src/test/resources/tests/dl_json/src/data/applicants.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "name": "Jean Test", - "maidenName": "Jean Test", - "age": 20, - "skills": [ "HTML", "CSS" ], - "testResults": { - "a": 10.5, "b": 20, "c": 30 - }, - "decided": true - }, - { - "name": "José Test", - "maidenName": null, - "age": 30, - "skills": [ "Ruby", "C++", "Cuda" ], - "testResults": { - "a": 20, "b": 30, "c": 40 - }, - "decided": false - } -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_json/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/dl_json/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_json/src/data/synthetic.json b/fmpp/src/test/resources/tests/dl_json/src/data/synthetic.json deleted file mode 100644 index 7c2a990..0000000 --- a/fmpp/src/test/resources/tests/dl_json/src/data/synthetic.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "aString": "árvíztűrÅ‘", - "aNumber": 1.23E2, - "aBoolean": true, - "anArray": [ - 1.5, - "foo", - null, - true, - false, - [11, 22], - { "a": 111, "b": 222 } - ], - "anObject": { - "u": "U", - "n": null, - "a": [1111, 2222], - "o": { "a": 11111, "b": 22222 } - } -} diff --git a/fmpp/src/test/resources/tests/dl_json/src/explicit-traversal.html b/fmpp/src/test/resources/tests/dl_json/src/explicit-traversal.html deleted file mode 100644 index 9f7f114..0000000 --- a/fmpp/src/test/resources/tests/dl_json/src/explicit-traversal.html +++ /dev/null @@ -1,42 +0,0 @@ -<#escape x as x?html> - - - - - - - - - - - - - - -<#list applicants as applicant> - - - - - - - - -
        NameAgeSkillsTest resultsDecided
        - ${applicant.name} - <#if applicant.maidenName??>(m.n.: ${applicant.maidenName}) - ${applicant.age} - <#list applicant.skills as s> - ${s}<#if s_has_next>, - - - <#list applicant.testResults?keys as testName> - ${testName}: ${applicant.testResults[testName]?string("0.0")}<#if testName_has_next>, - - - ${applicant.decided?string('Y', 'N')} -
        - - - - diff --git a/fmpp/src/test/resources/tests/dl_json/src/synthetic.ftl b/fmpp/src/test/resources/tests/dl_json/src/synthetic.ftl deleted file mode 100644 index 08f0edf..0000000 --- a/fmpp/src/test/resources/tests/dl_json/src/synthetic.ftl +++ /dev/null @@ -1,148 +0,0 @@ -<#ftl encoding="utf-8"> -<@pp.dropOutputFile /> - -<@assert synthetic?size == 5 /> -<@assert !synthetic?parent?? /> -<@assert synthetic?node_name == "unnamedObject" /> -<@assert synthetic?node_type == "object" /> -<@assert !synthetic?node_namespace?? /> - -<#assign aString = synthetic.aString> -<@assert aString == "árvíztűrő" /> -<@assert aString?is_string /> -<@assert !aString?is_hash /> -<@assert aString?parent?size == 5 /> -<@assert aString?node_name == "aString" /> -<@assert aString?node_type == "string" /> - -<#assign aNumber = synthetic.aNumber> -<@assert aNumber == 123 /> -<@assert aNumber?is_number /> -<@assert !aNumber?is_string /> -<@assert !aNumber?is_hash /> -<@assert aNumber?parent?size == 5 /> -<@assert aNumber?node_name == "aNumber" /> -<@assert aNumber?node_type == "number" /> - -<#assign aBoolean = synthetic.aBoolean> -<@assert aBoolean /> -<@assert aBoolean?is_boolean /> -<@assert !aBoolean?is_string /> -<@assert !aBoolean?is_hash /> -<@assert aBoolean?parent?size == 5 /> -<@assert aBoolean?node_name == "aBoolean" /> -<@assert aBoolean?node_type == "boolean" /> - -<#assign arr = synthetic.anArray> -<@assert arr?size == 7 /> -<@assert arr[0] == 1.5 /> -<@assert arr[0]?node_name == "unnamedNumber" /> -<@assert arr[1] == "foo" /> -<@assert arr[1]?node_name == "unnamedString" /> -<@assert !arr[2]?? /> -<@assert arr[3] /> -<@assert arr[3]?node_name == "unnamedBoolean" /> -<@assert !arr[4] /> -<@assert arr[5]?size == 2 /> -<@assert arr[5][0] == 11 /> -<@assert arr[5][1] == 22 /> -<@assert arr[5][1] == 22 /> -<@assert arr[5][0] == 11 /> -<@assert arr[5]?join(", ") == "11, 22" /> -<@assert arr[5]?node_name == "unnamedArray" /> -<@assert arr[6]?size == 2 /> -<@assert arr[6]?node_name == "unnamedObject" /> -<@assert arr[6].a == 111 /> -<@assert arr[6].a?node_name == "a" /> -<@assert arr[6].b == 222 /> -<@assert arr[6]?parent[0] == 1.5 /> -<@assert arr[6].b?parent?parent[0] == 1.5 /> -<@assert arr[6].b?root.aNumber == 123 /> -<@assert arr[6].b?ancestors('anArray')[0][0] == 1.5 /> -<@assert !arr[7]?? /> -<#list arr as e> - <#if e_index == 1> - <@assert e == "foo" /> - - -<@assert arr?is_sequence /> -<@assert !arr?is_hash /> -<@assert !arr?is_string /> -<@assert arr?parent?size == 5 /> -<@assert arr?node_name == "anArray" /> -<@assert arr?node_type == "array" /> - -<#assign childTypes = ""> -<#list arr?children as child> - <#assign childTypes = childTypes + child?node_type + ";"> - -<@assert childTypes == "number;string;null;boolean;boolean;array;object;", childTypes /> - -<#assign values = ""> -<#list arr as value> - <#assign values = values + ((value?node_type)!'?') + ";"> - -<@assert values == "number;string;?;boolean;boolean;array;object;", values /> - -<#assign anObject = synthetic.anObject> -<@assert anObject?size == 4 /> -<@assert anObject?is_hash /> -<@assert !anObject?is_sequence /> -<@assert !anObject?is_string /> -<@assert anObject.u == 'U' /> -<@assert anObject.n!'null' == 'null' /> -<#list anObject.a as e> - <#if e_index == 0> - <@assert e == 1111 /> - <#elseif e_index == 1> - <@assert e == 2222 /> - <#else> - <@assert false /> - - -<@assert anObject.a?size == 2 /> -<@assert anObject.a[1] == 2222 /> -<@assert anObject.a[0] == 1111 /> -<@assert anObject.a[0] == 1111 /> -<@assert anObject.a[1] == 2222 /> -<@assert anObject.a[1]?parent[0] == 1111 /> -<@assert anObject.o?size == 2 /> -<@assert anObject.o.b == 22222 /> -<@assert anObject.o.a == 11111 /> -<@assert anObject.o.a == 11111 /> -<@assert anObject.o.b == 22222 /> -<@assert anObject.o.b?parent.a == 11111 /> -<@assert !anObject.n?? /> -<@assert !anObject.wrong?? /> -<@assert anObject?parent.aNumber == 123 /> -<@assert anObject?node_name == "anObject" /> -<@assert anObject?node_type == "object" /> - -<#assign childNames = ""> -<#list anObject?children as child> - <#assign childNames = childNames + child?node_name + ";"> - -<@assert childNames == "u;n;a;o;", childNames /> - -<#assign values = ""> -<#list anObject?values as value> - <#assign values = values + ((value?node_name)!'?') + ";"> - -<@assert values == "u;?;a;o;", values /> -<@assert anObject?values[2]?node_type == 'array' /> -<@assert anObject?values[2]?parent.u == 'U' /> - -<@assert anObject?keys?join(";", "?") == "u;n;a;o" /> -<#assign keys = ""> -<#list anObject?keys as key> - <#assign keys = keys + ((key?node_name)!'?') + ";"> - -<@assert keys == "unnamedString;unnamedString;unnamedString;unnamedString;", keys /> -<@assert anObject?keys[2]?node_type == 'string' /> -<@assert anObject?keys[2]?parent.u == 'U' /> - -<#macro assert bool actual=""> - <#if !bool> - <#stop "Assertion failed" + (actual != "")?string(". Actual: " + actual, "")> - - diff --git a/fmpp/src/test/resources/tests/dl_json/src/visitor-traversal.html b/fmpp/src/test/resources/tests/dl_json/src/visitor-traversal.html deleted file mode 100644 index 6718096..0000000 --- a/fmpp/src/test/resources/tests/dl_json/src/visitor-traversal.html +++ /dev/null @@ -1,63 +0,0 @@ -<#escape x as x?html> - - - - - - <#visit applicants> - - - -<#macro @array> - - - - - - - - - <#recurse> -
        NameAgeSkillsTest resultsDecided
        - - -<#macro @object> - - <#recurse> - - - -<#macro name> - - ${.node} - <#if .node?parent.maidenName??>(m.n.: ${.node?parent.maidenName}) - - - -<#macro maidenName><#-- Already extracted in the "name" macro --> - -<#macro age> - ${.node} - - -<#macro skills> - - <#list .node as s> - ${s}<#if s_has_next>, - - - - -<#macro testResults> - - <#list .node?keys as testName> - ${testName}: ${.node[testName]?string("0.0")}<#if testName_has_next>, - - - - -<#macro decided> - ${.node?string('Y', 'N')} - - - diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/config.fmpp b/fmpp/src/test/resources/tests/dl_slicedtext/config.fmpp deleted file mode 100644 index 21c1deb..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/empty.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t1.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t1.txt deleted file mode 100644 index 685912c..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t1.txt +++ /dev/null @@ -1,3 +0,0 @@ -a - b - c \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t2.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t2.txt deleted file mode 100644 index 10b4e38..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t2.txt +++ /dev/null @@ -1,3 +0,0 @@ -a - b - c diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t3.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t3.txt deleted file mode 100644 index 63f675a..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t3.txt +++ /dev/null @@ -1,8 +0,0 @@ ---- - a - A ---- -b --- B ---- - c ---- \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t4.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t4.txt deleted file mode 100644 index 1ded9eb..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t4.txt +++ /dev/null @@ -1,8 +0,0 @@ ---- - a - A ---- -b --- B ---- - c ---- diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t5.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t5.txt deleted file mode 100644 index 1f2df22..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t5.txt +++ /dev/null @@ -1,8 +0,0 @@ ---- - a - A ---- -b --- B ---- - c ----x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6.txt deleted file mode 100644 index db6f7ee..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6.txt +++ /dev/null @@ -1,9 +0,0 @@ -a ---- - b ---- - c ---- - d ---- -e \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6cr.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6cr.txt deleted file mode 100644 index 6237aa7..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6cr.txt +++ /dev/null @@ -1 +0,0 @@ -a --- b --- c --- d --- e \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6lf.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6lf.txt deleted file mode 100644 index db6f7ee..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t6lf.txt +++ /dev/null @@ -1,9 +0,0 @@ -a ---- - b ---- - c ---- - d ---- -e \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t7.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t7.txt deleted file mode 100644 index 90296e2..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t7.txt +++ /dev/null @@ -1,2 +0,0 @@ -reg, green, -blue \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t8.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t8.txt deleted file mode 100644 index d6cce76..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t8.txt +++ /dev/null @@ -1,25 +0,0 @@ -A a a -aaa -a - ---8<-- - -Separate items like this: ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: - ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: ---8<-- - -But don't forget to put empty lines around it! - ---8<-- - -C c c -ccc -c \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t9.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t9.txt deleted file mode 100644 index 2ef29e8..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/data/t9.txt +++ /dev/null @@ -1 +0,0 @@ -a -> b -> -> ->-> c -> diff --git a/fmpp/src/test/resources/tests/dl_slicedtext/src/test.txt b/fmpp/src/test/resources/tests/dl_slicedtext/src/test.txt deleted file mode 100644 index eb14880..0000000 --- a/fmpp/src/test/resources/tests/dl_slicedtext/src/test.txt +++ /dev/null @@ -1,127 +0,0 @@ -<#ftl encoding="ISO-8859-2"> - -<#macro listFileNoMagic fileName separator> -<#list pp.loadData('slicedText', fileName, {"separator":separator, 'dropEmptyLastItem':false, 'encoding':'utf-8'}) as x> -[${x}] - - - -<#macro listFileTrim fileName separator> -<#list pp.loadData('slicedText', fileName, {"separator":separator, 'trim':true, 'encoding':'utf-8'}) as x> -[${x}] - - - -<@listFileNoMagic 't1.txt', '\n' /> -== -[a] -[ b] -[ c ] - ---------- - -<@listFileNoMagic 't2.txt', '\n' /> -== -[a] -[ b] -[ c ] -[] - -<@listFileTrim 't1.txt', '\n' /> -== -[a] -[b] -[c] - ---------- - -<@listFileTrim 't2.txt', '\n' /> -== -[a] -[b] -[c] - ---------- - -<@listFileNoMagic 't3.txt', '\n---\n' /> -== -[--- - a - A ] -[ b --- B ] -[ c ----] - -<@listFileNoMagic 't4.txt', '\n---\n' /> -== -[--- - a - A ] -[ b --- B ] -[ c ] -[] - -<@listFileNoMagic 't5.txt', '\n---\n' /> -== -[--- - a - A ] -[ b --- B ] -[ c ----x] - -<@listFileNoMagic 't6.txt', '\n---\n' /> -== -<@listFileNoMagic 't6cr.txt', '\n---\n' /> -== -<@listFileNoMagic 't6lf.txt', '\n---\n' /> -== -[a] -[ b] -[ c] -[ d ] -[e ] - -<@listFileTrim 't7.txt', ',' /> -== -[red] -[green] -[blue] - -<@listFileTrim 't8.txt', '\n\n--8<--\n\n' /> -== -[A a a -aaa -a] -[Separate items like this: ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: - ---8<-- -But don't forget to put empty lines around it! - -Separate items like this: ---8<-- - -But don't forget to put empty lines around it!] -[C c c -ccc -c] - -<@listFileTrim 't9.txt', '->' /> -== -[a] -[b] -[] -[] -[] -[c] - -<@listFileTrim 'empty.txt', '\n' /> -== - -<@listFileNoMagic 'empty.txt', '\n' /> -== -[] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_text/config.fmpp b/fmpp/src/test/resources/tests/dl_text/config.fmpp deleted file mode 100644 index e8ed9b1..0000000 --- a/fmpp/src/test/resources/tests/dl_text/config.fmpp +++ /dev/null @@ -1,8 +0,0 @@ -sourceRoot: src -outputRoot: out -dataRoot: src/data -logFile: log.fmpp -data: { - t1: text("1.txt") - t1_utf8_bom: text("1-utf8-bom.txt", UTF-8) -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/dl_text/src/data/1-utf8-bom.txt b/fmpp/src/test/resources/tests/dl_text/src/data/1-utf8-bom.txt deleted file mode 100644 index 0f64b50..0000000 --- a/fmpp/src/test/resources/tests/dl_text/src/data/1-utf8-bom.txt +++ /dev/null @@ -1,3 +0,0 @@ -bla1 -bla2 -bla3 diff --git a/fmpp/src/test/resources/tests/dl_text/src/data/1.txt b/fmpp/src/test/resources/tests/dl_text/src/data/1.txt deleted file mode 100644 index 8c8f461..0000000 --- a/fmpp/src/test/resources/tests/dl_text/src/data/1.txt +++ /dev/null @@ -1,3 +0,0 @@ -bla1 -bla2 -bla3 diff --git a/fmpp/src/test/resources/tests/dl_text/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/dl_text/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/dl_text/src/test.txt b/fmpp/src/test/resources/tests/dl_text/src/test.txt deleted file mode 100644 index 470e50f..0000000 --- a/fmpp/src/test/resources/tests/dl_text/src/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -[${t1}] -[${t1_utf8_bom}] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/encoding/config.fmpp b/fmpp/src/test/resources/tests/encoding/config.fmpp deleted file mode 100644 index 2b87ba6..0000000 --- a/fmpp/src/test/resources/tests/encoding/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -sourceEncoding: ISO-8859-2 -outputEncoding: UTF-8 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/encoding/src/test.txt b/fmpp/src/test/resources/tests/encoding/src/test.txt deleted file mode 100644 index 4dfe28d..0000000 --- a/fmpp/src/test/resources/tests/encoding/src/test.txt +++ /dev/null @@ -1,19 +0,0 @@ -<#-- $Id: test.txt,v 1.1 2003/10/26 23:52:01 ddekany Exp $ --> -UTF-8 áõ - -<#flush> -<@pp.changeOutputFile name="text_utf-16.txt" /> -<@pp.setOutputEncoding encoding="UTF-16" /> -UTF-16 áõ<#t> -<#t> -<@pp.changeOutputFile name="text_iso-8859-2.txt" /> -ISO-8859-2 áõ -<@pp.setOutputEncoding encoding="ISO-8859-2" /> - -<@pp.changeOutputFile name="text_UTF-8_2.txt" /> -UTF-8 áõ -<@pp.setOutputEncoding encoding="ISO-8859-1" /> -áõ -<@pp.setOutputEncoding encoding="ISO-8859-2" /> -áõ -<@pp.setOutputEncoding encoding="UTF-8" /> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/encoding/src/test2.txt b/fmpp/src/test/resources/tests/encoding/src/test2.txt deleted file mode 100644 index 5508c8f..0000000 --- a/fmpp/src/test/resources/tests/encoding/src/test2.txt +++ /dev/null @@ -1,7 +0,0 @@ -<@pp.setOutputEncoding encoding="source" /> -ISO-8859-2 áõ -<@pp.nestOutputFile name="test2_iso-8859-1.txt"> -<@pp.setOutputEncoding encoding="ISO-8859-1" /> -ISO-8859-1 áõ - -ISO-8859-2 áõ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_border/fmpp.cfg b/fmpp/src/test/resources/tests/ex_border/fmpp.cfg deleted file mode 100644 index 7ab82bc..0000000 --- a/fmpp/src/test/resources/tests/ex_border/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/border \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_capture/fmpp.cfg b/fmpp/src/test/resources/tests/ex_capture/fmpp.cfg deleted file mode 100644 index 1c63d21..0000000 --- a/fmpp/src/test/resources/tests/ex_capture/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/capture \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_check_links/fmpp.cfg b/fmpp/src/test/resources/tests/ex_check_links/fmpp.cfg deleted file mode 100644 index ac3f699..0000000 --- a/fmpp/src/test/resources/tests/ex_check_links/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/check_links \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_csv/fmpp.cfg b/fmpp/src/test/resources/tests/ex_csv/fmpp.cfg deleted file mode 100644 index 1ca0c74..0000000 --- a/fmpp/src/test/resources/tests/ex_csv/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/csv \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_img_dims/config.fmpp b/fmpp/src/test/resources/tests/ex_img_dims/config.fmpp deleted file mode 100644 index 2acd17d..0000000 --- a/fmpp/src/test/resources/tests/ex_img_dims/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -inheritConfiguration: ../../../../docs/examples/img_dims -borders: border('<@sortAttrs>', '', '*.htm*') -data: {sortAttrs:eval('new fmpp.testsuite.SortAttrsTransform()')} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_local_data/config.fmpp b/fmpp/src/test/resources/tests/ex_local_data/config.fmpp deleted file mode 100644 index 8cfd8b5..0000000 --- a/fmpp/src/test/resources/tests/ex_local_data/config.fmpp +++ /dev/null @@ -1 +0,0 @@ -inheritConfiguration: ../../../../docs/examples/local_data \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_multipage_list/config.fmpp b/fmpp/src/test/resources/tests/ex_multipage_list/config.fmpp deleted file mode 100644 index 112fa78..0000000 --- a/fmpp/src/test/resources/tests/ex_multipage_list/config.fmpp +++ /dev/null @@ -1 +0,0 @@ -inheritConfiguration: ../../../../docs/examples/multipage_list \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_qtour_step1/fmpp.cfg b/fmpp/src/test/resources/tests/ex_qtour_step1/fmpp.cfg deleted file mode 100644 index 1e67b02..0000000 --- a/fmpp/src/test/resources/tests/ex_qtour_step1/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/qtour_step1 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_qtour_step2/fmpp.cfg b/fmpp/src/test/resources/tests/ex_qtour_step2/fmpp.cfg deleted file mode 100644 index 863cca9..0000000 --- a/fmpp/src/test/resources/tests/ex_qtour_step2/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/qtour_step2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_qtour_step3/fmpp.cfg b/fmpp/src/test/resources/tests/ex_qtour_step3/fmpp.cfg deleted file mode 100644 index a1b4b56..0000000 --- a/fmpp/src/test/resources/tests/ex_qtour_step3/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/qtour_step3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_qtour_step4/fmpp.cfg b/fmpp/src/test/resources/tests/ex_qtour_step4/fmpp.cfg deleted file mode 100644 index 4be8640..0000000 --- a/fmpp/src/test/resources/tests/ex_qtour_step4/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/qtour_step4 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_session/fmpp.cfg b/fmpp/src/test/resources/tests/ex_session/fmpp.cfg deleted file mode 100644 index cc2bbe9..0000000 --- a/fmpp/src/test/resources/tests/ex_session/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/session \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_tdd/fmpp.cfg b/fmpp/src/test/resources/tests/ex_tdd/fmpp.cfg deleted file mode 100644 index 4de43cd..0000000 --- a/fmpp/src/test/resources/tests/ex_tdd/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/tdd \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_xml/fmpp.cfg b/fmpp/src/test/resources/tests/ex_xml/fmpp.cfg deleted file mode 100644 index c8f5615..0000000 --- a/fmpp/src/test/resources/tests/ex_xml/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/xml \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_xml2/fmpp.cfg b/fmpp/src/test/resources/tests/ex_xml2/fmpp.cfg deleted file mode 100644 index 51330d6..0000000 --- a/fmpp/src/test/resources/tests/ex_xml2/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/xml2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_xml_rendering/fmpp.cfg b/fmpp/src/test/resources/tests/ex_xml_rendering/fmpp.cfg deleted file mode 100644 index bc3c413..0000000 --- a/fmpp/src/test/resources/tests/ex_xml_rendering/fmpp.cfg +++ /dev/null @@ -1 +0,0 @@ -inherit-configuration=../../../../docs/examples/xml_rendering \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/ex_xml_validating/config.fmpp b/fmpp/src/test/resources/tests/ex_xml_validating/config.fmpp deleted file mode 100644 index 2225126..0000000 --- a/fmpp/src/test/resources/tests/ex_xml_validating/config.fmpp +++ /dev/null @@ -1 +0,0 @@ -inheritConfiguration: ../../../../docs/examples/xml_validating \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/config.fmpp b/fmpp/src/test/resources/tests/filename/config.fmpp deleted file mode 100644 index 506ea20..0000000 --- a/fmpp/src/test/resources/tests/filename/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: src -outputRoot: out -removePostfixes: [t, xxx, xx] -removeExtensions: [bat.man, man, spider.man, spider] -replaceExtensions: [spider, pok, qw, wq, wq, qw] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/at b/fmpp/src/test/resources/tests/filename/src/at deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/at +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/at.foo b/fmpp/src/test/resources/tests/filename/src/at.foo deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/at.foo +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/at.foo.bar b/fmpp/src/test/resources/tests/filename/src/at.foo.bar deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/at.foo.bar +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/btt b/fmpp/src/test/resources/tests/filename/src/btt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/btt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/btt.x b/fmpp/src/test/resources/tests/filename/src/btt.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/btt.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/cxx b/fmpp/src/test/resources/tests/filename/src/cxx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/cxx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/cxx.x b/fmpp/src/test/resources/tests/filename/src/cxx.x deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/cxx.x +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/d.bat.man b/fmpp/src/test/resources/tests/filename/src/d.bat.man deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/d.bat.man +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/d.spider.man b/fmpp/src/test/resources/tests/filename/src/d.spider.man deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/d.spider.man +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/et.spider b/fmpp/src/test/resources/tests/filename/src/et.spider deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/et.spider +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/f1.qw b/fmpp/src/test/resources/tests/filename/src/f1.qw deleted file mode 100644 index 81f4282..0000000 --- a/fmpp/src/test/resources/tests/filename/src/f1.qw +++ /dev/null @@ -1 +0,0 @@ -qw \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/f2.wq b/fmpp/src/test/resources/tests/filename/src/f2.wq deleted file mode 100644 index 918c841..0000000 --- a/fmpp/src/test/resources/tests/filename/src/f2.wq +++ /dev/null @@ -1 +0,0 @@ -wq \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/gxxxxx b/fmpp/src/test/resources/tests/filename/src/gxxxxx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/gxxxxx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/rme_casesens.Man b/fmpp/src/test/resources/tests/filename/src/rme_casesens.Man deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/rme_casesens.Man +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/rmp_casesensXx b/fmpp/src/test/resources/tests/filename/src/rmp_casesensXx deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/rmp_casesensXx +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename/src/rpe_casesens.Qw b/fmpp/src/test/resources/tests/filename/src/rpe_casesens.Qw deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/filename/src/rpe_casesens.Qw +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/filename_casesens/config.fmpp b/fmpp/src/test/resources/tests/filename_casesens/config.fmpp deleted file mode 100644 index f625960..0000000 --- a/fmpp/src/test/resources/tests/filename_casesens/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -inheritConfiguration: ../filename/config.fmpp -outputRoot: out -caseSensitive: true \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/fm_ici_2.3.21/config.fmpp b/fmpp/src/test/resources/tests/fm_ici_2.3.21/config.fmpp deleted file mode 100644 index 85ce05a..0000000 --- a/fmpp/src/test/resources/tests/fm_ici_2.3.21/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -inheritConfiguration: ../fm_ici_null -outputRoot: out -freemarkerIncompatibleImprovements: 2.3.21 diff --git a/fmpp/src/test/resources/tests/fm_ici_2.3.21_ow/config.fmpp b/fmpp/src/test/resources/tests/fm_ici_2.3.21_ow/config.fmpp deleted file mode 100644 index db6af16..0000000 --- a/fmpp/src/test/resources/tests/fm_ici_2.3.21_ow/config.fmpp +++ /dev/null @@ -1,9 +0,0 @@ -inheritConfiguration: ../fm_ici_null -outputRoot: out -freemarkerIncompatibleImprovements: 2.3.21 -objectWrapper: ' - owb = new BeansWrapperBuilder(freemarkerIncompatibleImprovements); - owb.setSimpleMapWrapper(true); - owb.setExposeFields(true); - return owb.build(); - ' diff --git a/fmpp/src/test/resources/tests/fm_ici_null/config.fmpp b/fmpp/src/test/resources/tests/fm_ici_null/config.fmpp deleted file mode 100644 index 61d353f..0000000 --- a/fmpp/src/test/resources/tests/fm_ici_null/config.fmpp +++ /dev/null @@ -1,12 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - foo: eval(' - public class Foo { - public String m(String s) { return "s"; } - public String m(int x) { return "i"; } - public String f = "bar"; - } - return new Foo(); - ') -} diff --git a/fmpp/src/test/resources/tests/fm_ici_null/src/test.txt b/fmpp/src/test/resources/tests/fm_ici_null/src/test.txt deleted file mode 100644 index 8b5bb41..0000000 --- a/fmpp/src/test/resources/tests/fm_ici_null/src/test.txt +++ /dev/null @@ -1,9 +0,0 @@ -${(1..)?size} - -<#attempt> - ${foo.m(null)} -<#recover> - Failed - - -${foo.f!'-'} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/fm_ici_null_ow/config.fmpp b/fmpp/src/test/resources/tests/fm_ici_null_ow/config.fmpp deleted file mode 100644 index eb24df5..0000000 --- a/fmpp/src/test/resources/tests/fm_ici_null_ow/config.fmpp +++ /dev/null @@ -1,8 +0,0 @@ -inheritConfiguration: ../fm_ici_null -outputRoot: out -objectWrapper: ' - owb = new BeansWrapperBuilder(freemarkerIncompatibleImprovements); - owb.setSimpleMapWrapper(true); - owb.setExposeFields(true); - return owb.build(); - ' diff --git a/fmpp/src/test/resources/tests/format_settings/config.fmpp b/fmpp/src/test/resources/tests/format_settings/config.fmpp deleted file mode 100644 index 032d0f9..0000000 --- a/fmpp/src/test/resources/tests/format_settings/config.fmpp +++ /dev/null @@ -1,15 +0,0 @@ -sourceRoot: src -outputRoot: out - -timeZone: UTC -sqlDateAndTimeTimeZone: 'GMT+01' - -booleanFormat: 'Y,N' -numberFormat: '0.00' -datetimeFormat: 'iso nz' -timeFormat: 'iso s nz' -dateFormat: yyyyMMdd - -data: { - sqlTime: eval('new java.sql.Time(802538177000L)') -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/format_settings/src/test.txt b/fmpp/src/test/resources/tests/format_settings/src/test.txt deleted file mode 100644 index 3ffd046..0000000 --- a/fmpp/src/test/resources/tests/format_settings/src/test.txt +++ /dev/null @@ -1,7 +0,0 @@ -<#assign dt = "1995-06-07T15:16:17Z"?datetime> -${1} -${true}/${false} -${dt} -${dt?date} -${dt?time} -${sqlTime} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/config.fmpp b/fmpp/src/test/resources/tests/freemarker_links/config.fmpp deleted file mode 100644 index cbfa335..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/config.fmpp +++ /dev/null @@ -1,10 +0,0 @@ -inheritConfiguration: inherited.fmpp -sourceRoot: src -outputRoot: out -logFile: log.fmpp -freemarkerLinks: { - inc: [inc1, inc2] - test4: inc1/test3.ftl - test6: inc1/test6.ftl - monster: inc2/godzilla.ftl -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc1/test1.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc1/test1.ftl deleted file mode 100644 index 7a35e2c..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc1/test1.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc1/test1.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc1/test2.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc1/test2.ftl deleted file mode 100644 index 395f128..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc1/test2.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc1/test2.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc1/test5.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc1/test5.ftl deleted file mode 100644 index a3239b9..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc1/test5.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc1/test5.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc2/godzilla.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc2/godzilla.ftl deleted file mode 100644 index 4f8d4a0..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc2/godzilla.ftl +++ /dev/null @@ -1 +0,0 @@ -GODZILLA \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc2/test2.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc2/test2.ftl deleted file mode 100644 index cd5220a..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc2/test2.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc2/test2.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc2/test3.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc2/test3.ftl deleted file mode 100644 index 7a79c23..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc2/test3.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc2/test3.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc2/test5.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc2/test5.ftl deleted file mode 100644 index 6c7a330..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc2/test5.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc2/test5.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inc2/test6.ftl b/fmpp/src/test/resources/tests/freemarker_links/inc2/test6.ftl deleted file mode 100644 index 464e61e..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inc2/test6.ftl +++ /dev/null @@ -1 +0,0 @@ -EXTERNAL inc2/test6.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/inherited.fmpp b/fmpp/src/test/resources/tests/freemarker_links/inherited.fmpp deleted file mode 100644 index 1401f3f..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/inherited.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -freemarkerLinks: { - test5: [inc1/test5.ftl, inc2/test5.ftl] - test6: inc2/test6.ftl -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/src/@inc/ignoredir.fmpp b/fmpp/src/test/resources/tests/freemarker_links/src/@inc/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/freemarker_links/src/@inc/test1.ftl b/fmpp/src/test/resources/tests/freemarker_links/src/@inc/test1.ftl deleted file mode 100644 index 9fc781a..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/src/@inc/test1.ftl +++ /dev/null @@ -1 +0,0 @@ -INTERNAL @inc/test1.ftl \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/src/@test4 b/fmpp/src/test/resources/tests/freemarker_links/src/@test4 deleted file mode 100644 index 0095f13..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/src/@test4 +++ /dev/null @@ -1 +0,0 @@ -INTERNAL @test4 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/src/sub/t.txt b/fmpp/src/test/resources/tests/freemarker_links/src/sub/t.txt deleted file mode 100644 index 63e1074..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/src/sub/t.txt +++ /dev/null @@ -1,19 +0,0 @@ -<#include "../@inc/test1.ftl"> == INTERNAL @inc/test1.ftl -<#include "../@inc/test2.ftl"> == EXTERNAL inc1/test2.ftl -<#include "../@inc/test3.ftl"> == EXTERNAL inc2/test3.ftl - -<#include "/@inc/test1.ftl"> == INTERNAL @inc/test1.ftl -<#include "/@inc/test2.ftl"> == EXTERNAL inc1/test2.ftl -<#include "/@inc/test3.ftl"> == EXTERNAL inc2/test3.ftl - -<#include "../@test4"> == INTERNAL @test4 -<#include "../@test5"> == EXTERNAL inc1/test5.ftl -<#include "../@test6"> == EXTERNAL inc2/test6.ftl - -<#include "/@test4"> == INTERNAL @test4 -<#include "/@test5"> == EXTERNAL inc1/test5.ftl -<#include "/@test6"> == EXTERNAL inc2/test6.ftl - -<#include "../@monster"> == GODZILLA - -<#include "/@monster"> == GODZILLA \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/freemarker_links/src/t.txt b/fmpp/src/test/resources/tests/freemarker_links/src/t.txt deleted file mode 100644 index 0f1020d..0000000 --- a/fmpp/src/test/resources/tests/freemarker_links/src/t.txt +++ /dev/null @@ -1,19 +0,0 @@ -<#include "@inc/test1.ftl"> == INTERNAL @inc/test1.ftl -<#include "@inc/test2.ftl"> == EXTERNAL inc1/test2.ftl -<#include "@inc/test3.ftl"> == EXTERNAL inc2/test3.ftl - -<#include "/@inc/test1.ftl"> == INTERNAL @inc/test1.ftl -<#include "/@inc/test2.ftl"> == EXTERNAL inc1/test2.ftl -<#include "/@inc/test3.ftl"> == EXTERNAL inc2/test3.ftl - -<#include "@test4"> == INTERNAL @test4 -<#include "@test5"> == EXTERNAL inc1/test5.ftl -<#include "@test6"> == EXTERNAL inc2/test6.ftl - -<#include "/@test4"> == INTERNAL @test4 -<#include "/@test5"> == EXTERNAL inc1/test5.ftl -<#include "/@test6"> == EXTERNAL inc2/test6.ftl - -<#include "@monster"> == GODZILLA - -<#include "/@monster"> == GODZILLA \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/htmlutils/config.fmpp b/fmpp/src/test/resources/tests/htmlutils/config.fmpp deleted file mode 100644 index 8df0f48..0000000 --- a/fmpp/src/test/resources/tests/htmlutils/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - htmlUtils() - sortAttrs: eval('new fmpp.testsuite.SortAttrsTransform()') -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/htmlutils/src/test.bmp b/fmpp/src/test/resources/tests/htmlutils/src/test.bmp deleted file mode 100644 index 72289e61f84642b11c48d4883e0e0fe9225d7b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1498 zcmeH{yA6OK5QZVq#Ln8@!U-I}-n|^eshowvAMUBa34{yYNqqYuYvMtUR%TG(!&-N0{dAmVv|(K4Usf1wH#mFplnk5ozUi5S)qK`?E> uhtgAjp)61)qnKA_B^S}}tbkTx)Kk+ki)LA;35_Xv)|oMriid)@6VMGJ-3Ckm diff --git a/fmpp/src/test/resources/tests/htmlutils/src/test.gif b/fmpp/src/test/resources/tests/htmlutils/src/test.gif deleted file mode 100644 index cc29e793d965e971449f96ede9ce7587684f5499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 zcmZ?wbhEHblw{y%XlGzxQ2Fzx14xa6(GVDkA)xq^1?cVn3_2jsgYpCehd%=&i-1Q# zLPIl$u$0b;f`x}#c=^qAeiSGptWQ=;c2HUBD>$iSs1`nf#! eEs@xqa(cS5?7fzi6Vv?Xnij6gsWet#um%8=btZcN diff --git a/fmpp/src/test/resources/tests/htmlutils/src/test.html b/fmpp/src/test/resources/tests/htmlutils/src/test.html deleted file mode 100644 index 4a6c791..0000000 --- a/fmpp/src/test/resources/tests/htmlutils/src/test.html +++ /dev/null @@ -1,6 +0,0 @@ -<@sortAttrs> -

        <@img src="test.gif" alt="GIF "/> -

        <@img src="test.png" alt="PNG" border=0 foo='bar' /> -

        <@img src="test.jpg" /> -

        <@img src="test.bmp" /> - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/htmlutils/src/test.jpg b/fmpp/src/test/resources/tests/htmlutils/src/test.jpg deleted file mode 100644 index cc8871f6b94953a0ffbfaaa0a2f19d1720706d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmex=ct*k%^fF=o}7CE^Yw^CPrpv zCKhH^peunYYk_hMEP|{;iiVDC!hwnGN`)dujT0AgC_8ODC>nI}gNkudQ4=SZn7D+b zl&YG#hNhN@shPQjrIoXbtDC!rr&n-DXjpheWK?oWYFc_mW>#@YX<2ziWmR)aYg>Cq zXV;|3Q>IRvK4a#rMT?g#UABD1%2k^-Z`rzS`;MKv4jn#n^w{weCr@3veC6u3>o;!R zdidz^lc&#~zj*oTWKS#c?s+z;ylzumXF{b zg8S$HEe0NDMqsjG7G$tzSo}a)}AN1xAv?EsgQj5 zpFz~Dmpkh2;=Nn4YBm@wQ)2vCd5h`K+Jm>mvkO+On_zz^PVKk)>Eto%yLAeTXV_Zy zGjDCKvHtq?rDt8NS8q9UTd9-rr{%+tn&p;GmA8soCbe>I-T0q@>(lRlH74tSzq8Z`_X}2W=8ww&;t;swfGq>3y@X&`9t5%->&v5AR#()2&{%2@3 zxBt`YCbcZTtAFFeIr3WXR#^RwDTeo;$nbML-* O`((@3wNLi{zX<>idT;sw diff --git a/fmpp/src/test/resources/tests/htmlutils/src/test.png b/fmpp/src/test/resources/tests/htmlutils/src/test.png deleted file mode 100644 index 7ef3cc08647587c13205d32c3b63f7f8e082882b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3-qTc1*d>z`)E9;1lA?pz`NW2T*JjjE2BS z3;}!RUz36UcJp*`45^rtdp=r-L4kwGVbA}iv*olBz6!scAS|%6dhQ*D*12;h$f|qF z9FSdR_`Ntc`R7ghz1^OL){`}E-QT@f - - - - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/config.fmpp b/fmpp/src/test/resources/tests/localdata/config.fmpp deleted file mode 100644 index 04dc647..0000000 --- a/fmpp/src/test/resources/tests/localdata/config.fmpp +++ /dev/null @@ -1,10 +0,0 @@ -inheritConfiguration: inheritedcfg.fmpp -logFile: fmpp.log -sourceRoot: src -outputRoot: out -data: {twoX: 'XX'} -localData: [ - case(sub/**/*.html, sub/**/*.htm, {id:SUB_HTML, id3:SUB_HTMLSUB_HTMLSUB_HTML}) - case(**/*.html, **/*.htm, {id:HTML, id3:HTMLHTMLHTML}) - layer() -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/inheritedcfg.fmpp b/fmpp/src/test/resources/tests/localdata/inheritedcfg.fmpp deleted file mode 100644 index ae043b8..0000000 --- a/fmpp/src/test/resources/tests/localdata/inheritedcfg.fmpp +++ /dev/null @@ -1,11 +0,0 @@ -localData: [ - case(**/*.htmlx, {id3:HX}) - layer() - layer() - layer() - layer() - case(**/*_x.*, {id:X, id2:get(twoX), id3:XXX}) - case(**/*_y.*, {properties(data/y.properties)}) - case(**/*_z.*, 'new fmpp.testsuite.TestLocalDataBuilder()') - layer() -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/1.html b/fmpp/src/test/resources/tests/localdata/src/1.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/1.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/1_x.html b/fmpp/src/test/resources/tests/localdata/src/1_x.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/1_x.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/1_z.html b/fmpp/src/test/resources/tests/localdata/src/1_z.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/1_z.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/1_z.htmlx b/fmpp/src/test/resources/tests/localdata/src/1_z.htmlx deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/1_z.htmlx +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/2.htm b/fmpp/src/test/resources/tests/localdata/src/2.htm deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/2.htm +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/2_y.htm b/fmpp/src/test/resources/tests/localdata/src/2_y.htm deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/2_y.htm +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/localdata/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/localdata/src/data/y.properties b/fmpp/src/test/resources/tests/localdata/src/data/y.properties deleted file mode 100644 index 38b6ca9..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/data/y.properties +++ /dev/null @@ -1,3 +0,0 @@ -id=Y -id2=YY -id3=yyy \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/1.html b/fmpp/src/test/resources/tests/localdata/src/sub/1.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/1.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/1_x.html b/fmpp/src/test/resources/tests/localdata/src/sub/1_x.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/1_x.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/1_z.html b/fmpp/src/test/resources/tests/localdata/src/sub/1_z.html deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/1_z.html +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/1_z.htmlx b/fmpp/src/test/resources/tests/localdata/src/sub/1_z.htmlx deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/1_z.htmlx +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/2.htm b/fmpp/src/test/resources/tests/localdata/src/sub/2.htm deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/2.htm +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/2_y.htm b/fmpp/src/test/resources/tests/localdata/src/sub/2_y.htm deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/2_y.htm +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/sub/test.txt b/fmpp/src/test/resources/tests/localdata/src/sub/test.txt deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/sub/test.txt +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/localdata/src/test.txt b/fmpp/src/test/resources/tests/localdata/src/test.txt deleted file mode 100644 index 3b13b6f..0000000 --- a/fmpp/src/test/resources/tests/localdata/src/test.txt +++ /dev/null @@ -1,3 +0,0 @@ -${id?default("-")} -${id2?default("-")} -${id3?default("-")} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/locale/config.fmpp b/fmpp/src/test/resources/tests/locale/config.fmpp deleted file mode 100644 index 0b0dbf8..0000000 --- a/fmpp/src/test/resources/tests/locale/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -locale: fr_FR \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/locale/src/test.txt b/fmpp/src/test/resources/tests/locale/src/test.txt deleted file mode 100644 index 71cae5c..0000000 --- a/fmpp/src/test/resources/tests/locale/src/test.txt +++ /dev/null @@ -1,8 +0,0 @@ -<#-- $Id: test.txt,v 1.1 2003/10/26 23:52:02 ddekany Exp $ --> -<#assign d = '2003-10-26'?date('yyyy-mm-dd')> -Locale: ${pp.locale} -Day: ${d?string('EEEE')} - -<#setting locale="en_US"> -Locale: ${pp.locale} -Day: ${d?string('EEEE')} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/nested_output/config.fmpp b/fmpp/src/test/resources/tests/nested_output/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/src/test/resources/tests/nested_output/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/nested_output/src/nestings.txt b/fmpp/src/test/resources/tests/nested_output/src/nestings.txt deleted file mode 100644 index a1583f4..0000000 --- a/fmpp/src/test/resources/tests/nested_output/src/nestings.txt +++ /dev/null @@ -1,29 +0,0 @@ -<@pp.renameOutputFile name="n0.txt" /> -n0[ -<@pp.nestOutputFile name='n1.txt'> - n1 - <@pp.nestOutputFile name='n2.txt'> - n2 - <@pp.nestOutputFile name='n3.txt'> - n3[ - <@pp.nestOutputFile name='n1.txt'> - -=N1=- - <@pp.nestOutputFile name='n0.txt'> - -=N0=- - - - -=N3=- - <@pp.nestOutputFile name='trash.txt'> - Trash - <@pp.nestOutputFile name='n2.txt'> - -=N2=- - - <@pp.dropOutputFile /> - - ]n3 - - ]n2 - - ]n1 - -]n0 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/nested_output/src/nestings2.txt b/fmpp/src/test/resources/tests/nested_output/src/nestings2.txt deleted file mode 100644 index e9bf8a0..0000000 --- a/fmpp/src/test/resources/tests/nested_output/src/nestings2.txt +++ /dev/null @@ -1,12 +0,0 @@ -n2.0[ -<@pp.nestOutputFile name='n2.1.txt'> - n1 - <@pp.nestOutputFile name='nestings2.txt'> - -=N2.0=- - <@pp.nestOutputFile name='n2.1.txt'> - -=N2.1=- - - - ]n1 - -]n2.0 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/objectwrapper1/config.fmpp b/fmpp/src/test/resources/tests/objectwrapper1/config.fmpp deleted file mode 100644 index ee0f554..0000000 --- a/fmpp/src/test/resources/tests/objectwrapper1/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - o: {'x':'X'} -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/objectwrapper1/src/test.txt b/fmpp/src/test/resources/tests/objectwrapper1/src/test.txt deleted file mode 100644 index 6383378..0000000 --- a/fmpp/src/test/resources/tests/objectwrapper1/src/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -${o.x} = X -${o.class?default('missing')} = missing \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/objectwrapper2/config.fmpp b/fmpp/src/test/resources/tests/objectwrapper2/config.fmpp deleted file mode 100644 index 1fa8db1..0000000 --- a/fmpp/src/test/resources/tests/objectwrapper2/config.fmpp +++ /dev/null @@ -1,6 +0,0 @@ -sourceRoot: src -outputRoot: out -objectWrapper: "new freemarker.ext.beans.BeansWrapper()" -data: { - o: {'x':'X'} -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/objectwrapper2/src/test.txt b/fmpp/src/test/resources/tests/objectwrapper2/src/test.txt deleted file mode 100644 index 0804593..0000000 --- a/fmpp/src/test/resources/tests/objectwrapper2/src/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -${o.x} = X -${o.class.name} = java.util.HashMap \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/config.fmpp b/fmpp/src/test/resources/tests/pathpattern1/config.fmpp deleted file mode 100644 index 44fe68f..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/config.fmpp +++ /dev/null @@ -1,12 +0,0 @@ -sourceRoot: src -outputRoot: out -borders: [ - header("h1_", /1*.*) - header("h2_", 2*.*) - header("h3_", **/3*.*) - header("h4_", /**/4*.*) - footer("_f1", */1*.*) - footer("_f2", */*/2*.*) - footer("_f3", */**/3*.*) - footer("_f4", */*/**/4*.*) -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/1.txt b/fmpp/src/test/resources/tests/pathpattern1/src/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/2.txt b/fmpp/src/test/resources/tests/pathpattern1/src/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/3.txt b/fmpp/src/test/resources/tests/pathpattern1/src/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/4.txt b/fmpp/src/test/resources/tests/pathpattern1/src/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/1.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/2.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/3.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/4.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/1.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/2.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/3.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/4.txt b/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern1/src/sub/subsub/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/config.fmpp b/fmpp/src/test/resources/tests/pathpattern2/config.fmpp deleted file mode 100644 index a6af32a..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/config.fmpp +++ /dev/null @@ -1,12 +0,0 @@ -sourceRoot: src -outputRoot: out -borders: [ - header("h1_", ???/1*.*) - header("h2_", /???/2*.*) - header("h3_", /???/s*b/3*.*) - header("h4_", **/s*b/4*.*) - footer("_f1", /*/1*.*) - footer("_f2", /*/*/2*.*) - footer("_f3", /*/**/3*.*) - footer("_f4", /*/*/**/4*.*) -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/1.txt b/fmpp/src/test/resources/tests/pathpattern2/src/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/2.txt b/fmpp/src/test/resources/tests/pathpattern2/src/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/3.txt b/fmpp/src/test/resources/tests/pathpattern2/src/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/4.txt b/fmpp/src/test/resources/tests/pathpattern2/src/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/1.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/2.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/3.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/4.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/1.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/2.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/3.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/4.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/1.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/2.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/2.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/2.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/3.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/3.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/3.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/4.txt b/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/4.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern2/src/sub/subsub/subsubsub/4.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/config.fmpp b/fmpp/src/test/resources/tests/pathpattern3/config.fmpp deleted file mode 100644 index 72828b5..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/config.fmpp +++ /dev/null @@ -1,11 +0,0 @@ -sourceRoot: src -outputRoot: out -borders: [ - header("*.txt_", **/*.txt) - layer() - header("foo.*_", foo.*) - layer() - header("Bar.*_", Bar.*) - layer() - header("SUB/*_", SUB/*) -] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/Bar.Txt b/fmpp/src/test/resources/tests/pathpattern3/src/Bar.Txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/Bar.Txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/Bar.t1 b/fmpp/src/test/resources/tests/pathpattern3/src/Bar.t1 deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/Bar.t1 +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/Foo.t2 b/fmpp/src/test/resources/tests/pathpattern3/src/Foo.t2 deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/Foo.t2 +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/Foo.txt b/fmpp/src/test/resources/tests/pathpattern3/src/Foo.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/Foo.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/bar.t2 b/fmpp/src/test/resources/tests/pathpattern3/src/bar.t2 deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/bar.t2 +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/foo.t1 b/fmpp/src/test/resources/tests/pathpattern3/src/foo.t1 deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/foo.t1 +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/sub/t.txt b/fmpp/src/test/resources/tests/pathpattern3/src/sub/t.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/sub/t.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/t1.txt b/fmpp/src/test/resources/tests/pathpattern3/src/t1.txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/t1.txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3/src/t2.Txt b/fmpp/src/test/resources/tests/pathpattern3/src/t2.Txt deleted file mode 100644 index c1b0730..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3/src/t2.Txt +++ /dev/null @@ -1 +0,0 @@ -x \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/pathpattern3_casesens/config.fmpp b/fmpp/src/test/resources/tests/pathpattern3_casesens/config.fmpp deleted file mode 100644 index 3b55e8b..0000000 --- a/fmpp/src/test/resources/tests/pathpattern3_casesens/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -inheritConfiguration: ../pathpattern3/config.fmpp -outputRoot: out -caseSensitive: true \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/config.fmpp b/fmpp/src/test/resources/tests/relative_paths/config.fmpp deleted file mode 100644 index 1a65d4c..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/config.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -sourceRoot: src -outputRoot: out \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/include/ignoredir.fmpp b/fmpp/src/test/resources/tests/relative_paths/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/relative_paths/src/include/s.txt b/fmpp/src/test/resources/tests/relative_paths/src/include/s.txt deleted file mode 100644 index d800886..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/include/s.txt +++ /dev/null @@ -1 +0,0 @@ -123 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/include/test.txt b/fmpp/src/test/resources/tests/relative_paths/src/include/test.txt deleted file mode 100644 index 83b30bb..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/include/test.txt +++ /dev/null @@ -1 +0,0 @@ -${pp.sourceFileSize('s.txt')} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/s.txt b/fmpp/src/test/resources/tests/relative_paths/src/s.txt deleted file mode 100644 index 56a6051..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/s.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/sub/s.txt b/fmpp/src/test/resources/tests/relative_paths/src/sub/s.txt deleted file mode 100644 index 3cacc0b..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/sub/s.txt +++ /dev/null @@ -1 +0,0 @@ -12 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/sub/test.txt b/fmpp/src/test/resources/tests/relative_paths/src/sub/test.txt deleted file mode 100644 index 83b30bb..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/sub/test.txt +++ /dev/null @@ -1 +0,0 @@ -${pp.sourceFileSize('s.txt')} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths/src/test.txt b/fmpp/src/test/resources/tests/relative_paths/src/test.txt deleted file mode 100644 index fa38474..0000000 --- a/fmpp/src/test/resources/tests/relative_paths/src/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -${pp.sourceFileSize('s.txt')} -<#include '/include/test.txt'> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/config.fmpp b/fmpp/src/test/resources/tests/relative_paths2/config.fmpp deleted file mode 100644 index 006f915..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -modes: ignore(**/*.inc) \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.inc b/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.inc deleted file mode 100644 index 9cc9bbf..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.inc +++ /dev/null @@ -1 +0,0 @@ -/sub/subsub/ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.txt b/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.txt deleted file mode 100644 index 9a43ec6..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/sub/subsub/test.txt +++ /dev/null @@ -1,8 +0,0 @@ -<#include "../../test.inc"> == / -<#include "/test.inc"> == / -<#include "../test.inc"> == /sub/ -<#include "/sub/test.inc"> == /sub/ -<#include "test.inc"> == /sub/subsub/ -<#include "/sub/subsub/test.inc"> == /sub/subsub/ -<#include "../../test.inc"> == / -<#include "/sub/subsub/../../test.inc"> == / \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.inc b/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.inc deleted file mode 100644 index 490a8e2..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.inc +++ /dev/null @@ -1 +0,0 @@ -/sub/ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.txt b/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.txt deleted file mode 100644 index c10b236..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/sub/test.txt +++ /dev/null @@ -1,8 +0,0 @@ -<#include "../test.inc"> == / -<#include "/test.inc"> == / -<#include "test.inc"> == /sub/ -<#include "/sub/test.inc"> == /sub/ -<#include "subsub/test.inc"> == /sub/subsub/ -<#include "/sub/subsub/test.inc"> == /sub/subsub/ -<#include "subsub/../../test.inc"> == / -<#include "/sub/subsub/../../test.inc"> == / \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/test.inc b/fmpp/src/test/resources/tests/relative_paths2/src/test.inc deleted file mode 100644 index 35ec3b9..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/test.inc +++ /dev/null @@ -1 +0,0 @@ -/ \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/relative_paths2/src/test.txt b/fmpp/src/test/resources/tests/relative_paths2/src/test.txt deleted file mode 100644 index bc4fd18..0000000 --- a/fmpp/src/test/resources/tests/relative_paths2/src/test.txt +++ /dev/null @@ -1,8 +0,0 @@ -<#include "test.inc"> == / -<#include "/test.inc"> == / -<#include "sub/test.inc"> == /sub/ -<#include "/sub/test.inc"> == /sub/ -<#include "sub/subsub/test.inc"> == /sub/subsub/ -<#include "/sub/subsub/test.inc"> == /sub/subsub/ -<#include "sub/subsub/../../test.inc"> == / -<#include "/sub/subsub/../../test.inc"> == / \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/config.fmpp b/fmpp/src/test/resources/tests/rename/config.fmpp deleted file mode 100644 index 1a65d4c..0000000 --- a/fmpp/src/test/resources/tests/rename/config.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -sourceRoot: src -outputRoot: out \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/1.txt b/fmpp/src/test/resources/tests/rename/src/1.txt deleted file mode 100644 index 185a227..0000000 --- a/fmpp/src/test/resources/tests/rename/src/1.txt +++ /dev/null @@ -1,2 +0,0 @@ -<@pp.renameOutputFile name="r1.txt" /> -1 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/2.txt b/fmpp/src/test/resources/tests/rename/src/2.txt deleted file mode 100644 index c8d2770..0000000 --- a/fmpp/src/test/resources/tests/rename/src/2.txt +++ /dev/null @@ -1,4 +0,0 @@ -2 -<#flush> -<@pp.renameOutputFile name="r2.txt" /> -. \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/3.txt b/fmpp/src/test/resources/tests/rename/src/3.txt deleted file mode 100644 index fc39248..0000000 --- a/fmpp/src/test/resources/tests/rename/src/3.txt +++ /dev/null @@ -1,4 +0,0 @@ -3 -<#flush> -<@pp.renameOutputFile name="r/3.txt" /> -. \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/4.txt b/fmpp/src/test/resources/tests/rename/src/4.txt deleted file mode 100644 index 0466f03..0000000 --- a/fmpp/src/test/resources/tests/rename/src/4.txt +++ /dev/null @@ -1,2 +0,0 @@ -<@pp.renameOutputFile extension="rtxt" /> -4 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/5 b/fmpp/src/test/resources/tests/rename/src/5 deleted file mode 100644 index 7b49b9d..0000000 --- a/fmpp/src/test/resources/tests/rename/src/5 +++ /dev/null @@ -1,2 +0,0 @@ -<@pp.renameOutputFile extension="rtxt" /> -5 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/6.foo.txt b/fmpp/src/test/resources/tests/rename/src/6.foo.txt deleted file mode 100644 index c28b636..0000000 --- a/fmpp/src/test/resources/tests/rename/src/6.foo.txt +++ /dev/null @@ -1,2 +0,0 @@ -<@pp.renameOutputFile extension="rtxt" /> -6 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/rename/src/7.txt b/fmpp/src/test/resources/tests/rename/src/7.txt deleted file mode 100644 index 06b19e8..0000000 --- a/fmpp/src/test/resources/tests/rename/src/7.txt +++ /dev/null @@ -1,5 +0,0 @@ -7 -<@pp.renameOutputFile name="r7.txt" /> -. -<@pp.renameOutputFile extension="rtxt" /> -.. \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/args.txt b/fmpp/src/test/resources/tests/sources/args.txt deleted file mode 100644 index 6db06c9..0000000 --- a/fmpp/src/test/resources/tests/sources/args.txt +++ /dev/null @@ -1,2 +0,0 @@ -4.txt -6.txt \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/fmpp.cfg b/fmpp/src/test/resources/tests/sources/fmpp.cfg deleted file mode 100644 index 5b8e998..0000000 --- a/fmpp/src/test/resources/tests/sources/fmpp.cfg +++ /dev/null @@ -1,4 +0,0 @@ -source-root = src -output-root = out -sources = 1.txt, 2.txt, sub -inherit-configuration = fmpp2.cfg \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/fmpp2.cfg b/fmpp/src/test/resources/tests/sources/fmpp2.cfg deleted file mode 100644 index d06f781..0000000 --- a/fmpp/src/test/resources/tests/sources/fmpp2.cfg +++ /dev/null @@ -1,2 +0,0 @@ -## It should NOT process 3.txt, as the "sources" in fmpp.cfg is stronger. -sources = 2.txt, 3.txt \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/1.txt b/fmpp/src/test/resources/tests/sources/src/1.txt deleted file mode 100644 index 56a6051..0000000 --- a/fmpp/src/test/resources/tests/sources/src/1.txt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/2.txt b/fmpp/src/test/resources/tests/sources/src/2.txt deleted file mode 100644 index d8263ee..0000000 --- a/fmpp/src/test/resources/tests/sources/src/2.txt +++ /dev/null @@ -1 +0,0 @@ -2 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/3.txt b/fmpp/src/test/resources/tests/sources/src/3.txt deleted file mode 100644 index e440e5c..0000000 --- a/fmpp/src/test/resources/tests/sources/src/3.txt +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/4.txt b/fmpp/src/test/resources/tests/sources/src/4.txt deleted file mode 100644 index bf0d87a..0000000 --- a/fmpp/src/test/resources/tests/sources/src/4.txt +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/5.txt b/fmpp/src/test/resources/tests/sources/src/5.txt deleted file mode 100644 index 7813681..0000000 --- a/fmpp/src/test/resources/tests/sources/src/5.txt +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/6.txt b/fmpp/src/test/resources/tests/sources/src/6.txt deleted file mode 100644 index 62f9457..0000000 --- a/fmpp/src/test/resources/tests/sources/src/6.txt +++ /dev/null @@ -1 +0,0 @@ -6 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/sub/a.txt b/fmpp/src/test/resources/tests/sources/src/sub/a.txt deleted file mode 100644 index 2e65efe..0000000 --- a/fmpp/src/test/resources/tests/sources/src/sub/a.txt +++ /dev/null @@ -1 +0,0 @@ -a \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/sources/src/sub/b.txt b/fmpp/src/test/resources/tests/sources/src/sub/b.txt deleted file mode 100644 index 2e65efe..0000000 --- a/fmpp/src/test/resources/tests/sources/src/sub/b.txt +++ /dev/null @@ -1 +0,0 @@ -a \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_1/config.fmpp b/fmpp/src/test/resources/tests/tag_syntax_1/config.fmpp deleted file mode 100644 index 187b9c0..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_1/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -tagSyntax: angleBracket \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_1/src/test1.txt b/fmpp/src/test/resources/tests/tag_syntax_1/src/test1.txt deleted file mode 100644 index 372176c..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_1/src/test1.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm a comment -->[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_1/src/test2.txt b/fmpp/src/test/resources/tests/tag_syntax_1/src/test2.txt deleted file mode 100644 index 2f2c630..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_1/src/test2.txt +++ /dev/null @@ -1,2 +0,0 @@ -<#ftl> -<#-- I'm a comment -->[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_1/src/test3.txt b/fmpp/src/test/resources/tests/tag_syntax_1/src/test3.txt deleted file mode 100644 index fb30e42..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_1/src/test3.txt +++ /dev/null @@ -1,2 +0,0 @@ -[#ftl] -<#-- I'm not a comment -->[#-- I'm a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_2/config.fmpp b/fmpp/src/test/resources/tests/tag_syntax_2/config.fmpp deleted file mode 100644 index 2539a15..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_2/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -tagSyntax: squareBracket \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_2/src/test1.txt b/fmpp/src/test/resources/tests/tag_syntax_2/src/test1.txt deleted file mode 100644 index e8c90d1..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_2/src/test1.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm not a comment -->[#-- I'm a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_2/src/test2.txt b/fmpp/src/test/resources/tests/tag_syntax_2/src/test2.txt deleted file mode 100644 index 2f2c630..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_2/src/test2.txt +++ /dev/null @@ -1,2 +0,0 @@ -<#ftl> -<#-- I'm a comment -->[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_2/src/test3.txt b/fmpp/src/test/resources/tests/tag_syntax_2/src/test3.txt deleted file mode 100644 index fb30e42..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_2/src/test3.txt +++ /dev/null @@ -1,2 +0,0 @@ -[#ftl] -<#-- I'm not a comment -->[#-- I'm a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_3/config.fmpp b/fmpp/src/test/resources/tests/tag_syntax_3/config.fmpp deleted file mode 100644 index 8949d2d..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_3/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -tagSyntax: autoDetect \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_3/src/test1a.txt b/fmpp/src/test/resources/tests/tag_syntax_3/src/test1a.txt deleted file mode 100644 index 372176c..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_3/src/test1a.txt +++ /dev/null @@ -1 +0,0 @@ -<#-- I'm a comment -->[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_3/src/test1b.txt b/fmpp/src/test/resources/tests/tag_syntax_3/src/test1b.txt deleted file mode 100644 index b2cdf84..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_3/src/test1b.txt +++ /dev/null @@ -1 +0,0 @@ -[#-- I'm a comment --]<#-- I'm not a comment --> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_3/src/test2.txt b/fmpp/src/test/resources/tests/tag_syntax_3/src/test2.txt deleted file mode 100644 index 2f2c630..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_3/src/test2.txt +++ /dev/null @@ -1,2 +0,0 @@ -<#ftl> -<#-- I'm a comment -->[#-- I'm not a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tag_syntax_3/src/test3.txt b/fmpp/src/test/resources/tests/tag_syntax_3/src/test3.txt deleted file mode 100644 index fb30e42..0000000 --- a/fmpp/src/test/resources/tests/tag_syntax_3/src/test3.txt +++ /dev/null @@ -1,2 +0,0 @@ -[#ftl] -<#-- I'm not a comment -->[#-- I'm a comment --] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/config.fmpp b/fmpp/src/test/resources/tests/tdd/config.fmpp deleted file mode 100644 index 1a65d4c..0000000 --- a/fmpp/src/test/resources/tests/tdd/config.fmpp +++ /dev/null @@ -1,2 +0,0 @@ -sourceRoot: src -outputRoot: out \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/comments.txt b/fmpp/src/test/resources/tests/tdd/src/comments.txt deleted file mode 100644 index ebf1a6c..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/comments.txt +++ /dev/null @@ -1,11 +0,0 @@ -<#-- $Id: comments.txt,v 1.1 2003/10/30 09:32:08 ddekany Exp $ --> -<#include '/include/common.ftl'> - -<#assign c1 = pp.loadData('tdd', 'data/comment1.tdd')> -<#assign c2 = pp.loadData('tdd', 'data/comment2.tdd')> - -<@pp.restartOutputFile /> -c1: -<@dumpTopLevel c1 /> -c2: -<@dumpTopLevel c2 /> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/comment1.tdd b/fmpp/src/test/resources/tests/tdd/src/data/comment1.tdd deleted file mode 100644 index 7fcc9c0..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/comment1.tdd +++ /dev/null @@ -1,10 +0,0 @@ -# foo -# bar -# -a: #A -b: " -#B<#-- -" -# -# baaz -# wombat \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/comment2.tdd b/fmpp/src/test/resources/tests/tdd/src/data/comment2.tdd deleted file mode 100644 index 7c4f1f8..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/comment2.tdd +++ /dev/null @@ -1,11 +0,0 @@ -a -# foo -: -#foo -A -#foo -b <#-- -# -# --> -<#-- x -->:<#-- -->B<#-- ---> \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/encoding.tdd b/fmpp/src/test/resources/tests/tdd/src/data/encoding.tdd deleted file mode 100644 index 23ea7e3..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/encoding.tdd +++ /dev/null @@ -1,2 +0,0 @@ - # ENcoDinG : UTF-8 qqqqqqqqqqq -text: bálnabél \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/hash.tdd b/fmpp/src/test/resources/tests/tdd/src/data/hash.tdd deleted file mode 100644 index 4c83371..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/hash.tdd +++ /dev/null @@ -1,3 +0,0 @@ -a:111 -b:222 -c:333 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/hashes.tdd b/fmpp/src/test/resources/tests/tdd/src/data/hashes.tdd deleted file mode 100644 index 02cc132..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/hashes.tdd +++ /dev/null @@ -1,20 +0,0 @@ -m1: {k1:1,k2:2, k3:3 , k4:4 - k5:5 - k6:6, - k7 - : - 7 - , k8:8 - # mooo - k9 <#-- mooo --> : 9 <#-- mooo --> }, m2: {a:b:c:d, 'a:b':c:d, "a:b:c":d} -m3: { - 1:1, true:true -} -m4: { - {a:A, b:BAD, c:BAD} - {b:B, c:BAD} - {c:C}, d:D -} -m5: {a:[1, 2, 3], b:{a:11, b:22, c:33}, {{{c:3}}}} -tdd(data/hash.tdd) -m6: {a:BAD, b:BAD, c:BAD, d:444, tdd(data/hash.tdd)} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/tdd/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/tdd/src/data/nestedscalars.tdd b/fmpp/src/test/resources/tests/tdd/src/data/nestedscalars.tdd deleted file mode 100644 index b840cee..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/nestedscalars.tdd +++ /dev/null @@ -1,44 +0,0 @@ -encloser: { -strings: [ - foo-bar/**/baz.txt - C:\windows\system32 - 25% - #FF80FF - 7.txt - 1-2 - True - "contains space" - "a'b" - "(c)" - "" - "7" - "true" - 'x"y' - 'x\'y' - "x\'y" - "x\"y" - r"a\'b" - r'a\"b' - "line1 - line2 - line3" - !? - "\x64-\x64\x64-\x064\x00640" - "A \ - B \ - \ - \ - C D" - 'X \ - - Y \ - - - Z\ - '] -vBoolean1: true -vBoolean2: false -vNumber1: 7 -vNumber2: +0.7 -vNumber3: -0.7 -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/scalars.tdd b/fmpp/src/test/resources/tests/tdd/src/data/scalars.tdd deleted file mode 100644 index 8908c70..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/scalars.tdd +++ /dev/null @@ -1,42 +0,0 @@ -strings: [ - foo-bar/**/baz.txt - C:\windows\system32 - 25% - #FF80FF - 7.txt - 1-2 - True - "contains space" - "a'b" - "(c)" - "" - "7" - "true" - 'x"y' - 'x\'y' - "x\'y" - "x\"y" - r"a\'b" - r'a\"b' - "line1 - line2 - line3" - !? - "\x64-\x64\x64-\x064\x00640" - "A \ - B \ - \ - \ - C D" - 'X \ - - Y \ - - - Z\ - '] -vBoolean1: true -vBoolean2: false -vNumber1: 7 -vNumber2: +0.7 -vNumber3: -0.7 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/data/seqmode.tdd b/fmpp/src/test/resources/tests/tdd/src/data/seqmode.tdd deleted file mode 100644 index 81f5b5a..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/data/seqmode.tdd +++ /dev/null @@ -1,5 +0,0 @@ -1 -"2" -[3, "4"] -{5:5, 6:"6"} -true \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/encoding.txt b/fmpp/src/test/resources/tests/tdd/src/encoding.txt deleted file mode 100644 index 77f4425..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/encoding.txt +++ /dev/null @@ -1 +0,0 @@ -${pp.loadData('tdd', 'data/encoding.tdd').text} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/hashes.txt b/fmpp/src/test/resources/tests/tdd/src/hashes.txt deleted file mode 100644 index e8a82e3..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/hashes.txt +++ /dev/null @@ -1,22 +0,0 @@ -<#-- $Id: hashes.txt,v 1.3 2005/04/12 20:35:19 ddekany Exp $ --> -<#include '/include/common.ftl'> - -<#assign tdd = pp.loadData('tdd', 'data/hashes.tdd')> - -<@pp.restartOutputFile /> -m1: -<@dumpTopLevel tdd.m1 /> -m2: -<@dumpTopLevel tdd.m2 /> -m3: -<@dumpTopLevel tdd.m3 /> -m4: -<@dumpTopLevel tdd.m4 /> -m5: -<@dumpTopLevel tdd.m5 /> -m6: -<@dumpTopLevel tdd.m6 /> - -a: ${tdd.a} -b: ${tdd.b} -c: ${tdd.c} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/include/common.ftl b/fmpp/src/test/resources/tests/tdd/src/include/common.ftl deleted file mode 100644 index d6c7b42..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/include/common.ftl +++ /dev/null @@ -1,21 +0,0 @@ -<#-- $Id: common.ftl,v 1.2 2007/04/27 12:45:28 ddekany Exp $ --> - -<#macro dumpTopLevel m> - <#list m?keys?sort as k> - - (${k}) : <@dump m[k] /> - - - -<#macro dump v> - <#if v?is_boolean> - bool (${v?string})<#t> - <#elseif v?is_number> - num (${v})<#t> - <#elseif v?is_sequence> - seq [<#list v as x>(<@dump x />)<#if x_has_next>, ]<#t> - <#elseif v?is_string> - str (${v})<#t> - <#elseif v?is_hash> - hash {<#list v?keys?sort as k>(${k}):(<@dump v[k] />)]<#if k_has_next>, }<#t> - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/include/ignoredir.fmpp b/fmpp/src/test/resources/tests/tdd/src/include/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/tdd/src/nestedscalars.txt b/fmpp/src/test/resources/tests/tdd/src/nestedscalars.txt deleted file mode 100644 index f22b361..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/nestedscalars.txt +++ /dev/null @@ -1,34 +0,0 @@ -<#-- $Id: nestedscalars.txt,v 1.1 2007/04/20 22:41:23 ddekany Exp $ --> -<#assign tdd = pp.loadData('tdd', 'data/nestedscalars.tdd').encloser> -<#list tdd.strings as s> - <#if !s?is_string> - Non-string! - <#else> - [${s}] - - -<#if !tdd.vBoolean1?is_boolean> - Non-boolean! -<#else> - [${tdd.vBoolean1?string}] - -<#if !tdd.vBoolean2?is_boolean> - Non-boolean! -<#else> - [${tdd.vBoolean2?string}] - -<#if !tdd.vNumber1?is_number> - Non-number! -<#else> - [${tdd.vNumber1}] - -<#if !tdd.vNumber2?is_number> - Non-number! -<#else> - [${tdd.vNumber2}] - -<#if !tdd.vNumber3?is_number> - Non-number! -<#else> - [${tdd.vNumber3}] - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/scalars.txt b/fmpp/src/test/resources/tests/tdd/src/scalars.txt deleted file mode 100644 index af3563d..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/scalars.txt +++ /dev/null @@ -1,34 +0,0 @@ -<#-- $Id: scalars.txt,v 1.1 2003/10/29 19:28:36 ddekany Exp $ --> -<#assign tdd = pp.loadData('tdd', 'data/scalars.tdd')> -<#list tdd.strings as s> - <#if !s?is_string> - Non-string! - <#else> - [${s}] - - -<#if !tdd.vBoolean1?is_boolean> - Non-boolean! -<#else> - [${tdd.vBoolean1?string}] - -<#if !tdd.vBoolean2?is_boolean> - Non-boolean! -<#else> - [${tdd.vBoolean2?string}] - -<#if !tdd.vNumber1?is_number> - Non-number! -<#else> - [${tdd.vNumber1}] - -<#if !tdd.vNumber2?is_number> - Non-number! -<#else> - [${tdd.vNumber2}] - -<#if !tdd.vNumber3?is_number> - Non-number! -<#else> - [${tdd.vNumber3}] - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/tdd/src/seqmode.txt b/fmpp/src/test/resources/tests/tdd/src/seqmode.txt deleted file mode 100644 index 1086438..0000000 --- a/fmpp/src/test/resources/tests/tdd/src/seqmode.txt +++ /dev/null @@ -1,7 +0,0 @@ -<#-- $Id: seqmode.txt,v 1.1 2007/04/27 12:45:28 ddekany Exp $ --> -<#include '/include/common.ftl'> -<#assign tdd = pp.loadData('tddSequence', 'data/seqmode.tdd')> -<#list tdd as i> -<@dump i /> - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/config.fmpp b/fmpp/src/test/resources/tests/terminated_output/config.fmpp deleted file mode 100644 index efd2212..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -stopOnError: false \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/src/correct.html b/fmpp/src/test/resources/tests/terminated_output/src/correct.html deleted file mode 100644 index f4536bf..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/src/correct.html +++ /dev/null @@ -1 +0,0 @@ -x${'-'}mooo \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/src/flushedzero.html b/fmpp/src/test/resources/tests/terminated_output/src/flushedzero.html deleted file mode 100644 index 9ba5a91..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/src/flushedzero.html +++ /dev/null @@ -1 +0,0 @@ -<#flush>${sdfsd}mooo \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/src/nestings.html b/fmpp/src/test/resources/tests/terminated_output/src/nestings.html deleted file mode 100644 index c901977..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/src/nestings.html +++ /dev/null @@ -1,12 +0,0 @@ -<@pp.nestOutputFile name='n1.txt'> - n1 - <@pp.nestOutputFile name='n2.txt'> - n2 - <@pp.nestOutputFile name='nZero.txt'> - <@pp.nestOutputFile name='n3.txt'> - n3${asdsad} - - - - -n0 \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/src/one.html b/fmpp/src/test/resources/tests/terminated_output/src/one.html deleted file mode 100644 index d4dcc90..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/src/one.html +++ /dev/null @@ -1 +0,0 @@ -x${sdfsd}mooo \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/terminated_output/src/zero.html b/fmpp/src/test/resources/tests/terminated_output/src/zero.html deleted file mode 100644 index d49f769..0000000 --- a/fmpp/src/test/resources/tests/terminated_output/src/zero.html +++ /dev/null @@ -1 +0,0 @@ -${sdfsd}mooo \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/url_escaping/config.fmpp b/fmpp/src/test/resources/tests/url_escaping/config.fmpp deleted file mode 100644 index 925102e..0000000 --- a/fmpp/src/test/resources/tests/url_escaping/config.fmpp +++ /dev/null @@ -1,3 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/url_escaping/src/test.txt b/fmpp/src/test/resources/tests/url_escaping/src/test.txt deleted file mode 100644 index deb1df1..0000000 --- a/fmpp/src/test/resources/tests/url_escaping/src/test.txt +++ /dev/null @@ -1,23 +0,0 @@ -<#ftl encoding="ISO-8859-2"> - -<#assign s = "/a nõügy/az"> - -output_encoding: ${.output_encoding?default("-")} = ISO-8859-2 -url_escaping_charset: ${.url_escaping_charset?default("-")} = - -${s?url} -${pp.urlEnc(s)} -${pp.urlPathEnc(s)} - -<@pp.setOutputEncoding encoding="utf-8" /> -output_encoding: ${.output_encoding?default("-")} = utf-8 -url_escaping_charset: ${.url_escaping_charset?default("-")} = - -${s?url} -${pp.urlEnc(s)} -${pp.urlPathEnc(s)} - -<#setting url_escaping_charset="utf-16" /> -output_encoding: ${.output_encoding?default("-")} = utf-8 -url_escaping_charset: ${.url_escaping_charset?default("-")} = utf-16 -${s?url} -${pp.urlEnc(s)} -${pp.urlPathEnc(s)} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/url_escaping2/config.fmpp b/fmpp/src/test/resources/tests/url_escaping2/config.fmpp deleted file mode 100644 index 4434616..0000000 --- a/fmpp/src/test/resources/tests/url_escaping2/config.fmpp +++ /dev/null @@ -1,4 +0,0 @@ -sourceRoot: src -outputRoot: out -urlEscapingCharset: UTF-16 -logFile: log.fmpp \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/url_escaping2/src/test.txt b/fmpp/src/test/resources/tests/url_escaping2/src/test.txt deleted file mode 100644 index 4c68162..0000000 --- a/fmpp/src/test/resources/tests/url_escaping2/src/test.txt +++ /dev/null @@ -1,20 +0,0 @@ -<#ftl encoding="ISO-8859-2"> - -<#assign s = "béka"> - -output_encoding: ${.output_encoding?default("-")} = ISO-8859-2 -url_escaping_charset: ${.url_escaping_charset?default("-")} = UTF-16 -${s?url} -${pp.urlEnc(s)} - -<@pp.setOutputEncoding encoding="utf-8" /> -output_encoding: ${.output_encoding?default("-")} = utf-8 -url_escaping_charset: ${.url_escaping_charset?default("-")} = UTF-16 -${s?url} -${pp.urlEnc(s)} - -<#setting url_escaping_charset="ISO-8859-2" /> -output_encoding: ${.output_encoding?default("-")} = utf-8 -url_escaping_charset: ${.url_escaping_charset?default("-")} = ISO-8859-2 -${s?url} -${pp.urlEnc(s)} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/writable_hash/config.fmpp b/fmpp/src/test/resources/tests/writable_hash/config.fmpp deleted file mode 100644 index 872c570..0000000 --- a/fmpp/src/test/resources/tests/writable_hash/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - stuff: {a:A, b:B} -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/writable_hash/src/test.txt b/fmpp/src/test/resources/tests/writable_hash/src/test.txt deleted file mode 100644 index 8e1c571..0000000 --- a/fmpp/src/test/resources/tests/writable_hash/src/test.txt +++ /dev/null @@ -1,24 +0,0 @@ -<#assign x = pp.newWritableHash(stuff)> -<@pp.set hash=x key='c' value='C' /> -<#assign y = pp.newWritableHash(x)> -<@pp.set hash=y key='d' value='D' /> -<#assign z = pp.newWritableHash({'x':'X'})> -<@pp.set hash=z key='z' value='Z' /> - -stuff: -<@listMap stuff /> - -x: -<@listMap x /> - -y: -<@listMap y /> - -z: -<@listMap z /> - -<#macro listMap map> - <#list map?keys?sort as k> - - ${k} = ${map[k]} - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/writable_sequence/config.fmpp b/fmpp/src/test/resources/tests/writable_sequence/config.fmpp deleted file mode 100644 index 0904a42..0000000 --- a/fmpp/src/test/resources/tests/writable_sequence/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: src -outputRoot: out -data: { - stuff: [A, B] -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/writable_sequence/src/test.txt b/fmpp/src/test/resources/tests/writable_sequence/src/test.txt deleted file mode 100644 index f93b4a1..0000000 --- a/fmpp/src/test/resources/tests/writable_sequence/src/test.txt +++ /dev/null @@ -1,24 +0,0 @@ -<#assign x = pp.newWritableSequence(stuff)> -<@pp.add seq=x value='C' /> -<#assign y = pp.newWritableSequence(x)> -<@pp.add seq=y value='D' /> -<#assign z = pp.newWritableSequence(['X', 'Y'])> -<@pp.add seq=z value='Z' /> - -stuff: -<@listSequence stuff /> - -x: -<@listSequence x /> - -y: -<@listSequence y /> - -z: -<@listSequence z /> - -<#macro listSequence seq> - <#list seq as i> - - ${i} - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xinclude/config.fmpp b/fmpp/src/test/resources/tests/xinclude/config.fmpp deleted file mode 100644 index ee36f42..0000000 --- a/fmpp/src/test/resources/tests/xinclude/config.fmpp +++ /dev/null @@ -1,13 +0,0 @@ -sourceRoot: src -outputRoot: out -logFile: log.fmpp -data: { - doc: xml( - data/test.xml - { - xincludeAware: true - removeComments: false - index: {element: [part, chapter, para], value: '%n'} - } - ) -} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xinclude/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/xinclude/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/xinclude/src/data/part1.xml b/fmpp/src/test/resources/tests/xinclude/src/data/part1.xml deleted file mode 100644 index d519f25..0000000 --- a/fmpp/src/test/resources/tests/xinclude/src/data/part1.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - A - - - - A - B - - - A - B - - diff --git a/fmpp/src/test/resources/tests/xinclude/src/data/part2.xml b/fmpp/src/test/resources/tests/xinclude/src/data/part2.xml deleted file mode 100644 index 10a1ce1..0000000 --- a/fmpp/src/test/resources/tests/xinclude/src/data/part2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - A - B - C - - - A - B - C - - diff --git a/fmpp/src/test/resources/tests/xinclude/src/data/test.xml b/fmpp/src/test/resources/tests/xinclude/src/data/test.xml deleted file mode 100644 index f9daccf..0000000 --- a/fmpp/src/test/resources/tests/xinclude/src/data/test.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xinclude/src/index.html b/fmpp/src/test/resources/tests/xinclude/src/index.html deleted file mode 100644 index 8b5883a..0000000 --- a/fmpp/src/test/resources/tests/xinclude/src/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - XML Tree Dump - - <@pp.setOutputEncoding encoding="UTF-8" /> - - - -

        XML Tree Dump

        - -<@dumpXml doc /> - -

        Legend: -

          -
        • <foo bar="123">: Element node -
        • "Blah blah": Text node -
        • <?foo bar ?>: Processing instruction node -
        • <!-- Blah blah -->: Comment node -
        • foo: Other node -
        - - - -<#function showXmlSource s> - <#return s?xml?xml?replace(" ", r" ")?replace('\n', '&#xA;')?replace('\r', '&#xD;')> - - -<#-- -Prints an XML node tree as colored HTML. ---> -<#macro dumpXml node> -
          - <@dumpXml_internal node /> -
        - - -<#macro dumpXml_internal node> - <#local type = node?node_type> - <#if type == 'element'> -
      1. <<#rt> - <#if node?node_namespace?? && node?node_namespace != ''> - '${node?node_namespace}':<#t> - - ${node?node_name}<#t> - <#list node.@@ as att> - ${' '}<#t> - <#if att?node_namespace?? && att?node_namespace != ''> - '${att?node_namespace}':<#t> - - ${att?node_name}="${showXmlSource(att)}"<#t> - - ><#lt> - <#elseif type == 'text'> -
      2. "${showXmlSource(node)}"<#lt> - <#elseif type == 'pi'> - <#local nodeName = node?node_name> -
      3. <?${nodeName?substring(4)} ${showXmlSource(node)}?><#lt> - <#elseif type == 'comment'> -
      4. <!-- ${node} --><#lt> - <#else> -
      5. ${node?node_type}<#lt> - - <#if node?children?size != 0> -
          - <#list node?children as c> - <@dumpXml_internal c /><#t> - -
        - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_catalogs/config.fmpp b/fmpp/src/test/resources/tests/xml_catalogs/config.fmpp deleted file mode 100644 index acc5988..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/config.fmpp +++ /dev/null @@ -1,7 +0,0 @@ -logFile: fmpp.log -sourceRoot: src -outputRoot: out -data: { - doc:xml(data/test.xhtml) -} -xmlCatalogFiles: [dtds/catalog2, dtds/catalog] \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog b/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog deleted file mode 100644 index 96ee8b2..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog +++ /dev/null @@ -1,2 +0,0 @@ -PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd" -PUBLIC "-//TEST" "test.txt" \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog2 b/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog2 deleted file mode 100644 index d58e52e..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/catalog2 +++ /dev/null @@ -1 +0,0 @@ -PUBLIC "-//TEST" "test2.txt" \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/test.txt b/fmpp/src/test/resources/tests/xml_catalogs/dtds/test.txt deleted file mode 100644 index d00491f..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/test.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/test2.txt b/fmpp/src/test/resources/tests/xml_catalogs/dtds/test2.txt deleted file mode 100644 index 0cfbf08..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/test2.txt +++ /dev/null @@ -1 +0,0 @@ -2 diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-lat1.ent b/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-lat1.ent deleted file mode 100644 index ffee223..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-lat1.ent +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-special.ent b/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-special.ent deleted file mode 100644 index ca358b2..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-special.ent +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-symbol.ent b/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-symbol.ent deleted file mode 100644 index 63c2abf..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml-symbol.ent +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml1-transitional.dtd b/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml1-transitional.dtd deleted file mode 100644 index 39f6b25..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/dtds/xhtml1-transitional.dtd +++ /dev/null @@ -1,1201 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fmpp/src/test/resources/tests/xml_catalogs/src/data/ignoredir.fmpp b/fmpp/src/test/resources/tests/xml_catalogs/src/data/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/xml_catalogs/src/data/test.xhtml b/fmpp/src/test/resources/tests/xml_catalogs/src/data/test.xhtml deleted file mode 100644 index 1ab20d3..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/src/data/test.xhtml +++ /dev/null @@ -1,16 +0,0 @@ - - -]> - - - - Test - - - -

        Test

        -

        Test&test;

        - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_catalogs/src/test.txt b/fmpp/src/test/resources/tests/xml_catalogs/src/test.txt deleted file mode 100644 index 8786bfb..0000000 --- a/fmpp/src/test/resources/tests/xml_catalogs/src/test.txt +++ /dev/null @@ -1,4 +0,0 @@ -<#ftl ns_prefixes={"D":"http://www.w3.org/1999/xhtml"}> -<#list doc['//D:p'] as p> -- ${p} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/config.fmpp b/fmpp/src/test/resources/tests/xml_rendering/config.fmpp deleted file mode 100644 index 51e7ee7..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/config.fmpp +++ /dev/null @@ -1,22 +0,0 @@ -inheritConfiguration: inherited.fmpp -sourceRoot: src -outputRoot: out -logFile: log.fmpp -xmlRenderings: [ - {ifDocumentElementIs:a, template:renderer/test1.ftl, validate} - {ifDocumentElementIs:b, template:renderer/test2.ftl, index:{element:c}} - {ifDocumentElementIs:e:c, template:renderer/test3.ftl, xmlns:{e:'http://e/'}} - { - ifSourceIs:ldb.xml - template:renderer/ldb.ftl - localDataBuilder: [ - "new fmpp.testsuite.TestXmlLocalDataBuilder2()" - "new fmpp.testsuite.TestXmlLocalDataBuilder()" - ] - } - {ifDocumentElementIs:[g, h], template:renderer/test6.ftl} - {ifSourceIs:[**g*, **f*], template:renderer/test5.ftl} - {ifDocumentElementIs:copyMe, copy} -] -xmlCatalogFiles: dtds/catalog.xml -localData: case('ldb.xml', {a:wrong, c:3}) \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/dtds/catalog.xml b/fmpp/src/test/resources/tests/xml_rendering/dtds/catalog.xml deleted file mode 100644 index 6d40818..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/dtds/catalog.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/dtds/test.dtd b/fmpp/src/test/resources/tests/xml_rendering/dtds/test.dtd deleted file mode 100644 index dc3bfca..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/dtds/test.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/dtds/test2.dtd b/fmpp/src/test/resources/tests/xml_rendering/dtds/test2.dtd deleted file mode 100644 index 74e9e4a..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/dtds/test2.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/inherited.fmpp b/fmpp/src/test/resources/tests/xml_rendering/inherited.fmpp deleted file mode 100644 index b161ecc..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/inherited.fmpp +++ /dev/null @@ -1 +0,0 @@ -xmlRenderings: {template:renderer/test4.ftl} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/a.xml b/fmpp/src/test/resources/tests/xml_rendering/src/a.xml deleted file mode 100644 index 5e2121a..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/a.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/b.xml b/fmpp/src/test/resources/tests/xml_rendering/src/b.xml deleted file mode 100644 index b8eaa32..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/b.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - B - B - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/c.xml b/fmpp/src/test/resources/tests/xml_rendering/src/c.xml deleted file mode 100644 index 889a75d..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/c.xml +++ /dev/null @@ -1,3 +0,0 @@ - - C - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/copy.txt b/fmpp/src/test/resources/tests/xml_rendering/src/copy.txt deleted file mode 100644 index 67930f0..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/copy.txt +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/d.xml b/fmpp/src/test/resources/tests/xml_rendering/src/d.xml deleted file mode 100644 index c68b17a..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/d.xml +++ /dev/null @@ -1,3 +0,0 @@ - - D - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/e.xml b/fmpp/src/test/resources/tests/xml_rendering/src/e.xml deleted file mode 100644 index e85ac86..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/e.xml +++ /dev/null @@ -1,3 +0,0 @@ - - E - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/f.xml b/fmpp/src/test/resources/tests/xml_rendering/src/f.xml deleted file mode 100644 index 2bdfd4f..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/f.xml +++ /dev/null @@ -1,3 +0,0 @@ - - F - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/g.xml b/fmpp/src/test/resources/tests/xml_rendering/src/g.xml deleted file mode 100644 index ea21d3f..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/g.xml +++ /dev/null @@ -1,3 +0,0 @@ - - G - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/h.xml b/fmpp/src/test/resources/tests/xml_rendering/src/h.xml deleted file mode 100644 index 849161b..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/h.xml +++ /dev/null @@ -1,3 +0,0 @@ - - H - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/ldb.xml b/fmpp/src/test/resources/tests/xml_rendering/src/ldb.xml deleted file mode 100644 index f35425b..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/ldb.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/ignoredir.fmpp b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/ignoredir.fmpp deleted file mode 100644 index e69de29..0000000 diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/ldb.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/ldb.ftl deleted file mode 100644 index 62788e7..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/ldb.ftl +++ /dev/null @@ -1,3 +0,0 @@ -${a} -${b} -${c} \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test1.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test1.ftl deleted file mode 100644 index aaf44c7..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test1.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#ftl encoding="UTF-8"> -${pp.doc.@@markup} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test2.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test2.ftl deleted file mode 100644 index c5ab12d..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test2.ftl +++ /dev/null @@ -1,2 +0,0 @@ -${pp.doc.@@markup} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test3.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test3.ftl deleted file mode 100644 index ce81ef2..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test3.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#ftl ns_prefixes={'x':'http://e/'}> -${pp.doc.@@markup} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test4.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test4.ftl deleted file mode 100644 index 04df8ae..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test4.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#ftl ns_prefixes={'y':'http://f/'}> -${pp.doc.@@markup} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test5.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test5.ftl deleted file mode 100644 index 53c04aa..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test5.ftl +++ /dev/null @@ -1,2 +0,0 @@ -${pp.doc.@@markup} - \ No newline at end of file diff --git a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test6.ftl b/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test6.ftl deleted file mode 100644 index 9b3bb24..0000000 --- a/fmpp/src/test/resources/tests/xml_rendering/src/renderer/test6.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<@pp.renameOutputFile extension="txt" /> -${pp.doc.@@markup} ----[6]--- \ No newline at end of file

    ByJ>bG# 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

    9?g4t@h& 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�O?n)1tuD>~WQ+Soh(D-HP{7tG@fM&k@- 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